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>Discover the Best Real Estate Properties | The Rosen Group</title> 10 <meta property="og:title" content="Discover the Best Real Estate Properties | The Rosen Group"> 11 <meta name="twitter:title" content="Discover the Best Real Estate Properties | The Rosen Group"> 12 <meta name="description" content="Explore the best real estate listings with The Rosen Group! Discover featured properties and start your journey to finding your perfect home today."> 13 <meta property="og:description" content="Explore the best real estate listings with The Rosen Group! Discover featured properties and start your journey to finding your perfect home today."> 14 <meta name="twitter:description" content="Explore the best real estate listings with The Rosen Group! Discover featured properties and start your journey to finding your perfect home today."> 15 <meta property="og:image" content="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/4195cfd1-eaa5-4ed1-bc36-0235a5ac221a"> 16 <meta name="twitter:image" content="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/4195cfd1-eaa5-4ed1-bc36-0235a5ac221a"> 17 <meta property="og:url" content="https://rosengroupdallas.com/properties/sale"> 18 <link rel="canonical" href="https://rosengroupdallas.com/properties/sale"> 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=Syncopate:400,700"><style>@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Regular.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Regular.woff') format('woff');font-weight: 400;font-style: normal;}@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Italic.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Italic.woff') format('woff');font-weight: 400;font-style: italic;}@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Medium.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Medium.woff') format('woff');font-weight: 500;font-style: normal;}@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-MediumItalic.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-MediumItalic.woff') format('woff');font-weight: 500;font-style: italic;}@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Bold.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Bold.woff') format('woff');font-weight: 700;font-style: normal;}@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-BoldItalic.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-BoldItalic.woff') format('woff');font-weight: 700;font-style: italic;}@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Medium.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-Medium.woff') format('woff');font-weight: 600;font-style: normal;}@font-face {font-family: 'CompassSans';src: url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-MediumItalic.woff2') format('woff2'),url('https://s3-us-west-2.amazonaws.com/static-lp/fonts/compass/CompassSans/CompassSans-MediumItalic.woff') format('woff');font-weight: 600;font-style: italic;}</style> 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:Syncopate,sans-serif;--global-primary-font-family-short:Syncopate;--global-secondary-font-family:CompassSans,sans-serif;--global-secondary-font-family-short:CompassSans;--global-body-padding:0px;--global-background-color:#fff;--global-body-font-size:16px;--global-h1-font-size:48px;--global-h2-font-size:32px;--global-h3-font-size:20px;--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:CompassSans,sans-serif;font-size:16px;}@media (min-width: 768px){body{padding:0px 0px 0px 0px;}}h1,h2,h3,h4,h5,h6,button{font-family:Syncopate,sans-serif;}h1{font-size:48px;}h2{font-size:32px;}h3{font-size:20px;}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">:root{--global-h4-font-size:32px;--global-h5-font-size:24px;--global-h6-font-size:20px;--custom-opacity:rgba(157, 140, 121, .4);}@media only screen and (max-width: 768px){div#modal-global-contact-us .modal-content .contact-form-modal-form__title{padding-top:20px;}}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;}h1.custom-intro__title--with-pretitle:before,[class*="intro__title"]:before{display:none;}
31h2:before{display:none!important;}section:has(.custom-intro) .custom-intro__overlay,section:has(.custom-intro) .custom-intro__pre-title{display:none;}section:has(.custom-intro) .custom-intro__title{margin-bottom:30px;}section:has(.custom-intro) .custom-intro__scroll-btn{background:transparent!important;border-color:rgba(255, 255, 255, .4)!important;}section:has(.custom-intro) .custom-intro__scroll-btn::after{background-color:#fff!important;}section:has(.custom-intro) .custom-intro__scroll-btn:hover{background:transparent!important;border-color:#fff!important;}@media only screen and (max-width: 768px){.contact-form-modal__close:after{height:25px;width:20px;--iconColor:#000;}}@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;}}@media only screen and (min-width: 769px){.page-about-sir .lp-vertical-paddings:not([class*="pb-"]){padding-bottom:128px;padding-top:128px;}}@media only screen and (max-width: 768px){.page-about-sir .lp-vertical-paddings:not([class*="pb-"]){padding-bottom:80px;padding-top:80px;}}@media only screen and (min-width: 769px){.page-sir-auction .lp-vertical-paddings:not([class*="pb-"]){padding-bottom:128px;padding-top:128px;}}@media only screen and (max-width: 768px){.page-sir-auction .lp-vertical-paddings:not([class*="pb-"]){padding-bottom:80px;padding-top:80px;}}.page-concierge-auctions .custom-intro__title:after{content:"";background-image:url(https://media-production.lp-cdn.com/media/97d074d2-9190-4504-942c-236898102d72);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;}.lp-h1{text-transform:uppercase;}.lp-h2{text-transform:uppercase;}h1{text-transform:uppercase;}h2{text-transform:uppercase;}h3{text-transform:uppercase;}h4{text-transform:uppercase;}h5{text-transform:uppercase;}h6{text-transform:uppercase;}div#global-sidemenu.sidemenu a{text-transform:uppercase;}div#global-sidemenu.sidemenu button{text-transform:uppercase;}div#modal-global-contact-us .modal-content .contact-form-modal__close{color:#707070;background:transparent;}@media(max-width:1024px){div#modal-global-contact-us .modal-content .contact-form-modal__close{top:40px;right:10px;color:#707070!important;}div#modal-global-contact-us .modal-content .contact-form-modal__close::after{background-color:#707070!important;}}div#modal-global-contact-us .modal-content .contact-form-modal__close:hover{color:#707070!important;opacity:.7;}div#modal-global-contact-us .modal-content .contact-form-modal__close:hover::after{background:#707070;}div#modal-global-contact-us .modal-content .contact-form-modal__bg{background-image:linear-gradient( 32 rgba(234, 231, 224, 0.97), 33 rgba(234, 231, 224, 0.97) 34 ),url("https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/eb35bd67-1bfe-4e9b-b59c-7f3a39631930");}div#modal-global-contact-us .modal-content .contact-form-modal__bg img{display:none;}div#modal-global-contact-us .modal-content .contact-form-modal-form{background:rgba(255,255,255,0.8);}div#modal-global-contact-us .modal-content .contact-form-modal__container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-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;max-width:1000px;margin-left:auto;margin-right:auto;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-details,div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-form{width:100%;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-details{text-align:center;padding:0;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-details .contact-form-modal-details__title{max-width:unset;color:#707070;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-details .contact-form-modal-details__title::after{content:' Touch';font-weight:700;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-details .contact-form-modal-agent{-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-details .contact-form-modal-details__description{margin-left:auto;margin-right:auto;font-family:var(--lp-h1-font-family);color:#707070;letter-spacing:1px;font-weight:400;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-details .lp-socials{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}@media(min-width:1024px){div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-form{margin-top:30px;}}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-form .lp-input{background:transparent;border:1px solid rgba(157, 140, 121, .4);}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-form .lp-input:hover,div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-form .lp-input:active{border-color:#9d8c79;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-form .lp-label{text-transform:uppercase;letter-spacing:1px;font-size:12px;font-weight:400;}div#modal-global-contact-us .modal-content .contact-form-modal__container .lp-tcr-message{opacity:.5;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-submit{display:block;margin-left:auto!important;margin-right:auto!important;}div#modal-global-contact-us .modal-content .contact-form-modal__container .contact-form-modal-submit::after{display:none;}div#modal-global-contact-us .modal-content .contact-form-modal-form__title{color:#707070;}div#modal-global-contact-us .modal-content .contact-form-modal-form__title::after{content:' Touch';font-weight:700;}nav#global-navbar header.scroll .header-navigation__link:after{background:#9d8c79!important;}nav#global-navbar .header-navigation__link:after{background:#fff;}nav#global-navbar .header-navigation__sub-nav-link{font-weight:400;}nav#global-navbar .header-navigation__sub-nav-link:hover{color:#9d8c79;}nav#global-navbar .header{background-color:transparent!important;}nav#global-navbar .header .header-logo__img--dark{display:none;}nav#global-navbar .header .header-navigation__link{color:#fff;text-transform:uppercase;font-weight:400;}nav#global-navbar .header .header-navigation__link:hover{color:#fff;}nav#global-navbar .header .header-navigation__link:before{background-color:#fff;}nav#global-navbar .header .header-navigation__sub-nav{background-color:#fff;}nav#global-navbar .header .header-navigation__sub-nav-link{text-transform:uppercase;color:#707070;}nav#global-navbar .header .header-navigation__sub-nav-link:hover{color:#9d8c79;}nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn,nav#global-navbar .header .header-search-btn{border-color:transparent;background-color:transparent;}nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:after,nav#global-navbar .header .header-search-btn:after,nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:before,nav#global-navbar .header .header-search-btn:before{background-color:#fff;}nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:hover,nav#global-navbar .header .header-search-btn:hover{background-color:transparent;border-color:transparent;}nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:hover:after,nav#global-navbar .header .header-search-btn:hover:after,nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:hover:before,nav#global-navbar .header .header-search-btn:hover:before{background-color:#fff;}nav#global-navbar .header.scroll{box-shadow:rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;background-color:#EAE7E0!important;color:#707070!important;}nav#global-navbar .header.scroll .header-logo__img--dark{display:block;}nav#global-navbar .header.scroll .header-navigation__link{color:#707070;text-transform:uppercase;font-weight:400;}nav#global-navbar .header.scroll .header-navigation__link:hover{color:#9d8c79;}nav#global-navbar .header.scroll .header-navigation__link:before{background-color:#fff;}nav#global-navbar .header.scroll .header-navigation__sub-nav{background-color:#fff;}nav#global-navbar .header.scroll .header-navigation__link:hover{color:#9d8c79;}nav#global-navbar .header.scroll .header-navigation__link:hover:before{background-color:#9d8c79;}nav#global-navbar .header.scroll .button-style-2{color:#9d8c79!important;background-color:transparent!important;border-color:rgba(157, 140, 121, 0.4)!important;}nav#global-navbar .header.scroll .button-style-2:hover{border-color:rgba(157, 140, 121, 1)!important;}nav#global-navbar .header.scroll .header-buttons-wrapper .header-hamburger-btn,nav#global-navbar .header.scroll .header-search-btn{border-color:transparent;background-color:transparent;}nav#global-navbar .header.scroll .header-buttons-wrapper .header-hamburger-btn:after,nav#global-navbar .header.scroll .header-search-btn:after,nav#global-navbar .header.scroll .header-buttons-wrapper .header-hamburger-btn:before,nav#global-navbar .header.scroll .header-search-btn:before{background-color:#9d8c79;}nav#global-navbar .header.scroll .header-buttons-wrapper .header-hamburger-btn:hover,nav#global-navbar .header.scroll .header-search-btn:hover{background-color:transparent;border-color:transparent;}nav#global-navbar .header.scroll .header-buttons-wrapper .header-hamburger-btn:hover:after,nav#global-navbar .header.scroll .header-search-btn:hover:after,nav#global-navbar .header.scroll .header-buttons-wrapper .header-hamburger-btn:hover:before,nav#global-navbar .header.scroll .header-search-btn:hover:before{background-color:#9d8c79;}.page-property-details nav#global-navbar .header .header-navigation__link{color:#707070;text-transform:uppercase;font-weight:400;}.page-property-details nav#global-navbar .header .header-navigation__link:before{background-color:#707070;}.page-property-details nav#global-navbar .header .header-navigation__link:after{background-color:#707070;}.page-property-details nav#global-navbar .header .header-navigation__link:hover{color:#9d8c79;}.page-property-details nav#global-navbar .header .header-navigation__link:hover:before{background-color:#9d8c79;}.page-property-details nav#global-navbar .header .header-navigation__link:hover:after{background-color:#9d8c79;}.page-property-details nav#global-navbar .header .button-style-2{color:#9d8c79!important;background-color:transparent!important;border-color:rgba(157, 140, 121, 0.4)!important;}.page-property-details nav#global-navbar .header .button-style-2:hover{border-color:rgba(157, 140, 121, 1)!important;}.page-property-details nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn,.page-property-details nav#global-navbar .header .header-search-btn{border-color:transparent;background-color:transparent;}.page-property-details nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:after,.page-property-details nav#global-navbar .header .header-search-btn:after,.page-property-details nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:before,.page-property-details nav#global-navbar .header .header-search-btn:before{background-color:#9d8c79;}.page-property-details nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:hover,.page-property-details nav#global-navbar .header .header-search-btn:hover{background-color:transparent;border-color:transparent;}.page-property-details nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:hover:after,.page-property-details nav#global-navbar .header .header-search-btn:hover:after,.page-property-details nav#global-navbar .header .header-buttons-wrapper .header-hamburger-btn:hover:before,.page-property-details nav#global-navbar .header .header-search-btn:hover:before{background-color:#9d8c79;}.page-property-details nav#global-navbar .header .header-logo__img--dark{display:block!important;height:60px;}.page-property-details nav#global-navbar .header .header-logo__img--light{display:none!important;}@media (min-width: 1025px){#global-mobile-contact .pop-up{max-width:50vw!important;}}#global-mobile-contact .lp-ico:before{background-color:#817e61;}#global-mobile-contact .contact-form__container{border-color:#817e61;}#global-mobile-contact .lp-input{background-color:#fff;color:#817e61;}#global-mobile-contact h3{color:#817e61;}#global-mobile-contact .contact-form,#global-mobile-contact .lp-container{padding:25px;}@media (max-width: 767px){#global-mobile-contact .contact-form,#global-mobile-contact .lp-container{padding:10px;}}#global-mobile-contact .lp-disclaimer{color:#141414;}@media (max-width: 767px){#global-mobile-contact .lp-disclaimer{font-size:8px;}}@media (max-width: 767px){#global-mobile-contact .close-btn{margin-top:5px;}}@media (max-width: 1530px){#global-sidemenu .lp-socials{max-width:200
34px;}}#global-sidemenu:before{opacity:0.015;content:"";width:100%;height:100%;display:block;position:absolute;background-repeat:no-repeat;-webkit-background-size:600px;background-size:600px;-webkit-background-position:90% 50%;background-position:90% 50%;top:0;left:0;}#global-sidemenu .sidemenu-navigation__link,#global-sidemenu .sidemenu-navigation-sub-nav__item{text-transform:uppercase;box-orient:none!important;line-clamp:none!important;display:block!important;color:#707070;}#global-sidemenu .sidemenu-navigation__link:hover,#global-sidemenu .sidemenu-navigation-sub-nav__item:hover{color:#141414;}#global-sidemenu .sidemenu-navigation-sub-nav__link:hover{text-decoration-color:#817e61;}#global-sidemenu .sidemenu-navigation__item{gap:0;-webkit-transition:all ease .3s;transition:all ease .3s;}#global-sidemenu .sidemenu-navigation__item .sidemenu-navigation-sub-nav{height:0;-webkit-transform:scaleY(0);-moz-transform:scaleY(0);-ms-transform:scaleY(0);transform:scaleY(0);-webkit-transition:all ease .3s;transition:all ease .3s;transform-origin:top;opacity:0;}#global-sidemenu .sidemenu-navigation__item:hover{gap:14px;}#global-sidemenu .sidemenu-navigation__item:hover .sidemenu-navigation-sub-nav{height:auto;-webkit-transform:scaleY(100%);-moz-transform:scaleY(100%);-ms-transform:scaleY(100%);transform:scaleY(100%);opacity:1;}#global-sidemenu .sidemenu__col-description{color:#707070;}#global-footer .footer a:hover{text-decoration-color:#817e61!important;}#global-sidemenu a:hover{text-decoration-color:#817e61!important;}.button-style-1,.button-style-2,.button-style-3,.button-style-4{font-weight:500;letter-spacing:1px;text-align:center;font-size:14px;border-radius:0;}.lp-btn .lp-btn--filled__content,.lp-btn .lp-btn__content{padding-right:0;}.lp-btn .lp-btn--filled__content:after,.lp-btn .lp-btn__content:after{display:none;}.newsletter-contact-cta__btn:before{display:none!important;}.is-font-color-dark .lp-arrow{border-radius:0;border-color:rgba(157, 140, 121, 0.4);background-color:transparent;color:#9d8c79;}.is-font-color-dark .lp-arrow:after{background-color:#9d8c79;}.is-font-color-dark .lp-arrow:hover{background-color:transparent!important;border-color:#9d8c79!important;color:#9d8c79;}.is-font-color-dark .lp-arrow:hover:after{background-color:#9d8c79;}.is-font-color-light .lp-arrow{border-radius:0;background-color:transparent;border-color:rgba(255, 255, 255, 0.4);color:#fff;}.is-font-color-light .lp-arrow:after{background-color:#fff;}.is-font-color-light .lp-arrow:hover{background-color:transparent;border-color:#fff;}.is-font-color-light .lp-arrow:hover:after{background-color:#fff;}.paginationjs li a:hover:after{background-color:#9d8c79!important;}#global-footer::before{content:"";display:block;position:absolute;top:0;left:0;width:100%;height:100%;background:#fff;-webkit-background-position:center;background-position:center;background-repeat:no-repeat;-webkit-background-size:cover;background-size:cover;}@media (min-width: 769px){#global-footer::before{background-attachment:fixed;}}#global-footer .footer{position:relative;z-index:1;}#global-footer .footer__col-phone,#global-footer .footer__col-email,#global-footer .footer-navigation__link,#global-footer .footer-copyright a{position:relative;}#global-footer .footer__col-phone:after,#global-footer .footer__col-email:after,#global-footer .footer-navigation__link:after,#global-footer .footer-copyright a:after{content:"";position:absolute;display:block;left:0;bottom:0;height:1px;width:0;background-color:#9d8c79;-webkit-transition:all 0.4s;transition:all 0.4s;}#global-footer .footer__col-phone:hover,#global-footer .footer__col-email:hover,#global-footer .footer-navigation__link:hover,#global-footer .footer-copyright a:hover{color:#9d8c79;cursor:pointer;}#global-footer .footer__col-phone:hover:after,#global-footer .footer__col-email:hover:after,#global-footer .footer-navigation__link:hover:after,#global-footer .footer-copyright a:hover:after{width:100%;}#global-footer .footer-logos-row{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;display:block;margin-bottom:40px;}#global-footer .footer-logos-row img{max-height:150px;max-width:350px;width:100%;margin:auto;}#global-footer .footer-contact-row{-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;text-align:center;padding-bottom:30px;margin-bottom:50px;gap:40px;border-color:#9d8c79;}@media (max-width: 767px){#global-footer .footer-contact-row{gap:0;}}#global-footer .footer-contact-row .footer-info{border:none;-webkit-flex:1 1 66.66%;-ms-flex:1 1 66.66%;flex:1 1 66.66%;margin:0;max-width:unset;min-width:unset;}@media (max-width: 1024px){#global-footer .footer-contact-row .footer-info{-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;width:100%;}}#global-footer .footer-contact-row .footer-info .footer__col{margin:0;}#global-footer .footer-contact-row .footer-info .footer__section-content{gap:40px;}@media (max-width: 767px){#global-footer .footer-contact-row .footer-info .footer__section-content{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:0;}}#global-footer .footer-contact-row .footer-info .footer__section-content .footer__col-content{max-width:unset;min-width:unset;-webkit-flex:1 1 50%;-ms-flex:1 1 50%;flex:1 1 50%;}@media (max-width: 1024px){#global-footer .footer-contact-row .footer-info .footer__section-content .footer__col-content{-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;}}#global-footer .footer-contact-row .footer-info .footer__section-title{display:none;}#global-footer .footer-contact-row .footer-info .footer__col-title{max-width:unset;text-transform:uppercase;letter-spacing:2px;font-weight:500;font-size:14px;margin-bottom:10px;opacity:1;}#global-footer .footer-contact-row .footer-info .footer__col-description{max-width:unset;}#global-footer .footer-contact-row .lp-socials{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;padding-top:32px;-webkit-flex:1 1 33.33%;-ms-flex:1 1 33.33%;flex:1 1 33.33%;}#global-footer .footer-contact-row .lp-socials:before{content:"Follow Us";display:block;position:absolute;top:0;text-transform:uppercase;letter-spacing:2px;font-weight:500;margin-bottom:10px;font-size:14px;}@media (max-width: 1024px){#global-footer .footer-contact-row .lp-socials{-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;}}#global-footer .footer-navigation-row{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:20px;}#global-footer .footer-navigation-row .footer-navigation{gap:10px 0;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}@media (max-width: 1024px){#global-footer .footer-navigation-row .footer-navigation{width:100%;max-width:unset;min-width:unset;text-align:center;}}@media (min-width: 768px) and (max-width: 1024px){#global-footer .footer-navigation-row .footer-navigation{gap:20px 50px;}}@media (max-width: 767px){#global-footer .footer-navigation-row .footer-navigation{-ms-grid-auto-flow:unset;grid-auto-flow:unset;text-align:center;}}#global-footer .footer-navigation-row .footer-navigation-title{display:block;font-size:0;opacity:1;max-width:unset;width:100%;}#global-footer .footer-navigation-row .footer-navigation-title:after{content:"Sitemap";display:block;text-align:center;font-size:14px;letter-spacing:2px;font-weight:500;}#global-footer .footer-navigation-row .footer-navigation-title:last-of-type{display:none;}#global-footer .footer-disclaimer-row{padding-bottom:30px;margin-bottom:50px;border-bottom:1px solid #9d8c79;}@media (min-width: 769px){#global-footer .footer-copyright .footer-copyright__privacy-policy,#global-footer .footer-copyright .footer-copyright__privacy{padding:0;margin:0;border:none;}#global-footer .footer-copyright .footer-copyright__privacy>span{padding:0 20px;margin:0 20px;border:1px solid rgba(0, 0, 0, 0.2);border-width:0 1px;}}@media (max-width: 768px){#global-footer .footer-bottom-row{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;}#global-footer .footer-bottom-row .footer-copyright__powered,#global-footer .footer-bottom-row .footer-copyright__privacy{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:5px;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;}}#global-footer .footer-navigation__link{text-transform:uppercase;}#global-footer .lp-a a{text-decoration-color:#9d8c79;}div#global-sidemenu{background-color:#EAE7E0;width:100vw;}div#global-sidemenu .sidemenu-close{z-index:4;}div#global-sidemenu:after{opacity:0.06;content:"";display:block;position:absolute;width:100vw;height:100vh;top:0;left:0;background-image:url("https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/eb35bd67-1bfe-4e9b-b59c-7f3a39631930");-webkit-background-size:cover;background-size:cover;background-repeat:no-repeat;-webkit-background-position:top right;background-position:top right;}div#global-sidemenu:before{opacity:0.03;}div#global-sidemenu .sidemenu-wrapper{z-index:4;max-width:1920px;}div#global-sidemenu .sidemenu-wrapper .sidemenu-nav-holder{max-width:800px;}@media (min-width: 1025px){div#global-sidemenu{width:100vw;padding:120px 60px;}div#global-sidemenu .sidemenu-nav-holder{-webkit-column-count:2;column-count:2;display:block;}div#global-sidemenu .sidemenu-navigation{break-inside:avoid-column;padding-bottom:24px;}div#global-sidemenu .sidemenu-wrapper{width:100%;max-width:1920px;}div#global-sidemenu .sidemenu-footer:before{width:100%;}}div#global-sidemenu .sidemenu-navigation__link{font-size:20px;}div#global-sidemenu .sidemenu-footer:before{background-color:#9d8c79;opacity:1;}div#global-sidemenu .sidemenu__col-title{color:#9d8c79;}div#global-sidemenu .sidemenu-close{background:transparent;border:1px solid rgba(234, 231, 224, 0.4)!important;}div#global-sidemenu .sidemenu-close:before,div#global-sidemenu .sidemenu-close:after{background:#9d8c79;}div#global-sidemenu .sidemenu-close:hover{background:transparent;border-color:#9d8c79!important;}div#global-sidemenu .sidemenu-close:hover:before,div#global-sidemenu .sidemenu-close:hover:after{background:#9d8c79;}div#global-sidemenu .lp-a a:hover{color:#9d8c79;}.lp-btn,.custom-intro__scroll-btn,.lp-input,.lp-arrow,.floating-contact-button__btn-connect,.custom-select .custom-select-menu,.lp-pagination.pagination-container ul li a,.pagination-container ul li a,.mls-properties-with-map-card__img-wrap,.calendar__item,.mortgage-results,[class*="__scroll-btn"],[class*="__close"],.lp-lightbox-arrow,.agents-slider__position,.blog-posts-slider-item__category,.blog-posts-slider-item__tag,.properties-slider-card__tag,.properties-slider-card__feature,.properties-list-item__icon-tag,.properties-list-item__tag,.agents-list__item-tag{border-radius:0;}.header-hamburger-btn.lp-btn,.close.lp-btn,.lp-btn.lp-btn--circle{border-radius:0;}.footer-disclaimer img{margin-top:20px;}.footer-disclaimer a{color:unset;-webkit-text-decoration:underline;text-decoration:underline;text-underline-offset:2px;text-decoration-color:#ccc;-webkit-transition:.3s;transition:.3s;}.footer-disclaimer a:hover{text-decoration-color:#817e61;color:#817e61;}.footer-logos-row{max-width:250px;margin-left:auto;margin-right:auto;}@media(max-width:769px){.footer-logos-row{max-width:220px;}}.gallery-style-menu-grid__item:hover::before{background:var(--custom-opacity)!important;opacity:1!important;}</style> 35 <style id="wow-hide-elements">.wow{visibility:hidden!important}</style> 36 <style id="page-css"> 37 #section-a47ed492-3b7c-468d-99c5-27dfd2078c71{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;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/4195cfd1-eaa5-4ed1-bc36-0235a5ac221a');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro__scroll-btn{background-color:#817E61;border-color:#817E61;margin-top:20px;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro__scroll-btn:after{background:#FFF;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro__scroll-btn:hover{background-color:#817E61;border-color:#817E61;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71{-webkit-background-position:bottom;background-position:bottom;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71:after{content:"";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background:linear-gradient(to bottom, rgba(0, 0 ,0 ,0), rgba(0,0,0,0.7));z-index:1;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro__overlay{z-index:2;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro .custom-intro__content-box{background:transparent;margin-bottom:20px;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro .custom-intro__content-box .custom-intro__title{color:#FFF;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro .custom-intro__content-box .custom-intro__scroll-btn{margin-top:0;}@media (max-width: 767px){#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro{height:500px;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro .custom-intro__content-box{position:absolute;top:50%;}#section-a47ed492-3b7c-468d-99c5-27dfd2078c71 .custom-intro .custom-intro__overlay{height:115px;}}@media (min-width: 960px) and (orientation: landscape){#section-a47ed492-3b7c-468d-99c5-27dfd2078c71{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/4195cfd1-eaa5-4ed1-bc36-0235a5ac221a');}}@media (min-width: 1280px) and (orientation: landscape){#section-a47ed492-3b7c-468d-99c5-27dfd2078c71{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=1920/https://media-production.lp-cdn.com/media/4195cfd1-eaa5-4ed1-bc36-0235a5ac221a');}}@media (min-width: 1920px) and (orientation: landscape){#section-a47ed492-3b7c-468d-99c5-27dfd2078c71{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=2560/https://media-production.lp-cdn.com/media/4195cfd1-eaa5-4ed1-bc36-0235a5ac221a');}}@media (min-width: 2560px) and (orientation: landscape){#section-a47ed492-3b7c-468d-99c5-27dfd2078c71{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=3456/https://media-production.lp-cdn.com/media/4195cfd1-eaa5-4ed1-bc36-0235a5ac221a');}}#section-c20b1af6-e3e3-4d23-9029-d843644debe8{color:#707070;--fontColor:#707070;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:44%;--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(6 / 4 * var(--global-section-padding));--section-padding-bottom:calc(4 / 4 * var(--global-section-padding));background-color:#ffffff;}@media (max-width: 768px){#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list__show-btn{background:transparent;color:#9d8c79;border-color:rgba(157, 140, 121, .4);}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list__show-btn:hover{border-color:rgba(157, 140, 121, 1);}}@media(min-width:769px){#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .properties-list__filters{max-width:unset;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .properties-list__collection{gap:10px;margin:0;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .properties-list__collection .properties-list-item{width:calc(50% - 5px);position:relative;overflow:hidden;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .properties-list__collection .properties-list-item:hover .properties-list-item__info{-webkit-transform:unset;-moz-transform:unset;-ms-transform:unset;transform:unset;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .properties-list__collection .properties-list-item .properties-list-item__image-container{aspect-ratio:1/.725;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .properties-list__collection .properties-list-item .properties-list-item__info{position:absolute;bottom:0;background:rgba(234,231,224,0.9);width:100%;padding:30px 15px;-webkit-transition:.3s;transition:.3s;-webkit-transform:translatey(100%);-moz-transform:translatey(100%);-ms-transform:translatey(100%);transform:translatey(100%);}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .pagination-container{margin-top:20px;}}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .lp-input{background:transparent!important;border:1px solid rgba(157, 140, 121, .4)!important;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .lp-input:hover{border-color:rgba(157, 140, 121, 1)!important;background:transparent!important;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list .properties-list__input-row .properties-list__input-icon:after{background-color:#817E61;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 .properties-list-item__tag{opacity:1!important;background-color:#EBE7E0!important;color:#000;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8 h2:after{content:" Active Listings";font-weight:700;letter-spacing:2px;}#section-c20b1af6-e3e3-4d23-9029-d843644debe8>div:last-child{padding-top:calc(6 / 4 * var(--global-section-padding))!important;padding-bottom:calc(4 / 4 * var(--global-section-padding))!important;}#section-b903aacd-3b0c-4042-9cd9-3066a61f407c{color:#707070;--fontColor:#707070;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:44%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#EBE7E0;--bgColor_H:38;--bgColor_S:22%;--bgColor_L:90%;--bgColor_A:1;--bgColor_darkenDir:-1;--section-padding-top:calc(6 / 4 * var(--global-section-padding));--section-padding-bottom:calc(6 / 4 * var(--global-section-padding));background-color:#EBE7E0;}#section-b903aacd-3b0c-4042-9cd9-3066a61f407c .simple-cta .simple-cta__text-block p{margin-bottom:0;}#section-b903aacd-3b0c-4042-9cd9-3066a61f407c .simple-cta .simple-cta__container{max-width:1700px;}#section-b903aacd-3b0c-4042-9cd9-3066a61f407c .simple-cta .simple-cta__container{max-width:1920px;}#section-b903aacd-3b0c-4042-9cd9-3066a61f407c .simple-cta .simple-cta__container .simple-cta__text-block{max-width:90%;}#section-b903aacd-3b0c-4042-9cd9-3066a61f407c .simple-cta .simple-cta__container .simple-cta__text-block h2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}#section-b903aacd-3b0c-4042-9cd9-3066a61f407c>div:last-child{padding-top:calc(6 / 4 * var(--global-section-padding))!important;padding-bottom:calc(6 / 4 * var(--global-section-padding))!important;}#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565{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;background-color:#ffffff;--gradient-color:var(--overlay-color, rgba(0, 0, 0, 0.3));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/37723123-8e08-4e2d-be7e-4333579850c7');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565 .newsletter-contact-cta__wrapper{-webkit-box-pack:center;-ms-flex-pack:center;
37-webkit-justify-content:center;justify-content:center;}#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565 .newsletter-contact-cta__description,#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565 .newsletter-contact-cta__prefix-cell,#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565 .newsletter-contact-cta__word-word{opacity:1;}@media (min-width: 1300px){#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565{background-attachment:fixed;-webkit-background-position:center;background-position:center;background-repeat:no-repeat;-webkit-background-size:cover;background-size:cover;}}#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565 h2:after{content:"With Us";font-weight:700;letter-spacing:2px;}@media (min-width: 960px) and (orientation: landscape){#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565{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/37723123-8e08-4e2d-be7e-4333579850c7');}}@media (min-width: 1280px) and (orientation: landscape){#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565{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=1920/https://media-production.lp-cdn.com/media/37723123-8e08-4e2d-be7e-4333579850c7');}}@media (min-width: 1920px) and (orientation: landscape){#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565{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=2560/https://media-production.lp-cdn.com/media/37723123-8e08-4e2d-be7e-4333579850c7');}}@media (min-width: 2560px) and (orientation: landscape){#section-16a9df67-1fdd-4f21-b174-bf9a1c14b565{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=3456/https://media-production.lp-cdn.com/media/37723123-8e08-4e2d-be7e-4333579850c7');}}#section-4668b610-d9c1-4a67-adf4-0e6b4204182e{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;background-color:#ffffff;}body>div.sidemenu{background-color:rgba(255, 255, 255, 1);color:rgba(0, 0, 0, 1);--fontColor:rgba(0, 0, 0, 1);--fontColor_H:0;--fontColor_S:0%;--fontColor_L:0%;--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;}footer{background-color:rgba(234, 231, 224, 1);color:rgba(54, 48, 49, 1);--fontColor:rgba(54, 48, 49, 1);--fontColor_H:350;--fontColor_S:6%;--fontColor_L:20%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:rgba(234, 231, 224, 1);--bgColor_H:42;--bgColor_S:19%;--bgColor_L:90%;--bgColor_A:1;--bgColor_darkenDir:-1;} 38 </style> 39 <style id="custom-style-css">.button-style-1{color:rgba(157, 140, 121, 1)!important;background-color:rgba(189, 175, 158, 0)!important;border-color:rgba(157, 140, 121, 0.4)!important;}.button-style-1:hover{color:rgba(157, 140, 121, 1)!important;background-color:rgba(145, 102, 72, 0)!important;border-color:rgba(157, 140, 121, 1)!important;}.pagination-style-1 li a{color:rgba(157, 140, 121, 1)!important;background-color:rgba(189, 175, 158, 0)!important;border-color:rgba(157, 140, 121, 0.4)!important;}.pagination-style-1 li a:hover{color:rgba(157, 140, 121, 1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(157, 140, 121, 1)!important;}.pagination-style-1 li.active a{color:rgba(157, 140, 121, 1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(157, 140, 121, 1)!important;}.social_icons-style-1 a{border-color:rgba(157, 140, 121, 0.4)!important;background-color:rgba(189, 175, 158, 0)!important;color:rgba(157, 140, 121, 1)!important;}.social_icons-style-1 a:hover{border-color:rgba(157, 140, 121, 1)!important;background-color:rgba(145, 102, 72, 0)!important;color:rgba(157, 140, 121, 1)!important;}.social_icons-style-1 a i{color:inherit!important;}
39.social_icons-style-1 a svg,.social_icons-style-1 a svg path{fill:currentColor!important;}.hyperlink-style-1{color:rgba(112, 112, 112, 1)!important;}.hyperlink-style-1:hover{color:rgba(129, 126, 97, 1)!important;}.hyperlink-style-2{color:rgba(255, 255, 255, 1)!important;}.hyperlink-style-2:hover{color:rgba(203, 202, 185, 1)!important;}.button-style-2{color:rgba(255, 255, 255, 1)!important;background-color:rgba(255, 255, 255, 0)!important;border-color:rgba(255, 255, 255, 0.4)!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(255, 255, 255, 0)!important;border-color:rgba(255, 255, 255, 0.4)!important;}.pagination-style-2 li a: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.active a{color:rgba(255, 255, 255, 1)!important;background-color:rgba(177, 132, 99, 0)!important;border-color:rgba(255, 255, 255, 1)!important;}.social_icons-style-2 a{border-color:rgba(255, 255, 255, 0.4)!important;background-color:rgba(255, 255, 255, 0)!important;color:rgba(255, 255, 255, 1)!important;}.social_icons-style-2 a:hover{border-color:rgba(255, 255, 255, 1)!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;}
39.social_icons-style-2 a svg,.social_icons-style-2 a svg path{fill:currentColor!important;}.button-style-3{color:rgba(255, 255, 255, 1)!important;background-color:rgba(157, 140, 121, 1)!important;border-color:rgba(157, 140, 121, 1)!important;}.button-style-3:hover{color:rgba(157, 140, 121, 1)!important;background-color:rgba(189, 175, 158, 0)!important;border-color:rgba(157, 140, 121, 1)!important;}.button-style-4{color:rgba(157, 140, 121, 1)!important;background-color:rgba(255, 255, 255, 1)!important;border-color:rgba(255, 255, 255, 1)!important;}.button-style-4:hover{color:rgba(255, 255, 255, 1)!important;background-color:rgba(255, 255, 255, 0)!important;border-color:#FFFFFF!important;}</style> 40 <!-- LP Consent bootstrap: blocking; resolves consent state, pushes Consent Mode 41 defaults, and dynamically loads the locale + main (and banner if needed). --> 42
42<script src="https://cdn.luxurypresence.com/scripts/lp-consent/latest/lp-consent-boot.js" data-website-id="efd0b616-93bf-43b2-a015-21b3983523b4"></script>
42 43 44 45
45<script> 46 (function utmParse() { 47 const url = new URL(window.location.href); 48 if (url.search) { 49 const utm = url.search.split(/\?|&/g).reduce((acc, current) => { 50 const matched = current.match(/utm_(content|campaign|medium|source|term|id)|gclid/g); 51 if (matched) { 52 acc[matched[0]] = current.replace(`${matched[0]}=`, ''); 53 } 54 return acc; 55 }, {}); 56 if (Object.keys(utm).length) { 57 window.localStorage.setItem('utm_vars', JSON.stringify(utm)); 58 } else { 59 // Remove old utm vars 60 window.localStorage.removeItem('utm_vars'); 61 } 62 } 63 // Set referrer in local storage 64 // This is meant to be stored once to avoid self-referrals and to have the first referrer only. 65 if (!window.localStorage.getItem('referrer')) { 66 // Capture the Referrer URL 67 const referrer = document.referrer; 68 if (referrer) { 69 // Only store the referrer if it comes from outside the current domain (to avoid self-referrals) 70 const currentDomain = window.location.hostname; 71 const referrerDomain = new URL(referrer).hostname; 72 73 if (referrerDomain !== currentDomain) { 74 // Store it in localStorage 75 localStorage.setItem('referrer', referrer); 76 } 77 } 78 } 79 })(); 80 </script>
80 81 <!-- Bing Webmaster Tools Verification -->
82<script> 83 // Check if on the homepage before the body loads 84 if (window.location.pathname === '/' || window.location.pathname === '/index.html') { 85 document.write('<meta name="msvalidate.01" content="50D3F5A253C07EC098EA320AB65632E2" />'); 86 } 87</script>
87 88 89<!-- begin Compass Pixel Code -->
90<script 91 src="https://www.compass.com/cxlp/a.min.js" 92 id="cxlp-ajs" 93 data-client-id="b2xuqqjb9nq1" 94 async 95></script>
95 96<!-- end Compass Pixel Code --> 97 98
99<script type="text/javascript"> 100 // Function to inject JSON-LD schema 101 function injectSchema(schema) { 102 var script = document.createElement('script'); 103 script.type = 'application/ld+json'; 104 script.text = JSON.stringify(schema); 105 document.head.appendChild(script); 106 } 107 108 // Check if the current path is the homepage 109 if (window.location.pathname === '/') { 110 var realEstateAgentSchema = { 111 "@context": "https://schema.org", 112 "@type": "RealEstateAgent", 113 "name": "The Rosen Group", 114 "image": "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/73ba6108-baa0-475b-9b27-2c49bd7d35ea", 115 "@id": "https://rosengroupdallas.com/#realEstateAgent", 116 "url": "https://rosengroupdallas.com/", 117 "telephone": "(214)927-1313", 118 "email": "[email protected]", 119 "description": "Dallas luxury real estate team led by Jordan and Jonathan Rosen, specializing in high-end residential sales in Highland Park, University Park, and Preston Hollow.", 120 "address": { 121 "@type": "PostalAddress", 122 "streetAddress": "5960 Berkshire Ln Ste 700", 123 "addressLocality": "Dallas", 124 "addressRegion": "TX", 125 "postalCode": "75225", 126 "addressCountry": "US" 127 }, 128 "geo": { 129 "@type": "GeoCoordinates", 130 "latitude": 32.8647265, 131 "longitude": -96.8096770 132 }, 133 "openingHoursSpecification": { 134 "@type": "OpeningHoursSpecification", 135 "dayOfWeek": [ 136 "Monday", 137 "Tuesday", 138 "Wednesday", 139 "Thursday", 140 "Friday", 141 "Saturday", 142 "Sunday" 143 ], 144 "opens": "00:00", 145 "closes": "23:59" 146 }, 147 "employee": [ 148 { 149 "@type": "Person", 150 "@id": "https://rosengroupdallas.com/#jordan-rosen", 151 "name": "Jordan Rosen", 152 "jobTitle": "Principal Associate Broker", 153 "image": "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/45cf699e-c039-4474-94aa-4f8e3a522aa7", 154 "url": "https://rosengroupdallas.com/agents/jordan-rosen", 155 "telephone": "(214)444-4813", 156 "email": "[email protected]", 157 "worksFor": { 158 "@id": "https://rosengroupdallas.com/#realEstateAgent" 159 }, 160 "sameAs": [ 161 "https://www.linkedin.com/in/jordan-rosen-b945a147/", 162 "https://www.zillow.com/profile/jordan-rosen", 163 "https://www.compass.com/agents/jordan-rosen/", 164 "https://www.instagram.com/jordan.rosen.dallas/", 165 "https://www.facebook.com/jordanrosendallas/" 166 ] 167 }, 168 { 169 "@type": "Person", 170 "@id": "https://rosengroupdallas.com/#jonathan-rosen", 171 "name": "Jonathan Rosen", 172 "jobTitle": "Principal", 173 "image": "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/d3949d84-cf36-42aa-8aca-4b533eaf63cd", 174 "url": "https://rosengroupdallas.com/agents/jonathan-rosen", 175 "telephone": "(214)927-1313", 176 "email": "[email protected]", 177 "worksFor": { 178 "@id": "https://rosengroupdallas.com/#realEstateAgent" 179 }, 180 "sameAs": [ 181 "https://www.linkedin.com/in/jonathan-rosen-1a777752/", 182 "https://www.compass.com/agents/jonathan-rosen/", 183 "https://www.zillow.com/profile/Jonathan%20Rosen", 184 "https://www.facebook.com/Jonathanrosencompassdallas/", 185 "https://www.instagram.com/jonathan.rosen.dallas/" 186 ] 187 } 188 ], 189 "sameAs": [ 190 "https://www.facebook.com/TheRosenGroup.compass/", 191 "https://www.instagram.com/the_rosen_group/", 192 "https://www.zillow.com/profile/therosengrouptx", 193 "https://www.compass.com/agents/the-rosen-group/" 194 ], 195 "knowsAbout": [ 196 "Luxury Real Estate", 197 "Residential Sales", 198 "New Development", 199 "High-End Property Sales", 200 "Luxury Home Buying", 201 "Luxury Home Selling", 202 "Relocation Services" 203 ] 204 }; 205 injectSchema(realEstateAgentSchema); 206 } 207</script>
207 208 209 <!-- GOOGLE TRANSLATE STYLES are moved to external CSS --> 210</head> 211<body> 212 <div id="google_translate_element" style="display: none"></div> 213 214 <nav id="global-navbar" data-el-id="3242b8f0-253e-46f7-b814-162ccf958ec2"> 215 216<header class="header js-header" style="--textColor: rgba(255, 255, 255, 1); --backgroundColor: rgba(26, 26, 26, 1);"> 217 <div class="header-container header-container--center"> 218 219 220 <ul class="header-navigation"> 221 <li class="header-navigation__item header-navigation__item--sub-nav"> 222 223 <a class="header-navigation__link js-subnav-opener" style="--delay: 0s">Properties</a> 224 225 <ul class="header-navigation__sub-nav"> 226 <li class="header-navigation__sub-nav-item"> 227 <a class="header-navigation__sub-nav-link" href="/properties/sale" >Featured Properties</a> 228 </li> 229 <li class="header-navigation__sub-nav-item"> 230 <a class="header-navigation__sub-nav-link" href="/properties/sold" >Notable Sales</a> 231 </li> 232 </ul> 233 </li> 234 <li class="header-navigation__item "> 235 236 <a class="header-navigation__link " href="/home-search/listings" style="--delay: 0.1s">Home Search</a> 237 </li> 238 <li class="header-navigation__item "> 239 240 <a class="header-navigation__link " href="/home-valuation" style="--delay: 0.2s">Home Valuation</a> 241 </li> 242 </ul> 243 244 <a href="/" class="header-logo"> 245 <img src="https://media-production.lp-cdn.com/media/bc58bcb6-b3ee-4667-a535-648a20928b9e" alt="Company logo" class="header-logo__img header-logo__img--dark"> 246 <img src="https://media-production.lp-cdn.com/media/bdbf0277-23b2-4b0e-9bce-4a1626da0f44" alt="Company logo" class="header-logo__img header-logo__img--light"> 247 </a> 248 249 <div class="header-buttons-wrapper"> 250 <ul class="header-navigation"> 251 <li class="header-navigation__item "> 252 <a class="header-navigation__link" href="/neighborhoods" style="--delay: 0s">Neighborhoods</a> 253 </li> 254 <li class="header-navigation__item "> 255 <a class="header-navigation__link" href="/team" style="--delay: 0.1s">Our Team</a> 256 </li> 257 </ul> 258 <a 259 role="button" 260 data-type="CONTACT_US" 261 class="header-contact-btn lp-btn button-style-2" 262 263 264 265 266 267 > 268 Contact Us 269 </a> 270 271 272 273 <button type="button" class="header-hamburger-btn lp-btn hamburger-component hamburger js-sidemenu-opener" 274 title="Toggle Sidemenu"></button> 275 </div> 276 </div> 277 278</header> 279 280 </nav> 281 <div id="global-sidemenu" class="sidemenu" data-el-id="033c3235-a8bd-45bf-a4a8-96977e33190d"> 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298<button class="sidemenu-close toggle close lp-btn lp-icon link-icon--plus"></button> 299 300 301<div class="sidemenu-wrapper " style="--navItemNumberColor: rgba(129, 126, 97, 1);"> 302 <div class="sidemenu-nav-holder "> 303 <ul class="sidemenu-navigation "> 304 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 305 <a 306 href="/" 307 class="sidemenu-navigation__link">Home</a> 308 309 </li> 310 311 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 312 <a 313 href="/team" 314 class="sidemenu-navigation__link">Meet the Team</a> 315 316 </li> 317 318 <li class="sidemenu-navigation__item js-idemenu-navigation-item sidemenu-navigation__item--sub-nav"> 319 <span class="sidemenu-navigation__link sidemenu-navigation__link--sub-nav sidemenu-navigation__link--sub-nav-active js-sub-nav-opener lp-icon"> 320 Properties 321 </span> 322 323 <ul class="sidemenu-navigation-sub-nav lp-a"> 324 <li class="sidemenu-navigation-sub-nav__item"><a href="/properties/sale" class="sidemenu-navigation-sub-nav__link">Featured Properties</a></li> 325 <li class="sidemenu-navigation-sub-nav__item"><a href="/properties/sold" class="sidemenu-navigation-sub-nav__link">Notable Sales</a></li> 326 </ul> 327 </li> 328 329 </ul> 330 331 <ul class="sidemenu-navigation "> 332 <li class="sidemenu-navigation__item js-idemenu-navigation-item sidemenu-navigation__item--sub-nav">
333 <span class="sidemenu-navigation__link sidemenu-navigation__link--sub-nav sidemenu-navigation__link--sub-nav-active js-sub-nav-opener lp-icon"> 334 Homes for Sale 335 </span> 336 337 <ul class="sidemenu-navigation-sub-nav lp-a"> 338 <li class="sidemenu-navigation-sub-nav__item"><a href="/neighborhoods/highland-park" class="sidemenu-navigation-sub-nav__link">Highland Park, TX</a></li> 339 </ul> 340 </li> 341 342 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 343 <a 344 href="/home-search/listings" 345 class="sidemenu-navigation__link">Home Search</a> 346 347 </li> 348 349 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 350 <a 351 href="/home-valuation" 352 class="sidemenu-navigation__link">Home Valuation</a> 353 354 </li> 355 356 </ul> 357 358 <ul class="sidemenu-navigation "> 359 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 360 <a 361 href="/neighborhoods" 362 class="sidemenu-navigation__link">Neighborhoods</a> 363 364 </li> 365 366 <li class="sidemenu-navigation__item js-idemenu-navigation-item sidemenu-navigation__item--sub-nav"> 367 <span class="sidemenu-navigation__link sidemenu-navigation__link--sub-nav sidemenu-navigation__link--sub-nav-active js-sub-nav-opener lp-icon"> 368 Resources 369 </span> 370 371 <ul class="sidemenu-navigation-sub-nav lp-a"> 372 <li class="sidemenu-navigation-sub-nav__item"><a href="/buyers" class="sidemenu-navigation-sub-nav__link">Buyer's Guide</a></li> 373 <li class="sidemenu-navigation-sub-nav__item"><a href="/sellers" class="sidemenu-navigation-sub-nav__link">Seller's Guide</a></li> 374 <li class="sidemenu-navigation-sub-nav__item"><a href="/blog" class="sidemenu-navigation-sub-nav__link">Blog</a></li> 375 </ul> 376 </li> 377 378 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 379 <a 380 href="/testimonials" 381 class="sidemenu-navigation__link">Testimonials</a> 382 383 </li> 384 385 </ul> 386 387 <ul class="sidemenu-navigation "> 388 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 389 <a 390 href="/press" 391 class="sidemenu-navigation__link">Press & Media</a> 392 393 </li> 394 395 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 396 <a 397 href="/exclusive-inventory" 398 class="sidemenu-navigation__link">Exclusive Inventory</a> 399 400 </li> 401 402 <li class="sidemenu-navigation__item js-idemenu-navigation-item "> 403 <a 404 href="/contact" 405 class="sidemenu-navigation__link">Contact Us</a> 406 407 </li> 408 409 </ul> 410 </div> 411 412 <div class="sidemenu-footer"> 413 <div class="sidemenu__info-group sidemenu__col"> 414 <div class="sidemenu__section-content"> 415 <div class="sidemenu__col-content"> 416 <p class="sidemenu__col-title">Contact</p><div class="sidemenu__col-description lp-a"> 417 <p class="sidemenu__col-agent-name">The Rosen Group</p> 418 <a href="tel:2149271313" class="sidemenu__col-phone">(214) 927-1313</a> 419 <a href="/cdn-cgi/l/email-protection#2b4144454a5f434a45055944584e456b4844465b4a585805484446" class="sidemenu__col-email"><span class="__cf_email__" data-cfemail="503a3f3e312438313e7e223f23353e10333f3d203123237e333f3d">[email protected]</span></a> 420 </div> 421 </div> 422 <div class="sidemenu__col-content"> 423 <p class="sidemenu__col-title">Office</p> <div class="sidemenu__col-description lp-a sidemenu__col-description--pre-line"><p>5960 Berkshire Ln Ste 700<br>Dallas TX 75225</p></div> 424 425 </div> 426 </div> 427 428 </div> 429 430 <div class="sidemenu-socials-block"> 431 <p class="sidemenu__col-title">Follow Us</p> 432 <ul class="lp-socials social_icons-style-1"> 433 434 <li> 435 <a 436 href="https://www.facebook.com/TheRosenGroup.compass/" 437 class="lp-socials__link" 438 data-wow-delay="0s" 439 target="_blank" 440 aria-label="FACEBOOK" 441 >
442 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 443 </a> 444 </li> 445 <li> 446 <a 447 href="https://www.instagram.com/https://www.instagram.com/the_rosen_group/" 448 class="lp-socials__link" 449 data-wow-delay="0.1s" 450 target="_blank" 451 aria-label="INSTAGRAM" 452 > 453 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 454 </a> 455 </li> 456 <li> 457 <a 458 href="https://www.zillow.com/profile/therosengrouptx" 459 class="lp-socials__link" 460 data-wow-delay="0.2s" 461 target="_blank" 462 aria-label="ZILLOW" 463 > 464 <span class="lp-i lp-i--zillow" aria-hidden="true"></span> 465 </a> 466 </li> 467 <li> 468 <a 469 href="https://www.compass.com/agents/the-rosen-group/" 470 class="lp-socials__link" 471 data-wow-delay="0.3s" 472 target="_blank" 473 aria-label="BROKERAGE" 474 > 475 <svg width="20" height="20" viewBox="0 0 60.14 60"><path d="M29.86 0a30 30 0 00.28 60 30.03 30.03 0 0030-30A30 30 0 0029.86 0zm.28 8a22.03 22.03 0 0122 22 22 22 0 11-22-22zm7.18 9.17l-20 20 5.65 5.66 20-20z" /></svg> 476 </a> 477 </li> 478 </ul> </div> 479 </div> 480</div> 481 </div> 482 <div id="global-mobile-contact" class="mobile-contact-wrapper" data-el-id="4c08210d-8fa1-4e4b-ad13-3209994c2ceb"> 483 <div class="floating-contact-button"> 484 <div class="floating-contact-button__btn-holder js-btn-holder" 485 style="--backgroundColor: rgba(234, 231, 224, 1); --textColor: rgba(54, 48, 49, 1); --pillTextColor: rgba(255, 255, 255, 1); --pillBackgroundColor: rgba(189, 175, 158, 1);"> 486 <button type="button" class="floating-contact-button__btn-connect js-btn-connect lp-icon lp-ico-arrow-top">Contact Us</button> 487 </div> 488 489 <div class="floating-contact-button-pop-up js-pop-up" style="--backgroundColor: rgba(234, 231, 224, 1); --textColor: rgba(54, 48, 49, 1);"> 490 <form class="floating-contact-button-pop-up__form js-form" data-type="contact-form"> 491 <h3 class="floating-contact-button-pop-up__title">Leave a Message</h3> 492 493 <div class="floating-contact-button-pop-up__input-group lp-input-group"> 494 <input id="__FullName" type="text" name="name" 495 class="lp-input js-input-name lp-input--light" 496 required placeholder="Full Name"> 497 </div> 498 499 <div class="floating-contact-button-pop-up__input-group lp-input-group"> 500 <input id="__Email" type="email" name="email" 501 class="lp-input js-email-input " 502 required placeholder="Email"> 503 </div> 504 505 <div class="floating-contact-button-pop-up__input-group lp-input-group"> 506 <input class="lp-input " type="tel" placeholder="Phone" id="__Phone" 507 name="phone" required> 508 </div> 509 510 <select name="interest" id="-field-interest" 511 class="floating-contact-button-pop-up__input-group lp-input js-select " required> 512 <option value="" selected disabled data-label="Interest">Interested in...</option> 513 <option value="Selling & Buying">Selling & Buying</option> 514 <option value="Selling">Selling</option> 515 <option value="Buying">Buying</option> 516 <option value="Renting">Renting</option> 517 <option value="Other">Other</option> 518 <label for="-field-interest" class="lp-label sr-only">Interest</label> 519 </select> 520 521 <div class="floating-contact-button-pop-up__input-group lp-input-group"> 522 <textarea name="message" rows="4" id="__Message" class="lp-in
522put " 523 placeholder="Message" required></textarea> 524 </div> 525 526 <div class="lp-disclaimer"> <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label> 527 <label class='lp-tcr-content'> 528 <span class='lp-tcr-checkbox'> 529 <input 530 type='checkbox' 531 id='-termsAccepted' 532 name='termsAccepted' 533 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 534 oninput="this.setCustomValidity('')" 535 required 536 /></span> 537 <span class='lp-tcr-message'> 538 539 I agree to be contacted by 540 The Rosen Group 541 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 542 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 543 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 544 </span> 545 </label> 546 547</div> 548 549 <button type="submit" class="floating-contact-button-pop-up__btn-submit lp-btn lp-btn--mob-full-width ">Submit</button> 550 551 <div class="lp-h-pot"> 552 <input id="__newsSignMiddleName" name="middleName" value="" autocomplete="off" 553 tabindex="-1"> 554 </div> 555 <input style="display: none;" type="text" name="source" value="CONTACT_INQUIRY" /> 556 <input type="hidden" name="button_text" value="Contact Us"> 557 </form> 558 559 <div class="floating-contact-button-pop-up__success js-success"> 560 <h3 class="floating-contact-button-pop-up__title">Thank you for your message. We will be in touch with you shortly.</h3> 561 562 <a 563 href="/properties/sale" 564 565 class="lp-btn floating-contact-button-pop-up__success-btn" 566 567 568 569 570 571 > 572 Explore Our Properties 573 </a> 574 </div> 575 <button type="button" class="floating-contact-button-pop-up__close js-close-btn lp-icon"></button> 576 </div> 577 578</div> 579 580 </div> 581 <section class="image-section is-font-color-light is-background-color-light" id="section-a47ed492-3b7c-468d-99c5-27dfd2078c71" data-el-id="d1637c2a-e69e-42d9-8d39-7fe5c68c7ee9"> 582 <div class="custom-intro js-scroll-section custom-intro__horizon-center custom-intro__vertical-bottom" 583 style=" 584 --titleColor: rgba(255, 255, 255, 1); 585 --boxBackColor: rgba(255, 255, 255, 1); 586 --backOverlayColor: rgba(255, 255, 255, 1); 587 " 588 > 589 <div class="custom-intro__overlay"></div> 590 <div class="custom-intro__container"> 591 <div class="custom-intro__content-wrapper"> 592 <div class="custom-intro__content-box"> 593 <h1 class="custom-intro__title ">Featured Properties</h1> 594 <div class="custom-intro__scroll-btn jsScrollBtn"></div> 595 </div> 596 </div> 597 </div> 598</div> 599 600</section> 601<section id="section-c20b1af6-e3e3-4d23-9029-d843644debe8" class="solid-section is-font-color-dark is-background-color-light" data-el-id="194f7b4b-fe39-4449-93f2-7e4994a1baa6">
vendor: 111 bytes, lines 601-602
601 602 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
602<script src="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/15.8.1/nouislider.min.js" integrity="sha512-g/feAizmeiVKSwvfW0Xk3ZHZqv5Zs8PEXEBKzL15pM0SevEvoX8eJ4yFWbqakvRj7vtw1Q97bLzEpG2IVWX0Mg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
602 603<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/15.8.1/nouislider.css" integrity="sha512-MKxcSu/LDtbIYHBNAWUQwfB3iVoG9xeMCm32QV5hZ/9lFaQZJVaXfz9aFa0IZExWzCpm7OWvp9zq9gVip/nLMg==" crossorigin="anonymous" referrerpolicy="no-referrer" /> 604 605
606<script type="text/x-handlebars-template" class="propertyItem pagination-script"> <a href="{{#if fromMLS}}/home-search/listings/{{id}}{{else}}/properties/{{slug}}{{/if}}" class="properties-list-item"> 607 <div class="properties-list-item__image-container lp_animation-img-zoom"> 608 <span class="properties-list-item__tag lp-tag">{{formatPropertyStatus status false (hbFormatDate soldDate)}}</span> 609 {{#if openHouseHours}} 610 <span class="properties-list-item__open-houses lp-tag">Open House: {{openHouseHours}}</span> 611 {{/if}} 612 {{{mediaImage media.[0] alt=name width="400" height="270" class="properties-list-item__image"}}} 613 </div> 614 615 <div class="properties-list-item__info"> 616 617 <div class="properties-list-item__top-block"> 618 <p class="properties-list-item__address">{{#if privateAddress}}Private Address{{else}}{{fullAddress}}{{/if}}</p> 619 <h4 class="properties-list-item__price">{{formatPropertyPrice this}}</h4> 620 621 {{#if (or bedroomCount livingSpaceSize bathCount fullBathCount halfBathCount threeQuarterBathCount)}} 622 <div class="properties-list-item__icons-row"> 623 {{#if bedroomCount}} 624 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">{{bedroomCount}} Bed{{#numCompare bedroomCount 1 ">"}}s{{/numCompare}}</div> 625 {{/if}} 626 627 {{#if bathCount}} 628 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">{{bathCount}} Bath{{#numCompare bathCount 1 ">"}}s{{/numCompare}}</div> 629 {{/if}} 630 631 {{#if livingSpaceSize}} 632 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">{{lpFormatNumber livingSpaceSize}} {{formatAreaUnit livingSpaceUnits}}</div> 633 {{/if}} 634 </div> 635 {{/if}} 636 </div> 637 638 <div class="properties-list-item__bottom-block"> 639 {{#if description}} 640 <p class="properties-list-item__bottom-label">Property description</p> 641 <p class="properties-list-item__description">{{{truncate (striptags description) 200 '...'}}}</p> 642 {{/if}} 643 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 644 </div> 645 646 </div> 647 </a> 648</script>
648 649 650 <div class="properties-list lp-vertical-paddings" style="--titleColor: rgba(112, 112, 112, 1);"> 651 652 653 654 <span class="properties-list__show-btn show-btn lp-btn js-show-filter"><span>Show Filters <span class="properties-list__selected-filters js-selected-filters">0</span></span> <span class="properties-list__btn-icon lp-icon lp-icon-arrow"></span></span> 655 <span class="properties-list__hide-btn hide-btn lp-btn js-hide-filter">Hide Filters <span class="properties-list__btn-icon lp-icon lp-icon-arrow"></span></span> 656 657 <div class="properties-list__filters filters search-container" data-fetch-neighborhoods="true" data-fetch-rental-rates="true" aria-labelledby="filtersTitle"> 658 <input name="companyId" type="hidden" value="116d6abd-55d8-410f-b7f3-bdd7f6c5b727" /> 659 660 <div class="properties-list__input-row"> 661 <div class="properties-list__input-group properties-list__input-group--search lp-input-group lp-input-group--search lp-input--with-icon"> 662 <input type="text" class="properties-list__input lp-input" placeholder="Search by address" id="section-c20b1af6-e3e3-4d23-9029-d843644debe8-search-input" name="search-input"> 663 <span class="properties-list__input-icon lp-icon lp-input-icon lp-input-icon--search"></span> 664 </div> 665 666 <div class="properties-list__input-group properties-list__input-group--neighborhood lp-input-group js-neighborhoods-select-holder"> 667 <select id="section-c20b1af6-e3e3-4d23-9029-d843644debe8-neighborhood" name="neighborhood-select" class="properties-list__dropdown-select lp-input dropdown-select js-neighborhoods-select"> 668 <option value="" selected disabled hidden data-label="Select neighborhood">Select neighborhood</option> 669 </select> 670 <label class="properties-list__label lp-label" for="section-c20b1af6-e3e3-4d23-9029-d843644debe8-neighborhood" style="display: none">Select neighborhood</label> 671 </div> 672 673 <div class="properties-list__input-group properties-list__input-group--rental-rates lp-input-group js-rental-rates-select-holder"> 674 <select id="section-c20b1af6-e3e3-4d23-9029-d843644debe8-seasonal-price" name="seasonal-price" class="properties-list__dropdown-select lp-input dropdown-select js-rental-rates-select"> 675 <option value="" selected disabled hidden data-label="Rental availability">Rental availability</option> 676 </select> 677 <label class="properties-list__label lp-label" for="section-c20b1af6-e3e3-4d23-9029-d843644debe8-seasonal-price" style="display: none">Rental availability</label> 678 </div> 679 </div> 680 681 <div class="properties-list-range__row"> 682 683 <div class="properties-list-range__slider-group"> 684 <div class="properties-list-range__block"> 685 <span class="properties-list-range__label">Sales Price</span> 686 <div class="properties-list-range__range"> 687 <span class="js-price-slider-min properties-list-range__min"></span> 688 <span class="js-price-slider-max properties-list-range__max"></span> 689 <div class="js-price-slider" data-min="500000" data-max="50000000" data-step="100000"></div> 690 </div> 691 </div> 692 <div class="properties-list-range__block"> 693 <span class="properties-list-range__label paragraph--14">Sq. Ft.</span> 694 <div class="properties-list-range__range"> 695 <span class="js-area-slider-min properties-list-range__min"></span> 696 <span class="js-area-slider-max properties-list-range__max"></span> 697 <div class="js-area-slider" data-min="500" data-max="10000" data-step="500"></div> 698 </div> 699 </div> 700 </div> 701 702 <div> 703 <button type="button" class="properties-list-range__reset js-reset" aria-label="Clear search">Clear <span class="lp-icon"></span></button> 704 </div> 705 </div> 706 </div> 707 708 <div class="properties-list__collection properties-list__collection--grid data-container"> 709 <a href="/properties/6815-pemberton-drive-dallas-tx-us-75230-21369091" class="properties-list-item"> 710 <div class="properties-list-item__image-container lp_animation-img-zoom">
711 <span class="properties-list-item__tag lp-tag">Pending</span> 712 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21369091/-5403336985861414639.jpg" class="properties-list-item__image" height="270" width="400" alt="White two-story home with peaked gables, an arched entry, and landscaped front lawn at dusk." loading="lazy"> 713 </div> 714 715 <div class="properties-list-item__info"> 716 717 <div class="properties-list-item__top-block"> 718 <p class="properties-list-item__address">6815 Pemberton Drive, Dallas, TX 75230</p> 719 <h4 class="properties-list-item__price">$4,450,000</h4> 720 721 <div class="properties-list-item__icons-row"> 722 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">5 Beds</div> 723 724 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">7 Baths</div> 725 726 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">7,021 Sq.Ft.</div> 727 </div> 728 </div> 729 730 <div class="properties-list-item__bottom-block"> 731 <p class="properties-list-item__bottom-label">Property description</p> 732 <p class="properties-list-item__description">An exceptional expression of luxury in the heart of Preston Hollow, this architecturally striking home by Jessica Koltun Home embodies elevated design, sophisticated scale, and effortless livabilit...</p> 733 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 734 </div> 735 736 </div> 737 </a> 738 <a href="/properties/6034-park-lane-dallas-tx-us-75225-21378839" class="properties-list-item"> 739 <div class="properties-list-item__image-container lp_animation-img-zoom"> 740 <span class="properties-list-item__tag lp-tag">For Sale</span> 741 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21378839/-6006850327597780291.jpg" class="properties-list-item__image" height="270" width="400" alt="Stone-and-brick house with dormer windows, a landscaped lawn, and a brick-edged front walkway." loading="lazy"> 742 </div> 743 744 <div class="properties-list-item__info"> 745 746 <div class="properties-list-item__top-block"> 747 <p class="properties-list-item__address">6034 Park Lane, Dallas, TX 75225</p> 748 <h4 class="properties-list-item__price">$4,295,000</h4> 749 750 <div class="properties-list-item__icons-row"> 751 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">5 Beds</div> 752 753 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">7 Baths</div> 754 755 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">6,422 Sq.Ft.</div> 756 </div> 757 </div> 758 759 <div class="properties-list-item__bottom-block"> 760 <p class="properties-list-item__bottom-label">Property description</p> 761 <p class="properties-list-item__description">Set in the heart of coveted Preston Hollow, this beautiful French-inspired residence blends timeless architecture with refined, modern living. A grand, expansive foyer flows effortlessly into elega...</p> 762 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 763 </div> 764 765 </div> 766 </a> 767 <a href="/properties/3608-n-fitzhugh-avenue-dallas-tx-us-75204-21281581" class="properties-list-item"> 768 <div class="properties-list-item__image-container lp_animation-img-zoom"> 769 <span class="properties-list-item__tag lp-tag">For Sale</span> 770 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21281581/8029129852244187017.jpg" class="properties-list-item__image" height="270" width="400" alt="Open-plan kitchen and dining area with a stone island and sliding doors to a courtyard." loading="lazy"> 771 </div> 772 773 <div class="properties-list-item__info"> 774 775 <div class="properties-list-item__top-block"> 776 <p class="properties-list-item__address">3608 N Fitzhugh Avenue, Dallas, TX 75204</p> 777 <h4 class="properties-list-item__price">$2,149,000</h4> 778 779 <div class="properties-list-item__icons-row"> 780 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">3 Beds</div> 781 782 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">4 Baths</div> 783 784 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">3,055 Sq.Ft.</div> 785 </div> 786 </div> 787 788 <div class="properties-list-item__bottom-block"> 789 <p class="properties-list-item__bottom-label">Property description</p> 790 <p class="properties-list-item__description">Welcome to the epitome of modern elegance and serene living at 3608 N Fitzhugh Avenue, Dallas. This newly constructed two-story duplex is a harmonious blend of Japanese and Scandinavian design prin...</p>
791 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 792 </div> 793 794 </div> 795 </a> 796 <a href="/properties/7842-caruth-court-dallas-tx-us-75225-21368073" class="properties-list-item"> 797 <div class="properties-list-item__image-container lp_animation-img-zoom"> 798 <span class="properties-list-item__tag lp-tag">For Sale</span> 799 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21368073/-5357995847786016414.jpg" class="properties-list-item__image" height="270" width="400" alt="Red brick home with an arched entry, warmly lit windows, and mature trees at dusk." loading="lazy"> 800 </div> 801 802 <div class="properties-list-item__info"> 803 804 <div class="properties-list-item__top-block"> 805 <p class="properties-list-item__address">7842 Caruth Court, Dallas, TX 75225</p> 806 <h4 class="properties-list-item__price">$1,949,000</h4> 807 808 <div class="properties-list-item__icons-row"> 809 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">3 Beds</div> 810 811 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">4 Baths</div> 812 813 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">2,567 Sq.Ft.</div> 814 </div> 815 </div> 816 817 <div class="properties-list-item__bottom-block"> 818 <p class="properties-list-item__bottom-label">Property description</p> 819 <p class="properties-list-item__description">Nestled within the highly sought-after Caruth Homeplace neighborhood, 7842 Caruth Court is a beautifully reimagined single-level residence thoughtfully updated by Heritage Blue. Rarely does a fully...</p> 820 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 821 </div> 822 823 </div> 824 </a> 825 <a href="/properties/5539-ridgedale-avenue-dallas-tx-us-75206-21388982" class="properties-list-item"> 826 <div class="properties-list-item__image-container lp_animation-img-zoom"> 827 <span class="properties-list-item__tag lp-tag">For Sale</span> 828 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21388982/6654958448550647900.jpg" class="properties-list-item__image" height="270" width="400" alt="Brick home with an arched entry and warmly lit windows, framed by mature trees at dusk." loading="lazy"> 829 </div> 830 831 <div class="properties-list-item__info"> 832 833 <div class="properties-list-item__top-block"> 834 <p class="properties-list-item__address">5539 Ridgedale Avenue, Dallas, TX 75206</p> 835 <h4 class="properties-list-item__price">$1,399,000</h4> 836 837 <div class="properties-list-item__icons-row"> 838 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">4 Beds</div> 839 840 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">4 Baths</div> 841 842 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">3,087 Sq.Ft.</div> 843 </div> 844 </div> 845 846 <div class="properties-list-item__bottom-block"> 847 <p class="properties-list-item__bottom-label">Property description</p> 848 <p class="properties-list-item__description">Welcome to the most charming, quintessential Tudor in coveted Greenland Hills, just one block from Lower Greenville. This reimagined home was expanded in 2015 and features two living spaces, four b...</p> 849 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 850 </div> 851 852 </div> 853 </a> 854 <a href="/properties/6208-jacqueline-drive-plano-tx-us-75024-21366088" class="properties-list-item"> 855 <div class="properties-list-item__image-container lp_animation-img-zoom">
856 <span class="properties-list-item__tag lp-tag">For Sale</span> 857 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21366088/8322953077925010852.jpg" class="properties-list-item__image" height="270" width="400" alt="Two-story brick home framed by mature trees, with a landscaped entry and pink sunset sky." loading="lazy"> 858 </div> 859 860 <div class="properties-list-item__info"> 861 862 <div class="properties-list-item__top-block"> 863 <p class="properties-list-item__address">6208 Jacqueline Drive, Plano, TX 75024</p> 864 <h4 class="properties-list-item__price">$1,149,000</h4> 865 866 <div class="properties-list-item__icons-row"> 867 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">4 Beds</div> 868 869 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">4 Baths</div> 870 871 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">4,206 Sq.Ft.</div> 872 </div> 873 </div> 874 875 <div class="properties-list-item__bottom-block"> 876 <p class="properties-list-item__bottom-label">Property description</p> 877 <p class="properties-list-item__description">Nestled in the highly sought-after Avignon Windhaven community of West Plano, this stunning custom home redefines luxury living. Spanning over 4,000 square feet, every inch of this property exudes ...</p> 878 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 879 </div> 880 881 </div> 882 </a> 883 <a href="/properties/4133-maison-ridge-dallas-tx-us-75219-21400443" class="properties-list-item"> 884 <div class="properties-list-item__image-container lp_animation-img-zoom"> 885 <span class="properties-list-item__tag lp-tag">For Sale</span> 886 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21400443/3868480847640068679.jpg" class="properties-list-item__image" height="270" width="400" alt="4133 Maison Ridge" loading="lazy"> 887 </div> 888 889 <div class="properties-list-item__info"> 890 891 <div class="properties-list-item__top-block"> 892 <p class="properties-list-item__address">4133 Maison Ridge, Dallas, TX 75219</p> 893 <h4 class="properties-list-item__price">$685,000</h4> 894 895 <div class="properties-list-item__icons-row"> 896 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">3 Beds</div> 897 898 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">3 Baths</div> 899 900 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">2,100 Sq.Ft.</div> 901 </div> 902 </div> 903 904 <div class="properties-list-item__bottom-block"> 905 <p class="properties-list-item__bottom-label">Property description</p> 906 <p class="properties-list-item__description">Anchored by a timeless brick facade and sweeping rooftop views of Old Parkland, Uptown, and Downtown, this meticulously kept, single-family home offers private living at its finest. Built in 2022 b...</p> 907 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 908 </div> 909 910 </div> 911 </a> 912 <a href="/properties/3606-prescott-avenue-dallas-tx-us-75219-21346115" class="properties-list-item"> 913 <div class="properties-list-item__image-container lp_animation-img-zoom"> 914 <span class="properties-list-item__tag lp-tag">For Sale</span> 915 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21346115/55685643900262748.jpg" class="properties-list-item__image" height="270" width="400" alt="Open-plan living room with a gray sectional, fireplace, and kitchen beyond white columns." loading="lazy"> 916 </div> 917 918 <div class="properties-list-item__info"> 919 920 <div class="properties-list-item__top-block"> 921 <p class="properties-list-item__address">3606 Prescott Avenue, Dallas, TX 75219</p> 922 <h4 class="properties-list-item__price">$650,000</h4> 923 924 <div class="properties-list-item__icons-row"> 925 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">2 Beds</div> 926 927 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">3 Baths</div> 928 929 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">2,109 Sq.Ft.</div> 930 </div> 931 </div> 932 933 <div class="properties-list-item__bottom-block"> 934 <p class="properties-list-item__bottom-label">Property description</p> 935 <p class="properties-list-item__description">Designed for the way people live today, this one-of-a-kind multi-level residence delivers sophisticated design and exceptional flexibility in one of Dallas' most connected locations. Every level ha...</p>
936 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 937 </div> 938 939 </div> 940 </a> 941 <a href="/properties/7418-fenton-drive-dallas-tx-us-75231-21349391" class="properties-list-item"> 942 <div class="properties-list-item__image-container lp_animation-img-zoom"> 943 <span class="properties-list-item__tag lp-tag">Pending</span> 944 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21349391/346735196638587813.jpg" class="properties-list-item__image" height="270" width="400" alt="White-brick single-story home with a large front-yard tree and warmly lit windows at dusk." loading="lazy"> 945 </div> 946 947 <div class="properties-list-item__info"> 948 949 <div class="properties-list-item__top-block"> 950 <p class="properties-list-item__address">7418 Fenton Drive, Dallas, TX 75231</p> 951 <h4 class="properties-list-item__price">$600,000</h4> 952 953 <div class="properties-list-item__icons-row"> 954 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">2 Beds</div> 955 956 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">2 Baths</div> 957 958 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">1,817 Sq.Ft.</div> 959 </div> 960 </div> 961 962 <div class="properties-list-item__bottom-block"> 963 <p class="properties-list-item__bottom-label">Property description</p> 964 <p class="properties-list-item__description">Charming ranch-style home located in coveted University Manor. Set on wide 70 x 110 lot, this fully turn-key home provides you with easy and private living, steps away from White Rock Lake, Flag Po...</p> 965 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 966 </div> 967 968 </div> 969 </a> 970 <a href="/properties/3170-carmel-street-103-dallas-tx-us-75204-21268324" class="properties-list-item"> 971 <div class="properties-list-item__image-container lp_animation-img-zoom"> 972 <span class="properties-list-item__tag lp-tag">For Sale</span> 973 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21268324/646835893471099486.jpg" class="properties-list-item__image" height="270" width="400" alt="Staged living room with a white sofa, dark armchairs, tall windows, and a staircase." loading="lazy"> 974 </div> 975 976 <div class="properties-list-item__info"> 977 978 <div class="properties-list-item__top-block"> 979 <p class="properties-list-item__address">3170 Carmel Street 103, Dallas, TX 75204</p> 980 <h4 class="properties-list-item__price">$499,000</h4> 981 982 <div class="properties-list-item__icons-row"> 983 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">2 Beds</div> 984 985 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">3 Baths</div> 986 987 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">2,018 Sq.Ft.</div> 988 </div> 989 </div> 990 991 <div class="properties-list-item__bottom-block"> 992 <p class="properties-list-item__bottom-label">Property description</p> 993 <p class="properties-list-item__description">Immaculate walk-up condo located in vibrant Bryan Place. Laid out over three stories, this 2018 construction home displays its quality with hardwood floors throughout, oversized windows, and Carrer...</p> 994 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 995 </div> 996 997 </div> 998 </a> 999 <a href="/properties/9210-san-fernando-way-dallas-tx-us-75218-21328243" class="properties-list-item"> 1000 <div class="properties-list-item__image-container lp_animation-img-zoom">
1001 <span class="properties-list-item__tag lp-tag">For Lease</span> 1002 <img src="https://dlajgvw9htjpb.cloudfront.net/cms/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/21328243/55010484355441030.jpg" class="properties-list-item__image" height="270" width="400" alt="9210 San Fernando Way" loading="lazy"> 1003 </div> 1004 1005 <div class="properties-list-item__info"> 1006 1007 <div class="properties-list-item__top-block"> 1008 <p class="properties-list-item__address">9210 San Fernando Way, Dallas, TX 75218</p> 1009 <h4 class="properties-list-item__price">$3,350/mo</h4> 1010 1011 <div class="properties-list-item__icons-row"> 1012 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bed">3 Beds</div> 1013 1014 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-bath">2 Baths</div> 1015 1016 <div class="properties-list-item__icon-tag lp-tag lp-icon icon-sqft">1,606 Sq.Ft.</div> 1017 </div> 1018 </div> 1019 1020 <div class="properties-list-item__bottom-block"> 1021 <p class="properties-list-item__bottom-label">Property description</p> 1022 <p class="properties-list-item__description">Tucked into quiet and private Little Forest Hills, this beautifully remodeled cottage sits on nearly half an acre of mature, secluded grounds. A darling covered front porch welcomes you home. The e...</p> 1023 <span class="properties-list-item__btn lp-btn button-style-1">Property Details</span> 1024 </div> 1025 1026 </div> 1027 </a> 1028 </div> 1029 1030 <div class="pagination-container pagination-style-1"></div> 1031 </div> 1032 1033 1034 1035</section> 1036<section id="section-b903aacd-3b0c-4042-9cd9-3066a61f407c" class="solid-section is-font-color-dark is-background-color-light" data-el-id="5df8f995-3382-4f7b-9162-beac6ac6395b"> 1037 <div class="simple-cta lp-vertical-paddings"> 1038 <div class="simple-cta__container simple-cta__container--Right-aligned"> 1039 <div class="simple-cta__text-block"> 1040 <h2 class="simple-cta__title"><p>Find Your <strong>Dream Home</strong></p></h2> 1041 1042 </div> 1043 <a 1044 href="/home-search/listings" 1045 1046 class="lp-btn lp-btn--outline lp-btn--mob-full-width button-style-1" 1047 1048 1049 1050 1051 1052 > 1053 Browse Homes 1054 </a> 1055 </div> 1056</div> 1057</section> 1058<section class="image-section is-font-color-light is-background-color-light" id="section-16a9df67-1fdd-4f21-b174-bf9a1c14b565" data-el-id="1ed7f92a-2189-48c5-889c-3838656da504"> 1059 <div class="newsletter-contact-cta lp-vertical-paddings" 1060 style=" 1061 --titleColorFirst: rgba(0, 0, 0, 1); 1062 --newsletterBack: rgba(238, 237, 233, 0.85); 1063 --titleColorSecond: rgba(255, 255, 255, 1); 1064 --workWithBack: rgba(255, 255, 255, 0); 1065 --newsletterTextColor: rgba(255, 255, 255, 1); 1066 --rightBack: rgba(235, 231, 224, 0); 1067 " 1068> 1069 <div class="newsletter-contact-cta__right-back"></div> 1070 <div class="newsletter-contact-cta__container lp-container"> 1071 <div class="newsletter-contact-cta__wrapper"> 1072 <div class="newsletter-contact-cta__block newsletter-contact-cta__block--touch newsletter-contact-cta__block--no-newsletter"> 1073 <div class="newsletter-contact-cta__heading"> 1074 <h2 class="newsletter-contact-cta__title newsletter-contact-cta__title--touch ">Work </h2> 1075 <div class="newsletter-contact-cta__description"><p>Ready to make your next move? The Rosen Group is here to guide you every step of the way. With a dedicated team and a client-first approach, we make buying or selling your home feel effortless. Reach out today—we’d love to work with you.</p></div> 1076 </div> 1077 <div class="newsletter-contact-cta__btn-wrap"> 1078 <a 1079 role="button" 1080 data-type="CONTACT_US" 1081 class="newsletter-contact-cta__btn lp-btn button-style-2" 1082 1083 1084 1085 1086 1087 >
1088 <span class="lp-btn__content">Contact Us</span> 1089 </a> 1090 </div> 1091 <div class="newsletter-contact-cta__word-divide"><span class="newsletter-contact-cta__word-word">or</span></div> 1092 <div class="newsletter-contact-cta__call-cell"> 1093 <span class="newsletter-contact-cta__prefix-cell">Call us at</span> 1094 <a 1095 href="tel:2149271313" 1096 class="newsletter-contact-cta__link lp-a lp-link hyperlink-style-2" 1097 > 1098 <span class="newsletter-contact-cta__phone-wrapper lp-icon link-icon--phone"></span> 1099 (214) 927-1313 1100 </a> 1101 </div> 1102 </div> 1103 </div> 1104 </div> 1105</div> 1106</section> 1107<section id="section-4668b610-d9c1-4a67-adf4-0e6b4204182e" class="solid-section is-font-color-dark is-background-color-light" data-el-id="85dc9e17-a4c7-449c-8890-869fdc11b485"> 1108 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@splidejs/[email protected]/dist/css/splide-core.min.css"/>
1109<script src="https://cdn.jsdelivr.net/npm/@splidejs/[email protected]/dist/js/splide.min.js"></script>
vendor: 1 bytes, line 1109
1109
1110<script type="text/x-handlebars-template" class="jsIGTemplate"> 1111 {{#each items}} 1112 <a href="{{permalink}}" target="_blank" class="instagram-feed__item lp_animation-img-zoom splide__slide insta-item insta-type-{{mediaType}}"> 1113 <img class="instagram-feed__image" src="{{#ifEquals mediaType 'VIDEO'}}{{thumbnailUrl}}{{else}}{{mediaUrl}}{{/ifEquals}}" alt="Instagram post by @{{username}}"> 1114 </a> 1115 {{/each}} 1116</script>
1116 1117 1118<div class="instagram-feed lp-vertical-paddings"> 1119 <div class="instagram-feed__container" style="--titleColor: #B18463; --boxColor: rgba(238, 237, 233, 1);"> 1120 <div class="instagram-feed__title-group lp-title-group"> 1121 <div class="instagram-feed__icon lp-icon"></div> 1122 <p class="instagram-feed__pretitle">Follow Us On Instagram</p> 1123 <h2 class="instagram-feed__title instagram-feed__title--with-pretitle"><a href="#" target="_blank" class="instagram-feed__link jsIGLink jsIGName"></a></h2> 1124 </div> 1125 1126 <div class="instagram-feed__collection splide js-slider"> 1127 <div class="splide__track"> 1128 <ul class="splide__list jsIGContainer"> 1129 </ul> 1130 </div> 1131 </div> 1132 </div> 1133</div> 1134 1135 1136 1137 1138</section> 1139 1140 <div id="modals" class="modals"></div> 1141 <footer id="global-footer" class="is-font-color-dark is-background-color-light" data-el-id="b8c9ffd0-3b1f-4577-96fc-828efdac86e7"> 1142 1143 1144<div class="footer"> 1145 <div class="footer-logos-row"> 1146 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/93c039dd-150f-4a0d-88a8-5801e08da0c3" 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/93c039dd-150f-4a0d-88a8-5801e08da0c3 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/93c039dd-150f-4a0d-88a8-5801e08da0c3 960w" class="footer-logo" sizes="350px" alt="Compass"> 1147 1148 </div> 1149 <div class="footer-contact-row"> 1150 <div class="footer-info "> 1151 <div class="footer__col"> 1152 <h5 class="footer__section-title">The Rosen Group</h5> 1153 <div class="footer__section-content"> 1154 <div class="footer__col-content"> 1155 <p class="footer__col-title">Contact</p> <div class="footer__col-description lp-a lp-pre-line"><div><a href="tel:(214) 927-1313">tel:(214) 927-1313 </a><br><a href="/cdn-cgi/l/email-protection#4d2722232c39252c23633f223e28230d2e22203d2c3e3e632e2220"><span class="__cf_email__" data-cfemail="ef8580818e9b878e81c19d809c8a81af8c80829f8e9c9cc18c8082">[email protected]</span></a></div></div> 1156 </div> 1157 1158 <div class="footer__col-content"> 1159 <p class="footer__col-title">Office</p> <div class="footer__col-description lp-a lp-pre-line"><p><a href="tel:2148148100">tel:(214) 814-8100 </a><br>5960 Berkshire Ln Ste 700<br>Dallas TX 75225</p></div> 1160 </div> 1161 </div> 1162 </div> 1163 1164 1165 1166 </div> 1167 1168 <ul class="lp-socials social_icons-style-1 footer-socials"> 1169 1170 <li> 1171 <a 1172 href="https://www.facebook.com/TheRosenGroup.compass/" 1173 class="lp-socials__link socials__link" 1174 data-wow-delay="0s" 1175 target="_blank" 1176 aria-label="FACEBOOK" 1177 > 1178 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 1179 </a> 1180 </li> 1181 <li> 1182 <a 1183 href="https://www.instagram.com/the_rosen_group/" 1184 class="lp-socials__link socials__link" 1185 data-wow-delay="0.1s" 1186 target="_blank" 1187 aria-label="INSTAGRAM" 1188 > 1189 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 1190 </a> 1191 </li> 1192 <li> 1193 <a 1194 href="https://www.zillow.com/profile/therosengrouptx" 1195 class="lp-socials__link socials__link" 1196 data-wow-delay="0.2s" 1197 target="_blank" 1198 aria-label="ZILLOW" 1199 >
1200 <span class="lp-i lp-i--zillow" aria-hidden="true"></span> 1201 </a> 1202 </li> 1203 <li> 1204 <a 1205 href="https://www.compass.com/agents/the-rosen-group/" 1206 class="lp-socials__link socials__link" 1207 data-wow-delay="0.3s" 1208 target="_blank" 1209 aria-label="BROKERAGE" 1210 > 1211 <svg width="20" height="20" viewBox="0 0 60.14 60"><path d="M29.86 0a30 30 0 00.28 60 30.03 30.03 0 0030-30A30 30 0 0029.86 0zm.28 8a22.03 22.03 0 0122 22 22 22 0 11-22-22zm7.18 9.17l-20 20 5.65 5.66 20-20z" /></svg> 1212 </a> 1213 </li> 1214 </ul> </div> 1215 1216 1217 <div class="footer-navigation-row"> 1218 <p class="footer-navigation-title">navigation</p> 1219 1220 <ul class="footer-navigation lp-a"> 1221 <li class="footer-navigation__item"> 1222 <a href="/properties/sale" class="footer-navigation__link ">Portfolio</a> 1223 1224 </li> 1225 <li class="footer-navigation__item"> 1226 <a href="/home-search/listings" class="footer-navigation__link ">Home Search</a> 1227 1228 </li> 1229 <li class="footer-navigation__item"> 1230 <a href="/home-valuation" class="footer-navigation__link ">Home Valuation</a> 1231 1232 </li> 1233 <li class="footer-navigation__item"> 1234 <a href="/neighborhoods" class="footer-navigation__link ">Neighborhoods</a> 1235 1236 </li> 1237 <li class="footer-navigation__item"> 1238 1239 <a data-type="CONTACT_US" type="button" role="button" class="footer-navigation__link " >Contact Us</a> 1240 </li> 1241 </ul> 1242 </div> 1243 1244 <div class="footer-navigation-row"> 1245 <p class="footer-navigation-title">useful items</p> 1246 1247 <ul class="footer-navigation lp-a"> 1248 <li class="footer-navigation__item"> 1249 <a href="/buyers" class="footer-navigation__link ">Buyer's Guide</a> 1250 1251 </li> 1252 <li class="footer-navigation__item"> 1253 <a href="/sellers" class="footer-navigation__link ">Seller's Guide</a> 1254 1255 </li> 1256 <li class="footer-navigation__item"> 1257 <a href="/testimonials" class="footer-navigation__link ">Testimonials</a> 1258 1259 </li> 1260 </ul> 1261 </div> 1262 1263 1264 <div class="footer-disclaimer-row"> 1265 <div class="footer-disclaimer"><div class="luxury-text"> 1266<p style="text-align: center;"><a class="footerlink link hyperlink-style-1" style="font-size: 14px; font-weight: normal;" href="https://d1e1jt2fj4r8r.cloudfront.net/57836748-dc71-4fea-a5d4-3da8403ab1bd/hCykOYGpu/CN%201-4-1_1.pdf" target="_blank" rel="noopener"> Texas Real Estate Commission Consumer Protection Notice </a><br><a class="footerlink link hyperlink-style-1" style="font-size: 14px; font-weight: normal;" href="https://d1e1jt2fj4r8r.cloudfront.net/116d6abd-55d8-410f-b7f3-bdd7f6c5b727/2b0bfbe5-43b2-4316-a1e5-be6a24a74782/IABS%202024.pdf" target="_blank" rel="noopener"> Texas Real Estate Commission Information About Brokerage Services </a><br><a class="footerlink link hyperlink-style-1" style="font-size: 14px; font-weight: normal;" href="https://d1e1jt2fj4r8r.cloudfront.net/938208c7-113c-4b76-96bb-f65cefa93252/pkR5n4vC6/trec.pdf" target="_blank" rel="noopener">TREC Disclaimer</a></p> 1267<p style="font-size: 12px; text-align: center;">The Rosen Group is a team of real estate agents affiliated with compass. <a class="footerlink link hyperlink-style-1" style="font-size: 12px; font-weight: normal;" href="https://www.compass.com/" target="_blank" rel="noopener">Compass</a> is a licensed real estate broker and abides by all applicable equal housing opportunity laws. All material presented herein
1267is intended for informational purposes only. Information is compiled from sources deemed reliable but is subject to errors, omissions, changes in price, condition, sale, or withdrawal without notice. No statement is made as to accuracy of any description. All measurements and square footages are approximate. This is not intended to solicit property already listed. Nothing herein shall be construed as legal, accounting or other professional advice outside the realm of real estate brokerage.</p> 1268<p style="opacity: 1;"><img style="width: 100px; height: auto; display: block; margin-left: auto; margin-right: auto;" src="https://res.cloudinary.com/luxuryp/images/f_auto,q_auto/g5qzbyky8ifp5w0ex0ik/realtor-eho-logo-07232021-update-dark"></p> 1269</div></div> 1270 1271 1272 </div> 1273 1274 1275 <div class="footer-bottom-row"> 1276 <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=""> 1277 1278 <div class="footer-copyright lp-a"> 1279 <div class="footer-copyright__powered"> 1280 Powered by <a href="https://www.luxurypresence.com/" class="hyperlink-style-1" target="_blank">Luxury Presence</a> 1281 </div> 1282 1283 <div class="footer-copyright__privacy"> 1284 <span>Copyright © <span class="auto-year-update">2026</span></span> 1285 1286 1287 <a href="/terms-and-conditions" class="footer-copyright__privacy-policy">Privacy Policy</a> 1288 </div> 1289 </div> 1290 </div> 1291 1292</div> 1293 1294 </footer> 1295 1296 <div id="modal-global-contact-us" class="modal " 1297 data-el-id="" 1298 style="background-color: ;" 1299 > 1300 <div class="modal-content"> 1301 1302 1303 <div class="contact-form-modal lp-vertical-paddings" style="--leftPanelBgColor: rgba(235, 231, 224, 1); --textColor:rgba(0, 0, 0, 1); --formBgColor: rgba(255, 255, 255, 1); --formTextColor: rgba(0, 0, 0, 1)"> 1304 <div class="contact-form-modal__bg"> 1305 <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/c55206eb-22ba-454e-8168-62cf305fbcef" 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/c55206eb-22ba-454e-8168-62cf305fbcef 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/c55206eb-22ba-454e-8168-62cf305fbcef 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/c55206eb-22ba-454e-8168-62cf305fbcef 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/c55206eb-22ba-454e-8168-62cf305fbcef 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/c55206eb-22ba-454e-8168-62cf305fbcef 2560w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=3456/https://media-production.lp-cdn.com/media/c55206eb-22ba-454e-8168-62cf305fbcef 3456w" sizes="(min-width: 1981px) 12.2222vw, (min-width: 1025px) 424px, 100vw" class="contact-form-modal__bg-image" alt="Bright entryway with pale wood floors, a large framed mirror, and a rustic console table."> 1306 </div> 1307 <div class="contact-form-modal__close-container"> 1308 <button class="contact-form-modal__close toggle close lp-btn lp-icon link-icon--plus"></button> 1309 </div> 1310 <div class="contact-form-modal__container"> 1311 <div class="contact-form-modal-details only-desktop"> 1312 <h2 class="contact-form-modal-details__title only-desktop js-contact-title">Get in</h2> 1313 <div class="contact-form-modal-agent"> 1314 <div class="contact-form-modal-agent__contact"> 1315 <p class="contact-form-modal-agent__name">The Rosen Group</p> 1316 <p class="contact-form-modal-agent__phone lp-a"> 1317 <a class="contact-form-modal-agent__link" href="tel:2149271313">(214) 927-1313</a> 1318 </p> 1319 <p class="contact-form-modal-agent__email lp-a"> 1320 <a class="contact-form-modal-agent__link" href="/cdn-cgi/l/email-protection#462c292827322e27286834293523280625292b362735356825292b"><span class="__cf_email__" data-cfemail="fb9194959a8f939a95d58994889e95bb9894968b9a8888d5989496">[email protected]</span></a> 1321 </p> 1322 </div> 1323 <div class="contact-form-modal-agent__contact"> 1324 <p class="contact-form-modal-agent__addres lp-pre-line">5960 Berkshire Ln Ste 700 1325 Dallas TX 75225</p> 1326 </div> 1327 </div> 1328 1329 1330 <div class="contact-form-modal-details__description">Dallas Real Estate Experts</div> 1331 1332 <div class="contact-form-modal-details__socials"> 1333 <ul class="lp-socials social_icons-style-1 contact-form-modal-details__socials-l
1333ist lp-socials"> 1334 1335 <li> 1336 <a 1337 href="https://www.facebook.com/TheRosenGroup.compass/" 1338 class="lp-socials__link contact-form-modal-details__socials-link" 1339 data-wow-delay="0s" 1340 target="_blank" 1341 aria-label="FACEBOOK" 1342 > 1343 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 1344 </a> 1345 </li> 1346 <li> 1347 <a 1348 href="https://www.instagram.com/the_rosen_group/" 1349 class="lp-socials__link contact-form-modal-details__socials-link" 1350 data-wow-delay="0.1s" 1351 target="_blank" 1352 aria-label="INSTAGRAM" 1353 > 1354 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 1355 </a> 1356 </li> 1357 <li> 1358 <a 1359 href="https://www.zillow.com/profile/therosengrouptx" 1360 class="lp-socials__link contact-form-modal-details__socials-link" 1361 data-wow-delay="0.2s" 1362 target="_blank" 1363 aria-label="ZILLOW" 1364 > 1365 <span class="lp-i lp-i--zillow" aria-hidden="true"></span> 1366 </a> 1367 </li> 1368 <li> 1369 <a 1370 href="https://www.compass.com/agents/the-rosen-group/" 1371 class="lp-socials__link contact-form-modal-details__socials-link" 1372 data-wow-delay="0.3s" 1373 target="_blank" 1374 aria-label="BROKERAGE" 1375 > 1376 <svg width="20" height="20" viewBox="0 0 60.14 60"><path d="M29.86 0a30 30 0 00.28 60 30.03 30.03 0 0030-30A30 30 0 0029.86 0zm.28 8a22.03 22.03 0 0122 22 22 22 0 11-22-22zm7.18 9.17l-20 20 5.65 5.66 20-20z" /></svg> 1377 </a> 1378 </li> 1379 </ul> </div> 1380 </div> 1381 <div class="contact-form-modal-form"> 1382 <h2 class="contact-form-modal-form__title only-mobile js-contact-title">Get in</h2> 1383 <form action="" class="contact-form-modal-form__form js-form" data-type="contact-form"> 1384 <div class="lp-h-pot"> 1385 <label for="-if-middleName">Middle Name</label> 1386 <input id="-if-middleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 1387 </div> 1388 <div class="contact-form-modal-form__group"> 1389 <div class="contact-form-modal-form__group-container lp-input-group"> 1390 <input required id="-name" name="name" type="text" class="lp-input js-input-name" placeholder="Enter your full name"> 1391 <label for="-name" class="lp-label contact-form-modal-form__label">Name</label> 1392 </div> 1393 <div class="contact-form-modal-form__group-container lp-input-group"> 1394 <input required id="-phone" name="phone" type="tel" class="lp-in
1394put" placeholder="Your phone"> 1395 <label for="-phone" class="lp-label contact-form-modal-form__label">Phone</label> 1396 </div> 1397 </div> 1398 <div class="contact-form-modal-form__group lp-input-group"> 1399 <div class="contact-form-modal-form__input-container"> 1400 <input required id="-email" name="email" type="email" class="lp-input js-email-input" placeholder="@"> 1401 <div class="contact-form-modal-form__error error">Enter a valid email</div> 1402 </div> 1403 1404 <label for="-email" class="contact-form-modal-form__label lp-label">Email</label> 1405 </div> 1406 <div class="contact-form-modal-form__group lp-input-group"> 1407 <textarea id="-message" name="message" class="contact-form-modal-form__textarea lp-input" placeholder="Type your message"></textarea> 1408 <label for="-message" class="contact-form-modal-form__label lp-label">Your Message</label> 1409 </div> 1410 1411 <div class="contact-form-modal-form__disclaimer lp-disclaimer"> <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label> 1412 <label class='lp-tcr-content'> 1413 <span class='lp-tcr-checkbox'> 1414 <input 1415 type='checkbox' 1416 id='-termsAccepted' 1417 name='termsAccepted' 1418 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 1419 oninput="this.setCustomValidity('')" 1420 required 1421 /></span> 1422 <span class='lp-tcr-message'> 1423 1424 I agree to be contacted by 1425 The Rosen Group 1426 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 1427 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 1428 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 1429 </span> 1430 </label> 1431 1432 </div> 1433 1434 <button type="submit" class="contact-form-modal-submit lp-btn lp-icon button-style-1"> 1435 <div class="contact-form-modal-submit__default"> 1436 <span class="contact-form-modal-submit__content lp-btn__content">Send Message</span> 1437 </div> 1438 <div class="contact-form-modal-submit__loading"> 1439 <span class="contact-form-modal-submit__content lp-btn__content">Sending</span> 1440 </div> 1441 <div class="contact-form-modal-submit__success"> 1442 <span class="contact-form-modal-submit__content lp-btn__content">Message Sent!</span> 1443 </div> 1444 </button> 1445 </form> 1446 </div> 1447 1448 <div class="contact-form-modal-details only-mobile"> 1449 <h2 class="contact-form-modal-details__title only-desktop js-contact-title">Get in</h2> 1450 <div class="contact-form-modal-agent"> 1451 <div class="contact-form-modal-agent__contact"> 1452 <p class="contact-form-modal-agent__name">The Rosen Group</p> 1453 <p class="contact-form-modal-agent__phone lp-a"> 1454 <a class="contact-form-modal-agent__link" href="tel:2149271313">(214) 927-1313</a> 1455 </p> 1456 <p class="contact-form-modal-agent__email lp-a"> 1457 <a class="contact-form-modal-agent__link" href="/cdn-cgi/l/email-protection#a0cacfcec1d4c8c1ce8ed2cfd3c5cee0c3cfcdd0c1d3d38ec3cfcd"><span class="__cf_email__" data-cfemail="acc6c3c2cdd8c4cdc282dec3dfc9c2eccfc3c1dccddfdf82cfc3c1">[email protected]</span></a> 1458 </p> 1459 </div> 1460 <div class="contact-form-modal-agent__contact"> 1461 <p class="contact-form-modal-agent__addres lp-pre-line">5960 Berkshire Ln Ste 700 1462 Dallas TX 75225</p> 1463 </div> 1464 </div> 1465 1466 1467 <div class="contact-form-modal-details__description">Dallas Real Estate Experts</div> 1468 1469 <div class="contact-form-modal-details__socials"> 1470 <ul class="lp-socials social_icons-style-1 contact-form-modal-details__socials-l
1470ist lp-socials"> 1471 1472 <li> 1473 <a 1474 href="https://www.facebook.com/TheRosenGroup.compass/" 1475 class="lp-socials__link contact-form-modal-details__socials-link" 1476 data-wow-delay="0s" 1477 target="_blank" 1478 aria-label="FACEBOOK" 1479 > 1480 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 1481 </a> 1482 </li> 1483 <li> 1484 <a 1485 href="https://www.instagram.com/the_rosen_group/" 1486 class="lp-socials__link contact-form-modal-details__socials-link" 1487 data-wow-delay="0.1s" 1488 target="_blank" 1489 aria-label="INSTAGRAM" 1490 > 1491 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 1492 </a> 1493 </li> 1494 <li> 1495 <a 1496 href="https://www.zillow.com/profile/therosengrouptx" 1497 class="lp-socials__link contact-form-modal-details__socials-link" 1498 data-wow-delay="0.2s" 1499 target="_blank" 1500 aria-label="ZILLOW" 1501 > 1502 <span class="lp-i lp-i--zillow" aria-hidden="true"></span> 1503 </a> 1504 </li> 1505 <li> 1506 <a 1507 href="https://www.compass.com/agents/the-rosen-group/" 1508 class="lp-socials__link contact-form-modal-details__socials-link" 1509 data-wow-delay="0.3s" 1510 target="_blank" 1511 aria-label="BROKERAGE" 1512 > 1513 <svg width="20" height="20" viewBox="0 0 60.14 60"><path d="M29.86 0a30 30 0 00.28 60 30.03 30.03 0 0030-30A30 30 0 0029.86 0zm.28 8a22.03 22.03 0 0122 22 22 22 0 11-22-22zm7.18 9.17l-20 20 5.65 5.66 20-20z" /></svg> 1514 </a> 1515 </li> 1516 </ul> </div> 1517 </div> 1518 </div> 1519 </div> 1520 1521 </div> 1522 <button class="close lp-close" type="button" aria-label="close modal"> 1523 <span class="lp-close-icon" aria-hidden="true"></span> 1524 </button> 1525 </div> 1526 <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;"> 1527 <style> 1528 #qualifying-questions-modal .custom-select-toggle { 1529 border: 1px solid #848484; 1530 border-radius: 8px; 1531 padding: 12px 16px; 1532 } 1533 1534 #qualifying-questions-modal .custom-select-toggle.is-placeholder { 1535 color: #848484; 1536 } 1537 1538 #qualifying-questions-modal #qualifying-questions-modal-phoneNumber::placeholder { 1539 color: #848484; 1540 opacity: 1; 1541 } 1542 1543 #qualifying-questions-modal .disclaimer-more { 1544 display: none; 1545 } 1546 1547 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-more { 1548 display: inline; 1549 } 1550 1551 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-ellipsis { 1552 display: none; 1553 } 1554 </style>
vendor: 119 bytes, lines 1554-1555
1554 1555 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1555<script> 1556 function toggleDisclaimerQualifyingQuestionsModal() { 1557 const disclaimerText = document.getElementById('qualifying-questions-modal-disclaimer-text'); 1558 const toggleButton = document.getElementById('qualifying-questions-modal-toggle-disclaimer'); 1559 1560 if (disclaimerText.classList.contains('collapsed')) { 1561 disclaimerText.classList.remove('collapsed'); 1562 toggleButton.textContent = 'Read less'; 1563 toggleButton.setAttribute('aria-expanded', 'true'); 1564 } else { 1565 disclaimerText.classList.add('collapsed'); 1566 toggleButton.textContent = 'Read more'; 1567 toggleButton.setAttribute('aria-expanded', 'false'); 1568 } 1569 } 1570 </script>
1570 1571 <div style="max-width: 400px; width: 95%; margin: 0 auto;"> 1572 <div style="background: #fff; border: none; border-radius: 16px; color: black; box-shadow: none; position: relative;"> 1573 <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;"> 1574 <span aria-hidden="true">×</span> 1575 </button> 1576 <div style="padding: 40px 30px 32px;"> 1577 <div style="text-align: left; margin-bottom: 32px;"> 1578 <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;"> 1579 Thanks, please provide more information to help serve you 1580 </h2> 1581 </div> 1582 <form id="qualifying-questions-modal-form" data-type="contact-form"> 1583 <input type="hidden" name="source" value="PROFILE_UPDATE" /> 1584 <input type="hidden" name="email" value="" id="qualifying-questions-modal-email" /> 1585 <input type="hidden" name="triggerSource" id="qualifying-questions-modal-triggerSource" value="" /> 1586 <label for="qualifying-questions-modal-email" style="display:none;"> 1587 Email 1588 </label> 1589 <label for="qualifying-questions-modal-triggerSource" style="display:none;"> 1590 Trigger Source 1591 </label> 1592 1593 <div style="margin-bottom: 20px;"> 1594 <label for="qualifying-questions-modal-phoneNumber" style="display:none;"> 1595 Phone Number 1596 </label> 1597 <input 1598 type="tel" 1599 id="qualifying-questions-modal-phoneNumber" 1600 name="phoneNumber" 1601 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;" 1602 pattern="^\+?1?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$" 1603 required 1604 placeholder="Phone" 1605 aria-label="Phone Number" 1606 inputmode="tel" 1607 autocomplete="tel" 1608 onfocus="this.style.borderColor='black';" 1609 onblur="this.style.borderColor='#848484';" 1610 /> 1611 </div> 1612 1613 <div style="margin-bottom: 20px;"> 1614 <label for="qualifying-questions-modal-interest" style="display:none;"> 1615 Interest 1616 </label> 1617 <select 1618 id="qualifying-questions-modal-interest" 1619 name="interest" 1620 required 1621 data-label="Interest" 1622 aria-label="Interest" 1623 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;" 1624 onfocus="this.style.borderColor='black'; this.style.color='black';" 1625 onblur="this.style.borderColor='#848484'; if(this.value === '') this.style.color='#848484'; else this.style.color='black';" 1626 > 1627 <option value="" style="background: #fff; color: #848484;" disabled selected>Interested in...</option> 1628 <option value="Selling & Buying" style="background: #fff; color: black;">Selling & Buying</option> 1629 <option value="Selling" style="background: #fff; color: black;">Selling</option> 1630 <option value="Buying" style="background: #fff; color: black;">Buying</option> 1631 <option value="Renting" style="background: #fff; color: black;">Renting</option> 1632 <option value="Other" style="background: #fff; color: black;">Other</option> 1633 </select> 1634 </div> 1635 1636 <div style="margin-bottom: 32px; font-size: 12px; line-height: 1.2;"> 1637 <label style='display: none;' for='qualifying-questions-modal-qualifying-questions-termsAccepted'>Opt In/Disclaimer Consent:</label> 1638 <label class='lp-tcr-content'>
1639 <span class='lp-tcr-checkbox'> 1640 <input 1641 type='checkbox' 1642 id='qualifying-questions-modal-qualifying-questions-termsAccepted' 1643 name='termsAccepted' 1644 aria-describedby='qualifying-questions-modal-disclaimer-text' 1645 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 1646 oninput="this.setCustomValidity('')" 1647 required 1648 /></span> 1649 <span class='lp-tcr-message'> 1650 <div id="qualifying-questions-modal-disclaimer-text" class="collapsed" style="color: #848484;"> 1651 1652 I agree to be contacted by 1653 <strong>The Rosen Group</strong> 1654 via call, email, and text <span class="disclaimer-more">for real estate services. 1655 To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 1656 You can also click the unsubscribe link in the emails. 1657 Message and data rates may apply. Message frequency may vary.</span> 1658 <span class="disclaimer-ellipsis">...</span> 1659 <a href='/terms-and-conditions' target='_blank' rel='noopener noreferrer' style='text-decoration: underline;'>Privacy Policy</a>. 1660 </div> 1661 <button 1662 id="qualifying-questions-modal-toggle-disclaimer" 1663 type="button" 1664 style="background: none; border: none; color: #848484; font-size: inherit; font-weight: bold; padding: 0; margin-top: 4px; cursor: pointer;" 1665 aria-expanded="false" 1666 onclick="toggleDisclaimerQualifyingQuestionsModal()" 1667 > 1668 Read more 1669 </button> 1670 </span> 1671 </label> 1672 </div> 1673 1674 <div> 1675 <button 1676 type="submit" 1677 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;" 1678 onmouseover="this.style.background='transparent'; this.style.color='black';" 1679 onmouseout="this.style.background='black'; this.style.color='white';" 1680 > 1681 Submit 1682 </button> 1683 </div> 1684 </form> 1685 </div> 1686 </div> 1687 </div> 1688 </div> 1689 1690
1690<script> 1691 (function() { 1692 var lazyVideos = [].slice.call(document.querySelectorAll("video.lazy")); 1693 1694 if ("IntersectionObserver" in window && lazyVideos.length > 0) { 1695 var lazyVideoObserver = new IntersectionObserver(function(entries, observer) { 1696 entries.forEach(function(video) { 1697 if (video.isIntersecting) { 1698 for (var source in video.target.children) { 1699 var videoSource = video.target.children[source]; 1700 if (typeof videoSource.tagName === "string" && videoSource.tagName === "SOURCE") { 1701 videoSource.src = videoSource.dataset.src; 1702 } 1703 } 1704 1705 video.target.load(); 1706 video.target.classList.remove("lazy"); 1707 lazyVideoObserver.unobserve(video.target); 1708 } 1709 }); 1710 }); 1711 1712 lazyVideos.forEach(function(lazyVideo) { 1713 lazyVideoObserver.observe(lazyVideo); 1714 }); 1715 } 1716 })(); 1717 </script>
1717 1718 1719 <!-- Global site tag (gtag.js) - Google Analytics --> 1720
1720<script defer src="https://www.googletagmanager.com/gtag/js"></script>
1720 1721 1722 <!-- Google Tag Manager --> 1723
1723<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1724 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1725 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src= 1726 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1727 })(window,document,'script','dataLayer','GTM-T9SFQGHZ');</script>
1727 1728 <!-- End Google Tag Manager --> 1729 1730 1731 <!-- LP Tracker (divolte.js) - LP Divolte --> 1732
1732<script>window.divolteLp=window.divolteLp||function(){(divolteLp.q=divolteLp.q||[]).push(arguments)}</script>
1732 1733 <!-- LP Tracker (eventBus) - LP EventBus --> 1734
1734<script>window.eventBusLp=window.eventBusLp||function(){(eventBusLp.q=eventBusLp.q||[]).push(arguments)}</script>
1734 1735 1736
1736<script> 1737 window.dataLayer = window.dataLayer || []; 1738 document.sendGoogleTagManagerEvent = function() { 1739 /* Honor GPC-enabled browsers and prevent GTM event if GPC is enabled. More details: https://global-privacy-control.glitch.me/ */ 1740 if (window.navigator.globalPrivacyControl) { 1741 return; 1742 } 1743 1744 dataLayer.push(arguments); 1745 } 1746 1747 document.sendGoogleTagManagerEvent('js', new Date()); 1748 document.sendGoogleTagManagerEvent('config', 'G-TGY2F7MMBF', { page: location.pathname, location: location.href }); 1749 document.sendGoogleAnalyticsEvent = function(googleEvent) { 1750 document.sendGoogleTagManagerEvent('event', googleEvent.eventAction || googleEvent.hitType, { 1751 event_category: googleEvent.eventCategory, 1752 event_label: googleEvent.eventLabel, 1753 value: googleEvent.eventValue, 1754 page: googleEvent.page, 1755 location: googleEvent.location 1756 }) 1757 }; 1758 1759 document.addEventListener("DOMContentLoaded", function() { 1760 (function() { 1761 //If the page has an element with ID of auto-year-update the element will be populated with the current year. 1762 var date = new Date(); 1763 var elements = document.getElementsByClassName('auto-year-update'); 1764 var i; 1765 for (i = 0; i < elements.length; i++) { 1766 elements[i].innerText = date.getFullYear(); 1767 } 1768 })(); 1769 if (window.divolteLp) { 1770 window.divolteLp('sendLpPageView', {}); 1771 } 1772 if (window.eventBusLp) { 1773 window.eventBusLp('sendLpPageView', {}); 1774 } 1775 }); 1776 </script>
1776 1777 1778 1779
1779<script> 1780 // Function to dynamically load a script 1781 function loadScript(url, callback) { 1782 var script = document.createElement('script'); 1783 script.type = 'text/javascript'; 1784 script.src = url; 1785 script.defer = true; 1786 script.async = true; 1787 script.onload = callback; 1788 document.head.appendChild(script); 1789 } 1790 1791 // Function to dynamically load CSS file 1792 function loadCSS(url) { 1793 var link = document.createElement("link"); 1794 link.rel = "stylesheet"; 1795 link.href = url; 1796 document.head.appendChild(link); 1797 } 1798 1799 // Global methods / variables that can be accessed by element js 1800 window.luxuryPresence = { 1801 libs: { 1802 loadJs: loadScript, 1803 loadCss: loadCSS, 1804 jsLibsMap: { 1805 paroller: { 1806 jsSrc: 'https://d1e1jt2fj4r8r.cloudfront.net/javascript/jquery.paroller.min.js', 1807 isLoaded: false, 1808 }, 1809 ionRangeSlider: { 1810 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js', 1811 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css', 1812 isLoaded: false, 1813 requires: ['jquery'], 1814 }, 1815 splide: { 1816 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/js/splide.min.js', 1817 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/css/splide-core.min.css', 1818 isLoaded: false, 1819 }, 1820 wow: { 1821 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js', 1822 isLoaded: false, 1823 }, 1824 jquery: { 1825 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js', 1826 isLoaded: false, 1827 }, 1828 slick: { 1829 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js', 1830 isLoaded: false, 1831 requires: ['jquery'], 1832 }, 1833 libphonenumber: { 1834 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/libphonenumber-js/1.11.8/libphonenumber-js.min.js', 1835 isLoaded: false, 1836 }, 1837 }, 1838 }, 1839 }; 1840 </script>
1840 1841
1841<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>
1841 1842
1842<script defer src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.8/handlebars.min.js"></script>
1842 1843
1843<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/handlebars-intl.min.js"></script>
1843 1844
1844<script defer src="https://cdnjs.cloudflare.com/ajax/libs/superagent/4.1.0/superagent.min.js"></script>
1844 1845
1845<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>
1845 1846
1846<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>
1846 1847
1847<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>
1847 1848 1849 <!-- GOOGLE TRANSLATE SCRIPT --> 1850
1850<script> 1851 function googleTranslateElementInit() { 1852 // list of languages can be overridden by setting window.customLanguages in the head JS. example `window.customLanguages = 'en,de,fr,ro,sk,pl'` 1853 // Language codes can be taken from here https://cloud.google.com/translate/docs/languages 1854 const DEFAULT_LANGUAGES = 'en,es,zh-CN,zh-TW,tl,vi,ar,ko,ru,de,fr,hi,pt'; 1855 document.querySelectorAll('[data-type="TRANSLATE"]').forEach(function(translate){ 1856 translate.innerText = ''; 1857 new google.translate.TranslateElement({ 1858 pageLanguage: 'en', 1859 layout: google.translate.TranslateElement.InlineLayout.SIMPLE, 1860 includedLanguages: window.customLanguages || DEFAULT_LANGUAGES, 1861 }, translate); 1862 }); 1863 } 1864 </script>
1864 1865
1865<script defer src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
1865 1866
1866<script defer src="https://accounts.google.com/gsi/intermediate"></script>
1866 1867 1868 <!-- GOOGLE TRANSLATE SCRIPT END--> 1869
1869<script> 1870 1871 // UI helpers 1872 (function () { 1873 1874 function getSideMenu () { 1875 return document.querySelector('body > div.sidemenu'); 1876 } 1877 1878 function sideMenuHide (instant) { 1879 var sideMenu = getSideMenu(); 1880 if (!sideMenu || !sideMenu.classList.contains('visible')) { 1881 return; 1882 } 1883 sideMenu.classList.remove('visible'); 1884 sideMenu.dispatchEvent(new CustomEvent('lpui-hide', { detail: { instant: !!instant } })); 1885 window.dispatchEvent(new CustomEvent('lpui-sidemenu-hide', { detail: {instant: !!instant} })); 1886 } 1887 1888 function sideMenuShow () { 1889 var sideMenu = getSideMenu(); 1890 if (!sideMenu || sideMenu.classList.contains('visible')) { 1891 return; 1892 } 1893 sideMenu.classList.add('visible'); 1894 sideMenu.dispatchEvent(new Event('lpui-show')); 1895 window.dispatchEvent(new Event('lpui-sidemenu-show')); 1896 } 1897 1898 function sideMenuToggle () { 1899 var sideMenu = getSideMenu(); 1900 if (!sideMenu) { 1901 return; 1902 } 1903 var isSideMenuVisible = sideMenu.classList.contains('visible'); 1904 if (isSideMenuVisible) { 1905 sideMenuHide(); 1906 } else { 1907 sideMenuShow(); 1908 } 1909 } 1910 1911 var scrollLockRequests = {}; 1912 window.__debug_scrollLockRequests = scrollLockRequests; 1913 var hideScrollStyles = ''+ 1914 'body {'+ 1915 'overflow: hidden;' + 1916 '}'; 1917 var hideScrollId = 'hide-body-scroll-style'; 1918 1919 function scrollLock () { 1920 var style = document.createElement('style'); 1921 style.id = hideScrollId; 1922 style.textContent = hideScrollStyles; 1923 document.head.appendChild(style); 1924 window.dispatchEvent(new Event('lpui-scroll-locked')); 1925 } 1926 1927 function scrollUnlock () { 1928 document.getElementById(hideScrollId)?.remove(); 1929 window.dispatchEvent(new Event('lpui-scroll-unlocked')); 1930 } 1931 1932 function requestScrollLock (lockId) { 1933 var wasLocked = Object.keys(scrollLockRequests).length > 0; 1934 scrollLockRequests[lockId || '__anonymous_lock'] = true; 1935 if (!wasLocked) { 1936 scrollLock(); 1937 } 1938 } 1939 1940 function releaseScrollLock (lockId) { 1941 if (lockId) { 1942 delete scrollLockRequests[lockId]; 1943 if (!Object.keys(scrollLockRequests).length) { 1944 scrollUnlock(); 1945 } 1946 } else { 1947 scrollLockRequests = {}; 1948 window.__debug_scrollLockRequests = scrollLockRequests; 1949 scrollUnlock(); 1950 } 1951 } 1952 1953 function showModal (modalId, options) { 1954 var modal = document.getElementById(modalId); 1955 if (!modal) { 1956 return; 1957 } 1958 1959 if (!modal.classList.contains('visible')) { 1960 modal.classList.add('visible'); 1961 if (options && options.scrollLock) { 1962 window.lpUI.requestScrollLock(modalId); 1963 } 1964 modal.dispatchEvent(new Event('lpui-show')); 1965 window.dispatchEvent(new CustomEvent('lpui-modal-show', { detail: { id: modalId } })); 1966 } 1967 1968 const visibleModals = document.querySelectorAll('.modal.visible'); 1969 1970 if (visibleModals.length > 1) { 1971 1972 const maxZIndex = Array.from(visibleModals).reduce((maxZIndex, modal) => { 1973 const zIndex = window.getComputedStyle(modal).zIndex; 1974 const parsedZIndex = zIndex !== 'auto' ? parseInt(zIndex) : 0; 1975 return Math.max(maxZIndex, parsedZIndex); 1976 }, 0); 1977 1978 modal.style.zIndex = maxZIndex + 1; 1979 } 1980 1981 } 1982 1983 function _hideModal (modalEl) { 1984 if (!modalEl) { 1985 return; 1986 } 1987 if (!modalEl.classList.contains('visible')) { 1988 return; 1989 } 1990 modalEl.classList.remove('visible'); 1991 modalEl.style.zIndex = '';
1992 modalEl.dispatchEvent(new Event('lpui-hide')); 1993 var modalId = modalEl.getAttribute('id'); 1994 if (modalId) { 1995 window.lpUI.releaseScrollLock(modalId); 1996 window.dispatchEvent(new CustomEvent('lpui-modal-hide', { detail: { id: modalId } })); 1997 } 1998 } 1999 2000 function hideModal (modalId) { 2001 _hideModal(document.getElementById(modalId)); 2002 } 2003 2004 function hideClosestModal (el) { 2005 const modal = el?.closest('.modal'); 2006 if (!modal) { 2007 return; 2008 } 2009 if (modal.classList) { 2010 _hideModal(modal); 2011 return; 2012 } 2013 if (modal.length && modal[0].classList) { 2014 _hideModal(modal[0]); 2015 } 2016 } 2017 2018 window.lpUI = { 2019 sideMenuHide: sideMenuHide, 2020 sideMenuShow: sideMenuShow, 2021 sideMenuToggle: sideMenuToggle, 2022 requestScrollLock: requestScrollLock, 2023 releaseScrollLock: releaseScrollLock, 2024 showModal: showModal, 2025 hideModal: hideModal, 2026 hideClosestModal: hideClosestModal 2027 } 2028 })(); 2029 2030 var stringifyPrimitive = function(v) { 2031 switch (typeof v) { 2032 case 'string': 2033 return v; 2034 2035 case 'boolean': 2036 return v ? 'true' : 'false'; 2037 2038 case 'number': 2039 return isFinite(v) ? v : ''; 2040 2041 default: 2042 return ''; 2043 } 2044 }; 2045 2046 function objectToQuerystring(obj, sep, eq, name) { 2047 // https://github.com/Gozala/querystring/blob/master/encode.js 2048 sep = sep || '&'; 2049 eq = eq || '='; 2050 if (obj === null) { 2051 obj = undefined; 2052 } 2053 2054 if (typeof obj === 'object') { 2055 return Object.keys(obj).map(function(k) { 2056 var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; 2057 if (Array.isArray(obj[k])) { 2058 return obj[k].map(function(v) { 2059 return ks + encodeURIComponent(stringifyPrimitive(v)); 2060 }).join(sep); 2061 } else { 2062 return ks + encodeURIComponent(stringifyPrimitive(obj[k])); 2063 } 2064 }).filter(Boolean).join(sep); 2065 2066 } 2067 2068 if (!name) return ''; 2069 return encodeURIComponent(stringifyPrimitive(name)) + eq + 2070 encodeURIComponent(stringifyPrimitive(obj)); 2071 } 2072 2073 function getPath(url, options) { 2074 var parser = document.createElement('a'); 2075 parser.href = url || ''; 2076 var path = parser.pathname || ''; 2077 if (path[0] !== '/') { 2078 // IE does not return path starting with a slash 2079 path = '/' + path; 2080 } 2081 2082 if (options && options.queryString) { 2083 path += parser.search; 2084 } 2085 2086 return path; 2087 } 2088 2089 function getMLSAutocomplete(keyword) { 2090 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 2091 var query = { 2092 kind: 'listings', 2093 query: keyword 2094 }; 2095 2096 return superagent 2097 .get(searchURL) 2098 .query(query) 2099 .then(function(res) { 2100 var data = res.body || []; 2101 // Array of listing_auto_complete documents: id, display_address, city, state, 2102 // price, sold_price, status, status_modified_at, photo_urls (array of URLs). 2103 2104 return data; 2105 }); 2106 } 2107 2108 function getMLSAutocompleteWithFilters(keyword, filters = {}) { 2109 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 2110 2111 return superagent 2112 .get(searchURL) 2113 .query({ kind: 'listings', query: keyword, ...filters }) 2114 .then(function(res) { 2115 // Same response shape as getMLSAutocomplete. 2116 return res.body || []; 2117 }); 2118 } 2119 2120 function makeMlsLink(data) { 2121 // Code Dupe from utils/googlePlace 2122 // mapping of google data type to mls data type 2123 var mapping = { 2124 neighborhood: 'neighborhood', 2125 locality: 'place', 2126 administrative_area_level_2: 'county', 2127 administrative_area_level_1: 'state', 2128 postal_code: 'postalcode', 2129 }; 2130 2131 function _filterTypes(types) { 2132 return types.filter(function(type) { return type !== 'political' }); 2133 } 2134 2135 if (!data || !Object.keys(data).length) { 2136 return '/home-search/listings'; 2137 } 2138 2139 var newData = {};
2140 _filterTypes(data.types).forEach(function(type) { 2141 if (mapping[type]) { 2142 newData.search_type = mapping[type]; 2143 } 2144 }); 2145 newData.omnibox = data.formatted_address; 2146 data.address_components.forEach(function(component) { 2147 _filterTypes(component.types).forEach(function(type) { 2148 if (mapping[type]) { 2149 newData[mapping[type]] = component.long_name; 2150 } 2151 }); 2152 }); 2153 var bounds = data.geometry.bounds; 2154 var convertedData = Object.assign(bounds, newData); 2155 2156 return '/home-search/listings?' + objectToQuerystring(convertedData); 2157 } 2158 2159 function debounce(func, wait) { 2160 let timeout; 2161 return function(...args) { 2162 const context = this; 2163 clearTimeout(timeout); 2164 timeout = setTimeout(() => func.apply(context, args), wait) 2165 } 2166 } 2167 2168 // Global methods / variables that can be accessed by element js 2169 window.luxuryPresence = { 2170 ...window.luxuryPresence, 2171 defaults: { 2172 companyId: '116d6abd-55d8-410f-b7f3-bdd7f6c5b727', 2173 apiGatewayUrl: '/api-gw', 2174 routerUrl: '/api-nv', 2175 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\
2175n }\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 $developmentId: ID\n $companyId: String\n $offset: Int\n $limit: Int\n $sort: String\n $sortDir: SortDirectionEnum\n $search: String\n $tag: [String!]\n $agentId: [ID!]\n $neighborhoodId: ID\n $neighborhoodIds: [ID!]\n ) {\n developments (\n developmentId: $developmentId\n companyId: $companyId\n offset: $offset\n limit: $limit\n sort: $sort\n sortDir: $sortDir\n search: $search\n tag: $tag\n agentId: $agentId\n neighborhoodId: $neighborhoodId\n neighborhoodIds: $neighborhoodIds\n ) {\n id\n name\n description\n descriptionShort\n slug\n createdAt\n media {\n smallUrl\n mediumUrl\n largeUrl\n xLargeUrl\n xxLargeUrl\n height\n width\n }\n googlePlaceData\n seoTitle\n seoDescription\n tags\n }\n developmentsCount(\n companyId: $companyId\n search: $search\n tag: $tag\n agentId: $agentId\n neighborhoodId: $neighborhoodId\n neighborhoodIds: $neighborhoodIds\n ) {\n count\n }\n }\n","pois":"\n query PointsOfInterest (\n $regionId: UUID!\n $radiu
2175s: 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"}, 2176 propertyPlaceholderImage: {"id":"455e491f-ec44-4b48-b20a-2bdd563b0f65","alt":null,"bytes":80380,"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/f8f2eaba-c548-4895-9fa3-4dc22da5063c","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/f8f2eaba-c548-4895-9fa3-4dc22da5063c","authorUrl":null,"createdAt":"2025-03-31T19:40:52.874Z","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/f8f2eaba-c548-4895-9fa3-4dc22da5063c","sourceUrl":null,"updatedAt":"2025-03-31T19:40:52.874Z","xLargeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/f8f2eaba-c548-4895-9fa3-4dc22da5063c","__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/f8f2eaba-c548-4895-9fa3-4dc22da5063c","de
2176scription":null,"displayName":"property_logo-1-1","originalUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/f8f2eaba-c548-4895-9fa3-4dc22da5063c","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/f8f2eaba-c548-4895-9fa3-4dc22da5063c","originalFileName":"Property_Logo (1) (1)","cloudinaryPublicId":"f8f2eaba-c548-4895-9fa3-4dc22da5063c"} 2177 }, 2178 objectToQuerystring: objectToQuerystring, 2179 getPath: getPath, 2180 getMLSAutocomplete: getMLSAutocomplete, 2181 getMLSAutocompleteWithFilters: getMLSAutocompleteWithFilters, 2182 makeMlsLink: makeMlsLink, 2183 debounce: debounce, 2184 }; 2185 2186 var wowOffset = 100; 2187 </script>
2187 2188
2188<script> 2189 (()=>{function e(e){return e&&e.__esModule?e.default:e}var t={},i={};i={getVideoFirstFrame(e){let t="https://res.cloudinary.com/";if(!e||!e.startsWith(t))return null;let i=e.replace(t,"").replace("f_auto:video","f_auto").split("/");if(-1===i[1].toLowerCase().indexOf("video"))return null;let s=i[i.length-1];s.lastIndexOf(".")>-1?s=`${s.slice(0,s.lastIndexOf("."))}.jpg`:s+=".jpg",i[i.length-1]=s;let r=3;"videos"===i[1].toLowerCase()&&""!==i[2]&&(r=2);let a=/^(?:[a-z]{1,3}|\$\w+)_\S+$/;for(;r<i.length-1&&a.test(i[r]);)r++;return i.splice(r,0,"so_0,eo_0"),t+i.join("/")}};let s={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "},r=/&(?:amp|lt|gt|quot|apos|nbsp|#(?:[0-9]+|[xX][0-9a-fA-F]+));/y,a=/[<&]/g,o=/["'>]/g,n=/<\/p\s*>|<br\s*\/?>|[\r\n\u2028\u2029]/g;function l(e,t){let i="";for(let l=0;l<e.length;){a.lastIndex=l;let d=a.exec(e);if(!d){i+=e.slice(l);break}let c=d.index;i+=e.slice(l,c);let u="&"===e[c]?function(e,t){r.lastIndex=t;let i=r.exec(e);return{text:i?function(e){if("#"!==e[1])return s[e.slice(1,-1)];
2189let t="x"===e[2]||"X"===e[2],i=parseInt(e.slice(t?3:2,-1),t?16:10);return 0===i||i>1114111||i>=55296&&i<=57343?e:160===i?" ":String.fromCodePoint(i)}(i[0]):"&",end:i?r.lastIndex:t+1}}(e,c):function(e,t,i){let s=function(e,t){let i=null;o.lastIndex=t+1;let s=o.exec(e);for(;s;){let t=s[0];if(i)t===i&&(i=null);else if('"'===t||"'"===t)i=t;else if(">"===t)return o.lastIndex;s=o.exec(e)}return -1}(e,t);return{text:-1===s?"<":function(e,t,i,s){if(!s)return"";let r=e.slice(t,i);if(/^<br\s*\/?>$/.test(r))return" ";if(/^<\/p\s*>$/.test(r)){n.lastIndex=i;let t=n.exec(e);if(t&&"<"===t[0][0])return" "}return""}(e,t,s,i),end:-1===s?t+1:s}}(e,c,t);i+=u.text,l=u.end}return i}t=function(e,{isEqual:t}){let s=[{field:"thumbnailUrl",w:320},{field:"smallUrl",w:960},{field:"mediumUrl",w:1280},{field:"largeUrl",w:1920},{field:"xLargeUrl",w:2560},{field:"xxLargeUrl",w:3456}],r=function(e,t,i){let s="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 r="number"==typeof i?i:0,a=Number.isInteger(e)?0:r,o={minimumFractionDigits:a,maximumFractionDigits:a};return"USD"===t?`$${e.toLocaleString(s,o)}`:"CAD"===t?`$${e.toLocaleString(s,o)} CAD`:"EUR"===t?`\u{20AC}${e.toLocaleString(s,o)}`:"GBP"===t?`\xa3${e.toLocaleString(s,o)}`:"PERCENT"===t?`${e}%`:"number"==typeof i&&i>-1?e.toLocaleString(s,{maximumFractionDigits:i}):e.toLocaleString(s)},a=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""}},d=function(e,t){let i,s,r=t||{};switch(r.mode){case"short":i=o(e),s=r.frequencySeparator||"/";break;case"standard":case"std":i=n(e),s=r.frequencySeparator||"/";break;default:i=a(e),s=r.frequencySeparator||" "}return i?r.frequencyTag||r.frequencyClass?`${s}<${r.frequencyTag||"span"}${r.frequencyClass?` class="${r.frequencyClass}"`:""}>${i}</${r.frequencyTag||"span"}>`:s+i:""};return{isEmpty(e,t){let i=!e||"string"==typeof e&&!e.trim()||!Object.keys(e).length;return t.fn?i?t.fn(this):t.inverse(this):i},ifEquals(e,i,s){return t(e,i)?s.fn(this):s.inverse(this)},"raw-helper":function(e){return e.fn()},striptags:e=>e?l(e=(e=e.replace(/<\!--(.|[\r\n])*?-\->/g,"")).replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi,""),!1):"",striptagsLineBreaks:e=>e?l(e=(e=e.replace(/<\!--(.|[\r\n])*?-\->/g,"")).replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi,""),!0):"",truncate:(e,t,i)=>e?e.length>t?"string"==typeof i?e.slice(0,t-i.length)+i:e.slice(0,t):e:"",setSubArray(e=[],t,i,s,r){r.data.root[s]=e.slice(t,i)},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:a,formatFrequencyShort:o,lpFormatFrequency:(e,t)=>d(e,t&&t.hash),subArray(e,t,i,s){return e>=t&&e<i?s.fn(this):s.inverse(this)},formatPropertyStatus(e,t,i){let s="";switch(e){case"SOLD":s="Sold";break;case"FOR_SALE":s="For Sale";break;case"COMING_SOON":s="Coming Soon";break;case"INACTIVE":s="Inactive";break;case"POCKET_LISTING":s="Pocket Listing";break;case"PENDING":s="Pending";break;case"UNDER_CONTRACT":s="Under Contract";break;case"ACTIVE_UNDER_CONTRACT":s="Active Under Contract";break;default:s=e}return("Sold"===s||"Leased"===s)&&t&&"string"==typeof i&&i&&(s+=` on ${i}`),s},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 i="current"===e?new Date:new Date(e);if(Number.isNaN(i.getTime()))return"";if("YYYY"===t||"year"===t)return`${i.getFullYear()}`;if("MM/DD/YY"===t){let e=i.getMonth()+1;return e<10&&(e=`0${e.toString()}`),`${e}/${i.getDate()}/${i.getFullYear().toString().substr(-2)}`}return`${["January","February","March","April","May","June","July","August","September","October","November","December"][i.getMonth()]} ${i.getDate()}, ${i.getFullYear()}`},openHousesFormat(e,t,i){if(!e||!t)return"";let s=e=>{let t=e.getHours();t>12&&(t-=12);let i=`${t}:${e.getMinutes()>9?e.getMinutes():"0"+e.getMinutes()}`;return e.getHours()>11?i+="PM":i+="AM",i},r="",a=e,o=t;
2189i&&(a=new Date(e).toLocaleString("en-US",{timeZone:i}),o=new Date(t).toLocaleString("en-US",{timeZone:i}),[,,,r]=new Date(t).toLocaleString("en-US",{timeZone:i,timeZoneName:"short"}).split(" "));let n=new Date(a),l=n.toLocaleDateString("en-US"),d=s(n),c=s(new Date(o));return`${l} ${d} - ${c} ${r}`},math:(e,t,i)=>(e=parseFloat(e),({"+":e+(i=parseFloat(i)),"-":e-i,"*":e*i,"/":e/i,"%":e%i})[t]),findByKey(e,t,i,s){let r=(e||[]).find(e=>e[t]===i);return s.fn(r)},capitalize(e,t,i){let s;return"string"==typeof e&&e.length&&(s=e.toLowerCase().split(t).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ").toString()),s},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,i,s){let r="",a=null;s.data&&(a=e.createFrame(s.data));let o=(i||[]).filter(Boolean);if(o&&o.length){let e=0;r=o.reduce((i,r,o)=>{let n=(t||[]).find(e=>e.id===r);return n?(a&&(a.index=o-e),i+s.fn(n,{data:a})):(e+=1,i)},"")}else for(let e=0,i=(t||[]).length;e<i;e++)a&&(a.index=e),r+=s.fn(t[e],{data:a});return r},ifIn(e,t,i){return t&&t.indexOf(e)>-1?i.fn(this):i.inverse(this)},partial:(t,i)=>(e.registerPartial(t,e.compile(i.fn())),`
2189<script type="text/x-handlebars-template" class="${t} pagination-script">${i.fn()}<\/script>`),numCompare(e,t,i,s){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}})[i](e,t)?!s.fn||s.fn(this):!!s.fn&&s.inverse(this)},lpFormatNumber:r,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,i)=>e&&e.join?e.join("string"==typeof t?t:", "):"",dedupe(t,i,s){let r=null,a=0,o=new Set;return s.data&&(r=e.createFrame(s.data)),(t||[]).reduce((e,t,n)=>{let l=i?t[i]:t;return!o.has(l)||i&&void 0===l?(o.add(l),r&&(r.index=n-a),e+s.fn(t,{data:r})):(a+=1,e)},"")},JSONstringify:(e,t)=>JSON.stringify(e),formatPropertyPrice(...t){let i=t[t.length-1].hash,s=t.length>1?t[0]:i.property,a=i.precision||0;t.length>2&&(i.mode=t[1]),i.mode||(i.mode="short");let o=t.length>3?t[2]:i.separator;if("string"!=typeof o&&(o=" | "),s.isPasswordProtected)return"Exclusive Listing";let n=t.length>4?t[3]:i.priceUponRequestText;if("string"!=typeof n&&(n="Price Upon Request"),s.priceUponRequest)return n;let l=s.salesPrice,c=null;"SOLD"!==s.status&&"Leased"!==s.status&&s.reducedPrice&&(i.reducedClass?c=s.reducedPrice:l=s.reducedPrice);let u="";c&&(u+=`<${i.reducedTag||"span"} class="${i.reducedClass}">${r(c,s.currency,a)}</${i.reducedTag||"span"}>`),l&&(l=r(l,s.currency,a),i.priceTag||i.priceClass?u+=`<${i.priceTag||"span"}${i.priceClass?` class="${i.priceClass}"`:""}>${l}</${i.priceTag||"span"}>`:u+=l);let h=s.leasePrice&&r(s.leasePrice,s.currency,a);if(h){u&&(u+=o);let e=`${h}${d(s.leasePeriod,i)}`;i.leaseTag||i.leaseClass?u+=`<${i.leaseTag||"span"}${i.leaseClass?` class="${i.leaseClass}"`:""}>${e}</${i.leaseTag||"span"}>`:u+=e}
2189return new e.SafeString(u)},mediaImage(t,i={}){if(!t)return;let{lazy:r,...a}=i.hash,o="",n="";if("string"==typeof t)o=t;else{let e={},{height:r,width:l,altTagText:d}=t;s.forEach(i=>{t[i.field]&&!e[t[i.field]]&&(e[t[i.field]]=i.w)});let c=Object.keys(e);if(!c.length)return;if(d&&(a.alt=d),r&&l&&(r>=l&&(a.class?a.class+=" portrait":a.class="portrait"),"setDims"in i.hash&&(a.width=l,a.height=r)),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&&(n=c.map(t=>`${t} ${e[t]}w`).join(", "),c.sort((t,i)=>Math.abs(e[t]-1280)-Math.abs(e[i]-1280))),o=c[0]}delete a.setDims,n||delete a.sizes,"alt"in a||(a.alt=""),!("loading"in a)&&(i?.data?.root?.sectionIndex>1||r)&&(a.loading="lazy");let l=Object.keys(a).map(t=>`${e.escapeExpression(t)}="${e.escapeExpression(a[t])}"`).join(" ");return new e.SafeString(`<img src="${o}"${n?` srcset="${n}"`:""}${l?` ${l}`:""}>`)},bgImage:e=>e?"string"==typeof e?e:e.largeUrl||e.url||"":"",concat(...e){let t="";for(let i in e)null!==e[i]&&void 0!==e[i]&&"object"!=typeof e[i]&&(t+=e[i]);return t},setVideoExtension(e,t){if(!e||!t)return"";let i=new URL(e);if("res.cloudinary.com"!==i.host)return i.pathname.endsWith(`.${t}`)?e:"";let s=i.pathname.lastIndexOf("."),r=i.pathname;return -1!==s&&(r=i.pathname.substr(0,s)),i.pathname=`${r}.${t}`,i.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 i=`${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="${i}" type="video/${e.format}${e.htmlCodecs}">`}).join("\n")},cloudinaryVideoFirstFrame:i.getVideoFirstFrame,initials(e,t){if(!e)return"";t?.hash?.endChar&&(e=e.split(t.hash.endChar)[0]);let i=+t?.hash?.maxChars||2,s=e.match(/\b\w/g)?.slice(0,i);return s?(t?.hash?.addText&&(s=s.map(e=>e+t.hash.addText)),s.join(t?.hash?.joinWith||"").toUpperCase()):""},normalizePhone(e){if(!e)return"";let t=String(e).trim();return(t.startsWith("+")?"+":"")+t.replace(/\D/g,"")}}};class d{constructor(e,t,i){if(this.config=e,this.window=t,this.document=i,!this.destroy)throw Error("Controllers must implement a deconstructor")}}let c="lp_lead_form_conversion_fired";function u(e,t){if(e&&t&&"function"==typeof t.sendGoogleTagManagerEvent&&!function(e){try{return"true"===e.sessionStorage.getItem(c)}catch{return!1}}(e))try{t.sendGoogleTagManagerEvent("event","generate_lead");try{e.sessionStorage.setItem(c,"true")}catch{}}catch{}}function h(e){return!!e&&(!!e.expired||Date.now()>=e.expiresAt)}let p="/api/v1/home-valuation";class m extends d{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 i=t.indexOf(", call time frame:");return -1!==i&&(t=t.substring(0,i).trim()),t}_transformAddressComponents(e){let t=t=>(e.find(e=>e.componentType===t)||{}).componentName?.text,i={},s=t("street_number"),r=t("route"),a=t("administrative_area_level_1"),o=t("postal_code"),n=t("subpremise"),l=t("locality")||t("sublocality_level_1")||t("neighborhood");return s&&(i.streetNumber=s),r&&(i.streetName=r),l&&(i.city=l),a&&(i.state=a),o&&(i.zipcode=o),n&&(i.addressLine2=n),i}_extractAddressAndCoordinates(e){let t=null,i=null;if(e?.result){let{result:s}=e;s.address?.addressComponents&&(t=this._transformAddressComponents(s.address.addressComponents)),s.geocode?.location&&(i={latitude:s.geocode.location.latitude,longitude:s.geocode.location.longitude})}return{structuredAddress:t,coordinates:i}}_filterEmptyStrings(e){let t={};for(let[i,s]of Object.entries(e))""!==s&&null!=s&&(t[i]=s);return t}_getRawAddress(e){let t=e.activity.content||{},i=e.activity.comments_attributes?.[0]?.text;return[t.address,t["property-address"],t.property_address,t.Property_Address,i,t.message,t.homeValuationAddress,t.propertyAddress].map(e=>e&&this._cleanAddressString(e)).find(Boolean)||""}_logLeadEvent(e,t,i=null){let s={event:e,companyId:this.config.companyId,websiteId:this.config.websiteId,timestamp:new Date().toISOString(),hasEmail:!!t.activity?.author_email,hasAddress:!!this._getRawAddress(t)};if(i&&(s.errorMessage=i.userMessage||(i.status?`Request failed with status ${i.status}`:"An error occurred"),s.errorName=i.name,s.errorStatus=i.status),console.error(`[HomeValuation] ${e}`,JSON.stringify(s)),this.window.posthog)try{this.window.posthog.capture(e,s)}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
2189ontact 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,i,s){let r=this._formatStructuredAddress(i)||this._getRawAddress(e);if(!r)throw Error("Unable to extract home valuation address from form data");let a={companyId:e.companyId,homeValuationAddress:r,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},o={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
2189ourceResource,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||{}},n=this._filterEmptyStrings(o);return{...a,...n,...i&&{address:i},...s&&{coordinates:s}}}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 i=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(i,e),i.status=t,i}_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,i){let s=new AbortController,r=setTimeout(()=>s.abort(),1e4);try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),signal:s.signal});clearTimeout(r);let o=await a.text(),n=this._parseResponsePayload(o);if(!a.ok)throw this._createResponseError(n,a.status);if(n&&"success"===n.status&&n.redirectUrl){if(h(i))return n;if(!this._isSafeRedirectUrl(n.redirectUrl))return console.error("Home valuation: refusing redirect to unsupported protocol"),n;return this.window.location.href=n.redirectUrl,{redirected:!0,url:n.redirectUrl}}return n}catch(e){throw clearTimeout(r),e}}async _submitHomeValuationRequest(e){let t=this._resolveValuationApiBase();this._logLeadEvent("home_valuation_submission_started",e);try{let i=this._getRawAddress(e),s=null;try{s=await this._validateAddressSafely(i)}catch(t){throw this._logLeadEvent("home_valuation_address_validation_failed",e,t),t}let r=null;try{r=await this._getHomeValuationEstimateSafely(s)}catch(t){this._logLeadEvent("home_valuation_estimate_failed",e,t),r=null}let{structuredAddress:a,coordinates:o}=this._extractAddressAndCoordinates(s),n=`${t}${p}`,l=this._buildHomeValuationData(e,r,a,o),d=await this._submitLead(n,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:i}=this,s=t.googleMapsAPIKey;if(!s&&i.luxuryPresence?.mapApiLoader&&(s=await i.luxuryPresence.mapApiLoader.getMapApiKey()),!s)throw Error("Google Maps API key not configured");let r=new AbortController,a=setTimeout(()=>r.abort(),1e4);try{let t=await fetch(`https://addressvalidation.googleapis.com/v1:validateAddress?key=${s}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({address:{addressLines:[e]},enableUspsCass:!1}),signal:r.signal});if(clearTimeout(a),!t.ok){let e=Error(`Address validation failed: ${t.status}`);throw e.status=t.status,e}return t.json()}catch(e){throw clearTimeout(a),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()}${p}`;if(!e?.result?.address?.addressComponents)return null;let i=this._transformAddressComponents(e.result.address.addressComponents);if(!this._hasMandatoryAddressFields(i))return this._logMissingAddressFields(i),null;let s=this._buildAddressQueryString(i),r=`${t}?${s}`,a=new AbortController,o=setTimeout(()=>a.abort(),1e4);try{let e=await fetch(r,{headers:{Accept:"application/json"},signal:a.signal});if(clearTimeout(o),!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(o),e}}}let g="middleName",y="redirect-pending",f=["name","firstName","lastName",g,"email","phone","phoneNumber","source","message","mlsId","sourceUrl"],v="lp_map_key_failed",w="oauthSuccess",b={cookieyes:{eventName:"cookieyes_consent_update",hasAnalyticsConsent:e=>(function(e){let t=e.cookie.match(/cookieyes-consent=([^;
2189]+)/);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 S(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function _(e,t){t.forEach(t=>{let i=e[t];Array.isArray(i)&&0===i.length&&delete e[t]})}function I(e,t,i,s){let r=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])),a=s?.merge?r.flat():r.find(e=>e.length>0)??[];t.forEach(t=>{delete e[t]}),a.length>0&&(e[i]=[...new Set(a)])}function E(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 i=[...e.socialLinks].sort((e,t)=>{let i=e.type?.toLowerCase()||"",s=t.type?.toLowerCase()||"";return i.localeCompare(s)});t.socialLinks=i;let s={youtube:"urlYoutube",facebook:"urlFacebook",instagram:"urlInstagram",linkedin:"urlLinkedin",podcast:"urlPodcast",twitter:"urlTwitter"};i.forEach(e=>{let i=s[e.type?.toLowerCase()??""];i&&(t[i]=e.link)})}return t}function A(e){return e&&Array.isArray(e)?e.map(e=>E(e)):e}function L(e){let{region:t}=e;if(!S(t))return e;let{schools:i,pois:s,...r}=t,a={...r,schools:S(i)?i.data??[]:[],...Array.isArray(s)?{pois:s.map(e=>({...e,category:"string"==typeof e.category?e.category.toUpperCase():e.category}))}:{}};return{...e,region:a}}function x(e){return e&&Array.isArray(e)?e.map(e=>L(e)):e}function $(e){let t=e.featuresAndAmenities;if(!Array.isArray(t))return e;let i=t.map(e=>({featureIds:e.featureIds??[],features:e.features??[],description:e.description}));return{...e,featuresAndAmenities:i}}function T(e){return e&&Array.isArray(e)?e.map(e=>$(e)):e}function C(e,t){return S(e)?t(e):e}function k(e,t){return Array.isArray(e)?t(e):e}var M={};M=` 2190 query PropertyDisclaimers($input: PropertyDisclaimersInput!) { 2191 propertyDisclaimers(input: $input) { 2192 feedId 2193 listingId 2194 resolvedFromListing 2195 listingCardAttribution 2196 listingDetailCourtesy 2197 listingDetailFooter 2198 logo 2199 } 2200 } 2201`;let P={mlsAttribution:"listingCardAttribution",mlsLogo:"logo",listingDetailCourtesy:"listingDetailCourtesy",listingDetailFooter:"listingDetailFooter"},U=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}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}setEventBus({enabled:e,apiKey:t,url:i}){this.eventBus={enabled:e,apiKey:t,url:i}}}({}),N=new class extends d{constructor(e,t,i){super(e,t,i),this.setLoginState=this.setLoginState.bind(this),this.pageId=null,this.modals=[],this.exitModalTriggered={},this.exitModalEventListeners=[]}initialize(e){try{let{config:t,document:i}=this;this.pageId=t.pageId,this.modals=i.querySelectorAll("body > #modals >
2201 .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,i=new Date().getTime()+864e5,s=`modal-controller-${e}`;try{t.localStorage.setItem(s,JSON.stringify(i))}catch(e){}}setLoginState(){let{window:e}=this;try{e.localStorage.setItem("isSignedUp","true")}catch(e){}}getModalWithExpiry(e){let{window:t}=this,i=t.localStorage,s=i.getItem(`modal-controller-${e}`);if(!s)return!1;let r=JSON.parse(s);return!(new Date().getTime()>r)||(i.removeItem(`modal-controller-${e}`),!1)}show(e,t={}){let{window:i}=this,s=this.getModalWithExpiry(e);(e&&!s||!0===t.forced)&&(i.lpUI.showModal(`modal-${e}`,t),this.setModalWithExpiry(e))}_attachModalHandler(e){let{pageId:t}=this,{trigger:i,pageSpecific:s}=e;(!s||e.pages.map(e=>e.pageId).includes(t))&&("EXIT"===i?this._exitModalHandler(e):"TIMER"===i?this._timerModalHandler(e):"FORCED"===i&&this._forcedModalHandler(e))}_exitModalHandler(e){let t=this,{document:i,exitModalTriggered:s}=this,{modalId:r}=e;function a(e){!s[r]&&(e.toElement||e.relatedTarget||(t.show(r),s[r]=!0))}i.addEventListener("mouseout",a),this.exitModalEventListeners.push(a)}_timerModalHandler(e){let{modalId:t,timerDelay:i}=e;setTimeout(()=>{this.show(t)},i)}_forcedModalHandler(e){let{modalId:t}=e,{window:i,document:s}=this;if("true"!==i.localStorage.getItem("isSignedUp")){let e=s.querySelector(`#modal-${t}`),r=e?.querySelector("form"),a=r?.dataset.delay||2e3;r.addEventListener("formsubmitted",()=>{this.setLoginState()}),i.addEventListener("oauthSuccess",()=>{this.setLoginState(),r.classList.add("success"),setTimeout(()=>{i.lpUI.hideModal(`modal-${t}`),r.reset(),r.classList.remove("success")},a)}),this.show(t,{forced:!0})}}}(U,window,document),R=new class extends d{constructor(e,t,i){super(e,t,i),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:i}=this,s=e.target.closest("button, a");if(!s)return;let r=s.dataset.type||"",a=s.href||s.dataset.href||"",o=s.target||"",{submit:n}=s.dataset;if(n){try{await this._handleSubmit(s)}catch(e){console.error(e)}((e,t=!1)=>{if(e){if(t)return window.open(e);window.location.assign(e)}})(a,"_blank"===o)}if(this._trackConversion(s),"VIDEO"===r)return void this._handleVideoButton(s);if("CONTACT_US"===r)return void this._handleContactUsButton(s);if("SUBSCRIBE"===r)return void t.lpUI.showModal("modal-global-subscribe");if("MY_ACCOUNT"===r)return void t.lpUI.showModal("modal-global-my-account");if("SHARE_POPUP"===r){let t=s.querySelector(".share-popup");t&&(t.style.display="flex"),e.stopPropagation();return}if("MODAL_"===r.substring(0,6)){let e=r.substring(6);t.lpUI.showModal(`modal-${e}`);return}if(a?.startsWith("mailto:")){let e=a.substring(7);i.sendGoogleAnalyticsEvent({hitType:"event",eventCategory:"button",eventAction:"click",eventLabel:"Email",eventValue:e})}else if(a?.startsWith("tel:")){let e=a.substring(4);i.sendGoogleAnalyticsEvent({hitType:"event",eventCategory:"button",eventAction:"click",eventLabel:"Phone",eventValue:e})}}async _handleSubmit(e){let t=e.closest("form"),{window:i}=this;return t?await i.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[,i,s]=t,r=`https://player.vimeo.com/video/${i}?`;return s&&(r+=`h=${s}&`),r+="autoplay=1"}_handleVideoButton(e){let{document:t}=this,i=e.closest("section"),{src:s}=e.dataset,r="";if(s&&(s.includes("youtube.com")||s.includes("youtu.be"))&&!s.includes("youtube.com/embed")){let e=s.match(/(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\?(?:\S*?&?v=)
2201)|youtu.be\/)([a-zA-Z0-9_-]{6,11})/);e&&(r=e[1])}let a=this._getVimeoSrc(s);if(r?s=`https://youtube.com/embed/${r}?autoplay=1&controls=0`:a&&(s=a),!s||!i)return;let o=s.endsWith(".mp4")||s.endsWith(".webm")||s.includes("cloudinary.com"),n=` 2202 <div id="modal-${i.id}" class="modal visible"> 2203 <div class="modal-content"> 2204 <div class="lightbox-video"> 2205 <div class="video-player"> 2206 <div class="embed-container"> 2207 ${o?`<video controls autoplay src="${s}"></video>`:`<iframe frameborder="0" allowfullscreen="1" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" title="YouTube video player" width="100%" height="100%" src="${s}"></iframe>`} 2208 </div> 2209 </div> 2210 </div> 2211 </div> 2212 <button class="close lp-close" type="button" aria-label="close modal"><span class="lp-close-icon" aria-hidden="true"></span></button> 2213 </div> 2214 `;t.body.insertAdjacentHTML("beforeend",n);let l=t.getElementById(`modal-${i.id}`);l.querySelector(".close").addEventListener("click",()=>{l.remove()})}_handleContactUsButton(e){let{window:t,document:i}=this;i.sendGoogleAnalyticsEvent({hitType:"event",eventCategory:"button",eventAction:"click",eventLabel:"contact"}),t.lpUI.showModal("modal-global-contact-us",{scrollLock:!0})}_trackConversion(e){let{window:t,document:i}=this,{gtagConversionId:s,gtagConversionLabel:r,fbEventName:a}=e.dataset;if(s&&r){t.dataLayer&&t.dataLayer.length&&(t.dataLayer.some(e=>e.length&&"config"===e[0]&&e[1]===s)||i.sendGoogleTagManagerEvent("config",s));let e=`${s}/${r}`;i.sendGoogleTagManagerEvent("event","conversion",{send_to:e})}t.fbq&&a&&t.fbq("track",a,{})}}(U,window,document),B=new class extends d{constructor(e,t,i){super(e,t,i),this.validatedForms=[]}initialize(e={}){try{let{window:t,document:i}=this,{selector:s}=e,r=[];if(r=s?i.querySelectorAll(`${s} form[data-type="contact-form"]`):i.querySelectorAll('form[data-type="contact-form"]'),i.querySelectorAll('input[type="tel"]').length&&!t.libphonenumber&&t?.luxuryPresence?.libs){let{loadJs:e,jsLibsMap:i}=t.luxuryPresence.libs,{libphonenumber:s}=i;e(s.jsSrc,this.attachValidation.bind(this,r))}else this.attachValidation(r);this.validatedForms=this.validatedForms.concat(r)}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 i=t.libphonenumber.isValidPhoneNumber;e.addEventListener("keyup",function(){if(this.hasAttribute("required")||this.value.replace(/\s/g,"").length)try{let e=this.value;i(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("")})}}}(U,window,document),D=new class extends d{constructor(e,t,i){super(e,t,i),this.forms=[],this.homeValuationService=new m(e,t,i)}initialize(e={}){try{let{document:t}=this,{selector:i}=e,s=[];(s=i?t.querySelectorAll(`${i} form[data-type="contact-form"]`):t.querySelectorAll('form[data-type="contact-form"]')).forEach(e=>{this._attachSubmitHandler(e)}),this.forms=this.forms.concat(s)}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),i={},s=[],r=/^name(?:-\d+)?$/;return t.forEach((e,t)=>{if("string"==typeof e){let a=e.trim();r.test(t)&&a&&s.push(a);let o=i[t];i[t]=o?`${o} ${a}`:a}else i[t]=e}),s.length?i.name=s.join(" ").trim():!i.name&&i.firstName&&(i.name=i.firstName,i.lastName&&(i.name+=` ${i.lastName}`)),this._deriveNameParts(i)}_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,i){let{window:s,config:r}=this,a=Object.keys(e).filter(e=>!f.includes(e)).reduce((t,i)=>(t[i]=e[i],t),{}),{pageId:o,companyId:n,websiteId:l,pageMeta:d}=r,c=s.localStorage.getItem("utm_vars")||"{}",u=s.localStorage.getItem("referrer")||"",h=this._getFormId(i);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:s.location.href,content:{...a,...JSON.parse(c)}},page:{pageId:o,companyId:n,websiteId:l,pageMeta:{...d,formId:h}},companyId:n,referrer:u,fields:t}}_handleSubmissionSuccess(e){let{window:t}=this,i=e.dataset.delay||2e3;e.classList.remove("loading"),e.classList.remove("error"),e.classList.add("success"),e.querySelectorAll(".success").forEach(e
2214=>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")},i)}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 i=this._getFields(t),s=this._buildSubmissionData(e,i,t);u(this.window,this.document);let r=await this._waitForLeadSubmit(e=>this._submitLeadRequest(s,e));if(this._sendGAEvent(s),r?.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,i={expired:!1,expiresAt:Date.now()+6e3},s=new Promise(e=>{t=setTimeout(()=>{i.expired=!0,e(null)},6e3)}),r=e(i).catch(e=>{if(h(i))return null;throw e});try{return await Promise.race([r,s])}finally{clearTimeout(t)}}_showRedirectPending(e){if(e.classList.add(y),e.querySelector(`.${y}__indicator`))return;let t=this.document.createElement("div");t.className=`${y}__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:i}=this.config;if(!t||!i)return void console.warn("[EventBus] Missing required data for user alias");let s=this.window.eventBusProvider.getDistinctId();if(!s)return void console.warn("[EventBus] No anonymous ID available for alias");let r=this.window.LuxuryPresenceEventBus.generateUUIDv5FromCompanyEmail(i,t);this.window.eventBusProvider.alias({anonId:s,canonicalId:r}),console.log("[EventBus] User aliased with canonical ID")}catch(e){console.error("[EventBus] User alias failed:",e)}}async _submitLeadRequest(e,t){let{config:i}=this;return(this._aliasUserWithEventBus(e),i.myhomeDashboardEnabled&&(e.activity?.activity_source==="HOME_VALUATION"||e.activity?.activity_source==="HOME_VALUE"))?this.homeValuationService._submitHomeValuationRequest({...e,deadline:t}):fetch(`${i.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,i={hitType:"event",eventCategory:"button",eventAction:"click"};switch(e.activity.activity_source){case"NEWSLETTER_SIGNUP":i.eventLabel="Newsletter",t.sendGoogleTagManagerEvent("event","newsletter_signup");break;case"HOME_SEARCH":i.eventLabel="HomeSearch",t.sendGoogleTagManagerEvent("event","home_search");break;case"HOME_VALUE":case"HOME_VALUATION":i.eventLabel="HomeValue",t.sendGoogleTagManagerEvent("event","home_valuation");break;case"EBOOK":i.eventLabel="Ebook",t.sendGoogleTagManagerEvent("event","ebook_download");break;default:i={hitType:"pageview",page:"/thank-you"},t.sendGoogleTagManagerEvent("event","contact_inquiry")}t.sendGoogleAnalyticsEvent(i)}_getFields(e){let t=e.querySelectorAll("input, select, textarea"),i={};return t.forEach(t=>{let{id:s,name:r,type:a}=t;if(r===g)return!0;let o="";if(s){let i=e.querySelector(`label[for='${s}']`);i?o=i.textContent.trim():t.placeholder&&(o=t.placeholder.trim())}i[r]={label:o,type:t.tagName,inputType:"INPUT"===t.tagName?a:"text"}}),i}_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 i=e.querySelector(".submission-error-message");i||((i=this.document.createElement("div")).className="submission-error-message",i.setAttribute("role","alert"),e.appendChild(i)),i.textContent=t||"Something went wrong. Please try again.",i.style.display="block"}_hideSubmissionError(e){let t=e.querySelector(".submission-error-message");t&&(t.style.display="none")}}(U,window,document),O=new class extends d{constructor(e,t,i){super(e,t,i),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 i=1;i<=3;i+=1){let s=e&&!t;try{let e=await fetch(this._getMapKeyUrl(i,s));if(t=t||s,this._setFailureFlag(!1),!e.ok)throw Error(`Failed to fetch API key: ${e.status}`);let r=await e.text();if(!r)return"";return this.apiKey=r,this.apiKey}catch(e){console.error(e),i<3&&await this._delay(300*2**(i-1))}}return this._setFailureFlag(!0),""}_getMapKeyUrl(e,t){let i=[];e>1&&i.push(`attempt=${e}`),t&&i.push("recovered_after_failure=1");let s=i.length?`?${i.join("&")}`:"";return`${this._getBaseUrl()}/api/v1/map${s}`}_hadPreviousFailure(){try{return"1"===this.window.sessionStorage.getItem(v)}catch(e){return!1}}_setFailureFlag(e){try{e?this.window.sessionStorage.setItem(v,"1"):this.window.sessionStorage.removeItem(v)}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");
2214let 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(i=>{i?t(i):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 i=Math.min(1024/e,1024/t);return{width:parseInt(e*i),height:parseInt(t*i)}}convertThemeToStaticApiUrl(e){return e.map(e=>{let t=e.stylers.reduce((e,t)=>{let i=t.visibility?`visibility:${t.visibility}`:"",s=t.color?`color:${t.color.replace("#","0x")}`:"",r=t.lightness?`lightness:${t.lightness}`:"";return`${e}|${i}${s}${r}`},""),i=e.elementType?`|element:${e.elementType}`:"";return`feature:${e.featureType}${i}${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:i}=await t.json();return i}catch(e){return console.error(e),""}}generateStaticMapUrl(e,t,i,s,r,a){let{width:o,height:n}=this.resizeStaticMapDimensions(r,a),l={center:`${e},${t}`,zoom:i,scale:2,size:`${o}x${n}`,key:this.apiKey};s&&(l.style=this.convertThemeToStaticApiUrl(s));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:i,...s}){let{width:r,height:a}=this.resizeStaticMapDimensions(e,t),o={...s,size:`${r}x${a}`};i&&(o.style=this.convertThemeToStaticApiUrl(i));let n=new URLSearchParams;Object.entries(o).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>n.append(e,t.toString())):n.append(e,t.toString())});let l=n.toString();try{return await this.getMapApiSignedUrl(l)}catch(e){return console.error(e),""}}}(U,window,document),q=new class extends d{destroy(){}updateQueryString(e,t,i){i||(i=this.window.location.href);let s=RegExp(`([?&])${e}=.*?(&|#|$)`,"i"),r="";null!=t&&(Array.isArray(t)?t.length&&(r=this.serializeArray(e,t)):"object"==typeof t?(s=RegExp(`([?&])${e}\\[[^=]*\\]=.*?(&|#|$)`,"i"),r=this.serializeObj(t,"",e)):r=`${e}=${encodeURIComponent(t)}`);let a=i.split("#"),o=a[0];if(s.test(i)){let e=o;for(r=r?`$1${r}$2`:"$1";s.test(e);)o=e.replace(s,r),e=e.replace(s,"$1");o=o.replace(/(&|\?)$/,"")}else if(r){let e=-1!==o.indexOf("?")?"&":"?";o+=`${e}${r}`}return void 0!==a[1]&&null!==a[1]&&(o+=`#${a[1]}`),o}getParameterByName(e,t){t||(t=this.window.location.href),e=e.replace(/[[\]]/g,"\\$&");let i=RegExp(`[?&]${e}(=([^&#]*)|&|#|$)`),s=Array.from(RegExp.prototype[Symbol.matchAll].call(i,t)).flat();if(!s.length){let i=RegExp(`[?&]${e}(\\[.*?\\])=(.*?)(?=&|#|$)`,"g");return s=Array.from(RegExp.prototype[Symbol.matchAll].call(i,t)).flat(),this._parseParamToObject(s,"advancedFilters"===e)}return s.length>3?s.reduce((e,t,i)=>((i+1)%3==0&&e.push(decodeURIComponent(t.replace(/\+/g," "))),e),[]):s[2]?decode
2214URIComponent(s[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 i={},s=this.makePageKey(t),r=this.getParameterByName(s);return r&&(i.page=parseInt(r)),Array.isArray(e)&&e.forEach(e=>{let t=this.makeParamKey(e,s),r=this.getParameterByName(t);if("int"===e.type)isFinite(r=parseInt(r))||(r=null);else if("bool"===e.type||"boolean"===e.type)r="true"===r||"false"!==r&&null;else if("json"===e.type)try{r=JSON.parse(r)}catch(e){}i[e.formKey||e.param]=r}),i}serializeParams(e,t,i){let s=this.window.location.href,r=this.makePageKey(t);return s=this.updateQueryString(r,i.page,s),Array.isArray(e)&&e.forEach(e=>{let t=this.makeParamKey(e,r),a=i[e.formKey||e.param];"json"===e.type&&null!=a&&(a=JSON.stringify(a)),s=this.updateQueryString(t,a,s)}),s}formatSliderAtom(e,t=""){return t+(Number.isInteger(e)?e:e.toFixed(2))}formatSliderValue(e,t="",i=""){return e<1e3?this.formatSliderAtom(e,t):e<1e6?`${this.formatSliderAtom(e/1e3,t)}${i}K`:`${this.formatSliderAtom(e/1e6,t)}${i}M`}formatSliderPriceRange(e,t,i,s){return t.min===e&&0!==e?`${s.lowPrefix}${this.formatSliderValue(e,i," ")}`:t.max===e?`${this.formatSliderValue(e,i," ")}${s.highSuffix}`:`${this.formatSliderValue(e,i," ")}`}formatSliderAreaRange(e,t,i,s){return t.min===e&&0!==e?`${s.lowPrefix}${this.formatSliderValue(e)} ${i}`:t.max===e?`${this.formatSliderValue(e)}${s.highSuffix} ${i}`:`${this.formatSliderValue(e)} ${i}`}getSearchFormValues(e){let{queryElement:t,priceSliderElement:i,areaSliderElement:s,neighborhoodSelect:r}=e,a={};if(t&&(a.search=t.value||null),i){let e=i.value.split(";"),t=parseInt(i.dataset.min),s=parseInt(i.dataset.max),r=parseInt(e[0]),o=parseInt(e[1]);a.priceMin=r!==t?r:null,a.priceMax=o!==s?o:null}if(s){let e=s.value.split(";"),t=parseInt(s.dataset.min),i=parseInt(s.dataset.max),r=parseInt(e[0]),o=parseInt(e[1]);a.areaMin=r!==t?r:null,a.areaMax=o!==i?o:null}return r&&(a.neighborhoodId=r.value||null),a}serializeObj(e,t="",i=""){let s=[];for(let r in e)if(e.hasOwnProperty(r)){let a,o=e[r];if(i){let e=t?`[${t}][${r}]`:`[${r}]`;a=`${i}${e}`}else a=t?`${t}[${r}]`:r;null!==o&&Array.isArray(o)?o.length&&s.push(this.serializeArray(a,o)):null!==o&&"object"==typeof o?s.push(this.serializeObj(o,a)):s.push(`${a}=${encodeURIComponent(o)}`)}return s.join("&")}serializeArray(e,t,i=""){let s=[];return t.forEach(t=>{let r=i?`${i}${e}`:e;s.push(`${r}=${encodeURIComponent(t)}`)}),s.join("&")}_parseParamToObject(e,t=!1){if(!e.length)return null;let i={};for(let s=0;s<e.length;s++)if((s+1)%3==0){let r=decodeURIComponent(e[s].replace(/\+/g," ")),a=e[s-1];Object.assign(i,this._setObjectPath(a,r,i,t))}return i}_setObjectPath(e,t,i,s=!1){let r=e.split(/[\[\]]/).filter(Boolean),a=["in","nin","btw","ciin","cinin"],o={},n=o,l=((e,t,i)=>{if(!t)return;let s=(Array.isArray(t)?t:t.match(/([^[.\]])+/g)).reduce((e,t)=>e&&e[t],e);return void 0===s?i:s})(i,r.join("."));return r.forEach((e,o)=>{o===r.length-1?l?n[e]=Array.isArray(l)?[...l,t]:[l,t]:n[e]=s&&a.includes(e)?[t]:t:(n[e]=i[e]?i[e]:{},n=n[e])}),o}}(U,window,document),V=new class extends d{constructor(e,t,i){super(e,t,i),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,i=e.closest("section[id]"),s=e.dataset.append,r=i.querySelector(".lp-expand-btn");if(!r)if((r=t.createElement("button")).className="lp-expand-btn",r.setAttribute("aria-label","Open a lightbox"),r.innerHTML='<span class="lp-i lp-i--expand-alt" aria-hidden="true"></span>',s){let e=i.querySelector(s);e&&e.appendChild(r)}else{let i=t.createElement("div");i.className="lp-expand-btn-wrapper",i.style.position="relative",i.appendChild(r),e.parentNode.insertBefore(i,e.nextSibling)}r.addEventListener("click",()=>{this._createLightbox({slider:e,section:i})})}_createLightbox({slider:e,section:t,initialIndex:i}){let{window:s,document:r}=this,a=`lightbox-for-${t?.id}`,o=s.$&&s.$.fn.slick,n=o&&e.slick,l="function"==typeof s.Splide,d=e.classList.contains("is-initialized")&&e.classList.contains("splide");function c(){let t=r.createElement("div");t.id=a,t.className="lp-lightbox",t.setAttribute("tabindex","-1"),t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.innerHTML=` 2215 <button class="lp-lightbox__close" aria-label="close modal"></button> 2216 <div class="lp-lightbox__content"> 2217 <div class="lp-lightbox__carousel splide" role="group" aria-label="Image Gallery"> 2218 <div class="splide__arrows"> 2219 <button class="splide__arrow splide__arrow--prev lp-lightbox-arrow lp-lightbox-arrow--prev"></button> 2220 <button class="splide__arrow splide__arrow--next lp-lightbox-arrow lp-lightbox-arrow--next"></button> 2221 </div> 2222 <div class="splide__track"> 2223 <ul class="splide__list"></ul> 2224 </div> 2225 </div> 2226 </div> 2227 `,"function"==typeof s.lpUI.requestScrollLock?s.lpUI.requestScrollLock(a):r.body.style.overflow="hidden",r.body.appendChild(t);let o=t.querySelector(".lp-lightbox__carousel"),n=o.querySelector(".splide__list");t.classList.add("show"),(d?e.querySelectorAll(".splide__slide:not(.splide__slide--clone) img"):e.querySelectorAll("img")).forEac
2227h(e=>{let t=e.cloneNode(!0);t.removeAttribute("style");let i=r.createElement("li");i.className="lp-lightbox__slide splide__slide",i.appendChild(t),n.appendChild(i)});let l=new s.Splide(o,{rewind:!0,arrows:!0,arrowPath:"",type:"loop",clones:1,pagination:!1,perPage:1,perMove:1});l.mount(),void 0!==i&&i>=0&&l.go(i),setTimeout(()=>{t.focus()},100);let c=e=>{if(!t.classList.contains("show"))return;let i=t.querySelector(".splide__arrow--prev"),s=t.querySelector(".splide__arrow--next"),r=t.querySelector(".lp-lightbox__close");"ArrowLeft"===e.key&&i?(e.preventDefault(),i.click()):"ArrowRight"===e.key&&s?(e.preventDefault(),s.click()):"Escape"===e.key&&r&&(e.preventDefault(),r.click())};r.addEventListener("keydown",c),t.querySelector(".lp-lightbox__close").addEventListener("click",()=>{r.removeEventListener("keydown",c),t.classList.remove("show"),l&&l.destroy(),"function"==typeof s.lpUI.releaseScrollLock?s.lpUI.releaseScrollLock(a):r.body.style.overflow="",t.remove()})}if("function"==typeof s.lpUI.requestScrollLock?s.lpUI.requestScrollLock(a):r.body.style.overflow="hidden",o&&!d){let t,i,o,l,d;i={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>'},(o=r.createElement("div")).id=a,o.className="lp-lightbox",o.setAttribute("tabindex","-1"),o.setAttribute("role","dialog"),o.setAttribute("aria-modal","true"),o.innerHTML=` 2228 <button class="lp-lightbox__close" aria-label="close modal"></button> 2229 <div class="lp-lightbox__content"> 2230 <div class="lp-lightbox__carousel"></div> 2231 </div> 2232 `,r.body.appendChild(o),l=o.querySelector(".lp-lightbox__carousel"),o.classList.add("show"),n?(t=e.slick.$slides.find("img"),i.initialSlide=e.slick?.currentSlide||0,t.each(function(){s.$(".lp-lightbox__carousel").append(s.$(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 i=r.createElement("div");i.className="lp-lightbox__slide",i.appendChild(t),l.appendChild(i)}),s.$(l).slick(i),setTimeout(()=>{o.focus()},100),d=e=>{if(!o.classList.contains("show"))return;let t=o.querySelector(".lp-lightbox-arrow--prev"),i=o.querySelector(".lp-lightbox-arrow--next"),s=o.querySelector(".lp-lightbox__close");"ArrowLeft"===e.key&&t?(e.preventDefault(),t.click()):"ArrowRight"===e.key&&i?(e.preventDefault(),i.click()):"Escape"===e.key&&s&&(e.preventDefault(),s.click())},r.addEventListener("keydown",d),o.querySelector(".lp-lightbox__close").addEventListener("click",()=>{r.removeEventListener("keydown",d),o.classList.remove("show");let t=l?.slick?s.$(l).slick("slickCurrentSlide"):0;l?.slick&&s.$(l).slick("unslick"),n&&s.$(e).slick("slickGoTo",t),"function"==typeof s.lpUI.releaseScrollLock?s.lpUI.releaseScrollLock(a):r.body.style.overflow="",o.remove()})}else l?c():(s.luxuryPresence.libs.loadCss(s.luxuryPresence.libs.jsLibsMap.splide.cssSrc),s.luxuryPresence.libs.loadJs(s.luxuryPresence.libs.jsLibsMap.splide.jsSrc,()=>{c(),s.luxuryPresence.libs.jsLibsMap.splide.isLoaded=!0}))}}(U,window,document),F=new class extends d{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:i,templateId:s,websiteId:r,pageId:a,shareId:o,pageMeta:n}=this.config;this.window.divolte.signal(e,Object.assign({companyId:i,templateId:s,websiteId:r,pageId:a,shareId:o,pageMeta:n},t))}sendLpPageView(){this.sendLpEvent("pageView",{})}}(U,window,document),j=new class extends d{constructor(e,t,i){super(e,t,i)}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"}
2232)),(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:i}=this.config;try{this.window.eventBusProvider.capture(e,{company:i,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",{})}}(U,window,document),H=new class extends d{constructor(e,t,i){super(e,t,i),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(w,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:i}=this.config,{data:s,origin:r}=e,{type:a,height:o,event:n,source:l,token:d}=s;if(a===t||"hide_intermediate_iframe"===a){let e=this.document.getElementById("onetap_google_intermediate_iframe");e&&(e.style.height=o,e.style.display=a===t?"unset":"none")}r===i&&"GOOGLE_SIGN_ON"===l&&("success"===n?(this._setExpirationLsItem(864e5),this._handleQualifyingQuestionsModal(d)):"cancel"===n&&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 i=this.document.createElement("iframe");i.src=this._buildUrlAndCopyAttributes(t,i,e),i.dataset.isSocialOauthButton=!0,t.replaceWith(i)}_listenToMessages(e){let{buyerSellerServiceUrl:t}=this.config;if(e.origin===t&&"success"===e.data.event){let e=new Event(w);this.window.dispatchEvent(e),u(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,i){let{buyerSellerServiceUrl:s,companyId:r,websiteId:a,pageId:o,pageMeta:n}=this.config,{location:l}=this.window,d=l.origin+l.pathname,c=new URL(`${s}/buttons/${i}`),u=this.window.localStorage.getItem("utm_vars"),h=this.window.localStorage.getItem("referrer");c.searchParams.append("companyId",r),c.searchParams.append("websiteId",a),c.searchParams.append("pageId",o),c.searchParams.append("sourceUrl",d),c.searchParams.append("pageMeta",JSON.stringify(n)),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"];
2232return 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,"/"),i=4-t.length%4,s=4===i?t:t+"=".repeat(i);return JSON.parse(atob(s))}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")}}}(U,window,document),G=new class extends d{constructor(e,t,i){super(e,t,i),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:i})=>{e&&e.removeEventListener&&e.removeEventListener(t,i)}),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 i=t.querySelector('input[name="email"]');i&&"string"==typeof e&&(i.value=e)}updateTriggerSourceValue(e){let t=this.getModalElement();if(!t)return;let i=t.querySelector(`#${this.modalId}-triggerSource`);i&&"string"==typeof e&&(i.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,i){let s="";if(i){let e=new Date;e.setTime(e.getTime()+864e5*i),s=`; expires=${e.toUTCString()}`}let r="; path=/; SameSite=Lax";this.window&&this.window.location&&"https:"===this.window.location.protocol&&(r+="; Secure"),this.document.cookie=`${e}=${encodeURIComponent(t||"")}${s}${r}`}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 i=()=>{this.setModalSubmittedCookie();let t=setTimeout(()=>{e.style.display="none",this.restoreBodyScroll()},100);this.timeouts.push(t)};t.addEventListener("formsubmitted",i),this.eventListeners.push({element:t,event:"formsubmitted",handler:i})}let i=e.querySelector('[data-dismiss="modal"]');if(i){let t=()=>{e.style.display="none",this.restoreBodyScroll()};i.addEventListener("click",t),this.eventListeners.push({element:i,event:"click",handler:t})}let s=t=>{(t.target===e||t.target.id===this.modalId)&&(e.style.display="none",this.restoreBodyScroll())};e.addEventListener("click",s),this.eventListeners.push({element:e,event:"click",handler:s})}}(U,window,document),K=new class extends d{constructor(e,t,i){super(e,t,i),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 i=` 2233 query { 2234 validSession { 2235 success 2236 } 2237 } 2238 `;try{let e=await this.window.fetch("/graphql",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({query:i})});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 s=t.data?.validSession?.success===!0;return this.lastValidationResult=s,this.lastValidationTime=Date.now(),s}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}}(U,window,document),z=new class extends d{constructor(e,t,i){super(e,t,i),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=b[e.provider];if(!t)return;this.eventName=t.eventName;let i=await this.window.luxuryPresence.session.validateSession();(t.hasAnalyticsConsent(this.document,this.window)||i)&&this.loadScript(),this.consentListener||(this.consentListener=e=>{t.isAnalyticsAccepted(e.detail)?this.loadScript():this.removeScripts()},this.document.addEventListener(t.eventName,this.consentListener))}}(U,window,document),Q=new class extends d{destroy(){}transformVariables(e,t){let i;return _(i={...t},["testimonialId"]),I(i,["testimonialId"],"testimonialIds"),0===i.limit&&delete i.limit,(void 0===i.limit||null===i.limit)&&(("testimonials"===e||"testimonialsCount"===e)&&(i.limit=50),("agents"===e||"agentsCount"===e||"developments"===e||"developmentsCount"===e||"neighborhoods"===e||"neighborhoodsCount"===e||"posts"===e||"postsCount"===e||"pressReleases"===e||"pressReleasesCount"===e)&&(i.limit=100)),!function(e){let{sortDir:t}=e;"string"==typeof t&&t.includes("_")&&(e.sortDir=t.replace(/_/g," "))}(i),!function(e,t){switch(t){case"agent":break;case"testimonials":case"testimonialsCount":_(e,["testimonialIds"]);break;case"agents":case"agentsCount":_(e,["officeId","teamId","developmentId","agentIds","tags"]),I(e,["officeId"],"officeIds"),I(e,["teamId"],"teamIds"),I(e,["developmentId"],"developmentIds");break;case"neighborhoods":case"neighborhoodsCount":_(e,["neighborhoodIds","neighborhoodId"]),I(e,["neighborhoodIds","neighborhoodId"],"neighborhoodId");break;case"developments":case"developmentsCount":_(e,["agentId","neighborhoodIds","neighborhoodId","developmentIds","tag"]),e.agentId&&Array.isArray(e.agentId)&&([e.agentId]=e.agentId),I(e,["neighborhoodIds","neighborhoodId"],"neighborhoodIds"),I(e,["developmentIds","developmentId"],"developmentIds");break;case"properties":case"propertiesCount":_(e,["statusIds","statusId","propertyTypeIds","propertyTypeId","propertyId","networkId","propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","
2238spaceTypeIds","addressState","addressCity","backfillProviders","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"]),["propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","spaceTypeIds","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"].forEach(t=>I(e,[t],t)),I(e,["statusIds","statusId"],"propertyStatusId"),e.excludeStatusId&&(e.excludePropertyStatusId=e.excludeStatusId,delete e.excludeStatusId),I(e,["propertyTypeIds","propertyTypeId"],"propertyTypeId"),I(e,["networkId"],"networkId"),I(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":_(e,["categoryIds","categoryId","neighborhoodId"]),void 0!==e.order&&(e.sort=e.order,delete e.order),I(e,["categoryIds","categoryId"],"categoryId");break;case"postCategories":_(e,["categoryId","categoryIds"]),void 0!==e.order&&(e.sort=e.order,delete e.order),I(e,["categoryIds","categoryId"],"categoryId");break;case"pressReleases":case"pressReleasesCount":_(e,["pressReleaseId","categories","propertyId","developmentId","agentId","teamId"]),I(e,["pressReleaseId"],"pressReleaseIds");break;case"offices":case"officesCount":_(e,["officeId","officeIds","tags"]),I(e,["officeId"],"officeIds");break;case"teams":case"teamsCount":_(e,["teamId","teamIds"]),I(e,["teamId"],"teamIds");break;case"pois":_(e,["categories"]),Array.isArray(e.categories)&&(e.categories=e.categories.map(e=>e.toLowerCase())),"string"==typeof e.sortBy&&(e.sortBy=e.sortBy.toLowerCase())}}(i,e),i}transformResponse(e,t){return"agent"===e?C(t,E):"agents"===e||"agentsCount"===e?k(t,A):"neighborhood"===e?C(t,L):"neighborhoods"===e||"neighborhoodsCount"===e?k(t,x):"development"===e?C(t,$):"developments"===e||"developmentsCount"===e?k(t,T):t}transformPage(e){return{items:e&&e.items||[],count:e&&e.total||0}}applyPropertyDisclaimers(t,i){if(!Array.isArray(t)||!t.length||!i||!i.length)return Promise.resolve(t);let s=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})),r=e=>{let s={};return(e||[]).forEach(e=>{s[`${e.feedId}:${e.listingId}`]=e}),t.map(e=>{let t=e&&s[`${e.vendorId}:${e.mlsId}`],r={};return i.forEach(e=>{let i=t?t[P[e]]:void 0;r[e]=i??null}),{...e,...r}})};if(!s.length)return Promise.resolve(r([]));let{websiteId:a}=this.config;return this.window.superagent?this.window.superagent.post(`${this.window.luxuryPresence.defaults.routerUrl}/graphql`).withCredentials().send({query:e(M),variables:{input:{websiteId:"string"==typeof a?a:void 0,properties:s}}}).then(e=>r(e.body&&e.body.data&&e.body.data.propertyDisclaimers),e=>(console.warn("[RouterApiController] propertyDisclaimers lookup failed:",e),r([]))):Promise.resolve(r([]))}}(U,window,document);function W(e,t){if(window.luxuryPresence[e])try{window.luxuryPresence[e].destroy()}catch(e){console.log(e)}window.luxuryPresence[e]=t}W("config",U),W("modals",N),W("buttons",R),W("validation",B),W("contactForms",D),W("mapApiLoader",O),W("pagination",q),W("expandSliders",V),W("divolte",F),W("eventBus",j),W("oauth",H),W("qualifyingQuestionsModal",G),W("session",K),W("consent",z),W("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(){}}),W("routerApi",Q),window.luxuryPresence.formatSliderPriceRange=q.formatSliderPriceRange.bind(q),window.luxuryPresence.formatSliderAreaRange=q.formatSliderAreaRange.bind(q),window.luxuryPresence.getSearchFormValues=q.getSearchFormValues.bind(q),window.luxuryPresence.handlebarsHelpersFactory=function(i){return e(t)(i,{isEqual:(e,t)=>e==t})}})(); 2239//# sourceMappingURL=lp-sdk.js.map 2240 2241 </script>
2241 2242 2243
2243<script> 2244 var lpGlobalInitialized = false; 2245 2246 function lpGlobalInit () { 2247 if (lpGlobalInitialized) { 2248 return; 2249 } 2250 lpGlobalInitialized = true; 2251 // Initialize wow animation plugin only according to turbolinks 2252 var wow; 2253 if (window.WOW) { 2254 wow = new WOW({ 2255 animateClass: 'animated', 2256 offset: wowOffset, 2257 live: false, 2258 callback: function(box) {} 2259 }); 2260 } 2261 // Initialize handlebar helpers only once 2262 function handlebarsInit() { 2263 if (!window.Handlebars) { 2264 return; 2265 } 2266 HandlebarsIntl.registerWith(Handlebars); 2267 Handlebars.registerHelper(window.luxuryPresence.handlebarsHelpersFactory(Handlebars)); 2268 } 2269 2270 handlebarsInit(); 2271 2272 var modalContentUrl = "/modals.html"; 2273 const modalsContainer = document.getElementById('modals'); 2274 if (modalsContainer) { 2275 fetch(modalContentUrl).then(function(res) { 2276 if (!res.ok) { 2277 throw new Error(`HTTP error! Status: ${res.status}`); 2278 } 2279 return res.text(); 2280 }).then(function(resultText) { 2281 modalsContainer.innerHTML = resultText; 2282 2283 // now we need to execute all script elements 2284 Array.from(modalsContainer.getElementsByTagName('script')).forEach(function (s) { 2285 const script = document.createElement("script"); 2286 script.text = s.innerHTML; 2287 Array.from(s.attributes).forEach(function (a) { 2288 script.setAttribute(a.name, a.value); 2289 }) 2290 s.parentNode.replaceChild(script, s); 2291 }); 2292 2293 try { 2294 window.luxuryPresence.modals.initialize(window.luxuryPresence._modalIncludes); 2295 window.luxuryPresence.contactForms.initialize({ selector: '#modals' }); 2296 window.luxuryPresence.validation.initialize({ selector: '#modals' }); 2297 window.luxuryPresence.oauth.initialize({ 2298 googleSignOnEnabled: true, 2299 iframe: false }); 2300 } catch (e) { 2301 console.log(e); 2302 } 2303 document.querySelectorAll('.modals > .modal .close').forEach(closeModalBtn => { 2304 closeModalBtn.addEventListener('click', function() { 2305 window.lpUI.hideClosestModal(closeModalBtn); 2306 }); 2307 }); 2308 }).catch((e) => console.log(e)); 2309 } 2310 /* Initialize Luxury Presence SDK */ 2311 try { 2312 window.luxuryPresence.config.setCompany("116d6abd-55d8-410f-b7f3-bdd7f6c5b727", {}); 2313 window.luxuryPresence.config.setWebsite("efd0b616-93bf-43b2-a015-21b3983523b4", { 2314 myhomeDashboardEnabled: true, 2315 mlsEnabled: true, 2316 hstValuationRedirectEnabled: true, 2317 hvStepTwoCaptureEnabled: false 2318 }); 2319 const url = new URL(window.location.href); 2320 const shareId = url.searchParams.get('shareId'); 2321 window.luxuryPresence.config.setPage("ac498edb-f816-4af6-aa6a-c17f67e90223", { 2322 sourceResource: "", 2323 pageElementId: "", 2324 pageQueryVariables: {}, 2325 shareId: "", 2326 }); 2327 window.luxuryPresence.config.setWebsiteApiGatewayUrl("https://wgw.luxurypresence.com", {}); 2328 window.luxuryPresence.config.setBuyerSellerServiceUrl("https://bss.luxurypresence.com", {}); 2329 window.luxuryPresence.config.setDivolteServiceUrl("https://t.luxurypresence.com", {}); 2330 window.luxuryPresence.config.setEventBusUrl("https://cdn.luxurypresence.com/scripts/event-bus-js", {}); 2331 window.luxuryPresence.config.setEventBus({ 2332 enabled: true, 2333 apiKey: "phc_PMYT31xlmXBaTCwpIRx1v6RrpLVZIuP47N3mOT6KLnr", 2334 url: "https://p.luxurypresence.com", 2335 }); 2336 window.luxuryPresence.config.setTemplateId("1d3967df-14f2-449d-87b7-bd68bf93906f", {}); 2337 window.luxuryPresence.config.setLeadIngesterUrl("https://leads.luxurypresence.com", {}); 2338 window.luxuryPresence.buttons.initialize({}); 2339 window.luxuryPresence.consent.initialize({ provider: 'lp-consent' }); 2340 window.luxuryPresence.contactForms.initialize({}); 2341 window.luxuryPresence.validation.initialize({}); 2342 window.luxuryPresence.expandSliders.initialize({}); 2343 window.luxuryPresence.oauth.initialize({ googleSignOnEnabled: true, iframe: false }); 2344 window.luxuryPresence.qualifyingQuestionsModal.initialize({ qualifyingQuestionsModalEnabled: true }); 2345 } catch (e) { 2346 console.log(e); 2347 } 2348 2349 /* Inject Section Specific Javascript */ 2350 try { 2351(function init(sectionDomId) { 2352 const section = document.getElementById(sectionDomId); 2353 const contactTitle = section.querySelector('.js-contact-title'); 2354 const emailInput = section.querySelector('.js-email-input'); 2355 const emailRegex = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~\-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+/; 2356 emailInput.addEventListener('input', function () { 2357 if (emailRegex.test(this.value)) { 2358 this.setCustomValidity(''); 2359 } else { 2360 this.setCustomValidity('Please enter a valid email address.'); 2361 } 2362 this.reportValidity(); 2363 }); 2364 const inputName = section.querySelector('.js-input-name'); 2365 inputName.addEventListener('keyup', function () { 2366 if (this.value.replaceAll(/\d/g, "").trim().split(" ").length < 2 || this.value.replaceAll(/\d/g, "").trim() === "") { 2367 this.setCustomValidity("Please input your first name and last name."); 2368 } else { 2369 this.setCustomValidity(""); 2370 } 2371 }); 2372 function setHttp(link) { 2373 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 2374 link = 'https://' + link; 2375 } 2376 return link; 2377 } 2378 const socialLinks = section.querySelectorAll('.lp-socials__link, .contact-form-modal-details__socials-l
2378ink'); 2379 socialLinks.forEach(linkElement => { 2380 const href = linkElement.getAttribute('href'); 2381 if (href) { 2382 linkElement.setAttribute('href', setHttp(href)); 2383 } 2384 }); 2385 if (contactTitle.length < 1) return; 2386 let words = contactTitle.textContent.split(" "); 2387 if (words.length > 1) { 2388 contactTitle.innerHTML = `<span class="contact__title-top">${words[0]} </span><span class="contact__title-bottom">${words.splice(1).join(" ")}</span>`; 2389 } 2390 const addRedirectToForm = () => { 2391 const redirectLink = document.getElementById(`${sectionDomId}`).querySelector('.js-redirect-link'); 2392 const form = document.getElementById(`${sectionDomId}`).querySelector('.js-form'); 2393 function redirectPage(link) { 2394 if (link) { 2395 const rawHref = link.getAttribute('href'); 2396 link.setAttribute('href', setHttp(rawHref)); 2397 link.click(); 2398 } 2399 } 2400 function setHttp(link) { 2401 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 2402 link = 'http://' + link; 2403 } 2404 return link; 2405 } 2406 form.addEventListener("reset", function () { 2407 redirectPage(redirectLink); 2408 }); 2409 }; 2410 addRedirectToForm(); 2411})('modal-global-contact-us'); 2412} catch(e) { 2413console.log(e); 2414} 2415 2416 try { 2417(function init(sectionDomId) { 2418 (function () { 2419 const observer = new IntersectionObserver(entries => { 2420 entries.forEach(entry => { 2421 if (entry.isIntersecting) entry.target.classList.add('is-in-viewport'); 2422 }); 2423 }, { 2424 threshold: 0.5 2425 }); 2426 const initialElements = document.querySelectorAll('[data-animate="true"]'); 2427 initialElements.forEach(element => observer.observe(element)); 2428 const container = document.querySelector('.data-container'); 2429 if (container) { 2430 const mutationObserver = new MutationObserver(mutations => { 2431 mutations.forEach(mutation => { 2432 if (mutation.type === 'childList') { 2433 mutation.addedNodes.forEach(node => { 2434 if (node.nodeType === 1 && node.getAttribute('data-animate') === 'true') observer.observe(node); 2435 }); 2436 } 2437 }); 2438 }); 2439 mutationObserver.observe(container, { 2440 childList: true, 2441 subtree: true 2442 }); 2443 } 2444 })(); 2445 const sectionSelector = document.getElementById(sectionDomId); 2446 const searchToggleSelector = sectionSelector.querySelector('.js-search-toggle-btn'); 2447 const searchWrapperSelector = sectionSelector.querySelector('.js-header-search'); 2448 const header = sectionSelector.querySelector('.js-header'); 2449 let lastScrollTop = 0; 2450 (function (stickyAnchorRoot) { 2451 if (!stickyAnchorRoot) return; 2452 function getInFlowTop(target) { 2453 var inlineValue = target.style.getPropertyValue('position'); 2454 var inlinePriority = target.style.getPropertyPriority('position'); 2455 target.style.setProperty('position', 'relative', 'important'); 2456 var top = target.getBoundingClientRect().top + window.pageYOffset; 2457 if (inlineValue) target.style.setProperty('position', inlineValue, inlinePriority);else target.style.removeProperty('position'); 2458 var scrollMarginTop = parseFloat(window.getComputedStyle(target).scrollMarginTop) || 0; 2459 return Math.max(0, top - scrollMarginTop); 2460 } 2461 stickyAnchorRoot.addEventListener('click', function (event) { 2462 if (event.defaultPrevented || event.button !== 0) return; 2463 if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; 2464 if (document.body.hasAttribute('data-scroll-container')) return; 2465 var link = event.target.closest('a[href]'); 2466 if (!link || !stickyAnchorRoot.contains(link) || link.target === '_blank') return; 2467 var href = link.getAttribute('href'); 2468 if (!/^#[^#]/.test(href)) return; 2469 var targetId; 2470 try { 2471 targetId = decodeURIComponent(href.slice(1)); 2472 } catch (e) { 2473 return; 2474 } 2475 var target = document.getElementById(targetId); 2476 if (!target || window.getComputedStyle(target).position !== 'sticky') return; 2477 event.preventDefault(); 2478 if (window.location.hash !== href) window.history.pushState(null, '', href); 2479 window.requestAnimationFrame(function () { 2480 window.scrollTo({ 2481 top: getInFlowTop(target) 2482 }); 2483 }); 2484 }); 2485 })(document.getElementById(sectionDomId)); 2486 const subNavOpeners = sectionSelector.querySelectorAll('.js-subnav-opener');
2487 subNavOpeners.forEach(opener => { 2488 opener.addEventListener('click', function (e) { 2489 e.preventDefault(); 2490 e.stopPropagation(); 2491 const parent = opener.parentElement; 2492 subNavOpeners.forEach(otherOpener => { 2493 if (otherOpener !== opener) { 2494 otherOpener.parentElement.classList.remove('header-navigation__item--sub-nav--opened'); 2495 } 2496 }); 2497 parent.classList.toggle('header-navigation__item--sub-nav--opened'); 2498 }); 2499 }); 2500 document.addEventListener('click', function (e) { 2501 if (!e.target.closest('.js-subnav-opener') && !e.target.closest('.header-navigation__item--sub-nav--opened')) { 2502 subNavOpeners.forEach(opener => { 2503 opener.parentElement.classList.remove('header-navigation__item--sub-nav--opened'); 2504 }); 2505 } 2506 }); 2507 function initHeaderColors() { 2508 try { 2509 var colorStr = window.getComputedStyle(header).getPropertyValue("--backgroundColor"); 2510 var bgColor = makeColor(colorStr); 2511 var isDark = (bgColor.rgba.r * 299 + bgColor.rgba.g * 587 + bgColor.rgba.b * 114) / 1000 < 128; 2512 sectionSelector.classList.add('is-background-color-' + (isDark ? 'dark' : 'light')); 2513 } catch (e) {} 2514 } 2515 function makeColor(str) { 2516 var color = { 2517 rgba: { 2518 r: 0, 2519 g: 0, 2520 b: 0, 2521 a: 0 2522 } 2523 }; 2524 if (str && str.match) { 2525 var m = str.match(/rgba?\s*\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\.0-9]+))?\)/); 2526 if (m) { 2527 color.rgba.r = parseInt(m[1]); 2528 color.rgba.g = parseInt(m[2]); 2529 color.rgba.b = parseInt(m[3]); 2530 color.rgba.a = parseFloat(m[4]); 2531 if (isNaN(color.rgba.a)) { 2532 color.rgba.a = 1; 2533 } 2534 } 2535 } 2536 return color; 2537 } 2538 initHeaderColors(); 2539 var navEl = document.querySelector('nav > header') || document.querySelector('nav'); 2540 var navbarHeight = navEl ? navEl.offsetHeight : 0; 2541 if (navEl) { 2542 if (window.ResizeObserver) { 2543 new ResizeObserver(function (entries) { 2544 if (!entries.length) return; 2545 navbarHeight = entries[0].target.offsetHeight; 2546 }).observe(navEl); 2547 } else { 2548 window.addEventListener('resize', function () { 2549 navbarHeight = navEl.offsetHeight; 2550 }); 2551 } 2552 } 2553 function isLocomotiveActive() { 2554 return document.body.hasAttribute('data-scroll-container'); 2555 } 2556 function updateHeaderVisibility(currentScrollTop) {
2557 if (!searchWrapperSelector || searchWrapperSelector.style.display !== 'block') { 2558 if (currentScrollTop === 0) header.classList.remove('header--hide');else if (currentScrollTop > lastScrollTop) header.classList.add('header--hide');else header.classList.remove('header--hide'); 2559 } 2560 lastScrollTop = currentScrollTop; 2561 } 2562 function customHeaderHideShow(currentScrollTop) { 2563 if (!navEl) return; 2564 if (currentScrollTop > 0) { 2565 navEl.classList.add('scroll'); 2566 } else { 2567 navEl.classList.remove('scroll'); 2568 } 2569 if (currentScrollTop > lastScrollTop && currentScrollTop > navbarHeight) { 2570 document.documentElement.style.setProperty('--global-header-height', '0px'); 2571 } else { 2572 document.documentElement.style.setProperty('--global-header-height', navbarHeight + 'px'); 2573 } 2574 } 2575 window.addEventListener('scroll', function () { 2576 if (isLocomotiveActive()) return; 2577 var currentScrollTop = window.scrollY || document.documentElement.scrollTop; 2578 updateHeaderVisibility(currentScrollTop); 2579 }); 2580 var isTicking = false; 2581 var latestLocoScrollY = 0; 2582 window.addEventListener('locomotive-scroll', function (e) { 2583 latestLocoScrollY = e.detail.scrollY; 2584 if (!isTicking) { 2585 window.requestAnimationFrame(function () { 2586 customHeaderHideShow(latestLocoScrollY); 2587 updateHeaderVisibility(latestLocoScrollY); 2588 isTicking = false; 2589 }); 2590 isTicking = true; 2591 } 2592 }); 2593 if (searchToggleSelector !== null) { 2594 searchToggleSelector.addEventListener('click', function () { 2595 if (searchWrapperSelector.style.display === 'block') { 2596 searchWrapperSelector.style.display = 'none'; 2597 } else { 2598 searchWrapperSelector.style.display = 'block'; 2599 header.classList.remove('header--hide'); 2600 } 2601 }); 2602 document.addEventListener('click', function (evt) { 2603 if (!searchToggleSelector.contains(evt.target) && !searchWrapperSelector.contains(evt.target)) searchWrapperSelector.style.display = 'none'; 2604 }); 2605 } 2606 window.luxuryPresence.mapApiLoader.load().then(() => {
2607 if (!searchWrapperSelector) return; 2608 const templateHTML = sectionSelector.querySelector('.js-card-template')?.innerHTML; 2609 const itemTemplate = templateHTML && Handlebars.compile(templateHTML); 2610 const searchMls = searchWrapperSelector.dataset.searchMls === 'true'; 2611 const searchProperties = searchWrapperSelector.dataset.searchProperties === 'true'; 2612 const selectedCountries = searchWrapperSelector.dataset.locations; 2613 const searchInputSelector = sectionSelector.querySelector('.js-header-search-input'); 2614 const searchIconSelector = sectionSelector.querySelector('.js-header-btn-search'); 2615 const closeIconSelector = sectionSelector.querySelector('.js-header-btn-close'); 2616 const searchResultsSelector = sectionSelector.querySelector('.js-header-search-results-holder'); 2617 const resultsContainerSelector = sectionSelector.querySelector('.js-header-results-container'); 2618 const loaderSelector = sectionSelector.querySelector('.js-header-spinner'); 2619 const predefinedSelector = sectionSelector.querySelector('.js-header-search-results-predefined'); 2620 const nothingFoundSelector = sectionSelector.querySelector('.js-header-spinner-nothing-found'); 2621 const service = new google.maps.places.AutocompleteService(); 2622 const geocoder = new google.maps.Geocoder(); 2623 var keyword; 2624 var leasePropertyState = false; 2625 var leasePropertySearched; 2626 var isLoading = false; 2627 var newSearchTimer; 2628 var placesResult = {}; 2629 function updateSearchDisplay() { 2630 var hasResults = !!resultsContainerSelector.innerHTML; 2631 var hasPredefined = predefinedSelector.querySelectorAll('a:not(.not-processed)').length > 0; 2632 nothingFoundSelector.style.display = 'none'; 2633 if (hasResults) { 2634 predefinedSelector.style.display = 'none'; 2635 loaderSelector.style.display = 'none'; 2636 resultsContainerSelector.style.display = 'block'; 2637 } else if (isLoading) { 2638 resultsContainerSelector.style.display = 'none'; 2639 predefinedSelector.style.display = 'none'; 2640 loaderSelector.style.display = 'block'; 2641 } else if (hasPredefined) { 2642 resultsContainerSelector.style.display = 'none'; 2643 loaderSelector.style.display = 'none'; 2644 predefinedSelector.style.display = 'block'; 2645 } else { 2646 resultsContainerSelector.style.display = 'none'; 2647 loaderSelector.style.display = 'none'; 2648 predefinedSelector.style.display = 'none'; 2649 if (keyword) nothingFoundSelector.style.display = 'block'; 2650 } 2651 } 2652 function moveSelection(up) { 2653 var count = resultsContainerSelector.innerHTML ? resultsContainerSelector : predefinedSelector; 2654 var links = count.querySelectorAll('.results-link'); 2655 if (!links.length) return; 2656 var idx = -1; 2657 links.forEach((link, i) => { 2658 if (idx === -1 && link.classList.contains('header-search-results__link--selected')) idx = i; 2659 }); 2660 var newIdx; 2661 if (up) { 2662 newIdx = idx - 1; 2663 if (newIdx < 0) newIdx = links.length - 1; 2664 } else { 2665 newIdx = idx + 1; 2666 if (newIdx > links.length - 1) newIdx = 0; 2667 } 2668 if (newIdx !== idx) { 2669 searchResultsSelector.querySelector('.header-search-results__link--selected')?.classList.remove('header-search-results__link--selected'); 2670 links[newIdx].classList.add('header-search-results__link--selected'); 2671 } 2672 } 2673 function startSearch() { 2674 const term = searchInputSelector.value; 2675 if (term === keyword && leasePropertySearched === leasePropertyState) return; 2676 leasePropertySearched = leasePropertyState; 2677 keyword = term; 2678 if (term) doSearch(term, leasePropertySearched);else setResults(null); 2679 } 2680 function mlsSearch(term) { 2681 var query = { 2682 omnibox: term, 2683 limit: 5 2684 }; 2685 return superagent.get(window.location.protocol + '//' + window.location.host + '/home-search/listings.json').query(query).then(function (res) { 2686 if (!Array.isArray(res.body)) return []; 2687 return res.body.map(function (item) { 2688 return { 2689 id: item.id, 2690 display_address: [item.address_1, item.city, [item.state, item.postal_code].filter(function (i) { 2691 return i; 2692 }).join(' ')].filter(function (i) { 2693 return i; 2694 }).join(', ') 2695 }; 2696 }); 2697 }, function (e) { 2698 console.log(e); 2699 return []; 2700 }); 2701 } 2702 function resolveGeoBounds(placeId, description) { 2703 return new Promise(function (resolve, reject) { 2704 geocoder.geocode({ 2705 'placeId': placeId 2706 }, function (results, status) { 2707 if (status != 'OK') return resolve(null); 2708 var result = results[0]; 2709 var bounds = new google.maps.LatLngBounds();
2710 bounds.extend(result.geometry.viewport.getSouthWest()); 2711 bounds.extend(result.geometry.viewport.getNorthEast()); 2712 result.geometry.bounds = bounds.toJSON(); 2713 var placeUrl = window.luxuryPresence.makeMlsLink(result); 2714 return resolve({ 2715 placeUrl: placeUrl, 2716 description: description 2717 }); 2718 }); 2719 }); 2720 } 2721 function addRestrictions(request) { 2722 switch (selectedCountries) { 2723 case 'Worldwide': 2724 return request; 2725 case 'US & Canada': 2726 request.componentRestrictions = { 2727 country: ['us', 'ca'] 2728 }; 2729 return request; 2730 default: 2731 request.componentRestrictions = { 2732 country: 'us' 2733 }; 2734 return request; 2735 } 2736 } 2737 function resolveAutocomplete(term, deeper) { 2738 var request = addRestrictions({ 2739 input: term, 2740 types: deeper ? ['geocode'] : ['(regions)'], 2741 limit: 1 2742 }); 2743 return new Promise(function (resolve, reject) { 2744 service.getPlacePredictions(request, function (results, status) { 2745 if (status !== google.maps.places.PlacesServiceStatus.OK) { 2746 resolve(null); 2747 return; 2748 } 2749 if (!Array.isArray(results)) { 2750 resolve(null); 2751 return; 2752 } 2753 if (deeper) { 2754 var allowedTypes = { 2755 'neighborhood': true, 2756 'administrative_area_level_3': true, 2757 'administrative_area_level_4': true, 2758 'administrative_area_level_5': true, 2759 'sublocality_level_1': true, 2760 'sublocality_level_2': true, 2761 'sublocality_level_3': true 2762 }; 2763 results = results.filter(function (res) { 2764 return res.types.find(t => allowedTypes[t]); 2765 }); 2766 } 2767 if (!results.length) { 2768 resolve(null); 2769 return; 2770 } 2771 resolve(results); 2772 }); 2773 }); 2774 } 2775 function placesSearch(term, ignoreInput) { 2776 if (placesResult.term !== term) { 2777 placesResult = { 2778 term: term, 2779 result: resolveAutocomplete(term).then(function (results) { 2780 if (!ignoreInput && term !== keyword) return null; 2781 if (ignoreInput && !results) return resolveAutocomplete(term, true); 2782 return results; 2783 }).then(function (results) { 2784 if (!ignoreInput && term !== keyword || !results) return []; 2785 var geoResultPromises = results.map(function (result) { 2786 return resolveGeoBounds(result.place_id, result.description); 2787 }); 2788 return Promise.all(geoResultPromises).then(function (geoLinks) { 2789 return geoLinks.filter(function (i) { 2790 return i; 2791 }).slice(0, 3); 2792 }); 2793 }) 2794 }; 2795 } 2796 return placesResult.result; 2797 } 2798 function propertiesSearch(term) { 2799 var payload = { 2800 companyId: window.luxuryPresence.defaults.companyId, 2801 search: term, 2802 offset: 0, 2803 limit: 4, 2804 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"] 2805 }; 2806 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}}}}'; 2807 return superagent.post(window.luxuryPresence.defaults.routerUrl + '/graphql').send({ 2808 query: gqlQuery, 2809 variables: window.luxuryPresence.routerApi.transformVariables('properties', payload) 2810 }).then(function (res) { 2811 var page = (res.body.data || {}).properties; 2812 return page && page.items || []; 2813 }, function (err) { 2814 return []; 2815 }); 2816 } 2817 function doSearch(term, leaseProperty) { 2818 isLoading = true; 2819 updateSearchDisplay(); 2820 Promise.all([searchMls ? mlsSearch(term, leaseProperty) : [], searchMls ? placesSearch(term) : [], searchProperties ? propertiesSearch(term, leaseProperty) : []]).then(function (res) { 2821 if (term !== keyword) return; 2822 setResults(res[0], res[1], res[2], leaseProperty); 2823 }); 2824 } 2825 function makeResultsBlockHtml(title, elementClass, links) { 2826 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>'; 2827 } 2828 function setResults(mlsResults, placesResults, propertiesResults, leaseProperty) { 2829 searchResultsSelector.querySelector('.header-search-results__link--selected')?.classList.remove('header-search-results__link--selected'); 2830 isLoading = false;
2831 updateSearchDisplay(); 2832 if (!mlsResults) { 2833 resultsContainerSelector.innerHTML = ''; 2834 updateSearchDisplay(); 2835 return; 2836 } 2837 if (!mlsResults.length && !placesResults.length && !propertiesResults.length) { 2838 updateSearchDisplay(); 2839 return; 2840 } 2841 var propertiesHtml = makeResultsBlockHtml('Featured Properties', 'header-properties', propertiesResults.map(function (result) { 2842 return itemTemplate(result); 2843 })); 2844 var placesHtml = makeResultsBlockHtml('Locations', '', placesResults.map(function (result) { 2845 return `<a class="header-search-results__link lp-icon" href="${result.placeUrl}${leaseProperty ? '&lease_property=true' : ''}">${result.description}</a>`; 2846 })); 2847 var mlsHtml = makeResultsBlockHtml('Address', '', mlsResults.map(function (result) { 2848 return `<a href="/home-search/listings/${result.id}" class="header-search-results__link lp-icon">${result.display_address}</a>`; 2849 })); 2850 resultsContainerSelector.innerHTML = propertiesHtml + placesHtml + mlsHtml; 2851 updateSearchDisplay(); 2852 } 2853 var neighborhoods = null; 2854 function fetchNeighborhoods() { 2855 var url = window.luxuryPresence.defaults.routerUrl; 2856 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {neighborhoods (companyId: $companyId, offset: $offset, limit: $limit) {items {id, name, mlsLink, googlePlaceData}}}'; 2857 var payload = {}; 2858 payload.offset = 0; 2859 payload.limit = 100; 2860 payload.companyId = window.luxuryPresence.defaults.companyId; 2861 return superagent.post(url + '/graphql').withCredentials().send({ 2862 query: gqlQuery, 2863 variables: payload 2864 }).then(function (res) { 2865 var data = res.body.data && res.body.data.neighborhoods; 2866 neighborhoods = data && data.items || null; 2867 if (neighborhoods && !neighborhoods.length) { 2868 neighborhoods = null; 2869 } 2870 }); 2871 } 2872 function setPredefinedNeighborhoods() { 2873 return fetchNeighborhoods().then(function () { 2874 if (!neighborhoods) return; 2875 var placesHtml = makeResultsBlockHtml('Locations', neighborhoods.map(function (item) { 2876 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>`; 2877 })); 2878 predefinedSelector.innerHTML = placesHtml; 2879 updateSearchDisplay(); 2880 }); 2881 } 2882 if (searchMls) setPredefinedNeighborhoods(); 2883 closeIconSelector.style.opacity = '0'; 2884 closeIconSelector.style.pointerEvents = 'none'; 2885 searchInputSelector.setAttribute('inputmode', 'search'); 2886 searchInputSelector.addEventListener('input', function () { 2887 if (this.value === '') { 2888 closeIconSelector.style.opacity = '0'; 2889 closeIconSelector.style.pointerEvents = 'none'; 2890 searchIconSelector.style.opacity = '1'; 2891 searchIconSelector.style.pointerEvents = 'auto'; 2892 } else { 2893 closeIconSelector.style.opacity = '1'; 2894 closeIconSelector.style.pointerEvents = 'auto'; 2895 searchIconSelector.style.opacity = '0'; 2896 searchIconSelector.style.pointerEvents = 'none'; 2897 } 2898 window.clearTimeout(newSearchTimer); 2899 newSearchTimer = window.setTimeout(startSearch, 300); 2900 }); 2901 searchInputSelector.addEventListener('keydown', function (ev) { 2902 if (ev.which === 38) { 2903 ev.preventDefault(); 2904 moveSelection(true); 2905 return false; 2906 } 2907 if (ev.which === 40) { 2908 ev.preventDefault(); 2909 moveSelection(); 2910 return false; 2911 } 2912 if (ev.which === 13) { 2913 let $lnk = searchResultsSelector.querySelector('.header-search-results__link--selected'); 2914 if ($lnk) { 2915 $lnk.click(); 2916 searchActive = false; 2917 updateSearchDisplay(); 2918 } else { 2919 $searchBtn.click(); 2920 } 2921 } 2922 }); 2923 closeIconSelector.addEventListener('click', function () { 2924 searchInputSelector.value = ''; 2925 searchInputSelector.dispatchEvent(new Event('input')); 2926 searchActive = false;
2927 updateSearchDisplay(); 2928 }); 2929 searchResultsSelector.addEventListener('mouseenter', function (ev) { 2930 searchResultsSelector.querySelector('.header-search-results__link--selected')?.classList.remove('header-search-results__link--selected'); 2931 }); 2932 function outsideClickHandler(e) { 2933 if (searchWrapperSelector.contains(e.target)) return; 2934 searchActive = false; 2935 updateSearchDisplay(); 2936 } 2937 document.addEventListener('click', outsideClickHandler); 2938 }); 2939})('global-navbar'); 2940} catch(e) { 2941console.log(e); 2942} 2943 try { 2944(function init(sectionDomId, options) { 2945 var elementSelector = options.elementSelector || 'nav'; 2946 var element = document.querySelector(elementSelector); 2947 var sections = document.querySelectorAll('body > section'); 2948 var subNavContainers = element.querySelectorAll('.sub-nav'); 2949 var initialBackgroundColor = options.initialBackgroundColor || element.style.backgroundColor; 2950 var backgroundColorScroll = options.backgroundColorScroll || '#191919'; 2951 var fontColor = options.fontColor || '#fff'; 2952 var fontColorScroll = options.fontColorScroll || '#000'; 2953 var didScroll = false; 2954 var lastScrollTop = 0; 2955 var delta = 5; 2956 2957 // eslint-disable-next-line sonarjs/no-collapsible-if 2958 if (wow) { 2959 // Wowjs might not trigger for position fixed elements 2960 if (window.scrollY > 0) { 2961 element.querySelectorAll('.wow').forEach(el => wow.show(el)); 2962 } 2963 } 2964 function adjustNavPinState() { 2965 // Remove 'visible' class from all subNavContainers 2966 for (let i = 0; i < subNavContainers.length; i++) { 2967 subNavContainers[i].classList.remove('visible'); 2968 } 2969 if (window.scrollY > 0) { 2970 element.style.backgroundColor = backgroundColorScroll; 2971 element.style.color = fontColorScroll; 2972 element.classList.add('scroll'); 2973 } else { 2974 element.style.backgroundColor = initialBackgroundColor; 2975 element.style.color = fontColor; 2976 element.classList.remove('scroll'); 2977 } 2978 } 2979 adjustNavPinState(); 2980 function onScroll() { 2981 didScroll = true; 2982 } 2983 window.addEventListener('scroll', onScroll); 2984 2985 // eslint-disable-next-line 2986 var debounceInterval = setInterval(() => { 2987 if (didScroll) { 2988 // eslint-disable-next-line 2989 hasScrolled(); 2990 didScroll = false; 2991 } 2992 }, 250); 2993 function hasScrolled() { 2994 adjustNavPinState(); 2995 // eslint-disable-next-line 2996 var navbarHeight = element.offsetHeight; 2997 // eslint-disable-next-line 2998 var st = window.scrollY; 2999 3000 // Make sure they scroll more than delta 3001 if (Math.abs(lastScrollTop - st) <= delta) { 3002 return; 3003 } 3004 if (st > lastScrollTop && st > navbarHeight) { 3005 // Scroll Down 3006 element.style.transform = `translateY(-${navbarHeight}px) scaleY(0)`; 3007 document.documentElement.style.setProperty('--global-header-height', '0px'); 3008 3009 // Some sections "follow" the navbar with class sticky (i.e. Producer search) 3010 sections.forEach(section => { 3011 if (section.classList.contains('sticky')) { 3012 section.style.top = '0px'; 3013 } 3014 }); 3015 } else { 3016 // Scroll Up 3017 // eslint-disable-next-line 3018 if (st + window.innerHeight < document.documentElement.scrollHeight) { 3019 element.style.transform = `translateY(0) scaleY(1)`; 3020 document.documentElement.style.setProperty('--global-header-height', `${navbarHeight}px`); 3021 sections.forEach(section => { 3022 if (section.classList.contains('sticky')) { 3023 section.style.top = `${navbarHeight}px`; 3024 } 3025 }); 3026 } 3027 } 3028 lastScrollTop = st; 3029 } 3030})('NAVBAR', JSON.parse("{\"fontColor\":\"#161515\",\"elementSelector\":\".header\",\"fontColorScroll\":\"#fff\",\"backgroundColorScroll\":\"rgba(26,26,26, .8)\",\"initialBackgroundColor\":\"#fff\"}")); 3031} catch(e) { 3032console.log(e); 3033} 3034 try { 3035(function init(sectionDomId) { 3036 if (sectionDomId === "main-section") sectionDomId = "global-sidemenu"; 3037 (function (stickyAnchorRoot) { 3038 if (!stickyAnchorRoot) return; 3039 function getInFlowTop(target) { 3040 var inlineValue = target.style.getPropertyValue('position'); 3041 var inlinePriority = target.style.getPropertyPriority('position'); 3042 target.style.setProperty('position', 'relative', 'important'); 3043 var top = target.getBoundingClientRect().top + window.pageYOffset; 3044 if (inlineValue) target.style.setProperty('position', inlineValue, inlinePriority);else target.style.removeProperty('position'); 3045 var scrollMarginTop = parseFloat(window.getComputedStyle(target).scrollMarginTop) || 0; 3046 return Math.max(0, top - scrollMarginTop); 3047 } 3048 stickyAnchorRoot.addEventListener('click', function (event) { 3049 if (event.defaultPrevented || event.button !== 0) return; 3050 if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; 3051 if (document.body.hasAttribute('data-scroll-container')) return; 3052 var link = event.target.closest('a[href]'); 3053 if (!link || !stickyAnchorRoot.contains(link) || link.target === '_blank') return; 3054 var href = link.getAttribute('href'); 3055 if (!/^#[^#]/.test(href)) return; 3056 var targetId;
3057 try { 3058 targetId = decodeURIComponent(href.slice(1)); 3059 } catch (e) { 3060 return; 3061 } 3062 var target = document.getElementById(targetId); 3063 if (!target || window.getComputedStyle(target).position !== 'sticky') return; 3064 event.preventDefault(); 3065 if (window.location.hash !== href) window.history.pushState(null, '', href); 3066 window.requestAnimationFrame(function () { 3067 window.scrollTo({ 3068 top: getInFlowTop(target) 3069 }); 3070 }); 3071 }); 3072 })(document.getElementById(sectionDomId)); 3073 var sidemenu = document.getElementById(sectionDomId); 3074 var openers = sidemenu.querySelectorAll('.js-sub-nav-opener'); 3075 var items = sidemenu.querySelectorAll('.js-idemenu-navigation-item'); 3076 var watermark = document.querySelector('.js-sidemenu-watermark'); 3077 var onShow = function () { 3078 window.lpUI.requestScrollLock(sectionDomId); 3079 }; 3080 var onHide = function () { 3081 window.lpUI.releaseScrollLock(sectionDomId); 3082 }; 3083 sidemenu.addEventListener('lpui-show', onShow); 3084 sidemenu.addEventListener('lpui-hide', onHide); 3085 openers.forEach(function (opener) { 3086 opener.addEventListener('click', function (event) { 3087 event.preventDefault(); 3088 this.classList.toggle('sidemenu-navigation__link--active'); 3089 this.classList.toggle('sidemenu-navigation__link--sub-nav-active'); 3090 }); 3091 }); 3092 document.body.addEventListener('click', function (evt) { 3093 if (!evt.target.closest('.sidemenu') && !evt.target.closest('.js-sidemenu-opener')) { 3094 window.lpUI.sideMenuHide(); 3095 } 3096 }); 3097 const handleLinkClick = function (href) { 3098 if (href && href.match(/^#[^#].*$/)) { 3099 window.lpUI.sideMenuHide(); 3100 } 3101 }; 3102 const mainNavLinks = sidemenu.querySelectorAll('.sidemenu-navigation__link'); 3103 mainNavLinks.forEach(function (link) { 3104 link.addEventListener('click', function (event) { 3105 const href = this.getAttribute('href'); 3106 handleLinkClick(href); 3107 }); 3108 }); 3109 const subNavLinks = sidemenu.querySelectorAll('.sidemenu-navigation-sub-nav__link'); 3110 subNavLinks.forEach(function (link) { 3111 link.addEventListener('click', function (event) { 3112 const href = this.getAttribute('href'); 3113 handleLinkClick(href); 3114 }); 3115 }); 3116 if (watermark) { 3117 items.forEach(function (item, index) { 3118 item.setAttribute("data-id", index <= 9 ? "0" + (index + 1) : index + 1); 3119 }); 3120 items.forEach(function (item) { 3121 item.addEventListener('mouseenter', function () { 3122 watermark.setAttribute("data-id", item.getAttribute("data-id")); 3123 watermark.style.opacity = 1; 3124 }); 3125 item.addEventListener('mouseleave', function () { 3126 watermark.style.opacity = 0; 3127 }); 3128 }); 3129 } 3130})('global-sidemenu'); 3131} catch(e) { 3132console.log(e); 3133} 3134 3135 try { 3136(function init(sectionDomId) { 3137 const sectionDom = document.getElementById(sectionDomId); 3138 const backToTopBtn = sectionDom.querySelector('.js-back-to-top'); 3139 backToTopBtn?.addEventListener('click', () => { 3140 window.scrollTo({ 3141 top: 0, 3142 behavior: 'smooth' 3143 }); 3144 }); 3145})('global-footer'); 3146} catch(e) { 3147console.log(e); 3148} 3149 3150 try { 3151(function init(sectionDomId) { 3152 const customDropdownHTML = ` 3153 <div class="custom-select" role="presentation"> 3154 <button class="custom-select-toggle" type="button" aria-haspopup="true" aria-expanded="false" role="combobox"></button> 3155 <div class="custom-select-menu"><div class="custom-select-content"></div></div> 3156 </div>`; 3157 const hideOriginalSelect = originalSelect => { 3158 originalSelect.classList.remove(...originalSelect.classList); 3159 originalSelect.classList.add("sr-only"); 3160 }; 3161 const openCustomSelect = customSelectToggle => {
3162 let customSelectMenu = customSelectToggle.nextElementSibling; 3163 customSelectMenu.classList.add("open"); 3164 customSelectToggle.classList.add("open"); 3165 customSelectToggle.ariaExpanded = true; 3166 }; 3167 const closeCustomSelect = customSelectToggle => { 3168 let customSelectMenu = customSelectToggle.nextElementSibling; 3169 customSelectMenu.classList.remove("open"); 3170 customSelectToggle.classList.remove("open"); 3171 customSelectToggle.ariaExpanded = false; 3172 }; 3173 const inheritAttributes = (originalSelect, customSelectToggle, customSelectMenu) => { 3174 customSelectToggle.className = customSelectToggle.className.concat(' ', originalSelect.className); 3175 customSelectToggle.id = originalSelect.getAttribute("id") + "custom"; 3176 customSelectToggle.dataset.name = originalSelect.getAttribute("name"); 3177 customSelectMenu.setAttribute("aria-labelledby", customSelectToggle.id); 3178 }; 3179 const initiateQuerySelectors = customSelect => { 3180 let customSelectToggle = customSelect.querySelector('.custom-select-toggle'), 3181 customSelectMenu = customSelect.querySelector('.custom-select-menu'), 3182 customSelectContent = customSelect.querySelector('.custom-select-content'); 3183 return { 3184 customSelectToggle, 3185 customSelectMenu, 3186 customSelectContent 3187 }; 3188 }; 3189 const initiateToggleText = (originalSelect, customSelectToggle) => { 3190 const dataLabelOption = originalSelect.querySelector("[data-label]"); 3191 const isMultiple = originalSelect?.multiple; 3192 if (!isMultiple) { 3193 const toggleText = dataLabelOption && dataLabelOption.dataset.label || originalSelect.querySelector(":checked")?.textContent || originalSelect.querySelector("option")?.textContent; 3194 customSelectToggle.classList.add("is-placeholder"); 3195 customSelectToggle.innerHTML = toggleText; 3196 } else { 3197 const placeholderText = dataLabelOption && dataLabelOption.dataset.label || originalSelect.querySelector("option")?.textContent || "Select"; 3198 const selectedOptions = Array.from(originalSelect.querySelectorAll("option:checked")).filter(opt => opt.value !== ""); 3199 if (selectedOptions.length === 0) { 3200 customSelectToggle.innerHTML = placeholderText; 3201 customSelectToggle.classList.add("is-placeholder"); 3202 } else if (selectedOptions.length === 1) { 3203 customSelectToggle.innerHTML = selectedOptions[0].textContent; 3204 customSelectToggle.classList.remove("is-placeholder"); 3205 } else { 3206 customSelectToggle.innerHTML = `${selectedOptions[0].textContent} +${selectedOptions.length - 1}`; 3207 customSelectToggle.classList.remove("is-placeholder"); 3208 } 3209 } 3210 }; 3211 const convertOptionsToButtons = (originalSelect, customSelectContent) => { 3212 originalSelect.querySelectorAll('option').forEach(option => { 3213 const button = createButtonFromOption(option); 3214 customSelectContent.appendChild(button); 3215 }); 3216 }; 3217 const createButtonFromOption = option => { 3218 let button = document.createElement('button'); 3219 button.className = "custom-select-item"; 3220 button.setAttribute("role", "option"); 3221 button.setAttribute("type", "button"); 3222 button.textContent = option.textContent; 3223 button.setAttribute('value', option.value); 3224 if (option.disabled) { 3225 button.setAttribute("disabled", "true"); 3226 } 3227 if (option.selected && option.value !== "") { 3228 button.classList.add("is-selected"); 3229 button.setAttribute("aria-selected", "true"); 3230 } 3231 return button; 3232 }; 3233 const initiateEventListeners = (originalSelect, customSelectToggle, customSelectMenu) => { 3234 const isMultiple = originalSelect?.multiple; 3235 originalSelect.addEventListener("focus", function () { 3236 openCustomSelect(customSelectToggle); 3237 customSelectToggle.focus(); 3238 }); 3239 customSelectToggle.addEventListener("click", function () { 3240 if (customSelectToggle.getAttribute("aria-expanded") === "true") { 3241 closeCustomSelect(customSelectToggle); 3242 } else { 3243 openCustomSelect(customSelectToggle); 3244 } 3245 }); 3246 customSelectMenu.addEventListener("click", function (event) { 3247 if (event.target.classList.contains('custom-select-item')) { 3248 const clickedValue = event.target.value; 3249 const clickedOption = originalSelect.querySelector(`option[value="${clickedValue}"]`); 3250 const placeholderOption = originalSelect.querySelector("[data-label]"); 3251 const placeholderText = placeholderOption?.dataset.label || originalSelect.querySelector("option")?.textContent || "Select"; 3252 if (!isMultiple) { 3253 let opts = customSelectMenu.querySelectorAll(".is-selected"); 3254 [].forEach.call(opts, function (el) { 3255 el.classList.remove("is-selected"); 3256 }); 3257 event.target.classList.add("is-selected"); 3258 clickedOption.selected = true; 3259 customSelectToggle.innerHTML = clickedOption.textContent; 3260 if (clickedValue === "" || event.target.classList.contains("is-placeholder")) { 3261 customSelectToggle.classList.add("is-placeholder"); 3262 } else { 3263 customSelectToggle.classList.remove("is-placeholder"); 3264 } 3265 let changeEvent = new Event('change', { 3266 bubbles: true 3267 }); 3268 originalSelect.dispatchEvent(changeEvent); 3269 closeCustomSelect(customSelectToggle); 3270 } else { 3271 if (clickedValue === "") { 3272 customSelectMenu.querySelectorAll(".is-selected").forEach(el => { 3273 el.classList.remove("is-selected"); 3274 el.setAttribute("aria-selected", "false"); 3275 }); 3276 originalSelect.querySelectorAll("option").forEach(opt => opt.selected = false); 3277 customSelectToggle.innerHTML = placeholderText; 3278 customSelectToggle.classList.add("is-placeholder"); 3279 } else { 3280 const isCurrentlySelected = event.target.classList.contains("is-selected"); 3281 event.target.classList.toggle("is-selected"); 3282 event.target.setAttribute("aria-selected", (!isCurrentlySelected).toString()); 3283 clickedOption.selected = !isCurrentlySelected; 3284 const allItem = customSelectMenu.querySelector('.custom-select-item[value=""]'); 3285 if (allItem) { 3286 allItem.classList.remove("is-selected"); 3287 allItem.setAttribute("aria-selected", "false"); 3288 } 3289 const allOption = originalSelect.querySelector('option[value=""]'); 3290 if (allOption) allOption.selected = false;
3291 const selectedItems = customSelectMenu.querySelectorAll(".custom-select-item.is-selected"); 3292 if (selectedItems.length === 0) { 3293 customSelectToggle.innerHTML = placeholderText; 3294 customSelectToggle.classList.add("is-placeholder"); 3295 } else if (selectedItems.length === 1) { 3296 customSelectToggle.innerHTML = selectedItems[0].textContent; 3297 customSelectToggle.classList.remove("is-placeholder"); 3298 } else { 3299 customSelectToggle.innerHTML = `${selectedItems[0].textContent} +${selectedItems.length - 1}`; 3300 customSelectToggle.classList.remove("is-placeholder"); 3301 } 3302 } 3303 let changeEvent = new Event('change', { 3304 bubbles: true 3305 }); 3306 originalSelect.dispatchEvent(changeEvent); 3307 } 3308 } 3309 }); 3310 document.addEventListener("click", function (event) { 3311 if (!customSelectMenu.contains(event.target) && !customSelectToggle.contains(event.target)) { 3312 closeCustomSelect(customSelectToggle); 3313 } 3314 }); 3315 }; 3316 const createCustomSelect = originalSelect => { 3317 const customSelect = document.createElement('div'); 3318 customSelect.innerHTML = customDropdownHTML; 3319 const { 3320 customSelectToggle, 3321 customSelectMenu, 3322 customSelectContent 3323 } = initiateQuerySelectors(customSelect); 3324 inheritAttributes(originalSelect, customSelectToggle, customSelectMenu); 3325 hideOriginalSelect(originalSelect); 3326 initiateToggleText(originalSelect, customSelectToggle); 3327 convertOptionsToButtons(originalSelect, customSelectContent); 3328 initiateEventListeners(originalSelect, customSelectToggle, customSelectMenu); 3329 return customSelect; 3330 }; 3331 const setCustomSelectValue = (originalSelect, value) => {
3332 let customSelect = originalSelect.nextElementSibling; 3333 let customSelectToggle = customSelect.querySelector(".custom-select-toggle"); 3334 let customSelectContent = customSelect.querySelector(".custom-select-content"); 3335 if (!customSelectContent) return; 3336 let selectedOption = value ? Array.from(customSelectContent.children).find(function (b) { 3337 return b.value === value; 3338 }) : customSelectContent.firstChild; 3339 if (!selectedOption) { 3340 return; 3341 } 3342 if (selectedOption.classList.contains("is-disabled")) return; 3343 let elementNumber = Array.from(selectedOption.parentNode.children).indexOf(selectedOption); 3344 let linkedOption = originalSelect.querySelectorAll("option")[elementNumber]; 3345 linkedOption.selected = true; 3346 selectedOption.classList.add("is-selected"); 3347 selectedOption.parentNode.querySelectorAll(".custom-select-item").forEach(el => { 3348 if (el !== selectedOption) { 3349 el.classList.remove("is-selected"); 3350 } 3351 }); 3352 closeCustomSelect(customSelectToggle); 3353 customSelectToggle.innerHTML = linkedOption.innerHTML; 3354 if (linkedOption.value) { 3355 customSelectToggle.classList.remove("is-placeholder"); 3356 if (linkedOption.value !== "") { 3357 customSelect.classList.add("has-selection"); 3358 } else { 3359 customSelect.classList.remove("has-selection"); 3360 } 3361 } else { 3362 customSelect.classList.remove("has-selection"); 3363 customSelectToggle.classList.add("is-placeholder"); 3364 } 3365 }; 3366 const customSelect = originalSelect => { 3367 const customSelect = createCustomSelect(originalSelect); 3368 originalSelect.insertAdjacentElement('afterend', customSelect); 3369 return customSelect; 3370 }; 3371 const resetCustomSelect = originalSelect => { 3372 const customSelectEl = originalSelect.nextElementSibling; 3373 const customSelectToggle = customSelectEl?.querySelector('.custom-select-toggle'); 3374 const customSelectContent = customSelectEl?.querySelector('.custom-select-content'); 3375 if (!customSelectToggle || !customSelectContent) return; 3376 const placeholderOption = originalSelect.querySelector("[data-label]"); 3377 const placeholderText = placeholderOption?.dataset.label || originalSelect.querySelector("option")?.textContent || "Select"; 3378 customSelectContent.querySelectorAll('.custom-select-item').forEach(item => { 3379 item.classList.remove('is-selected'); 3380 item.setAttribute('aria-selected', 'false'); 3381 }); 3382 originalSelect.querySelectorAll('option').forEach(opt => opt.selected = false); 3383 customSelectToggle.innerHTML = placeholderText; 3384 customSelectToggle.classList.add('is-placeholder'); 3385 const customSelectWrapper = customSelectEl.querySelector('.custom-select'); 3386 if (customSelectWrapper) { 3387 customSelectWrapper.classList.remove('has-selection'); 3388 } 3389 }; 3390 const section = document.getElementById(sectionDomId); 3391 const closeBtn = section.querySelector(".js-close-btn"); 3392 const connectBtn = section.querySelector(".js-btn-connect"); 3393 const popUp = section.querySelector(".js-pop-up"); 3394 const btnHolder = section.querySelector(".js-btn-holder"); 3395 const form = section.querySelector(".js-form"); 3396 const successMessage = section.querySelector(".js-success"); 3397 const redirectLink = section.querySelector(".js-redirect-link"); 3398 function setHttp(link) { 3399 if (link.search(/^(http[s]?\:\/\/|\/)/) == -1) { 3400 link = "https://" + link; 3401 } 3402 return link; 3403 } 3404 function redirectPage(link) { 3405 if (link) { 3406 window.location.href = setHttp(link.getAttribute("href")); 3407 } 3408 } 3409 const selects = document.querySelectorAll(".floating-contact-button select.js-select"); 3410 selects.forEach(function (el) { 3411 customSelect(el); 3412 }); 3413 const inputName = form.querySelector('.js-input-name'); 3414 inputName.addEventListener('keyup', function () { 3415 if (this.value.replaceAll(/\d/g, "").trim().split(" ").length < 2 || this.value.replaceAll(/\d/g, "").trim() === "") { 3416 this.setCustomValidity("Please input your first name and last name."); 3417 } else { 3418 this.setCustomValidity(""); 3419 } 3420 }); 3421 function showSuccessMessage() { 3422 successMessage.style.display = "block"; 3423 form.style.display = "none"; 3424 } 3425 form.addEventListener("formsubmitted", showSuccessMessage); 3426 form.addEventListener("reset", function () { 3427 showSuccessMessage(); 3428 redirectPage(redirectLink); 3429 }); 3430 window.addEventListener("scroll", function () { 3431 if (window.scrollY >= 150 && window.getComputedStyle(popUp).display !== "block") btnHolder.classList.add("floating-contact-button__btn-holder--visible");else btnHolder.classList.remove("floating-contact-button__btn-holder--visible"); 3432 }); 3433 closeBtn.addEventListener("click", function () { 3434 popUp.style.display = "none"; 3435 btnHolder.classList.add("floating-contact-button__btn-holder--visible"); 3436 }); 3437 connectBtn.addEventListener("click", function () { 3438 popUp.style.display = "block"; 3439 btnHolder.classList.remove("floating-contact-button__btn-holder--visible"); 3440 }); 3441})('global-mobile-contact'); 3442} catch(e) { 3443console.log(e); 3444} 3445 3446 try { 3447(function init(sectionDomId) { 3448 const scrollSection = document.getElementById(`${sectionDomId}`).querySelector('.js-scroll-section'); 3449 const introBtn = document.getElementById(`${sectionDomId}`).querySelector('.jsScrollBtn'); 3450 introBtn.addEventListener("click", function (e) { 3451 e.preventDefault(); 3452 window.scrollTo({ 3453 top: scrollSection.offsetTop + scrollSection.offsetHeight, 3454 behavior: "smooth" 3455 }); 3456 }); 3457})('section-a47ed492-3b7c-468d-99c5-27dfd2078c71', 'undefined'); 3458} catch(e) { 3459console.log(e); 3460} 3461 try { 3462(function init(sectionDomId, options) { 3463 let section = null; 3464 switch (sectionDomId) { 3465 case 'NAVBAR': 3466 section = document.querySelector('body > nav, #global-navbar'); 3467 break; 3468 case 'FOOTER': 3469 section = document.querySelector('body > footer, #global-footer'); 3470 break; 3471 case 'SIDEMENU': 3472 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 3473 break; 3474 case 'CONTACT':
3475 section = document.querySelector('#modal-global-contact-us'); 3476 break; 3477 case 'MOBILE_CONTACT': 3478 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 3479 break; 3480 case 'SUBSCRIBE': 3481 // Subscribe Not Implemented 3482 section = null; 3483 break; 3484 case 'ACCOUNT': 3485 // Account Not Implemented 3486 section = null; 3487 break; 3488 default: 3489 section = document.querySelector('#' + sectionDomId); 3490 } 3491 if (!section) { 3492 return; 3493 } 3494 3495 // Where content / items are rendered 3496 const dataContainer = section.querySelector('.data-container'); 3497 if (!dataContainer) { 3498 // no place to render items = no need to query server or do anything else 3499 return; 3500 } 3501 let variables = options.variables || {}; 3502 3503 // Some variables in options may not have been injected - remove 3504 Object.keys(variables).forEach(function (variableName) { 3505 if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) { 3506 delete variables[variableName]; 3507 } 3508 }); 3509 3510 // Merge page query variables 3511 if (options.usePageResource) { 3512 variables = { 3513 ...variables, 3514 ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource] 3515 }; 3516 } 3517 3518 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Callers 3519 // resolve the flag â fetchData reads the section stamp, aux fetches read 3520 // their own resource's stamp (auxUsesRouter). 3521 function apiUrl(useRouter) { 3522 return options.url || (useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl); 3523 } 3524 3525 // ROUTER-CLEANUP: aux resources roll out on their own flag, not the section's 3526 // (options.routerApiAux is stamped per aux resource server-side). 3527 function auxUsesRouter(resource) { 3528 return !!(options.routerApiAux && options.routerApiAux[resource]); 3529 } 3530 3531 // Pagination Executes on a Numbered Pagination Container 3532 // Or via a load more button 3533 let mode = 'BUTTONLESS_PAGINATION'; 3534 const container = section.querySelector('.pagination-container');
3535 const loadMoreButton = section.querySelector(options?.loadMoreSelector); 3536 if (container) { 3537 mode = 'NUMBERED_PAGINATION'; 3538 } 3539 if (loadMoreButton) { 3540 mode = 'LOAD_MORE_BUTTON'; 3541 } 3542 let searchContainer = section.querySelector('.search-container'); 3543 const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false; 3544 const eventPrefix = '__pagination-'; 3545 const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{ 3546 param: 'neighborhoodId', 3547 urlKey: 'neighborhood' 3548 }, { 3549 param: 'search', 3550 urlKey: 'search' 3551 }, { 3552 param: 'salesPriceGTE', 3553 urlKey: 'pricemin', 3554 formKey: 'priceMin', 3555 type: 'int' 3556 }, { 3557 param: 'salesPriceLTE', 3558 urlKey: 'pricemax', 3559 formKey: 'priceMax', 3560 type: 'int' 3561 }, { 3562 param: 'livingSpaceSizeGTE', 3563 urlKey: 'areamin', 3564 formKey: 'areaMin', 3565 type: 'int' 3566 }, { 3567 param: 'livingSpaceSizeLTE', 3568 urlKey: 'areamax', 3569 formKey: 'areaMax', 3570 type: 'int' 3571 }] : []); 3572 3573 // Total entries - initialized in first render 3574 let totalNumber = 0; 3575 const DefaultSearchParams = { 3576 page: 1 3577 }; 3578 searchFormParams.forEach(function (formParam) { 3579 DefaultSearchParams[formParam.formKey || formParam.param] = null; 3580 }); 3581 let searchParams = { 3582 ...DefaultSearchParams 3583 }; 3584 const offset = options.variables?.offset || 0; 3585 let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section; 3586 let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100; 3587 3588 // entries of per page 3589 // when query variables for a given section would't be filled options.pageSize can store 3590 // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value 3591 let pageSize = parseInt(options.pageSize, 10) || 9; 3592 3593 // Adding mobile pageRange support 3594 var NARROW_BREAKPOINT = 600; 3595 var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT; 3596 var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`); 3597 3598 // Page range (pages on both sides of the current page) 3599 var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0; 3600 var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2; 3601 var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange; 3602 3603 // Whether to display the 'Previous' button 3604 var showPrevious = true; 3605 3606 // Whether to display the 'Next' button 3607 var showNext = true; 3608 3609 // Whether to display the page buttons 3610 var showPageNumbers = true; 3611 3612 // 'Previous' text 3613 var prevText = options.prevText || '«'; 3614 3615 // 'Next' text 3616 var nextText = options.nextText || '»'; 3617 3618 // Ellipsis text 3619 var ellipsisText = '…'; 3620 var classPrefix = 'paginationjs'; 3621 3622 // Default active class 3623 var activeClassName = 'active'; 3624 3625 // Default disable class 3626 var disableClassName = 'disabled'; 3627 3628 // Pagination element's position in the container 3629 var position = 'bottom'; 3630 3631 // Whether to trigger pagination at initialization 3632 var triggerPagingOnInit = !options.skipInitialLoad; 3633 var showFirstOnEllipsisShow = true; 3634 var showLastOnEllipsisShow = true; 3635 3636 // Instantiated in init() 3637 var el = null; 3638 3639 // Controls scrollTop logic 3640 var firstRender = true; 3641 var renderBySearch = false; 3642 var disabled = false; 3643 3644 // Pagination script class selector 3645 var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script'; 3646 3647 // Property Specific Image Override if No Image 3648 var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage; 3649 3650 // Construct template 3651 var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || ''; 3652 var template = Handlebars.compile(templateHTML); 3653 3654 // Initialize 3655 init(); 3656 function init() { 3657 Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 3658 3659 // Append/prepend pagination element to the pagination container 3660 if (mode === 'NUMBERED_PAGINATION') { 3661 el = document.createElement('div'); 3662 el.className = 'paginationjs';
3663 container[position === 'bottom' ? 'append' : 'prepend'](el); 3664 } 3665 if (searchContainer) { 3666 initSearchContainer({ 3667 fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true', 3668 fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true', 3669 fetchOffices: searchContainer.dataset.fetchOffices === 'true', 3670 fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true' 3671 }, function () { 3672 syncSearchFormState(searchParams); 3673 }); 3674 } 3675 3676 // Bind events 3677 observer(); 3678 } 3679 function syncSearchFormState(params) { 3680 searchContainer.dispatchEvent(new CustomEvent('sync', { 3681 detail: params 3682 })); 3683 } 3684 function initSearchContainer(options, done) { 3685 var promises = []; 3686 if (options.fetchNeighborhoods) { 3687 promises.push(fetchAllNeighborhoods(function (neighborhoods) { 3688 searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', { 3689 detail: { 3690 data: neighborhoods.map(function (item) { 3691 return { 3692 value: item.id, 3693 label: item.name 3694 }; 3695 }) 3696 } 3697 })); 3698 })); 3699 } 3700 if (options.fetchPostCategories) { 3701 promises.push(fetchPostCategories(function (categories) { 3702 searchContainer.dispatchEvent(new CustomEvent('post-categories-data', { 3703 detail: { 3704 data: categories 3705 } 3706 })); 3707 })); 3708 } 3709 if (options.fetchOffices) { 3710 promises.push(fetchOffices(function (offices) { 3711 searchContainer.dispatchEvent(new CustomEvent('offices-data', { 3712 detail: { 3713 data: offices 3714 } 3715 })); 3716 })); 3717 } 3718 if (options.fetchRentalRates) { 3719 promises.push(fetchAllRentalRates(function (rentalRates) { 3720 searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', { 3721 detail: { 3722 data: rentalRates 3723 } 3724 })); 3725 })); 3726 } 3727 if (promises.length > 0) { 3728 Promise.all(promises).then(function () { 3729 done(); 3730 }); 3731 } else { 3732 // element's custom code is not executed yet, so we're scheduling callback to after element's code 3733 setTimeout(done); 3734 } 3735 } 3736 function fetchAllNeighborhoods(done) { 3737 var useRouter = auxUsesRouter('neighborhoods'); 3738 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Same 3739 // args on both APIs (the federated neighborhoods field accepts 3740 // withProperties/withBlogPosts); only the selection set differs. 3741 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') + '}}'; 3742 var payload = {}; 3743 payload.offset = 0; 3744 payload.limit = 100; 3745 payload.companyId = variables.companyId; 3746 if (options.resource === 'properties') { 3747 payload.withProperties = { 3748 active: true 3749 }; 3750 ['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) { 3751 if (variables[field] !== undefined && variables[field] !== null) { 3752 payload.withProperties[field] = variables[field]; 3753 } 3754 }); 3755 } 3756 if (options.resource === 'posts') { 3757 payload.withBlogPosts = { 3758 active: true 3759 }; 3760 ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) { 3761 if (variables[field] !== undefined && variables[field] !== null) { 3762 payload.withBlogPosts[field] = variables[field]; 3763 } 3764 }); 3765 } 3766 3767 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3768 if (useRouter) { 3769 payload = window.luxuryPresence.routerApi.transformVariables('neighborhoods', payload); 3770 } 3771 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3772 query: gqlQuery, 3773 variables: payload 3774 }).then(function (res) { 3775 var value = res.body.data && res.body.data.neighborhoods || {}; 3776 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3777 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3778 done(items, items.length); 3779 }); 3780 } 3781 function fetchPostCategories(done) { 3782 var featured = options.resource === 'posts' && !!variables.featured; 3783 var useRouter = auxUsesRouter('postCategories'); 3784 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3785 // selection set differs ({ items {...} } on the router). 3786 var selection = 'id, name, publishedCount, featuredPublishedCount'; 3787 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) + '}}'; 3788 var payload = {}; 3789 payload.offset = 0; 3790 payload.limit = 100; 3791 payload.companyId = variables.companyId; 3792 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3793 query: gqlQuery, 3794 variables: payload 3795 }).then(function (res) { 3796 var value = res.body.data && res.body.data.postCategories || {}; 3797 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3798 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3799 done(items.map(function (item) { 3800 item.count = featured ? item.featuredPublishedCount : item.publishedCount; 3801 return item; 3802 }), items.length); 3803 }); 3804 } 3805 function fetchOffices(done) { 3806 var useRouter = auxUsesRouter('offices'); 3807 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3808 // selection set differs ({ items {...} } on the router). 3809 var selection = 'id, name, tags'; 3810 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. The two 3811 // APIs differ in more than the items wrapper: federated offices takes 3812 // companyId: ID! (legacy gateway: String), so each branch builds its whole doc. 3813 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 + '}}'; 3814 var payload = { 3815 offset: 0, 3816 limit: 100, 3817 companyId: variables.companyId 3818 }; 3819 3820 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3821 if (useRouter) { 3822 payload = window.luxuryPresence.routerApi.transformVariables('office
3822s', payload); 3823 } 3824 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3825 query: gqlQuery, 3826 variables: payload 3827 }).then(function (res) { 3828 var value = res.body.data && res.body.data.offices || {}; 3829 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3830 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3831 done(items, items.length); 3832 }); 3833 } 3834 3835 // ROUTER-CLEANUP: no rentalRates field on the federated router â legacy only. 3836 function fetchAllRentalRates(done) { 3837 var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl; 3838 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}'; 3839 var payload = { 3840 offset: 0, 3841 limit: 100, 3842 companyId: variables.companyId 3843 }; 3844 superagent.post(url + '/graphql').withCredentials().send({ 3845 query: gqlQuery, 3846 variables: payload 3847 }).then(function (res) { 3848 var items = res.body.data && res.body.data.rentalRates || []; 3849 done(items, items.length); 3850 }).catch(function (err) { 3851 console.error('Error fetching rental rates:', err); 3852 done([], 0); 3853 }); 3854 } 3855 function fetchData(params, done) { 3856 var resource = options.resource; 3857 var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource]; 3858 var payload = {}; 3859 try { 3860 payload = JSON.parse(JSON.stringify(variables)); 3861 } catch (e) { 3862 Object.keys(variables).forEach(function (variableName) { 3863 payload[variableName] = variables[variableName]; 3864 }); 3865 } 3866 payload.offset = (params.page - 1) * pageSize + offset; 3867 payload.limit = pageSize; 3868 payload.companyId = options.companyId; 3869 searchFormParams.forEach(function (formParam) { 3870 var val = params[formParam.formKey || formParam.param]; 3871 if (val !== null && val !== undefined) { 3872 objSet(payload, formParam.param, val); 3873 } 3874 }); 3875 3876 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3877 if (options.useRouterApi) { 3878 payload = window.luxuryPresence.routerApi.transformVariables(resource, payload); 3879 } 3880 3881 // TODO: Disabled loading due to jarring effect 3882 // dataContainer.html('Loading...'); 3883 superagent.post(apiUrl(options.useRouterApi) + '/graphql').withCredentials().send({ 3884 query: gqlQuery, 3885 variables: payload 3886 }).then(function (res) { 3887 if (res.body.errors) { 3888 done(res.body.errors); 3889 return; 3890 } 3891 var data = res.body.data || {}; 3892 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3893 var resources; 3894 var resourceCount; 3895 if (options.useRouterApi) { 3896 var page = window.luxuryPresence.routerApi.transformPage(data[resource]); 3897 resources = window.luxuryPresence.routerApi.transformResponse(resource, page.items); 3898 resourceCount = page.count; 3899 } else { 3900 resources = data[resource] || []; 3901 resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0; 3902 } 3903 const finish = function (items) { 3904 if (resource === 'properties' && propertyPlaceholderImage?.id) { 3905 items = items.map(item => { 3906 if (item.media?.length === 0) { 3907 return Object.assign(item, { 3908 media: [propertyPlaceholderImage] 3909 }); 3910 } 3911 return item; 3912 }); 3913 } 3914 done(null, items, resourceCount); 3915 }; 3916 3917 // ROUTER-CLEANUP: client half of PLAT-4073 â resolve the requested 3918 // disclaimers before rendering; older SDKs skip (keys stay unset). 3919 if (options.useRouterApi && resource === 'properties' && options.routerPropertyDisclaimers && options.routerPropertyDisclaimers.length && window.luxuryPresence.routerApi && typeof window.luxuryPresence.routerApi.applyPropertyDisclaimers === 'function') { 3920 window.luxuryPresence.routerApi.applyPropertyDisclaimers(resources, options.routerPropertyDisclaimers).then(finish); 3921 return; 3922 } 3923 finish(resources); 3924 }); 3925 } 3926 function getTotalPage() { 3927 return Math.ceil(totalNumber / pageSize); 3928 } 3929 function renderPaginationList() { 3930 var totalPages = getTotalPage(); 3931 var rangeStart = searchParams.page - pageRange; 3932 var rangeEnd = searchParams.page + pageRange; 3933 if (rangeEnd > totalPages) { 3934 rangeEnd = totalPages; 3935 rangeStart = totalPages - pageRange * 2; 3936 rangeStart = rangeStart < 1 ? 1 : rangeStart; 3937 } 3938 if (rangeStart <= 1) { 3939 rangeStart = 1; 3940 rangeEnd = Math.min(pageRange * 2 + 1, totalPages); 3941 } 3942 3943 // Making sure that 1 more page button is shown in edge positions 3944 if (pageRange === 0) { 3945 if (searchParams.page === totalPages) { 3946 rangeStart = totalPages <= 1 ? 1 : totalPages - 1; 3947 } 3948 if (searchParams.page === 1) { 3949 rangeEnd = Math.min(2, totalPages); 3950 } 3951 } 3952 3953 // Render pagination list 3954 if (mode === 'NUMBERED_PAGINATION') { 3955 el.innerHTML = generateHTML({ 3956 currentPage: searchParams.page, 3957 pageRange: pageRange, 3958 rangeStart: rangeStart, 3959 rangeEnd: rangeEnd 3960 }); 3961 if (totalPages < 2 && hidePaginationOnFirstPage) { 3962 container.style.display = 'none'; 3963 } else { 3964 container.style.display = ''; 3965 } 3966 } else if (mode === 'LOAD_MORE_BUTTON') { 3967 if (searchParams.page >= totalPages) {
3968 loadMoreButton.style.display = 'none'; 3969 } else { 3970 loadMoreButton.style.display = ''; 3971 } 3972 } 3973 } 3974 function render(data) { 3975 renderPaginationList(); 3976 3977 // Render new content with handlebars 3978 var html = ''; 3979 if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) { 3980 // If using load more, append search results to existing results 3981 html = dataContainer.innerHTML; 3982 } 3983 for (var i = 0; i < data.length; i++) { 3984 var itemData = recursivelyParse(data[i]); 3985 itemData.sectionIndex = options.sectionIndex; 3986 itemData.renderOptions = options.renderOptions; 3987 html += template(itemData); 3988 } 3989 dataContainer.innerHTML = html; 3990 3991 // Scroll Top 3992 if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) { 3993 // Only animate to the top if we replace dataContainer (numbered pagination) 3994 setTimeout(() => { 3995 const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset; 3996 window.scrollTo({ 3997 top: scrollTargetOffsetTop, 3998 behavior: 'smooth' 3999 }); 4000 }, 250); 4001 } 4002 return true; 4003 } 4004 function generateHTML(args) { 4005 const totalPages = getTotalPage(); 4006 const { 4007 rangeStart, 4008 rangeEnd 4009 } = args; 4010 const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 4011 ...searchParams, 4012 page 4013 }); 4014 let html = ''; 4015 if (showPrevious || showPageNumbers || showNext) { 4016 html += '<div class="paginationjs-pages"><ul>'; 4017 4018 // Previous button 4019 if (showPrevious) { 4020 if (searchParams.page <= 1) { 4021 html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`; 4022 } else { 4023 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>`; 4024 } 4025 } 4026 4027 // Pages 4028 if (showPageNumbers) { 4029 if (rangeStart <= 3) { 4030 for (let i = 1; i < rangeStart; i++) { 4031 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>`; 4032 } 4033 } else { 4034 if (showFirstOnEllipsisShow) { 4035 html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`; 4036 } 4037 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 4038 } 4039 for (let i = rangeStart; i <= rangeEnd; i++) { 4040 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>`; 4041 } 4042 if (rangeEnd < totalPages - 2) { 4043 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 4044 if (showLastOnEllipsisShow) { 4045 html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`; 4046 } 4047 } else { 4048 for (let i = rangeEnd + 1; i <= totalPages; i++) { 4049 html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`; 4050 } 4051 } 4052 } 4053 4054 // Next button 4055 if (showNext) { 4056 if (searchParams.page >= totalPages) { 4057 html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`; 4058 } else { 4059 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>`; 4060 } 4061 } 4062 html += '</ul></div>'; 4063 } 4064 return html; 4065 } 4066 function go(newSearchParams, callback, restorationVisit) { 4067 if (disabled) return; 4068 var goToPageNumber = newSearchParams.page; 4069 4070 // Page number is out of bounds 4071 if (!goToPageNumber || goToPageNumber < 1) return; 4072 var totalPage = getTotalPage(); 4073 4074 // Page number is out of bounds 4075 if (!restorationVisit && totalNumber > 0) { 4076 if (goToPageNumber > totalPage) return; 4077 } 4078 if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
4079 var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 4080 ...newSearchParams, 4081 page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null 4082 }); 4083 if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) { 4084 window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, { 4085 queryString: true 4086 })); 4087 } 4088 } 4089 4090 // Fetch and update page 4091 fetchData(newSearchParams, renderWithData); 4092 disabled = true; 4093 function renderWithData(err, data, count) { 4094 if (err) { 4095 dataContainer.dispatchEvent(new Event('error')); 4096 } else { 4097 searchParams = { 4098 ...newSearchParams 4099 }; 4100 totalNumber = count - offset; 4101 if (data.length === 0) { 4102 dataContainer.dispatchEvent(new Event('no-data')); 4103 } else { 4104 dataContainer.dispatchEvent(new Event('data')); 4105 } 4106 render(data); 4107 firstRender = false; 4108 } 4109 disabled = false; 4110 renderBySearch = false; 4111 } 4112 } 4113 function areQueryParamsEqual(first, second) { 4114 var differ = Object.keys(first).find(function (key) { 4115 return first[key] !== undefined && first[key] !== null && first[key] !== second[key]; 4116 }); 4117 if (differ) { 4118 return false; 4119 } 4120 differ = Object.keys(second).find(function (key) { 4121 return second[key] !== undefined && second[key] !== null && second[key] !== first[key]; 4122 }); 4123 return !differ; 4124 } 4125 function next(callback) { 4126 go({ 4127 ...searchParams, 4128 page: searchParams.page + 1 4129 }, callback); 4130 } 4131 function previous(callback) { 4132 go({ 4133 ...searchParams, 4134 page: searchParams.page - 1 4135 }, callback); 4136 } 4137 function refresh(callback) { 4138 go(searchParams, callback); 4139 } 4140 function update(params, callback) { 4141 renderBySearch = true; 4142 go(params, callback); 4143 } 4144 function observer() { 4145 if (searchContainer) { 4146 searchContainer.addEventListener('search', function (event, newSearchParams) { 4147 newSearchParams = event.detail || newSearchParams; 4148 update({ 4149 ...searchParams, 4150 ...newSearchParams, 4151 page: 1 4152 }); 4153 }); 4154 searchContainer.addEventListener('clear-search', function () { 4155 const defaultSearchParams = { 4156 ...DefaultSearchParams 4157 }; 4158 const isCurrentSearchFormStateDefault = areQueryParamsEqual({ 4159 ...defaultSearchParams, 4160 page: null 4161 }, { 4162 ...searchParams, 4163 page: null 4164 }); 4165 4166 // if mode is LOAD_MORE_BUTTON we should't make anything on clear 4167 // when search form have default state 4168 if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') { 4169 return; 4170 } 4171 4172 // if someone initially go to some page and click 'Clear' on search from 4173 // we should't navigate to first page. We should preserve page value 4174 if (isCurrentSearchFormStateDefault) { 4175 defaultSearchParams.page = searchParams.page; 4176 } 4177 syncSearchFormState(defaultSearchParams); 4178 update(defaultSearchParams); 4179 }); 4180 } 4181 if (mode === 'LOAD_MORE_BUTTON') { 4182 loadMoreButton.addEventListener('click', function (event) { 4183 go({ 4184 ...searchParams, 4185 page: searchParams.page + 1 4186 }); 4187 return false; 4188 }); 4189 } 4190 if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') { 4191 // Do initial render 4192 go(Object.assign({}, searchParams, { 4193 page: 1 4194 })); 4195 return; 4196 } 4197 if (mode === 'NUMBERED_PAGINATION') { 4198 // Go to specified page number 4199 container.addEventListener(eventPrefix + 'go', function (event) { 4200 let { 4201 pageNumber, 4202 done 4203 } = event.detail || {}; 4204 pageNumber = parseInt(pageNumber, 10); 4205 if (!pageNumber) { 4206 return; 4207 } 4208 go({ 4209 ...searchParams, 4210 page: pageNumber 4211 }, done); 4212 }); 4213 4214 // Page number button click 4215 el.addEventListener('click', function (event) { 4216 let clickTarget = event.target; 4217 let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next'); 4218 let pageNumber = current?.getAttribute('data-num'); 4219 if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) { 4220 return; 4221 } else { 4222 go({ 4223 ...searchParams, 4224 page: parseInt(pageNumber, 10) 4225 }); 4226 } 4227 event.preventDefault(); 4228 }); 4229 4230 // Whether to load the default page 4231 var defaultPageNumber = searchParams.page; 4232 if (triggerPagingOnInit) {
4233 container.dispatchEvent(new CustomEvent(eventPrefix + 'go', { 4234 detail: { 4235 pageNumber: defaultPageNumber 4236 } 4237 })); 4238 } 4239 } 4240 window.addEventListener('popstate', function (event) { 4241 var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 4242 if (!areQueryParamsEqual(newParams, searchParams)) { 4243 go(newParams, null, true); 4244 if (searchContainer) { 4245 syncSearchFormState(newParams); 4246 } 4247 } 4248 }); 4249 } 4250 function replaceVariables(template, variables) { 4251 var formattedString; 4252 for (var key in variables) { 4253 var value = variables[key]; 4254 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 4255 formattedString = (formattedString || template).replace(regexp, value); 4256 } 4257 return formattedString; 4258 } 4259 function isTextEditorValue(obj) { 4260 return 'raw' in obj || 'gjs' in obj; 4261 } 4262 function getTextEditorValue(obj) { 4263 if (!obj.html) { 4264 return ''; 4265 } 4266 var data = obj.html; 4267 var css = (obj.raw || obj.gjs || {}).css; 4268 if (css) { 4269 data = data + '<style>' + css + '</style>'; 4270 } 4271 return data; 4272 } 4273 4274 /** 4275 * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor. 4276 * strips out raw proprties and returns only HTML if it exists. 4277 * @param {Object} resources a collection retrieved from the database 4278 * @return {Object} the newly modified object. 4279 */ 4280 function recursivelyParse(resources) { 4281 forEach(resources, function (value, key) { 4282 if (!value) { 4283 return; 4284 } 4285 if (value instanceof Object) { 4286 if (isTextEditorValue(value)) { 4287 resources[key] = getTextEditorValue(value); 4288 return; 4289 } else { 4290 return recursivelyParse(value); 4291 } 4292 } 4293 try { 4294 var parsedData = JSON.parse(value); 4295 if (isTextEditorValue(parsedData)) { 4296 resources[key] = getTextEditorValue(parsedData); 4297 } 4298 } catch (e) { 4299 // do nothing if we failed to parse value as JSON 4300 } 4301 }); 4302 return resources; 4303 } 4304 function forEach(collection, iteratee) { 4305 var func = Array.isArray(collection) ? arrayEach : baseFor; 4306 return func(collection, iteratee); 4307 } 4308 function baseFor(object, iteratee) { 4309 if (!object) { 4310 return; 4311 } 4312 var iterable = Object(object); 4313 var props = Object.keys(object); 4314 var length = props.length; 4315 var index = -1; 4316 while (length--) { 4317 var key = props[++index]; 4318 if (iteratee(iterable[key], key, iterable) === false) { 4319 break; 4320 } 4321 } 4322 return object; 4323 } 4324 function objSet(obj, path, value) { 4325 const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g); 4326 pathArray.reduce((acc, key, i) => { 4327 if (acc[key] === undefined) acc[key] = {}; 4328 if (i === pathArray.length - 1) acc[key] = value; 4329 return acc[key]; 4330 }, obj); 4331 } 4332 function arrayEach(array, iteratee) { 4333 var index = -1; 4334 var length = array.length; 4335 while (++index < length) { 4336 if (iteratee(array[index], index, array) === false) { 4337 break; 4338 } 4339 } 4340 return array; 4341 } 4342 function selectPageRangeMode(e) { 4343 pageRange = e.matches ? mobilePageRange : desktopPageRange; 4344 renderPaginationList(); 4345 } 4346 paginationMql.addEventListener('change', selectPageRangeMode); 4347})('section-c20b1af6-e3e3-4d23-9029-d843644debe8', JSON.parse("{\"pageSize\":\"99\",\"resource\":\"properties\",\"pageRange\":1,\"variables\":{\"sort\":\"salesPrice\",\"limit\":99,\"order\":\"salesPrice\",\"offset\":0,\"sortDir\":\"DESC\",\"statusId\":\"{{variables.statusId}}\",\"companyId\":\"116d6abd-55d8-410f-b7f3-bdd7f6c5b727\",\"backfillMLSResults\":\"{{variables.backfillMLSResults}}\",\"statusIds\":[\"5f528253-abb7-484e-95c3-330269ac1105\"],\"propertyIds\":[],\"advancedFilters\":{\"query\":{\"statusIds\":{\"in\":[\"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\"]}}},\"websiteId\":\"efd0b616-93bf-43b2-a015-21b3983523b4\"},\"searchFormParams\":[{\"param\":\"search\",\"global\":true,\"urlKey\":\"search\"},{\"type\":\"string\",\"param\":\"neighborhoodId\",\"global\":true,\"urlKey\":\"neighborhoodId\"},{\"type\":\"int\",\"param\":\"salesPriceGTE\",\"global\":true,\"urlKey\":\"pricemin\"},{\"type\":\"int\",\"param\":\"salesPriceLTE\",\"global\":true,\"urlKey\":\"pricemax\"},{\"type\":\"int\",\"param\":\"livingSpaceSizeGTE\",\"global\":true,\"urlKey\":\"areamin\"},{\"type\":\"int\",\"param\":\"livingSpaceSizeLTE\",\"global\":true,\"urlKey\":\"areamax\"},{\"type\":\"string\",\"param\":\"seasonalPriceId\",\"global\":true,\"urlKey\":\"seasonalPriceId\"}],\"skipScrollOnSearch\":true,\"hidePaginationOnFirstPage\":true,\"companyId\":\"116d6abd-55d8-410f-b7f3-bdd7f6c5b727\",\"usePageResource\":false,\"sectionIndex\":2,\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 4348} catch(e) { 4349console.log(e); 4350} 4351 try { 4352(function init(sectionDomId) { 4353 const customDropdownHTML = `
4354 <div class="custom-select" role="presentation"> 4355 <button class="custom-select-toggle" type="button" aria-haspopup="true" aria-expanded="false" role="combobox"></button> 4356 <div class="custom-select-menu"><div class="custom-select-content"></div></div> 4357 </div>`; 4358 const hideOriginalSelect = originalSelect => { 4359 originalSelect.classList.remove(...originalSelect.classList); 4360 originalSelect.classList.add("sr-only"); 4361 }; 4362 const openCustomSelect = customSelectToggle => { 4363 let customSelectMenu = customSelectToggle.nextElementSibling; 4364 customSelectMenu.classList.add("open"); 4365 customSelectToggle.classList.add("open"); 4366 customSelectToggle.ariaExpanded = true; 4367 }; 4368 const closeCustomSelect = customSelectToggle => { 4369 let customSelectMenu = customSelectToggle.nextElementSibling; 4370 customSelectMenu.classList.remove("open"); 4371 customSelectToggle.classList.remove("open"); 4372 customSelectToggle.ariaExpanded = false; 4373 }; 4374 const inheritAttributes = (originalSelect, customSelectToggle, customSelectMenu) => { 4375 customSelectToggle.className = customSelectToggle.className.concat(' ', originalSelect.className); 4376 customSelectToggle.id = originalSelect.getAttribute("id") + "custom"; 4377 customSelectToggle.dataset.name = originalSelect.getAttribute("name"); 4378 customSelectMenu.setAttribute("aria-labelledby", customSelectToggle.id); 4379 }; 4380 const initiateQuerySelectors = customSelect => {
4381 let customSelectToggle = customSelect.querySelector('.custom-select-toggle'), 4382 customSelectMenu = customSelect.querySelector('.custom-select-menu'), 4383 customSelectContent = customSelect.querySelector('.custom-select-content'); 4384 return { 4385 customSelectToggle, 4386 customSelectMenu, 4387 customSelectContent 4388 }; 4389 }; 4390 const initiateToggleText = (originalSelect, customSelectToggle) => { 4391 const dataLabelOption = originalSelect.querySelector("[data-label]"); 4392 const isMultiple = originalSelect?.multiple; 4393 if (!isMultiple) { 4394 const toggleText = dataLabelOption && dataLabelOption.dataset.label || originalSelect.querySelector(":checked")?.textContent || originalSelect.querySelector("option")?.textContent; 4395 customSelectToggle.classList.add("is-placeholder"); 4396 customSelectToggle.innerHTML = toggleText; 4397 } else { 4398 const placeholderText = dataLabelOption && dataLabelOption.dataset.label || originalSelect.querySelector("option")?.textContent || "Select"; 4399 const selectedOptions = Array.from(originalSelect.querySelectorAll("option:checked")).filter(opt => opt.value !== ""); 4400 if (selectedOptions.length === 0) { 4401 customSelectToggle.innerHTML = placeholderText; 4402 customSelectToggle.classList.add("is-placeholder"); 4403 } else if (selectedOptions.length === 1) { 4404 customSelectToggle.innerHTML = selectedOptions[0].textContent; 4405 customSelectToggle.classList.remove("is-placeholder"); 4406 } else { 4407 customSelectToggle.innerHTML = `${selectedOptions[0].textContent} +${selectedOptions.length - 1}`; 4408 customSelectToggle.classList.remove("is-placeholder"); 4409 } 4410 } 4411 }; 4412 const convertOptionsToButtons = (originalSelect, customSelectContent) => { 4413 originalSelect.querySelectorAll('option').forEach(option => { 4414 const button = createButtonFromOption(option); 4415 customSelectContent.appendChild(button); 4416 }); 4417 }; 4418 const createButtonFromOption = option => { 4419 let button = document.createElement('button'); 4420 button.className = "custom-select-item"; 4421 button.setAttribute("role", "option"); 4422 button.setAttribute("type", "button"); 4423 button.textContent = option.textContent; 4424 button.setAttribute('value', option.value); 4425 if (option.disabled) { 4426 button.setAttribute("disabled", "true"); 4427 } 4428 if (option.selected && option.value !== "") { 4429 button.classList.add("is-selected"); 4430 button.setAttribute("aria-selected", "true"); 4431 } 4432 return button; 4433 }; 4434 const initiateEventListeners = (originalSelect, customSelectToggle, customSelectMenu) => { 4435 const isMultiple = originalSelect?.multiple; 4436 originalSelect.addEventListener("focus", function () { 4437 openCustomSelect(customSelectToggle); 4438 customSelectToggle.focus(); 4439 }); 4440 customSelectToggle.addEventListener("click", function () { 4441 if (customSelectToggle.getAttribute("aria-expanded") === "true") { 4442 closeCustomSelect(customSelectToggle); 4443 } else { 4444 openCustomSelect(customSelectToggle); 4445 } 4446 }); 4447 customSelectMenu.addEventListener("click", function (event) { 4448 if (event.target.classList.contains('custom-select-item')) { 4449 const clickedValue = event.target.value; 4450 const clickedOption = originalSelect.querySelector(`option[value="${clickedValue}"]`); 4451 const placeholderOption = originalSelect.querySelector("[data-label]"); 4452 const placeholderText = placeholderOption?.dataset.label || originalSelect.querySelector("option")?.textContent || "Select"; 4453 if (!isMultiple) { 4454 let opts = customSelectMenu.querySelectorAll(".is-selected"); 4455 [].forEach.call(opts, function (el) { 4456 el.classList.remove("is-selected"); 4457 }); 4458 event.target.classList.add("is-selected"); 4459 clickedOption.selected = true; 4460 customSelectToggle.innerHTML = clickedOption.textContent; 4461 if (clickedValue === "" || event.target.classList.contains("is-placeholder")) { 4462 customSelectToggle.classList.add("is-placeholder"); 4463 } else { 4464 customSelectToggle.classList.remove("is-placeholder"); 4465 } 4466 let changeEvent = new Event('change', { 4467 bubbles: true 4468 }); 4469 originalSelect.dispatchEvent(changeEvent); 4470 closeCustomSelect(customSelectToggle); 4471 } else { 4472 if (clickedValue === "") { 4473 customSelectMenu.querySelectorAll(".is-selected").forEach(el => { 4474 el.classList.remove("is-selected"); 4475 el.setAttribute("aria-selected", "false"); 4476 }); 4477 originalSelect.querySelectorAll("option").forEach(opt => opt.selected = false); 4478 customSelectToggle.innerHTML = placeholderText; 4479 customSelectToggle.classList.add("is-placeholder"); 4480 } else { 4481 const isCurrentlySelected = event.target.classList.contains("is-selected"); 4482 event.target.classList.toggle("is-selected"); 4483 event.target.setAttribute("aria-selected", (!isCurrentlySelected).toString()); 4484 clickedOption.selected = !isCurrentlySelected; 4485 const allItem = customSelectMenu.querySelector('.custom-select-item[value=""]'); 4486 if (allItem) { 4487 allItem.classList.remove("is-selected"); 4488 allItem.setAttribute("aria-selected", "false"); 4489 } 4490 const allOption = originalSelect.querySelector('option[value=""]'); 4491 if (allOption) allOption.selected = false;
4492 const selectedItems = customSelectMenu.querySelectorAll(".custom-select-item.is-selected"); 4493 if (selectedItems.length === 0) { 4494 customSelectToggle.innerHTML = placeholderText; 4495 customSelectToggle.classList.add("is-placeholder"); 4496 } else if (selectedItems.length === 1) { 4497 customSelectToggle.innerHTML = selectedItems[0].textContent; 4498 customSelectToggle.classList.remove("is-placeholder"); 4499 } else { 4500 customSelectToggle.innerHTML = `${selectedItems[0].textContent} +${selectedItems.length - 1}`; 4501 customSelectToggle.classList.remove("is-placeholder"); 4502 } 4503 } 4504 let changeEvent = new Event('change', { 4505 bubbles: true 4506 }); 4507 originalSelect.dispatchEvent(changeEvent); 4508 } 4509 } 4510 }); 4511 document.addEventListener("click", function (event) { 4512 if (!customSelectMenu.contains(event.target) && !customSelectToggle.contains(event.target)) { 4513 closeCustomSelect(customSelectToggle); 4514 } 4515 }); 4516 }; 4517 const createCustomSelect = originalSelect => { 4518 const customSelect = document.createElement('div'); 4519 customSelect.innerHTML = customDropdownHTML; 4520 const { 4521 customSelectToggle, 4522 customSelectMenu, 4523 customSelectContent 4524 } = initiateQuerySelectors(customSelect); 4525 inheritAttributes(originalSelect, customSelectToggle, customSelectMenu); 4526 hideOriginalSelect(originalSelect); 4527 initiateToggleText(originalSelect, customSelectToggle); 4528 convertOptionsToButtons(originalSelect, customSelectContent); 4529 initiateEventListeners(originalSelect, customSelectToggle, customSelectMenu); 4530 return customSelect; 4531 }; 4532 const setCustomSelectValue = (originalSelect, value) => {
4533 let customSelect = originalSelect.nextElementSibling; 4534 let customSelectToggle = customSelect.querySelector(".custom-select-toggle"); 4535 let customSelectContent = customSelect.querySelector(".custom-select-content"); 4536 if (!customSelectContent) return; 4537 let selectedOption = value ? Array.from(customSelectContent.children).find(function (b) { 4538 return b.value === value; 4539 }) : customSelectContent.firstChild; 4540 if (!selectedOption) { 4541 return; 4542 } 4543 if (selectedOption.classList.contains("is-disabled")) return; 4544 let elementNumber = Array.from(selectedOption.parentNode.children).indexOf(selectedOption); 4545 let linkedOption = originalSelect.querySelectorAll("option")[elementNumber]; 4546 linkedOption.selected = true; 4547 selectedOption.classList.add("is-selected"); 4548 selectedOption.parentNode.querySelectorAll(".custom-select-item").forEach(el => { 4549 if (el !== selectedOption) { 4550 el.classList.remove("is-selected"); 4551 } 4552 }); 4553 closeCustomSelect(customSelectToggle); 4554 customSelectToggle.innerHTML = linkedOption.innerHTML; 4555 if (linkedOption.value) { 4556 customSelectToggle.classList.remove("is-placeholder"); 4557 if (linkedOption.value !== "") { 4558 customSelect.classList.add("has-selection"); 4559 } else { 4560 customSelect.classList.remove("has-selection"); 4561 } 4562 } else { 4563 customSelect.classList.remove("has-selection"); 4564 customSelectToggle.classList.add("is-placeholder"); 4565 } 4566 }; 4567 const customSelect = originalSelect => { 4568 const customSelect = createCustomSelect(originalSelect); 4569 originalSelect.insertAdjacentElement('afterend', customSelect); 4570 return customSelect; 4571 }; 4572 const resetCustomSelect = originalSelect => { 4573 const customSelectEl = originalSelect.nextElementSibling; 4574 const customSelectToggle = customSelectEl?.querySelector('.custom-select-toggle'); 4575 const customSelectContent = customSelectEl?.querySelector('.custom-select-content'); 4576 if (!customSelectToggle || !customSelectContent) return; 4577 const placeholderOption = originalSelect.querySelector("[data-label]"); 4578 const placeholderText = placeholderOption?.dataset.label || originalSelect.querySelector("option")?.textContent || "Select"; 4579 customSelectContent.querySelectorAll('.custom-select-item').forEach(item => { 4580 item.classList.remove('is-selected'); 4581 item.setAttribute('aria-selected', 'false'); 4582 }); 4583 originalSelect.querySelectorAll('option').forEach(opt => opt.selected = false); 4584 customSelectToggle.innerHTML = placeholderText; 4585 customSelectToggle.classList.add('is-placeholder'); 4586 const customSelectWrapper = customSelectEl.querySelector('.custom-select'); 4587 if (customSelectWrapper) { 4588 customSelectWrapper.classList.remove('has-selection'); 4589 } 4590 }; 4591 const section = document.getElementById(sectionDomId); 4592 const searchContainer = section.querySelector('.search-container'); 4593 if (!searchContainer) return; 4594 const emptyResultElement = section.querySelector('.empty-result'); 4595 const dataContainer = section.querySelector('.data-container'); 4596 const areaSlider = searchContainer.querySelector('input[name="area-slider"]'); 4597 const neighborhoodSelect = searchContainer.querySelector('select[name="neighborhood-select"]'); 4598 const seasonalPriceSelect = section.querySelector('select[name="seasonal-price"]'); 4599 const searchInput = searchContainer.querySelector('input[name="search-input"]'); 4600 const resetSearchInput = section.querySelector(".js-reset"); 4601 const showFilter = section.querySelector('.js-show-filter'); 4602 const filtersCount = section.querySelector('.js-selected-filters'); 4603 const hideFilter = section.querySelector('.js-hide-filter'); 4604 const neighborhoodsSelectHolder = section.querySelector('.js-neighborhoods-select-holder'); 4605 const seasonalPriceSelectHolder = section.querySelector('.js-rental-rates-select-holder'); 4606 const _priceSlider = section.querySelector('.js-price-slider'); 4607 const _priceSliderMinLabel = section.querySelector('.js-price-slider-min'); 4608 const _priceSliderMaxLabel = section.querySelector('.js-price-slider-max');
4609 const _areaSlider = section.querySelector('.js-area-slider'); 4610 const _areaSliderMinLabel = section.querySelector('.js-area-slider-min'); 4611 const _areaSliderMaxLabel = section.querySelector('.js-area-slider-max'); 4612 const _priceMin = parseInt(_priceSlider.getAttribute("data-min"), 10); 4613 const _priceMax = parseInt(_priceSlider.getAttribute("data-max"), 10); 4614 const _priceStep = parseInt(_priceSlider.getAttribute("data-step"), 10); 4615 const _areaMin = parseInt(_areaSlider.getAttribute("data-min"), 10); 4616 const _areaMax = parseInt(_areaSlider.getAttribute("data-max"), 10); 4617 const _areaStep = parseInt(_areaSlider.getAttribute("data-step"), 10); 4618 let _currentPriceSliderMin, _currentPriceSliderMax; 4619 let _currentAreaSliderMin, _currentAreaSliderMax; 4620 showFilter.addEventListener('click', function () { 4621 searchContainer.style.display = 'block'; 4622 showFilter.style.display = 'none'; 4623 hideFilter.style.display = 'flex'; 4624 }); 4625 hideFilter.addEventListener('click', function () { 4626 searchContainer.style.display = 'none'; 4627 showFilter.style.display = 'flex'; 4628 hideFilter.style.display = 'none'; 4629 }); 4630 if (_priceSlider) { 4631 noUiSlider.create(_priceSlider, { 4632 start: [_priceMin, _priceMax], 4633 connect: true, 4634 step: _priceStep, 4635 range: { 4636 'min': _priceMin, 4637 'max': _priceMax 4638 }, 4639 format: { 4640 to: function (val) { 4641 return window.luxuryPresence.formatSliderPriceRange(val, { 4642 min: _priceMin, 4643 max: _priceMax 4644 }, "$", { 4645 lowPrefix: "<", 4646 highSuffix: "+" 4647 }); 4648 }, 4649 from: function (val) { 4650 return Number(val.replace(/[^0-9.-]+/g, "")); 4651 } 4652 } 4653 }); 4654 _priceSlider.noUiSlider.on('update', function (values) { 4655 _priceSliderMinLabel.innerHTML = `${values[0]}`; 4656 _priceSliderMaxLabel.innerHTML = `${values[1]}`; 4657 const [rawMin, rawMax] = _priceSlider.noUiSlider.get(true); 4658 _currentPriceSliderMin = rawMin; 4659 _currentPriceSliderMax = rawMax; 4660 }); 4661 _priceSlider.noUiSlider.on('end', function () { 4662 onSearch(); 4663 }); 4664 } 4665 if (_areaSlider) { 4666 noUiSlider.create(_areaSlider, { 4667 start: [_areaMin, _areaMax], 4668 connect: true, 4669 step: _areaStep, 4670 range: { 4671 'min': _areaMin, 4672 'max': _areaMax 4673 }, 4674 format: { 4675 to: function (val) { 4676 return window.luxuryPresence.formatSliderPriceRange(val, { 4677 min: _areaMin, 4678 max: _areaMax 4679 }, "", { 4680 lowPrefix: "<", 4681 highSuffix: "+" 4682 }); 4683 }, 4684 from: function (val) { 4685 return Number(val.replace(/[^0-9.-]+/g, "")); 4686 } 4687 } 4688 }); 4689 _areaSlider.noUiSlider.on('update', function (values) { 4690 _areaSliderMinLabel.innerHTML = `${values[0]}`; 4691 _areaSliderMaxLabel.innerHTML = `${values[1]}`; 4692 const [rawMin, rawMax] = _areaSlider.noUiSlider.get(true); 4693 _currentAreaSliderMin = rawMin; 4694 _currentAreaSliderMax = rawMax; 4695 }); 4696 _areaSlider.noUiSlider.on('end', function () { 4697 onSearch(); 4698 }); 4699 } 4700 function onSearch() { 4701 const params = { 4702 salesPriceGTE: _currentPriceSliderMin != _priceMin ? _currentPriceSliderMin : null, 4703 salesPriceLTE: _currentPriceSliderMax != _priceMax ? _currentPriceSliderMax : null, 4704 livingSpaceSizeGTE: _currentAreaSliderMin != _areaMin ? _currentAreaSliderMin : null, 4705 livingSpaceSizeLTE: _currentAreaSliderMax != _areaMax ? _currentAreaSliderMax : null, 4706 bedroomCountGTE: null, 4707 bathCountGTE: null, 4708 neighborhoodId: neighborhoodSelect.value || null, 4709 seasonalPriceId: seasonalPriceSelect?.value || null, 4710 search: searchInput.value || null 4711 }; 4712 const paramCount = Object.values(params).filter(value => value !== null).length; 4713 if (paramCount > 0) { 4714 filtersCount.textContent = paramCount; 4715 filtersCount.style.display = 'inline-block'; 4716 } else { 4717 filtersCount.style.display = 'none'; 4718 } 4719 const event = new CustomEvent('search', { 4720 detail: params 4721 });
4722 searchContainer.dispatchEvent(event); 4723 } 4724 searchContainer.addEventListener('neighborhoods-data', function (ev) { 4725 const neighborhoods = ev.detail; 4726 neighborhoods.data.forEach(item => { 4727 const option = document.createElement('option'); 4728 option.value = item.value; 4729 option.textContent = item.label; 4730 neighborhoodSelect.appendChild(option); 4731 }); 4732 customSelect(section.querySelector(".dropdown-select[name='neighborhood-select']")); 4733 if (neighborhoods.data.length) neighborhoodsSelectHolder.style.display = 'block'; 4734 }); 4735 if (seasonalPriceSelect) { 4736 searchContainer.addEventListener('rental-rates-data', function (ev) { 4737 const rentalRates = ev.detail; 4738 rentalRates.data.forEach(item => { 4739 const option = document.createElement('option'); 4740 option.value = item.rentalRateId; 4741 option.textContent = item.label; 4742 seasonalPriceSelect.appendChild(option); 4743 }); 4744 customSelect(section.querySelector(".dropdown-select[name='seasonal-price']")); 4745 if (rentalRates.data.length) seasonalPriceSelectHolder.style.display = 'block'; 4746 }); 4747 } 4748 searchContainer.addEventListener('sync', function (ev) { 4749 const params = ev.detail; 4750 searchInput.value = params.search || ''; 4751 if (neighborhoodSelect) setCustomSelectValue(neighborhoodSelect, params.neighborhoodId); 4752 if (seasonalPriceSelect) setCustomSelectValue(seasonalPriceSelect, params.seasonalPriceId); 4753 _priceSlider.noUiSlider.set([params.salesPriceGTE || _priceMin, params.salesPriceLTE || _priceMax]); 4754 _areaSlider.noUiSlider.set([params.livingSpaceSizeGTE || _areaMin, params.livingSpaceSizeLTE || _areaMax]); 4755 }); 4756 searchInput.addEventListener('input', window.luxuryPresence.debounce(onSearch, 1000)); 4757 resetSearchInput.addEventListener('click', function () { 4758 neighborhoodSelect.value = ''; 4759 searchInput.value = ''; 4760 if (seasonalPriceSelect) { 4761 seasonalPriceSelect.value = ''; 4762 setCustomSelectValue(seasonalPriceSelect, ''); 4763 } 4764 setCustomSelectValue(neighborhoodSelect); 4765 _priceSlider.noUiSlider.set([_priceMin, _priceMax]); 4766 _areaSlider.noUiSlider.set([_areaMin, _areaMax]); 4767 setTimeout(() => { 4768 const params = { 4769 salesPriceGTE: null, 4770 salesPriceLTE: null, 4771 livingSpaceSizeGTE: null, 4772 livingSpaceSizeLTE: null, 4773 bedroomCountGTE: null, 4774 bathCountGTE: null, 4775 neighborhoodId: null, 4776 seasonalPriceId: null, 4777 search: null 4778 }; 4779 const event = new CustomEvent('search', { 4780 detail: params 4781 }); 4782 searchContainer.dispatchEvent(event); 4783 }, 1000); 4784 }); 4785 neighborhoodSelect.addEventListener('change', onSearch); 4786 if (seasonalPriceSelect) { 4787 seasonalPriceSelect.addEventListener('change', onSearch); 4788 } 4789})('section-c20b1af6-e3e3-4d23-9029-d843644debe8', JSON.parse("{\"resource\":\"properties\",\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true},\"companyId\":\"116d6abd-55d8-410f-b7f3-bdd7f6c5b727\",\"usePageResource\":false,\"sectionIndex\":2}")); 4790} catch(e) { 4791console.log(e); 4792} 4793 try { 4794(function init(sectionDomId) {})('section-b903aacd-3b0c-4042-9cd9-3066a61f407c', 'undefined'); 4795} catch(e) { 4796console.log(e); 4797} 4798 try { 4799(function init(sectionDomId) {})('section-16a9df67-1fdd-4f21-b174-bf9a1c14b565', 'undefined'); 4800} catch(e) { 4801console.log(e); 4802} 4803 try { 4804(function init(sectionDomId, options) { 4805 let section = null; 4806 switch (sectionDomId) { 4807 case 'NAVBAR': 4808 section = document.querySelector('body > nav, #global-navbar'); 4809 break; 4810 case 'FOOTER': 4811 section = document.querySelector('body > footer, #global-footer'); 4812 break; 4813 case 'SIDEMENU': 4814 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 4815 break; 4816 case 'CONTACT': 4817 section = document.querySelector('#modal-global-contact-us'); 4818 break; 4819 case 'MOBILE_CONTACT': 4820 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 4821 break; 4822 case 'SUBSCRIBE': 4823 // Subscribe Not Implemented 4824 section = null; 4825 break; 4826 case 'ACCOUNT': 4827 // Account Not Implemented 4828 section = null; 4829 break; 4830 default: 4831 section = document.querySelector('#' + sectionDomId); 4832 } 4833 if (!section) { 4834 return; 4835 } 4836 var url = window.luxuryPresence.defaults.routerUrl; 4837 var companyId = window.luxuryPresence.defaults.companyId; 4838 var limit = options.limit || 8; 4839 if (typeof limit === 'string') { 4840 limit = parseInt(limit, 10) || 8; // this NaN protection also filters out 0 - this is expected 4841 } 4842 var templateSelector = options.templateSelector || '.jsIGTemplate'; 4843 var containerSelector = options.containerSelector || '.jsIGContainer'; 4844 var hasDataClass = options.hasDataClass || 'has-data'; 4845 var hideActivateMessage = options.hasDataClass || false; 4846 var payload = { 4847 companyId: companyId, 4848 limit: limit 4849 }; 4850 if (options.resourceId && typeof options.resourceId === 'string' && !
4850options.resourceId.match(/^{{.*}}$/)) { 4851 payload.resourceId = options.resourceId; 4852 // Federated enum values are uppercase (AGENT/TEAM); element configs carry lowercase 4853 payload.resource = String(options.resource || 'agent').toUpperCase(); 4854 payload.fallbackToNoResource = options.fallbackToNoResource === 'true' || options.fallbackToNoResource === true; 4855 } 4856 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'; 4857 var templateHTML = section.querySelector(templateSelector)?.innerHTML || ''; 4858 var template = Handlebars.compile(templateHTML); 4859 var container = section.querySelector(containerSelector); 4860 if (options.variables) { 4861 Object.keys(options.variables).forEach(function (key) { 4862 if (options.variables.hasOwnProperty(key) && (typeof options.variables[key] !== 'string' || !options.variables[key].match(/^{{.*}}$/))) { 4863 payload[key] = options.variables[key]; 4864 } 4865 }); 4866 } 4867 function getData() { 4868 var feed = { 4869 error: true 4870 }; 4871 if (payload.companyId == null || payload.companyId === '') { 4872 // instagramContentFeed requires companyId (ID!) â nothing to fetch without it. 4873 // Checked after the options.variables merge, which may override the default. 4874 // Deferred so element listeners (attached after this template runs) still receive it. 4875 setTimeout(function () { 4876 section.dispatchEvent(new CustomEvent('ig-data', { 4877 detail: feed 4878 })); 4879 }, 0); 4880 return; 4881 } 4882 superagent.post(url + '/graphql').send({ 4883 query: query, 4884 variables: payload 4885 }).then(res => { 4886 try { 4887 if (!res.body.errors) { 4888 feed = res.body.data.instagramContentFeed; 4889 if (!feed.active) { 4890 if (!hideActivateMessage && sectionDomId === 'section-temp' && container) { 4891 if (payload.resourceId) { 4892 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>'; 4893 } else { 4894 container.innerHTML = '<div style="text-align: center">Instagram account is not connected.<br /> Connect it on <a href="/profile">Profile page</a></div>'; 4895 } 4896 } 4897 } else { 4898 if (feed.items.length) { 4899 if (hasDataClass) { 4900 section.classList.add(hasDataClass); 4901 } 4902 const feedName = feed.username; 4903 section.querySelectorAll('.jsIGLink').forEach(link => link.setAttribute('href', feed.feedUrl)); 4904 section.querySelectorAll('.jsIGName').forEach(name => { 4905 name.textContent = '@' + feedName; 4906 name.setAttribute('title', '@' + feedName); 4907 }); 4908 if (container && template) { 4909 container.innerHTML = template(feed); 4910 } 4911 } 4912 } 4913 } 4914 } catch (e) {} 4915 section.dispatchEvent(new CustomEvent('ig-data', { 4916 detail: feed 4917 })); 4918 }).catch(e => { 4919 console.log('err', e); 4920 section.dispatchEvent(new CustomEvent('ig-data', { 4921 detail: feed 4922 })); 4923 }); 4924 } 4925 getData(); 4926})('section-4668b610-d9c1-4a67-adf4-0e6b4204182e', JSON.parse("{\"limit\":11,\"resource\":\"agent\",\"resourceId\":\"{{id}}\",\"fallbackToNoResource\":\"{{{fallbackToNoResource}}}\",\"companyId\":\"116d6abd-55d8-410f-b7f3-bdd7f6c5b727\",\"usePageResource\":false,\"sectionIndex\":5,\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 4927} catch(e) { 4928console.log(e); 4929} 4930 try { 4931(function init(sectionDomId) { 4932 const section = document.getElementById(sectionDomId); 4933 const slider = section.querySelector(".js-slider"); 4934 section.addEventListener("ig-data", function () { 4935 var splide = new Splide(slider, { 4936 rewind: true,
4937 arrows: false, 4938 type: 'loop', 4939 padding: '20%', 4940 gap: '16px', 4941 pagination: false, 4942 clones: 1, 4943 perPage: 1, 4944 perMove: 1, 4945 destroy: true, 4946 breakpoints: { 4947 768: { 4948 destroy: false 4949 } 4950 } 4951 }); 4952 splide.mount(); 4953 }); 4954})('section-4668b610-d9c1-4a67-adf4-0e6b4204182e', JSON.parse("{\"resource\":\"agent\",\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true},\"companyId\":\"116d6abd-55d8-410f-b7f3-bdd7f6c5b727\",\"usePageResource\":false,\"sectionIndex\":5}")); 4955} catch(e) { 4956console.log(e); 4957} 4958 4959 var { body } = document; 4960 var globalNav = body.querySelector(':scope > nav'); 4961 var globalSideMenu = body.querySelector(':scope > div.sidemenu'); 4962 4963 document.querySelectorAll('body > .modal .close').forEach(modalCloseBtn => { 4964 modalCloseBtn.addEventListener('click', function() { 4965 window.lpUI.hideClosestModal(modalCloseBtn); 4966 }); 4967 }); 4968 4969 window.addEventListener('click', function() { 4970 document.querySelectorAll('.share-popup').forEach(sharedPopup => { 4971 sharedPopup.style.display = 'none' ; 4972 }); 4973 }); 4974 4975 /* Misc Partials / Addons */ 4976 function initWOW() { 4977 if (wow) { 4978 wow.init(); 4979 wow.scrollHandler(); 4980 setTimeout(function () { 4981 const wowHideStyle = document.getElementById('wow-hide-elements'); 4982 if(wowHideStyle) { 4983 wowHideStyle.disabled = true; 4984 } 4985 }, 1); 4986 } 4987 } 4988 4989 const wowHideElements = document.getElementById('wow-hide-elements'); 4990 if (wowHideElements) { 4991 wowHideElements.disabled = false; 4992 } 4993 4994 initWOW(); 4995 4996 /* Generic Navbar Handling */ 4997 globalNav?.querySelectorAll('.hamburger-component').forEach(hamburgerComponent => { 4998 hamburgerComponent.addEventListener('click', function() { 4999 window.lpUI.sideMenuToggle(); 5000 }); 5001 }); 5002 globalSideMenu?.querySelectorAll('.toggle').forEach(toggleEl => { 5003 toggleEl.addEventListener('click', function() { 5004 window.lpUI.sideMenuToggle(); 5005 }); 5006 }); 5007 5008 document.querySelectorAll('body > nav .sub-nav-container > a, body > div.sidemenu .sub-nav-container > a').forEach(linkEl => { 5009 linkEl.addEventListener('click', function(e) { 5010 e.preventDefault(); 5011 e.stopPropagation(); 5012 var subNav = linkEl.parentElement.querySelector(':scope > .sub-nav'); 5013 if (subNav && subNav.classList.contains('visible')){ 5014 subNav.classList.remove('visible'); 5015 } else { 5016 globalNav?.querySelectorAll('.sub-nav-container .sub-nav').forEach(globalSubNav => { 5017 globalSubNav.classList.remove('visible'); 5018 }); 5019 globalSideMenu?.querySelectorAll('.sub-nav').forEach(sideMenuSubNav => { 5020 sideMenuSubNav.classList.remove('visible'); 5021 }); 5022 subNav?.classList.add('visible'); 5023 } 5024 }); 5025 }); 5026 window.addEventListener('click', function() { 5027 document.querySelectorAll('nav .sub-nav.visible, .sidemenu .sub-nav.visible').forEach(subNavEl => { 5028 subNavEl.classList.remove('visible'); 5029 }); 5030 }); 5031 5032 } 5033 5034 document.addEventListener('DOMContentLoaded', lpGlobalInit); 5035 5036 </script>
5036 5037 5038
5038<script type="module"> 5039 function selectorExists(selector) { 5040 return document.querySelector(selector) !== null; 5041 } 5042 5043 // Function to initialize the third-party library 5044 function initParoller(selector = '.my-paroller') { 5045 var $parollerElements = $(selector); 5046 if ($parollerElements.length > 0 && typeof $parollerElements.paroller === 'function') { 5047 $parollerElements.paroller(); 5048 } 5049 } 5050 5051 const parollerSelector = '.my-paroller'; 5052 5053 if (selectorExists(parollerSelector)) { 5054 window.luxuryPresence.libs.loadJs(window.luxuryPresence.libs.jsLibsMap.paroller.jsSrc, function() { 5055 initParoller(parollerSelector); 5056 window.luxuryPresence.libs.jsLibsMap.paroller.isLoaded = true; 5057 }); 5058 } 5059 </script>
5059 5060 5061 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 5061-5062
5061 5062 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
5062GTM-T9SFQGHZ
vendor: 107 bytes, lines 5062-5064
5062" 5063 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 5064
5064<!-- End Google Tag Manager --> 5065 5066
5066<script 5067 src="https://cdn.luxurypresence.com/scripts/a11y-widget/latest/widget.js" 5068 data-website-id="efd0b616-93bf-43b2-a015-21b3983523b4" 5069 5070 defer></script>
vendor: 1 bytes, line 5070
5070
5071<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>
vendor: 1 bytes, line 5071
5071
5072<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:'a47361b59e0fd7c2',t:'MTc5MTQ0NDAxMg=='};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>
5072</body> 5073</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.