1<!DOCTYPE html> 2<html class="no-js" lang=en> 3<head> 4 <meta charset="utf-8"> 5 <meta http-equiv="x-ua-compatible" content="ie=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta name="twitter:card" content="summary_large_image"> 8 <meta property="og:type" content="website"> 9 <title>Savannah GA Real Estate & Community Blog | Teresa Cowart Team</title> 10 <meta property="og:title" content="Savannah GA Real Estate & Community Blog | Teresa Cowart Team"> 11 <meta name="twitter:title" content="Savannah GA Real Estate & Community Blog | Teresa Cowart Team"> 12 <meta name="description" content="Read articles covering real estate tips, local trends, homeownership advice, and market updates. Contact us and get your free consultation starting today!"> 13 <meta property="og:description" content="Read articles covering real estate tips, local trends, homeownership advice, and market updates. Contact us and get your free consultation starting today!"> 14 <meta name="twitter:description" content="Read articles covering real estate tips, local trends, homeownership advice, and market updates. Contact us and get your free consultation starting today!"> 15 <meta property="og:image" content="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8"> 16 <meta name="twitter:image" content="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8"> 17 <meta property="og:url" content="https://teresacowartteam.com/blog"> 18 <link rel="canonical" href="https://teresacowartteam.com/blog"> 19
19<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
19 20 <link rel="preconnect" href="https://fonts.googleapis.com"> 21 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 22 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Playfair%20Display:400,500,600,700,800,900,400i,500i,600i,700i,800i,900i"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Work%20Sans:100,200,300,400,500,600,700,800,900,100i,200i,300i,400i,500i,600i,700i,800i,900i"> 23 <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 24 <noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css"></noscript> 25 <link rel="icon" type="image/x-icon" href="/favicon.ico"> 26 <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> 27 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> 28 <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png"> 29 <style id="global-css">:root{--global-primary-font-family:'Playfair Display',serif;--global-primary-font-family-short:Playfair Display;--global-secondary-font-family:'Work Sans',sans-serif;--global-secondary-font-family-short:Work Sans;--global-body-padding:0px;--global-background-color:#fff;--global-body-font-size:16px;--global-h1-font-size:56px;--global-h2-font-size:36px;--global-h3-font-size:26px;--global-h4-font-size:24px;--global-h5-font-size:12px;--global-h6-font-size:32px;--global-section-padding:96px;}@media (max-width: 768px){:root{--global-section-padding:64px;}}body{padding:0px;background-color:#fff;font-family:'Work Sans',sans-serif;font-size:16px;}@media (min-width: 768px){body{padding:0px 0px 0px 0px;}}h1,h2,h3,h4,h5,h6,button{font-family:'Playfair Display',serif;}h1{font-size:56px;}h2{font-size:36px;}h3{font-size:26px;}h4{font-size:24px;}h5{font-size:12px;}h6{font-size:32px;}</style> 30 <link rel="stylesheet" type="text/css" href="https://styles.luxurypresence.com/visionary/index.css" /> 31 <style id="website-css">body>div.mobile-contact-wrapper .mobile-contact.with-search div.buttons-holder{bottom:150px;}@media only screen and (max-width: 768px){iframe[name='widgetCta']{bottom:55px!important;right:15px!important;}}iframe[name="widgetCta"]{bottom:70px!important;right:15px!important;}body>div.mobile-contact-wrapper .connect-btn{border:2px solid #64b1af!important;}body>div.mobile-contact-wrapper{z-index:9999!important;}body>div.mobile-contact-wrapper .mobile-contact{z-index:9999!important;}a{-webkit-transition:all 0.3s;transition:all 0.3s;}#modal-global-contact-us .lp-a a{color:#808080!important;}#modal-global-contact-us .lp-close-icon{-webkit-filter:invert(0)!important;filter:invert(0)!important;color:#FFF!important;}@media (min-width: 1024px){#modal-global-contact-us .contact-form-modal__close:after{color:#FFF!important;}}@media only screen and (max-width: 768px){#global-sidemenu ul.lp-socials{padding-bottom:30px;}#global-footer .footer-logos-row{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}}[class*="__title"],[class*="__heading"],[class*="-title"],[class*="__link"],[class*="__sub-nav-link"],.lp-h1,.lp-h2,.lp-h3,.lp-h4,.lp-h5{text-transform:uppercase;}[class*="__description"],[class*="-description"],[class*="__subtitle"],[class*="-subtitle"],[class*="__desc"]{text-transform:none;}div#global-sidemenu.sidemenu a,nav#global-navbar a{text-transform:uppercase;}div#global-sidemenu.sidemenu button,nav#global-navbar button{text-transform:uppercase;}:root{--global-h4-font-size:32px;--global-h5-font-size:24px;--global-h6-font-size:20px;--lp-color-primary-accent:#1CB8E3;--lp-color-primary-accent-dark:#1CB8E3;--lp-color-primary-accent-light:#ccc;}footer#global-footer .footer-bottom-row{margin-bottom:40px;}#global-footer>div>div.footer-bottom-row>img{max-width:100px!important;}body>div.mobile-contact-wrapper div.mobile-contact{bottom:150px;}@media only screen and (max-width: 768px){iframe[name='widgetCta']{bottom:55px!important;right:15px!important;}}iframe[name="widgetCta"]{bottom:70px!important;right:15px!important;}body>div.mobile-contact-wrapper{z-index:9999!important;}body>div.mobile-contact-wrapper .mobile-contact{z-index:9999!important;}.lp-h1,.lp-h2,.lp-h3{font-variation-settings:'opsz' 44,'GRAD' 0,'slnt' 0,'XTRA' 510,'XOPQ' 96,'YOPQ' 40,'YTLC' 540,'YTUC' 712,'YTAS' 750,'YTDE' -220,'YTFI' 738;}.watermark{font-variation-settings:'GRAD' 0,'slnt' 0,'XTRA' 511,'XOPQ' 96,'YOPQ' 50,'YTLC' 537,'YTUC' 712,'YTAS' 750,'YTDE' -221,'YTFI' 738,'opsz' 44;}@media only screen and (max-width:768px){ul.lp-socials{-webkit-box-pack:center!important;-ms-flex-pack:center!important;
31-webkit-justify-content:center!important;justify-content:center!important;}}#global-footer .footer-disclaimer a{color:#000!important;-webkit-text-decoration:underline!important;text-decoration:underline!important;text-decoration-color:#ccc!important;}#global-footer .footer-disclaimer a:hover{text-decoration-color:#1CB8E3!important;}h1,.redesign h1,.redesign .h1,.lp-h1,h2,.redesign h2,.redesign .serif,.lp-h2,h3,.redesign h3,.lp-h3,h4,.redesign .h4,.redesign h4,.lp-h4,h5,.redesign .h5,.redesign h5,.lp-h5,h6{text-transform:uppercase;letter-spacing:4px;}.lp-text--pretitle,.stats-list-title-group__pre-title,.opening-search__pre-title,.custom-intro__pre-title{letter-spacing:3px;font-size:14px;}.lp-a .link:hover,.lp-a a:hover{text-decoration-color:#1CB8E3;}#global-navbar .header-container .header-navigation__link:before{background-color:#1CB8E3!important;}#global-navbar .header-container .header-navigation__link{text-transform:uppercase;letter-spacing:1px;}#global-navbar .header-container .header-navigation__link:after{background-color:#1CB8E3;}#global-navbar .header-container .header-navigation__sub-nav{padding:0;}#global-navbar .header-container .header-navigation__sub-nav li{background:#fff;}#global-navbar .header-container .header-navigation__sub-nav li:hover{background-color:#d5e0d9;}#global-navbar .header-container .header-navigation__sub-nav li:hover a{color:#1a1a1a;}#global-navbar .header-container .header-navigation__sub-nav .header-navigation__sub-nav-link{color:#000;text-transform:uppercase;letter-spacing:1px;padding:1rem;}#global-navbar .header-container .header-search-btn{background-color:#1CB8E3;border-color:#1CB8E3;}#global-navbar .header-container .header-search-btn:after{background-color:#fff;}#global-navbar .header-container .header-search-btn:hover{background-color:transparent;}#global-navbar .header-container .header-search-btn:hover:after{background-color:#1CB8E3;}#global-navbar .header-container .header-hamburger-btn:empty{border-color:#1CB8E3;background-color:#1CB8E3;}#global-navbar .header-container .header-hamburger-btn:empty:before,#global-navbar .header-container .header-hamburger-btn:empty:after{background-color:#fff;}#global-navbar .header-container .header-hamburger-btn:empty:hover{background-color:transparent;}#global-navbar .header-container .header-hamburger-btn:empty:hover:before,#global-navbar .header-container .header-hamburger-btn:empty:hover:after{background-color:#1CB8E3;}#global-navbar .header.scroll{background-color:rgba(255, 255, 255, 1)!important;color:#000!important;}.seller-header__logo{height:90px;}.seller-header__container{height:100px;}#global-sidemenu .sidemenu-close{border:1px solid #000;}#global-sidemenu .sidemenu-close:hover{background-color:#1CB8E3;border-color:#1CB8E3;}#global-sidemenu .sidemenu-close:hover:after{--iconColor:#fff;}#global-sidemenu .sidemenu-navigation__link,#global-sidemenu .sidemenu-navigation-sub-nav__link{text-transform:uppercase;letter-spacing:1px;-webkit-line-clamp:unset;-webkit-box-orient:unset;}#global-sidemenu .sidemenu-navigation__link{font-size:21px;}#global-sidemenu .sidemenu-navigation__link:hover{color:#1CB8E3;opacity:0.75;}#global-sidemenu .sidemenu-navigation__link:before{font-size:0;}#global-sidemenu .sidemenu__col-title{font-size:18px;font-weight:400;letter-spacing:4px;opacity:1;}#global-sidemenu .sidemenu__col-description p{text-transform:uppercase;}#global-sidemenu .lp-a a{text-transform:uppercase;letter-spacing:1px;}#global-sidemenu .lp-a a:hover{text-decoration-color:#1CB8E3;color:#1CB8E3;}#global-footer .footer-logos-row{margin-bottom:40px;}
31#global-footer .footer__section-title{font-size:var(--lp-h4-font-size);letter-spacing:4px;}#global-footer .footer__col-title{font-size:18px;font-weight:400;letter-spacing:4px;opacity:1;}#global-footer .footer__col-description{text-transform:uppercase;}@media (min-width: 769px){#global-footer .footer__col-description{max-width:30ch;}}@media (max-width: 768px){#global-footer .footer__section-content{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:35px;}}@media (max-width: 1024px){#global-footer .footer-navigation{-ms-grid-auto-flow:unset;grid-auto-flow:unset;max-width:100%;min-width:100%;}}#global-footer .lp-a a{text-transform:uppercase;letter-spacing:1px;}#global-footer .lp-a a:hover{text-decoration-color:#1CB8E3;color:#1CB8E3;}#modal-global-contact-us .contact-form-modal-details__title{max-width:100%;}#modal-global-contact-us .contact-form-modal-agent__contact{max-width:100%;}#modal-global-contact-us .contact-form-modal-agent__name,#modal-global-contact-us .lp-pre-line{text-transform:uppercase;letter-spacing:1px;}#modal-global-contact-us .lp-label{font-size:14px;font-weight:500;text-transform:uppercase;}#modal-global-contact-us .lp-a a{text-transform:uppercase;letter-spacing:1px;color:#000;}#modal-global-contact-us .lp-a a:hover{color:#1CB8E3;text-decoration-color:#1CB8E3;}@media (max-width: 1024px){#modal-global-contact-us >.lp-close{display:block;top:3vh;color:#fff;}}@media (max-width: 1024px){#modal-global-contact-us .contact-form-modal__close-container{display:none;}}@media (min-width: 1024px){#modal-global-contact-us .contact-form-modal__close:after{color:#000;}}@media (max-width: 1980px){#global-mobile-contact .contact-form{--padding:0;}}#global-mobile-contact .contact-form .contact-form__container{padding:0 0;}@media(max-width: 767px){footer#global-footer .footer-logo{max-height:90px;max-width:280px;}}@media (max-width: 768px){.header{--linkColor:var(--textColor, #161515);--subLinkColor:var(--lp-color-primary-1, #fff);--navBgColor:var(--backgroundColor, #fff);background-color:var(--navBgColor)!important;color:var(--linkColor)!important;}}#global-footer .lp-a a{cursor:pointer;}#modal-global-contact-us .lp-input:not(:placeholder-shown){color:#000!important;}@media (min-width: 481px){.rich-lightbox__nav-link.active{color:var(--lp-color-primary-5);}.rich-lightbox__nav-link:hover{--lp-color-primary-accent-dark:#fff;--lp-color-primary-1:#1CB8E3;}}#global-mobile-contact .contact-form .contact-form__container{border:none;}@media (min-width: 769px){#global-footer .footer__col-description{max-width:50ch;}}.footer__col-description{max-width:50ch;}@media (max-width: 768px){.footer__col-content{max-width:calc(100% - 8px);}}.header-contact-btn{font-size:0;}.header-contact-btn:after{content:"(912) 525-0900";font-size:12px;}.header-contact-btn:hover:after{color:#1CB8E3!important;}@media only screen and (max-width:768px){.contact-form-modal__close:after{height:25px;width:20px;--iconColor:#1CB8E3;}}@media only screen and (min-width:769px){.contact-form-modal__close:after{height:30px;width:40px;}}@media only screen and (min-width:769px){body.page-sellers .hoverable-section{padding-bottom:0;padding-top:0;}}@media only screen and (max-width:768px){body.page-sellers .hoverable-section{padding-bottom:80px;padding-top:80px;}}@media only screen and (min-width:769px){body.page-buyers .hoverable-section{padding-bottom:0;padding-top:0;}}@media only screen and (max-width:768px){body.page-buyers .hoverable-section{padding-bottom:80px;padding-top:80px;}}#global-footer .footer-logo{max-height:70px;}.page-concierge-auctions .custom-intro__title:after{content:"";background-image:url(https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=100,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/500b4aba-e15b-4ee8-b678-f32770cbc1f3);height:150px;width:500px;max-width:100%;-webkit-filter:invert(1);filter:invert(1);-webkit-background-size:contain;background-size:contain;background-repeat:no-repeat;display:block;background-position-x:center;}@media only screen and (max-width:768px){.page-concierge-auctions .custom-intro__title:after{height:100px;}}.page-concierge-auctions .custom-intro__title{font-size:0;}.custom-intro__scroll-btn{border-color:#1CB8E3;background-color:#1CB8E3;}.custom-intro__scroll-btn:after{background-color:#fff;}.custom-intro__scroll-btn:hover{background-color:transparent;}
31.custom-intro__scroll-btn:hover:after{background-color:#1CB8E3;}@media (max-width: 768px){.sidemenu-close{top:18px;}.sidemenu-nav-holder{gap:28px;}ul.footer-navigation{gap:1rem;}}h1,.redesign h1,.redesign .h1,.lp-h1,h2,.redesign h2,.redesign .serif,.lp-h2,h3,.redesign h3,.lp-h3,h4,.redesign .h4,.redesign h4,.lp-h4,h5,.redesign .h5,.redesign h5,.lp-h5,h6{letter-spacing:0;}@media (min-width: 768px){.header-logo{height:80px;}}h5.footer__section-title,p.footer__col-title,#modal-global-contact-us .contact-form-modal-details__title,#global-mobile-contact .contact-form .contact-form__container h3{color:#1CB8E3;}body>div.mobile-contact-wrapper .contact-form__item .lp-input{color:#1a1a1a;}@media (max-width: 1024px){.lp-close-icon{-webkit-filter:invert(1);filter:invert(1);}}</style> 32 <style id="wow-hide-elements">.wow{visibility:hidden!important}</style> 33 <style id="page-css"> 34 #section-c3f2b87c-69b5-446c-a7d3-6ef3300b8597{color:#c0c0c0;--fontColor:#c0c0c0;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:75%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#ffffff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#ffffff;--gradient-color:var(--overlay-color, rgba(0, 0, 0, 0.00));background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}@media (min-width: 960px) and (orientation: landscape){#section-c3f2b87c-69b5-446c-a7d3-6ef3300b8597{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8');}}@media (min-width: 1280px) and (orientation: landscape){#section-c3f2b87c-69b5-446c-a7d3-6ef3300b8597{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8');}}@media (min-width: 1920px) and (orientation: landscape){#section-c3f2b87c-69b5-446c-a7d3-6ef3300b8597{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8');}}@media (min-width: 2560px) and (orientation: landscape){#section-c3f2b87c-69b5-446c-a7d3-6ef3300b8597{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8');}}#section-7340826b-bdad-4f4c-95bc-421ee1719d85{color:#1A1A1A;--fontColor:#1A1A1A;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:10%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#FFFFFF;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;--section-padding-top:calc(4 / 4 * var(--global-section-padding));--section-padding-bottom:calc(4 / 4 * var(--global-section-padding));background-color:#FFFFFF;}#section-7340826b-bdad-4f4c-95bc-421ee1719d85 .paginationjs-next a:hover:after,#section-7340826b-bdad-4f4c-95bc-421ee1719d85 .paginationjs-prev a:hover:after{background-color:#fff!important;}@media (max-width: 560px){#section-7340826b-bdad-4f4c-95bc-421ee1719d85 .lp-pagination.pagination-container ul li,#section-7340826b-bdad-4f4c-95bc-421ee1719d85 .pagination-container ul li{margin:0 2px!important;}}#section-7340826b-bdad-4f4c-95bc-421ee1719d85 h1{color:#1CB8E3;}#section-7340826b-bdad-4f4c-95bc-421ee1719d85 h2{color:#1CB8E3;}#section-7340826b-bdad-4f4c-95bc-421ee1719d85 h3{color:#1CB8E3;}#section-7340826b-bdad-4f4c-95bc-421ee1719d85 p{color:#1A1A1A;}#section-7340826b-bdad-4f4c-95bc-421ee1719d85>div:last-child{padding-top:calc(4 / 4 * var(--global-section-padding))!important;padding-bottom:calc(4 / 4 * var(--global-section-padding))!important;}#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94{color:#fff;--fontColor:#fff;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#ffffff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;--section-padding-top:calc(4 / 4 * var(--global-section-padding));--section-padding-bottom:calc(4 / 4 * var(--global-section-padding));background-color:#ffffff;--gradient-color:var(--overlay-color, rgba(0, 0, 0, 0.6));background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/4e7c558d-4083-4f16-af08-f91c42ec08a5');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94 .lp-input-icon:after{--iconColor:#1CB8E3;}#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94 .lp-input:not(:placeholder-shown){color:#1CB8E3;}@media only screen and (min-width: 1300px){#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94{background-attachment:fixed;-webkit-background-position:top left;background-position:top left;background-repeat:no-repeat;-webkit-background-size:cover;background-size:cover;}}
34#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94 .newsletter-contact-cta__wrapper{-webkit-box-pack:center!important;-ms-flex-pack:center!important;-webkit-justify-content:center!important;justify-content:center!important;}#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94>div:last-child{padding-top:calc(4 / 4 * var(--global-section-padding))!important;padding-bottom:calc(4 / 4 * var(--global-section-padding))!important;}@media (min-width: 960px) and (orientation: landscape){#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/4e7c558d-4083-4f16-af08-f91c42ec08a5');}}@media (min-width: 1280px) and (orientation: landscape){#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/4e7c558d-4083-4f16-af08-f91c42ec08a5');}}@media (min-width: 1920px) and (orientation: landscape){#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/4e7c558d-4083-4f16-af08-f91c42ec08a5');}}@media (min-width: 2560px) and (orientation: landscape){#section-f6ab0e0a-1d17-477f-be39-f70a71f91f94{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/4e7c558d-4083-4f16-af08-f91c42ec08a5');}}#section-d0bb8190-fa80-4a3a-b56c-b37146df7e09{color:#1a1a1a;--fontColor:#1a1a1a;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:10%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#fff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#fff;}#section-d0bb8190-fa80-4a3a-b56c-b37146df7e09 .instagram-feed__title-group .instagram-feed__icon:after{background-color:#1CB8E3;}@media only screen and (max-width: 767px){#section-d0bb8190-fa80-4a3a-b56c-b37146df7e09 .instagram-feed__link,#section-d0bb8190-fa80-4a3a-b56c-b37146df7e09 .instagram-feed__link:hover,#section-d0bb8190-fa80-4a3a-b56c-b37146df7e09 .instagram-feed__link:visited{font-size:24px!important;}}body>div.sidemenu{background-color:rgba(201, 238, 248, 1);color:rgba(26, 26, 26, 1);--fontColor:rgba(26, 26, 26, 1);--fontColor_H:0;--fontColor_S:0%;--fontColor_L:10%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:rgba(201, 238, 248, 1);--bgColor_H:193;--bgColor_S:77%;--bgColor_L:88%;--bgColor_A:1;--bgColor_darkenDir:-1;}footer{background-color:rgba(255, 255, 255, 1);color:rgba(26, 26, 26, 1);--fontColor:rgba(26, 26, 26, 1);--fontColor_H:0;--fontColor_S:0%;--fontColor_L:10%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:rgba(255, 255, 255, 1);--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;}body>div.mobile-contact-wrapper{z-index:200;position:relative;}body>div.mobile-contact-wrapper .lp-ico:before{content:'';width:1em;height:1em;background-color:currentColor;-webkit-background-size:cover;background-size:cover;display:block;-webkit-mask-position:center;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-transition:all .3s;transition:all .3s;}body>div.mobile-contact-wrapper .lp-ico-search:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewB
34ox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewBox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewBox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-arrow-top:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-scroll-top:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");}body>div.mobile-contact-wrapper .lp-ico-close:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");}body>div.mobile-contact-wrapper .lp-ico-phone:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8
34699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-sms:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-email:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.85
3471 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.8571 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.8571 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper a{-webkit-text-decoration:none;text-decoration:none;}body>div.mobile-contact-wrapper .btn-holder{bottom:-50px;left:19px;position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:13px;opacity:0;-webkit-transition:all .3s;transition:all .3s;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .btn-holder{right:19px;padding:0 48px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}}body>div.mobile-contact-wrapper .btn-holder.visible{bottom:28px;opacity:1;}body>div.mobile-contact-wrapper .search-btn{width:48px;height:48px;border-radius:999px;font-size:0;line-height:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-transition:all .3s;transition:all .3s;padding:12px;color:#141414;background:#fff;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .search-btn{position:absolute;left:0;bottom:0;}}body>div.mobile-contact-wrapper .search-btn:before{width:24px;height:24px;}body>div.mobile-contact-wrapper .connect-btn{height:48px;padding:0 24px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;text-transform:uppercase;border-radius:25px;color:var(--pillTextColor);background:var(--pillBackgroundColor);border:1px solid rgba(255, 255, 255, 0.2);cursor:pointer;font-size:10px;font-style:normal;font-weight:500;line-height:16px;letter-spacing:0.4px;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-transition:all .4s;transition:all .4s;box-shadow:0 0 0 0 rgba(255, 255, 255, 0.2);-webkit-animation:pulsate 2s ease infinite;animation:pulsate 2s ease infinite;}body>div.mobile-contact-wrapper .connect-btn:before{width:16px;height:16px;}body>div.mobile-contact-wrapper .pop-up{display:none;position:fixed;bottom:0;left:0;width:100%;-webkit-transition:all .3s;transition:all .3s;border-radius:16px 16px 0 0;color:var(--textColor);background:var(--backgroundColor);}@media (max-height: 850px){body>div.mobile-contact-wrapper .pop-up{max-height:85vh;overflow-y:auto;}}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up{max-height:none;overflow-y:initial;max-width:637px;border-radius:16px;bottom:28px;left:19px;}}body>div.mobile-contact-wrapper .pop-up .lp-container{padding-top:24px;padding-bottom:24px;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up .lp-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-top:40px;padding-bottom:40px;min-height:450px;padding-left:56px;padding-right:56px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}body>div.mobile-contact-wrapper .pop-up .close-btn{width:44px;height:44px;background-color:transparent;border-color:transparent;display:block;margin:24px auto 0;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--textColor);cursor:pointer;padding:10px;border:0;}body>div.mobile-contact-wrapper .pop-up .close-btn:before{width:24px;height:24px;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up .close-btn{position:absolute;top:14px;right:12px;margin:0;}}body>div.mobile-contact-wrapper .pop-up .icon-btn{width:44px;height:44px;border-radius:999px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:8px;color:var(--textColor);position:relative;}body>div.mobile-contact-wrapper .pop-up .icon-btn:after{position:absolute;bottom:0;width:100%;left:0;border-radius:999px;
34height:100%;content:'';border:solid 1px var(--textColor);opacity:.3;}body>div.mobile-contact-wrapper .pop-up .icon-btn:before{width:24px;height:24px;}body>div.mobile-contact-wrapper .success-block{display:none;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .success-block{-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}}body>div.mobile-contact-wrapper .success-block .lp-btn{margin-top:24px;}body>div.mobile-contact-wrapper .contact-form{margin:0;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .contact-form__item{width:100%;}}body>div.mobile-contact-wrapper .contact-form__item .lp-input{width:100%;}body>div.mobile-contact-wrapper .contact-form__item .is-placeholder{color:#818181;}body>div.mobile-contact-wrapper .contact-form__item+.contact-form__item{margin-top:16px;}body>div.mobile-contact-wrapper .contact-form.show-success .contact-form__container,body>div.mobile-contact-wrapper .contact-form.success .contact-form__container{display:none;}body>div.mobile-contact-wrapper .contact-form.show-success .success-block,body>div.mobile-contact-wrapper .contact-form.success .success-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}body>div.mobile-contact-wrapper .contact-form .lp-disclaimer{margin-top:16px;}body>div.mobile-contact-wrapper .contact-form .lp-h3{margin-bottom:16px;}body>div.mobile-contact-wrapper .success-message{font-size:22px;}@-webkit-keyframes pulsate{0%{box-shadow:0 0 0 0 rgba(255, 255, 255, 0.2);}50%{box-shadow:0 0 4px 6px rgba(255, 255, 255, .5);}100%{box-shadow:0 0 12px 12px rgba(255, 255, 255, 0);}} 35 </style> 36 <style id="custom-style-css">.hyperlink-style-1{color:rgba(26, 26, 26, 1)!important;}.hyperlink-style-1:hover{color:#1CB8E3!important;}.button-style-1{color:rgba(255, 255, 255, 1)!important;background-color:#1CB8E3!important;border-color:#1CB8E3!important;}.button-style-1:hover{color:#1CB8E3!important;background-color:rgba(145, 102, 72, 0)!important;border-color:#1CB8E3!important;}.pagination-style-1 li a{color:#1CB8E3!important;background-color:rgba(177, 132, 99, 0)!important;border-color:#1CB8E3!important;}.pagination-style-1 li a:hover{color:rgba(255, 255, 255, 1)!important;background-color:#1CB8E3!important;border-color:#1CB8E3!important;}.pagination-style-1 li.active a{color:rgba(255, 255, 255, 1)!important;background-color:#1CB8E3!important;border-color:#1CB8E3!important;}.social_icons-style-1 a{border-color:#1CB8E3!important;background-color:#1CB8E3!important;color:rgba(255, 255, 255, 1)!important;}.social_icons-style-1 a:hover{border-color:#1CB8E3!important;background-color:rgba(145, 102, 72, 0)!important;color:#1CB8E3!important;}.social_icons-style-1 a i{color:inherit!important;}
36.social_icons-style-1 a svg,.social_icons-style-1 a svg path{fill:currentColor!important;}.hyperlink-style-2{color:rgba(255, 255, 255, 1)!important;}.hyperlink-style-2:hover{color:#1CB8E3!important;}.button-style-2{color:#1CB8E3!important;background-color:rgba(255, 255, 255, 1)!important;border-color:rgba(255, 255, 255, 1)!important;}.button-style-2:hover{color:rgba(255, 255, 255, 1)!important;background-color:rgba(177, 132, 99, 0)!important;border-color:rgba(255, 255, 255, 1)!important;}.pagination-style-2 li a{color:rgba(255, 255, 255, 1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(255, 255, 255, 1)!important;}.pagination-style-2 li a:hover{color:#1CB8E3!important;background-color:rgba(255, 255, 255, 1)!important;border-color:rgba(255, 255, 255, 1)!important;}.pagination-style-2 li.active a{color:#1CB8E3!important;background-color:rgba(255, 255, 255, 1)!important;border-color:rgba(255, 255, 255, 1)!important;}.social_icons-style-2 a{border-color:rgba(255, 255, 255, 1)!important;background-color:rgba(255, 255, 255, 1)!important;color:#1CB8E3!important;}.social_icons-style-2 a:hover{border-color:#FFFFFF!important;background-color:rgba(255, 255, 255, 0)!important;color:rgba(255, 255, 255, 1)!important;}.social_icons-style-2 a i{color:inherit!important;}
36.social_icons-style-2 a svg,.social_icons-style-2 a svg path{fill:currentColor!important;}.button-style-3{color:#1CB8E3!important;background-color:rgba(255, 255, 255, 0)!important;border-color:#1CB8E3!important;}.button-style-3:hover{color:rgba(255, 255, 255, 1)!important;background-color:#1CB8E3!important;border-color:#1CB8E3!important;}.button-style-4{color:rgba(255, 255, 255, 1)!important;background-color:rgba(255, 255, 255, 0)!important;border-color:rgba(255, 255, 255, 1)!important;}.button-style-4:hover{color:#1CB8E3!important;background-color:rgba(255, 255, 255, 1)!important;border-color:#FFFFFF!important;}</style> 37 <!-- LP Consent bootstrap: blocking; resolves consent state, pushes Consent Mode 38 defaults, and dynamically loads the locale + main (and banner if needed). --> 39
39<script src="https://cdn.luxurypresence.com/scripts/lp-consent/latest/lp-consent-boot.js" data-website-id="cabbe5a3-1336-4a26-afab-bb421f339f1d"></script>
39 40 41 42
42<script> 43 (function utmParse() { 44 const url = new URL(window.location.href); 45 if (url.search) { 46 const utm = url.search.split(/\?|&/g).reduce((acc, current) => { 47 const matched = current.match(/utm_(content|campaign|medium|source|term|id)|gclid/g); 48 if (matched) { 49 acc[matched[0]] = current.replace(`${matched[0]}=`, ''); 50 } 51 return acc; 52 }, {}); 53 if (Object.keys(utm).length) { 54 window.localStorage.setItem('utm_vars', JSON.stringify(utm)); 55 } else { 56 // Remove old utm vars 57 window.localStorage.removeItem('utm_vars'); 58 } 59 } 60 // Set referrer in local storage 61 // This is meant to be stored once to avoid self-referrals and to have the first referrer only. 62 if (!window.localStorage.getItem('referrer')) { 63 // Capture the Referrer URL 64 const referrer = document.referrer; 65 if (referrer) { 66 // Only store the referrer if it comes from outside the current domain (to avoid self-referrals) 67 const currentDomain = window.location.hostname; 68 const referrerDomain = new URL(referrer).hostname; 69 70 if (referrerDomain !== currentDomain) { 71 // Store it in localStorage 72 localStorage.setItem('referrer', referrer); 73 } 74 } 75 } 76 })(); 77 </script>
77 78 <!-- begin Widget Tracker Code -->
79<script> 80(function(w,i,d,g,e,t){w["WidgetTrackerObject"]=g;(w[g]=w[g]||function() 81{(w[g].q=w[g].q||[]).push(arguments);}),(w[g].ds=1*new Date());(e="script"), 82(t=d.createElement(e)),(e=d.getElementsByTagName(e)[0]);t.async=1;t.src=i; 83e.parentNode.insertBefore(t,e);}) 84(window,"https://widgetbe.com/agent",document,"widgetTracker"); 85window.widgetTracker("create", "WT-LBAKEVRY"); 86window.widgetTracker("send", "pageview"); 87</script>
87 88<!-- end Widget Tracker Code --> 89 90<!-- Bing Webmaster Tools Verification -->
91<script> 92 // Check if on the homepage before the body loads 93 if (window.location.pathname === '/' || window.location.pathname === '/index.html') { 94 document.write('<meta name="msvalidate.01" content="EAEFC5C7B7E1F99635A79B4601AFABE9" />'); 95 } 96</script>
96 97
98<script type="text/javascript"> 99 // Function to inject JSON-LD schema 100 function injectSchema(schema) { 101 var script = document.createElement('script'); 102 script.type = 'application/ld+json'; 103 script.text = JSON.stringify(schema); 104 document.head.appendChild(script); 105 } 106 107 // Check if the current path is the homepage 108 if (window.location.pathname === '/') { 109 var realEstateAgentSchema = { 110 "@context": "https://schema.org", 111 "@type": "RealEstateAgent", 112 "name": "Teresa Cowart Team", 113 "image": "https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/8fd05e8e-0f2d-4daf-a269-315700ae29c8", 114 "@id": "https://teresacowartteam.com/#realEstateAgent", 115 "url": "https://teresacowartteam.com/", 116 "telephone": "(912)667-1881", 117 "email": "[email protected]", 118 "description": "The Teresa Cowart Team, the #1 real estate team in the Savannah, GA area, serving Savannah, Richmond Hill, Pooler, Rincon, Hinesville, and beyond.", 119 "address": { 120 "@type": "PostalAddress", 121 "streetAddress": "7001 Chatham Center Dr, Ste 2400", 122 "addressLocality": "Savannah", 123 "addressRegion": "GA", 124 "postalCode": "31405", 125 "addressCountry": "US" 126 }, 127 "geo": { 128 "@type": "GeoCoordinates", 129 "latitude": 32.0717697, 130 "longitude": -81.1480865 131 }, 132 "openingHoursSpecification": { 133 "@type": "OpeningHoursSpecification", 134 "dayOfWeek": [ 135 "Monday", 136 "Tuesday", 137 "Wednesday", 138 "Thursday", 139 "Friday", 140 "Saturday", 141 "Sunday" 142 ], 143 "opens": "00:00", 144 "closes": "23:59" 145 }, 146 "sameAs": [ 147 "https://www.facebook.com/TeresaCowartTeam/", 148 "https://www.instagram.com/teresacowartteam/", 149 "https://www.yelp.com/biz/teresa-cowart-team-re-max-accent-savannah", 150 "https://www.tiktok.com/@teresacowartteam", 151 "https://www.youtube.com/@teresacowartteam/featured", 152 "https://www.google.com/search?q=teresa+cowart+real+estate+team#lrd=0x88fb0f17e1779229:0xa625619eb30be5b3,1,,,," 153 ], 154 "areaServed": [ 155 { 156 "@type": "City", 157 "name": "Savannah" 158 }, 159 { 160 "@type": "City", 161 "name": "Richmond Hill" 162 }, 163 { 164 "@type": "City", 165 "name": "Pooler" 166 }, 167 { 168 "@type": "City", 169 "name": "Rincon" 170 }, 171 { 172 "@type": "City", 173 "name": "Hinesville" 174 }, 175 { 176 "@type": "City", 177 "name": "Midway" 178 }, 179 { 180 "@type": "City", 181 "name": "Guyton" 182 }, 183 { 184 "@type": "City", 185 "name": "Skidaway Island" 186 } 187 ], 188 "knowsAbout": [ 189 "Residential Real Estate", 190 "Luxury Homes", 191 "New Construction Homes", 192 "Military Relocation", 193 "Property Management", 194 "Buyer Representation", 195 "Seller Representation", 196 "Home Valuation" 197 ] 198 }; 199 injectSchema(realEstateAgentSchema); 200 } 201</script>
201 202 <!-- GOOGLE TRANSLATE STYLES are moved to external CSS --> 203</head> 204<body> 205 <div id="google_translate_element" style="display: none"></div> 206 207 <nav id="global-navbar" data-el-id="3242b8f0-253e-46f7-b814-162ccf958ec2"> 208 209<header class="header js-header" style="--textColor: rgba(26, 26, 26, 1); --backgroundColor: rgba(255, 255, 255, 1);"> 210 <div class="header-container "> 211 212 <a href="/" class="header-logo"> 213 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=320/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd 497w" sizes="350px" alt="Company logo" class="header-logo__img header-logo__img--dark"> 214 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=320/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd 497w" sizes="350px" alt="Company logo" class="header-logo__img header-logo__img--light"> 215 </a> 216 217 <ul class="header-navigation"> 218 <li class="header-navigation__item "> 219 220 <a class="header-navigation__link " href="/team" style="--delay: 0s">Meet the Team</a> 221 </li> 222 <li class="header-navigation__item header-navigation__item--sub-nav"> 223 224 <a class="header-navigation__link js-subnav-opener" style="--delay: 0.1s">Properties</a> 225 226 <ul class="header-navigation__sub-nav"> 227 <li class="header-navigation__sub-nav-item"> 228 <a class="header-navigation__sub-nav-link" href="/properties/sale" >Featured Properties</a> 229 </li> 230 <li class="header-navigation__sub-nav-item"> 231 <a class="header-navigation__sub-nav-link" href="/properties/sold" >Past Transactions</a> 232 </li> 233 </ul> 234 </li> 235 <li class="header-navigation__item "> 236 237 <a class="header-navigation__link " href="/home-search/listings" style="--delay: 0.2s">Search Homes</a> 238 </li> 239 <li class="header-navigation__item "> 240 241 <a class="header-navigation__link " href="/home-valuation" style="--delay: 0.30000000000000004s">Home Valuation</a> 242 </li> 243 <li class="header-navigation__item header-navigation__item--sub-nav"> 244 245 <a class="header-navigation__link js-subnav-opener" style="--delay: 0.4s">Resources</a> 246 247 <ul class="header-navigation__sub-nav"> 248 <li class="header-navigation__sub-nav-item"> 249 <a class="header-navigation__sub-nav-link" href="/buyers-team" >TERESA'S BUYER'S GUIDE</a> 250 </li> 251 <li class="header-navigation__sub-nav-item"> 252 <a class="header-navigation__sub-nav-link" href="/sellers-team" >TERESA'S SELLER'S GUIDE</a> 253 </li> 254 <li class="header-navigation__sub-nav-item"> 255 <a class="header-navigation__sub-nav-link" href="/blog" >BLOG</a> 256 </li> 257 </ul> 258 </li> 259 <li class="header-navigation__item "> 260 261 <a class="header-navigation__link " href="/join-the-team" style="--delay: 0.5s">Join Our Team</a> 262 </li> 263 <li class="header-navigation__item "> 264 265 <a class="header-navigation__link " href="/preferred-vendors" style="--delay: 0.6000000000000001s">Preferred Vendors</a> 266 </li> 267 <li class="header-navigation__item "> 268 269 <a class="header-navigation__link " href="/property-management" style="--delay: 0.7000000000000001s">Property Management</a> 270 </li> 271 <li class="header-navigation__item "> 272 273 <a class="header-navigation__link " data-type="MODAL_262e0a3f-44c1-4b59-a1ba-97df516aff66" tabindex="0" style="--delay: 0.8s">Contact Us</a> 274 </li> 275 </ul> 276 277 278 <div class="header-buttons-wrapper"> 279 280 281 282 <button type="button" class="header-hamburger-btn lp-btn hamburger-component hamburger js-sidemenu-opener" 283 title="Toggle Sidemenu"></button> 284 </div> 285 </div> 286 287</header> 288 289 </nav> 290 <div id="global-sidemenu" class="sidemenu" data-el-id="033c3235-a8bd-45bf-a4a8-96977e33190d"> 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307<button class="sidemenu-close toggle close lp-btn lp-icon link-icon--plus"></button> 308 309 310<div class="sidemenu-wrapper " style="--navItemNumberColor: rgba(28, 184, 227, 1);"> 311 <div class="sidemenu-nav-holder "> 312 <ul class="sidemenu-navigation sidemenu-navigation--index"> 313 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 314 <a 315 href="/" 316 class="sidemenu-navigation__link">Home</a> 317 318 </li> 319 320 <li class="sidemenu-navigation__item js-idemenu-navigation-item sidemenu-navigation__item--sub-nav">
321 <span class="sidemenu-navigation__link sidemenu-navigation__link--sub-nav sidemenu-navigation__link--sub-nav-active js-sub-nav-opener lp-icon"> 322 About 323 </span> 324 325 <ul class="sidemenu-navigation-sub-nav lp-a"> 326 <li class="sidemenu-navigation-sub-nav__item"><a href="/team" class="sidemenu-navigation-sub-nav__link">Meet the Team</a></li> 327 <li class="sidemenu-navigation-sub-nav__item"><a href="/testimonials" class="sidemenu-navigation-sub-nav__link">Testimonials</a></li> 328 </ul> 329 </li> 330 331 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 332 <a 333 href="/home-search/listings" 334 class="sidemenu-navigation__link">Home Search</a> 335 336 </li> 337 338 </ul> 339 340 <ul class="sidemenu-navigation sidemenu-navigation--index"> 341 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 342 <a 343 href="/home-valuation" 344 class="sidemenu-navigation__link">Home Valuation</a> 345 346 </li> 347 348 <li class="sidemenu-navigation__item js-idemenu-navigation-item sidemenu-navigation__item--sub-nav"> 349 <span class="sidemenu-navigation__link sidemenu-navigation__link--sub-nav sidemenu-navigation__link--sub-nav-active js-sub-nav-opener lp-icon"> 350 Homes for Sale 351 </span> 352 353 <ul class="sidemenu-navigation-sub-nav lp-a"> 354 <li class="sidemenu-navigation-sub-nav__item"><a href="/savannah-homes-for-sale" class="sidemenu-navigation-sub-nav__link">Savannah, GA</a></li> 355 <li class="sidemenu-navigation-sub-nav__item"><a href="/guyton-homes-for-sale" class="sidemenu-navigation-sub-nav__link">Guyton, GA</a></li> 356 </ul> 357 </li> 358 359 <li class="sidemenu-navigation__item js-idemenu-navigation-item sidemenu-navigation__item--sub-nav"> 360 <span class="sidemenu-navigation__link sidemenu-navigation__link--sub-nav sidemenu-navigation__link--sub-nav-active js-sub-nav-opener lp-icon"> 361 Properties 362 </span> 363 364 <ul class="sidemenu-navigation-sub-nav lp-a"> 365 <li class="sidemenu-navigation-sub-nav__item"><a href="/properties/sale" class="sidemenu-navigation-sub-nav__link">Featured Properties</a></li> 366 <li class="sidemenu-navigation-sub-nav__item"><a href="/properties/sold" class="sidemenu-navigation-sub-nav__link">Past Transactions</a></li> 367 </ul> 368 </li> 369 370 </ul> 371 372 <ul class="sidemenu-navigation sidemenu-navigation--index"> 373 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 374 <a 375 href="/neighborhoods" 376 class="sidemenu-navigation__link">Neighborhoods</a> 377 378 </li> 379 380 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 381 <a 382 href="/join-the-team" 383 class="sidemenu-navigation__link">Join The Team</a> 384 385 </li> 386 387 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 388 <a 389 href="/preferred-vendors" 390 class="sidemenu-navigation__link">Preferred Vendors</a> 391 392 </li> 393 394 </ul> 395 396 <ul class="sidemenu-navigation sidemenu-navigation--index"> 397 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 398 <a 399 href="/property-management" 400 class="sidemenu-navigation__link">Property Management</a> 401 402 </li> 403 404 <li class="sidemenu-navigation__item js-idemenu-navigation-item sidemenu-navigation__item--sub-nav">
405 <span class="sidemenu-navigation__link sidemenu-navigation__link--sub-nav sidemenu-navigation__link--sub-nav-active js-sub-nav-opener lp-icon"> 406 Resources 407 </span> 408 409 <ul class="sidemenu-navigation-sub-nav lp-a"> 410 <li class="sidemenu-navigation-sub-nav__item"><a href="/buyers-team" class="sidemenu-navigation-sub-nav__link">Teresaâs Buyerâs Guide</a></li> 411 <li class="sidemenu-navigation-sub-nav__item"><a href="/sellers-team" class="sidemenu-navigation-sub-nav__link">Teresaâs Seller's Guide</a></li> 412 <li class="sidemenu-navigation-sub-nav__item"><a href="/blog" class="sidemenu-navigation-sub-nav__link">Blog</a></li> 413 </ul> 414 </li> 415 416 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 417 <a 418 href="/contact" 419 class="sidemenu-navigation__link">Contact Us</a> 420 421 </li> 422 423 </ul> 424 </div> 425 426 <div class="sidemenu-footer"> 427 <div class="sidemenu__info-group sidemenu__col"> 428 <div class="sidemenu__section-content"> 429 <div class="sidemenu__col-content"> 430 <p class="sidemenu__col-title">Contact</p><div class="sidemenu__col-description lp-a"> 431 <p class="sidemenu__col-agent-name">Teresa Cowart Team</p> 432 <a href="tel:9126671881" class="sidemenu__col-phone">(912) 667-1881</a> 433 <a href="/cdn-cgi/l/email-protection#95e1f0e7f0e6f4d5e1f0e7f0e6f4f6fae2f4e7e1e1f0f4f8bbf6faf8" class="sidemenu__col-email"><span class="__cf_email__" data-cfemail="b0c4d5c2d5c3d1f0c4d5c2d5c3d1d3dfc7d1c2c4c4d5d1dd9ed3dfdd">[email protected]</span></a> 434 </div> 435 </div> 436 <div class="sidemenu__col-content"> 437 <p class="sidemenu__col-title">Office</p> <div class="sidemenu__col-description lp-a sidemenu__col-description--pre-line"><p>7001 Chatham Center Dr Ste 2400 Savannah GA 31405</p> 438 <p><a href="tel:9127565888">(912) 525-0900</a></p></div> 439 440 </div> 441 </div> 442 443 </div> 444 445 <div class="sidemenu-socials-block"> 446 <p class="sidemenu__col-title">Follow Us</p> 447 <ul class="lp-socials social_icons-style-1"> 448 449 <li> 450 <a 451 href="https://www.facebook.com/TeresaCowartTeam/" 452 class="lp-socials__link" 453 data-wow-delay="0s" 454 target="_blank" 455 aria-label="FACEBOOK" 456 > 457 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 458 </a> 459 </li> 460 <li> 461 <a 462 href="https://www.instagram.com/teresacowartteam/" 463 class="lp-socials__link" 464 data-wow-delay="0.1s" 465 target="_blank" 466 aria-label="INSTAGRAM" 467 > 468 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 469 </a> 470 </li> 471 <li> 472 <a 473 href="https://www.yelp.com/biz/teresa-cowart-team-re-max-accent-savannah" 474 class="lp-socials__link" 475 data-wow-delay="0.2s" 476 target="_blank" 477 aria-label="YELP" 478 >
479 <span class="lp-i lp-i--yelp" aria-hidden="true"></span> 480 </a> 481 </li> 482 <li> 483 <a 484 href="https://www.tiktok.com/@teresacowartteam" 485 class="lp-socials__link" 486 data-wow-delay="0.3s" 487 target="_blank" 488 aria-label="TIKTOK" 489 > 490 <span class="lp-i lp-i--tiktok" aria-hidden="true"></span> 491 </a> 492 </li> 493 <li> 494 <a 495 href="https://www.youtube.com/@teresacowartteam/featured" 496 class="lp-socials__link" 497 data-wow-delay="0.4s" 498 target="_blank" 499 aria-label="YOUTUBE" 500 > 501 <span class="lp-i lp-i--youtube" aria-hidden="true"></span> 502 </a> 503 </li> 504 <li> 505 <a 506 href="https://www.google.com/search?q=teresa+cowart+real+estate+team&sca_esv=181e9cfcc41c4f59&source=hp&ei=U9O8Z8KgEd6hvr0Pl7KWkAM&iflsig=ACkRmUkAAAAAZ7zhY4f1pGCH-oOrDPLH5k4VlGqDyO6u&ved=0ahUKEwiClsb8j92LAxXekK8BHReZBTIQ4dUDCBg&uact=5&oq=teresa+cowart+real+estate+team&gs_lp=Egdnd3Mtd2l6Ih50ZXJlc2EgY293YXJ0IHJlYWwgZXN0YXRlIHRlYW0yBRAhGKABSPMzUABYsjJwBHgAkAEAmAFtoAGOE6oBBDI5LjG4AQPIAQD4AQGYAiKgAuETqAIKwgIFEAAYgATCAgsQLhiABBjRAxjHAcICBRAuGIAEwgIKEAAYAxjqAhiPAcICChAuGAMY6gIYjwHCAgsQLhiABBjHARivAcICCBAuGIAEGNQCwgIGEAAYFhgewgILEAAYgAQYhgMYigXCAgUQABjvBcICCBAAGIAEGKIEwgIGEAAYDRgewgIIEAAYCBgNGB7CAggQABiiBBiJBcICBxAhGKABGArCAgUQIRifBZgDA_EFhx9LkKruFPqSBwQzMy4xoAf49AE&sclient=gws-wiz#lrd=0x88fb0f17e1779229:0xa625619eb30be5b3,1,,,," 507 class="lp-socials__link" 508 data-wow-delay="0.5s" 509 target="_blank" 510 aria-label="GOOGLE" 511 > 512 <span class="lp-i lp-i--google" aria-hidden="true"></span> 513 </a> 514 </li> 515 </ul> </div> 516 </div> 517</div> 518 </div> 519 <div id="global-mobile-contact" class="mobile-contact-wrapper" data-el-id="befe5af2-a6ca-4119-924a-a85d96d36b51"> 520 <div class="btn-holder" 521style=" 522--backgroundColor: rgba(201, 238, 248, 1); 523--textColor: rgba(26, 26, 26, 1); 524--pillTextColor: rgba(255, 255, 255, 1); 525--pillBackgroundColor: rgba(28, 184, 227, 1);"> 526 527 <button type="button" class="connect-btn lp-ico lp-ico-arrow-top visible">Let's Connect</button> 528</div> 529 530 531<div class="pop-up" style="--backgroundColor: rgba(201, 238, 248, 1); --textColor: rgba(26, 26, 26, 1);"> 532 <div class="lp-container"> 533 <form data-type="contact-form" class="contact-form"> 534 <div class="contact-form__container"> 535 <h3 class="lp-h3">Leave a Message</h3> 536 537 <div class="contact-form__content"> 538 <div class="contact-form__inputs-container"> 539 <div class="contact-form__item"> 540 <input 541 id="__FullName" 542 type="text" name="name" 543 class="lp-input lp-input--light" 544 required 545 placeholder="Full Name"> 546 </div> 547 <div class="contact-form__item"> 548 <input 549 id="__Email" 550 type="email" name="email" 551 class="lp-input js-email-input lp-input--light" 552 required 553 placeholder="Email"> 554 </div> 555 <div class="contact-form__item"> 556 <input
557 class="lp-input lp-input--light" 558 type="tel" 559 placeholder="Phone" 560 id="__Phone" 561 name="phone" 562 required> 563 </div> 564 565 <div class="contact-form__item input-group-select"> 566 <select name="interest" id="-field-interest" placeholder="Interest" 567 class="lp-input dropdown-select js-select js-form-element lp-input--light" required> 568 <option value="" disabled selected data-label="Interest">Interested in...</option> 569 <option value="Selling & Buying">Selling & Buying</option> 570 <option value="Selling">Selling</option> 571 <option value="Buying">Buying</option> 572 <option value="Renting">Renting</option> 573 <option value="Other">Other</option> 574 </select> 575 <label for="-field-interest" class="lp-label sr-only">Interest</label> 576 </div> 577 578 <div class="contact-form__item"> 579 <textarea 580 name="message" 581 rows="4" 582 id="__Message" 583 class="lp-input lp-input--light" 584 placeholder="Message" 585 required></textarea> 586 </div> 587 <div class="lp-disclaimer"> <div class='lp-tcr-content' style='margin-bottom: 1em;'> 588 <span class='lp-tcr-message'> 589 By providing your contact information to Teresa Cowart Team, your personal 590 information will be processed in accordance with Teresa Cowart Team's 591 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. By 592 checking the box(es) below, you consent to receive communications 593 regarding your real estate inquiries and related marketing and promotional 594 updates in the manner selected by you. For SMS text messages, message 595 frequency varies. Message and data rates may apply. You may opt out of 596 receiving further communications from Teresa Cowart Team at any time. To opt 597 out of receiving SMS text messages, reply STOP to unsubscribe. 598 </span> 599 </div> 600 <label style='display: none;' for='-termsAccepted'>Opt 601 in/Disclaimer Consent:</label> 602 <label class='lp-tcr-content' style='margin-bottom: 1em;'> 603 <span class='lp-tcr-checkbox'> 604 <input 605 type='checkbox' 606 name='termsAccepted' 607 id='-termsAccepted' 608 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 609 oninput="this.setCustomValidity('')" 610 required 611 value='Yes, I agree to receive email or phone call communications from Teresa Cowart Team.' 612 /> 613 </span> 614 <span class='lp-tcr-message'> 615 Yes, I agree to receive email or phone call communications from 616 Teresa Cowart Team. 617 </span> 618 </label> 619 <label style='display: none;' for='-customConsent'>Opt 620 in/Disclaimer Consent:</label> 621 <label class='lp-tcr-content' style='margin-bottom: 1em;'> 622 <span class='lp-tcr-checkbox'> 623 <input 624 type='checkbox' 625 name='customConsent' 626 id='-customConsent' 627 value='Yes, I agree to receive SMS text messages from Teresa Cowart Team.' 628 /> 629 </span> 630 <span class='lp-tcr-message'> 631 Yes, I agree to receive SMS text messages from Teresa Cowart Team. 632 </span> 633 </label> 634 635</div> 636 <button type="submit" class="lp-btn lp-btn--filled lp-btn--dark submit button-style-1 contact-form__item">Submit</button> 637 638 <div class="lp-h-pot"> 639 <input id="__newsSignMiddleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 640 </div> 641 642 <input style="display: none;" type="text" name="source" value="CONTACT_INQUIRY" /> 643 <input type="hidden" name="button_text" value="Let's Connect"> 644 </div> 645 </div> 646 </div> 647 648 649 <div class="success-block"> 650 <h3 class="lp-h3 success-message">Thank you for your message. We will be in touch with you shortly.</h3> 651 652 <a 653 href="/home-search/listings" 654 655 class="lp-btn lp-btn--filled lp-btn--dark button-style-1" 656 657 658 659 660 661 > 662 Explore Our Properties 663 </a> 664 </div> 665 </form> 666 667 <button type="button" class="close-btn lp-ico lp-ico-close"></button> 668 669 670 </div> 671</div> 672 673 674 </div> 675 <section class="image-section is-font-color-light is-background-color-light" id="section-c3f2b87c-69b5-446c-a7d3-6ef3300b8597" data-el-id="d1637c2a-e69e-42d9-8d39-7fe5c68c7ee9"> 676 <div class="custom-intro js-scroll-section custom-intro__horizon-center custom-intro__vertical-bottom" 677 style=" 678 --titleColor: rgba(28, 184, 227, 1); 679 --boxBackColor: rgba(201, 238, 248, 1); 680 --backOverlayColor: rgba(255, 255, 255, 1); 681 " 682 > 683 <div class="custom-intro__overlay"></div> 684 <div class="custom-intro__container"> 685 <div class="custom-intro__content-wrapper"> 686 <div class="custom-intro__content-box"> 687 <h1 class="custom-intro__title ">Blog</h1> 688 <div class="custom-intro__scroll-btn jsScrollBtn"></div> 689 </div> 690 </div> 691 </div> 692</div> 693 694</section> 695<section id="section-7340826b-bdad-4f4c-95bc-421ee1719d85" class="solid-section is-font-color-dark is-background-color-light" data-el-id="b635a7c9-985a-4132-ab98-a79af1912f52">
vendor: 109 bytes, lines 695-696
695 696<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
696<script type="text/x-handlebars-template" class="blogItem pagination-script"> <a class="blog-posts-list-item lp_animation-img-zoom" href="/blog/{{slug}}"> 697 <div class="blog-posts-list-item__image-container"> 698 {{#if categories.[0].name}}<span class="blog-posts-list-item__tag lp-tag">{{categories.[0].name}}</span>{{/if}} 699 {{{mediaImage media.[0] sizes="(min-width: 992px) 33vw, (min-width: 769px) 50vw, 100vw" alt=name class="blog-posts-list-item__image"}}} 700 </div> 701 <div class="blog-posts-list-item__info"> 702 {{#if (or customAuthor createdBy.firstName createdBy.lastName publishedAt)}} 703 <p class="blog-posts-list-item__details"> 704 {{#if (or createdBy.firstName customAuthor)}}{{#if customAuthor}}{{customAuthor}}{{else}}{{createdBy.firstName}} {{createdBy.lastName}}{{/if}}{{/if}} 705 706 {{#if publishedAt}}{{#if (or customAuthor createdBy.firstName createdBy.lastName)}} I {{/if}}{{/if}} 707 708 {{#if publishedAt}}{{hbFormatDate publishedAt}}{{/if}} 709 </p> 710 {{/if}} 711 {{#if title}} 712 <h6 class="blog-posts-list-item__title">{{title}}</h6> 713 {{/if}} 714 <span class="blog-posts-list-item__more lp-link hyperlink-style-1">Read more</span> 715 </div> 716 </a> 717</script>
717 <div class="blog-posts-list lp-vertical-paddings" style="--titleColor: rgba(28, 184, 227, 1);"> 718 <div class="blog-posts-list__title-group lp-title-group"> 719 720 <h2 class="blog-posts-list__title " style="color: rgba(28, 184, 227, 1);">Market Updates</h2> 721 722 </div> 723 <div class="blog-posts-list__controls search-container" data-variables="{"limit":4,"order":"publishedAt","sortDir":"DESC"}"> 724 <ul class="blog-posts-list__search-container"> 725 <li class="blog-posts-list__category js-category active js-category-all"><span class="blog-posts-list__category-name">All</span></li> 726 </ul> 727 </div> 728 <div class="blog-posts-list__collection data-container blog-posts-list__collection--editorial"> 729 <a class="blog-posts-list-item lp_animation-img-zoom" href="/blog/top-entertainment-spots-near-savannah-ga"> 730 <div class="blog-posts-list-item__image-container"> 731 732 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/c50e0c4c-1b0f-4826-9bab-eed931a879e3" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/c50e0c4c-1b0f-4826-9bab-eed931a879e3 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/c50e0c4c-1b0f-4826-9bab-eed931a879e3 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/c50e0c4c-1b0f-4826-9bab-eed931a879e3 1920w" class="blog-posts-list-item__image" alt="" sizes="(min-width: 992px) 33vw, (min-width: 769px) 50vw, 100vw" loading="lazy"> 733 </div> 734 <div class="blog-posts-list-item__info"> 735 <p class="blog-posts-list-item__details"> 736 Teresa Cowart Team 737 738 I 739 740 October 8, 2026 741 </p> 742 <h6 class="blog-posts-list-item__title">Top Entertainment Spots Near Savannah, GA</h6> 743 <span class="blog-posts-list-item__more lp-link hyperlink-style-1">Read more</span> 744 </div> 745 </a> 746 <a class="blog-posts-list-item lp_animation-img-zoom" href="/blog/how-to-know-when-youve-found-the-right-home-in-savannah-ga"> 747 <div class="blog-posts-list-item__image-container"> 748 749 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/f0fde65c-f50d-427f-8232-93a7e3f15378" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/f0fde65c-f50d-427f-8232-93a7e3f15378 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/f0fde65c-f50d-427f-8232-93a7e3f15378 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/f0fde65c-f50d-427f-8232-93a7e3f15378 1920w" class="blog-posts-list-item__image" alt="" sizes="(min-width: 992px) 33vw, (min-width: 769px) 50vw, 100vw" loading="lazy"> 750 </div> 751 <div class="blog-posts-list-item__info"> 752 <p class="blog-posts-list-item__details"> 753 Teresa Cowart Team 754 755 I 756 757 October 8, 2026 758 </p> 759 <h6 class="blog-posts-list-item__title">How to Know When Youâve Found the Right Home in Savannah, GA</h6> 760 <span class="blog-posts-list-item__more lp-link hyperlink-style-1">Read more</span> 761 </div> 762 </a> 763 <a class="blog-posts-list-item lp_animation-img-zoom" href="/blog/unexpected-costs-of-buying-a-home-and-how-to-budget-for-them-in-savannah-ga"> 764 <div class="blog-posts-list-item__image-container"> 765 766 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ba25ac38-a2af-4e5f-aed1-72e12192e224" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/ba25ac38-a2af-4e5f-aed1-72e12
766192e224 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ba25ac38-a2af-4e5f-aed1-72e12192e224 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ba25ac38-a2af-4e5f-aed1-72e12192e224 1920w" class="blog-posts-list-item__image" alt="" sizes="(min-width: 992px) 33vw, (min-width: 769px) 50vw, 100vw" loading="lazy"> 767 </div> 768 <div class="blog-posts-list-item__info"> 769 <p class="blog-posts-list-item__details"> 770 Teresa Cowart Team 771 772 I 773 774 October 8, 2026 775 </p> 776 <h6 class="blog-posts-list-item__title">Unexpected Costs of Buying a Home (and How to Budget for Them) in Savannah, GA</h6> 777 <span class="blog-posts-list-item__more lp-link hyperlink-style-1">Read more</span> 778 </div> 779 </a> 780 <a class="blog-posts-list-item lp_animation-img-zoom" href="/blog/ways-to-enjoy-the-arts-in-savannah-ga"> 781 <div class="blog-posts-list-item__image-container"> 782 783 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/f291d0d0-3033-4a29-949b-309f26c6abd5" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/f291d0d0-3033-4a29-949b-309f26c6abd5 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/f291d0d0-3033-4a29-949b-309f26c6abd5 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/f291d0d0-3033-4a29-949b-309f26c6abd5 1920w" class="blog-posts-list-item__image" alt="" sizes="(min-width: 992px) 33vw, (min-width: 769px) 50vw, 100vw" loading="lazy"> 784 </div> 785 <div class="blog-posts-list-item__info"> 786 <p class="blog-posts-list-item__details"> 787 Teresa Cowart Team 788 789 I 790 791 October 8, 2026 792 </p> 793 <h6 class="blog-posts-list-item__title">Ways to Enjoy the Arts in Savannah, GA</h6> 794 <span class="blog-posts-list-item__more lp-link hyperlink-style-1">Read more</span> 795 </div> 796 </a> 797 </div> 798 <div class="blog-posts-list__pagination lp-pagination pagination-container pagination-style-1"></div> 799 </div> 800</section> 801<section class="image-section is-font-color-light is-background-color-light" id="section-f6ab0e0a-1d17-477f-be39-f70a71f91f94" data-el-id="1ed7f92a-2189-48c5-889c-3838656da504"> 802 <div class="newsletter-contact-cta lp-vertical-paddings" 803 style=" 804 --titleColorFirst: rgba(177, 132, 99, 1); 805 --newsletterBack: rgba(238, 237, 233, 0); 806 --titleColorSecond: rgba(255, 255, 255, 1); 807 --workWithBack: rgba(213, 224, 217, 0); 808 --newsletterTextColor: rgba(64, 64, 64, 1); 809 --rightBack: rgba(240, 238, 227, 0); 810 " 811> 812 <div class="newsletter-contact-cta__right-back"></div> 813 <div class="newsletter-contact-cta__container lp-container"> 814 <div class="newsletter-contact-cta__wrapper"> 815 <div class="newsletter-contact-cta__block newsletter-contact-cta__block--touch newsletter-contact-cta__block--no-newsletter"> 816 <div class="newsletter-contact-cta__heading"> 817 <div class="newsletter-contact-cta__pre-title newsletter-contact-cta__pre-title--touch lp-text--pretitle">Get in Touch</div> 818 <h2 class="newsletter-contact-cta__title newsletter-contact-cta__title--touch newsletter-contact-cta__title--with-pretitle">Work With Us</h2> 819 <div class="newsletter-contact-cta__description"><p><strong>Our goal is to be informative and helpful. Through our service we hope to earn your business with our exemplary level of service and extensive local knowledge of the Savannah Area area.</strong></p></div> 820 </div> 821 <div class="newsletter-contact-cta__btn-wrap"> 822 <a 823 role="button" 824 data-type="MODAL_262e0a3f-44c1-4b59-a1ba-97df516aff66" 825 class="newsletter-contact-cta__btn lp-btn button-style-2" 826 827 828 829 830 831 >
832 <span class="lp-btn__content">Contact Us</span> 833 </a> 834 </div> 835 <div class="newsletter-contact-cta__word-divide"><span class="newsletter-contact-cta__word-word">or</span></div> 836 <div class="newsletter-contact-cta__call-cell"> 837 <span class="newsletter-contact-cta__prefix-cell">Call us at</span> 838 <a 839 href="tel:9125250900" 840 class="newsletter-contact-cta__link lp-a lp-link hyperlink-style-2" 841 > 842 <span class="newsletter-contact-cta__phone-wrapper lp-icon link-icon--phone"></span> 843 (912) 525-0900 844 </a> 845 </div> 846 </div> 847 </div> 848 </div> 849</div> 850</section> 851<section id="section-d0bb8190-fa80-4a3a-b56c-b37146df7e09" class="solid-section is-font-color-dark is-background-color-light" data-el-id="85dc9e17-a4c7-449c-8890-869fdc11b485"> 852 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@splidejs/[email protected]/dist/css/splide-core.min.css"/>
853<script src="https://cdn.jsdelivr.net/npm/@splidejs/[email protected]/dist/js/splide.min.js"></script>
vendor: 1 bytes, line 853
853
854<script type="text/x-handlebars-template" class="jsIGTemplate"> 855 {{#each items}} 856 <a href="{{permalink}}" target="_blank" class="instagram-feed__item lp_animation-img-zoom splide__slide insta-item insta-type-{{mediaType}}"> 857 <img class="instagram-feed__image" src="{{#ifEquals mediaType 'VIDEO'}}{{thumbnailUrl}}{{else}}{{mediaUrl}}{{/ifEquals}}" alt="Instagram post by @{{username}}"> 858 </a> 859 {{/each}} 860</script>
860 861 862<div class="instagram-feed lp-vertical-paddings"> 863 <div class="instagram-feed__container" style="--titleColor: rgba(26, 26, 26, 1); --boxColor: rgba(255, 255, 255, 1);"> 864 <div class="instagram-feed__title-group lp-title-group"> 865 <div class="instagram-feed__icon lp-icon"></div> 866 <p class="instagram-feed__pretitle">Follow Us On Instagram</p> 867 <h2 class="instagram-feed__title instagram-feed__title--with-pretitle"><a href="#" target="_blank" class="instagram-feed__link jsIGLink jsIGName"></a></h2> 868 </div> 869 870 <div class="instagram-feed__collection splide js-slider"> 871 <div class="splide__track"> 872 <ul class="splide__list jsIGContainer"> 873 </ul> 874 </div> 875 </div> 876 </div> 877</div> 878 879 880 881 882</section> 883 884 <div id="modals" class="modals"></div> 885 <footer id="global-footer" class="is-font-color-dark is-background-color-light" data-el-id="b8c9ffd0-3b1f-4577-96fc-828efdac86e7"> 886 887 888<div class="footer"> 889 <div class="footer-logos-row"> 890 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=320/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/74d2a17c-0cc5-49c1-b88e-fabe345fd6bd 497w" class="footer-logo" sizes="350px" alt=""> 891 892 </div> 893 <div class="footer-contact-row"> 894 <div class="footer-info "> 895 <div class="footer__col"> 896 <h5 class="footer__section-title">Teresa Cowart Team</h5> 897 <div class="footer__section-content"> 898 <div class="footer__col-content"> 899 <p class="footer__col-title">Contact</p> <div class="footer__col-description lp-a lp-pre-line"><div><a href="tel:9125250900">(912) 667-1881</a><br><a href="/cdn-cgi/l/email-protection#f4809186918795b4809186918795979b8395868080919599da979b99"><span class="__cf_email__" data-cfemail="abdfced9ced8caebdfced9ced8cac8c4dccad9dfdfcecac685c8c4c6">[email protected]</span></a></div></div> 900 </div> 901 902 <div class="footer__col-content"> 903 <p class="footer__col-title">Office</p> <div class="footer__col-description lp-a lp-pre-line"><p style="margin-bottom: 0;">7001 Chatham Center Dr Ste 2400<br>Savannah GA 31405</p> 904 <p><a href="tel:9127565888">(912) 525-0900</a></p></div> 905 </div> 906 </div> 907 </div> 908 909 910 911 </div> 912 913 <ul class="lp-socials social_icons-style-1 footer-socials"> 914 915 <li> 916 <a 917 href="https://www.facebook.com/TeresaCowartTeam/" 918 class="lp-socials__link socials__link" 919 data-wow-delay="0s" 920 target="_blank" 921 aria-label="FACEBOOK" 922 > 923 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 924 </a> 925 </li> 926 <li> 927 <a 928 href="https://www.instagram.com/teresacowartteam/" 929 class="lp-socials__link socials__link" 930 data-wow-delay="0.1s" 931 target="_blank" 932 aria-label="INSTAGRAM" 933 > 934 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 935 </a> 936 </li> 937 <li> 938 <a 939 href="https://www.yelp.com/biz/teresa-cowart-team-re-max-accent-savannah" 940 class="lp-socials__link socials__link" 941 data-wow-delay="0.2s" 942 target="_blank" 943 aria-label="YELP" 944 >
945 <span class="lp-i lp-i--yelp" aria-hidden="true"></span> 946 </a> 947 </li> 948 <li> 949 <a 950 href="https://www.tiktok.com/@teresacowartteam" 951 class="lp-socials__link socials__link" 952 data-wow-delay="0.3s" 953 target="_blank" 954 aria-label="TIKTOK" 955 > 956 <span class="lp-i lp-i--tiktok" aria-hidden="true"></span> 957 </a> 958 </li> 959 <li> 960 <a 961 href="https://www.youtube.com/@teresacowartteam/featured" 962 class="lp-socials__link socials__link" 963 data-wow-delay="0.4s" 964 target="_blank" 965 aria-label="YOUTUBE" 966 > 967 <span class="lp-i lp-i--youtube" aria-hidden="true"></span> 968 </a> 969 </li> 970 <li> 971 <a 972 href="https://www.google.com/search?q=teresa+cowart+real+estate+team&sca_esv=181e9cfcc41c4f59&source=hp&ei=U9O8Z8KgEd6hvr0Pl7KWkAM&iflsig=ACkRmUkAAAAAZ7zhY4f1pGCH-oOrDPLH5k4VlGqDyO6u&ved=0ahUKEwiClsb8j92LAxXekK8BHReZBTIQ4dUDCBg&uact=5&oq=teresa+cowart+real+estate+team&gs_lp=Egdnd3Mtd2l6Ih50ZXJlc2EgY293YXJ0IHJlYWwgZXN0YXRlIHRlYW0yBRAhGKABSPMzUABYsjJwBHgAkAEAmAFtoAGOE6oBBDI5LjG4AQPIAQD4AQGYAiKgAuETqAIKwgIFEAAYgATCAgsQLhiABBjRAxjHAcICBRAuGIAEwgIKEAAYAxjqAhiPAcICChAuGAMY6gIYjwHCAgsQLhiABBjHARivAcICCBAuGIAEGNQCwgIGEAAYFhgewgILEAAYgAQYhgMYigXCAgUQABjvBcICCBAAGIAEGKIEwgIGEAAYDRgewgIIEAAYCBgNGB7CAggQABiiBBiJBcICBxAhGKABGArCAgUQIRifBZgDA_EFhx9LkKruFPqSBwQzMy4xoAf49AE&sclient=gws-wiz#lrd=0x88fb0f17e1779229:0xa625619eb30be5b3,1,,,," 973 class="lp-socials__link socials__link" 974 data-wow-delay="0.5s" 975 target="_blank" 976 aria-label="GOOGLE" 977 > 978 <span class="lp-i lp-i--google" aria-hidden="true"></span> 979 </a> 980 </li> 981 </ul> </div> 982 983 984 <div class="footer-navigation-row"> 985 <p class="footer-navigation-title">navigation</p> 986 987 <ul class="footer-navigation lp-a"> 988 <li class="footer-navigation__item"> 989 <a href="/properties/sale" class="footer-navigation__link ">Featured Properties</a> 990 991 </li> 992 <li class="footer-navigation__item"> 993 <a href="/neighborhoods" class="footer-navigation__link ">Neighborhoods</a> 994 995 </li> 996 <li class="footer-navigation__item"> 997 <a href="/home-valuation" class="footer-navigation__link ">Home Valuation</a> 998 999 </li> 1000 <li class="footer-navigation__item"> 1001 <a href="/home-search/listings" class="footer-navigation__link ">Search Homes</a> 1002 1003 </li> 1004 <li class="footer-navigation__item"> 1005 <a href="/contact" class="footer-navigation__link ">Contact Us</a> 1006 1007 </li> 1008 </ul> 1009 </div> 1010 1011 1012 1013 <div class="footer-disclaimer-row"> 1014 <div class="footer-disclaimer"><div class="luxury-text"> 1015<p style="font-size: 12px;">All information is deemed reliable but not guaranteed and should be independently reviewed and verified.<br><img style="margin-top: 20px; width: 100px; height: auto;" src="https://res.cloudinary.com/luxuryp/images/zbxf1j3xdplm6lhfnqo3/realtor-eho-logo-07232021-update-dark"></p> 1016</div></div> 1017 1018 1019 </div> 1020 1021 1022 <div class="footer-bottom-row"> 1023 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/jnymuan6tigs629jigsz" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=320/https://media-production.lp-cdn.com/media/jnymuan6tigs629jigsz 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/jnymuan6tigs629jigsz 390w" class="footer-logo" sizes="350px" alt=""> 1024 1025 <div class="footer-copyright lp-a"> 1026 <div class="footer-copyright__powered"> 1027 Powered by <a href="https://www.luxurypresence.com/" class="" target="_blank">Luxury Presence</a> 1028 </div> 1029 1030 <div class="footer-copyright__privacy">
1031 <span>Copyright © <span class="auto-year-update">2026</span></span> 1032 1033 1034 <a href="/terms-and-conditions" class="footer-copyright__privacy-policy">Privacy Policy</a> 1035 </div> 1036 </div> 1037 </div> 1038 1039</div> 1040 1041 </footer> 1042 1043 <div id="modal-global-contact-us" class="modal " 1044 data-el-id="" 1045 style="background-color: ;" 1046 > 1047 <div class="modal-content"> 1048 1049 1050 <div class="contact-form-modal lp-vertical-paddings" style="--leftPanelBgColor: rgba(201, 238, 248, 1); --textColor:rgba(26, 26, 26, 1); --formBgColor: rgba(255, 255, 255, 1); --formTextColor: rgba(26, 26, 26, 1)"> 1051 <div class="contact-form-modal__bg"> 1052 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/e9ec1f6a-8311-4823-8b6d-337ef8c5d3a7" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=320/https://media-production.lp-cdn.com/media/e9ec1f6a-8311-4823-8b6d-337ef8c5d3a7 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/e9ec1f6a-8311-4823-8b6d-337ef8c5d3a7 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/e9ec1f6a-8311-4823-8b6d-337ef8c5d3a7 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/e9ec1f6a-8311-4823-8b6d-337ef8c5d3a7 1920w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=2560/https://media-production.lp-cdn.com/media/e9ec1f6a-8311-4823-8b6d-337ef8c5d3a7 2560w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/e9ec1f6a-8311-4823-8b6d-337ef8c5d3a7 3303w" sizes="(min-width: 1981px) 12.2222vw, (min-width: 1025px) 424px, 100vw" class="contact-form-modal__bg-image" alt=""> 1053 </div> 1054 <div class="contact-form-modal__close-container"> 1055 <button class="contact-form-modal__close toggle close lp-btn lp-icon link-icon--plus"></button> 1056 </div> 1057 <div class="contact-form-modal__container"> 1058 <div class="contact-form-modal-details only-desktop"> 1059 <h2 class="contact-form-modal-details__title only-desktop js-contact-title">Get in Touch</h2> 1060 <div class="contact-form-modal-agent"> 1061 <div class="contact-form-modal-agent__contact"> 1062 <p class="contact-form-modal-agent__name">Teresa Cowart Team</p> 1063 <p class="contact-form-modal-agent__phone lp-a"> 1064 <a class="contact-form-modal-agent__link" href="tel:9126671881">(912) 667-1881</a> 1065 </p> 1066 <p class="contact-form-modal-agent__email lp-a"> 1067 <a class="contact-form-modal-agent__link" href="/cdn-cgi/l/email-protection#3347564156405273475641564052505c445241474756525e1d505c5e"><span class="__cf_email__" data-cfemail="5f2b3a2d3a2c3e1f2b3a2d3a2c3e3c30283e2d2b2b3a3e32713c3032">[email protected]</span></a> 1068 </p> 1069 </div> 1070 <div class="contact-form-modal-agent__contact"> 1071 <p class="contact-form-modal-agent__addres lp-pre-line"> </p> 1072 </div> 1073 </div> 1074 1075 <div class="contact-form-modal-details__open"><div class="contact-form-modal-agent__contact"> 1076 <p class="contact-form-modal-agent__addres lp-pre-line" style="margin-bottom: 0px !important;">7001 Chatham Center Drive Suite 2400 Savannah, GA 31405</p> 1077 </div> 1078 <p class="contact-form-modal-agent__phone lp-a"><a class="contact-form-modal-agent__link" href="tel:9127565888">(912) 525-0900</a></p></div> 1079 1080 1081 <div class="contact-form-modal-details__socials"> 1082 <ul class="lp-socials social_icons-style-1 contact-form-modal-details__socials-l
1082ist lp-socials"> 1083 1084 <li> 1085 <a 1086 href="https://www.facebook.com/TeresaCowartTeam/" 1087 class="lp-socials__link contact-form-modal-details__socials-link" 1088 data-wow-delay="0s" 1089 target="_blank" 1090 aria-label="FACEBOOK" 1091 > 1092 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 1093 </a> 1094 </li> 1095 <li> 1096 <a 1097 href="https://www.instagram.com/teresacowartteam/" 1098 class="lp-socials__link contact-form-modal-details__socials-link" 1099 data-wow-delay="0.1s" 1100 target="_blank" 1101 aria-label="INSTAGRAM" 1102 > 1103 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 1104 </a> 1105 </li> 1106 <li> 1107 <a 1108 href="https://www.yelp.com/biz/teresa-cowart-team-re-max-accent-savannah" 1109 class="lp-socials__link contact-form-modal-details__socials-link" 1110 data-wow-delay="0.2s" 1111 target="_blank" 1112 aria-label="YELP" 1113 > 1114 <span class="lp-i lp-i--yelp" aria-hidden="true"></span> 1115 </a> 1116 </li> 1117 <li> 1118 <a 1119 href="https://www.tiktok.com/@teresacowartteam" 1120 class="lp-socials__link contact-form-modal-details__socials-link" 1121 data-wow-delay="0.3s" 1122 target="_blank" 1123 aria-label="TIKTOK" 1124 > 1125 <span class="lp-i lp-i--tiktok" aria-hidden="true"></span> 1126 </a> 1127 </li> 1128 <li> 1129 <a 1130 href="https://www.youtube.com/@teresacowartteam/featured" 1131 class="lp-socials__link contact-form-modal-details__socials-link" 1132 data-wow-delay="0.4s" 1133 target="_blank" 1134 aria-label="YOUTUBE" 1135 > 1136 <span class="lp-i lp-i--youtube" aria-hidden="true"></span> 1137 </a> 1138 </li> 1139 <li> 1140 <a 1141 href="https://www.google.com/search?q=teresa+cowart+real+estate+team&sca_esv=181e9cfcc41c4f59&source=hp&ei=U9O8Z8KgEd6hvr0Pl7KWkAM&iflsig=ACkRmUkAAAAAZ7zhY4f1pGCH-oOrDPLH5k4VlGqDyO6u&ved=0ahUKEwiClsb8j92LAxXekK8BHReZBTIQ4dUDCBg&uact=5&oq=teresa+cowart+real+estate+team&gs_lp=Egdnd3Mtd2l6Ih50ZXJlc2EgY293YXJ0IHJlYWwgZXN0YXRlIHRlYW0yBRAhGKABSPMzUABYsjJwBHgAkAEAmAFtoAGOE6oBBDI5LjG4AQPIAQD4AQGYAiKgAuETqAIKwgIFEAAYgATCAgsQLhiABBjRAxjHAcICBRAuGIAEwgIKEAAYAxjqAhiPAcICChAuGAMY6gIYjwHCAgsQLhiABBjHARivAcICCBAuGIAEGNQCwgIGEAAYFhgewgILEAAYgAQYhgMYigXCAgUQABjvBcICCBAAGIAEGKIEwgIGEAAYDRgewgIIEAAYCBgNGB7CAggQABiiBBiJBcICBxAhGKABGArCAgUQIRifBZgDA_EFhx9LkKruFPqSBwQzMy4xoAf49AE&sclient=gws-wiz#lrd=0x88fb0f17e1779229:0xa625619eb30be5b3,1,,,," 1142 class="lp-socials__link contact-form-modal-details__socials-l
1142ink" 1143 data-wow-delay="0.5s" 1144 target="_blank" 1145 aria-label="GOOGLE" 1146 > 1147 <span class="lp-i lp-i--google" aria-hidden="true"></span> 1148 </a> 1149 </li> 1150 </ul> </div> 1151 </div> 1152 <div class="contact-form-modal-form"> 1153 <h2 class="contact-form-modal-form__title only-mobile js-contact-title">Get in Touch</h2> 1154 <form action="" class="contact-form-modal-form__form js-form" data-type="contact-form"> 1155 <div class="lp-h-pot"> 1156 <label for="-if-middleName">Middle Name</label> 1157 <input id="-if-middleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 1158 </div> 1159 <div class="contact-form-modal-form__group"> 1160 <div class="contact-form-modal-form__group-container lp-input-group"> 1161 <input required id="-name" name="name" type="text" class="lp-input js-input-name" placeholder="Enter your full name"> 1162 <label for="-name" class="lp-label contact-form-modal-form__label">Name</label> 1163 </div> 1164 <div class="contact-form-modal-form__group-container lp-input-group"> 1165 <input required id="-phone" name="phone" type="tel" class="lp-input" placeholder="Your phone"> 1166 <label for="-phone" class="lp-label contact-form-modal-form__label">Phone</label> 1167 </div> 1168 </div> 1169 <div class="contact-form-modal-form__group lp-input-group"> 1170 <div class="contact-form-modal-form__input-container"> 1171 <input required id="-email" name="email" type="email" class="lp-input js-email-input" placeholder="@"> 1172 <div class="contact-form-modal-form__error error">Enter a valid email</div> 1173 </div> 1174 1175 <label for="-email" class="contact-form-modal-form__label lp-label">Email</label> 1176 </div> 1177 <div class="contact-form-modal-form__group lp-input-group"> 1178 <textarea id="-message" name="message" class="contact-form-modal-form__textarea lp-input" placeholder="Type your message"></textarea> 1179 <label for="-message" class="contact-form-modal-form__label lp-label">Your Message</label> 1180 </div> 1181 1182 <div class="contact-form-modal-form__disclaimer lp-disclaimer"> <div class='lp-tcr-content' style='margin-bottom: 1em;'> 1183 <span class='lp-tcr-message'> 1184 By providing your contact information to Teresa Cowart Team, your personal 1185 information will be processed in accordance with Teresa Cowart Team's 1186 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. By 1187 checking the box(es) below, you consent to receive communications 1188 regarding your real estate inquiries and related marketing and promotional 1189 updates in the manner selected by you. For SMS text messages, message 1190 frequency varies. Message and data rates may apply. You may opt out of 1191 receiving further communications from Teresa Cowart Team at any time. To opt 1192 out of receiving SMS text messages, reply STOP to unsubscribe. 1193 </span> 1194 </div> 1195 <label style='display: none;' for='-termsAccepted'>Opt 1196 in/Disclaimer Consent:</label> 1197 <label class='lp-tcr-content' style='margin-bottom: 1em;'>
1198 <span class='lp-tcr-checkbox'> 1199 <input 1200 type='checkbox' 1201 name='termsAccepted' 1202 id='-termsAccepted' 1203 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 1204 oninput="this.setCustomValidity('')" 1205 required 1206 value='Yes, I agree to receive email or phone call communications from Teresa Cowart Team.' 1207 /> 1208 </span> 1209 <span class='lp-tcr-message'> 1210 Yes, I agree to receive email or phone call communications from 1211 Teresa Cowart Team. 1212 </span> 1213 </label> 1214 <label style='display: none;' for='-customConsent'>Opt 1215 in/Disclaimer Consent:</label> 1216 <label class='lp-tcr-content' style='margin-bottom: 1em;'> 1217 <span class='lp-tcr-checkbox'> 1218 <input 1219 type='checkbox' 1220 name='customConsent' 1221 id='-customConsent' 1222 value='Yes, I agree to receive SMS text messages from Teresa Cowart Team.' 1223 /> 1224 </span> 1225 <span class='lp-tcr-message'> 1226 Yes, I agree to receive SMS text messages from Teresa Cowart Team. 1227 </span> 1228 </label> 1229 1230 </div> 1231 1232 <button type="submit" class="contact-form-modal-submit lp-btn lp-icon button-style-1"> 1233 <div class="contact-form-modal-submit__default"> 1234 <span class="contact-form-modal-submit__content lp-btn__content">Send Message</span> 1235 </div> 1236 <div class="contact-form-modal-submit__loading"> 1237 <span class="contact-form-modal-submit__content lp-btn__content">Sending</span> 1238 </div> 1239 <div class="contact-form-modal-submit__success"> 1240 <span class="contact-form-modal-submit__content lp-btn__content">Message Sent!</span> 1241 </div> 1242 </button> 1243 </form> 1244 </div> 1245 1246 <div class="contact-form-modal-details only-mobile"> 1247 <h2 class="contact-form-modal-details__title only-desktop js-contact-title">Get in Touch</h2> 1248 <div class="contact-form-modal-agent"> 1249 <div class="contact-form-modal-agent__contact"> 1250 <p class="contact-form-modal-agent__name">Teresa Cowart Team</p> 1251 <p class="contact-form-modal-agent__phone lp-a"> 1252 <a class="contact-form-modal-agent__link" href="tel:9126671881">(912) 667-1881</a> 1253 </p> 1254 <p class="contact-form-modal-agent__email lp-a"> 1255 <a class="contact-form-modal-agent__link" href="/cdn-cgi/l/email-protection#3e4a5b4c5b4d5f7e4a5b4c5b4d5f5d51495f4c4a4a5b5f53105d5153"><span class="__cf_email__" data-cfemail="0470617661776544706176617765676b73657670706165692a676b69">[email protected]</span></a> 1256 </p> 1257 </div> 1258 <div class="contact-form-modal-agent__contact"> 1259 <p class="contact-form-modal-agent__addres lp-pre-line"> </p> 1260 </div> 1261 </div> 1262 1263 <div class="contact-form-modal-details__open"><div class="contact-form-modal-agent__contact"> 1264 <p class="contact-form-modal-agent__addres lp-pre-line" style="margin-bottom: 0px !important;">7001 Chatham Center Drive Suite 2400 Savannah, GA 31405</p> 1265 </div> 1266 <p class="contact-form-modal-agent__phone lp-a"><a class="contact-form-modal-agent__link" href="tel:9127565888">(912) 525-0900</a></p></div> 1267 1268 1269 <div class="contact-form-modal-details__socials"> 1270 <ul class="lp-socials social_icons-style-1 contact-form-modal-details__socials-l
1270ist lp-socials"> 1271 1272 <li> 1273 <a 1274 href="https://www.facebook.com/TeresaCowartTeam/" 1275 class="lp-socials__link contact-form-modal-details__socials-link" 1276 data-wow-delay="0s" 1277 target="_blank" 1278 aria-label="FACEBOOK" 1279 > 1280 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 1281 </a> 1282 </li> 1283 <li> 1284 <a 1285 href="https://www.instagram.com/teresacowartteam/" 1286 class="lp-socials__link contact-form-modal-details__socials-link" 1287 data-wow-delay="0.1s" 1288 target="_blank" 1289 aria-label="INSTAGRAM" 1290 > 1291 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 1292 </a> 1293 </li> 1294 <li> 1295 <a 1296 href="https://www.yelp.com/biz/teresa-cowart-team-re-max-accent-savannah" 1297 class="lp-socials__link contact-form-modal-details__socials-link" 1298 data-wow-delay="0.2s" 1299 target="_blank" 1300 aria-label="YELP" 1301 > 1302 <span class="lp-i lp-i--yelp" aria-hidden="true"></span> 1303 </a> 1304 </li> 1305 <li> 1306 <a 1307 href="https://www.tiktok.com/@teresacowartteam" 1308 class="lp-socials__link contact-form-modal-details__socials-link" 1309 data-wow-delay="0.3s" 1310 target="_blank" 1311 aria-label="TIKTOK" 1312 > 1313 <span class="lp-i lp-i--tiktok" aria-hidden="true"></span> 1314 </a> 1315 </li> 1316 <li> 1317 <a 1318 href="https://www.youtube.com/@teresacowartteam/featured" 1319 class="lp-socials__link contact-form-modal-details__socials-link" 1320 data-wow-delay="0.4s" 1321 target="_blank" 1322 aria-label="YOUTUBE" 1323 > 1324 <span class="lp-i lp-i--youtube" aria-hidden="true"></span> 1325 </a> 1326 </li> 1327 <li> 1328 <a 1329 href="https://www.google.com/search?q=teresa+cowart+real+estate+team&sca_esv=181e9cfcc41c4f59&source=hp&ei=U9O8Z8KgEd6hvr0Pl7KWkAM&iflsig=ACkRmUkAAAAAZ7zhY4f1pGCH-oOrDPLH5k4VlGqDyO6u&ved=0ahUKEwiClsb8j92LAxXekK8BHReZBTIQ4dUDCBg&uact=5&oq=teresa+cowart+real+estate+team&gs_lp=Egdnd3Mtd2l6Ih50ZXJlc2EgY293YXJ0IHJlYWwgZXN0YXRlIHRlYW0yBRAhGKABSPMzUABYsjJwBHgAkAEAmAFtoAGOE6oBBDI5LjG4AQPIAQD4AQGYAiKgAuETqAIKwgIFEAAYgATCAgsQLhiABBjRAxjHAcICBRAuGIAEwgIKEAAYAxjqAhiPAcICChAuGAMY6gIYjwHCAgsQLhiABBjHARivAcICCBAuGIAEGNQCwgIGEAAYFhgewgILEAAYgAQYhgMYigXCAgUQABjvBcICCBAAGIAEGKIEwgIGEAAYDRgewgIIEAAYCBgNGB7CAggQABiiBBiJBcICBxAhGKABGArCAgUQIRifBZgDA_EFhx9LkKruFPqSBwQzMy4xoAf49AE&sclient=gws-wiz#lrd=0x88fb0f17e1779229:0xa625619eb30be5b3,1,,,," 1330 class="lp-socials__link contact-form-modal-details__socials-l
1330ink" 1331 data-wow-delay="0.5s" 1332 target="_blank" 1333 aria-label="GOOGLE" 1334 > 1335 <span class="lp-i lp-i--google" aria-hidden="true"></span> 1336 </a> 1337 </li> 1338 </ul> </div> 1339 </div> 1340 </div> 1341 </div> 1342 1343 </div> 1344 <button class="close lp-close" type="button" aria-label="close modal"> 1345 <span class="lp-close-icon" aria-hidden="true"></span> 1346 </button> 1347 </div> 1348 <div id="qualifying-questions-modal" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="qualifying-questions-modal-title" aria-hidden="true" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7); z-index: 1050; display: none; align-items: center; justify-content: center;"> 1349 <style> 1350 #qualifying-questions-modal .custom-select-toggle { 1351 border: 1px solid #848484; 1352 border-radius: 8px; 1353 padding: 12px 16px; 1354 } 1355 1356 #qualifying-questions-modal .custom-select-toggle.is-placeholder { 1357 color: #848484; 1358 } 1359 1360 #qualifying-questions-modal #qualifying-questions-modal-phoneNumber::placeholder { 1361 color: #848484; 1362 opacity: 1; 1363 } 1364 1365 #qualifying-questions-modal .disclaimer-more { 1366 display: none; 1367 } 1368 1369 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-more { 1370 display: inline; 1371 } 1372 1373 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-ellipsis { 1374 display: none; 1375 } 1376 </style>
vendor: 119 bytes, lines 1376-1377
1376 1377 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1377<script> 1378 function toggleDisclaimerQualifyingQuestionsModal() { 1379 const disclaimerText = document.getElementById('qualifying-questions-modal-disclaimer-text'); 1380 const toggleButton = document.getElementById('qualifying-questions-modal-toggle-disclaimer'); 1381 1382 if (disclaimerText.classList.contains('collapsed')) { 1383 disclaimerText.classList.remove('collapsed'); 1384 toggleButton.textContent = 'Read less'; 1385 toggleButton.setAttribute('aria-expanded', 'true'); 1386 } else { 1387 disclaimerText.classList.add('collapsed'); 1388 toggleButton.textContent = 'Read more'; 1389 toggleButton.setAttribute('aria-expanded', 'false'); 1390 } 1391 } 1392 </script>
1392 1393 <div style="max-width: 400px; width: 95%; margin: 0 auto;"> 1394 <div style="background: #fff; border: none; border-radius: 16px; color: black; box-shadow: none; position: relative;"> 1395 <button type="button" data-dismiss="modal" aria-label="Close" style="position: absolute; right: 20px; top: 10px; font-size: 28px; font-weight: 300; color: black; opacity: 1; background: none; border: none; padding: 0; width: auto; height: auto; cursor: pointer; z-index: 10;"> 1396 <span aria-hidden="true">×</span> 1397 </button> 1398 <div style="padding: 40px 30px 32px;"> 1399 <div style="text-align: left; margin-bottom: 32px;"> 1400 <h2 id="qualifying-questions-modal-title" style="margin: 0; color: #333; font-size: 18px; line-height: 1.4; text-transform: uppercase; letter-spacing: 0.5px; font-weight: normal;"> 1401 Thanks, please provide more information to help serve you 1402 </h2> 1403 </div> 1404 <form id="qualifying-questions-modal-form" data-type="contact-form"> 1405 <input type="hidden" name="source" value="PROFILE_UPDATE" /> 1406 <input type="hidden" name="email" value="" id="qualifying-questions-modal-email" /> 1407 <input type="hidden" name="triggerSource" id="qualifying-questions-modal-triggerSource" value="" /> 1408 <label for="qualifying-questions-modal-email" style="display:none;"> 1409 Email 1410 </label> 1411 <label for="qualifying-questions-modal-triggerSource" style="display:none;"> 1412 Trigger Source 1413 </label> 1414 1415 <div style="margin-bottom: 20px;"> 1416 <label for="qualifying-questions-modal-phoneNumber" style="display:none;"> 1417 Phone Number 1418 </label> 1419 <input 1420 type="tel" 1421 id="qualifying-questions-modal-phoneNumber" 1422 name="phoneNumber" 1423 style="padding: 12px 16px; font-size: 16px; border: 1px solid #848484; border-radius: 8px; background: transparent; color: black; width: 100%; box-sizing: border-box; outline: none;" 1424 pattern="^\+?1?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$" 1425 required 1426 placeholder="Phone" 1427 aria-label="Phone Number" 1428 inputmode="tel" 1429 autocomplete="tel" 1430 onfocus="this.style.borderColor='black';" 1431 onblur="this.style.borderColor='#848484';" 1432 /> 1433 </div> 1434 1435 <div style="margin-bottom: 20px;"> 1436 <label for="qualifying-questions-modal-interest" style="display:none;"> 1437 Interest 1438 </label> 1439 <select 1440 id="qualifying-questions-modal-interest" 1441 name="interest" 1442 required 1443 data-label="Interest" 1444 aria-label="Interest" 1445 style="padding: 12px 16px; font-size: 16px; border: 1px solid #848484; border-radius: 8px; background: #fff; color: #848484; width: 100%; box-sizing: border-box; outline: none; appearance: none; -webkit-appearance: none; -moz-appearance: none; background-image: url('data:image/svg+xml;charset=utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3E%3Cpath fill=%22%23666%22 d=%22M4.427 7.427l3.396 3.396a.25.25 0 00.354 0l3.396-3.396A.25.25 0 0011.396 7H4.604a.25.25 0 00-.177.427z%22/%3E%3C/svg%3E'); background-repeat: no-repeat; background-position: right 16px center; background-size: 16px;" 1446 onfocus="this.style.borderColor='black'; this.style.color='black';" 1447 onblur="this.style.borderColor='#848484'; if(this.value === '') this.style.color='#848484'; else this.style.color='black';" 1448 > 1449 <option value="" style="background: #fff; color: #848484;" disabled selected>Interested in...</option> 1450 <option value="Selling & Buying" style="background: #fff; color: black;">Selling & Buying</option> 1451 <option value="Selling" style="background: #fff; color: black;">Selling</option> 1452 <option value="Buying" style="background: #fff; color: black;">Buying</option> 1453 <option value="Renting" style="background: #fff; color: black;">Renting</option> 1454 <option value="Other" style="background: #fff; color: black;">Other</option> 1455 </select> 1456 </div> 1457 1458 <div style="margin-bottom: 32px; font-size: 12px; line-height: 1.2;"> 1459 <label style='display: none;' for='qualifying-questions-modal-qualifying-questions-termsAccepted'>Opt In/Disclaimer Consent:</label> 1460 <label class='lp-tcr-content'>
1461 <span class='lp-tcr-checkbox'> 1462 <input 1463 type='checkbox' 1464 id='qualifying-questions-modal-qualifying-questions-termsAccepted' 1465 name='termsAccepted' 1466 aria-describedby='qualifying-questions-modal-disclaimer-text' 1467 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 1468 oninput="this.setCustomValidity('')" 1469 required 1470 /></span> 1471 <span class='lp-tcr-message'> 1472 <div id="qualifying-questions-modal-disclaimer-text" class="collapsed" style="color: #848484;"> 1473 1474 I agree to be contacted by 1475 <strong>Teresa Cowart Team</strong> 1476 via call, email, and text <span class="disclaimer-more">for real estate services. 1477 To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 1478 You can also click the unsubscribe link in the emails. 1479 Message and data rates may apply. Message frequency may vary.</span> 1480 <span class="disclaimer-ellipsis">...</span> 1481 <a href='/terms-and-conditions' target='_blank' rel='noopener noreferrer' style='text-decoration: underline;'>Privacy Policy</a>. 1482 </div> 1483 <button 1484 id="qualifying-questions-modal-toggle-disclaimer" 1485 type="button" 1486 style="background: none; border: none; color: #848484; font-size: inherit; font-weight: bold; padding: 0; margin-top: 4px; cursor: pointer;" 1487 aria-expanded="false" 1488 onclick="toggleDisclaimerQualifyingQuestionsModal()" 1489 > 1490 Read more 1491 </button> 1492 </span> 1493 </label> 1494 </div> 1495 1496 <div> 1497 <button 1498 type="submit" 1499 style="padding: 12px 24px; font-size: 16px; font-weight: normal; border-radius: 8px; border: 1px solid black; background: black; color: white; width: 100%; cursor: pointer; transition: all 0.2s ease; text-transform: uppercase; letter-spacing: 0.5px;" 1500 onmouseover="this.style.background='transparent'; this.style.color='black';" 1501 onmouseout="this.style.background='black'; this.style.color='white';" 1502 > 1503 Submit 1504 </button> 1505 </div> 1506 </form> 1507 </div> 1508 </div> 1509 </div> 1510 </div> 1511 1512
1512<script> 1513 (function() { 1514 var lazyVideos = [].slice.call(document.querySelectorAll("video.lazy")); 1515 1516 if ("IntersectionObserver" in window && lazyVideos.length > 0) { 1517 var lazyVideoObserver = new IntersectionObserver(function(entries, observer) { 1518 entries.forEach(function(video) { 1519 if (video.isIntersecting) { 1520 for (var source in video.target.children) { 1521 var videoSource = video.target.children[source]; 1522 if (typeof videoSource.tagName === "string" && videoSource.tagName === "SOURCE") { 1523 videoSource.src = videoSource.dataset.src; 1524 } 1525 } 1526 1527 video.target.load(); 1528 video.target.classList.remove("lazy"); 1529 lazyVideoObserver.unobserve(video.target); 1530 } 1531 }); 1532 }); 1533 1534 lazyVideos.forEach(function(lazyVideo) { 1535 lazyVideoObserver.observe(lazyVideo); 1536 }); 1537 } 1538 })(); 1539 </script>
1539 1540 1541 <!-- Global site tag (gtag.js) - Google Analytics --> 1542
1542<script defer src="https://www.googletagmanager.com/gtag/js"></script>
1542 1543 1544 <!-- Google Tag Manager --> 1545
1545<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1546 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1547 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src= 1548 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1549 })(window,document,'script','dataLayer','GTM-T9SFQGHZ');</script>
1549 1550 <!-- End Google Tag Manager --> 1551 1552 1553 <!-- LP Tracker (divolte.js) - LP Divolte --> 1554
1554<script>window.divolteLp=window.divolteLp||function(){(divolteLp.q=divolteLp.q||[]).push(arguments)}</script>
1554 1555 <!-- LP Tracker (eventBus) - LP EventBus --> 1556
1556<script>window.eventBusLp=window.eventBusLp||function(){(eventBusLp.q=eventBusLp.q||[]).push(arguments)}</script>
1556 1557 1558
1558<script> 1559 window.dataLayer = window.dataLayer || []; 1560 document.sendGoogleTagManagerEvent = function() { 1561 /* Honor GPC-enabled browsers and prevent GTM event if GPC is enabled. More details: https://global-privacy-control.glitch.me/ */ 1562 if (window.navigator.globalPrivacyControl) { 1563 return; 1564 } 1565 1566 dataLayer.push(arguments); 1567 } 1568 1569 document.sendGoogleTagManagerEvent('js', new Date()); 1570 document.sendGoogleTagManagerEvent('config', 'G-ZE4ESRE8SP', { page: location.pathname, location: location.href }); 1571 document.sendGoogleAnalyticsEvent = function(googleEvent) { 1572 document.sendGoogleTagManagerEvent('event', googleEvent.eventAction || googleEvent.hitType, { 1573 event_category: googleEvent.eventCategory, 1574 event_label: googleEvent.eventLabel, 1575 value: googleEvent.eventValue, 1576 page: googleEvent.page, 1577 location: googleEvent.location 1578 }) 1579 }; 1580 1581 document.addEventListener("DOMContentLoaded", function() { 1582 (function() { 1583 //If the page has an element with ID of auto-year-update the element will be populated with the current year. 1584 var date = new Date(); 1585 var elements = document.getElementsByClassName('auto-year-update'); 1586 var i; 1587 for (i = 0; i < elements.length; i++) { 1588 elements[i].innerText = date.getFullYear(); 1589 } 1590 })(); 1591 if (window.divolteLp) { 1592 window.divolteLp('sendLpPageView', {}); 1593 } 1594 if (window.eventBusLp) { 1595 window.eventBusLp('sendLpPageView', {}); 1596 } 1597 }); 1598 </script>
1598 1599 1600 1601
1601<script> 1602 // Function to dynamically load a script 1603 function loadScript(url, callback) { 1604 var script = document.createElement('script'); 1605 script.type = 'text/javascript'; 1606 script.src = url; 1607 script.defer = true; 1608 script.async = true; 1609 script.onload = callback; 1610 document.head.appendChild(script); 1611 } 1612 1613 // Function to dynamically load CSS file 1614 function loadCSS(url) { 1615 var link = document.createElement("link"); 1616 link.rel = "stylesheet"; 1617 link.href = url; 1618 document.head.appendChild(link); 1619 } 1620 1621 // Global methods / variables that can be accessed by element js 1622 window.luxuryPresence = { 1623 libs: { 1624 loadJs: loadScript, 1625 loadCss: loadCSS, 1626 jsLibsMap: { 1627 paroller: { 1628 jsSrc: 'https://d1e1jt2fj4r8r.cloudfront.net/javascript/jquery.paroller.min.js', 1629 isLoaded: false, 1630 }, 1631 ionRangeSlider: { 1632 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js', 1633 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css', 1634 isLoaded: false, 1635 requires: ['jquery'], 1636 }, 1637 splide: { 1638 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/js/splide.min.js', 1639 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/css/splide-core.min.css', 1640 isLoaded: false, 1641 }, 1642 wow: { 1643 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js', 1644 isLoaded: false, 1645 }, 1646 jquery: { 1647 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js', 1648 isLoaded: false, 1649 }, 1650 slick: { 1651 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js', 1652 isLoaded: false, 1653 requires: ['jquery'], 1654 }, 1655 libphonenumber: { 1656 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/libphonenumber-js/1.11.8/libphonenumber-js.min.js', 1657 isLoaded: false, 1658 }, 1659 }, 1660 }, 1661 }; 1662 </script>
1662 1663
1663<script defer src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer" onload="window.luxuryPresence.libs.jsLibsMap.jquery.isLoaded = true"></script>
1663 1664
1664<script defer src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.8/handlebars.min.js"></script>
1664 1665
1665<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/handlebars-intl.min.js"></script>
1665 1666
1666<script defer src="https://cdnjs.cloudflare.com/ajax/libs/superagent/4.1.0/superagent.min.js"></script>
1666 1667
1667<script defer src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js" onload="window.luxuryPresence.libs.jsLibsMap.slick.isLoaded = true"></script>
1667 1668
1668<script defer src="https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js" onload="window.luxuryPresence.libs.jsLibsMap.wow.isLoaded = true"></script>
1668 1669
1669<script defer src="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js" onload="window.luxuryPresence.libs.jsLibsMap.ionRangeSlider.isLoaded = true"></script>
1669 1670 1671 <!-- GOOGLE TRANSLATE SCRIPT --> 1672
1672<script> 1673 function googleTranslateElementInit() { 1674 // list of languages can be overridden by setting window.customLanguages in the head JS. example `window.customLanguages = 'en,de,fr,ro,sk,pl'` 1675 // Language codes can be taken from here https://cloud.google.com/translate/docs/languages 1676 const DEFAULT_LANGUAGES = 'en,es,zh-CN,zh-TW,tl,vi,ar,ko,ru,de,fr,hi,pt'; 1677 document.querySelectorAll('[data-type="TRANSLATE"]').forEach(function(translate){ 1678 translate.innerText = ''; 1679 new google.translate.TranslateElement({ 1680 pageLanguage: 'en', 1681 layout: google.translate.TranslateElement.InlineLayout.SIMPLE, 1682 includedLanguages: window.customLanguages || DEFAULT_LANGUAGES, 1683 }, translate); 1684 }); 1685 } 1686 </script>
1686 1687
1687<script defer src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
1687 1688
1688<script defer src="https://accounts.google.com/gsi/intermediate"></script>
1688 1689 1690 <!-- GOOGLE TRANSLATE SCRIPT END--> 1691
1691<script> 1692 1693 // UI helpers 1694 (function () { 1695 1696 function getSideMenu () { 1697 return document.querySelector('body > div.sidemenu'); 1698 } 1699 1700 function sideMenuHide (instant) { 1701 var sideMenu = getSideMenu(); 1702 if (!sideMenu || !sideMenu.classList.contains('visible')) { 1703 return; 1704 } 1705 sideMenu.classList.remove('visible'); 1706 sideMenu.dispatchEvent(new CustomEvent('lpui-hide', { detail: { instant: !!instant } })); 1707 window.dispatchEvent(new CustomEvent('lpui-sidemenu-hide', { detail: {instant: !!instant} })); 1708 } 1709 1710 function sideMenuShow () { 1711 var sideMenu = getSideMenu(); 1712 if (!sideMenu || sideMenu.classList.contains('visible')) { 1713 return; 1714 } 1715 sideMenu.classList.add('visible'); 1716 sideMenu.dispatchEvent(new Event('lpui-show')); 1717 window.dispatchEvent(new Event('lpui-sidemenu-show')); 1718 } 1719 1720 function sideMenuToggle () { 1721 var sideMenu = getSideMenu(); 1722 if (!sideMenu) { 1723 return; 1724 } 1725 var isSideMenuVisible = sideMenu.classList.contains('visible'); 1726 if (isSideMenuVisible) { 1727 sideMenuHide(); 1728 } else { 1729 sideMenuShow(); 1730 } 1731 } 1732 1733 var scrollLockRequests = {}; 1734 window.__debug_scrollLockRequests = scrollLockRequests; 1735 var hideScrollStyles = ''+ 1736 'body {'+ 1737 'overflow: hidden;' + 1738 '}'; 1739 var hideScrollId = 'hide-body-scroll-style'; 1740 1741 function scrollLock () { 1742 var style = document.createElement('style'); 1743 style.id = hideScrollId; 1744 style.textContent = hideScrollStyles; 1745 document.head.appendChild(style); 1746 window.dispatchEvent(new Event('lpui-scroll-locked')); 1747 } 1748 1749 function scrollUnlock () { 1750 document.getElementById(hideScrollId)?.remove(); 1751 window.dispatchEvent(new Event('lpui-scroll-unlocked')); 1752 } 1753 1754 function requestScrollLock (lockId) { 1755 var wasLocked = Object.keys(scrollLockRequests).length > 0; 1756 scrollLockRequests[lockId || '__anonymous_lock'] = true; 1757 if (!wasLocked) { 1758 scrollLock(); 1759 } 1760 } 1761 1762 function releaseScrollLock (lockId) { 1763 if (lockId) { 1764 delete scrollLockRequests[lockId]; 1765 if (!Object.keys(scrollLockRequests).length) { 1766 scrollUnlock(); 1767 } 1768 } else { 1769 scrollLockRequests = {}; 1770 window.__debug_scrollLockRequests = scrollLockRequests; 1771 scrollUnlock(); 1772 } 1773 } 1774 1775 function showModal (modalId, options) { 1776 var modal = document.getElementById(modalId); 1777 if (!modal) { 1778 return; 1779 } 1780 1781 if (!modal.classList.contains('visible')) { 1782 modal.classList.add('visible'); 1783 if (options && options.scrollLock) { 1784 window.lpUI.requestScrollLock(modalId); 1785 } 1786 modal.dispatchEvent(new Event('lpui-show')); 1787 window.dispatchEvent(new CustomEvent('lpui-modal-show', { detail: { id: modalId } })); 1788 } 1789 1790 const visibleModals = document.querySelectorAll('.modal.visible'); 1791 1792 if (visibleModals.length > 1) { 1793 1794 const maxZIndex = Array.from(visibleModals).reduce((maxZIndex, modal) => { 1795 const zIndex = window.getComputedStyle(modal).zIndex; 1796 const parsedZIndex = zIndex !== 'auto' ? parseInt(zIndex) : 0; 1797 return Math.max(maxZIndex, parsedZIndex); 1798 }, 0); 1799 1800 modal.style.zIndex = maxZIndex + 1; 1801 } 1802 1803 } 1804 1805 function _hideModal (modalEl) { 1806 if (!modalEl) { 1807 return; 1808 } 1809 if (!modalEl.classList.contains('visible')) { 1810 return; 1811 } 1812 modalEl.classList.remove('visible'); 1813 modalEl.style.zIndex = '';
1814 modalEl.dispatchEvent(new Event('lpui-hide')); 1815 var modalId = modalEl.getAttribute('id'); 1816 if (modalId) { 1817 window.lpUI.releaseScrollLock(modalId); 1818 window.dispatchEvent(new CustomEvent('lpui-modal-hide', { detail: { id: modalId } })); 1819 } 1820 } 1821 1822 function hideModal (modalId) { 1823 _hideModal(document.getElementById(modalId)); 1824 } 1825 1826 function hideClosestModal (el) { 1827 const modal = el?.closest('.modal'); 1828 if (!modal) { 1829 return; 1830 } 1831 if (modal.classList) { 1832 _hideModal(modal); 1833 return; 1834 } 1835 if (modal.length && modal[0].classList) { 1836 _hideModal(modal[0]); 1837 } 1838 } 1839 1840 window.lpUI = { 1841 sideMenuHide: sideMenuHide, 1842 sideMenuShow: sideMenuShow, 1843 sideMenuToggle: sideMenuToggle, 1844 requestScrollLock: requestScrollLock, 1845 releaseScrollLock: releaseScrollLock, 1846 showModal: showModal, 1847 hideModal: hideModal, 1848 hideClosestModal: hideClosestModal 1849 } 1850 })(); 1851 1852 var stringifyPrimitive = function(v) { 1853 switch (typeof v) { 1854 case 'string': 1855 return v; 1856 1857 case 'boolean': 1858 return v ? 'true' : 'false'; 1859 1860 case 'number': 1861 return isFinite(v) ? v : ''; 1862 1863 default: 1864 return ''; 1865 } 1866 }; 1867 1868 function objectToQuerystring(obj, sep, eq, name) { 1869 // https://github.com/Gozala/querystring/blob/master/encode.js 1870 sep = sep || '&'; 1871 eq = eq || '='; 1872 if (obj === null) { 1873 obj = undefined; 1874 } 1875 1876 if (typeof obj === 'object') { 1877 return Object.keys(obj).map(function(k) { 1878 var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; 1879 if (Array.isArray(obj[k])) { 1880 return obj[k].map(function(v) { 1881 return ks + encodeURIComponent(stringifyPrimitive(v)); 1882 }).join(sep); 1883 } else { 1884 return ks + encodeURIComponent(stringifyPrimitive(obj[k])); 1885 } 1886 }).filter(Boolean).join(sep); 1887 1888 } 1889 1890 if (!name) return ''; 1891 return encodeURIComponent(stringifyPrimitive(name)) + eq + 1892 encodeURIComponent(stringifyPrimitive(obj)); 1893 } 1894 1895 function getPath(url, options) { 1896 var parser = document.createElement('a'); 1897 parser.href = url || ''; 1898 var path = parser.pathname || ''; 1899 if (path[0] !== '/') { 1900 // IE does not return path starting with a slash 1901 path = '/' + path; 1902 } 1903 1904 if (options && options.queryString) { 1905 path += parser.search; 1906 } 1907 1908 return path; 1909 } 1910 1911 function getMLSAutocomplete(keyword) { 1912 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 1913 var query = { 1914 kind: 'listings', 1915 query: keyword 1916 }; 1917 1918 return superagent 1919 .get(searchURL) 1920 .query(query) 1921 .then(function(res) { 1922 var data = res.body || []; 1923 // Array of listing_auto_complete documents: id, display_address, city, state, 1924 // price, sold_price, status, status_modified_at, photo_urls (array of URLs). 1925 1926 return data; 1927 }); 1928 } 1929 1930 function getMLSAutocompleteWithFilters(keyword, filters = {}) { 1931 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 1932 1933 return superagent 1934 .get(searchURL) 1935 .query({ kind: 'listings', query: keyword, ...filters }) 1936 .then(function(res) { 1937 // Same response shape as getMLSAutocomplete. 1938 return res.body || []; 1939 }); 1940 } 1941 1942 function makeMlsLink(data) { 1943 // Code Dupe from utils/googlePlace 1944 // mapping of google data type to mls data type 1945 var mapping = { 1946 neighborhood: 'neighborhood', 1947 locality: 'place', 1948 administrative_area_level_2: 'county', 1949 administrative_area_level_1: 'state', 1950 postal_code: 'postalcode', 1951 }; 1952 1953 function _filterTypes(types) { 1954 return types.filter(function(type) { return type !== 'political' }); 1955 } 1956 1957 if (!data || !Object.keys(data).length) { 1958 return '/home-search/listings'; 1959 } 1960 1961 var newData = {};
1962 _filterTypes(data.types).forEach(function(type) { 1963 if (mapping[type]) { 1964 newData.search_type = mapping[type]; 1965 } 1966 }); 1967 newData.omnibox = data.formatted_address; 1968 data.address_components.forEach(function(component) { 1969 _filterTypes(component.types).forEach(function(type) { 1970 if (mapping[type]) { 1971 newData[mapping[type]] = component.long_name; 1972 } 1973 }); 1974 }); 1975 var bounds = data.geometry.bounds; 1976 var convertedData = Object.assign(bounds, newData); 1977 1978 return '/home-search/listings?' + objectToQuerystring(convertedData); 1979 } 1980 1981 function debounce(func, wait) { 1982 let timeout; 1983 return function(...args) { 1984 const context = this; 1985 clearTimeout(timeout); 1986 timeout = setTimeout(() => func.apply(context, args), wait) 1987 } 1988 } 1989 1990 // Global methods / variables that can be accessed by element js 1991 window.luxuryPresence = { 1992 ...window.luxuryPresence, 1993 defaults: { 1994 companyId: '7ac07672-b054-446c-a74a-437d501f555c', 1995 apiGatewayUrl: '/api-gw', 1996 routerUrl: '/api-nv', 1997 gql: {"agents":"\n query Agents (\n $agentId: ID\n $agentIds: [ID!]\n $companyId: String\n $network: Boolean\n $networkId: String\n $officeId: [ID!]\n $excludeOfficeId: [ID!]\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: SortDirectionEnum\n $search: String\n $tags: [String]\n $tagsMode: TagsModeEnum\n $teamId: [ID!]\n $developmentId: [ID!]\n $prioritizeIds: Boolean\n ) {\n agents (\n agentId: $agentId\n agentIds: $agentIds\n companyId: $companyId\n network: $network\n networkId: $networkId\n officeId: $officeId\n excludeOfficeId: $excludeOfficeId\n offset: $offset\n limit: $limit\n sort: $sort\n sortDir: $sortDir\n search: $search\n tags: $tags\n tagsMode: $tagsMode\n teamId: $teamId\n developmentId: $developmentId\n prioritizeIds: $prioritizeIds\n ) {\n id\n firstName\n lastName\n avatar {\n smallUrl\n mediumUrl\n largeUrl\n height\n width\n }\n position\n bioLong\n bioShort\n seoTitle\n seoDescription\n slug\n phoneNumber\n phoneNumber2\n license\n email\n leadAgent\n greaterArea\n tags\n }\n agentsCount(\n agentIds: $agentIds\n companyId: $companyId\n network: $network\n networkId: $networkId\n officeId: $officeId\n excludeOfficeId: $excludeOfficeId\n search: $search\n tags: $tags\n tagsMode: $tagsMode\n teamId: $teamId\n developmentId: $developmentId\n prioritizeIds: $prioritizeIds\n ) {\n count\n }\n }\n","properties":"\n query Properties(\n $agentIds: [ID!]\n $teamIds: [ID!]\n $neighborhoodIds: [ID!]\n $officeIds: [ID!]\n $propertyId: ID\n $companyId: String\n $networkId: String\n $network: Boolean\n $statusId: String\n $propertyIds: [ID!]\n $prioritizeIds: Boolean\n $statusIds: [String!]\n $excludeStatusId: [String!]\n $neighborhoodId: String\n $addressState: [String!]\n $addressCity: [String!]\n $relatedNeighborhoodPropertyId: String\n $developmentId: String\n $featuredListing: Boolean\n $leaseProperty: Boolean\n $search: String\n $searchTermMode: SearchTermModeEnum\n $globalProperty: Boolean\n $archived: Boolean\n $salesPriceGTE: Float\n $salesPriceLTE: Float\n $leasePriceGTE: Float\n $leasePriceLTE: Float\n $livingSpaceSizeGTE: Float\n $livingSpaceSizeLTE: Float\n $bathCountGTE: Float\n $bathCountLTE: Float\n $bedroomCountGTE: Float\n $bedroomCountLTE: Float\n $architectureStyle: String\n $lifestyle: String\n $propertyTypeId: String\n $propertyTypeIds: [String!]\n $spaceTypeIds: [ID!]\n $tag: String\n $backfillMLSResults: Boolean\n $displayMLSListings: String\n $hostname: String\n $websiteId: ID\n $backfillProviders: [String!]\n $backfillMLSListingIds: [String!]\n $backfillMLSAgentIds: [String!]\n $backfillMLSOfficeIds: [String!]\n $backfillBoundary: JSON\n $openHouse: Boolean\n $withGeo: Boolean\n $advancedFilters: JSON\n $seasonalPriceId: ID\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: SortDirectionEnum\n ) {\n properties(\n \n agentIds: $agentIds\n teamIds: $teamIds\n propertyId: $propertyId\n propertyIds: $propertyIds\n prioritizeIds: $prioritizeIds\n companyId: $companyId\n network: $network\n networkId: $networkId\n statusId: $statusId\n statusIds: $statusIds\n excludeStatusId: $excludeStatusId\n neighborhoodId: $neighborhoodId\n neighborhoodIds: $neighborhoodIds\n officeIds: $officeIds\n addressState: $addressState\n addressCity: $addressCity\n developmentId: $developmentId\n featuredListing: $featuredListing\n leaseProperty: $leaseProperty\n search: $search\n searchTermMode: $searchTermMode\n salesPriceGTE: $salesPriceGTE\n salesPriceLTE: $salesPriceLTE\n leasePriceGTE: $leasePriceGTE\n leasePriceLTE: $leasePriceLTE\n livingSpaceSizeGTE: $livingSpaceSizeGTE\n livingSpaceSizeLTE: $livingSpaceSizeLTE\n bathCountGTE: $bathCountGTE\n bathCountLTE: $bathCountLTE\n bedroomCountGTE: $bedroomCountGTE\n bedroomCountLTE: $bedroomCountLTE\n architectureStyle: $architectureStyle\n lifestyle: $lifestyle\n propertyTypeId: $propertyTypeId\n propertyTypeIds: $propertyTypeIds\n spaceTypeIds: $spaceTypeIds\n tag: $tag\n archived: $archived\n globalProperty: $globalProperty\n withGeo: $withGeo\n openHouse: $openHouse\n displayMLSListings: $displayMLSListings\n advancedFilters: $advancedFilters\n seasonalPriceId: $seasonalPriceId\n\n relatedNeighborhoodPropertyId: $relatedNeighborhoodPropertyId\n backfillMLSResults: $backfillMLSResults\n hostname: $hostname\n websiteId: $websiteId\n backfillProviders: $backfillProviders\n backfillMLSListingIds: $backfillMLSListingIds\n backfillMLSAgentIds: $backfillMLSAgentIds\n backfillMLSOfficeIds: $backfillMLSOfficeIds\n backfillBoundary: $backfillBoundary\n offset: $offset\n limit: $limit\n sort: $sort,\n sortDir: $sortDir\n ){\n id\n name\n status\n originalStatus {\n id\n name\n }\n salesPrice\n reducedPrice\n isPasswordProtected\n bedroomCount\n bathCount\n fullBathCount\n halfBathCount\n threeQuarterBathCount\n fullAddress\n addressLine1\n addressLine2\n addressCity\n addressState\n addressCountry\n postalCode\n description\n syncedAt\n officeName\n attributionContact\n neighborhood {\n id\n }\n media {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n }\n seoTitle\n seoDescription\n slug\n fromMLS\n mlsId\n mlsLogo\n mlsAttribution\n openHouse\n openHouseHours\n priceUponRequest\n privateAddress\n leaseProperty\n leasePrice\n currency\n leaseTermFrequencyInterval\n leaseTermFrequencyCount\n leasePeriod\n livingSpaceSize\n livingSpaceUnits\n lotAreaSize\n lotAreaUnits\n tags\n latitude\n longitude\n soldDate\n timeZone\n buyerAgencyCompensation\n buyerAgencyCompensationType\n landIdUrl\
1997n }\n propertiesCount(\n \n agentIds: $agentIds\n teamIds: $teamIds\n propertyId: $propertyId\n propertyIds: $propertyIds\n prioritizeIds: $prioritizeIds\n companyId: $companyId\n network: $network\n networkId: $networkId\n statusId: $statusId\n statusIds: $statusIds\n excludeStatusId: $excludeStatusId\n neighborhoodId: $neighborhoodId\n neighborhoodIds: $neighborhoodIds\n officeIds: $officeIds\n addressState: $addressState\n addressCity: $addressCity\n developmentId: $developmentId\n featuredListing: $featuredListing\n leaseProperty: $leaseProperty\n search: $search\n searchTermMode: $searchTermMode\n salesPriceGTE: $salesPriceGTE\n salesPriceLTE: $salesPriceLTE\n leasePriceGTE: $leasePriceGTE\n leasePriceLTE: $leasePriceLTE\n livingSpaceSizeGTE: $livingSpaceSizeGTE\n livingSpaceSizeLTE: $livingSpaceSizeLTE\n bathCountGTE: $bathCountGTE\n bathCountLTE: $bathCountLTE\n bedroomCountGTE: $bedroomCountGTE\n bedroomCountLTE: $bedroomCountLTE\n architectureStyle: $architectureStyle\n lifestyle: $lifestyle\n propertyTypeId: $propertyTypeId\n propertyTypeIds: $propertyTypeIds\n spaceTypeIds: $spaceTypeIds\n tag: $tag\n archived: $archived\n globalProperty: $globalProperty\n withGeo: $withGeo\n openHouse: $openHouse\n displayMLSListings: $displayMLSListings\n advancedFilters: $advancedFilters\n seasonalPriceId: $seasonalPriceId\n\n ) {\n count\n }\n }\n","pressReleases":"\n query PressReleases (\n $companyId: ID\n $pressReleaseIds: [ID!]\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: String\n $search: String\n $categories: [String!]\n $propertyId: [ID!]\n $developmentId: [ID!]\n $agentId: [ID!]\n $teamId: [ID!]\n $year: [Int!]\n ) {\n pressReleases (\n companyId: $companyId\n pressReleaseIds: $pressReleaseIds\n offset: $offset\n limit: $limit\n sort: $sort\n sortDir: $sortDir\n search: $search\n categories: $categories\n propertyId: $propertyId\n developmentId: $developmentId\n agentId: $agentId\n teamId: $teamId\n year: $year\n ) {\n items {\n id\n title\n description\n author\n externalUrl\n media {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n altTagText\n }\n publishedAt\n categories\n }\n total\n }\n }\n","posts":"\n query Posts (\n $companyId: String\n $postId: [ID!]\n $slug: String\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: String\n $search: String\n $featured: Boolean\n $categoryId: [String!]\n $neighborhoodId: [String!]\n ) {\n posts (\n companyId: $companyId\n postId: $postId\n slug: $slug\n offset: $offset\n limit: $limit\n sort: $sort\n sortDir: $sortDir\n search: $search\n featured: $featured\n postStatusId: \"5f528253-abb7-484e-95c3-330269ac1102\"\n categoryId: $categoryId\n neighborhoodId: $neighborhoodId\n ) {\n items {\n id\n postId\n title\n subtitle\n description\n status: postStatus\n featured\n slug\n categories {\n id\n name\n }\n createdAt\n publishedAt\n updatedAt\n scheduledAt\n createdBy {\n ... on Agent {\n firstName\n lastName\n }\n }\n customAuthor\n media {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n altTagText\n }\n seoTitle\n seoDescription\n }\n total\n }\n }\n","testimonials":"\n query Testimonials (\n $companyId: String\n $agentId: ID\n $teamId: ID\n $testimonialIds: [ID!]\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: String\n $search: String\n ) {\n testimonials (\n companyId: $companyId\n agentId: $agentId\n teamId: $teamId\n testimonialIds: $testimonialIds\n offset: $offset\n limit: $limit\n sort: $sort\n sortDir: $sortDir\n search: $search\n ) {\n items {\n id\n testimonialId\n body\n author\n position\n media {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n altTagText\n }\n seoTitle\n seoDescription\n agents {\n slug\n email\n firstName\n lastName\n avatar {\n smallUrl\n height\n width\n }\n }\n }\n total\n }\n }\n","neighborhoods":"\n query Neighborhoods (\n $neighborhoodId: ID\n $companyId: String\n $search: String\n $tag: String\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: SortDirectionEnum\n ) {\n neighborhoods (\n neighborhoodId: $neighborhoodId\n companyId: $companyId\n search: $search\n tag: $tag\n offset: $offset\n limit: $limit\n sort: $sort\n sortDir: $sortDir\n ) {\n id\n name\n description\n descriptionShort\n slug\n tags\n googlePlaceData\n mlsLink\n createdAt\n media {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n }\n seoTitle\n seoDescription\n }\n neighborhoodsCount(\n companyId: $companyId\n search: $search\n tag: $tag\n ) {\n count\n }\n }\n","developments":"\n query Developments (\n $companyId: ID!\n $developmentIds: [ID!]\n $agentId: String\n $slug: String\n $search: String\n $tag: [String!]\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: SortDirection\n $neighborhoodId: ID\n $neighborhoodIds: [ID!]\n ) {\n developments (\n companyId: $companyId\n developmentIds: $developmentIds\n agentId: $agentId\n slug: $slug\n search: $search\n tag: $tag\n offset: $offset\n limit: $limit\n sort: $sort\n sortDir: $sortDir\n neighborhoodId: $neighborhoodId\n neighborhoodIds: $neighborhoodIds\n ) {\n items {\n id\n name\n description\n descriptionShort\n slug\n createdAt\n updatedAt\n media {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n altTagText\n }\n logoMedia {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n altTagText\n }\n websiteUrl\n videoUrl\n googlePlaceData\n coordinates\n mlsLink\n seoTitle\n seoDescription\n featuresAndAmenities {\n featureIds\n features {\n featureId\n name\n }\n description\n }\n latitude\n longitude\n addressLine1\n addressLine2\n city\n state\n zipCode\n country\n yearCompleted\n residences\n availability\n neighborhoodId\n developer\n architect\n interiorDesigner\n stories\n buildingHeight\n buildingHeightUnit\n bedMin\n bedMax\n bathMin\n bathMax\n livingSpaceMin\n livingSpaceMa
1997x\n livingSpaceUnit\n lotSizeMin\n lotSizeMax\n lotSizeUnit\n priceMin\n priceMax\n priceCurrency\n tags\n }\n total\n }\n }\n","pois":"\n query PointsOfInterest (\n $regionId: UUID!\n $radius: Int\n $offset: Int\n $limit: Int\n $categories: [AreasOfInterestCategories!]\n $sortBy: AreasOfInterestSorting\n ) {\n pois: areasOfInterest (\n input: {\n regionId: $regionId\n radius: $radius\n offset: $offset\n limit: $limit\n categories: $categories\n sortBy: $sortBy\n }\n ) {\n items {\n name\n imageUrl\n url\n reviewCount\n rating\n price\n displayPhone\n distance\n category\n location {\n address1\n address2\n address3\n city\n zipCode\n country\n state\n }\n }\n total\n }\n }\n","offices":"\n query Offices (\n $companyId: ID!\n $officeIds: [ID!]\n $officeMlsIds: [String!]\n $externalIds: [String!]\n $externalSource: String\n $agentId: ID\n $archived: Boolean\n $tags: [String!]\n $slug: String\n $search: String\n $sort: String\n $sortDir: SortDirection\n $offset: Int\n $limit: Int\n ) {\n offices (\n companyId: $companyId\n officeIds: $officeIds\n officeMlsIds: $officeMlsIds\n externalIds: $externalIds\n externalSource: $externalSource\n agentId: $agentId\n archived: $archived\n tags: $tags\n slug: $slug\n search: $search\n sort: $sort\n sortDir: $sortDir\n offset: $offset\n limit: $limit\n ) {\n items {\n id\n companyId\n name\n slug\n officeMlsId\n shortDescription\n fullDescription\n addressLine1\n addressLine2\n addressCity\n addressState\n addressPostalCode\n addressCountry\n phone\n email\n officeHours\n coordinates\n googlePlaceData\n seoTitle\n seoDescription\n fullAddress\n tags\n media {\n id\n originalUrl\n thumbnailUrl\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n }\n }\n total\n }\n }\n","teams":"\n query Teams (\n $companyId: ID\n $teamIds: [ID!]\n $agentId: ID\n $externalIds: [String!]\n $externalSource: String\n $slug: String\n $search: String\n $sort: String\n $sortDir: String\n $offset: Int\n $limit: Int\n ) {\n teams (\n companyId: $companyId\n teamIds: $teamIds\n agentId: $agentId\n externalIds: $externalIds\n externalSource: $externalSource\n slug: $slug\n search: $search\n sort: $sort\n sortDir: $sortDir\n offset: $offset\n limit: $limit\n ) {\n items {\n id\n companyId\n name\n email\n shortBio\n addressLine1\n addressLine2\n addressCity\n addressState\n addressCountry\n phoneNumber1\n phoneNumber2\n postalCode\n avatar {\n id\n thumbnailUrl\n smallUrl\n mediumUrl\n largeUrl\n }\n urlWebsite\n socialLinks\n socialLinksArray\n tags\n seoTitle\n seoDesc\n slug\n displayOrder\n }\n total\n }\n }\n"}, 1998 propertyPlaceholderImage: {"id":"ff613e7b-8f1b-41c8-a1e9-91fccdc32ac4","alt":null,"bytes":55526,"width":1920,"format":"png","height":1200,"pngUrl":"","shared":true,"curated":false,"duration":null,"largeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/16b0c11e-f5e4-4783-b5cb-dc743b55c12e","smallUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/16b0c11e-f5e4-4783-b5cb-dc743b55c12e","authorUrl":null,"createdAt":"2025-02-25T19
1998:34:41.840Z","mediumUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/16b0c11e-f5e4-4783-b5cb-dc743b55c12e","sourceUrl":null,"updatedAt":"2025-02-25T19:34:41.840Z","xLargeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/16b0c11e-f5e4-4783-b5cb-dc743b55c12e","__typename":"Media","altTagText":null,"authorName":null,"sourceName":"r2","xxLargeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/16b0c11e-f5e4-4783-b5cb-dc743b55c12e","description":null,"displayName":"property-teresa","originalUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/16b0c11e-f5e4-4783-b5cb-dc743b55c12e","resourceType":"image","thumbnailUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=320/https://media-production.lp-cdn.com/media/16b0c11e-f5e4-4783-b5cb-dc743b55c12e","originalFileName":"Property-Teresa","cloudinaryPublicId":"16b0c11e-f5e4-4783-b5cb-dc743b55c12e"} 1999 }, 2000 objectToQuerystring: objectToQuerystring, 2001 getPath: getPath, 2002 getMLSAutocomplete: getMLSAutocomplete, 2003 getMLSAutocompleteWithFilters: getMLSAutocompleteWithFilters, 2004 makeMlsLink: makeMlsLink, 2005 debounce: debounce, 2006 }; 2007 2008 var wowOffset = 100; 2009 </script>
2009 2010
2010<script> 2011 (()=>{function e(e){return e&&e.__esModule?e.default:e}var t=globalThis,r={},i={},s=t.parcelRequired4f7;null==s&&((s=function(e){if(e in r)return r[e].exports;if(e in i){var t=i[e];delete i[e];var s={id:e,exports:{}};return r[e]=s,t.call(s.exports,s,s.exports),s.exports}var o=Error("Cannot find module '"+e+"'");throw o.code="MODULE_NOT_FOUND",o}).register=function(e,t){i[e]=t},t.parcelRequired4f7=s);var o=s.register;o("ikl6F",function(e,t){"use strict";Object.defineProperty(e.exports,"__esModule",{value:!0}),e.exports.formatMoney=e.exports.convertAmount=e.exports.fetchExchangeRates=e.exports.toSupportedToCurrency=e.exports.toSupportedFromCurrency=e.exports.SUPPORTED_TO_CURRENCIES=e.exports.SUPPORTED_FROM_CURRENCIES=e.exports.DISPLAY_CURRENCIES=e.exports.writeCurrencyCookie=e.exports.readValidCurrencyCookie=e.exports.readCurrencyCookie=e.exports.clearCurrencyCookie=e.exports.CURRENCY_COOKIE_SAME_SITE=e.exports.CURRENCY_COOKIE_PATH=e.exports.CURRENCY_COOKIE_NAME=e.exports.CURRENCY_COOKIE_MAX_AGE_SECONDS=void 0;var r=s("65bUu");Object.defineProperty(e.exports,"CURRENCY_COOKIE_MAX_AGE_SECONDS",{enumerable:!0,get:function(){return r.CURRENCY_COOKIE_MAX_AGE_SECONDS}}),Object.defineProperty(e.exports,"CURRENCY_COOKIE_NAME",{enumerable:!0,get:function(){return r.CURRENCY_COOKIE_NAME}}),Object.defineProperty(e.exports,"CURRENCY_COOKIE_PATH",{enumerable:!0,get:function(){return r.CURRENCY_COOKIE_PATH}}),Object.defineProperty(e.exports,"CURRENCY_COOKIE_SAME_SITE",{enumerable:!0,get:function(){return r.CURRENCY_COOKIE_SAME_SITE}}),Object.defineProperty(e.exports,"clearCurrencyCookie",{enumerable:!0,get:function(){return r.clearCurrencyCookie}}),Object.defineProperty(e.exports,"readCurrencyCookie",{enumerable:!0,get:function(){return r.readCurrencyCookie}}),Object.defineProperty(e.exports,"readValidCurrencyCookie",{enumerable:!0,get:function(){return r.readValidCurrencyCookie}}),Object.defineProperty(e.exports,"writeCurrencyCookie",{enumerable:!0,get:function(){return r.writeCurrencyCookie}});var i=s("gUuHZ");Object.defineProperty(e.exports,"DISPLAY_CURRENCIES",{enumerable:!0,get:function(){return i.DISPLAY_CURRENCIES}}),Object.defineProperty(e.exports,"SUPPORTED_FROM_CURRENCIES",{enumerable:!0,get:function(){return i.SUPPORTED_FROM_CURRENCIES}}),Object.defineProperty(e.exports,"SUPPORTED_TO_CURRENCIES",{enumerable:!0,get:function(){return i.SUPPORTED_TO_CURRENCIES}}),Object.defineProperty(e.exports,"toSupportedFromCurrency",{enumerable:!0,get:function(){return i.toSupportedFromCurrency}}),Object.defineProperty(e.exports,"toSupportedToCurrency",{enumerable:!0,get:function(){return i.toSupportedToCurrency}});var o=s("jCxYG");Object.defineProperty(e.exports,"fetchExchangeRates",{enumerable:!0,get:function(){return o.fetchExchangeRates}});var n=s("igUcG");Object.defineProperty(e.exports,"convertAmount",{enumerable:!0,get:function(){return n.convertAmount}}),Object.defineProperty(e.exports,"formatMoney",{enumerable:!0,get:function(){return n.formatMoney}})}),o("65bUu",function(e,t){"use strict";Object.defineProperty(e.exports,"__esModule",{value:!0}),e.exports.readValidCurrencyCookie=e.exports.clearCurrencyCookie=e.exports.writeCurrencyCookie=e.exports.readCurrencyCookie=e.exports.CURRENCY_COOKIE_PATH=e.exports.CURRENCY_COOKIE_SAME_SITE=e.exports.CURRENCY_COOKIE_MAX_AGE_SECONDS=e.exports.CURRENCY_COOKIE_NAME=void 0;var r=s("gUuHZ");e.exports.CURRENCY_COOKIE_NAME="lp-currency",e.exports.CURRENCY_COOKIE_MAX_AGE_SECONDS=31536e3,e.exports.CURRENCY_COOKIE_SAME_SITE="Lax",e.exports.CURRENCY_COOKIE_PATH="/";let i=e=>e?.trim().toLowerCase().replace(/^\.+/,"")||void 0,o=e=>"undefined"!=typeof DOMException&&e instanceof DOMException,n=({document:t})=>{let r=`${e.exports.CURRENCY_COOKIE_NAME}=`;return t.cookie.split(";").map(e=>e.trim()).filter(e=>e.startsWith(r)).map(e=>e.slice(r.length))},a=e=>{try{return decodeURIComponent(e)}catch{return}};e.exports.readCurrencyCookie=e=>{let t=(e=>{try{return n(e)[0]}catch(e){if(!o(e))throw e;return}})(e);return void 0===t?void 0:a(t)};let l=(t,r,i,s)=>{var o;let n,a;t.document.cookie=`${e.exports.CURRENCY_COOKIE_NAME}=${r}${o=t.location,n="https:"===o.protocol?"; Secure":"",a=s?`; Domain=${s}`:"",`; Path=${e.exports.CURRENCY_COOKIE_PATH}; Max-Age=${i}; SameSite=${e.exports.CURRENCY_COOKIE_SAME_SITE}${n}${a}`}`};e.exports.writeCurrencyCookie=(t,s)=>{let a,d=(0,r.toSupportedToCurrency)(s);if(!d)return!1;let c=i(t.domain);try{if(a=n(t)[0],c&&l(t,"",0,void 0),l(t,encodeURIComponent(d),e.exports.CURRENCY_COOKIE_MAX_AGE_SECONDS,c),(0,e.exports.readCurrencyCookie)(t)===d)return!0}catch(e){if(!o(e))throw e}return c&&void 0!==a&&((t,r)=>{try{if(n(t).includes(r))return;l(t,r,e.exports.CURRENCY_COOKIE_MAX_AGE_SECONDS,void 0)}catch(e){if(!o(e))throw e}})(t,a),!1},e.exports.clearCurrencyCookie=e=>{let t=i(e.domain);try{t&&l(e,"",0,void 0),l(e,"",0,t)}catch(e){if(!o(e))throw e}},e.exports.readValidCurrencyCookie=(t,{enabled:s,enabledCurrencies:d})=>{if(!s)return;let c=(e=>{try{let t=n(e);if(!i(e.domain)||t.length<2)return t[0];return l(e,"",0,void 0),n(e)[0]}catch(e){if(!o(e))throw e;return}})(t);if(void 0===c)return;let u=new Set(d.map(r.toSupportedToCurrency).filter(e=>!!e)),h=(0,r.toSupportedToCurrency)(a(c));
2011if(h&&u.has(h))return h;(0,e.exports.clearCurrencyCookie)(t)}}),o("gUuHZ",function(e,t){"use strict";Object.defineProperty(e.exports,"__esModule",{value:!0}),e.exports.toSupportedToCurrency=e.exports.SUPPORTED_TO_CURRENCIES=e.exports.DISPLAY_CURRENCIES=e.exports.toSupportedFromCurrency=e.exports.SUPPORTED_FROM_CURRENCIES=void 0,e.exports.SUPPORTED_FROM_CURRENCIES=["usd","cad","eur","gbp"];let r=(e,t)=>{if("string"!=typeof e)return;let r=e.toLowerCase();return t.includes(r)?r:void 0};e.exports.toSupportedFromCurrency=t=>r(t,e.exports.SUPPORTED_FROM_CURRENCIES),e.exports.DISPLAY_CURRENCIES=[{code:"usd",name:"US dollar"},{code:"eur",name:"Euro"},{code:"gbp",name:"Pound sterling"},{code:"cad",name:"Canadian dollar"},{code:"chf",name:"Swiss franc"},{code:"brl",name:"Brazilian real"},{code:"mxn",name:"Mexican peso"},{code:"sek",name:"Swedish krona"},{code:"nok",name:"Norwegian krone"},{code:"dkk",name:"Danish krone"},{code:"ars",name:"Argentine peso"},{code:"cop",name:"Colombian peso"},{code:"clp",name:"Chilean peso"},{code:"pen",name:"Peruvian sol"},{code:"dop",name:"Dominican peso"},{code:"gtq",name:"Guatemalan quetzal"},{code:"crc",name:"Costa Rican colón"},{code:"bob",name:"Bolivian boliviano"},{code:"pyg",name:"Paraguayan guaranÃ"},{code:"kyd",name:"Cayman Islands dollar"}],e.exports.SUPPORTED_TO_CURRENCIES=e.exports.DISPLAY_CURRENCIES.map(e=>e.code),e.exports.toSupportedToCurrency=t=>r(t,e.exports.SUPPORTED_TO_CURRENCIES)}),o("jCxYG",function(e,t){"use strict";Object.defineProperty(e.exports,"__esModule",{value:!0}),e.exports.fetchExchangeRates=void 0;var r=s("gUuHZ");let i=async(e,{baseUrl:t,signal:i,fetch:s,onError:o})=>{let n=(0,r.toSupportedFromCurrency)(e);if(!n)return{};let a=`${t.replace(/\/$/,"")}/api/v1/exchange-rates?from=${encodeURIComponent(n)}`;try{let e=await (s??fetch)(a,{credentials:"omit",signal:i});if(!e.ok)throw Error(`Exchange rates HTTP ${e.status}`);var l=await e.json();let t=l?.rates;if("object"!=typeof t||null===t)return{};let o={};return Object.entries(t).forEach(([e,t])=>{let i=(0,r.toSupportedToCurrency)(e);i&&"number"==typeof t&&Number.isFinite(t)&&t>0&&(o[i]=t)}),o}catch(e){try{o?.(e)}catch(e){console.warn("fetchExchangeRates: onError callback threw",e)}return{}}};e.exports.fetchExchangeRates=i}),o("igUcG",function(e,t){"use strict";Object.defineProperty(e.exports,"__esModule",{value:!0}),e.exports.formatMoney=e.exports.convertAmount=void 0;var r=s("gUuHZ");e.exports.convertAmount=(e,t)=>{if(Number.isFinite(e)&&Number.isFinite(t)&&!(t<=0))return e*t},e.exports.formatMoney=(e,t,{precision:i=0}={})=>{let s=(0,r.toSupportedToCurrency)(t);if(!s||!Number.isFinite(e))return;let o=Number.isInteger(i)?i:0,n=Number.isInteger(e)?0:Math.min(Math.max(o,0),20);return new Intl.NumberFormat("en-US",{style:"currency",currency:s.toUpperCase(),minimumFractionDigits:n,maximumFractionDigits:n}).format(e)}});var n={},a={};a={getVideoFirstFrame(e){let t="https://res.cloudinary.com/";if(!e||!e.startsWith(t))return null;let r=e.replace(t,"").replace("f_auto:video","f_auto").split("/");if(-1===r[1].toLowerCase().indexOf("video"))return null;let i=r[r.length-1];i.lastIndexOf(".")>-1?i=`${i.slice(0,i.lastIndexOf("."))}.jpg`:i+=".jpg",r[r.length-1]=i;let s=3;"videos"===r[1].toLowerCase()&&""!==r[2]&&(s=2);let o=/^(?:[a-z]{1,3}|\$\w+)_\S+$/;for(;s<r.length-1&&o.test(r[s]);)s++;return r.splice(s,0,"so_0,eo_0"),t+r.join("/")}};let l={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "},d=/&(?:amp|lt|gt|quot|apos|nbsp|#(?:[0-9]+|[xX][0-9a-fA-F]+));/y,c=/[<&]/g,u=/["'>]/g,h=/<\/p\s*>|<br\s*\/?>|[\r\n\u2028\u2029]/g;function p(e,t){let r="";for(let i=0;i<e.length;){c.lastIndex=i;let s=c.exec(e);if(!s){r+=e.slice(i);break}let o=s.index;r+=e.slice(i,o);let n="&"===e[o]?function(e,t){d.lastIndex=t;let r=d.exec(e);return{text:r?function(e){if("#"!==e[1])return l[e.slice(1,-1)];
2011let t="x"===e[2]||"X"===e[2],r=parseInt(e.slice(t?3:2,-1),t?16:10);return 0===r||r>1114111||r>=55296&&r<=57343?e:160===r?" ":String.fromCodePoint(r)}(r[0]):"&",end:r?d.lastIndex:t+1}}(e,o):function(e,t,r){let i=function(e,t){let r=null;u.lastIndex=t+1;let i=u.exec(e);for(;i;){let t=i[0];if(r)t===r&&(r=null);else if('"'===t||"'"===t)r=t;else if(">"===t)return u.lastIndex;i=u.exec(e)}return -1}(e,t);return{text:-1===i?"<":function(e,t,r,i){if(!i)return"";let s=e.slice(t,r);if(/^<br\s*\/?>$/.test(s))return" ";if(/^<\/p\s*>$/.test(s)){h.lastIndex=r;let t=h.exec(e);if(t&&"<"===t[0][0])return" "}return""}(e,t,i,r),end:-1===i?t+1:i}}(e,o,t);r+=n.text,i=n.end}return r}n=function(e,{isEqual:t}){let r=[{field:"thumbnailUrl",w:320},{field:"smallUrl",w:960},{field:"mediumUrl",w:1280},{field:"largeUrl",w:1920},{field:"xLargeUrl",w:2560},{field:"xxLargeUrl",w:3456}],i=function(e,t,r){let i="en-US";if(!e)return"";if("string"==typeof e){let t=e.trim();if(/[^+\-0-9.]/.test(t))return e;if(!(e=parseFloat(t)))return""}let s="number"==typeof r?r:0,o=Number.isInteger(e)?0:s,n={minimumFractionDigits:o,maximumFractionDigits:o};return"USD"===t?`$${e.toLocaleString(i,n)}`:"CAD"===t?`$${e.toLocaleString(i,n)} CAD`:"EUR"===t?`\u{20AC}${e.toLocaleString(i,n)}`:"GBP"===t?`\xa3${e.toLocaleString(i,n)}`:"PERCENT"===t?`${e}%`:"number"==typeof r&&r>-1?e.toLocaleString(i,{maximumFractionDigits:r}):e.toLocaleString(i)},s=function(e){switch(e){case"DAY":return"daily";case"MONTH":return"monthly";case"WEEK":return"weekly";case"YEAR":return"yearly";case"QUARTER":return"quarterly";case"HALF_YEAR":return"semi-annually";case"NIGHTLY":return"nightly";case"SEASONAL":return"seasonally";default:return""}},o=function(e){switch(e){case"DAY":return"day";case"WEEK":return"wk";case"MONTH":return"mo";case"YEAR":return"yr";case"QUARTER":return"3 mos";case"HALF_YEAR":return"6 mos";case"NIGHTLY":return"night";case"SEASONAL":return"season";default:return""}},n=function(e){switch(e){case"DAY":return"day";case"WEEK":return"week";case"MONTH":return"month";case"YEAR":return"year";case"QUARTER":return"quarter";case"HALF_YEAR":return"6 months";case"NIGHTLY":return"night";case"SEASONAL":return"season";default:return""}},l=function(e,t){let r,i,a=t||{};switch(a.mode){case"short":r=o(e),i=a.frequencySeparator||"/";break;case"standard":case"std":r=n(e),i=a.frequencySeparator||"/";break;default:r=s(e),i=a.frequencySeparator||" "}return r?a.frequencyTag||a.frequencyClass?`${i}<${a.frequencyTag||"span"}${a.frequencyClass?` class="${a.frequencyClass}"`:""}>${r}</${a.frequencyTag||"span"}>`:i+r:""};return{isEmpty(e,t){let r=!e||"string"==typeof e&&!e.trim()||!Object.keys(e).length;return t.fn?r?t.fn(this):t.inverse(this):r},ifEquals(e,r,i){return t(e,r)?i.fn(this):i.inverse(this)},"raw-helper":function(e){return e.fn()},striptags:e=>e?p(e=(e=e.replace(/<\!--(.|[\r\n])*?-\->/g,"")).replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi,""),!1):"",striptagsLineBreaks:e=>e?p(e=(e=e.replace(/<\!--(.|[\r\n])*?-\->/g,"")).replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi,""),!0):"",truncate:(e,t,r)=>e?e.length>t?"string"==typeof r?e.slice(0,t-r.length)+r:e.slice(0,t):e:"",setSubArray(e=[],t,r,i,s){s.data.root[i]=e.slice(t,r)},formatAreaUnit(e){switch(e){case"ACRE":return"Acres";case"SQUARE_METER":return"Sq.M.";case"SQUARE_YARD":return"Sq.Yd.";default:return"Sq.Ft."}},formatFrequency:s,formatFrequencyShort:o,lpFormatFrequency:(e,t)=>l(e,t&&t.hash),subArray(e,t,r,i){return e>=t&&e<r?i.fn(this):i.inverse(this)},formatPropertyStatus(e,t,r){let i="";switch(e){case"SOLD":i="Sold";break;case"FOR_SALE":i="For Sale";break;case"COMING_SOON":i="Coming Soon";break;case"INACTIVE":i="Inactive";break;case"POCKET_LISTING":i="Pocket Listing";break;case"PENDING":i="Pending";break;case"UNDER_CONTRACT":i="Under Contract";break;case"ACTIVE_UNDER_CONTRACT":i="Active Under Contract";break;default:i=e}return("Sold"===i||"Leased"===i)&&t&&"string"==typeof r&&r&&(i+=` on ${r}`),i},formatGrade(e){switch(e){case"UNDERGRADUATE_COURSES":return"Undergrad";case"PRE_KINDERGARTEN":return"PreK";case"KINDERGARTEN":return"K";case"FIRST_GRADE":return"1st";case"SECOND_GRADE":return"2nd";case"THIRD_GRADE":return"3rd";case"FOURTH_GRADE":return"4th";case"FIFTH_GRADE":return"5th";case"SIXTH_GRADE":return"6th";case"SEVENTH_GRADE":return"7th";case"EIGHTH_GRADE":return"8th";case"NINTH_GRADE":return"9th";case"TENTH_GRADE":return"10th";case"ELEVENTH_GRADE":return"11th";case"TWELFTH_GRADE":return"12th";default:return""}},encodeURI:e=>encodeURI(e),encodeURIComponent:e=>encodeURIComponent(e),hbFormatDate(e,t){if(!e)return"";let r="current"===e?new Date:new Date(e);if(Number.isNaN(r.getTime()))return"";if("YYYY"===t||"year"===t)return`${r.getFullYear()}`;if("MM/DD/YY"===t){let e=r.getMonth()+1;return e<10&&(e=`0${e.toString()}`),`${e}/${r.getDate()}/${r.getFullYear().toString().substr(-2)}`}return`${["January","February","March","April","May","June","July","August","September","October","November","December"][r.getMonth()]} ${r.getDate()}, ${r.getFullYear()}`},openHousesFormat(e,t,r){if(!e||!t)return"";let i=e=>{let t=e.getHours();t>12&&(t-=12);let r=`${t}:${e.getMinutes()>9?e.getMinutes():"0"+e.getMinutes()}`;return e.getHours()>11?r+="PM":r+="AM",r},s="",o=e,n=t;
2011r&&(o=new Date(e).toLocaleString("en-US",{timeZone:r}),n=new Date(t).toLocaleString("en-US",{timeZone:r}),[,,,s]=new Date(t).toLocaleString("en-US",{timeZone:r,timeZoneName:"short"}).split(" "));let a=new Date(o),l=a.toLocaleDateString("en-US"),d=i(a),c=i(new Date(n));return`${l} ${d} - ${c} ${s}`},math:(e,t,r)=>(e=parseFloat(e),({"+":e+(r=parseFloat(r)),"-":e-r,"*":e*r,"/":e/r,"%":e%r})[t]),findByKey(e,t,r,i){let s=(e||[]).find(e=>e[t]===r);return i.fn(s)},capitalize(e,t,r){let i;return"string"==typeof e&&e.length&&(i=e.toLowerCase().split(t).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ").toString()),i},and:(...e)=>Array.prototype.slice.call(e).every(Boolean),or:(...e)=>Array.prototype.slice.call(e,0,-1).some(Boolean),not:e=>!e,orderByIds(t,r,i){let s="",o=null;i.data&&(o=e.createFrame(i.data));let n=(r||[]).filter(Boolean);if(n&&n.length){let e=0;s=n.reduce((r,s,n)=>{let a=(t||[]).find(e=>e.id===s);return a?(o&&(o.index=n-e),r+i.fn(a,{data:o})):(e+=1,r)},"")}else for(let e=0,r=(t||[]).length;e<r;e++)o&&(o.index=e),s+=i.fn(t[e],{data:o});return s},ifIn(e,t,r){return t&&t.indexOf(e)>-1?r.fn(this):r.inverse(this)},partial:(t,r)=>(e.registerPartial(t,e.compile(r.fn())),`
2011<script type="text/x-handlebars-template" class="${t} pagination-script">${r.fn()}<\/script>`),numCompare(e,t,r,i){return({"==":function(e,t){return e==t},"===":function(e,t){return e===t},"!=":function(e,t){return e!=t},"<":function(e,t){return e<t},">":function(e,t){return e>t},"<=":function(e,t){return e<=t},">=":function(e,t){return e>=t}})[r](e,t)?!i.fn||i.fn(this):!!i.fn&&i.inverse(this)},lpFormatNumber:i,arrayToHtmlList:(e,t)=>e.reduce((e,t)=>{try{if("object"==typeof t||null===t)return e;return e+=`<li>${t}</li>`}catch(e){}},""),join:(e,t,r)=>e&&e.join?e.join("string"==typeof t?t:", "):"",dedupe(t,r,i){let s=null,o=0,n=new Set;return i.data&&(s=e.createFrame(i.data)),(t||[]).reduce((e,t,a)=>{let l=r?t[r]:t;return!n.has(l)||r&&void 0===l?(n.add(l),s&&(s.index=a-o),e+i.fn(t,{data:s})):(o+=1,e)},"")},JSONstringify:(e,t)=>JSON.stringify(e),formatPropertyPrice(...t){let r=t[t.length-1].hash,s=t.length>1?t[0]:r.property,o=r.precision||0;t.length>2&&(r.mode=t[1]),r.mode||(r.mode="short");let n=t.length>3?t[2]:r.separator;if("string"!=typeof n&&(n=" | "),s.isPasswordProtected)return"Exclusive Listing";let a=t.length>4?t[3]:r.priceUponRequestText;if("string"!=typeof a&&(a="Price Upon Request"),s.priceUponRequest)return a;let d=s.salesPrice,c=null;"SOLD"!==s.status&&"Leased"!==s.status&&s.reducedPrice&&(r.reducedClass?c=s.reducedPrice:d=s.reducedPrice);let u="";c&&(u+=`<${r.reducedTag||"span"} class="${r.reducedClass}">${i(c,s.currency,o)}</${r.reducedTag||"span"}>`),d&&(d=i(d,s.currency,o),r.priceTag||r.priceClass?u+=`<${r.priceTag||"span"}${r.priceClass?` class="${r.priceClass}"`:""}>${d}</${r.priceTag||"span"}>`:u+=d);let h=s.leasePrice&&i(s.leasePrice,s.currency,o);if(h){u&&(u+=n);let e=`${h}${l(s.leasePeriod,r)}`;r.leaseTag||r.leaseClass?u+=`<${r.leaseTag||"span"}${r.leaseClass?` class="${r.leaseClass}"`:""}>${e}</${r.leaseTag||"span"}>`:u+=e}
2011return new e.SafeString(u)},mediaImage(t,i={}){if(!t)return;let{lazy:s,...o}=i.hash,n="",a="";if("string"==typeof t)n=t;else{let e={},{height:s,width:l,altTagText:d}=t;r.forEach(r=>{t[r.field]&&!e[t[r.field]]&&(e[t[r.field]]=r.w)});let c=Object.keys(e);if(!c.length)return;if(d&&(o.alt=d),s&&l&&(s>=l&&(o.class?o.class+=" portrait":o.class="portrait"),"setDims"in i.hash&&(o.width=l,o.height=s)),c.length>1&&l&&l<e[c[c.length-1]]){let t=c.findIndex(t=>e[t]>=l);c.splice(t+1),e[c[c.length-1]]=l}c.length>1&&(a=c.map(t=>`${t} ${e[t]}w`).join(", "),c.sort((t,r)=>Math.abs(e[t]-1280)-Math.abs(e[r]-1280))),n=c[0]}delete o.setDims,a||delete o.sizes,"alt"in o||(o.alt=""),!("loading"in o)&&(i?.data?.root?.sectionIndex>1||s)&&(o.loading="lazy");let l=Object.keys(o).map(t=>`${e.escapeExpression(t)}="${e.escapeExpression(o[t])}"`).join(" ");return new e.SafeString(`<img src="${n}"${a?` srcset="${a}"`:""}${l?` ${l}`:""}>`)},bgImage:e=>e?"string"==typeof e?e:e.largeUrl||e.url||"":"",concat(...e){let t="";for(let r in e)null!==e[r]&&void 0!==e[r]&&"object"!=typeof e[r]&&(t+=e[r]);return t},setVideoExtension(e,t){if(!e||!t)return"";let r=new URL(e);if("res.cloudinary.com"!==r.host)return r.pathname.endsWith(`.${t}`)?e:"";let i=r.pathname.lastIndexOf("."),s=r.pathname;return -1!==i&&(s=r.pathname.substr(0,i)),r.pathname=`${s}.${t}`,r.toString()},addVideoSources(e){if(!e)return"";if(!e.includes("res.cloudinary.com"))return`<source data-src="${e}">`;let t=e.replace(/\.(?:3gp|mpeg|mp4|m4v|m4p|ogv|ogg|mov|webm)$/,"");return[{format:"webm",codec:"vp9",htmlCodecs:";codecs=vp9"},{format:"mp4",codec:"h265",htmlCodecs:";codecs=hvc1"},{format:"mp4",codec:"h264",htmlCodecs:""}].map(e=>{let r=`${t.replace(/f_auto(?::video)?(?:,q_auto(?::\w+)?)?/,`f_${e.format},vc_${e.codec},q_auto:best,w_1920,c_limit`)}.${e.format}`;return`<source data-src="${r}" type="video/${e.format}${e.htmlCodecs}">`}).join("\n")},cloudinaryVideoFirstFrame:a.getVideoFirstFrame,initials(e,t){if(!e)return"";t?.hash?.endChar&&(e=e.split(t.hash.endChar)[0]);let r=+t?.hash?.maxChars||2,i=e.match(/\b\w/g)?.slice(0,r);return i?(t?.hash?.addText&&(i=i.map(e=>e+t.hash.addText)),i.join(t?.hash?.joinWith||"").toUpperCase()):""},normalizePhone(e){if(!e)return"";let t=String(e).trim();return(t.startsWith("+")?"+":"")+t.replace(/\D/g,"")}}};class m{constructor(e,t,r){if(this.config=e,this.window=t,this.document=r,!this.destroy)throw Error("Controllers must implement a deconstructor")}}let g="lp_lead_form_conversion_fired";function y(e,t){if(e&&t&&"function"==typeof t.sendGoogleTagManagerEvent&&!function(e){try{return"true"===e.sessionStorage.getItem(g)}catch{return!1}}(e))try{t.sendGoogleTagManagerEvent("event","generate_lead");try{e.sessionStorage.setItem(g,"true")}catch{}}catch{}}function f(e){return!!e&&(!!e.expired||Date.now()>=e.expiresAt)}let b="/api/v1/home-valuation";class v extends m{destroy(){}_cleanAddressString(e){if(!e||"string"!=typeof e)return"";let t=e.trim();if(t.includes("User entered address:")){let e=t.match(/User entered address:\s*\n?\s*([^\n]+)/);e&&e[1]&&(t=e[1].trim())}let r=t.indexOf(", call time frame:");return -1!==r&&(t=t.substring(0,r).trim()),t}_transformAddressComponents(e){let t=t=>(e.find(e=>e.componentType===t)||{}).componentName?.text,r={},i=t("street_number"),s=t("route"),o=t("administrative_area_level_1"),n=t("postal_code"),a=t("subpremise"),l=t("locality")||t("sublocality_level_1")||t("neighborhood");return i&&(r.streetNumber=i),s&&(r.streetName=s),l&&(r.city=l),o&&(r.state=o),n&&(r.zipcode=n),a&&(r.addressLine2=a),r}_extractAddressAndCoordinates(e){let t=null,r=null;if(e?.result){let{result:i}=e;i.address?.addressComponents&&(t=this._transformAddressComponents(i.address.addressComponents)),i.geocode?.location&&(r={latitude:i.geocode.location.latitude,longitude:i.geocode.location.longitude})}return{structuredAddress:t,coordinates:r}}_filterEmptyStrings(e){let t={};for(let[r,i]of Object.entries(e))""!==i&&null!=i&&(t[r]=i);return t}_getRawAddress(e){let t=e.activity.content||{},r=e.activity.comments_attributes?.[0]?.text;return[t.address,t["property-address"],t.property_address,t.Property_Address,r,t.message,t.homeValuationAddress,t.propertyAddress].map(e=>e&&this._cleanAddressString(e)).find(Boolean)||""}_logLeadEvent(e,t,r=null){let i={event:e,companyId:this.config.companyId,websiteId:this.config.websiteId,timestamp:new Date().toISOString(),hasEmail:!!t.activity?.author_email,hasAddress:!!this._getRawAddress(t)};if(r&&(i.errorMessage=r.userMessage||(r.status?`Request failed with status ${r.status}`:"An error occurred"),i.errorName=r.name,i.errorStatus=r.status),console.error(`[HomeValuation] ${e}`,JSON.stringify(i)),this.window.posthog)try{this.window.posthog.capture(e,i)}catch(e){console.error("[HomeValuation] PostHog capture failed:",e)}}_getUserFriendlyErrorMessage(e){return"AbortError"===e.name||e.message?.includes("timeout")?"Connection timed out. Please try again.":"TypeError"===e.name&&e.message?.includes("fetch")?"Unable to connect. Please check your internet connection and try again.":503===e.status||502===e.status||504===e.status?"Service temporarily unavailable. Please try again in a moment.":400===e.status?"Please check your information and try again.":"Something went wrong. Please try again or c
2011ontact us directly."}_formatStructuredAddress(e){if(!e||0===Object.keys(e).length)return"";let t=[];return t.push([e.streetNumber,e.streetName,e.addressLine2].filter(Boolean).join(" ")),t.push([[e.city,e.state].filter(Boolean).join(", "),e.zipcode].filter(Boolean).join(" ")),t.filter(Boolean).join(", ")}_buildHomeValuationData(e,t,r,i){let s=this._formatStructuredAddress(r)||this._getRawAddress(e);if(!s)throw Error("Unable to extract home valuation address from form data");let o={companyId:e.companyId,homeValuationAddress:s,homeValuationEstimate:t?new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0,minimumFractionDigits:0}).format(t):null,websiteId:e.page.websiteId,sourceUrl:e.activity.source_url},n={leadEmailAddress:e.activity.author_email,leadFullName:e.activity.author_name,leadFirstName:e.activity.firstName,leadLastName:e.activity.lastName,leadPhoneNumber:e.activity.author_phone,parcelId:e.activity.content?.parcelId,resourceId:e.page.pageMeta?.resourceId,pageId:e.page.pageId,sourceResource:e.page.pageMeta?.s
2011ourceResource,pageElementId:e.page.pageMeta?.pageElementId,formId:e.page.pageMeta?.formId,utmSource:e.activity.content?.utm_source,utmMedium:e.activity.content?.utm_medium,utmCampaign:e.activity.content?.utm_campaign,utmTerm:e.activity.content?.utm_term,utmContent:e.activity.content?.utm_content,utmId:e.activity.content?.utm_id,timeToSell:e.activity.content?.timeToSell,lookingToBuy:e.activity.content?.lookingToBuy,consented:!!e.activity.content?.termsAccepted,referrer:e.referrer,content:e.activity.content||{},fields:e.fields||{}},a=this._filterEmptyStrings(n);return{...o,...a,...r&&{address:r},...i&&{coordinates:i}}}async _validateAddressSafely(e){if(!e)return console.error("Home valuation: No address found in form data"),null;try{return await this._validateAddressWithGoogleMaps(e)}catch(e){throw console.error("Error validating address with Google Maps:",e),e.userMessage=this._getUserFriendlyErrorMessage(e),e}}async _getHomeValuationEstimateSafely(e){try{return await this._getHomeValuationEstimate(e)}catch(e){throw console.error("Error getting home valuation estimate:",e),e.userMessage=this._getUserFriendlyErrorMessage(e),e}}_isSafeRedirectUrl(e){try{let{protocol:t}=new URL(e,this.window.location.href);return"https:"===t||"http:"===t}catch{return!1}}_parseResponsePayload(e){try{return e?JSON.parse(e):{}}catch{return{raw:e}}}_createResponseError(e,t){let r=Error(e&&"object"==typeof e&&Object.keys(e).length?e.message||JSON.stringify(e):"Request failed");return e&&"object"==typeof e&&Object.keys(e).length&&Object.assign(r,e),r.status=t,r}_resolveValuationApiBase(){let{config:e}=this;if(void 0!==e.valuationApiBase&&null!==e.valuationApiBase&&(""!==e.valuationApiBase||!e.isBuilder))return e.valuationApiBase;if(e.websiteApiGatewayUrl)return e.websiteApiGatewayUrl;throw Error("websiteApiGatewayUrl/valuationApiBase not configured for home valuation")}async _submitLead(e,t,r){let i=new AbortController,s=setTimeout(()=>i.abort(),1e4);try{let o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),signal:i.signal});clearTimeout(s);let n=await o.text(),a=this._parseResponsePayload(n);if(!o.ok)throw this._createResponseError(a,o.status);if(a&&"success"===a.status&&a.redirectUrl){if(f(r))return a;if(!this._isSafeRedirectUrl(a.redirectUrl))return console.error("Home valuation: refusing redirect to unsupported protocol"),a;return this.window.location.href=a.redirectUrl,{redirected:!0,url:a.redirectUrl}}return a}catch(e){throw clearTimeout(s),e}}async _submitHomeValuationRequest(e){let t=this._resolveValuationApiBase();this._logLeadEvent("home_valuation_submission_started",e);try{let r=this._getRawAddress(e),i=null;try{i=await this._validateAddressSafely(r)}catch(t){throw this._logLeadEvent("home_valuation_address_validation_failed",e,t),t}let s=null;try{s=await this._getHomeValuationEstimateSafely(i)}catch(t){this._logLeadEvent("home_valuation_estimate_failed",e,t),s=null}let{structuredAddress:o,coordinates:n}=this._extractAddressAndCoordinates(i),a=`${t}${b}`,l=this._buildHomeValuationData(e,s,o,n),d=await this._submitLead(a,l,e.deadline);return this._logLeadEvent("home_valuation_submission_success",e),d}catch(t){throw t.userMessage||(t.userMessage=this._getUserFriendlyErrorMessage(t)),this._logLeadEvent("home_valuation_submission_failed",e,t),t}}async _validateAddressWithGoogleMaps(e){let{config:t,window:r}=this,i=t.googleMapsAPIKey;if(!i&&r.luxuryPresence?.mapApiLoader&&(i=await r.luxuryPresence.mapApiLoader.getMapApiKey()),!i)throw Error("Google Maps API key not configured");let s=new AbortController,o=setTimeout(()=>s.abort(),1e4);try{let t=await fetch(`https://addressvalidation.googleapis.com/v1:validateAddress?key=${i}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({address:{addressLines:[e]},enableUspsCass:!1}),signal:s.signal});if(clearTimeout(o),!t.ok){let e=Error(`Address validation failed: ${t.status}`);throw e.status=t.status,e}return t.json()}catch(e){throw clearTimeout(o),e}}_hasMandatoryAddressFields(e){return!!(e.streetNumber&&e.streetName&&e.city&&e.state&&e.zipcode)}_logMissingAddressFields(e){let t=[];e.streetNumber||t.push("streetNumber"),e.streetName||t.push("streetName"),e.city||t.push("city"),e.state||t.push("state"),e.zipcode||t.push("zipcode"),console.log("Home valuation estimate skipped - missing required fields:",t.join(", "),"Available fields:",Object.keys(e).join(", "))}_buildAddressQueryString(e){return Object.entries(e).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}async _getHomeValuationEstimate(e=null){let t=`${this._resolveValuationApiBase()}${b}`;if(!e?.result?.address?.addressComponents)return null;let r=this._transformAddressComponents(e.result.address.addressComponents);if(!this._hasMandatoryAddressFields(r))return this._logMissingAddressFields(r),null;let i=this._buildAddressQueryString(r),s=`${t}?${i}`,o=new AbortController,n=setTimeout(()=>
2011o.abort(),1e4);try{let e=await fetch(s,{headers:{Accept:"application/json"},signal:o.signal});if(clearTimeout(n),!e.ok){let t=Error(`Home valuation estimate failed: ${e.status}`);throw t.status=e.status,t}let t=await e.json();return t?.valueDollars??null}catch(e){throw clearTimeout(n),e}}}let w="middleName",E="redirect-pending",_=["name","firstName","lastName",w,"email","phone","phoneNumber","source","message","mlsId","sourceUrl"],S="lp_map_key_failed",C="oauthSuccess",I={cookieyes:{eventName:"cookieyes_consent_update",hasAnalyticsConsent:e=>(function(e){let t=e.cookie.match(/cookieyes-consent=([^;]+)/);if(!t)return!1;try{let e=decodeURIComponent(t[1]);if(e.includes(",")){let t=e.split(",").map(e=>e.trim());if(t.some(e=>e.includes(":")))return t.some(e=>"analytics:yes"===e);return t.includes("analytics")}return e.includes("analytics")}catch(e){return!1}})(e),isAnalyticsAccepted:e=>Array.isArray(e?.accepted)&&e.accepted.includes("analytics")},"lp-consent":{eventName:"lp_consent_update",hasAnalyticsConsent:(e,t)=>!!t.__lpConsent?.state?.c?.analytics,isAnalyticsAccepted:e=>!!e?.choices?.analytics}};function A(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function x(e,t){t.forEach(t=>{let r=e[t];Array.isArray(r)&&0===r.length&&delete e[t]})}function R(e,t,r,i){let s=t.map(t=>(function e(t){return Array.isArray(t)?t.flatMap(t=>e(t)):"string"==typeof t?t.split(/\s+/).filter(Boolean):null==t?[]:[t]})(e[t])),o=i?.merge?s.flat():s.find(e=>e.length>0)??[];t.forEach(t=>{delete e[t]}),o.length>0&&(e[r]=[...new Set(o)])}function T(e){let t={...e};if(t.urlWebsite||(t.urlWebsite=null),t.urlYoutube=null,t.urlFacebook=null,t.urlInstagram=null,t.urlLinkedin=null,t.urlPodcast=null,t.urlTwitter=null,Array.isArray(e.socialLinks)){let r=[...e.socialLinks].sort((e,t)=>{let r=e.type?.toLowerCase()||"",i=t.type?.toLowerCase()||"";return r.localeCompare(i)});t.socialLinks=r;let i={youtube:"urlYoutube",facebook:"urlFacebook",instagram:"urlInstagram",linkedin:"urlLinkedin",podcast:"urlPodcast",twitter:"urlTwitter"};r.forEach(e=>{let r=i[e.type?.toLowerCase()??""];r&&(t[r]=e.link)})}return t}function L(e){return e&&Array.isArray(e)?e.map(e=>T(e)):e}function k(e){let{region:t}=e;if(!A(t))return e;let{schools:r,pois:i,...s}=t,o={...s,schools:A(r)?r.data??[]:[],...Array.isArray(i)?{pois:i.map(e=>({...e,category:"string"==typeof e.category?e.category.toUpperCase():e.category}))}:{}};return{...e,region:o}}function M(e){return e&&Array.isArray(e)?e.map(e=>k(e)):e}function $(e){let t=e.featuresAndAmenities;if(!Array.isArray(t))return e;let r=t.map(e=>({featureIds:e.featureIds??[],features:e.features??[],description:e.description}));return{...e,featuresAndAmenities:r}}function U(e){return e&&Array.isArray(e)?e.map(e=>$(e)):e}function P(e,t){return A(e)?t(e):e}function O(e,t){return Array.isArray(e)?t(e):e}var N={};N=` 2012 query PropertyDisclaimers($input: PropertyDisclaimersInput!) { 2013 propertyDisclaimers(input: $input) { 2014 feedId 2015 listingId 2016 resolvedFromListing 2017 listingCardAttribution 2018 listingDetailCourtesy 2019 listingDetailFooter 2020 logo 2021 } 2022 } 2023`;let D={mlsAttribution:"listingCardAttribution",mlsLogo:"logo",listingDetailCourtesy:"listingDetailCourtesy",listingDetailFooter:"listingDetailFooter"};var F={};F=s("ikl6F");let B=new class{constructor(e){this.isBuilder=!1,this.companyId=null,this.websiteId=null,this.pageId=null,this.shareId=null,this.pageMeta=null,this.websiteApiGatewayUrl=null,this.buyerSellerServiceUrl=null,this.leadIngesterUrl=null,this.divolteServiceUrl=null,this.eventBus=null,this.templateId=null,this.myhomeDashboardEnabled=!1,this.mlsEnabled=!1,this.hstValuationRedirectEnabled=!1,this.hvStepTwoCaptureEnabled=!1,this.googleMapsAPIKey=null,this.currencyConversionEnabled=!1,this.enabledCurrencies=[]}get valuationApiBase(){return this.isBuilder?this.websiteApiGatewayUrl:""}destroy(){}setPage(e,t={}){this.pageId=e,this.shareId=t.shareId||null,this.pageMeta={sourceResource:t.sourceResource,pageElementId:t.pageElementId,pageQueryVariables:t.pageQueryVariables||{}}}setIsBuilder(e){this.isBuilder=e}setCompany(e,t={}){this.companyId=e}setWebsite(e,t={}){this.websiteId=e,t.myhomeDashboardEnabled&&(this.myhomeDashboardEnabled=t.myhomeDashboardEnabled),t.mlsEnabled&&(this.mlsEnabled=t.mlsEnabled),t.hstValuationRedirectEnabled&&(this.hstValuationRedirectEnabled=t.hstValuationRedirectEnabled),t.hvStepTwoCaptureEnabled&&(this.hvStepTwoCaptureEnabled=t.hvStepTwoCaptureEnabled)}setWebsiteApiGatewayUrl(e,t={}){this.websiteApiGatewayUrl=e}setBuyerSellerServiceUrl(e,t={}){this.buyerSellerServiceUrl=e}setDivolteServiceUrl(e,t={}){this.divolteServiceUrl=e}setEventBusUrl(e,t={}){this.eventBusUrl=e}setTemplateId(e,t={}){this.templateId=e}setLeadIngesterUrl(e,t={}){this.leadIngesterUrl=e}setGoogleMapsAPIKey(e,t={}){this.googleMapsAPIKey=e}setCurrencyConversion({enabled:e,enabledCurrencies:t}={}){this.currencyConversionEnabled=!0===e,this.enabledCurrencies=Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}setEventBus({enabled:e,apiKey:t,url:r}){this.eventBus={enabled:e,apiKey:t,url:r}}}({}),q=new class extends m{constructor(e,t,r){super(e,t,r),this.setLoginState=this.setLoginState.bind(this),this.pageId=null,this.modals=[],this.exitModalTriggered={},this.exitModalEventListeners=[]}initialize(e){try{let{config:t,document:r}=this;this.pageId=t.pageId,this.modals=r.querySelectorAll("body > #modals >
2023 .modal"),e.modals.forEach(e=>{this._attachModalHandler(e)})}catch(e){console.log(e)}}destroy(){let{document:e}=this;this.exitModalEventListeners.forEach(t=>{e.removeEventListener("mouseout",t)}),this.modals=[],this.exitModalTriggered={},this.exitModalEventListeners=[]}setModalWithExpiry(e){let{window:t}=this,r=new Date().getTime()+864e5,i=`modal-controller-${e}`;try{t.localStorage.setItem(i,JSON.stringify(r))}catch(e){}}setLoginState(){let{window:e}=this;try{e.localStorage.setItem("isSignedUp","true")}catch(e){}}getModalWithExpiry(e){let{window:t}=this,r=t.localStorage,i=r.getItem(`modal-controller-${e}`);if(!i)return!1;let s=JSON.parse(i);return!(new Date().getTime()>s)||(r.removeItem(`modal-controller-${e}`),!1)}show(e,t={}){let{window:r}=this,i=this.getModalWithExpiry(e);(e&&!i||!0===t.forced)&&(r.lpUI.showModal(`modal-${e}`,t),this.setModalWithExpiry(e))}_attachModalHandler(e){let{pageId:t}=this,{trigger:r,pageSpecific:i}=e;(!i||e.pages.map(e=>e.pageId).includes(t))&&("EXIT"===r?this._exitModalHandler(e):"TIMER"===r?this._timerModalHandler(e):"FORCED"===r&&this._forcedModalHandler(e))}_exitModalHandler(e){let t=this,{document:r,exitModalTriggered:i}=this,{modalId:s}=e;function o(e){!i[s]&&(e.toElement||e.relatedTarget||(t.show(s),i[s]=!0))}r.addEventListener("mouseout",o),this.exitModalEventListeners.push(o)}_timerModalHandler(e){let{modalId:t,timerDelay:r}=e;setTimeout(()=>{this.show(t)},r)}_forcedModalHandler(e){let{modalId:t}=e,{window:r,document:i}=this;if("true"!==r.localStorage.getItem("isSignedUp")){let e=i.querySelector(`#modal-${t}`),s=e?.querySelector("form"),o=s?.dataset.delay||2e3;s.addEventListener("formsubmitted",()=>{this.setLoginState()}),r.addEventListener("oauthSuccess",()=>{this.setLoginState(),s.classList.add("success"),setTimeout(()=>{r.lpUI.hideModal(`modal-${t}`),s.reset(),s.classList.remove("success")},o)}),this.show(t,{forced:!0})}}}(B,window,document),V=new class extends m{constructor(e,t,r){super(e,t,r),this._boundClickHandler=this._buttonClickHandler.bind(this)}initialize(e={}){try{let{document:e}=this;e.body.removeEventListener("click",this._boundClickHandler),e.body.addEventListener("click",this._boundClickHandler)}catch(e){console.error(e)}}destroy(){let{document:e}=this;e.body.removeEventListener("click",this._boundClickHandler)}_buttonClickHandler(e){this._handleButtonClick(e).catch(e=>console.error(e))}async _handleButtonClick(e){let{window:t,document:r}=this,i=e.target.closest("button, a");if(!i)return;let s=i.dataset.type||"",o=i.href||i.dataset.href||"",n=i.target||"",{submit:a}=i.dataset;if(a){try{await this._handleSubmit(i)}catch(e){console.error(e)}((e,t=!1)=>{if(e){if(t)return window.open(e);window.location.assign(e)}})(o,"_blank"===n)}if(this._trackConversion(i),"VIDEO"===s)return void this._handleVideoButton(i);if("CONTACT_US"===s)return void this._handleContactUsButton(i);if("SUBSCRIBE"===s)return void t.lpUI.showModal("modal-global-subscribe");if("MY_ACCOUNT"===s)return void t.lpUI.showModal("modal-global-my-account");if("SHARE_POPUP"===s){let t=i.querySelector(".share-popup");t&&(t.style.display="flex"),e.stopPropagation();return}if("MODAL_"===s.substring(0,6)){let e=s.substring(6);t.lpUI.showModal(`modal-${e}`);return}if(o?.startsWith("mailto:")){let e=o.substring(7);r.sendGoogleAnalyticsEvent({hitType:"event",eventCategory:"button",eventAction:"click",eventLabel:"Email",eventValue:e})}else if(o?.startsWith("tel:")){let e=o.substring(4);r.sendGoogleAnalyticsEvent({hitType:"event",eventCategory:"button",eventAction:"click",eventLabel:"Phone",eventValue:e})}}async _handleSubmit(e){let t=e.closest("form"),{window:r}=this;return t?await r.luxuryPresence.contactForms.submitForm(t):null}_getVimeoSrc(e){if(!e||!e.includes("vimeo.com")||e.length>2e3)return null;let t=e.match(/(?:(?:www\.)?vimeo\.com\/(?:showcase\/\d+(?:\/video\/|\?video[=/])|channels\/(?:\w+\/)?|groups\/(?:[^/]*)\/videos\/|)|player\.vimeo\.com\/video\/)(\d+)(?:(?:\?.*&*h=|\/)+([\d,a-f]+))?/);if(!t)return null;let[,r,i]=t,s=`https://player.vimeo.com/video/${r}?`;return i&&(s+=`h=${i}&`),s+="autoplay=1"}_handleVideoButton(e){let{document:t}=this,r=e.closest("section"),{src:i}=e.dataset,s="";if(i&&(i.includes("youtube.com")||i.includes("youtu.be"))&&!i.includes("youtube.com/embed")){let e=i.match(/(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\?(?:\S*?&?v=)
2023)|youtu.be\/)([a-zA-Z0-9_-]{6,11})/);e&&(s=e[1])}let o=this._getVimeoSrc(i);if(s?i=`https://youtube.com/embed/${s}?autoplay=1&controls=0`:o&&(i=o),!i||!r)return;let n=i.endsWith(".mp4")||i.endsWith(".webm")||i.includes("cloudinary.com"),a=` 2024 <div id="modal-${r.id}" class="modal visible"> 2025 <div class="modal-content"> 2026 <div class="lightbox-video"> 2027 <div class="video-player"> 2028 <div class="embed-container"> 2029 ${n?`<video controls autoplay src="${i}"></video>`:`<iframe frameborder="0" allowfullscreen="1" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" title="YouTube video player" width="100%" height="100%" src="${i}"></iframe>`} 2030 </div> 2031 </div> 2032 </div> 2033 </div> 2034 <button class="close lp-close" type="button" aria-label="close modal"><span class="lp-close-icon" aria-hidden="true"></span></button> 2035 </div> 2036 `;t.body.insertAdjacentHTML("beforeend",a);let l=t.getElementById(`modal-${r.id}`);l.querySelector(".close").addEventListener("click",()=>{l.remove()})}_handleContactUsButton(e){let{window:t,document:r}=this;r.sendGoogleAnalyticsEvent({hitType:"event",eventCategory:"button",eventAction:"click",eventLabel:"contact"}),t.lpUI.showModal("modal-global-contact-us",{scrollLock:!0})}_trackConversion(e){let{window:t,document:r}=this,{gtagConversionId:i,gtagConversionLabel:s,fbEventName:o}=e.dataset;if(i&&s){t.dataLayer&&t.dataLayer.length&&(t.dataLayer.some(e=>e.length&&"config"===e[0]&&e[1]===i)||r.sendGoogleTagManagerEvent("config",i));let e=`${i}/${s}`;r.sendGoogleTagManagerEvent("event","conversion",{send_to:e})}t.fbq&&o&&t.fbq("track",o,{})}}(B,window,document),j=new class extends m{constructor(e,t,r){super(e,t,r),this.validatedForms=[]}initialize(e={}){try{let{window:t,document:r}=this,{selector:i}=e,s=[];if(s=i?r.querySelectorAll(`${i} form[data-type="contact-form"]`):r.querySelectorAll('form[data-type="contact-form"]'),r.querySelectorAll('input[type="tel"]').length&&!t.libphonenumber&&t?.luxuryPresence?.libs){let{loadJs:e,jsLibsMap:r}=t.luxuryPresence.libs,{libphonenumber:i}=r;e(i.jsSrc,this.attachValidation.bind(this,s))}else this.attachValidation(s);this.validatedForms=this.validatedForms.concat(s)}catch(e){console.log(e)}}destroy(){this.validatedForms=[]}attachValidation(e){e.forEach(e=>{e.querySelectorAll("input, select, textarea").forEach(e=>{this.applyFieldValidation(e)})})}applyFieldValidation(e){"tel"===e.getAttribute("type")&&this._applyPhoneValidation(e)}_applyPhoneValidation(e){let{window:t}=this;if(t.libphonenumber){let r=t.libphonenumber.isValidPhoneNumber;e.addEventListener("keyup",function(){if(this.hasAttribute("required")||this.value.replace(/\s/g,"").length)try{let e=this.value;r(e,"US")?this.setCustomValidity(""):this.setCustomValidity("Please enter a valid phone number.")}catch(e){this.setCustomValidity("Please enter a valid phone number.")}else this.setCustomValidity("")})}}}(B,window,document),H=new class extends m{constructor(e,t,r){super(e,t,r),this.forms=[],this.homeValuationService=new v(e,t,r)}initialize(e={}){try{let{document:t}=this,{selector:r}=e,i=[];(i=r?t.querySelectorAll(`${r} form[data-type="contact-form"]`):t.querySelectorAll('form[data-type="contact-form"]')).forEach(e=>{this._attachSubmitHandler(e)}),this.forms=this.forms.concat(i)}catch(e){console.log(e)}}destroy(){this.forms=[]}submitForm(e){this._handleSubmit(null,e).catch(e=>console.error(e))}_attachValidation(e){let{window:t}=this;e.querySelectorAll("input, select, textarea").forEach(e=>{t.luxuryPresence.validation.applyFieldValidation(e)})}_attachSubmitHandler(e){e.addEventListener("submit",t=>this._handleSubmit(t,e))}_extractFormValues(e){let t=new FormData(e),r={},i=[],s=/^name(?:-\d+)?$/;return t.forEach((e,t)=>{if("string"==typeof e){let o=e.trim();s.test(t)&&o&&i.push(o);let n=r[t];r[t]=n?`${n} ${o}`:o}else r[t]=e}),i.length?r.name=i.join(" ").trim():!r.name&&r.firstName&&(r.name=r.firstName,r.lastName&&(r.name+=` ${r.lastName}`)),this._deriveNameParts(r)}_deriveNameParts(e){if(e.firstName||!e.name)return e;let t=e.name.indexOf(" ");return -1===t?{...e,firstName:e.name}:{...e,firstName:e.name.slice(0,t),lastName:e.lastName||e.name.slice(t+1).trim()}}_buildSubmissionData(e,t,r){let{window:i,config:s}=this,o=Object.keys(e).filter(e=>!_.includes(e)).reduce((t,r)=>(t[r]=e[r],t),{}),{pageId:n,companyId:a,websiteId:l,pageMeta:d}=s,c=i.localStorage.getItem("utm_vars")||"{}",u=i.localStorage.getItem("referrer")||"",h=this._getFormId(r);return{activity:{author_email:e.email,author_name:e.name,firstName:e.firstName||void 0,lastName:e.lastName||void 0,author_phone:e.phone||e.phoneNumber,activity_source:e.source||"CONTACT_INQUIRY",comments_attributes:[{text:e.message||void 0}],source_url:i.location.href,content:{...o,...JSON.parse(c)}},page:{pageId:n,companyId:a,websiteId:l,pageMeta:{...d,formId:h}},companyId:a,referrer:u,fields:t}}_handleSubmissionSuccess(e){let{window:t}=this,r=e.dataset.delay||2e3;e.classList.remove("loading"),e.classList.remove("error"),e.classList.add("success"),e.querySelectorAll(".success").forEach(e
2036=>e.classList.remove("hide")),e.dispatchEvent(new Event("formsubmitted")),setTimeout(()=>{t.lpUI.hideClosestModal(e),e.reset(),t.lpUI.sideMenuHide(),e.querySelectorAll(".success").forEach(e=>e.classList.add("hide")),e.classList.remove("success")},r)}async _handleSubmit(e,t){if(e&&e.preventDefault(),!t.classList.contains("loading")){this._hideSubmissionError(t),t.classList.remove("error"),t.classList.add("loading");try{let e=this._extractFormValues(t);if(e.middleName)return void t.classList.remove("loading");let r=this._getFields(t),i=this._buildSubmissionData(e,r,t);y(this.window,this.document);let s=await this._waitForLeadSubmit(e=>this._submitLeadRequest(i,e));if(this._sendGAEvent(i),s?.redirected)return void this._showRedirectPending(t);this._handleSubmissionSuccess(t)}catch(e){console.error("Form submission failed:",e),t.dispatchEvent(new Event("formsubmiterror")),t.classList.remove("loading"),t.classList.add("error"),e.userMessage?this._showSubmissionError(t,e.userMessage):this._showSubmissionError(t,"Something went wrong. Please try again.")}}}async _waitForLeadSubmit(e){let t,r={expired:!1,expiresAt:Date.now()+6e3},i=new Promise(e=>{t=setTimeout(()=>{r.expired=!0,e(null)},6e3)}),s=e(r).catch(e=>{if(f(r))return null;throw e});try{return await Promise.race([s,i])}finally{clearTimeout(t)}}_showRedirectPending(e){if(e.classList.add(E),e.querySelector(`.${E}__indicator`))return;let t=this.document.createElement("div");t.className=`${E}__indicator`,t.setAttribute("role","status"),t.setAttribute("aria-label","Loading"),t.innerHTML='<span class="lp-i lp-i--spinner lp-i--pulse" aria-hidden="true"></span>',e.appendChild(t)}_aliasUserWithEventBus(e){try{if(!this.window.eventBusProvider?.alias||!this.window.eventBusProvider?.isIdentified||!this.window.eventBusProvider?.getDistinctId||!this.window.LuxuryPresenceEventBus?.generateUUIDv5FromCompanyEmail)return;if(this.window.eventBusProvider.isIdentified())return void console.log("[EventBus] User already identified, skipping alias");let t=e.activity?.author_email,{companyId:r}=this.config;if(!t||!r)return void console.warn("[EventBus] Missing required data for user alias");let i=this.window.eventBusProvider.getDistinctId();if(!i)return void console.warn("[EventBus] No anonymous ID available for alias");let s=this.window.LuxuryPresenceEventBus.generateUUIDv5FromCompanyEmail(r,t);this.window.eventBusProvider.alias({anonId:i,canonicalId:s}),console.log("[EventBus] User aliased with canonical ID")}catch(e){console.error("[EventBus] User alias failed:",e)}}async _submitLeadRequest(e,t){let{config:r}=this;return(this._aliasUserWithEventBus(e),r.myhomeDashboardEnabled&&(e.activity?.activity_source==="HOME_VALUATION"||e.activity?.activity_source==="HOME_VALUE"))?this.homeValuationService._submitHomeValuationRequest({...e,deadline:t}):fetch(`${r.leadIngesterUrl}/api/v1/leads`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}).then(e=>e.ok?e.json():e.json().then(e=>{throw e}))}_sendGAEvent(e){let{document:t}=this,r={hitType:"event",eventCategory:"button",eventAction:"click"};switch(e.activity.activity_source){case"NEWSLETTER_SIGNUP":r.eventLabel="Newsletter",t.sendGoogleTagManagerEvent("event","newsletter_signup");break;case"HOME_SEARCH":r.eventLabel="HomeSearch",t.sendGoogleTagManagerEvent("event","home_search");break;case"HOME_VALUE":case"HOME_VALUATION":r.eventLabel="HomeValue",t.sendGoogleTagManagerEvent("event","home_valuation");break;case"EBOOK":r.eventLabel="Ebook",t.sendGoogleTagManagerEvent("event","ebook_download");break;default:r={hitType:"pageview",page:"/thank-you"},t.sendGoogleTagManagerEvent("event","contact_inquiry")}t.sendGoogleAnalyticsEvent(r)}_getFields(e){let t=e.querySelectorAll("input, select, textarea"),r={};return t.forEach(t=>{let{id:i,name:s,type:o}=t;if(s===w)return!0;let n="";if(i){let r=e.querySelector(`label[for='${i}']`);r?n=r.textContent.trim():t.placeholder&&(n=t.placeholder.trim())}r[s]={label:n,type:t.tagName,inputType:"INPUT"===t.tagName?o:"text"}}),r}_getFormId(e){let t=e.closest("section[id^='section-'], footer[id], .modal[id^='modal-']");return t?.id?this._cleanFormId(t.id):""}_cleanFormId(e){for(let t of["section-","modal-"])if(e.startsWith(t))return e.substring(t.length);return e}_showSubmissionError(e,t){let r=e.querySelector(".submission-error-message");r||((r=this.document.createElement("div")).className="submission-error-message",r.setAttribute("role","alert"),e.appendChild(r)),r.textContent=t||"Something went wrong. Please try again.",r.style.display="block"}_hideSubmissionError(e){let t=e.querySelector(".submission-error-message");t&&(t.style.display="none")}}(B,window,document),G=new class extends m{constructor(e,t,r){super(e,t,r),this.retries=3,this.callbacks=[],this.id=`__googleMapsScriptId${Date.now()}`,this._apiKey="",this.reset()}set apiKey(e){this._apiKey=e,this.config.setGoogleMapsAPIKey(e)}get apiKey(){return this._apiKey}reset(){this.deleteScript(),this.done=!1,this.loading=!1,this.failed=!1,this.errors=[],this.onerrorEvent=null}destroy(){this.reset()}async getMapApiKey(){if(this.apiKey)return this.apiKey;let e=this._hadPreviousFailure(),t=!1;for(let r=1;r<=3;r+=1){let i=e&&!t;try{let e=await fetch(this._getMapKeyUrl(r,i));if(t=t||i,this._setFailureFlag(!1),!e.ok)throw Error(`Failed to fetch API key: ${e.status}`);let s=await e.text();if(!s)return"";return this.apiKey=s,this.apiKey}catch(e){console.error(e),r<3&&await this._delay(300*2**(r-1))}}return this._setFailureFlag(!0),""}_getMapKeyUrl(e,t){let r=[];e>1&&r.push(`attempt=${e}`),t&&r.push("recovered_after_failure=1");let i=r.length?`?${r.join("&")}`:"";return`${this._getBaseUrl()}/api/v1/map${i}`}_hadPreviousFailure(){try{return"1"===this.window.sessionStorage.getItem(S)}catch(e){return!1}}_setFailureFlag(e){try{e?this.window.sessionStorage.setItem(S,"1"):this.window.sessionStorage.removeItem(S)}catch(e){}}_delay(e){return new Promise(t=>{this.window.setTimeout(t,e)})}async createUrl(){let e=await this.getMapApiKey();if(!e)throw Error("Refusing to load Google Maps without an API key");
2036let t="https://maps.googleapis.com/maps/api/js";return t+`?callback=__googleMapsCallback&key=${e}&libraries=places`}async setScript(){let e;if(this.document.getElementById(this.id))return void this.callback();try{e=await this.createUrl()}catch(e){console.error(e),this.failed=!0,this.loading=!1,this.onerrorEvent=e,this.callback();return}let t=this.document.createElement("script");t.id=this.id,t.type="text/javascript",t.src=e,t.onerror=this.loadErrorCallback.bind(this),t.defer=!0,t.async=!0,this.document.head.appendChild(t)}loadErrorCallback(e){if(this.errors.push(e),this.errors.length<=this.retries){let e=this.errors.length*2**this.errors.length;console.log(`Failed to load Google Maps script, retrying in ${e} ms.`),setTimeout(()=>{this.deleteScript(),this.setScript().catch(e=>console.error(e))},e)}else this.failed=!0,this.onerrorEvent=e,this.callback()}deleteScript(){let e=this.document.getElementById(this.id);e&&e.remove()}load(){return this.loadPromise()}loadPromise(){return new Promise((e,t)=>{this.loadCallback(r=>{r?t(r):e()})})}loadCallback(e){this.callbacks.push(e),this.execute()}setCallback(){this.window.__googleMapsCallback=this.callback.bind(this)}resetIfRetryingFailed(){this.failed&&this.reset()}callback(){this.done=!0,this.loading=!1,this.callbacks.forEach(e=>{e(this.onerrorEvent)}),this.callbacks=[]}execute(){this.window.google&&this.window.google.maps&&this.window.google.maps.version&&this.callback(),this.resetIfRetryingFailed(),this.done?this.callback():this.loading||(this.loading=!0,this.setCallback(),this.setScript().catch(e=>console.error(e)))}_getBaseUrl(){let{isBuilder:e,websiteApiGatewayUrl:t}=this.config;return e?t:""}resizeStaticMapDimensions(e,t){if(e<=1024&&t<=1024)return{width:e,height:t};let r=Math.min(1024/e,1024/t);return{width:parseInt(e*r),height:parseInt(t*r)}}convertThemeToStaticApiUrl(e){return e.map(e=>{let t=e.stylers.reduce((e,t)=>{let r=t.visibility?`visibility:${t.visibility}`:"",i=t.color?`color:${t.color.replace("#","0x")}`:"",s=t.lightness?`lightness:${t.lightness}`:"";return`${e}|${r}${i}${s}`},""),r=e.elementType?`|element:${e.elementType}`:"";return`feature:${e.featureType}${r}${t}`})}async getMapApiSignedUrl(e){try{let t=await fetch(`${this._getBaseUrl()}/api/v1/map/signature?${e}`);if(!t.ok)throw Error("Failed to fetch signed URL");let{url:r}=await t.json();return r}catch(e){return console.error(e),""}}generateStaticMapUrl(e,t,r,i,s,o){let{width:n,height:a}=this.resizeStaticMapDimensions(s,o),l={center:`${e},${t}`,zoom:r,scale:2,size:`${n}x${a}`,key:this.apiKey};i&&(l.style=this.convertThemeToStaticApiUrl(i));let d=new URLSearchParams;return Object.entries(l).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>d.append(e,t.toString())):d.append(e,t.toString())}),`https://maps.googleapis.com/maps/api/staticmap?${d.toString()}`}async generateDigitallySignedStaticMapUrl({srcWidth:e,srcHeight:t,theme:r,...i}){let{width:s,height:o}=this.resizeStaticMapDimensions(e,t),n={...i,size:`${s}x${o}`};r&&(n.style=this.convertThemeToStaticApiUrl(r));let a=new URLSearchParams;Object.entries(n).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>a.append(e,t.toString())):a.append(e,t.toString())});let l=a.toString();try{return await this.getMapApiSignedUrl(l)}catch(e){return console.error(e),""}}}(B,window,document),K=new class extends m{destroy(){}updateQueryString(e,t,r){r||(r=this.window.location.href);let i=RegExp(`([?&])${e}=.*?(&|#|$)`,"i"),s="";null!=t&&(Array.isArray(t)?t.length&&(s=this.serializeArray(e,t)):"object"==typeof t?(i=RegExp(`([?&])${e}\\[[^=]*\\]=.*?(&|#|$)`,"i"),s=this.serializeObj(t,"",e)):s=`${e}=${encodeURIComponent(t)}`);let o=r.split("#"),n=o[0];if(i.test(r)){let e=n;for(s=s?`$1${s}$2`:"$1";i.test(e);)n=e.replace(i,s),e=e.replace(i,"$1");n=n.replace(/(&|\?)$/,"")}else if(s){let e=-1!==n.indexOf("?")?"&":"?";n+=`${e}${s}`}return void 0!==o[1]&&null!==o[1]&&(n+=`#${o[1]}`),n}getParameterByName(e,t){t||(t=this.window.location.href),e=e.replace(/[[\]]/g,"\\$&");let r=RegExp(`[?&]${e}(=([^&#]*)|&|#|$)`),i=Array.from(RegExp.prototype[Symbol.matchAll].call(r,t)).flat();if(!i.length){let r=RegExp(`[?&]${e}(\\[.*?\\])=(.*?)(?=&|#|$)`,"g");return i=Array.from(RegExp.prototype[Symbol.matchAll].call(r,t)).flat(),this._parseParamToObject(i,"advancedFilters"===e)}return i.length>3?i.reduce((e,t,r)=>((r+1)%3==0&&e.push(decodeURIComponent(t.replace(/\+/g," "))),e),[]):i[2]?decode
2036URIComponent(i[2].replace(/\+/g," ")):""}makePageKey(e){return e.replace("section-","").replace(/-/g,"")}makeParamKey(e,t){return e.global?e.urlKey:`${t}-${e.urlKey}`}deserializeParams(e,t){let r={},i=this.makePageKey(t),s=this.getParameterByName(i);return s&&(r.page=parseInt(s)),Array.isArray(e)&&e.forEach(e=>{let t=this.makeParamKey(e,i),s=this.getParameterByName(t);if("int"===e.type)isFinite(s=parseInt(s))||(s=null);else if("bool"===e.type||"boolean"===e.type)s="true"===s||"false"!==s&&null;else if("json"===e.type)try{s=JSON.parse(s)}catch(e){}r[e.formKey||e.param]=s}),r}serializeParams(e,t,r){let i=this.window.location.href,s=this.makePageKey(t);return i=this.updateQueryString(s,r.page,i),Array.isArray(e)&&e.forEach(e=>{let t=this.makeParamKey(e,s),o=r[e.formKey||e.param];"json"===e.type&&null!=o&&(o=JSON.stringify(o)),i=this.updateQueryString(t,o,i)}),i}formatSliderAtom(e,t=""){return t+(Number.isInteger(e)?e:e.toFixed(2))}formatSliderValue(e,t="",r=""){return e<1e3?this.formatSliderAtom(e,t):e<1e6?`${this.formatSliderAtom(e/1e3,t)}${r}K`:`${this.formatSliderAtom(e/1e6,t)}${r}M`}formatSliderPriceRange(e,t,r,i){return t.min===e&&0!==e?`${i.lowPrefix}${this.formatSliderValue(e,r," ")}`:t.max===e?`${this.formatSliderValue(e,r," ")}${i.highSuffix}`:`${this.formatSliderValue(e,r," ")}`}formatSliderAreaRange(e,t,r,i){return t.min===e&&0!==e?`${i.lowPrefix}${this.formatSliderValue(e)} ${r}`:t.max===e?`${this.formatSliderValue(e)}${i.highSuffix} ${r}`:`${this.formatSliderValue(e)} ${r}`}getSearchFormValues(e){let{queryElement:t,priceSliderElement:r,areaSliderElement:i,neighborhoodSelect:s}=e,o={};if(t&&(o.search=t.value||null),r){let e=r.value.split(";"),t=parseInt(r.dataset.min),i=parseInt(r.dataset.max),s=parseInt(e[0]),n=parseInt(e[1]);o.priceMin=s!==t?s:null,o.priceMax=n!==i?n:null}if(i){let e=i.value.split(";"),t=parseInt(i.dataset.min),r=parseInt(i.dataset.max),s=parseInt(e[0]),n=parseInt(e[1]);o.areaMin=s!==t?s:null,o.areaMax=n!==r?n:null}return s&&(o.neighborhoodId=s.value||null),o}serializeObj(e,t="",r=""){let i=[];for(let s in e)if(e.hasOwnProperty(s)){let o,n=e[s];if(r){let e=t?`[${t}][${s}]`:`[${s}]`;o=`${r}${e}`}else o=t?`${t}[${s}]`:s;null!==n&&Array.isArray(n)?n.length&&i.push(this.serializeArray(o,n)):null!==n&&"object"==typeof n?i.push(this.serializeObj(n,o)):i.push(`${o}=${encodeURIComponent(n)}`)}return i.join("&")}serializeArray(e,t,r=""){let i=[];return t.forEach(t=>{let s=r?`${r}${e}`:e;i.push(`${s}=${encodeURIComponent(t)}`)}),i.join("&")}_parseParamToObject(e,t=!1){if(!e.length)return null;let r={};for(let i=0;i<e.length;i++)if((i+1)%3==0){let s=decodeURIComponent(e[i].replace(/\+/g," ")),o=e[i-1];Object.assign(r,this._setObjectPath(o,s,r,t))}return r}_setObjectPath(e,t,r,i=!1){let s=e.split(/[\[\]]/).filter(Boolean),o=["in","nin","btw","ciin","cinin"],n={},a=n,l=((e,t,r)=>{if(!t)return;let i=(Array.isArray(t)?t:t.match(/([^[.\]])+/g)).reduce((e,t)=>e&&e[t],e);return void 0===i?r:i})(r,s.join("."));return s.forEach((e,n)=>{n===s.length-1?l?a[e]=Array.isArray(l)?[...l,t]:[l,t]:a[e]=i&&o.includes(e)?[t]:t:(a[e]=r[e]?r[e]:{},a=a[e])}),n}}(B,window,document),Y=new class extends m{constructor(e,t,r){super(e,t,r),this._createLightbox=this._createLightbox.bind(this),this.expandSliders=[]}initialize(e={}){try{let{document:e}=this,t=e.querySelectorAll(".has-mobile-expand");t.forEach(e=>{this._addExpandButton(e)}),this.expandSliders=this.expandSliders.concat(t)}catch(e){console.log(e)}}destroy(){let{document:e}=this;e.querySelectorAll(".lp-expand-btn, .lp-expand-btn-wrapper").forEach(e=>e.remove()),this.expandSliders=[]}_addExpandButton(e){let{document:t}=this,r=e.closest("section[id]"),i=e.dataset.append,s=r.querySelector(".lp-expand-btn");if(!s)if((s=t.createElement("button")).className="lp-expand-btn",s.setAttribute("aria-label","Open a lightbox"),s.innerHTML='<span class="lp-i lp-i--expand-alt" aria-hidden="true"></span>',i){let e=r.querySelector(i);e&&e.appendChild(s)}else{let r=t.createElement("div");r.className="lp-expand-btn-wrapper",r.style.position="relative",r.appendChild(s),e.parentNode.insertBefore(r,e.nextSibling)}s.addEventListener("click",()=>{this._createLightbox({slider:e,section:r})})}_createLightbox({slider:e,section:t,initialIndex:r}){let{window:i,document:s}=this,o=`lightbox-for-${t?.id}`,n=i.$&&i.$.fn.slick,a=n&&e.slick,l="function"==typeof i.Splide,d=e.classList.contains("is-initialized")&&e.classList.contains("splide");function c(){let t=s.createElement("div");t.id=o,t.className="lp-lightbox",t.setAttribute("tabindex","-1"),t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.innerHTML=` 2037 <button class="lp-lightbox__close" aria-label="close modal"></button> 2038 <div class="lp-lightbox__content"> 2039 <div class="lp-lightbox__carousel splide" role="group" aria-label="Image Gallery"> 2040 <div class="splide__arrows"> 2041 <button class="splide__arrow splide__arrow--prev lp-lightbox-arrow lp-lightbox-arrow--prev"></button> 2042 <button class="splide__arrow splide__arrow--next lp-lightbox-arrow lp-lightbox-arrow--next"></button> 2043 </div> 2044 <div class="splide__track"> 2045 <ul class="splide__list"></ul> 2046 </div> 2047 </div> 2048 </div> 2049 `,"function"==typeof i.lpUI.requestScrollLock?i.lpUI.requestScrollLock(o):s.body.style.overflow="hidden",s.body.appendChild(t);let n=t.querySelector(".lp-lightbox__carousel"),a=n.querySelector(".splide__list");t.classList.add("show"),(d?e.querySelectorAll(".splide__slide:not(.splide__slide--clone) img"):e.querySelectorAll("img")).forEac
2049h(e=>{let t=e.cloneNode(!0);t.removeAttribute("style");let r=s.createElement("li");r.className="lp-lightbox__slide splide__slide",r.appendChild(t),a.appendChild(r)});let l=new i.Splide(n,{rewind:!0,arrows:!0,arrowPath:"",type:"loop",clones:1,pagination:!1,perPage:1,perMove:1});l.mount(),void 0!==r&&r>=0&&l.go(r),setTimeout(()=>{t.focus()},100);let c=e=>{if(!t.classList.contains("show"))return;let r=t.querySelector(".splide__arrow--prev"),i=t.querySelector(".splide__arrow--next"),s=t.querySelector(".lp-lightbox__close");"ArrowLeft"===e.key&&r?(e.preventDefault(),r.click()):"ArrowRight"===e.key&&i?(e.preventDefault(),i.click()):"Escape"===e.key&&s&&(e.preventDefault(),s.click())};s.addEventListener("keydown",c),t.querySelector(".lp-lightbox__close").addEventListener("click",()=>{s.removeEventListener("keydown",c),t.classList.remove("show"),l&&l.destroy(),"function"==typeof i.lpUI.releaseScrollLock?i.lpUI.releaseScrollLock(o):s.body.style.overflow="",t.remove()})}if("function"==typeof i.lpUI.requestScrollLock?i.lpUI.requestScrollLock(o):s.body.style.overflow="hidden",n&&!d){let t,r,n,l,d;r={arrows:!0,dots:!1,infinite:!0,draggable:!0,prevArrow:'<button type="button" class="lp-lightbox-arrow--prev lp-lightbox-arrow" aria-label="Previous"></button>',nextArrow:'<button type="button" class="lp-lightbox-arrow--next lp-lightbox-arrow" aria-label="Next"></button>'},(n=s.createElement("div")).id=o,n.className="lp-lightbox",n.setAttribute("tabindex","-1"),n.setAttribute("role","dialog"),n.setAttribute("aria-modal","true"),n.innerHTML=` 2050 <button class="lp-lightbox__close" aria-label="close modal"></button> 2051 <div class="lp-lightbox__content"> 2052 <div class="lp-lightbox__carousel"></div> 2053 </div> 2054 `,s.body.appendChild(n),l=n.querySelector(".lp-lightbox__carousel"),n.classList.add("show"),a?(t=e.slick.$slides.find("img"),r.initialSlide=e.slick?.currentSlide||0,t.each(function(){i.$(".lp-lightbox__carousel").append(i.$(this).clone(!1).removeAttr("style").wrap('<div class="lp-lightbox__slide"></div>').parent())})):(t=e.querySelectorAll("img")).forEach(e=>{let t=e.cloneNode(!0);t.removeAttribute("style");let r=s.createElement("div");r.className="lp-lightbox__slide",r.appendChild(t),l.appendChild(r)}),i.$(l).slick(r),setTimeout(()=>{n.focus()},100),d=e=>{if(!n.classList.contains("show"))return;let t=n.querySelector(".lp-lightbox-arrow--prev"),r=n.querySelector(".lp-lightbox-arrow--next"),i=n.querySelector(".lp-lightbox__close");"ArrowLeft"===e.key&&t?(e.preventDefault(),t.click()):"ArrowRight"===e.key&&r?(e.preventDefault(),r.click()):"Escape"===e.key&&i&&(e.preventDefault(),i.click())},s.addEventListener("keydown",d),n.querySelector(".lp-lightbox__close").addEventListener("click",()=>{s.removeEventListener("keydown",d),n.classList.remove("show");let t=l?.slick?i.$(l).slick("slickCurrentSlide"):0;l?.slick&&i.$(l).slick("unslick"),a&&i.$(e).slick("slickGoTo",t),"function"==typeof i.lpUI.releaseScrollLock?i.lpUI.releaseScrollLock(o):s.body.style.overflow="",n.remove()})}else l?c():(i.luxuryPresence.libs.loadCss(i.luxuryPresence.libs.jsLibsMap.splide.cssSrc),i.luxuryPresence.libs.loadJs(i.luxuryPresence.libs.jsLibsMap.splide.jsSrc,()=>{c(),i.luxuryPresence.libs.jsLibsMap.splide.isLoaded=!0}))}}(B,window,document),z=new class extends m{destroy(){this.window.divolte||(this.window.divolteLp=function(){(this.window.divolteLp.q=this.window.divolteLp.q||[]).push(arguments)})}initialize(e={}){let{divolteServiceUrl:t}=this.config;t&&!this.window.divolte&&this.loadScript()}loadScript(){let{divolteServiceUrl:e}=this.config,t=this.document.createElement("script");t.id="divolte-script",t.type="text/javascript",t.defer=!0,t.async=!0,t.src=`${e}/divolte.js`,this.document.head.appendChild(t),t.addEventListener("load",this.executeQueue.bind(this))}executeQueue(){(this.window.divolteLp.q||[]).forEach(([e,t])=>{this[e](t)}),this.window.divolteLp=this.divolteLp.bind(this)}divolteLp(e,t){try{this[e](t)}catch(e){console.log(e)}}sendLpEvent(e,t){if(!e.includes("pageView"))return void console.log(`${e} IS NOT SUPPORTED`);let{companyId:r,templateId:i,websiteId:s,pageId:o,shareId:n,pageMeta:a}=this.config;this.window.divolte.signal(e,Object.assign({companyId:r,templateId:i,websiteId:s,pageId:o,shareId:n,pageMeta:a},t))}sendLpPageView(){this.sendLpEvent("pageView",{})}}(B,window,document),W=new class extends m{constructor(e,t,r){super(e,t,r)}initialize(e={}){(void 0!==e.enabled?e.enabled:this.config.eventBus?.enabled)&&this.config.eventBus?.apiKey&&this.config.eventBus?.url&&this.loadScript()}loadScript(){let{eventBusUrl:e}=this.config,t=this.document.createElement("script");t.id="posthog-script",t.type="text/javascript",t.defer=!0,t.async=!0,t.src=`${e}/v2.8.0/event-bus-js.js`,this.document.head.appendChild(t),t.addEventListener("load",this.executeQueue.bind(this))}executeQueue(){this.window.LuxuryPresenceEventBus&&(this.window.eventBusProvider=this.window.LuxuryPresenceEventBus.createEventBusProvider({apiKey:this.config.eventBus.apiKey,host:this.config.eventBus.url,defaultSource:"frontend://website-render-engine"}
2054)),(this.window.eventBusLp.q||[]).forEach(([e,t])=>{this[e](t)}),this.window.eventBusLp=this.eventBusLp.bind(this)}destroy(){if(!this.window.eventBusProvider){this.window.eventBusLp=function(){(this.window.eventBusLp.q=this.window.eventBusLp.q||[]).push(arguments)};return}this.window.eventBusProvider.shutdown()}sendLpEvent(e,t){if("user.activity.page.viewed"!==e)return void console.log(`${e} IS NOT SUPPORTED`);if(!this.window.eventBusProvider)return;let{companyId:r}=this.config;try{this.window.eventBusProvider.capture(e,{company:r,data:{}})}catch(e){console.log("EventBus capture error:",e)}}eventBusLp(e,t){try{this[e](t)}catch(e){console.log(e)}}sendLpPageView(){this.sendLpEvent("user.activity.page.viewed",{})}}(B,window,document),Q=new class extends m{constructor(e,t,r){super(e,t,r),this.successListeners=[],this._listenToMessages=this._listenToMessages.bind(this),this._listenToOneTapMessage=this._listenToOneTapMessage.bind(this)}initialize(e={}){try{e.googleSignOnEnabled&&!e.iframe&&this._renderGoogleOneTap(),this.document.querySelectorAll('div[data-signin-type="google-sign-in"]').forEach(e=>this._convertGoogleSignIn(e)),this.document.querySelectorAll('div[data-signin-type="facebook-sign-in"]').forEach(e=>this._convertFacebookSignIn(e))}catch(e){console.log(e)}}destroy(){this.successListeners.forEach(e=>{this.window.removeEventListener("message",this._listenToMessages),this.window.removeEventListener("message",this._listenToOneTapMessage),this.window.removeEventListener(C,this.window[e])})}_renderGoogleOneTap(){if(!this._isGoogleOneTapOnCooldown()){let e=this.document.createElement("div");google.accounts.id.initializeIntermediate({src:this._buildUrlAndCopyAttributes(e,e,"googleOneTap")}),this.window.localStorage.removeItem("googleOneTapExpiration"),this.window.addEventListener("message",this._listenToOneTapMessage)}}_listenToOneTapMessage(e){let t="show_intermediate_iframe",{buyerSellerServiceUrl:r}=this.config,{data:i,origin:s}=e,{type:o,height:n,event:a,source:l,token:d}=i;if(o===t||"hide_intermediate_iframe"===o){let e=this.document.getElementById("onetap_google_intermediate_iframe");e&&(e.style.height=n,e.style.display=o===t?"unset":"none")}s===r&&"GOOGLE_SIGN_ON"===l&&("success"===a?(this._setExpirationLsItem(864e5),this._handleQualifyingQuestionsModal(d)):"cancel"===a&&this._setExpirationLsItem(72e5))}_setExpirationLsItem(e){let t=new Date().getTime()+e;this.window.localStorage.setItem("googleOneTapExpiration",t)}_isGoogleOneTapOnCooldown(){return Number(this.window.localStorage.getItem("googleOneTapExpiration"))>new Date().getTime()}_convertGoogleSignIn(e){this._replaceWithIframe("googleSignIn",e)}_convertFacebookSignIn(e){this._replaceWithIframe("facebookSignIn",e)}_replaceWithIframe(e,t){this._attachSuccessCallback(t);let r=this.document.createElement("iframe");r.src=this._buildUrlAndCopyAttributes(t,r,e),r.dataset.isSocialOauthButton=!0,t.replaceWith(r)}_listenToMessages(e){let{buyerSellerServiceUrl:t}=this.config;if(e.origin===t&&"success"===e.data.event){let e=new Event(C);this.window.dispatchEvent(e),y(this.window,this.document),this.successListeners.forEach(t=>{this.window[t]?this.window[t](e):console.error(`Callback function ${t} not found on window object`)}),this.document.documentElement.classList.add("is-login-success")}}_attachSuccessCallback(e){this.window.addEventListener("message",this._listenToMessages);let t=e.dataset.onSuccessFunctionName;t&&this.successListeners.push(t)}_buildUrlAndCopyAttributes(e,t,r){let{buyerSellerServiceUrl:i,companyId:s,websiteId:o,pageId:n,pageMeta:a}=this.config,{location:l}=this.window,d=l.origin+l.pathname,c=new URL(`${i}/buttons/${r}`),u=this.window.localStorage.getItem("utm_vars"),h=this.window.localStorage.getItem("referrer");c.searchParams.append("companyId",s),c.searchParams.append("websiteId",o),c.searchParams.append("pageId",n),c.searchParams.append("sourceUrl",d),c.searchParams.append("pageMeta",JSON.stringify(a)),u&&c.searchParams.append("utm",u),h&&c.searchParams.append("referrer",h);let p=["data-size","data-width","data-text","data-button-type","data-shape","data-layout","data-max-rows","data-use-continue-as","data-type","data-theme","data-logo_alignment","data-locale"];
2054return Array.from(e.attributes).forEach(e=>{p.includes(e.nodeName)?c.searchParams.append(e.nodeName,e.nodeValue):t.setAttribute("id"===e.nodeName?"data-id":e.nodeName,e.nodeValue)}),c.toString()}_decodeToken(e){try{let t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"),r=4-t.length%4,i=4===r?t:t+"=".repeat(r);return JSON.parse(atob(i))}catch(e){return null}}_handleQualifyingQuestionsModal(e){if(e&&this.window.luxuryPresence&&this.window.luxuryPresence.qualifyingQuestionsModal){let t=this._decodeToken(e);t&&t.email&&this.window.luxuryPresence.qualifyingQuestionsModal.showModal(t.email,"Google Sign On")}}}(B,window,document),J=new class extends m{constructor(e,t,r){super(e,t,r),this.showModal=this.showModal.bind(this),this.hasModalBeenSubmitted=this.hasModalBeenSubmitted.bind(this),this.modalId="qualifying-questions-modal",this.cookieKey="qualifyingQuestionsModalSubmitted",this.qualifyingQuestionsModalEnabled=!0,this.eventListeners=[],this.timeouts=[]}initialize(e={}){this.qualifyingQuestionsModalEnabled=e.qualifyingQuestionsModalEnabled??this.qualifyingQuestionsModalEnabled,this.qualifyingQuestionsModalEnabled&&this.attachModalCloseListeners()}destroy(){this.eventListeners.forEach(({element:e,event:t,handler:r})=>{e&&e.removeEventListener&&e.removeEventListener(t,r)}),this.timeouts.forEach(e=>{clearTimeout(e)}),this.restoreBodyScroll(),this.eventListeners=[],this.timeouts=[]}hasModalBeenSubmitted(){return"true"===this.getCookie(this.cookieKey)}setModalSubmittedCookie(){this.setCookie(this.cookieKey,"true",365)}showModal(e,t){!this.qualifyingQuestionsModalEnabled||this.hasModalBeenSubmitted()||(this.updateEmailValue(e),this.updateTriggerSourceValue(t),this.showModalElement())}getModalElement(){let e=this.document.getElementById(this.modalId);return e||console.error("Modal element not found:",this.modalId),e}updateEmailValue(e){let t=this.getModalElement();if(!t)return;let r=t.querySelector('input[name="email"]');r&&"string"==typeof e&&(r.value=e)}updateTriggerSourceValue(e){let t=this.getModalElement();if(!t)return;let r=t.querySelector(`#${this.modalId}-triggerSource`);r&&"string"==typeof e&&(r.value=e)}showModalElement(){let e=this.getModalElement();e&&(e.style.display="flex",this.blockBodyScroll())}getCookie(e){let t=`; ${this.document.cookie}`.split(`; ${e}=`);return 2===t.length?decodeURIComponent(t.pop().split(";").shift()):null}setCookie(e,t,r){let i="";if(r){let e=new Date;e.setTime(e.getTime()+864e5*r),i=`; expires=${e.toUTCString()}`}let s="; path=/; SameSite=Lax";this.window&&this.window.location&&"https:"===this.window.location.protocol&&(s+="; Secure"),this.document.cookie=`${e}=${encodeURIComponent(t||"")}${i}${s}`}blockBodyScroll(){this._prevOverflow=this.document.body.style.overflow,this.document.body.style.overflow="hidden"}restoreBodyScroll(){this.document.body.style.overflow=this._prevOverflow||"",this._prevOverflow=null}attachModalCloseListeners(){let e=this.getModalElement();if(!e)return;let t=this.document.getElementById(`${this.modalId}-form`);if(t){let r=()=>{this.setModalSubmittedCookie();let t=setTimeout(()=>{e.style.display="none",this.restoreBodyScroll()},100);this.timeouts.push(t)};t.addEventListener("formsubmitted",r),this.eventListeners.push({element:t,event:"formsubmitted",handler:r})}let r=e.querySelector('[data-dismiss="modal"]');if(r){let t=()=>{e.style.display="none",this.restoreBodyScroll()};r.addEventListener("click",t),this.eventListeners.push({element:r,event:"click",handler:t})}let i=t=>{(t.target===e||t.target.id===this.modalId)&&(e.style.display="none",this.restoreBodyScroll())};e.addEventListener("click",i),this.eventListeners.push({element:e,event:"click",handler:i})}}(B,window,document),X=new class extends m{constructor(e,t,r){super(e,t,r),this.isValidating=!1,this.lastValidationResult=null,this.lastValidationTime=null,this.validationCacheDuration=3e5}destroy(){this.isValidating=!1,this.lastValidationResult=null,this.lastValidationTime=null}async validateSession(e={}){let{useCache:t=!0}=e;if(t&&null!==this.lastValidationResult&&this.lastValidationTime&&Date.now()-this.lastValidationTime<this.validationCacheDuration)return this.lastValidationResult;if(this.isValidating)return null!==this.lastValidationResult&&this.lastValidationResult;this.isValidating=!0;let r=` 2055 query { 2056 validSession { 2057 success 2058 } 2059 } 2060 `;try{let e=await this.window.fetch("/graphql",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({query:r})});if(!e.ok)return console.error("SessionController: HTTP error during session validation",e.status),this.lastValidationResult=!1,this.lastValidationTime=Date.now(),!1;let t=await e.json();if(t.errors)return this.lastValidationResult=!1,this.lastValidationTime=Date.now(),!1;let i=t.data?.validSession?.success===!0;return this.lastValidationResult=i,this.lastValidationTime=Date.now(),i}catch(e){return console.error("SessionController: Error validating session",e),this.lastValidationResult=!1,this.lastValidationTime=Date.now(),!1}finally{this.isValidating=!1}}clearCache(){this.lastValidationResult=null,this.lastValidationTime=null}}(B,window,document),Z=new class extends m{constructor(e,t,r){super(e,t,r),this.consentListener=null,this.eventName=null}destroy(){this.consentListener&&this.eventName&&(this.document.removeEventListener(this.eventName,this.consentListener),this.consentListener=null)}loadScript(){this.document.getElementById("posthog-script")||this.window.luxuryPresence.eventBus.initialize({enabled:this.config.eventBus?.enabled}),this.document.getElementById("divolte-script")||this.window.luxuryPresence.divolte.initialize({})}removeScripts(){this.window.luxuryPresence?.eventBus?.destroy?.(),this.window.luxuryPresence?.divolte?.destroy?.(),this.document.getElementById("posthog-script")?.remove(),this.document.getElementById("divolte-script")?.remove()}async initialize(e={}){let t=I[e.provider];if(!t)return;this.eventName=t.eventName;let r=await this.window.luxuryPresence.session.validateSession();(t.hasAnalyticsConsent(this.document,this.window)||r)&&this.loadScript(),this.consentListener||(this.consentListener=e=>{t.isAnalyticsAccepted(e.detail)?this.loadScript():this.removeScripts()},this.document.addEventListener(t.eventName,this.consentListener))}}(B,window,document),ee=new class extends m{destroy(){}transformVariables(e,t){let r;return x(r={...t},["testimonialId"]),R(r,["testimonialId"],"testimonialIds"),0===r.limit&&delete r.limit,(void 0===r.limit||null===r.limit)&&(("testimonials"===e||"testimonialsCount"===e)&&(r.limit=50),("agents"===e||"agentsCount"===e||"developments"===e||"developmentsCount"===e||"neighborhoods"===e||"neighborhoodsCount"===e||"posts"===e||"postsCount"===e||"pressReleases"===e||"pressReleasesCount"===e)&&(r.limit=100)),!function(e){let{sortDir:t}=e;"string"==typeof t&&t.includes("_")&&(e.sortDir=t.replace(/_/g," "))}(r),!function(e,t){switch(t){case"agent":break;case"testimonials":case"testimonialsCount":x(e,["testimonialIds"]);break;case"agents":case"agentsCount":x(e,["officeId","teamId","developmentId","agentIds","tags"]),R(e,["officeId"],"officeIds"),R(e,["teamId"],"teamIds"),R(e,["developmentId"],"developmentIds");break;case"neighborhoods":case"neighborhoodsCount":x(e,["neighborhoodIds","neighborhoodId"]),R(e,["neighborhoodIds","neighborhoodId"],"neighborhoodId");break;case"developments":case"developmentsCount":x(e,["agentId","neighborhoodIds","neighborhoodId","developmentIds","tag"]),e.agentId&&Array.isArray(e.agentId)&&([e.agentId]=e.agentId),R(e,["neighborhoodIds","neighborhoodId"],"neighborhoodIds"),R(e,["developmentIds","developmentId"],"developmentIds");break;case"properties":case"propertiesCount":x(e,["statusIds","statusId","propertyTypeIds","propertyTypeId","propertyId","networkId","propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","
2060spaceTypeIds","addressState","addressCity","backfillProviders","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"]),["propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","spaceTypeIds","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"].forEach(t=>R(e,[t],t)),R(e,["statusIds","statusId"],"propertyStatusId"),e.excludeStatusId&&(e.excludePropertyStatusId=e.excludeStatusId,delete e.excludeStatusId),R(e,["propertyTypeIds","propertyTypeId"],"propertyTypeId"),R(e,["networkId"],"networkId"),R(e,["propertyId"],"propertyIds"),["salesPriceGTE","salesPriceLTE","leasePriceGTE","leasePriceLTE","livingSpaceSizeGTE","livingSpaceSizeLTE"].forEach(t=>{null!=e[t]&&(e[t]=Math.trunc(Number(e[t])))});break;case"posts":case"postsCount":x(e,["categoryIds","categoryId","neighborhoodId"]),void 0!==e.order&&(e.sort=e.order,delete e.order),R(e,["categoryIds","categoryId"],"categoryId");break;case"postCategories":x(e,["categoryId","categoryIds"]),void 0!==e.order&&(e.sort=e.order,delete e.order),R(e,["categoryIds","categoryId"],"categoryId");break;case"pressReleases":case"pressReleasesCount":x(e,["pressReleaseId","categories","propertyId","developmentId","agentId","teamId"]),R(e,["pressReleaseId"],"pressReleaseIds");break;case"offices":case"officesCount":x(e,["officeId","officeIds","tags"]),R(e,["officeId"],"officeIds");break;case"teams":case"teamsCount":x(e,["teamId","teamIds"]),R(e,["teamId"],"teamIds");break;case"pois":x(e,["categories"]),Array.isArray(e.categories)&&(e.categories=e.categories.map(e=>e.toLowerCase())),"string"==typeof e.sortBy&&(e.sortBy=e.sortBy.toLowerCase())}}(r,e),r}transformResponse(e,t){return"agent"===e?P(t,T):"agents"===e||"agentsCount"===e?O(t,L):"neighborhood"===e?P(t,k):"neighborhoods"===e||"neighborhoodsCount"===e?O(t,M):"development"===e?P(t,$):"developments"===e||"developmentsCount"===e?O(t,U):t}transformPage(e){return{items:e&&e.items||[],count:e&&e.total||0}}applyPropertyDisclaimers(t,r){if(!Array.isArray(t)||!t.length||!r||!r.length)return Promise.resolve(t);let i=t.filter(e=>e&&e.vendorId&&e.mlsId).map(e=>({feedId:e.vendorId,listingId:e.mlsId,officeName:e.officeName??null,agentMlsId:e.mlsAgentId??null,officeMlsId:e.mlsOfficeId??null,attributionContact:e.attributionContact??null,status:e.status??null,syncedAt:e.syncedAt??null})),s=e=>{let i={};return(e||[]).forEach(e=>{i[`${e.feedId}:${e.listingId}`]=e}),t.map(e=>{let t=e&&i[`${e.vendorId}:${e.mlsId}`],s={};return r.forEach(e=>{let r=t?t[D[e]]:void 0;s[e]=r??null}),{...e,...s}})};if(!i.length)return Promise.resolve(s([]));let{websiteId:o}=this.config;return this.window.superagent?this.window.superagent.post(`${this.window.luxuryPresence.defaults.routerUrl}/graphql`).withCredentials().send({query:e(N),variables:{input:{websiteId:"string"==typeof o?o:void 0,properties:i}}}).then(e=>s(e.body&&e.body.data&&e.body.data.propertyDisclaimers),e=>(console.warn("[RouterApiController] propertyDisclaimers lookup failed:",e),s([]))):Promise.resolve(s([]))}}(B,window,document),et=new class extends m{constructor(e,t,r){super(e,t,r),this.natives=new WeakMap,this.rates=new Map,this.pending=new Map,this.target=void 0,this.generation=0,this.initialized=!1,this.observer=null,this.abortController=null}get currentCurrency(){return this.target}get cookieOptions(){return{document:this.document,location:this.window.location}}get enabledCurrencies(){return(this.config.enabledCurrencies??[]).map(F.toSupportedToCurrency).filter(Boolean)}initialize(){return this.initialized||!this.config.currencyConversionEnabled?Promise.resolve():(this.initialized=!0,this.generation=0,this.abortController=new this.window.AbortController,this.target=(0,F.readValidCurrencyCookie)(this.cookieOptions,{enabled:!0,enabledCurrencies:this.enabledCurrencies}),this.observer=new this.window.MutationObserver(()=>this.ensureRates(this.apply())),this.observer.observe(this.document.body,{childList:!0,subtree:!0}),this.ensureRates(this.apply()))}setCurrency(e){if(!this.config.currencyConversionEnabled)return!1;let t=(0,F.toSupportedToCurrency)(e);return!!t&&!!this.enabledCurrencies.includes(t)&&(this.target=t,this.generation+=1,(0,F.writeCurrencyCookie)(this.cookieOptions,t)||console.warn("[CurrencyConversionController] could not persist currency preference:",t),this.apply(),!0)}reset(){this.config.currencyConversionEnabled&&(this.target=void 0,this.generation+=1,(0,F.clearCurrencyCookie)(this.cookieOptions),this.apply())}destroy(){this.observer?.disconnect(),this.observer=null,this.abortController?.abort(),this.abortController=null,this.pending.clear(),this.rates.clear(),this.generation=null,this.initialized=!1}apply(){let e=new Set;return this.document.querySelectorAll("[data-lp-price]").forEach(t=>{let r=this.natives.get(t);if(!r){if(!(r=(e=>{let t=e.getAttribute("data-lp-native-amount"),r=null===t||""===t.trim()?NaN:Number(t),i=(0,F.toSupportedFromCurrency)(e.getAttribute("data-lp-native-currency"));if(!Number.isFinite(r)||r<0||!i)return;let s=Number(e.getAttribute("data-lp-precision"));return{amount:r,currency:i,precision:Number.isInteger(s)&&s>=0?s:0,originalHTML:e.innerHTML}})(t)))return;this.natives.set(t,r)}this.rates.has(r.currency)||e.add(r.currency),this.render(t,r)}),[...e]}render(e,t){let r=this.convertedText(t);if(void 0===r){e.innerHTML!==t.originalHTML&&(e.innerHTML=t.originalHTML);return}e.textContent!==r&&(e.textContent=r)}convertedText(e){if(!this.target||this.target===e.currency)return;let t=this.rates.get(e.currency)?.[this.target];
2060if("number"!=typeof t||!Number.isFinite(t))return;let r=(0,F.convertAmount)(e.amount,t);if(void 0!==r)return(0,F.formatMoney)(r,this.target,{precision:e.precision})}ensureRates(e){return e.length?Promise.all(e.map(e=>this.requestRates(e))).then(()=>{null!==this.generation&&this.apply()}):Promise.resolve()}requestRates(e){let t=this.pending.get(e);if(t)return t;let r=this.abortController?.signal,i=(0,F.fetchExchangeRates)(e,{baseUrl:this.config.valuationApiBase,signal:r,onError:t=>console.warn(`[CurrencyConversionController] exchange rate fetch failed for ${e}:`,t)}).then(t=>{r?.aborted||this.rates.set(e,t??{})});return this.pending.set(e,i),i}}(B,window,document);function er(e,t){if(window.luxuryPresence[e])try{window.luxuryPresence[e].destroy()}catch(e){console.log(e)}window.luxuryPresence[e]=t}er("config",B),er("modals",q),er("buttons",V),er("validation",j),er("contactForms",H),er("mapApiLoader",G),er("pagination",K),er("expandSliders",Y),er("divolte",z),er("eventBus",W),er("oauth",Q),er("qualifyingQuestionsModal",J),er("session",X),er("consent",Z),er("redirects",{checkHstRedirect:function(e){let{config:t}=window.luxuryPresence;return!t.hvStepTwoCaptureEnabled&&!!t.hstValuationRedirectEnabled&&!!t.mlsEnabled&&!!t.myhomeDashboardEnabled&&(window.location.href=`/home-search/home-valuation?address=${encodeURIComponent(e)}`,!0)},destroy(){}}),er("routerApi",ee),er("currencyConversion",et),window.luxuryPresence.formatSliderPriceRange=K.formatSliderPriceRange.bind(K),window.luxuryPresence.formatSliderAreaRange=K.formatSliderAreaRange.bind(K),window.luxuryPresence.getSearchFormValues=K.getSearchFormValues.bind(K),window.luxuryPresence.handlebarsHelpersFactory=function(t){return e(n)(t,{isEqual:(e,t)=>e==t})}})(); 2061//# sourceMappingURL=lp-sdk.js.map 2062 2063 </script>
2063 2064 2065
2065<script> 2066 var lpGlobalInitialized = false; 2067 2068 function lpGlobalInit () { 2069 if (lpGlobalInitialized) { 2070 return; 2071 } 2072 lpGlobalInitialized = true; 2073 // Initialize wow animation plugin only according to turbolinks 2074 var wow; 2075 if (window.WOW) { 2076 wow = new WOW({ 2077 animateClass: 'animated', 2078 offset: wowOffset, 2079 live: false, 2080 callback: function(box) {} 2081 }); 2082 } 2083 // Initialize handlebar helpers only once 2084 function handlebarsInit() { 2085 if (!window.Handlebars) { 2086 return; 2087 } 2088 HandlebarsIntl.registerWith(Handlebars); 2089 Handlebars.registerHelper(window.luxuryPresence.handlebarsHelpersFactory(Handlebars)); 2090 } 2091 2092 handlebarsInit(); 2093 2094 var modalContentUrl = "/modals.html"; 2095 const modalsContainer = document.getElementById('modals'); 2096 if (modalsContainer) { 2097 fetch(modalContentUrl).then(function(res) { 2098 if (!res.ok) { 2099 throw new Error(`HTTP error! Status: ${res.status}`); 2100 } 2101 return res.text(); 2102 }).then(function(resultText) { 2103 modalsContainer.innerHTML = resultText; 2104 2105 // now we need to execute all script elements 2106 Array.from(modalsContainer.getElementsByTagName('script')).forEach(function (s) { 2107 const script = document.createElement("script"); 2108 script.text = s.innerHTML; 2109 Array.from(s.attributes).forEach(function (a) { 2110 script.setAttribute(a.name, a.value); 2111 }) 2112 s.parentNode.replaceChild(script, s); 2113 }); 2114 2115 try { 2116 window.luxuryPresence.modals.initialize(window.luxuryPresence._modalIncludes); 2117 window.luxuryPresence.contactForms.initialize({ selector: '#modals' }); 2118 window.luxuryPresence.validation.initialize({ selector: '#modals' }); 2119 window.luxuryPresence.oauth.initialize({ 2120 googleSignOnEnabled: true, 2121 iframe: false }); 2122 } catch (e) { 2123 console.log(e); 2124 } 2125 document.querySelectorAll('.modals > .modal .close').forEach(closeModalBtn => { 2126 closeModalBtn.addEventListener('click', function() { 2127 window.lpUI.hideClosestModal(closeModalBtn); 2128 }); 2129 }); 2130 }).catch((e) => console.log(e)); 2131 } 2132 /* Initialize Luxury Presence SDK */ 2133 try { 2134 window.luxuryPresence.config.setCompany("7ac07672-b054-446c-a74a-437d501f555c", {}); 2135 window.luxuryPresence.config.setWebsite("cabbe5a3-1336-4a26-afab-bb421f339f1d", { 2136 myhomeDashboardEnabled: true, 2137 mlsEnabled: true, 2138 hstValuationRedirectEnabled: true, 2139 hvStepTwoCaptureEnabled: false 2140 }); 2141 const url = new URL(window.location.href); 2142 const shareId = url.searchParams.get('shareId'); 2143 window.luxuryPresence.config.setPage("df64a2db-7427-4b2c-991d-64e4d12ee178", { 2144 sourceResource: "", 2145 pageElementId: "", 2146 pageQueryVariables: {}, 2147 shareId: "", 2148 }); 2149 window.luxuryPresence.config.setWebsiteApiGatewayUrl("https://wgw.luxurypresence.com", {}); 2150 window.luxuryPresence.config.setBuyerSellerServiceUrl("https://bss.luxurypresence.com", {}); 2151 window.luxuryPresence.config.setDivolteServiceUrl("https://t.luxurypresence.com", {}); 2152 window.luxuryPresence.config.setEventBusUrl("https://cdn.luxurypresence.com/scripts/event-bus-js", {}); 2153 window.luxuryPresence.config.setEventBus({ 2154 enabled: true, 2155 apiKey: "phc_PMYT31xlmXBaTCwpIRx1v6RrpLVZIuP47N3mOT6KLnr", 2156 url: "https://p.luxurypresence.com", 2157 }); 2158 window.luxuryPresence.config.setTemplateId("1d3967df-14f2-449d-87b7-bd68bf93906f", {}); 2159 window.luxuryPresence.config.setLeadIngesterUrl("https://leads.luxurypresence.com", {}); 2160 window.luxuryPresence.buttons.initialize({}); 2161 window.luxuryPresence.consent.initialize({ provider: 'lp-consent' }); 2162 window.luxuryPresence.contactForms.initialize({}); 2163 window.luxuryPresence.validation.initialize({}); 2164 window.luxuryPresence.expandSliders.initialize({}); 2165 window.luxuryPresence.oauth.initialize({ googleSignOnEnabled: true, iframe: false }); 2166 window.luxuryPresence.qualifyingQuestionsModal.initialize({ qualifyingQuestionsModalEnabled: true }); 2167 /* Optional: cached pages / older SDKs may not carry this controller */ 2168 window.luxuryPresence.currencyConversion?.initialize(); 2169 } catch (e) { 2170 console.log(e); 2171 } 2172 2173 /* Inject Section Specific Javascript */ 2174 try { 2175(function init(sectionDomId) { 2176 const section = document.getElementById(sectionDomId); 2177 const contactTitle = section.querySelector('.js-contact-title'); 2178 const emailInput = section.querySelector('.js-email-input'); 2179 const emailRegex = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~\-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+/; 2180 emailInput.addEventListener('input', function () { 2181 if (emailRegex.test(this.value)) { 2182 this.setCustomValidity(''); 2183 } else { 2184 this.setCustomValidity('Please enter a valid email address.'); 2185 } 2186 this.reportValidity(); 2187 }); 2188 const inputName = section.querySelector('.js-input-name'); 2189 inputName.addEventListener('keyup', function () { 2190 if (this.value.replaceAll(/\d/g, "").trim().split(" ").length < 2 || this.value.replaceAll(/\d/g, "").trim() === "") { 2191 this.setCustomValidity("Please input your first name and last name."); 2192 } else { 2193 this.setCustomValidity(""); 2194 } 2195 }); 2196 function setHttp(link) { 2197 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 2198 link = 'https://' + link; 2199 } 2200 return link; 2201 } 2202 const socialLinks = section.querySelectorAll('.lp-socials__link, .contact-form-modal-details__socials-l
2202ink'); 2203 socialLinks.forEach(linkElement => { 2204 const href = linkElement.getAttribute('href'); 2205 if (href) { 2206 linkElement.setAttribute('href', setHttp(href)); 2207 } 2208 }); 2209 if (contactTitle.length < 1) return; 2210 let words = contactTitle.textContent.split(" "); 2211 if (words.length > 1) { 2212 contactTitle.innerHTML = `<span class="contact__title-top">${words[0]} </span><span class="contact__title-bottom">${words.splice(1).join(" ")}</span>`; 2213 } 2214 const addRedirectToForm = () => { 2215 const redirectLink = document.getElementById(`${sectionDomId}`).querySelector('.js-redirect-link'); 2216 const form = document.getElementById(`${sectionDomId}`).querySelector('.js-form'); 2217 function redirectPage(link) { 2218 if (link) { 2219 const rawHref = link.getAttribute('href'); 2220 link.setAttribute('href', setHttp(rawHref)); 2221 link.click(); 2222 } 2223 } 2224 function setHttp(link) { 2225 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 2226 link = 'http://' + link; 2227 } 2228 return link; 2229 } 2230 form.addEventListener("reset", function () { 2231 redirectPage(redirectLink); 2232 }); 2233 }; 2234 addRedirectToForm(); 2235})('modal-global-contact-us'); 2236} catch(e) { 2237console.log(e); 2238} 2239 2240 try { 2241(function init(sectionDomId) { 2242 (function () { 2243 const observer = new IntersectionObserver(entries => { 2244 entries.forEach(entry => { 2245 if (entry.isIntersecting) entry.target.classList.add('is-in-viewport'); 2246 }); 2247 }, { 2248 threshold: 0.5 2249 }); 2250 const initialElements = document.querySelectorAll('[data-animate="true"]'); 2251 initialElements.forEach(element => observer.observe(element)); 2252 const container = document.querySelector('.data-container'); 2253 if (container) { 2254 const mutationObserver = new MutationObserver(mutations => { 2255 mutations.forEach(mutation => { 2256 if (mutation.type === 'childList') { 2257 mutation.addedNodes.forEach(node => { 2258 if (node.nodeType === 1 && node.getAttribute('data-animate') === 'true') observer.observe(node); 2259 }); 2260 } 2261 }); 2262 }); 2263 mutationObserver.observe(container, { 2264 childList: true, 2265 subtree: true 2266 }); 2267 } 2268 })(); 2269 const sectionSelector = document.getElementById(sectionDomId); 2270 const searchToggleSelector = sectionSelector.querySelector('.js-search-toggle-btn'); 2271 const searchWrapperSelector = sectionSelector.querySelector('.js-header-search'); 2272 const header = sectionSelector.querySelector('.js-header'); 2273 let lastScrollTop = 0; 2274 (function (stickyAnchorRoot) { 2275 if (!stickyAnchorRoot) return; 2276 function getInFlowTop(target) { 2277 var inlineValue = target.style.getPropertyValue('position'); 2278 var inlinePriority = target.style.getPropertyPriority('position'); 2279 target.style.setProperty('position', 'relative', 'important'); 2280 var top = target.getBoundingClientRect().top + window.pageYOffset; 2281 if (inlineValue) target.style.setProperty('position', inlineValue, inlinePriority);else target.style.removeProperty('position'); 2282 var scrollMarginTop = parseFloat(window.getComputedStyle(target).scrollMarginTop) || 0; 2283 return Math.max(0, top - scrollMarginTop); 2284 } 2285 stickyAnchorRoot.addEventListener('click', function (event) { 2286 if (event.defaultPrevented || event.button !== 0) return; 2287 if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; 2288 if (document.body.hasAttribute('data-scroll-container')) return; 2289 var link = event.target.closest('a[href]'); 2290 if (!link || !stickyAnchorRoot.contains(link) || link.target === '_blank') return; 2291 var href = link.getAttribute('href'); 2292 if (!/^#[^#]/.test(href)) return; 2293 var targetId; 2294 try { 2295 targetId = decodeURIComponent(href.slice(1)); 2296 } catch (e) { 2297 return; 2298 } 2299 var target = document.getElementById(targetId); 2300 if (!target || window.getComputedStyle(target).position !== 'sticky') return; 2301 event.preventDefault(); 2302 if (window.location.hash !== href) window.history.pushState(null, '', href); 2303 window.requestAnimationFrame(function () { 2304 window.scrollTo({ 2305 top: getInFlowTop(target) 2306 }); 2307 }); 2308 }); 2309 })(document.getElementById(sectionDomId)); 2310 const subNavOpeners = sectionSelector.querySelectorAll('.js-subnav-opener');
2311 subNavOpeners.forEach(opener => { 2312 opener.addEventListener('click', function (e) { 2313 e.preventDefault(); 2314 e.stopPropagation(); 2315 const parent = opener.parentElement; 2316 subNavOpeners.forEach(otherOpener => { 2317 if (otherOpener !== opener) { 2318 otherOpener.parentElement.classList.remove('header-navigation__item--sub-nav--opened'); 2319 } 2320 }); 2321 parent.classList.toggle('header-navigation__item--sub-nav--opened'); 2322 }); 2323 }); 2324 document.addEventListener('click', function (e) { 2325 if (!e.target.closest('.js-subnav-opener') && !e.target.closest('.header-navigation__item--sub-nav--opened')) { 2326 subNavOpeners.forEach(opener => { 2327 opener.parentElement.classList.remove('header-navigation__item--sub-nav--opened'); 2328 }); 2329 } 2330 }); 2331 function initHeaderColors() { 2332 try { 2333 var colorStr = window.getComputedStyle(header).getPropertyValue("--backgroundColor"); 2334 var bgColor = makeColor(colorStr); 2335 var isDark = (bgColor.rgba.r * 299 + bgColor.rgba.g * 587 + bgColor.rgba.b * 114) / 1000 < 128; 2336 sectionSelector.classList.add('is-background-color-' + (isDark ? 'dark' : 'light')); 2337 } catch (e) {} 2338 } 2339 function makeColor(str) { 2340 var color = { 2341 rgba: { 2342 r: 0, 2343 g: 0, 2344 b: 0, 2345 a: 0 2346 } 2347 }; 2348 if (str && str.match) { 2349 var m = str.match(/rgba?\s*\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\.0-9]+))?\)/); 2350 if (m) { 2351 color.rgba.r = parseInt(m[1]); 2352 color.rgba.g = parseInt(m[2]); 2353 color.rgba.b = parseInt(m[3]); 2354 color.rgba.a = parseFloat(m[4]); 2355 if (isNaN(color.rgba.a)) { 2356 color.rgba.a = 1; 2357 } 2358 } 2359 } 2360 return color; 2361 } 2362 initHeaderColors(); 2363 var navEl = document.querySelector('nav > header') || document.querySelector('nav'); 2364 var navbarHeight = navEl ? navEl.offsetHeight : 0; 2365 if (navEl) { 2366 if (window.ResizeObserver) { 2367 new ResizeObserver(function (entries) { 2368 if (!entries.length) return; 2369 navbarHeight = entries[0].target.offsetHeight; 2370 }).observe(navEl); 2371 } else { 2372 window.addEventListener('resize', function () { 2373 navbarHeight = navEl.offsetHeight; 2374 }); 2375 } 2376 } 2377 function isLocomotiveActive() { 2378 return document.body.hasAttribute('data-scroll-container'); 2379 } 2380 function updateHeaderVisibility(currentScrollTop) {
2381 if (!searchWrapperSelector || searchWrapperSelector.style.display !== 'block') { 2382 if (currentScrollTop === 0) header.classList.remove('header--hide');else if (currentScrollTop > lastScrollTop) header.classList.add('header--hide');else header.classList.remove('header--hide'); 2383 } 2384 lastScrollTop = currentScrollTop; 2385 } 2386 function customHeaderHideShow(currentScrollTop) { 2387 if (!navEl) return; 2388 if (currentScrollTop > 0) { 2389 navEl.classList.add('scroll'); 2390 } else { 2391 navEl.classList.remove('scroll'); 2392 } 2393 if (currentScrollTop > lastScrollTop && currentScrollTop > navbarHeight) { 2394 document.documentElement.style.setProperty('--global-header-height', '0px'); 2395 } else { 2396 document.documentElement.style.setProperty('--global-header-height', navbarHeight + 'px'); 2397 } 2398 } 2399 window.addEventListener('scroll', function () { 2400 if (isLocomotiveActive()) return; 2401 var currentScrollTop = window.scrollY || document.documentElement.scrollTop; 2402 updateHeaderVisibility(currentScrollTop); 2403 }); 2404 var isTicking = false; 2405 var latestLocoScrollY = 0; 2406 window.addEventListener('locomotive-scroll', function (e) { 2407 latestLocoScrollY = e.detail.scrollY; 2408 if (!isTicking) { 2409 window.requestAnimationFrame(function () { 2410 customHeaderHideShow(latestLocoScrollY); 2411 updateHeaderVisibility(latestLocoScrollY); 2412 isTicking = false; 2413 }); 2414 isTicking = true; 2415 } 2416 }); 2417 if (searchToggleSelector !== null) { 2418 searchToggleSelector.addEventListener('click', function () { 2419 if (searchWrapperSelector.style.display === 'block') { 2420 searchWrapperSelector.style.display = 'none'; 2421 } else { 2422 searchWrapperSelector.style.display = 'block'; 2423 header.classList.remove('header--hide'); 2424 } 2425 }); 2426 document.addEventListener('click', function (evt) { 2427 if (!searchToggleSelector.contains(evt.target) && !searchWrapperSelector.contains(evt.target)) searchWrapperSelector.style.display = 'none'; 2428 }); 2429 } 2430 window.luxuryPresence.mapApiLoader.load().then(() => {
2431 if (!searchWrapperSelector) return; 2432 const templateHTML = sectionSelector.querySelector('.js-card-template')?.innerHTML; 2433 const itemTemplate = templateHTML && Handlebars.compile(templateHTML); 2434 const searchMls = searchWrapperSelector.dataset.searchMls === 'true'; 2435 const searchProperties = searchWrapperSelector.dataset.searchProperties === 'true'; 2436 const selectedCountries = searchWrapperSelector.dataset.locations; 2437 const searchInputSelector = sectionSelector.querySelector('.js-header-search-input'); 2438 const searchIconSelector = sectionSelector.querySelector('.js-header-btn-search'); 2439 const closeIconSelector = sectionSelector.querySelector('.js-header-btn-close'); 2440 const searchResultsSelector = sectionSelector.querySelector('.js-header-search-results-holder'); 2441 const resultsContainerSelector = sectionSelector.querySelector('.js-header-results-container'); 2442 const loaderSelector = sectionSelector.querySelector('.js-header-spinner'); 2443 const predefinedSelector = sectionSelector.querySelector('.js-header-search-results-predefined'); 2444 const nothingFoundSelector = sectionSelector.querySelector('.js-header-spinner-nothing-found'); 2445 const service = new google.maps.places.AutocompleteService(); 2446 const geocoder = new google.maps.Geocoder(); 2447 var keyword; 2448 var leasePropertyState = false; 2449 var leasePropertySearched; 2450 var isLoading = false; 2451 var newSearchTimer; 2452 var placesResult = {}; 2453 function updateSearchDisplay() { 2454 var hasResults = !!resultsContainerSelector.innerHTML; 2455 var hasPredefined = predefinedSelector.querySelectorAll('a:not(.not-processed)').length > 0; 2456 nothingFoundSelector.style.display = 'none'; 2457 if (hasResults) { 2458 predefinedSelector.style.display = 'none'; 2459 loaderSelector.style.display = 'none'; 2460 resultsContainerSelector.style.display = 'block'; 2461 } else if (isLoading) { 2462 resultsContainerSelector.style.display = 'none'; 2463 predefinedSelector.style.display = 'none'; 2464 loaderSelector.style.display = 'block'; 2465 } else if (hasPredefined) { 2466 resultsContainerSelector.style.display = 'none'; 2467 loaderSelector.style.display = 'none'; 2468 predefinedSelector.style.display = 'block'; 2469 } else { 2470 resultsContainerSelector.style.display = 'none'; 2471 loaderSelector.style.display = 'none'; 2472 predefinedSelector.style.display = 'none'; 2473 if (keyword) nothingFoundSelector.style.display = 'block'; 2474 } 2475 } 2476 function moveSelection(up) { 2477 var count = resultsContainerSelector.innerHTML ? resultsContainerSelector : predefinedSelector; 2478 var links = count.querySelectorAll('.results-link'); 2479 if (!links.length) return; 2480 var idx = -1; 2481 links.forEach((link, i) => { 2482 if (idx === -1 && link.classList.contains('header-search-results__link--selected')) idx = i; 2483 }); 2484 var newIdx; 2485 if (up) { 2486 newIdx = idx - 1; 2487 if (newIdx < 0) newIdx = links.length - 1; 2488 } else { 2489 newIdx = idx + 1; 2490 if (newIdx > links.length - 1) newIdx = 0; 2491 } 2492 if (newIdx !== idx) { 2493 searchResultsSelector.querySelector('.header-search-results__link--selected')?.classList.remove('header-search-results__link--selected'); 2494 links[newIdx].classList.add('header-search-results__link--selected'); 2495 } 2496 } 2497 function startSearch() { 2498 const term = searchInputSelector.value; 2499 if (term === keyword && leasePropertySearched === leasePropertyState) return; 2500 leasePropertySearched = leasePropertyState; 2501 keyword = term; 2502 if (term) doSearch(term, leasePropertySearched);else setResults(null); 2503 } 2504 function mlsSearch(term) { 2505 var query = { 2506 omnibox: term, 2507 limit: 5 2508 }; 2509 return superagent.get(window.location.protocol + '//' + window.location.host + '/home-search/listings.json').query(query).then(function (res) { 2510 if (!Array.isArray(res.body)) return []; 2511 return res.body.map(function (item) { 2512 return { 2513 id: item.id, 2514 display_address: [item.address_1, item.city, [item.state, item.postal_code].filter(function (i) { 2515 return i; 2516 }).join(' ')].filter(function (i) { 2517 return i; 2518 }).join(', ') 2519 }; 2520 }); 2521 }, function (e) { 2522 console.log(e); 2523 return []; 2524 }); 2525 } 2526 function resolveGeoBounds(placeId, description) { 2527 return new Promise(function (resolve, reject) { 2528 geocoder.geocode({ 2529 'placeId': placeId 2530 }, function (results, status) { 2531 if (status != 'OK') return resolve(null); 2532 var result = results[0]; 2533 var bounds = new google.maps.LatLngBounds();
2534 bounds.extend(result.geometry.viewport.getSouthWest()); 2535 bounds.extend(result.geometry.viewport.getNorthEast()); 2536 result.geometry.bounds = bounds.toJSON(); 2537 var placeUrl = window.luxuryPresence.makeMlsLink(result); 2538 return resolve({ 2539 placeUrl: placeUrl, 2540 description: description 2541 }); 2542 }); 2543 }); 2544 } 2545 function addRestrictions(request) { 2546 switch (selectedCountries) { 2547 case 'Worldwide': 2548 return request; 2549 case 'US & Canada': 2550 request.componentRestrictions = { 2551 country: ['us', 'ca'] 2552 }; 2553 return request; 2554 default: 2555 request.componentRestrictions = { 2556 country: 'us' 2557 }; 2558 return request; 2559 } 2560 } 2561 function resolveAutocomplete(term, deeper) { 2562 var request = addRestrictions({ 2563 input: term, 2564 types: deeper ? ['geocode'] : ['(regions)'], 2565 limit: 1 2566 }); 2567 return new Promise(function (resolve, reject) { 2568 service.getPlacePredictions(request, function (results, status) { 2569 if (status !== google.maps.places.PlacesServiceStatus.OK) { 2570 resolve(null); 2571 return; 2572 } 2573 if (!Array.isArray(results)) { 2574 resolve(null); 2575 return; 2576 } 2577 if (deeper) { 2578 var allowedTypes = { 2579 'neighborhood': true, 2580 'administrative_area_level_3': true, 2581 'administrative_area_level_4': true, 2582 'administrative_area_level_5': true, 2583 'sublocality_level_1': true, 2584 'sublocality_level_2': true, 2585 'sublocality_level_3': true 2586 }; 2587 results = results.filter(function (res) { 2588 return res.types.find(t => allowedTypes[t]); 2589 }); 2590 } 2591 if (!results.length) { 2592 resolve(null); 2593 return; 2594 } 2595 resolve(results); 2596 }); 2597 }); 2598 } 2599 function placesSearch(term, ignoreInput) { 2600 if (placesResult.term !== term) { 2601 placesResult = { 2602 term: term, 2603 result: resolveAutocomplete(term).then(function (results) { 2604 if (!ignoreInput && term !== keyword) return null; 2605 if (ignoreInput && !results) return resolveAutocomplete(term, true); 2606 return results; 2607 }).then(function (results) { 2608 if (!ignoreInput && term !== keyword || !results) return []; 2609 var geoResultPromises = results.map(function (result) { 2610 return resolveGeoBounds(result.place_id, result.description); 2611 }); 2612 return Promise.all(geoResultPromises).then(function (geoLinks) { 2613 return geoLinks.filter(function (i) { 2614 return i; 2615 }).slice(0, 3); 2616 }); 2617 }) 2618 }; 2619 } 2620 return placesResult.result; 2621 } 2622 function propertiesSearch(term) { 2623 var payload = { 2624 companyId: window.luxuryPresence.defaults.companyId, 2625 search: term, 2626 offset: 0, 2627 limit: 4, 2628 statusIds: ["5f528253-abb7-484e-95c3-330269ac1105", "959c11cf-8655-4f91-874c-292b0ab7ea6b", "a0012964-4f51-4430-abf8-6547c5ab6441", "df04ccbe-4621-4140-a504-ee1a17430bb7", "88b4ace6-f39b-4b25-a051-8f6dba976833", "96031d77-bbe5-4de3-90d8-1e4e70de8ca8"] 2629 }; 2630 var gqlQuery = 'query ($companyId: String, $search: String, $offset: Int, $limit: Int, $propertyStatusId: [String!]) {properties (companyId: $companyId, search: $search, offset: $offset, limit: $limit, propertyStatusId: $propertyStatusId) {items {id name slug fullAddress privateAddress status isPasswordProtected priceUponRequest salesPrice reducedPrice leasePrice currency media {smallUrl mediumUrl largeUrl xLargeUrl xxLargeUrl height width altTagText}}}}'; 2631 return superagent.post(window.luxuryPresence.defaults.routerUrl + '/graphql').send({ 2632 query: gqlQuery, 2633 variables: window.luxuryPresence.routerApi.transformVariables('properties', payload) 2634 }).then(function (res) { 2635 var page = (res.body.data || {}).properties; 2636 return page && page.items || []; 2637 }, function (err) { 2638 return []; 2639 }); 2640 } 2641 function doSearch(term, leaseProperty) { 2642 isLoading = true; 2643 updateSearchDisplay(); 2644 Promise.all([searchMls ? mlsSearch(term, leaseProperty) : [], searchMls ? placesSearch(term) : [], searchProperties ? propertiesSearch(term, leaseProperty) : []]).then(function (res) { 2645 if (term !== keyword) return; 2646 setResults(res[0], res[1], res[2], leaseProperty); 2647 }); 2648 } 2649 function makeResultsBlockHtml(title, elementClass, links) { 2650 if (!links || !links.length) return '';else return '<div class="header-search-results__block"><div class="header-search-results__title">' + title + '</div><div class="' + elementClass + '">' + links.join('') + '</div></div>'; 2651 } 2652 function setResults(mlsResults, placesResults, propertiesResults, leaseProperty) { 2653 searchResultsSelector.querySelector('.header-search-results__link--selected')?.classList.remove('header-search-results__link--selected'); 2654 isLoading = false;
2655 updateSearchDisplay(); 2656 if (!mlsResults) { 2657 resultsContainerSelector.innerHTML = ''; 2658 updateSearchDisplay(); 2659 return; 2660 } 2661 if (!mlsResults.length && !placesResults.length && !propertiesResults.length) { 2662 updateSearchDisplay(); 2663 return; 2664 } 2665 var propertiesHtml = makeResultsBlockHtml('Featured Properties', 'header-properties', propertiesResults.map(function (result) { 2666 return itemTemplate(result); 2667 })); 2668 var placesHtml = makeResultsBlockHtml('Locations', '', placesResults.map(function (result) { 2669 return `<a class="header-search-results__link lp-icon" href="${result.placeUrl}${leaseProperty ? '&lease_property=true' : ''}">${result.description}</a>`; 2670 })); 2671 var mlsHtml = makeResultsBlockHtml('Address', '', mlsResults.map(function (result) { 2672 return `<a href="/home-search/listings/${result.id}" class="header-search-results__link lp-icon">${result.display_address}</a>`; 2673 })); 2674 resultsContainerSelector.innerHTML = propertiesHtml + placesHtml + mlsHtml; 2675 updateSearchDisplay(); 2676 } 2677 var neighborhoods = null; 2678 function fetchNeighborhoods() { 2679 var url = window.luxuryPresence.defaults.routerUrl; 2680 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {neighborhoods (companyId: $companyId, offset: $offset, limit: $limit) {items {id, name, mlsLink, googlePlaceData}}}'; 2681 var payload = {}; 2682 payload.offset = 0; 2683 payload.limit = 100; 2684 payload.companyId = window.luxuryPresence.defaults.companyId; 2685 return superagent.post(url + '/graphql').withCredentials().send({ 2686 query: gqlQuery, 2687 variables: payload 2688 }).then(function (res) { 2689 var data = res.body.data && res.body.data.neighborhoods; 2690 neighborhoods = data && data.items || null; 2691 if (neighborhoods && !neighborhoods.length) { 2692 neighborhoods = null; 2693 } 2694 }); 2695 } 2696 function setPredefinedNeighborhoods() { 2697 return fetchNeighborhoods().then(function () { 2698 if (!neighborhoods) return; 2699 var placesHtml = makeResultsBlockHtml('Locations', neighborhoods.map(function (item) { 2700 return `<a class="header-search-results__link lp-icon" href="${item.mlsLink}${leasePropertyState ? '&lease_property=true' : ''}">${item.googlePlaceData && item.googlePlaceData.formatted_address || item.name}</a>`; 2701 })); 2702 predefinedSelector.innerHTML = placesHtml; 2703 updateSearchDisplay(); 2704 }); 2705 } 2706 if (searchMls) setPredefinedNeighborhoods(); 2707 closeIconSelector.style.opacity = '0'; 2708 closeIconSelector.style.pointerEvents = 'none'; 2709 searchInputSelector.setAttribute('inputmode', 'search'); 2710 searchInputSelector.addEventListener('input', function () { 2711 if (this.value === '') { 2712 closeIconSelector.style.opacity = '0'; 2713 closeIconSelector.style.pointerEvents = 'none'; 2714 searchIconSelector.style.opacity = '1'; 2715 searchIconSelector.style.pointerEvents = 'auto'; 2716 } else { 2717 closeIconSelector.style.opacity = '1'; 2718 closeIconSelector.style.pointerEvents = 'auto'; 2719 searchIconSelector.style.opacity = '0'; 2720 searchIconSelector.style.pointerEvents = 'none'; 2721 } 2722 window.clearTimeout(newSearchTimer); 2723 newSearchTimer = window.setTimeout(startSearch, 300); 2724 }); 2725 searchInputSelector.addEventListener('keydown', function (ev) { 2726 if (ev.which === 38) { 2727 ev.preventDefault(); 2728 moveSelection(true); 2729 return false; 2730 } 2731 if (ev.which === 40) { 2732 ev.preventDefault(); 2733 moveSelection(); 2734 return false; 2735 } 2736 if (ev.which === 13) { 2737 let $lnk = searchResultsSelector.querySelector('.header-search-results__link--selected'); 2738 if ($lnk) { 2739 $lnk.click(); 2740 searchActive = false; 2741 updateSearchDisplay(); 2742 } else { 2743 $searchBtn.click(); 2744 } 2745 } 2746 }); 2747 closeIconSelector.addEventListener('click', function () { 2748 searchInputSelector.value = ''; 2749 searchInputSelector.dispatchEvent(new Event('input')); 2750 searchActive = false;
2751 updateSearchDisplay(); 2752 }); 2753 searchResultsSelector.addEventListener('mouseenter', function (ev) { 2754 searchResultsSelector.querySelector('.header-search-results__link--selected')?.classList.remove('header-search-results__link--selected'); 2755 }); 2756 function outsideClickHandler(e) { 2757 if (searchWrapperSelector.contains(e.target)) return; 2758 searchActive = false; 2759 updateSearchDisplay(); 2760 } 2761 document.addEventListener('click', outsideClickHandler); 2762 }); 2763})('global-navbar'); 2764} catch(e) { 2765console.log(e); 2766} 2767 try { 2768(function init(sectionDomId, options) { 2769 var elementSelector = options.elementSelector || 'nav'; 2770 var element = document.querySelector(elementSelector); 2771 var sections = document.querySelectorAll('body > section'); 2772 var subNavContainers = element.querySelectorAll('.sub-nav'); 2773 var initialBackgroundColor = options.initialBackgroundColor || element.style.backgroundColor; 2774 var backgroundColorScroll = options.backgroundColorScroll || '#191919'; 2775 var fontColor = options.fontColor || '#fff'; 2776 var fontColorScroll = options.fontColorScroll || '#000'; 2777 var didScroll = false; 2778 var lastScrollTop = 0; 2779 var delta = 5; 2780 2781 // eslint-disable-next-line sonarjs/no-collapsible-if 2782 if (wow) { 2783 // Wowjs might not trigger for position fixed elements 2784 if (window.scrollY > 0) { 2785 element.querySelectorAll('.wow').forEach(el => wow.show(el)); 2786 } 2787 } 2788 function adjustNavPinState() { 2789 // Remove 'visible' class from all subNavContainers 2790 for (let i = 0; i < subNavContainers.length; i++) { 2791 subNavContainers[i].classList.remove('visible'); 2792 } 2793 if (window.scrollY > 0) { 2794 element.style.backgroundColor = backgroundColorScroll; 2795 element.style.color = fontColorScroll; 2796 element.classList.add('scroll'); 2797 } else { 2798 element.style.backgroundColor = initialBackgroundColor; 2799 element.style.color = fontColor; 2800 element.classList.remove('scroll'); 2801 } 2802 } 2803 adjustNavPinState(); 2804 function onScroll() { 2805 didScroll = true; 2806 } 2807 window.addEventListener('scroll', onScroll); 2808 2809 // eslint-disable-next-line 2810 var debounceInterval = setInterval(() => { 2811 if (didScroll) { 2812 // eslint-disable-next-line 2813 hasScrolled(); 2814 didScroll = false; 2815 } 2816 }, 250); 2817 function hasScrolled() { 2818 adjustNavPinState(); 2819 // eslint-disable-next-line 2820 var navbarHeight = element.offsetHeight; 2821 // eslint-disable-next-line 2822 var st = window.scrollY; 2823 2824 // Make sure they scroll more than delta 2825 if (Math.abs(lastScrollTop - st) <= delta) { 2826 return; 2827 } 2828 if (st > lastScrollTop && st > navbarHeight) { 2829 // Scroll Down 2830 element.style.transform = `translateY(-${navbarHeight}px) scaleY(0)`; 2831 document.documentElement.style.setProperty('--global-header-height', '0px'); 2832 2833 // Some sections "follow" the navbar with class sticky (i.e. Producer search) 2834 sections.forEach(section => { 2835 if (section.classList.contains('sticky')) { 2836 section.style.top = '0px'; 2837 } 2838 }); 2839 } else { 2840 // Scroll Up 2841 // eslint-disable-next-line 2842 if (st + window.innerHeight < document.documentElement.scrollHeight) { 2843 element.style.transform = `translateY(0) scaleY(1)`; 2844 document.documentElement.style.setProperty('--global-header-height', `${navbarHeight}px`); 2845 sections.forEach(section => { 2846 if (section.classList.contains('sticky')) { 2847 section.style.top = `${navbarHeight}px`; 2848 } 2849 }); 2850 } 2851 } 2852 lastScrollTop = st; 2853 } 2854})('NAVBAR', JSON.parse("{\"fontColor\":\"#161515\",\"elementSelector\":\".header\",\"fontColorScroll\":\"#fff\",\"backgroundColorScroll\":\"rgba(26,26,26, .8)\",\"initialBackgroundColor\":\"#fff\"}")); 2855} catch(e) { 2856console.log(e); 2857} 2858 try { 2859(function init(sectionDomId) { 2860 if (sectionDomId === "main-section") sectionDomId = "global-sidemenu"; 2861 (function (stickyAnchorRoot) { 2862 if (!stickyAnchorRoot) return; 2863 function getInFlowTop(target) { 2864 var inlineValue = target.style.getPropertyValue('position'); 2865 var inlinePriority = target.style.getPropertyPriority('position'); 2866 target.style.setProperty('position', 'relative', 'important'); 2867 var top = target.getBoundingClientRect().top + window.pageYOffset; 2868 if (inlineValue) target.style.setProperty('position', inlineValue, inlinePriority);else target.style.removeProperty('position'); 2869 var scrollMarginTop = parseFloat(window.getComputedStyle(target).scrollMarginTop) || 0; 2870 return Math.max(0, top - scrollMarginTop); 2871 } 2872 stickyAnchorRoot.addEventListener('click', function (event) { 2873 if (event.defaultPrevented || event.button !== 0) return; 2874 if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; 2875 if (document.body.hasAttribute('data-scroll-container')) return; 2876 var link = event.target.closest('a[href]'); 2877 if (!link || !stickyAnchorRoot.contains(link) || link.target === '_blank') return; 2878 var href = link.getAttribute('href'); 2879 if (!/^#[^#]/.test(href)) return; 2880 var targetId;
2881 try { 2882 targetId = decodeURIComponent(href.slice(1)); 2883 } catch (e) { 2884 return; 2885 } 2886 var target = document.getElementById(targetId); 2887 if (!target || window.getComputedStyle(target).position !== 'sticky') return; 2888 event.preventDefault(); 2889 if (window.location.hash !== href) window.history.pushState(null, '', href); 2890 window.requestAnimationFrame(function () { 2891 window.scrollTo({ 2892 top: getInFlowTop(target) 2893 }); 2894 }); 2895 }); 2896 })(document.getElementById(sectionDomId)); 2897 var sidemenu = document.getElementById(sectionDomId); 2898 var openers = sidemenu.querySelectorAll('.js-sub-nav-opener'); 2899 var items = sidemenu.querySelectorAll('.js-idemenu-navigation-item'); 2900 var watermark = document.querySelector('.js-sidemenu-watermark'); 2901 var onShow = function () { 2902 window.lpUI.requestScrollLock(sectionDomId); 2903 }; 2904 var onHide = function () { 2905 window.lpUI.releaseScrollLock(sectionDomId); 2906 }; 2907 sidemenu.addEventListener('lpui-show', onShow); 2908 sidemenu.addEventListener('lpui-hide', onHide); 2909 openers.forEach(function (opener) { 2910 opener.addEventListener('click', function (event) { 2911 event.preventDefault(); 2912 this.classList.toggle('sidemenu-navigation__link--active'); 2913 this.classList.toggle('sidemenu-navigation__link--sub-nav-active'); 2914 }); 2915 }); 2916 document.body.addEventListener('click', function (evt) { 2917 if (!evt.target.closest('.sidemenu') && !evt.target.closest('.js-sidemenu-opener')) { 2918 window.lpUI.sideMenuHide(); 2919 } 2920 }); 2921 const handleLinkClick = function (href) { 2922 if (href && href.match(/^#[^#].*$/)) { 2923 window.lpUI.sideMenuHide(); 2924 } 2925 }; 2926 const mainNavLinks = sidemenu.querySelectorAll('.sidemenu-navigation__link'); 2927 mainNavLinks.forEach(function (link) { 2928 link.addEventListener('click', function (event) { 2929 const href = this.getAttribute('href'); 2930 handleLinkClick(href); 2931 }); 2932 }); 2933 const subNavLinks = sidemenu.querySelectorAll('.sidemenu-navigation-sub-nav__link'); 2934 subNavLinks.forEach(function (link) { 2935 link.addEventListener('click', function (event) { 2936 const href = this.getAttribute('href'); 2937 handleLinkClick(href); 2938 }); 2939 }); 2940 if (watermark) { 2941 items.forEach(function (item, index) { 2942 item.setAttribute("data-id", index <= 9 ? "0" + (index + 1) : index + 1); 2943 }); 2944 items.forEach(function (item) { 2945 item.addEventListener('mouseenter', function () { 2946 watermark.setAttribute("data-id", item.getAttribute("data-id")); 2947 watermark.style.opacity = 1; 2948 }); 2949 item.addEventListener('mouseleave', function () { 2950 watermark.style.opacity = 0; 2951 }); 2952 }); 2953 } 2954})('global-sidemenu'); 2955} catch(e) { 2956console.log(e); 2957} 2958 2959 try { 2960(function init(sectionDomId) { 2961 const sectionDom = document.getElementById(sectionDomId); 2962 const backToTopBtn = sectionDom.querySelector('.js-back-to-top'); 2963 backToTopBtn?.addEventListener('click', () => { 2964 window.scrollTo({ 2965 top: 0, 2966 behavior: 'smooth' 2967 }); 2968 }); 2969})('global-footer'); 2970} catch(e) { 2971console.log(e); 2972} 2973 2974 try { 2975(function init(sectionDomId) { 2976 var _section = $('#' + sectionDomId); 2977 var _footer = document.getElementById('global-footer'); 2978 const redirectLink = _section.find('.js-redirect-link'); 2979 function setHttp(link) { 2980 if (link.search(/^(http[s]?\:\/\/|\/)/) == -1) { 2981 link = 'https://' + link; 2982 } 2983 return link; 2984 } 2985 function redirectPage(link) { 2986 if (link.length) { 2987 window.location.href = setHttp(link.attr('href')); 2988 } 2989 } 2990 const emailInput = _section.find('.js-email-input'); 2991 const emailRegex = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~\-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+/; 2992 emailInput.on('input', function () { 2993 if (emailRegex.test(this.value)) { 2994 this.setCustomValidity(''); 2995 } else { 2996 this.setCustomValidity('Please enter a valid email address.'); 2997 } 2998 this.reportValidity(); 2999 }); 3000 _section.find('input[name="name"]').on("keyup", function () { 3001 if (this.value.replaceAll(/\d/g, "").trim().split(" ").length < 2 || this.value.replaceAll(/\d/g, "").trim() === "") { 3002 this.setCustomValidity("Please input your first name and last name."); 3003 } else { 3004 this.setCustomValidity(""); 3005 } 3006 }); 3007 _section.find('form').on("reset", function () { 3008 $(this).addClass("show-success"); 3009 redirectPage(redirectLink); 3010 }); 3011 $(window).scroll(function () { 3012 if ($(this).scrollTop() >= 150) _section.find('.btn-holder').addClass('visible');else _section.find('.btn-holder').removeClass('visible'); 3013 }); 3014 _section.find('.close-btn, .connect-btn').click(function () { 3015 _section.find('.pop-up').toggle(); 3016 _section.find('.btn-holder').toggle(); 3017 }); 3018 if (!_footer) return; 3019 const observer = new IntersectionObserver(entries => {
3020 entries.forEach(entry => { 3021 if (entry.isIntersecting) _section.hide();else _section.show(); 3022 }); 3023 }, { 3024 threshold: 0.1 3025 }); 3026 observer.observe(_footer); 3027 function selectToDropdown(selectItem) { 3028 let customDropdown = ` 3029 <div class="custom-select" role="presentation"> 3030 <button class="custom-select-toggle is-placeholder" type="button" aria-haspopup="true" aria-expanded="false"></button> 3031 <div class="custom-select-menu" style="display: none;max-height: none;"> 3032 <div class="custom-select-content"> 3033 </div> 3034 </div> 3035 </div>`; 3036 $(customDropdown).insertAfter(selectItem); 3037 let $dropdown = $($(selectItem).next()); 3038 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 3039 let $dropdownMenu = $dropdown.find(".custom-select-menu"); 3040 let $dropdownContent = $dropdown.find(".custom-select-content"); 3041 $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select"); 3042 $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom"); 3043 $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id")); 3044 appendOptionButtons(selectItem, $dropdownContent); 3045 $(selectItem).removeClass().addClass("sr-only"); 3046 var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text(); 3047 $dropdownToggle.html(toggleText); 3048 $dropdown.on("click", ".custom-select-item", function (e) { 3049 if ($(this).hasClass("is-disabled")) return; 3050 let elementNumber = $(this).index(); 3051 let $originalSelect = $(this).closest(".custom-select").siblings("select"); 3052 let $linkedOption = $originalSelect.find("option").eq(elementNumber); 3053 if (!$linkedOption.prop("selected")) { 3054 $linkedOption.prop("selected", true); 3055 $originalSelect.change(); 3056 $(this).addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected"); 3057 $dropdownToggle.html($(this).html()); 3058 closeSelectMenu($(this).closest(".custom-select-menu")); 3059 } 3060 $dropdownToggle.removeClass("is-placeholder"); 3061 }); 3062 function convertOptionToButton(option) { 3063 var optionText = $(option).text(); 3064 var optionValue = $(option).attr("value") || $(option).text(); 3065 var optionIsDisabled = $(option).prop("disabled"); 3066 var outputButton = `<button value="${optionValue}" class="custom-select-item" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`; 3067 return outputButton; 3068 } 3069 function appendOptionButtons(selectItem, appendTarget) { 3070 $(selectItem).find("option").each(function () { 3071 let currentButton = convertOptionToButton(this); 3072 $(appendTarget).append(currentButton); 3073 }); 3074 } 3075 function showSelectMenu(selectMenu) { 3076 var customSelect = $(selectMenu).closest(".custom-select")[0]; 3077 $(customSelect).addClass("open"); 3078 $(selectMenu).slideDown(); 3079 } 3080 function closeSelectMenu(selectMenu) { 3081 var customSelect = $(selectMenu).closest(".custom-select")[0]; 3082 $(customSelect).removeClass("open"); 3083 $(selectMenu).slideUp(); 3084 } 3085 $dropdown.on("click", ".custom-select-toggle", function (e) { 3086 var $customSelect = $(this).closest(".custom-select"); 3087 var selectMenu = $customSelect.find(".custom-select-menu")[0]; 3088 if ($customSelect.hasClass("open")) { 3089 closeSelectMenu(selectMenu); 3090 } else { 3091 showSelectMenu(selectMenu); 3092 } 3093 }); 3094 $(document).on("click", function (e) { 3095 if ($(e.target).closest(".custom-select").length < 1 && $(".custom-select").hasClass("open")) { 3096 $(".custom-select.open").each(function () { 3097 var selectMenu = $(this).find(".custom-select-menu")[0]; 3098 closeSelectMenu(selectMenu); 3099 }); 3100 } 3101 }); 3102 } 3103 $(".pop-up select[name='interest']").each(function () { 3104 selectToDropdown(this); 3105 }); 3106})('global-mobile-contact'); 3107} catch(e) { 3108console.log(e); 3109} 3110 3111 try { 3112(function init(sectionDomId) { 3113 const scrollSection = document.getElementById(`${sectionDomId}`).querySelector('.js-scroll-section'); 3114 const introBtn = document.getElementById(`${sectionDomId}`).querySelector('.jsScrollBtn'); 3115 introBtn.addEventListener("click", function (e) { 3116 e.preventDefault(); 3117 window.scrollTo({ 3118 top: scrollSection.offsetTop + scrollSection.offsetHeight, 3119 behavior: "smooth" 3120 }); 3121 }); 3122})('section-c3f2b87c-69b5-446c-a7d3-6ef3300b8597', 'undefined'); 3123} catch(e) { 3124console.log(e); 3125} 3126 try { 3127(function init(sectionDomId, options) { 3128 let section = null; 3129 switch (sectionDomId) { 3130 case 'NAVBAR': 3131 section = document.querySelector('body > nav, #global-navbar'); 3132 break; 3133 case 'FOOTER': 3134 section = document.querySelector('body > footer, #global-footer'); 3135 break; 3136 case 'SIDEMENU': 3137 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 3138 break; 3139 case 'CONTACT':
3140 section = document.querySelector('#modal-global-contact-us'); 3141 break; 3142 case 'MOBILE_CONTACT': 3143 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 3144 break; 3145 case 'SUBSCRIBE': 3146 // Subscribe Not Implemented 3147 section = null; 3148 break; 3149 case 'ACCOUNT': 3150 // Account Not Implemented 3151 section = null; 3152 break; 3153 default: 3154 section = document.querySelector('#' + sectionDomId); 3155 } 3156 if (!section) { 3157 return; 3158 } 3159 3160 // Where content / items are rendered 3161 const dataContainer = section.querySelector('.data-container'); 3162 if (!dataContainer) { 3163 // no place to render items = no need to query server or do anything else 3164 return; 3165 } 3166 let variables = options.variables || {}; 3167 3168 // Some variables in options may not have been injected - remove 3169 Object.keys(variables).forEach(function (variableName) { 3170 if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) { 3171 delete variables[variableName]; 3172 } 3173 }); 3174 3175 // Merge page query variables 3176 if (options.usePageResource) { 3177 variables = { 3178 ...variables, 3179 ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource] 3180 }; 3181 } 3182 3183 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Callers 3184 // resolve the flag â fetchData reads the section stamp, aux fetches read 3185 // their own resource's stamp (auxUsesRouter). 3186 function apiUrl(useRouter) { 3187 return options.url || (useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl); 3188 } 3189 3190 // ROUTER-CLEANUP: aux resources roll out on their own flag, not the section's 3191 // (options.routerApiAux is stamped per aux resource server-side). 3192 function auxUsesRouter(resource) { 3193 return !!(options.routerApiAux && options.routerApiAux[resource]); 3194 } 3195 3196 // Pagination Executes on a Numbered Pagination Container 3197 // Or via a load more button 3198 let mode = 'BUTTONLESS_PAGINATION'; 3199 const container = section.querySelector('.pagination-container');
3200 const loadMoreButton = section.querySelector(options?.loadMoreSelector); 3201 if (container) { 3202 mode = 'NUMBERED_PAGINATION'; 3203 } 3204 if (loadMoreButton) { 3205 mode = 'LOAD_MORE_BUTTON'; 3206 } 3207 let searchContainer = section.querySelector('.search-container'); 3208 const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false; 3209 const eventPrefix = '__pagination-'; 3210 const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{ 3211 param: 'neighborhoodId', 3212 urlKey: 'neighborhood' 3213 }, { 3214 param: 'search', 3215 urlKey: 'search' 3216 }, { 3217 param: 'salesPriceGTE', 3218 urlKey: 'pricemin', 3219 formKey: 'priceMin', 3220 type: 'int' 3221 }, { 3222 param: 'salesPriceLTE', 3223 urlKey: 'pricemax', 3224 formKey: 'priceMax', 3225 type: 'int' 3226 }, { 3227 param: 'livingSpaceSizeGTE', 3228 urlKey: 'areamin', 3229 formKey: 'areaMin', 3230 type: 'int' 3231 }, { 3232 param: 'livingSpaceSizeLTE', 3233 urlKey: 'areamax', 3234 formKey: 'areaMax', 3235 type: 'int' 3236 }] : []); 3237 3238 // Total entries - initialized in first render 3239 let totalNumber = 0; 3240 const DefaultSearchParams = { 3241 page: 1 3242 }; 3243 searchFormParams.forEach(function (formParam) { 3244 DefaultSearchParams[formParam.formKey || formParam.param] = null; 3245 }); 3246 let searchParams = { 3247 ...DefaultSearchParams 3248 }; 3249 const offset = options.variables?.offset || 0; 3250 let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section; 3251 let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100; 3252 3253 // entries of per page 3254 // when query variables for a given section would't be filled options.pageSize can store 3255 // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value 3256 let pageSize = parseInt(options.pageSize, 10) || 9; 3257 3258 // Adding mobile pageRange support 3259 var NARROW_BREAKPOINT = 600; 3260 var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT; 3261 var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`); 3262 3263 // Page range (pages on both sides of the current page) 3264 var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0; 3265 var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2; 3266 var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange; 3267 3268 // Whether to display the 'Previous' button 3269 var showPrevious = true; 3270 3271 // Whether to display the 'Next' button 3272 var showNext = true; 3273 3274 // Whether to display the page buttons 3275 var showPageNumbers = true; 3276 3277 // 'Previous' text 3278 var prevText = options.prevText || '«'; 3279 3280 // 'Next' text 3281 var nextText = options.nextText || '»'; 3282 3283 // Ellipsis text 3284 var ellipsisText = '…'; 3285 var classPrefix = 'paginationjs'; 3286 3287 // Default active class 3288 var activeClassName = 'active'; 3289 3290 // Default disable class 3291 var disableClassName = 'disabled'; 3292 3293 // Pagination element's position in the container 3294 var position = 'bottom'; 3295 3296 // Whether to trigger pagination at initialization 3297 var triggerPagingOnInit = !options.skipInitialLoad; 3298 var showFirstOnEllipsisShow = true; 3299 var showLastOnEllipsisShow = true; 3300 3301 // Instantiated in init() 3302 var el = null; 3303 3304 // Controls scrollTop logic 3305 var firstRender = true; 3306 var renderBySearch = false; 3307 var disabled = false; 3308 3309 // Pagination script class selector 3310 var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script'; 3311 3312 // Property Specific Image Override if No Image 3313 var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage; 3314 3315 // Construct template 3316 var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || ''; 3317 var template = Handlebars.compile(templateHTML); 3318 3319 // Initialize 3320 init(); 3321 function init() { 3322 Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 3323 3324 // Append/prepend pagination element to the pagination container 3325 if (mode === 'NUMBERED_PAGINATION') { 3326 el = document.createElement('div'); 3327 el.className = 'paginationjs';
3328 container[position === 'bottom' ? 'append' : 'prepend'](el); 3329 } 3330 if (searchContainer) { 3331 initSearchContainer({ 3332 fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true', 3333 fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true', 3334 fetchOffices: searchContainer.dataset.fetchOffices === 'true', 3335 fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true' 3336 }, function () { 3337 syncSearchFormState(searchParams); 3338 }); 3339 } 3340 3341 // Bind events 3342 observer(); 3343 } 3344 function syncSearchFormState(params) { 3345 searchContainer.dispatchEvent(new CustomEvent('sync', { 3346 detail: params 3347 })); 3348 } 3349 function initSearchContainer(options, done) { 3350 var promises = []; 3351 if (options.fetchNeighborhoods) { 3352 promises.push(fetchAllNeighborhoods(function (neighborhoods) { 3353 searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', { 3354 detail: { 3355 data: neighborhoods.map(function (item) { 3356 return { 3357 value: item.id, 3358 label: item.name 3359 }; 3360 }) 3361 } 3362 })); 3363 })); 3364 } 3365 if (options.fetchPostCategories) { 3366 promises.push(fetchPostCategories(function (categories) { 3367 searchContainer.dispatchEvent(new CustomEvent('post-categories-data', { 3368 detail: { 3369 data: categories 3370 } 3371 })); 3372 })); 3373 } 3374 if (options.fetchOffices) { 3375 promises.push(fetchOffices(function (offices) { 3376 searchContainer.dispatchEvent(new CustomEvent('offices-data', { 3377 detail: { 3378 data: offices 3379 } 3380 })); 3381 })); 3382 } 3383 if (options.fetchRentalRates) { 3384 promises.push(fetchAllRentalRates(function (rentalRates) { 3385 searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', { 3386 detail: { 3387 data: rentalRates 3388 } 3389 })); 3390 })); 3391 } 3392 if (promises.length > 0) { 3393 Promise.all(promises).then(function () { 3394 done(); 3395 }); 3396 } else { 3397 // element's custom code is not executed yet, so we're scheduling callback to after element's code 3398 setTimeout(done); 3399 } 3400 } 3401 function fetchAllNeighborhoods(done) { 3402 var useRouter = auxUsesRouter('neighborhoods'); 3403 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Same 3404 // args on both APIs (the federated neighborhoods field accepts 3405 // withProperties/withBlogPosts); only the selection set differs. 3406 var gqlQuery = 'query ($companyId: String, $withProperties: NeighborhoodPropertiesFilter, $withBlogPosts: NeighborhoodBlogPostsFilter, $offset: Int, $limit: Int) {' + 'neighborhoods (companyId: $companyId, withProperties: $withProperties, withBlogPosts: $withBlogPosts, offset: $offset, limit: $limit) {' + (useRouter ? 'items {id, name}' : 'id, name') + '}}'; 3407 var payload = {}; 3408 payload.offset = 0; 3409 payload.limit = 100; 3410 payload.companyId = variables.companyId; 3411 if (options.resource === 'properties') { 3412 payload.withProperties = { 3413 active: true 3414 }; 3415 ['agentIds', 'tag', 'propertyTypeId', 'statusIds', 'architectureStyle', 'lifestyle', 'salesPriceGTE', 'salesPriceLTE', 'leasePriceGTE', 'leasePriceLTE', 'livingSpaceSizeGTE', 'livingSpaceSizeLTE', 'bathCountGTE', 'bathCountLTE', 'bedroomCountGTE', 'bedroomCountLTE', 'bathCountGTE', 'bathCountLTE', 'bedroomCountGTE', 'bedroomCountLTE', 'featuredListing', 'leaseProperty', 'neighborhoodId', 'developmentId', 'openHouse'].forEach(function (field) { 3416 if (variables[field] !== undefined && variables[field] !== null) { 3417 payload.withProperties[field] = variables[field]; 3418 } 3419 }); 3420 } 3421 if (options.resource === 'posts') { 3422 payload.withBlogPosts = { 3423 active: true 3424 }; 3425 ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) { 3426 if (variables[field] !== undefined && variables[field] !== null) { 3427 payload.withBlogPosts[field] = variables[field]; 3428 } 3429 }); 3430 } 3431 3432 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3433 if (useRouter) { 3434 payload = window.luxuryPresence.routerApi.transformVariables('neighborhoods', payload); 3435 } 3436 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3437 query: gqlQuery, 3438 variables: payload 3439 }).then(function (res) { 3440 var value = res.body.data && res.body.data.neighborhoods || {}; 3441 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3442 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3443 done(items, items.length); 3444 }); 3445 } 3446 function fetchPostCategories(done) { 3447 var featured = options.resource === 'posts' && !!variables.featured; 3448 var useRouter = auxUsesRouter('postCategories'); 3449 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3450 // selection set differs ({ items {...} } on the router). 3451 var selection = 'id, name, publishedCount, featuredPublishedCount'; 3452 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'postCategories (companyId: $companyId, offset: $offset, limit: $limit ' + (featured ? ' withFeaturedPublishedOnly: true' : ' withPublishedOnly: true') + ') {' + (useRouter ? 'items {' + selection + '}' : selection) + '}}'; 3453 var payload = {}; 3454 payload.offset = 0; 3455 payload.limit = 100; 3456 payload.companyId = variables.companyId; 3457 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3458 query: gqlQuery, 3459 variables: payload 3460 }).then(function (res) { 3461 var value = res.body.data && res.body.data.postCategories || {}; 3462 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3463 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3464 done(items.map(function (item) { 3465 item.count = featured ? item.featuredPublishedCount : item.publishedCount; 3466 return item; 3467 }), items.length); 3468 }); 3469 } 3470 function fetchOffices(done) { 3471 var useRouter = auxUsesRouter('offices'); 3472 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3473 // selection set differs ({ items {...} } on the router). 3474 var selection = 'id, name, tags'; 3475 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. The two 3476 // APIs differ in more than the items wrapper: federated offices takes 3477 // companyId: ID! (legacy gateway: String), so each branch builds its whole doc. 3478 var gqlQuery = useRouter ? 'query ($companyId: ID!, $offset: Int, $limit: Int) {' + 'offices (companyId: $companyId, offset: $offset, limit: $limit) {' + 'items {' + selection + '}}}' : 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'offices (companyId: $companyId, offset: $offset, limit: $limit) {' + selection + '}}'; 3479 var payload = { 3480 offset: 0, 3481 limit: 100, 3482 companyId: variables.companyId 3483 }; 3484 3485 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3486 if (useRouter) { 3487 payload = window.luxuryPresence.routerApi.transformVariables('office
3487s', payload); 3488 } 3489 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3490 query: gqlQuery, 3491 variables: payload 3492 }).then(function (res) { 3493 var value = res.body.data && res.body.data.offices || {}; 3494 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3495 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3496 done(items, items.length); 3497 }); 3498 } 3499 3500 // ROUTER-CLEANUP: no rentalRates field on the federated router â legacy only. 3501 function fetchAllRentalRates(done) { 3502 var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl; 3503 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}'; 3504 var payload = { 3505 offset: 0, 3506 limit: 100, 3507 companyId: variables.companyId 3508 }; 3509 superagent.post(url + '/graphql').withCredentials().send({ 3510 query: gqlQuery, 3511 variables: payload 3512 }).then(function (res) { 3513 var items = res.body.data && res.body.data.rentalRates || []; 3514 done(items, items.length); 3515 }).catch(function (err) { 3516 console.error('Error fetching rental rates:', err); 3517 done([], 0); 3518 }); 3519 } 3520 function fetchData(params, done) { 3521 var resource = options.resource; 3522 var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource]; 3523 var payload = {}; 3524 try { 3525 payload = JSON.parse(JSON.stringify(variables)); 3526 } catch (e) { 3527 Object.keys(variables).forEach(function (variableName) { 3528 payload[variableName] = variables[variableName]; 3529 }); 3530 } 3531 payload.offset = (params.page - 1) * pageSize + offset; 3532 payload.limit = pageSize; 3533 payload.companyId = options.companyId; 3534 searchFormParams.forEach(function (formParam) { 3535 var val = params[formParam.formKey || formParam.param]; 3536 if (val !== null && val !== undefined) { 3537 objSet(payload, formParam.param, val); 3538 } 3539 }); 3540 3541 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3542 if (options.useRouterApi) { 3543 payload = window.luxuryPresence.routerApi.transformVariables(resource, payload); 3544 } 3545 3546 // TODO: Disabled loading due to jarring effect 3547 // dataContainer.html('Loading...'); 3548 superagent.post(apiUrl(options.useRouterApi) + '/graphql').withCredentials().send({ 3549 query: gqlQuery, 3550 variables: payload 3551 }).then(function (res) { 3552 if (res.body.errors) { 3553 done(res.body.errors); 3554 return; 3555 } 3556 var data = res.body.data || {}; 3557 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3558 var resources; 3559 var resourceCount; 3560 if (options.useRouterApi) { 3561 var page = window.luxuryPresence.routerApi.transformPage(data[resource]); 3562 resources = window.luxuryPresence.routerApi.transformResponse(resource, page.items); 3563 resourceCount = page.count; 3564 } else { 3565 resources = data[resource] || []; 3566 resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0; 3567 } 3568 const finish = function (items) { 3569 if (resource === 'properties' && propertyPlaceholderImage?.id) { 3570 items = items.map(item => { 3571 if (item.media?.length === 0) { 3572 return Object.assign(item, { 3573 media: [propertyPlaceholderImage] 3574 }); 3575 } 3576 return item; 3577 }); 3578 } 3579 done(null, items, resourceCount); 3580 }; 3581 3582 // ROUTER-CLEANUP: client half of PLAT-4073 â resolve the requested 3583 // disclaimers before rendering; older SDKs skip (keys stay unset). 3584 if (options.useRouterApi && resource === 'properties' && options.routerPropertyDisclaimers && options.routerPropertyDisclaimers.length && window.luxuryPresence.routerApi && typeof window.luxuryPresence.routerApi.applyPropertyDisclaimers === 'function') { 3585 window.luxuryPresence.routerApi.applyPropertyDisclaimers(resources, options.routerPropertyDisclaimers).then(finish); 3586 return; 3587 } 3588 finish(resources); 3589 }); 3590 } 3591 function getTotalPage() { 3592 return Math.ceil(totalNumber / pageSize); 3593 } 3594 function renderPaginationList() { 3595 var totalPages = getTotalPage(); 3596 var rangeStart = searchParams.page - pageRange; 3597 var rangeEnd = searchParams.page + pageRange; 3598 if (rangeEnd > totalPages) { 3599 rangeEnd = totalPages; 3600 rangeStart = totalPages - pageRange * 2; 3601 rangeStart = rangeStart < 1 ? 1 : rangeStart; 3602 } 3603 if (rangeStart <= 1) { 3604 rangeStart = 1; 3605 rangeEnd = Math.min(pageRange * 2 + 1, totalPages); 3606 } 3607 3608 // Making sure that 1 more page button is shown in edge positions 3609 if (pageRange === 0) { 3610 if (searchParams.page === totalPages) { 3611 rangeStart = totalPages <= 1 ? 1 : totalPages - 1; 3612 } 3613 if (searchParams.page === 1) { 3614 rangeEnd = Math.min(2, totalPages); 3615 } 3616 } 3617 3618 // Render pagination list 3619 if (mode === 'NUMBERED_PAGINATION') { 3620 el.innerHTML = generateHTML({ 3621 currentPage: searchParams.page, 3622 pageRange: pageRange, 3623 rangeStart: rangeStart, 3624 rangeEnd: rangeEnd 3625 }); 3626 if (totalPages < 2 && hidePaginationOnFirstPage) { 3627 container.style.display = 'none'; 3628 } else { 3629 container.style.display = ''; 3630 } 3631 } else if (mode === 'LOAD_MORE_BUTTON') { 3632 if (searchParams.page >= totalPages) {
3633 loadMoreButton.style.display = 'none'; 3634 } else { 3635 loadMoreButton.style.display = ''; 3636 } 3637 } 3638 } 3639 function render(data) { 3640 renderPaginationList(); 3641 3642 // Render new content with handlebars 3643 var html = ''; 3644 if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) { 3645 // If using load more, append search results to existing results 3646 html = dataContainer.innerHTML; 3647 } 3648 for (var i = 0; i < data.length; i++) { 3649 var itemData = recursivelyParse(data[i]); 3650 itemData.sectionIndex = options.sectionIndex; 3651 itemData.renderOptions = options.renderOptions; 3652 html += template(itemData); 3653 } 3654 dataContainer.innerHTML = html; 3655 3656 // Scroll Top 3657 if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) { 3658 // Only animate to the top if we replace dataContainer (numbered pagination) 3659 setTimeout(() => { 3660 const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset; 3661 window.scrollTo({ 3662 top: scrollTargetOffsetTop, 3663 behavior: 'smooth' 3664 }); 3665 }, 250); 3666 } 3667 return true; 3668 } 3669 function generateHTML(args) { 3670 const totalPages = getTotalPage(); 3671 const { 3672 rangeStart, 3673 rangeEnd 3674 } = args; 3675 const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 3676 ...searchParams, 3677 page 3678 }); 3679 let html = ''; 3680 if (showPrevious || showPageNumbers || showNext) { 3681 html += '<div class="paginationjs-pages"><ul>'; 3682 3683 // Previous button 3684 if (showPrevious) { 3685 if (searchParams.page <= 1) { 3686 html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`; 3687 } else { 3688 html += `<li class="${classPrefix}-prev J-paginationjs-previous" data-num="${searchParams.page - 1}" title="Previous page"><a href="${makeLnk(searchParams.page - 1)}">${prevText}</a></li>`; 3689 } 3690 } 3691 3692 // Pages 3693 if (showPageNumbers) { 3694 if (rangeStart <= 3) { 3695 for (let i = 1; i < rangeStart; i++) { 3696 html += `<li class="${classPrefix}-page J-paginationjs-page ${i === searchParams.page ? activeClassName : ''}" data-num="${i}"><a ${i === searchParams.page ? '' : `href="${makeLnk(i)}"`}>${i}</a></li>`; 3697 } 3698 } else { 3699 if (showFirstOnEllipsisShow) { 3700 html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`; 3701 } 3702 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 3703 } 3704 for (let i = rangeStart; i <= rangeEnd; i++) { 3705 html += `<li class="${classPrefix}-page J-paginationjs-page ${i === searchParams.page ? activeClassName : ''}" data-num="${i}"><a ${i === searchParams.page ? '' : `href="${makeLnk(i)}"`}>${i}</a></li>`; 3706 } 3707 if (rangeEnd < totalPages - 2) { 3708 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 3709 if (showLastOnEllipsisShow) { 3710 html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`; 3711 } 3712 } else { 3713 for (let i = rangeEnd + 1; i <= totalPages; i++) { 3714 html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`; 3715 } 3716 } 3717 } 3718 3719 // Next button 3720 if (showNext) { 3721 if (searchParams.page >= totalPages) { 3722 html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`; 3723 } else { 3724 html += `<li class="${classPrefix}-next J-paginationjs-next" data-num="${searchParams.page + 1}" title="Next page"><a href="${makeLnk(searchParams.page + 1)}">${nextText}</a></li>`; 3725 } 3726 } 3727 html += '</ul></div>'; 3728 } 3729 return html; 3730 } 3731 function go(newSearchParams, callback, restorationVisit) { 3732 if (disabled) return; 3733 var goToPageNumber = newSearchParams.page; 3734 3735 // Page number is out of bounds 3736 if (!goToPageNumber || goToPageNumber < 1) return; 3737 var totalPage = getTotalPage(); 3738 3739 // Page number is out of bounds 3740 if (!restorationVisit && totalNumber > 0) { 3741 if (goToPageNumber > totalPage) return; 3742 } 3743 if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
3744 var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 3745 ...newSearchParams, 3746 page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null 3747 }); 3748 if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) { 3749 window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, { 3750 queryString: true 3751 })); 3752 } 3753 } 3754 3755 // Fetch and update page 3756 fetchData(newSearchParams, renderWithData); 3757 disabled = true; 3758 function renderWithData(err, data, count) { 3759 if (err) { 3760 dataContainer.dispatchEvent(new Event('error')); 3761 } else { 3762 searchParams = { 3763 ...newSearchParams 3764 }; 3765 totalNumber = count - offset; 3766 if (data.length === 0) { 3767 dataContainer.dispatchEvent(new Event('no-data')); 3768 } else { 3769 dataContainer.dispatchEvent(new Event('data')); 3770 } 3771 render(data); 3772 firstRender = false; 3773 } 3774 disabled = false; 3775 renderBySearch = false; 3776 } 3777 } 3778 function areQueryParamsEqual(first, second) { 3779 var differ = Object.keys(first).find(function (key) { 3780 return first[key] !== undefined && first[key] !== null && first[key] !== second[key]; 3781 }); 3782 if (differ) { 3783 return false; 3784 } 3785 differ = Object.keys(second).find(function (key) { 3786 return second[key] !== undefined && second[key] !== null && second[key] !== first[key]; 3787 }); 3788 return !differ; 3789 } 3790 function next(callback) { 3791 go({ 3792 ...searchParams, 3793 page: searchParams.page + 1 3794 }, callback); 3795 } 3796 function previous(callback) { 3797 go({ 3798 ...searchParams, 3799 page: searchParams.page - 1 3800 }, callback); 3801 } 3802 function refresh(callback) { 3803 go(searchParams, callback); 3804 } 3805 function update(params, callback) { 3806 renderBySearch = true; 3807 go(params, callback); 3808 } 3809 function observer() { 3810 if (searchContainer) { 3811 searchContainer.addEventListener('search', function (event, newSearchParams) { 3812 newSearchParams = event.detail || newSearchParams; 3813 update({ 3814 ...searchParams, 3815 ...newSearchParams, 3816 page: 1 3817 }); 3818 }); 3819 searchContainer.addEventListener('clear-search', function () { 3820 const defaultSearchParams = { 3821 ...DefaultSearchParams 3822 }; 3823 const isCurrentSearchFormStateDefault = areQueryParamsEqual({ 3824 ...defaultSearchParams, 3825 page: null 3826 }, { 3827 ...searchParams, 3828 page: null 3829 }); 3830 3831 // if mode is LOAD_MORE_BUTTON we should't make anything on clear 3832 // when search form have default state 3833 if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') { 3834 return; 3835 } 3836 3837 // if someone initially go to some page and click 'Clear' on search from 3838 // we should't navigate to first page. We should preserve page value 3839 if (isCurrentSearchFormStateDefault) { 3840 defaultSearchParams.page = searchParams.page; 3841 } 3842 syncSearchFormState(defaultSearchParams); 3843 update(defaultSearchParams); 3844 }); 3845 } 3846 if (mode === 'LOAD_MORE_BUTTON') { 3847 loadMoreButton.addEventListener('click', function (event) { 3848 go({ 3849 ...searchParams, 3850 page: searchParams.page + 1 3851 }); 3852 return false; 3853 }); 3854 } 3855 if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') { 3856 // Do initial render 3857 go(Object.assign({}, searchParams, { 3858 page: 1 3859 })); 3860 return; 3861 } 3862 if (mode === 'NUMBERED_PAGINATION') { 3863 // Go to specified page number 3864 container.addEventListener(eventPrefix + 'go', function (event) { 3865 let { 3866 pageNumber, 3867 done 3868 } = event.detail || {}; 3869 pageNumber = parseInt(pageNumber, 10); 3870 if (!pageNumber) { 3871 return; 3872 } 3873 go({ 3874 ...searchParams, 3875 page: pageNumber 3876 }, done); 3877 }); 3878 3879 // Page number button click 3880 el.addEventListener('click', function (event) { 3881 let clickTarget = event.target; 3882 let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next'); 3883 let pageNumber = current?.getAttribute('data-num'); 3884 if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) { 3885 return; 3886 } else { 3887 go({ 3888 ...searchParams, 3889 page: parseInt(pageNumber, 10) 3890 }); 3891 } 3892 event.preventDefault(); 3893 }); 3894 3895 // Whether to load the default page 3896 var defaultPageNumber = searchParams.page; 3897 if (triggerPagingOnInit) {
3898 container.dispatchEvent(new CustomEvent(eventPrefix + 'go', { 3899 detail: { 3900 pageNumber: defaultPageNumber 3901 } 3902 })); 3903 } 3904 } 3905 window.addEventListener('popstate', function (event) { 3906 var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 3907 if (!areQueryParamsEqual(newParams, searchParams)) { 3908 go(newParams, null, true); 3909 if (searchContainer) { 3910 syncSearchFormState(newParams); 3911 } 3912 } 3913 }); 3914 } 3915 function replaceVariables(template, variables) { 3916 var formattedString; 3917 for (var key in variables) { 3918 var value = variables[key]; 3919 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 3920 formattedString = (formattedString || template).replace(regexp, value); 3921 } 3922 return formattedString; 3923 } 3924 function isTextEditorValue(obj) { 3925 return 'raw' in obj || 'gjs' in obj; 3926 } 3927 function getTextEditorValue(obj) { 3928 if (!obj.html) { 3929 return ''; 3930 } 3931 var data = obj.html; 3932 var css = (obj.raw || obj.gjs || {}).css; 3933 if (css) { 3934 data = data + '<style>' + css + '</style>'; 3935 } 3936 return data; 3937 } 3938 3939 /** 3940 * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor. 3941 * strips out raw proprties and returns only HTML if it exists. 3942 * @param {Object} resources a collection retrieved from the database 3943 * @return {Object} the newly modified object. 3944 */ 3945 function recursivelyParse(resources) { 3946 forEach(resources, function (value, key) { 3947 if (!value) { 3948 return; 3949 } 3950 if (value instanceof Object) { 3951 if (isTextEditorValue(value)) { 3952 resources[key] = getTextEditorValue(value); 3953 return; 3954 } else { 3955 return recursivelyParse(value); 3956 } 3957 } 3958 try { 3959 var parsedData = JSON.parse(value); 3960 if (isTextEditorValue(parsedData)) { 3961 resources[key] = getTextEditorValue(parsedData); 3962 } 3963 } catch (e) { 3964 // do nothing if we failed to parse value as JSON 3965 } 3966 }); 3967 return resources; 3968 } 3969 function forEach(collection, iteratee) { 3970 var func = Array.isArray(collection) ? arrayEach : baseFor; 3971 return func(collection, iteratee); 3972 } 3973 function baseFor(object, iteratee) { 3974 if (!object) { 3975 return; 3976 } 3977 var iterable = Object(object); 3978 var props = Object.keys(object); 3979 var length = props.length; 3980 var index = -1; 3981 while (length--) { 3982 var key = props[++index]; 3983 if (iteratee(iterable[key], key, iterable) === false) { 3984 break; 3985 } 3986 } 3987 return object; 3988 } 3989 function objSet(obj, path, value) { 3990 const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g); 3991 pathArray.reduce((acc, key, i) => { 3992 if (acc[key] === undefined) acc[key] = {}; 3993 if (i === pathArray.length - 1) acc[key] = value; 3994 return acc[key]; 3995 }, obj); 3996 } 3997 function arrayEach(array, iteratee) { 3998 var index = -1; 3999 var length = array.length; 4000 while (++index < length) { 4001 if (iteratee(array[index], index, array) === false) { 4002 break; 4003 } 4004 } 4005 return array; 4006 } 4007 function selectPageRangeMode(e) { 4008 pageRange = e.matches ? mobilePageRange : desktopPageRange; 4009 renderPaginationList(); 4010 } 4011 paginationMql.addEventListener('change', selectPageRangeMode); 4012})('section-7340826b-bdad-4f4c-95bc-421ee1719d85', JSON.parse("{\"pageSize\":\"4\",\"resource\":\"posts\",\"pageRange\":1,\"variables\":{\"limit\":4,\"offset\":0,\"sortDir\":\"DESC\",\"companyId\":\"7ac07672-b054-446c-a74a-437d501f555c\",\"categoryId\":\"{{pageElement.categoryId}}\",\"order\":\"publishedAt\"},\"searchFormParams\":[{\"param\":\"categoryIds\",\"urlKey\":\"categories\"},{\"param\":\"sortDir\",\"urlKey\":\"sortDir\"},{\"param\":\"order\",\"urlKey\":\"order\"},{\"param\":\"search\",\"urlKey\":\"search\"}],\"hidePaginationOnFirstPage\":true,\"companyId\":\"7ac07672-b054-446c-a74a-437d501f555c\",\"usePageResource\":false,\"sectionIndex\":2,\"useRouterApi\":true,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":true,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 4013} catch(e) { 4014console.log(e); 4015} 4016 try { 4017(function init(sectionDomId, options) { 4018 const section = document.getElementById(sectionDomId); 4019 const searchContainer = section.querySelector('.search-container'); 4020 if (!searchContainer) return; 4021 const { 4022 apiGatewayUrl, 4023 routerUrl 4024 } = window.luxuryPresence.defaults; 4025 const useRouterPosts = Boolean(options?.routerApiAux?.posts && routerUrl); 4026 const API_ENDPOINT = useRouterPosts ? routerUrl : apiGatewayUrl; 4027 const variables = JSON.parse(searchContainer.dataset.variables); 4028 const categoryList = searchContainer.querySelector('.blog-posts-list__search-container'); 4029 const searchInput = searchContainer.querySelector('.js-blog-search'); 4030 searchContainer.addEventListener("sync", function (event) { 4031 const params = event.detail || {}; 4032 highlightCategory(params.categoryIds && params.categoryIds[0]); 4033 setCategoryOnGet = params.categoryIds && params.categoryIds[0]; 4034 if (searchInput && params.search !== undefined) { 4035 searchInput.value = params.search || ''; 4036 } 4037 }); 4038 function getFormParams() { 4039 let params = structuredClone(variables); 4040 const activeCategory = searchContainer.querySelector(".active"); 4041 if (!activeCategory || activeCategory.classList.contains("js-category-all")) { 4042 params.categoryIds = variables.categoryIds ? variables.categoryIds : []; 4043 } else { 4044 params.categoryIds = [activeCategory.dataset.value]; 4045 } 4046 if (searchInput) { 4047 params.search = searchInput.value.trim() || null; 4048 } 4049 return params; 4050 } 4051 function doSearch() { 4052 const params = getFormParams(); 4053 const searchEvent = new CustomEvent("search", { 4054 detail: params 4055 });
4056 searchContainer.dispatchEvent(searchEvent); 4057 } 4058 function highlightCategory(categoryId) { 4059 const active = searchContainer.querySelector(".active"); 4060 if (active) active.classList.remove("active"); 4061 const lnk = searchContainer.querySelector('[data-value="' + categoryId + '"]'); 4062 if (lnk) lnk.classList.add("active");else { 4063 const all = searchContainer.querySelector(".js-category-all"); 4064 if (all) all.classList.add("active"); 4065 } 4066 } 4067 if (searchInput) { 4068 let debounceTimer; 4069 searchInput.addEventListener('input', function () { 4070 clearTimeout(debounceTimer); 4071 debounceTimer = setTimeout(doSearch, 400); 4072 }); 4073 } 4074 var setCategoryOnGet; 4075 if (categoryList) { 4076 const companyId = window.luxuryPresence.config.companyId; 4077 const postCategoriesQuery = ` 4078 query PostCategories ( 4079 $companyId: String 4080 ) { 4081 postCategories ( 4082 companyId: $companyId, 4083 withPublishedOnly: true, 4084 ) { 4085 id 4086 name 4087 } 4088 } 4089 `; 4090 const postCategoriesRouterQuery = ` 4091 query PostCategories ( 4092 $companyId: String 4093 $withPublishedOnly: Boolean 4094 ) { 4095 postCategories ( 4096 companyId: $companyId, 4097 withPublishedOnly: $withPublishedOnly, 4098 ) { 4099 items { 4100 id 4101 name 4102 } 4103 } 4104 } 4105 `; 4106 function getPostCategories() { 4107 superagent.post(API_ENDPOINT + "/graphql").withCredentials().send({ 4108 query: useRouterPosts ? postCategoriesRouterQuery : postCategoriesQuery, 4109 variables: { 4110 companyId: companyId, 4111 ...(useRouterPosts ? { 4112 withPublishedOnly: true 4113 } : {}) 4114 } 4115 }).then(res => { 4116 const active = searchContainer.querySelector(".active"); 4117 if (active) active.classList.remove("active"); 4118 const raw = (res.body.data || {}).postCategories; 4119 const data = useRouterPosts ? raw && raw.items || [] : raw; 4120 if (Array.isArray(data) && data.length) { 4121 data.forEach(function (item) { 4122 if (variables.categoryIds && !variables.categoryIds.includes(item.id)) return; 4123 const newCategory = document.createElement('li'); 4124 categoryList.appendChild(newCategory); 4125 newCategory.outerHTML = `<li data-value="${item.id}" class="blog-posts-list__category js-category"><span class="blog-posts-list__category-name">${item.name}</span></li>`; 4126 }); 4127 if (setCategoryOnGet !== undefined) { 4128 highlightCategory(setCategoryOnGet); 4129 setCategoryOnGet = undefined; 4130 } 4131 searchContainer.querySelectorAll(".js-category").forEach(category => { 4132 category.addEventListener("click", function () { 4133 if (!this.classList.contains("active")) { 4134 const active = searchContainer.querySelector(".active"); 4135 if (active) active.classList.remove("active"); 4136 this.classList.add("active"); 4137 doSearch(); 4138 } 4139 }); 4140 }); 4141 } 4142 }).catch(e => { 4143 console.log("err", e); 4144 }); 4145 } 4146 getPostCategories(); 4147 } 4148})('section-7340826b-bdad-4f4c-95bc-421ee1719d85', JSON.parse("{\"resource\":\"posts\",\"useRouterApi\":true,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":true,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true},\"companyId\":\"7ac07672-b054-446c-a74a-437d501f555c\",\"usePageResource\":false,\"sectionIndex\":2}")); 4149} catch(e) { 4150console.log(e); 4151} 4152 try { 4153(function init(sectionDomId) {})('section-f6ab0e0a-1d17-477f-be39-f70a71f91f94', 'undefined'); 4154} catch(e) { 4155console.log(e); 4156} 4157 try { 4158(function init(sectionDomId, options) { 4159 let section = null; 4160 switch (sectionDomId) { 4161 case 'NAVBAR': 4162 section = document.querySelector('body > nav, #global-navbar'); 4163 break; 4164 case 'FOOTER': 4165 section = document.querySelector('body > footer, #global-footer'); 4166 break; 4167 case 'SIDEMENU': 4168 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 4169 break; 4170 case 'CONTACT':
4171 section = document.querySelector('#modal-global-contact-us'); 4172 break; 4173 case 'MOBILE_CONTACT': 4174 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 4175 break; 4176 case 'SUBSCRIBE': 4177 // Subscribe Not Implemented 4178 section = null; 4179 break; 4180 case 'ACCOUNT': 4181 // Account Not Implemented 4182 section = null; 4183 break; 4184 default: 4185 section = document.querySelector('#' + sectionDomId); 4186 } 4187 if (!section) { 4188 return; 4189 } 4190 var url = window.luxuryPresence.defaults.routerUrl; 4191 var companyId = window.luxuryPresence.defaults.companyId; 4192 var limit = options.limit || 8; 4193 if (typeof limit === 'string') { 4194 limit = parseInt(limit, 10) || 8; // this NaN protection also filters out 0 - this is expected 4195 } 4196 var templateSelector = options.templateSelector || '.jsIGTemplate'; 4197 var containerSelector = options.containerSelector || '.jsIGContainer'; 4198 var hasDataClass = options.hasDataClass || 'has-data'; 4199 var hideActivateMessage = options.hasDataClass || false; 4200 var payload = { 4201 companyId: companyId, 4202 limit: limit 4203 }; 4204 if (options.resourceId && typeof options.resourceId === 'string' && !options.resourceId.match(/^{{.*}}$/)) { 4205 payload.resourceId = options.resourceId; 4206 // Federated enum values are uppercase (AGENT/TEAM); element configs carry lowercase 4207 payload.resource = String(options.resource || 'agent').toUpperCase(); 4208 payload.fallbackToNoResource = options.fallbackToNoResource === 'true' || options.fallbackToNoResource === true; 4209 } 4210 var query = 'query InstagramFeed (\n' + ' $companyId: ID!\n' + ' $instagramAuthorizationId: ID\n' + ' $username: String\n' + (payload.resourceId ? '$resource: InstagramContentAuthResourceEnum\n $resourceId: ID\n $fallbackToNoResource: Boolean' : '') + ' $limit: Int\n' + ') {\n' + ' instagramContentFeed (\n' + ' companyId: $companyId\n' + ' instagramAuthorizationId: $instagramAuthorizationId\n' + ' username: $username\n' + (payload.resourceId ? 'resource: $resource\n resourceId: $resourceId\n fallbackToNoResource: $fallbackToNoResource' : '') + ' limit: $limit\n' + ' ) {\n' + ' active\n' + ' feedUrl\n' + ' username\n' + ' items {\n' + ' id\n' + ' caption\n' + ' commentsCount\n' + ' likeCount\n' + ' mediaType\n' + ' mediaUrl\n' + ' permalink\n' + ' shortcode\n' + ' thumbnailUrl\n' + ' timestamp\n' + ' username\n' + ' }\n' + ' }\n' + '}\n'; 4211 var templateHTML = section.querySelector(templateSelector)?.innerHTML || ''; 4212 var template = Handlebars.compile(templateHTML); 4213 var container = section.querySelector(containerSelector); 4214 if (options.variables) { 4215 Object.keys(options.variables).forEach(function (key) { 4216 if (options.variables.hasOwnProperty(key) && (typeof options.variables[key] !== 'string' || !options.variables[key].match(/^{{.*}}$/))) { 4217 payload[key] = options.variables[key]; 4218 } 4219 }); 4220 } 4221 function getData() { 4222 var feed = { 4223 error: true 4224 }; 4225 if (payload.companyId == null || payload.companyId === '') { 4226 // instagramContentFeed requires companyId (ID!) â nothing to fetch without it. 4227 // Checked after the options.variables merge, which may override the default. 4228 // Deferred so element listeners (attached after this template runs) still receive it. 4229 setTimeout(function () { 4230 section.dispatchEvent(new CustomEvent('ig-data', { 4231 detail: feed 4232 })); 4233 }, 0); 4234 return; 4235 } 4236 superagent.post(url + '/graphql').send({ 4237 query: query, 4238 variables: payload 4239 }).then(res => { 4240 try { 4241 if (!res.body.errors) { 4242 feed = res.body.data.instagramContentFeed; 4243 if (!feed.active) { 4244 if (!hideActivateMessage && sectionDomId === 'section-temp' && container) { 4245 if (payload.resourceId) { 4246 container.innerHTML = '<div style="text-align: center">Instagram account is not connected to selected ' + payload.resource + '.<br /> Connect it on the ' + payload.resource + ' page</div>'; 4247 } else { 4248 container.innerHTML = '<div style="text-align: center">Instagram account is not connected.<br /> Connect it on <a href="/profile">Profile page</a></div>'; 4249 } 4250 } 4251 } else { 4252 if (feed.items.length) { 4253 if (hasDataClass) { 4254 section.classList.add(hasDataClass); 4255 } 4256 const feedName = feed.username; 4257 section.querySelectorAll('.jsIGLink').forEach(link => link.setAttribute('href', feed.feedUrl)); 4258 section.querySelectorAll('.jsIGName').forEach(name => { 4259 name.textContent = '@' + feedName; 4260 name.setAttribute('title', '@' + feedName); 4261 }); 4262 if (container && template) { 4263 container.innerHTML = template(feed); 4264 } 4265 } 4266 } 4267 } 4268 } catch (e) {} 4269 section.dispatchEvent(new CustomEvent('ig-data', { 4270 detail: feed 4271 })); 4272 }).catch(e => { 4273 console.log('err', e); 4274 section.dispatchEvent(new CustomEvent('ig-data', { 4275 detail: feed 4276 })); 4277 }); 4278 } 4279 getData(); 4280})('section-d0bb8190-fa80-4a3a-b56c-b37146df7e09', JSON.parse("{\"limit\":11,\"resource\":\"agent\",\"resourceId\":\"{{id}}\",\"fallbackToNoResource\":\"{{{fallbackToNoResource}}}\",\"companyId\":\"7ac07672-b054-446c-a74a-437d501f555c\",\"usePageResource\":false,\"sectionIndex\":4,\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":true,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 4281} catch(e) { 4282console.log(e); 4283} 4284 try { 4285(function init(sectionDomId) { 4286 const section = document.getElementById(sectionDomId); 4287 const slider = section.querySelector(".js-slider"); 4288 section.addEventListener("ig-data", function () { 4289 var splide = new Splide(slider, { 4290 rewind: true,
4291 arrows: false, 4292 type: 'loop', 4293 padding: '20%', 4294 gap: '16px', 4295 pagination: false, 4296 clones: 1, 4297 perPage: 1, 4298 perMove: 1, 4299 destroy: true, 4300 breakpoints: { 4301 768: { 4302 destroy: false 4303 } 4304 } 4305 }); 4306 splide.mount(); 4307 }); 4308})('section-d0bb8190-fa80-4a3a-b56c-b37146df7e09', JSON.parse("{\"resource\":\"agent\",\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":true,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true},\"companyId\":\"7ac07672-b054-446c-a74a-437d501f555c\",\"usePageResource\":false,\"sectionIndex\":4}")); 4309} catch(e) { 4310console.log(e); 4311} 4312 4313 var { body } = document; 4314 var globalNav = body.querySelector(':scope > nav'); 4315 var globalSideMenu = body.querySelector(':scope > div.sidemenu'); 4316 4317 document.querySelectorAll('body > .modal .close').forEach(modalCloseBtn => { 4318 modalCloseBtn.addEventListener('click', function() { 4319 window.lpUI.hideClosestModal(modalCloseBtn); 4320 }); 4321 }); 4322 4323 window.addEventListener('click', function() { 4324 document.querySelectorAll('.share-popup').forEach(sharedPopup => { 4325 sharedPopup.style.display = 'none' ; 4326 }); 4327 }); 4328 4329 /* Misc Partials / Addons */ 4330 function initWOW() { 4331 if (wow) { 4332 wow.init(); 4333 wow.scrollHandler(); 4334 setTimeout(function () { 4335 const wowHideStyle = document.getElementById('wow-hide-elements'); 4336 if(wowHideStyle) { 4337 wowHideStyle.disabled = true; 4338 } 4339 }, 1); 4340 } 4341 } 4342 4343 const wowHideElements = document.getElementById('wow-hide-elements'); 4344 if (wowHideElements) { 4345 wowHideElements.disabled = false; 4346 } 4347 4348 initWOW(); 4349 4350 /* Generic Navbar Handling */ 4351 globalNav?.querySelectorAll('.hamburger-component').forEach(hamburgerComponent => { 4352 hamburgerComponent.addEventListener('click', function() { 4353 window.lpUI.sideMenuToggle(); 4354 }); 4355 }); 4356 globalSideMenu?.querySelectorAll('.toggle').forEach(toggleEl => { 4357 toggleEl.addEventListener('click', function() { 4358 window.lpUI.sideMenuToggle(); 4359 }); 4360 }); 4361 4362 document.querySelectorAll('body > nav .sub-nav-container > a, body > div.sidemenu .sub-nav-container > a').forEach(linkEl => { 4363 linkEl.addEventListener('click', function(e) { 4364 e.preventDefault(); 4365 e.stopPropagation(); 4366 var subNav = linkEl.parentElement.querySelector(':scope > .sub-nav'); 4367 if (subNav && subNav.classList.contains('visible')){ 4368 subNav.classList.remove('visible'); 4369 } else { 4370 globalNav?.querySelectorAll('.sub-nav-container .sub-nav').forEach(globalSubNav => { 4371 globalSubNav.classList.remove('visible'); 4372 }); 4373 globalSideMenu?.querySelectorAll('.sub-nav').forEach(sideMenuSubNav => { 4374 sideMenuSubNav.classList.remove('visible'); 4375 }); 4376 subNav?.classList.add('visible'); 4377 } 4378 }); 4379 }); 4380 window.addEventListener('click', function() { 4381 document.querySelectorAll('nav .sub-nav.visible, .sidemenu .sub-nav.visible').forEach(subNavEl => { 4382 subNavEl.classList.remove('visible'); 4383 }); 4384 }); 4385 4386 } 4387 4388 document.addEventListener('DOMContentLoaded', lpGlobalInit); 4389 4390 </script>
4390 4391 4392
4392<script type="module"> 4393 function selectorExists(selector) { 4394 return document.querySelector(selector) !== null; 4395 } 4396 4397 // Function to initialize the third-party library 4398 function initParoller(selector = '.my-paroller') { 4399 var $parollerElements = $(selector); 4400 if ($parollerElements.length > 0 && typeof $parollerElements.paroller === 'function') { 4401 $parollerElements.paroller(); 4402 } 4403 } 4404 4405 const parollerSelector = '.my-paroller'; 4406 4407 if (selectorExists(parollerSelector)) { 4408 window.luxuryPresence.libs.loadJs(window.luxuryPresence.libs.jsLibsMap.paroller.jsSrc, function() { 4409 initParoller(parollerSelector); 4410 window.luxuryPresence.libs.jsLibsMap.paroller.isLoaded = true; 4411 }); 4412 } 4413 </script>
4413 4414 4415 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 4415-4416
4415 4416 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
4416GTM-T9SFQGHZ
vendor: 107 bytes, lines 4416-4418
4416" 4417 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 4418
4418<!-- End Google Tag Manager --> 4419 4420 4421
4421<script 4422 src="https://cdn.luxurypresence.com/scripts/a11y-widget/latest/widget.js" 4423 data-website-id="cabbe5a3-1336-4a26-afab-bb421f339f1d" 4424 4425 defer></script>
vendor: 1 bytes, line 4425
4425
4426<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a47a658aef6bf606',t:'MTc5MTUxNzU2OQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
4426<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"d2a8f4b3d65944edb8fcd6ffce49ee5e","spa":2}' crossorigin="anonymous"></script>
4426 4427</body> 4428</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.