{"browserTitle":"Landscape Legends | Bend Oregon Landscaping","copyright":"LANDSCAPE LEGENDS LLC","metaDescription":"Landscape Legends delivers professional landscaping in Bend, Oregon and Central Oregon, creating clean, standout outdoor spaces built to last.","metaKeywords":"landscaping bend oregon, bend oregon landscaping, landscaping central oregon, landscape company bend, lawn care bend oregon, yard cleanup bend oregon, landscape maintenance bend, landscaping deschutes county, bend landscaping services, central oregon lawn care","backgroundImages":[],"filters":["Demo Images","Demo Text Pages","Demo Videos","Social Media Links","examples","legends","legenss","logo"],"portfolioEmailMessage":"Check out this photograph:","socialLinks":[],"useHTML":true,"globalBrowserTitle":true,"facebookImage":"image.png","facebookAdmins":"","facebookUseMeta":1,"podUseDesktop":true,"padUseDesktop":true,"generalEmail":"","inquiryTitle":"","inquiryInfo":"","lang":"en","advancedSeo":1,"adminSortDefault":"dateAdded descending","enablePinterest":0,"currentTemplate":2,"enableCookieBanner":false,"cookieBannerPosition":"bottom","cookieBannerLink":"","cookieBannerMessage":"By continuing to visit this site you agree to our use of cookies.","siteHead":"<script type=\"application/ld+json\">\n{\n\"@context\":\"https://schema.org\",\n\"@graph\":[\n{\n\"@type\":[\"LocalBusiness\",\"ProfessionalService\",\"HomeAndConstructionBusiness\"],\n\"@id\":\"https://YOURDOMAIN.com/#business\",\n\"name\":\"Landscape Legends LLC\",\n\"url\":\"https://YOURDOMAIN.com/\",\n\"telephone\":\"+1-541-990-9376\",\n\"image\":\"https://YOURDOMAIN.com/pf-media/DSC09325-2.jpg\",\n\"description\":\"Landscape Legends LLC provides professional landscaping services in Bend, Oregon, Central Oregon, and Deschutes County, helping residential and commercial properties look clean, sharp, and well maintained.\",\n\"address\":{\n\"@type\":\"PostalAddress\",\n\"streetAddress\":\"1124 Northwest Portland Avenue\",\n\"addressLocality\":\"Bend\",\n\"addressRegion\":\"OR\",\n\"postalCode\":\"97703\",\n\"addressCountry\":\"US\"\n},\n\"areaServed\":[\n{\n\"@type\":\"City\",\n\"name\":\"Bend\"\n},\n{\n\"@type\":\"AdministrativeArea\",\n\"name\":\"Central Oregon\"\n},\n{\n\"@type\":\"AdministrativeArea\",\n\"name\":\"Deschutes County\"\n}\n],\n\"contactPoint\":[\n{\n\"@type\":\"ContactPoint\",\n\"telephone\":\"+1-541-390-5143\",\n\"contactType\":\"estimates, project questions, and scheduling\",\n\"areaServed\":\"US\",\n\"availableLanguage\":\"English\"\n},\n{\n\"@type\":\"ContactPoint\",\n\"telephone\":\"+1-541-990-9376\",\n\"contactType\":\"services, timing, and consultations\",\n\"areaServed\":\"US\",\n\"availableLanguage\":\"English\"\n}\n],\n\"sameAs\":[\n\"https://www.facebook.com/p/Landscape-Legends-LLC-61574694518946/\"\n],\n\"serviceType\":[\n\"Landscaping\",\n\"Lawn care\",\n\"Yard cleanups\",\n\"Aeration\",\n\"Thatch removal\",\n\"Bark installation\",\n\"Landscape maintenance\"\n]\n},\n{\n\"@type\":\"WebSite\",\n\"@id\":\"https://YOURDOMAIN.com/#website\",\n\"url\":\"https://YOURDOMAIN.com/\",\n\"name\":\"Landscape Legends LLC\",\n\"publisher\":{\n\"@id\":\"https://YOURDOMAIN.com/#business\"\n}\n},\n{\n\"@type\":\"WebPage\",\n\"@id\":\"https://YOURDOMAIN.com/#webpage\",\n\"url\":\"https://YOURDOMAIN.com/\",\n\"name\":\"Landscape Legends LLC | Landscaping in Bend, Oregon\",\n\"isPartOf\":{\n\"@id\":\"https://YOURDOMAIN.com/#website\"\n},\n\"about\":{\n\"@id\":\"https://YOURDOMAIN.com/#business\"\n},\n\"description\":\"Landscape Legends LLC offers landscaping services in Bend, Central Oregon, and Deschutes County with legendary care and standout results.\"\n},\n{\n\"@type\":\"FAQPage\",\n\"@id\":\"https://YOURDOMAIN.com/#faq\",\n\"mainEntity\":[\n{\n\"@type\":\"Question\",\n\"name\":\"What areas does Landscape Legends serve?\",\n\"acceptedAnswer\":{\n\"@type\":\"Answer\",\n\"text\":\"Landscape Legends serves Bend, Oregon, Central Oregon, and Deschutes County.\"\n}\n},\n{\n\"@type\":\"Question\",\n\"name\":\"What landscaping services does Landscape Legends offer?\",\n\"acceptedAnswer\":{\n\"@type\":\"Answer\",\n\"text\":\"Landscape Legends offers landscaping, lawn care, yard cleanups, aeration, thatch removal, bark installation, and ongoing landscape maintenance.\"\n}\n},\n{\n\"@type\":\"Question\",\n\"name\":\"How do I get a quote from Landscape Legends?\",\n\"acceptedAnswer\":{\n\"@type\":\"Answer\",\n\"text\":\"You can request a quote through the website or contact Landscape Legends directly by phone to discuss your project, scheduling, and service needs.\"\n}\n},\n{\n\"@type\":\"Question\",\n\"name\":\"Does Landscape Legends work on properties in Deschutes County?\",\n\"acceptedAnswer\":{\n\"@type\":\"Answer\",\n\"text\":\"Yes. Landscape Legends works with properties in Bend and throughout Deschutes County.\"\n}\n}\n]\n}\n]\n}\n</script>","siteBody":"<script>\n(function(){\n\"use strict\";\nvar NS=\"pfLegendDXMotion_v5\";\nif(window[NS]&&window[NS].destroy) window[NS].destroy();\n\nvar state={\nwrap:null,\nsection:null,\n\nmover:null,\ncenterText:null,\nmoverRow:null,\n\nmoverReverse:null,\ncenterTextReverse:null,\nmoverRowReverse:null,\n\nticking:false,\nbootTimer:null,\nbootCount:0,\nbootMax:80,\nbootDelay:180,\nobserver:null,\nmutationTimer:null,\nscrollHandler:null,\nresizeHandler:null,\nloadHandler:null,\nhashHandler:null,\npopHandler:null,\nreadyStateHandler:null\n};\n\nfunction clamp(v,min,max){\nreturn Math.max(min,Math.min(max,v));\n}\n\nfunction getWrap(){\nstate.wrap=document.querySelector('[data-pf-legend=\"1\"]');\nif(!state.wrap) return false;\n\nstate.section=state.wrap.querySelector(\".pfLegendSlideSection\");\n\nstate.mover=state.wrap.querySelector(\"#pfLegendMover\");\nstate.centerText=state.wrap.querySelector(\"#pfLegendCenterText\");\nstate.moverRow=state.wrap.querySelector(\"#pfLegendMoverRow\");\n\nstate.moverReverse=state.wrap.querySelector(\"#pfLegendMoverReverse\");\nstate.centerTextReverse=state.wrap.querySelector(\"#pfLegendCenterTextReverse\");\nstate.moverRowReverse=state.wrap.querySelector(\"#pfLegendMoverRowReverse\");\n\nreturn !!(state.wrap&&state.section&&(state.mover||state.moverReverse));\n}\n\nfunction getProgressForElement(el){\nif(!el) return 0;\nvar rect=el.getBoundingClientRect();\nvar vh=window.innerHeight||document.documentElement.clientHeight||800;\nvar start=vh;\nvar end=-rect.height;\nvar p=(start-rect.top)/(start-end);\nreturn clamp(p,0,1);\n}\n\nfunction updateCenterTextSingle(mover,row,textEl,activeText,inactiveText){\nif(!mover||!row||!textEl) return;\n\nvar rowRect=row.getBoundingClientRect();\nvar moverRect=mover.getBoundingClientRect();\nif(!rowRect.width||!moverRect.width) return;\n\nvar moverCenter=moverRect.left+(moverRect.width/2);\nvar rowCenter=rowRect.left+(rowRect.width/2);\nvar trigger=Math.max(90,moverRect.width*.55);\nvar active=Math.abs(moverCenter-rowCenter)<trigger;\n\nif(active){\nif(textEl.textContent!==activeText) textEl.textContent=activeText;\ntextEl.classList.add(\"is-active\");\n}else{\nif(textEl.textContent!==inactiveText) textEl.textContent=inactiveText;\ntextEl.classList.remove(\"is-active\");\n}\n}\n\nfunction update(){\nif(!getWrap()) return;\n\n/* ===== FIRST ROW: RIGHT TO LEFT ===== */\nif(state.mover&&state.moverRow){\nvar p1=getProgressForElement(state.moverRow);\nvar moverW=state.mover.offsetWidth||150;\nvar startX=window.innerWidth-(moverW*.15);\nvar endX=-moverW-(window.innerWidth*.03);\nvar x=startX+((endX-startX)*p1);\nstate.mover.style.transform=\"translate3d(\"+x+\"px,-50%,0)\";\nupdateCenterTextSingle(state.mover,state.moverRow,state.centerText,\"LANDSCAPE LEGENDS\",\"GET AN ESTIMATE\");\n}\n\n/* ===== SECOND ROW: LEFT TO RIGHT ===== */\nif(state.moverReverse&&state.moverRowReverse){\nvar p2=getProgressForElement(state.moverRowReverse);\nvar moverW2=state.moverReverse.offsetWidth||150;\nvar startX2=-moverW2-(window.innerWidth*.03);\nvar endX2=window.innerWidth-(moverW2*.15);\nvar x2=startX2+((endX2-startX2)*p2);\nstate.moverReverse.style.transform=\"translate3d(\"+x2+\"px,-50%,0)\";\nupdateCenterTextSingle(state.moverReverse,state.moverRowReverse,state.centerTextReverse,\"LANDSCAPE LEGENDS\",\"LEGENDARY CARE STARTS WITH\");\n}\n}\n\nfunction requestTick(){\nif(state.ticking) return;\nstate.ticking=true;\nrequestAnimationFrame(function(){\nstate.ticking=false;\nupdate();\n});\n}\n\nfunction delayedRefreshStack(){\nsetTimeout(requestTick,40);\nsetTimeout(requestTick,120);\nsetTimeout(requestTick,260);\nsetTimeout(requestTick,520);\nsetTimeout(requestTick,950);\nsetTimeout(requestTick,1500);\n}\n\nfunction boot(){\nclearTimeout(state.bootTimer);\nstate.bootCount=0;\n\nfunction tryBoot(){\nstate.bootCount++;\nif(getWrap()){\nrequestTick();\ndelayedRefreshStack();\nreturn;\n}\nif(state.bootCount<state.bootMax){\nstate.bootTimer=setTimeout(tryBoot,state.bootDelay);\n}\n}\ntryBoot();\n}\n\nfunction bind(){\nstate.scrollHandler=function(){requestTick();};\nstate.resizeHandler=function(){requestTick();delayedRefreshStack();};\nstate.loadHandler=function(){requestTick();delayedRefreshStack();};\nstate.hashHandler=function(){boot();};\nstate.popHandler=function(){boot();};\nstate.readyStateHandler=function(){\nif(document.readyState===\"interactive\"||document.readyState===\"complete\"){\nboot();\n}\n};\n\nwindow.addEventListener(\"scroll\",state.scrollHandler,{passive:true});\nwindow.addEventListener(\"resize\",state.resizeHandler);\nwindow.addEventListener(\"load\",state.loadHandler);\nwindow.addEventListener(\"hashchange\",state.hashHandler);\nwindow.addEventListener(\"popstate\",state.popHandler);\ndocument.addEventListener(\"readystatechange\",state.readyStateHandler);\n\nif(window.dx&&window.dx.address){\nsetTimeout(function(){boot();},50);\nsetTimeout(function(){boot();},250);\nsetTimeout(function(){boot();},700);\nsetTimeout(function(){boot();},1300);\n}\n}\n\nfunction watchDom(){\nif(state.observer) state.observer.disconnect();\nstate.observer=new MutationObserver(function(){\nclearTimeout(state.mutationTimer);\nstate.mutationTimer=setTimeout(function(){\nboot();\n},120);\n});\nstate.observer.observe(document.documentElement,{childList:true,subtree:true});\n}\n\nfunction destroy(){\nclearTimeout(state.bootTimer);\nclearTimeout(state.mutationTimer);\nif(state.observer) state.observer.disconnect();\nif(state.scrollHandler) window.removeEventListener(\"scroll\",state.scrollHandler,{passive:true});\nif(state.resizeHandler) window.removeEventListener(\"resize\",state.resizeHandler);\nif(state.loadHandler) window.removeEventListener(\"load\",state.loadHandler);\nif(state.hashHandler) window.removeEventListener(\"hashchange\",state.hashHandler);\nif(state.popHandler) window.removeEventListener(\"popstate\",state.popHandler);\nif(state.readyStateHandler) document.removeEventListener(\"readystatechange\",state.readyStateHandler);\n}\n\nwindow[NS]={\nboot:boot,\nupdate:update,\ndestroy:destroy\n};\n\nbind();\nwatchDom();\nboot();\ndelayedRefreshStack();\n})();\n</script>\n\n<script>\n(function(){\n\"use strict\";\n\nvar NS=\"pfScrollTopOnRealDxChange_v2\";\nif(window[NS]&&window[NS].destroy) window[NS].destroy();\n\nvar state={\nlastPath:\"\",\nbootTimer:null,\nbootCount:0,\nbootMax:60,\nbootDelay:120,\ndxHooked:false,\npopHandler:null,\nhashHandler:null,\noriginalOnUriChange:null\n};\n\nfunction normalizePath(v){\nv=(v||\"\").toString();\nv=v.split(\"#\")[0].split(\"?\")[0];\nv=v.replace(/\\/+/g,\"/\");\nif(v.length>1) v=v.replace(/\\/+$/,\"\");\nreturn v.toLowerCase()||\"/\";\n}\n\nfunction currentPath(){\nreturn normalizePath(window.location.pathname||\"/\");\n}\n\nfunction scrollTopNow(){\nwindow.scrollTo(0,0);\n}\n\nfunction handlePossibleChange(){\nvar now=currentPath();\nif(!state.lastPath){\nstate.lastPath=now;\nreturn;\n}\nif(now===state.lastPath) return;\nstate.lastPath=now;\nsetTimeout(scrollTopNow,0);\n}\n\nfunction hookDX(){\nif(state.dxHooked) return true;\nif(!window.dx||!dx.address) return false;\n\nstate.originalOnUriChange=dx.address.onUriChange;\n\ndx.address.onUriChange=function(){\ntry{\nif(typeof state.originalOnUriChange===\"function\"){\nstate.originalOnUriChange.apply(this,arguments);\n}\n}catch(e){}\nhandlePossibleChange();\n};\n\nstate.dxHooked=true;\nreturn true;\n}\n\nfunction boot(){\nstate.lastPath=currentPath();\nclearTimeout(state.bootTimer);\nstate.bootCount=0;\n\n(function retry(){\nstate.bootCount++;\nif(hookDX()) return;\nif(state.bootCount<state.bootMax){\nstate.bootTimer=setTimeout(retry,state.bootDelay);\n}\n})();\n}\n\nfunction destroy(){\nclearTimeout(state.bootTimer);\nif(state.popHandler) window.removeEventListener(\"popstate\",state.popHandler);\nif(state.hashHandler) window.removeEventListener(\"hashchange\",state.hashHandler);\ntry{\nif(window.dx&&dx.address&&state.dxHooked){\ndx.address.onUriChange=state.originalOnUriChange||null;\n}\n}catch(e){}\n}\n\nwindow[NS]={\nboot:boot,\ndestroy:destroy\n};\n\nif(document.readyState===\"loading\"){\ndocument.addEventListener(\"DOMContentLoaded\",boot,{once:true});\n}else{\nboot();\n}\n})();\n</script>\n\n<script>\n(function(){\n\"use strict\";\n\nfunction init(){\nvar el=document.getElementById(\"pfLegendDogCallout\");\nif(!el) return;\n\nvar shown=false;\n\nfunction show(){\nif(shown) return;\nshown=true;\nel.classList.add(\"is-visible\");\nwindow.removeEventListener(\"scroll\",onScroll);\n}\n\nfunction onScroll(){\nif(window.scrollY>10){\nshow();\n}\n}\n\n/* delay */\nsetTimeout(show,5000);\n\n/* scroll trigger */\nwindow.addEventListener(\"scroll\",onScroll,{passive:true});\n}\n\n/* DX + load safe */\nsetTimeout(init,500);\nsetTimeout(init,1200);\nsetTimeout(init,2000);\n\n})();\n</script>","customFonts":["Patrick Hand SC:400:latin:google"],"favicon":"image.png","blogSectionId":"","logoFile":0,"logoText":"Landscape Legends","logoHtml":"<img src=\"/pf-media/landscape_green_cleanBendOr.png\" alt=\"Bend Oregon Landscape Legends\" style=\"width: 160px;\" />","introFile":"","tabletLogoFile":"","demoDataIds":{"mediaIds":[],"sectionIds":[]},"cdnSslUri":"/pf-media","defaultEditorMode":"source","contactInfo":"","accountName":"landscapelegends","redirects":[],"status":"dev"}