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>Blog - Amalfi Estates</title> 10 <meta property="og:title" content="Blog - Amalfi Estates"> 11 <meta name="twitter:title" content="Blog - Amalfi Estates"> 12 <meta name="description" content="Get inspiration for buying or selling a home by reading Amalfi Estate's blog posts and podcasts here. Real estate information at your fingertips!"> 13 <meta property="og:description" content="Get inspiration for buying or selling a home by reading Amalfi Estate's blog posts and podcasts here. Real estate information at your fingertips!"> 14 <meta name="twitter:description" content="Get inspiration for buying or selling a home by reading Amalfi Estate's blog posts and podcasts here. Real estate information at your fingertips!"> 15 <meta property="og:image" content="https://media-production.lp-cdn.com/media/552af5a3-6fee-4885-b6a3-0c743da90bd8"> 16 <meta name="twitter:image" content="https://media-production.lp-cdn.com/media/552af5a3-6fee-4885-b6a3-0c743da90bd8"> 17 <meta property="og:url" content="https://amalfiestates.com/blog"> 18 <link rel="canonical" href="https://amalfiestates.com/blog"> 19
19<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
19 20 <link rel="preconnect" href="https://fonts.googleapis.com"> 21 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 22 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Montserrat:100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i"> 23 <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 24 <noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css"></noscript> 25 <link rel="icon" type="image/x-icon" href="/favicon.ico"> 26 <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> 27 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> 28 <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png"> 29 <style id="global-css">:root{--global-primary-font-family:Montserrat,sans-serif;--global-primary-font-family-short:Montserrat;--global-secondary-font-family:Montserrat,sans-serif;--global-secondary-font-family-short:Montserrat;--global-body-padding:0px;--global-background-color:#fff;--global-body-font-size:16px;--global-h1-font-size:45px;--global-h2-font-size:40px;--global-h3-font-size:38px;--global-h4-font-size:28px;--global-h5-font-size:22px;--global-h6-font-size:20px;--global-section-padding:96px;}@media (max-width: 768px){:root{--global-section-padding:64px;}}body{padding:0px;background-color:#fff;font-family:Montserrat,sans-serif;font-size:16px;}@media (min-width: 768px){body{padding:0px 0px 0px 0px;}}h1,h2,h3,h4,h5,h6,button{font-family:Montserrat,sans-serif;}h1{font-size:45px;}h2{font-size:40px;}h3{font-size:38px;}h4{font-size:28px;}h5{font-size:22px;}h6{font-size:20px;}</style> 30 <link rel="stylesheet" type="text/css" href="https://styles.luxurypresence.com/masterpiece/index.css" /> 31 <style id="website-css">.pagination-container .paginationjs .paginationjs-pages li.paginationjs-prev a:hover{color:#999!important;}.pagination-container .paginationjs .paginationjs-pages li.paginationjs-next a:hover{color:#999!important;}@media only screen and (max-width: 1024px){#modal-global-contact-us div.contact-form__container{width:100%;}#modal-global-contact-us div.contact-form__close.close{color:#fff;opacity:1;}}nav#global-navbar .header.theme-light .header__hamburger circle{fill:#779AD0;}nav#global-navbar .header.theme-light .header__hamburger svg rect{fill:#fff!important;}nav#global-navbar .header.theme-light ul.navigation li.navigation__item{color:#fff;}nav#global-navbar .header.theme-light ul.navigation li.navigation__item .sub-nav__link{color:#FFF;background-color:#000;}nav#global-navbar .header.theme-light ul.navigation li.navigation__item .sub-nav__link:hover{color:#FFF;background-color:#779AD0;}nav#global-navbar .header.theme-light ul.navigation li.navigation__item .navigation__link:after{background:#fff;}nav#global-navbar .header.theme-light .search__btn svg{color:#fff;}nav#global-navbar .header.theme-light a.header__btn-contact{background:transparent;color:#fff!important;border-color:#fff!important;}nav#global-navbar .header.theme-light a.header__btn-contact:hover{background:#fff!important;color:#000!important;border-color:#fff!important;}nav#global-navbar .header .header__hamburger circle{fill:#779AD0;}nav#global-navbar .header .header__hamburger svg rect{fill:#fff!important;}nav#global-navbar .header ul.navigation li.navigation__item{color:#000;}nav#global-navbar .header ul.navigation li.navigation__item .sub-nav__link{color:#FFF;background-color:#000;}nav#global-navbar .header ul.navigation li.navigation__item .sub-nav__link:hover{color:#FFF;background-color:#779AD0;}nav#global-navbar .header ul.navigation li.navigation__item .navigation__link:after{background:#fff;}nav#global-navbar .header .search__btn svg{color:#000;}nav#global-navbar.scroll .header{background-color:#fff;}nav#global-navbar.scroll .header .header__hamburger circle{fill:#779AD0;}nav#global-navbar.scroll .header .header__hamburger svg rect{fill:#fff!important;}nav#global-navbar.scroll .header ul.navigation li.navigation__item{color:#000;}nav#global-navbar.scroll .header ul.navigation li.navigation__item .sub-nav__link{color:#FFF;background-color:#000;}nav#global-navbar.scroll .header ul.navigation li.navigation__item .sub-nav__link:hover{color:#FFF;background-color:#779AD0;}nav#global-navbar.scroll .header ul.navigation li.navigation__item .navigation__link:after{background:#779AD0;}
31nav#global-navbar.scroll .header .search__btn svg{color:#779AD0;}nav#global-navbar.scroll .header a.header__btn-contact{background:transparent;color:#fff!important;border-color:#fff!important;}nav#global-navbar.scroll .header a.header__btn-contact:hover{background:#fff!important;color:#000!important;border-color:#fff!important;}nav#global-navbar.scroll .header.theme-light .logo__img.light{display:none;}nav#global-navbar.scroll .header.theme-light .logo__img.dark{display:block;}nav#global-navbar.scroll .header.theme-auto .logo__img.light{display:none;}nav#global-navbar.scroll .header.theme-auto .logo__img.dark{display:block;}#global-footer .footer-navigation__link:hover{color:#4979C1;}footer#global-footer .site-footer__disclaimer{opacity:100;}footer .site-footer__col-content{opacity:1!important;}.auto-year-update::after{content:' Amalfi Estates, DRE# 02014153';}</style> 32 <style id="wow-hide-elements">.wow{visibility:hidden!important}</style> 33 <style id="page-css"> 34 #section-33514986-d0a9-4c0c-9c08-c60d74b86348{color:#ffffff;--fontColor:#ffffff;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#000000;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:0%;--bgColor_A:1;--bgColor_darkenDir:1;background-color:#000000;--gradient-color:var(--overlay-color, rgba(0, 0, 0, 0.30));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/bb25ro2ymibiivef5nfr');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .video-wrapper .full-screen-video-component .video-wrapper::before{content:'';position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000;z-index:-1000;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .video-wrapper .full-screen-video-component .video-wrapper video{-webkit-transition:opacity 2s cubic-bezier(0.835, 0, 0.19, 1);transition:opacity 2s cubic-bezier(0.835, 0, 0.19, 1);opacity:0!important;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .video-wrapper .full-screen-video-component .video-wrapper.playing video{opacity:1!important;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .lp-play{opacity:0;background-color:transparent;display:inline-block;border:none;position:absolute;bottom:50px;right:50px;width:27px;height:24px;z-index:3;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out;cursor:unset;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .lp-play.visible{opacity:1;cursor:pointer;}@media (max-width: 900px){#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .lp-play.visible{display:none;}}@media (max-width: 900px){#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .lp-play{display:none;}}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled{z-index:unset;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled .lp-container{position:relative;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled>div.video-wrapper{position:fixed;left:var(--global-body-padding, 0);top:var(--global-body-padding, 0);width:calc(100% - var(--global-body-padding, 0px) * 2);z-index:-1001;}@media (max-width: 767px){#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled>div.video-wrapper{left:0;top:0;width:100%;}}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled>div.overlay-component{position:fixed;left:var(--global-body-padding, 0);top:var(--global-body-padding, 0);right:unset;width:calc(100% - var(--global-body-padding, 0px) * 2);}@media (max-width: 767px){#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled>div.overlay-component{left:0;top:0;width:100%;}}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled .opening-with-search:before{display:block;content:'';left:var(--global-body-padding, 0);top:var(--global-body-padding, 0);width:calc(100% - var(--global-body-padding, 0px) * 2);
34background:var(--sectionBackground) center no-repeat;-webkit-background-size:cover;background-size:cover;background-position-y:22%;position:fixed;z-index:-1001;height:100%;}@media (max-width: 767px){#section-33514986-d0a9-4c0c-9c08-c60d74b86348.parallax-enabled .opening-with-search:before{left:0;top:0;width:100%;}}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search{position:relative;--top-padding:170px;--bottom-padding:30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:770px;padding-top:var(--top-padding);padding-bottom:var(--bottom-padding);}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search:before{display:none;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-Full{min-height:100vh;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-Full>div.video-wrapper{height:100vh;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-Full:before{min-height:100vh;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-770px{min-height:770px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-770px>div.video-wrapper{height:770px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-770px:before{min-height:770px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-600px{min-height:600px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-600px>div.video-wrapper{height:600px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search.height-class-600px:before{min-height:600px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .bottom-spacer{-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;max-height:calc(var(--top-padding) - var(--bottom-padding));}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .center-block{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-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;text-align:center;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .opening-description{letter-spacing:.1em;margin-bottom:15px;max-width:640px;margin-left:auto;margin-right:auto;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .opening-description a,#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .opening-description a[x-apple-data-detectors]{color:inherit!important;-webkit-text-decoration:none!important;text-decoration:none!important;font-size:inherit!important;font-family:inherit!important;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .opening-pretitle{margin-bottom:15px;max-width:860px;margin-left:auto;margin-right:auto;white-space:pre-line;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .opening-title{margin-bottom:15px;max-width:860px;margin-left:auto;margin-right:auto;white-space:pre-line;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .opening-button{margin:0 15px;}@media (max-width: 768px){#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .opening-button{margin:0;}}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-form{margin-top:30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-form.with-filters{padding-top:32px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-button{margin:5px;border:none;border-radius:0;outline:none;background-color:#000;color:#fff;height:44px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:50px;padding-right:50px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;cursor:pointer;-webkit-transition:all .3s ease;transition:all .3s ease;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-button:hover{background-color:#fff;color:#000;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-lease-tabs{position:absolute;left:0;bottom:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-lease-tab{padding:4px 20px;background-color:#000;color:#fff;cursor:pointer;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-lease-tab.active{background-color:#fff;color:#000;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-wrapper{margin:5px;letter-spacing:normal;width:100%;max-width:444px;position:relative;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-input-container{width:100%;border:none;height:43px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 16px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-input-container .search-icon{color:#c0c0c0;margin-right:10px;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:20px;line-height:0;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-input-container .search-input{color:#000;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;width:50px;border:none;border-radius:0;outline:none;background:transparent;font-size:16px;padding:0;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-results{line-height:normal;text-align:left;background-color:rgba(0, 0, 0, 0.8);position:absolute;width:100%;left:0;top:100%;border:none;overflow:hidden;-webkit-transition:height 0.3s ease;transition:height 0.3s ease;height:0;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-container,#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .predefined-links{padding:10px 0;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-container a,#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .predefined-links a{color:#b6b6b6;-webkit-transition:color 0.3s ease;transition:color 0.3s ease;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-container a:hover,#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .predefined-links a:hover{color:#fff;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .predefined-links{max-height:400px;overflow:auto;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-block{margin:15px 0;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-block-title{margin:0;padding:0 48px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-block-title .results-title-label{margin:0 20px 10px 0;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-block-title .search-near-container{margin-bottom:15px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-block:nth-child(n + 2) .search-near-container{display:none;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-link{display:block;padding:4px 48px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .results-link.selected-link{color:#fff;background-color:rgba(255, 255, 255, 0.2);}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-in-progress{padding:30px 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:30px;opacity:0.5;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .not-visible{display:none!important;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .nothing-found{width:100%;padding:20px;}@media (max-width: 560px){#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-form{-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-button{width:100%;max-width:444px;}}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .opening-with-search .search-near{cursor:pointer;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:background-color 0.3s ease;transition:background-color 0.3s ease;background-color:transparent;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-wrap{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;padding:20px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);-webkit-transition:clip-path 0.4s ease;transition:clip-path 0.4s ease;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-modal{border-radius:20px;padding:10px 20px 20px;max-width:400px;min-width:100px;background-color:rgba(0,0,0,0.9);color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;max-height:100%;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-close{position:absolute;width:40px;height:40px;top:10px;right:10px;cursor:pointer;-webkit-transition:all 0.3s ease;transition:all 0.3s ease;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-close:before{content:'';width:20px;height:2px;background-color:#fff;position:absolute;left:10px;top:19px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-close:after{content:'';width:20px;height:2px;background-color:#fff;position:absolute;left:10px;top:19px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-close:hover{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2);}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .search-near-hidden .search-near-container{display:none;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-title{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:20px;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-container{-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow:auto;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-container p{margin:0;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348 .loc-msg-container p+p{margin-top:1em;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.visible-loc-msg{z-index:1000;}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.visible-loc-msg .loc-msg-backdrop{background-color:rgba(255,255,255,0.4);}#section-33514986-d0a9-4c0c-9c08-c60d74b86348.visible-loc-msg .loc-msg-wrap{-webkit-clip-path:polygon(0 0, 0 100%, 100% 100%, 100% 0%);clip-path:polygon(0 0, 0 100%, 100% 100%, 100% 0%);}@media (min-width: 960px) and (orientation: landscape){#section-33514986-d0a9-4c0c-9c08-c60d74b86348{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/bb25ro2ymibiivef5nfr');}}@media (min-width: 1280px) and (orientation: landscape){#section-33514986-d0a9-4c0c-9c08-c60d74b86348{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/bb25ro2ymibiivef5nfr');}}@media (min-width: 1920px) and (orientation: landscape){#section-33514986-d0a9-4c0c-9c08-c60d74b86348{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/bb25ro2ymibiivef5nfr');}}@media (min-width: 2560px) and (orientation: landscape){#section-33514986-d0a9-4c0c-9c08-c60d74b86348{background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/bb25ro2ymibiivef5nfr');}}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8{color:#211f1f;--fontColor:#211f1f;--fontColor_H:0;--fontColor_S:3%;--fontColor_L:13%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#fff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#fff;}
34#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .collection{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -10px;}@media (min-width: 1024px){#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .collection:not(.collection--3) .item{width:calc(50% - 20px);}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .collection:not(.collection--3) .item figure{height:462px;}}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item{width:calc(33.33333% - 20px);margin:0 10px 48px;-webkit-text-decoration:none;text-decoration:none;color:inherit;}@media (max-width: 991px){#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item{width:calc(50% - 20px);}}@media (max-width: 767px){#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item{margin-bottom:24px;width:100%;}}@media (hover: hover) and (pointer: fine){#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item:hover img{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);}}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item figure{position:relative;overflow:hidden;margin:0 0 24px 0;background-color:#f2f2f2;height:310px;}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item img{-webkit-transition:all .3s;transition:all .3s;height:100%;width:100%;object-fit:cover;}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item .label{text-transform:uppercase;position:absolute;top:10px;right:10px;padding:6px 10px;background-color:rgba(255,255,255, .8);margin:0;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item .lp-h5{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;margin:0 0 8px;}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item .bf1{margin:0 0 8px;}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .item-text{margin:0;}#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .lp-pagination{margin-top:16px;}@media (max-width: 767px){#section-b77708cd-fdfc-4613-9af8-1194d5b50ae8 .lp-pagination{margin-top:8px;}}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99{color:#ffffff;--fontColor:#ffffff;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#779AD0;--bgColor_H:216;--bgColor_S:49%;--bgColor_L:64%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#779AD0;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}@media (max-width: 768px){#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup{min-height:80vh;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup .lp-container-custom{padding:0 25px;}}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form{margin:0;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form.success .newsletter-signup__form-container{display:none;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form.success .success-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__inputs-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}@media (max-width: 768px){#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__inputs-container{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-container{position:relative;z-index:1;}@media (max-width: 768px){#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-container .lp-h2{margin-bottom:32px;}}@media (max-width: 768px){#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-container .lp-text--subtitle{margin-bottom:32px;}}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-item +.newsletter-signup__form-item{margin-left:16px;}@media (max-width: 768px){#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-item +.newsletter-signup__form-item{margin-left:0px;margin-top:32px;}}@media (min-width: 769px){#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-item.lp-input{padding-top:0;padding-bottom:0;width:250px;}}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-item.lp-btn{text-transform:uppercase;font-weight:700;}@media (min-width: 769px){#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup__form-item.lp-btn{width:200
34px;}}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup .success-block{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;visibility:visible;opacity:1;z-index:2;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:none;text-align:center;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .newsletter-signup .success-block.hide{display:none;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .lp-text--subtitle{margin-left:auto;margin-right:auto;text-transform:none;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .lp-h-pot{max-width:1px;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .lp-title-group{max-width:unset;padding:0 20px;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 input:-webkit-autofill,#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 input:-webkit-autofill:hover,#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 input:-webkit-autofill:focus,#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 input:-webkit-autofill:active{-webkit-text-fill-color:var(--fontColor);-webkit-box-shadow:0 0 0px 1000px var(--bgColor) inset;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s;}#section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99 .lp-disclaimer{max-width:730px;margin:20px auto 0 auto;}#modal-global-contact-us>.close{display:none;}#modal-global-contact-us .contact-form{--colorLighter1:hsla(var(--fontColor_H), var(--fontColor_S), var(--fontColor_L), 0.5);--colorLighter2:hsla(var(--fontColor_H), var(--fontColor_S), var(--fontColor_L), 0.3);width:100%;background:center no-repeat;-webkit-background-size:cover;background-size:cover;min-height:800px;height:100vh;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;color:#000;-webkit-box-pack:space-around;-ms-flex-pack:space-around;-webkit-justify-content:space-around;justify-content:space-around;}#modal-global-contact-us .contact-form ::parent{-webkit-align-items:unset;-webkit-box-align:unset;-ms-flex-align:unset;align-items:unset;}@media (max-width: 1024px){#modal-global-contact-us .contact-form{min-height:100vh;height:auto;display:block;}}#modal-global-contact-us .contact-form .input-container{width:100%;}#modal-global-contact-us .contact-form .input-container+.input-container{margin-top:8px;}#modal-global-contact-us .contact-form__container{z-index:2;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}@media (max-width: 1024px){#modal-global-contact-us .contact-form__container{padding:0;width:100%;display:block;}}#modal-global-contact-us .contact-form__close{position:absolute;right:5px;top:5px;z-index:10;background-color:transparent;border:none;width:40px;height:40px;cursor:pointer;opacity:0.2;}#modal-global-contact-us .contact-form__close.close{color:#000;}#modal-global-contact-us .contact-form__close:before,#modal-global-contact-us .contact-form__close:after{display:block;content:'';position:absolute;width:20px;height:2px;background-color:currentColor;left:50%;top:50%;}@media (max-width: 768px){#modal-global-contact-us .contact-form__close{top:1vh;}}@media (min-width: 768px) and (max-width: 810px),(min-height: 1024px) and (max-height: 1080px){#modal-global-contact-us .contact-form__close{top:3vh;}}#modal-global-contact-us .contact-form__close:before{-webkit-transform:translate(-50%, -50%) rotate(45deg);-moz-transform:translate(-50%, -50%) rotate(45deg);-ms-transform:translate(-50%, -50%) rotate(45deg);transform:translate(-50%, -50%) rotate(45deg);}#modal-global-contact-us .contact-form__close:after{-webkit-transform:translate(-50%, -50%) rotate(-45deg);-moz-transform:translate(-50%, -50%) rotate(-45deg);-ms-transform:translate(-50%, -50%) rotate(-45deg);transform:translate(-50%, -50%) rotate(-45deg);}#modal-global-contact-us .contact-form__form{width:100%;max-width:637px;text-align:center;min-height:463px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-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;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;position:relative;margin-right:110px;padding:64px 65px;margin-bottom:0;}@media (max-width: 1024px){#modal-global-contact-us .contact-form__form{width:100%;max-width:100%;margin-right:0;padding:44px 24px;}}#modal-global-contact-us .contact-form__details{width:100%;max-width:510px;margin-top:66px;}@media (max-width: 1024px){#modal-global-contact-us .contact-form__details{width:100%;max-width:100%;margin-top:48px;padding-left:24px;padding-right:24px;}}#modal-global-contact-us .contact-form__input{width:100%;}#modal-global-contact-us .contact-form__submit{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin-top:16px;width:100%;padding-top:5px;padding-bottom:5px;height:50px;}#modal-global-contact-us .contact-form .thank-you{display:none;padding:24px;}#modal-global-contact-us .contact-form .success .thank-you{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-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;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}
34#modal-global-contact-us .contact-form .success .form-group{display:none;}#modal-global-contact-us .contact-form .success .image{display:none;}#modal-global-contact-us .contact-form__title1{margin-bottom:16px;text-align:left;}#modal-global-contact-us .contact-form__title2{margin-bottom:16px;}#modal-global-contact-us .contact-form__description{margin-bottom:48px;}@media (max-width: 1024px){#modal-global-contact-us .contact-form__description{margin-bottom:32px;}}#modal-global-contact-us .form-inputs-wrap.center-aligned{margin-left:auto;margin-right:auto;}#modal-global-contact-us .company{padding-top:24px;padding-bottom:48px;border-top:1px solid rgba(0, 0, 0, 0.5);color:rgba(0, 0, 0, 0.5);}@media (max-width: 1024px){#modal-global-contact-us .company{padding-bottom:32px;}}#modal-global-contact-us .company_title{margin-bottom:0;}#modal-global-contact-us .company .lp-a a{white-space:nowrap;}#modal-global-contact-us .company p{margin-bottom:0;}#modal-global-contact-us .socials{margin:-8px;margin-bottom:20px;}@media (max-width: 767px){#modal-global-contact-us .socials{margin-left:auto;width:-webkit-max-content;width:-moz-max-content;width:max-content;margin-right:auto;max-width:100%;}}#modal-global-contact-us .socials li{margin:0;padding:8px;}#modal-global-contact-us .contact-form__submit{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}#modal-global-contact-us .sync-icon{display:none;margin-right:10px;-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;}#modal-global-contact-us .success-icon{display:none;margin-right:10px;-webkit-transition:0s;transition:0s;visibility:visible;}#modal-global-contact-us .loading{pointer-events:none;}#modal-global-contact-us .loading .sync-icon{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}#modal-global-contact-us .success-text{display:none;}#modal-global-contact-us .success{pointer-events:none;}#modal-global-contact-us .success .success-icon{display:block;}#modal-global-contact-us .success .success-text{display:inline;}nav{-webkit-transition:0.2s all;transition:0.2s all;}nav nav{-webkit-transition:0.2s all;transition:0.2s all;}nav .header{padding-top:30px;padding-bottom:30px;}nav .header__right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;}nav .header__container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}nav .header__btn-contact{border:1px solid;border-radius:3px;padding:18px 40px;-webkit-transition:0.2s all;transition:0.2s all;text-transform:none;margin-left:40px;font-size:18px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}@media (hover: hover) and (pointer: fine){nav .header__btn-contact:hover{background-color:var(--themeBlack);color:var(--themeWhite);}}@media (max-width: 768px){nav .header__btn-contact{padding:10px;margin-left:5px;margin-right:12px;}}nav .header__hamburger{background-color:transparent;cursor:pointer;outline:none;position:relative;padding:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin-left:41px;width:60px;height:60px;border:none;}@media (max-width: 768px){nav .header__hamburger{width:40px;height:40px;margin-left:15px;}}@media (hover: hover) and (pointer: fine){nav .header__hamburger:hover .line--top{width:12px;x:30px;}nav .header__hamburger:hover .line--bottom{width:24px;x:18px;}}nav .header__hamburger svg{width:100%;height:100%;}
34nav .header__hamburger circle{fill:var(--themeBeige);}nav .header__hamburger .line{fill:var(--themeWhite);height:2px;width:24px;x:18px;y:26px;-webkit-transition:0.2s all;transition:0.2s all;}nav .header__hamburger .line--bottom{width:12px;x:30px;y:32px;}nav .sub-nav{position:absolute;left:0;top:100%;padding:0;max-height:0;z-index:5;margin:0;list-style-type:none;overflow:hidden;visibility:hidden;-webkit-transition:visibility 0s linear 0.3s,max-height 0.3s ease;transition:visibility 0s linear 0.3s,max-height 0.3s ease;}nav .sub-nav.visible{-webkit-transition:visibility 0s linear 0s,max-height 0.3s ease-in;transition:visibility 0s linear 0s,max-height 0.3s ease-in;max-height:100vh;visibility:visible;}nav .sub-nav__item{position:relative;display:block;margin:0;text-align:left;}nav .sub-nav__link{display:block;color:var(--themeWhite);font-size:14px;font-weight:600;padding:10px 18px;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:178px;min-width:100%;cursor:pointer;-webkit-text-decoration:none;text-decoration:none;background-color:var(--themeBlack);}@media (hover: hover) and (pointer: fine){nav .sub-nav__link:hover{color:var(--themeWhite);background-color:rgba(75, 75, 75, 1);}}nav .logo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;outline:none;max-width:234px;height:60px;}@media (max-width: 768px){nav .logo{width:145px;}}nav .logo__img{object-fit:contain;object-position:left;max-width:100%;max-height:100%;}nav .logo__img.light{display:none;}nav .logo__img.dark{display:block;}nav .scroll .header{padding-top:22px;padding-bottom:22px;}@media (hover: hover) and (pointer: fine){nav .scroll .header__btn-contact:hover{background-color:var(--themeWhite);color:var(--themeBlack);}}nav .scroll .search__btn{color:var(--themeWhite);}nav .scroll .logo__img.dark{display:none;}nav .scroll .logo__img.light{display:block;}nav .header.theme-light{color:#fff;}nav .header.theme-light .lp-btn.lp-btn--dark.lp-btn--outline{color:var(--themeWhite, #fff);border-color:var(--themeWhite, #fff);}nav .header.theme-light .lp-btn.lp-btn--dark.lp-btn--outline:hover{color:var(--themeBlack, #fff);border-color:var(--themeBlack, #fff);background-color:var(--themeWhite, #fff);}nav .header.theme-light .logo__img.dark{display:none;}nav .header.theme-light .logo__img.light{display:block;}nav.scroll .header{padding-top:22px;padding-bottom:22px;}nav.scroll .lp-btn.lp-btn--dark.lp-btn--outline{color:var(--themeWhite, #fff);border-color:var(--themeWhite, #fff);}nav.scroll .lp-btn.lp-btn--dark.lp-btn--outline:hover{color:var(--themeBlack, #fff);border-color:var(--themeBlack, #fff);background-color:var(--themeWhite, #fff);}nav.scroll .search__btn{color:var(--themeWhite);}nav.scroll .logo__img.dark{display:none;}nav.scroll .logo__img.light{display:block;}nav .navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;list-style-type:none;margin:0;padding:0;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex:1;-ms-flex:1;flex:1;}@media (max-width: 1024px){nav .navigation{display:none;}}nav .navigation__item{padding:0;margin:0;visibility:hidden;height:0;}nav .navigation__item+.navigation__item{padding-left:20px;}@media (hover: hover) and (pointer: fine){nav .navigation .navigation__item:not(.sub-nav-container) .navigation__link:after{content:'';position:absolute;display:block;width:0;height:2px;-webkit-transition:width .3s linear;transition:width .3s linear;background:var(--themeBeige);bottom:0;left:0;}nav .navigation .navigation__item:not(.sub-nav-container) .navigation__link:hover:after{width:100%;}}nav .navigation__link{display:block;position:relative;font-size:18px;line-height:18px;background-color:transparent;border:none;border-bottom:2px solid transparent;border-top:2px solid transparent;cursor:pointer;padding:21px 10px;max-width:180px;z-index:2;outline:none;color:inherit;-webkit-text-decoration:none;text-decoration:none;white-space:nowrap;-webkit-font-smoothing:unset;-webkit-transition:color .3s linear;transition:color .3s linear;}nav .navigation__link:focus,nav .navigation__link:active{outline:none;}nav .sub-nav-container{position:relative;padding-right:21px;}nav .sub-nav-container:after{display:block;content:'';width:8px;height:8px;border-right:2px solid;border-bottom:2px solid;position:absolute;right:3px;top:50%;-webkit-transform:translate(0, calc(-50% - 3px)) rotate(45deg);-moz-transform:translate(0, calc(-50% - 3px)) rotate(45deg);-ms-transform:translate(0, calc(-50% - 3px)) rotate(45deg);transform:translate(0, calc(-50% - 3px)) rotate(45deg);-webkit-transition:-webkit-transform 0.2s linear;transition:transform 0.2s linear;}nav .sub-nav-container.active:after{-webkit-transform:translate(0, calc(-50% + 3px)) rotate(-135deg);-moz-transform:translate(0, calc(-50% + 3px)) rotate(-135deg);-ms-transform:translate(0, calc(-50% + 3px)) rotate(-135deg);transform:translate(0, calc(-50% + 3px)) rotate(-135deg);}nav .search{position:relative;}nav .search__btn{border:none;background-color:transparent;margin-left:20px;cursor:pointer;display:block;color:inherit;}@media (max-width: 768px){nav .search__btn{margin-left:0;}}nav .search__btn svg{display:block;}@media (max-width: 768px){nav .hide-mobile{display:none;}}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;}body>div.sidemenu{--colorLighter1:hsla(var(--fontColor_H), var(--fontColor_S), var(--fontColor_L), 0.1);width:100%;display:block;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:.1s all ease-out 2s;transition:.1s all ease-out 2s;background:transparent;}body>div.sidemenu .sidemenu__container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}body>div.sidemenu.visible{-webkit-transition:0s all;transition:0s all;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);z-index:900;background-color:transparent;}body>div.sidemenu.visible .sidemenu__img{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%);-webkit-transition:.7s cubic-bezier(0.645, 0.045, 0.355, 1.000);transition:.7s cubic-bezier(0.645, 0.045, 0.355, 1.000);}body>div.sidemenu.visible .sidemenu__wrapper{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%);-webkit-transition:1s cubic-bezier(0.645, 0.045, 0.355, 1.000);transition:1s cubic-bezier(0.645, 0.045, 0.355, 1.000);}body>div.sidemenu.visible .sidemenu__toggle{pointer-events:auto;}body>div.sidemenu .sidemenu__img{background:center no-repeat;-webkit-background-size:cover;background-size:cover;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:.7s cubic-bezier(0.645, 0.045, 0.355, 1.000) .5s;transition:.7s cubic-bezier(0.645, 0.045, 0.355, 1.000) .5s;}@media (max-width: 768px){body>div.sidemenu .sidemenu__img{display:none;}}body>div.sidemenu .sidemenu__wrapper{background-color:var(--bgColor, #211F1F);-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;
34-webkit-justify-content:space-between;justify-content:space-between;height:100vh;padding:80px 0 66px 0;overflow-y:auto;max-width:700px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:1s cubic-bezier(0.645, 0.045, 0.355, 1.000) .5s;transition:1s cubic-bezier(0.645, 0.045, 0.355, 1.000) .5s;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}body>div.sidemenu .sidemenu__wrapper::-webkit-scrollbar{width:4px;background-color:transparent;}body>div.sidemenu .sidemenu__wrapper::-webkit-scrollbar-thumb{background-color:var(--fontColor, #ffffff);}body>div.sidemenu .sidemenu__wrapper::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 4px rgba(0,0,0,0.3);background-color:var(--bgColor, #211F1F);}@media (max-width: 768px){body>div.sidemenu .sidemenu__wrapper{padding:40px 0 66px 0;}}body>div.sidemenu .sidemenu__toggle{height:48px;margin-right:auto;margin-left:70px;position:relative;border:none;background-color:transparent;outline:none;color:var(--fontColor, #ffffff);padding-right:50px;font-family:inherit;pointer-events:none;cursor:pointer;}@media (max-width: 768px){body>div.sidemenu .sidemenu__toggle{margin-left:20px;}}body>div.sidemenu .sidemenu__toggle--right{margin-left:auto;margin-right:70px;}@media (max-width: 768px){body>div.sidemenu .sidemenu__toggle--right{margin-right:20px;}}body>div.sidemenu .sidemenu__toggle:focus{outline:none;}body>div.sidemenu .sidemenu__toggle:before,body>div.sidemenu .sidemenu__toggle:after{content:'';display:block;position:absolute;width:20px;height:2px;background-color:currentColor;right:0;top:50%;}body>div.sidemenu .sidemenu__toggle:before{-webkit-transform:translate(-50%, -50%) rotate(45deg);-moz-transform:translate(-50%, -50%) rotate(45deg);-ms-transform:translate(-50%, -50%) rotate(45deg);transform:translate(-50%, -50%) rotate(45deg);}body>div.sidemenu .sidemenu__toggle:after{-webkit-transform:translate(-50%, -50%) rotate(-225deg);-moz-transform:translate(-50%, -50%) rotate(-225deg);-ms-transform:translate(-50%, -50%) rotate(-225deg);transform:translate(-50%, -50%) rotate(-225deg);}body>div.sidemenu .sidemenu__nav{margin-bottom:auto;padding:0;}body>div.sidemenu .sidemenu__socials{margin-left:auto;padding-top:30px;padding-right:70px;}@media (max-width: 768px){body>div.sidemenu .sidemenu__socials{padding-right:20px;padding-left:20px;}}body>div.sidemenu .sidemenu__socials .lp-socials li{margin-bottom:14px;}body>div.sidemenu .sidemenu__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-bottom:93px;}@media (max-width: 768px){body>div.sidemenu .sidemenu__header{padding-bottom:59px;}}body>div.sidemenu .sidemenu__logo{display:none;}@media (max-width: 768px){body>div.sidemenu .sidemenu__logo{display:block;}}body>div.sidemenu .sidemenu__logo-img{display:block;max-height:50px;}body>div.sidemenu .navigation{list-style-type:none;margin:0;padding:0;max-width:100%;}body>div.sidemenu .navigation__item{border-bottom:1px solid var(--colorLighter1);margin:0;overflow:hidden;}body>div.sidemenu .navigation__link{padding:12px 12px 12px 70px;display:block;font-size:22px;font-weight:400;line-height:48px;color:var(--fontColor, #ffffff);-webkit-transition:0.2s all;transition:0.2s all;cursor:pointer;-webkit-text-decoration:none;text-decoration:none;font-family:var(--global-primary-font-family);-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);opacity:0;position:relative;transition-property:transform,opacity,color;transition-duration:0.55s,0.55s,0.3s;transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1),ease-in-out,ease-in-out;}@media(max-width: 768px){body>div.sidemenu .navigation__link{padding-left:20px;padding-right:20px;padding-bottom:16px;}}@media (hover: hover) and (pointer: fine){body>div.sidemenu .navigation__link:hover{color:var(--fontColor, #ffffff);}}body>div.sidemenu .sub-nav{list-style-type:none;display:none;margin:0;padding:10px 0 30px 85px;}@media(max-width: 768px){body>div.sidemenu .sub-nav{padding-bottom:16px;padding-left:35px;}}body>div.sidemenu .sub-nav__item{padding-bottom:10px;margin:0;opacity:0;}body>div.sidemenu .sub-nav__item.fadeInUp{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:var(--delay);animation-delay:var(--delay);}body>div.sidemenu .sub-nav__link{font-size:16px;font-weight:400;cursor:pointer;color:var(--fontColor, #ffffff);font-family:var(--global-secondary-font-family);-webkit-text-decoration:none;text-decoration:none;}body>div.sidemenu .sub-nav.visible{display:block;}body>div.sidemenu .lp-socials__link{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px);position:relative;transition-property:transform,opacity,color;transition-duration:0.55s,0.55s,0.3s;transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1),ease-in-out,ease-in-out;}body>div.sidemenu body>div.sidemenu{width:100%;}body>div.sidemenu body>div.sidemenu.visible{-webkit-transition:0s all;transition:0s all;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);z-index:900;background-color:transparent;}body>div.sidemenu body>div.sidemenu.visible .sidemenu__img{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%);-webkit-transition:.7s cubic-bezier(0.645, 0.045, 0.355, 1.000);transition:.7s cubic-bezier(0.645, 0.045, 0.355, 1.000);}body>div.sidemenu body>div.sidemenu.visible .sidemenu__wrapper{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%);-webkit-transition:1s cubic-bezier(0.645, 0.045, 0.355, 1.000);transition:1s cubic-bezier(0.645, 0.045, 0.355, 1.000);}body>div.sidemenu body>div.sidemenu.visible .sidemenu__toggle{pointer-events:auto;}body>div.sidemenu .fade-in{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}body>div.sidemenu .arrow{vertical-align:middle;margin-bottom:10px;-webkit-transition:.4s;transition:.4s;}body>div.sidemenu .arrow.active{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg);-webkit-transition:.4s;transition:.4s;}footer{background-color:#ffffff;color:#14171A;--fontColor:#14171A;--fontColor_H:210;--fontColor_S:13%;--fontColor_L:9%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#ffffff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;}footer .lp-input--dark{background-color:#fff;}footer .site-footer__subscribe{padding-top:92px;padding-bottom:92px;background-color:rgba(0,0,0,0.1);}@media (max-width: 768px){footer .site-footer__subscribe{padding-top:64px;padding-bottom:64px;}}footer .site-footer__logo-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-bottom:64px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@media (max-width: 768px){footer .site-footer__logo-bar{padding-bottom:24px;}}footer .site-footer__logo-container img{max-width:268px;max-height:56px;object-fit:contain;display:block;object-position:left top;}footer .site-footer__logo-container+.site-footer__logo-container{margin-left:50px;}@media (max-width: 768px){footer .site-footer__logo-container+.site-footer__logo-container{margin-left:0;margin-top:16px;width:100%;}}footer .site-footer__info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}@media (max-width: 768px){footer .site-footer__info{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}footer .site-footer__info .lp-a a{white-space:nowrap;}
34footer .site-footer__col{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-right:32px;}footer .site-footer__col-title{width:100%;margin-bottom:16px;min-height:29px;}footer .site-footer__col-content{opacity:0.5;padding-bottom:16px;}footer .site-footer__col-content p{margin-bottom:0;}footer .site-footer__col-content a{color:inherit;}footer .site-footer__col-content+.site-footer__col-content{padding-left:40px;}@media (max-width: 768px){footer .site-footer__col-content+.site-footer__col-content{padding-left:0;}}footer .site-footer__navigation-wrap{width:100%;padding-top:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}@media (max-width: 992px){footer .site-footer__navigation-wrap{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-bottom:18px;}}@media (max-width: 768px){footer .site-footer__navigation-wrap{padding-top:24px;padding-bottom:0;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}}footer .site-footer__socials{margin-left:auto;}@media (max-width: 992px){footer .site-footer__socials{margin-left:0;}}@media (max-width: 768px){footer .site-footer__socials{margin-right:auto;}}footer .site-footer__socials li{margin-bottom:0;}footer .site-footer__disclaimer{padding-top:64px;padding-bottom:32px;position:relative;opacity:0.5;}@media (max-width: 768px){footer .site-footer__disclaimer{padding-top:18px;padding-bottom:25px;}}footer .site-footer__disclaimer:after{content:'';display:block;position:absolute;left:0;bottom:0;right:0;height:1px;background-color:currentColor;opacity:0.2;}footer .site-footer__copy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-top:32px;font-size:18px;}@media (max-width: 768px){footer .site-footer__copy{padding-top:15px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}footer .site-footer__copy>div:first-child{margin-bottom:15px;}}footer .site-footer__copy a{color:inherit;}footer .site-footer__copy-lp span{margin-right:5px;}footer .site-footer__copy-lp img{margin-right:30px;}@media (max-width: 768px){footer .site-footer__copy-lp img{margin-right:0;margin-bottom:15px;}}@media (min-width: 769px){footer .site-footer__copy-lp{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}footer .site-footer__bottom{padding-top:96px;padding-bottom:96px;}@media (max-width: 768px){footer .site-footer__bottom{padding-top:64px;padding-bottom:64px;}}footer .footer-contact{margin-bottom:13px;}footer .footer-contact p{margin-bottom:0;opacity:.7;}footer .footer-contact ul{list-style:none;padding-left:0;margin:0;}footer .footer-subscribe{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@media (max-width: 768px){footer .footer-subscribe{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}footer .footer-subscribe__title-wrap{padding-right:50px;}@media (max-width: 768px){footer .footer-subscribe__title-wrap{padding-right:0;padding-bottom:32px;}}footer .footer-subscribe__title{margin-bottom:8px;}footer .footer-subscribe__sub-title{margin-bottom:0;}footer .footer-subscribe__form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;max-width:330px;margin-bottom:0;position:relative;}footer .footer-subscribe__submit{margin-top:16px;}footer .footer-subscribe__success-msg{position:absolute;top:100%;width:100%;text-align:center;opacity:.7;padding-top:10px;}footer .footer-navigation{list-style:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 20px 0 0;margin:0 -30px;}@media (max-width: 992px){footer .footer-navigation{margin-bottom:36px;}}@media (max-width: 768px){footer .footer-navigation{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:0 0 36px;}}footer .footer-navigation__item{margin:0 30px;}@media (max-width: 768px){footer .footer-navigation__item{margin:0 0 10px;}}
34footer .footer-navigation__link{color:inherit;-webkit-text-decoration:none;text-decoration:none;font-size:14px;line-height:14px;background-color:transparent;border:none;font-family:inherit;cursor:pointer;padding-left:0;padding-right:0;-webkit-transition:0.2s all;transition:0.2s all;}@media (hover: hover) and (pointer: fine){footer .footer-navigation__link:hover{color:var(--themeBeige);}}footer .lp-socials li{margin-bottom:14px;}footer .sync-icon{display:none;margin-right:10px;-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;}footer .success-icon{display:none;margin-right:10px;-webkit-transition:0s;transition:0s;visibility:visible;}footer .loading{pointer-events:none;}footer .loading .sync-icon{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}footer .success .success-icon{display:block;}footer .lp-footer-disclaimers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:20px;margin-top:32px;padding-top:32px;}@media (max-width: 768px){footer .lp-footer-disclaimers{padding-top:15px;margin-top:15px;}}body>div.mobile-contact-wrapper{z-index:200;position:relative;}body>div.mobile-contact-wrapper .lp-ico:before{content:'';width:1em;height:1em;background-color:currentColor;-webkit-background-size:cover;background-size:cover;display:block;-webkit-mask-position:center;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-transition:all .3s;transition:all .3s;}body>div.mobile-contact-wrapper .lp-ico-search:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewB
34ox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewBox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewBox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-arrow-top:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-scroll-top:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");}body>div.mobile-contact-wrapper .lp-ico-close:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");}body>div.mobile-contact-wrapper .lp-ico-phone:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8
34699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-sms:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-email:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.85
3471 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.8571 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.8571 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper a{-webkit-text-decoration:none;text-decoration:none;}body>div.mobile-contact-wrapper .btn-holder{bottom:-50px;left:19px;position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:13px;opacity:0;-webkit-transition:all .3s;transition:all .3s;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .btn-holder{right:19px;padding:0 48px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}}body>div.mobile-contact-wrapper .btn-holder.visible{bottom:28px;opacity:1;}body>div.mobile-contact-wrapper .search-btn{width:48px;height:48px;border-radius:999px;font-size:0;line-height:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-transition:all .3s;transition:all .3s;padding:12px;color:#141414;background:#fff;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .search-btn{position:absolute;left:0;bottom:0;}}body>div.mobile-contact-wrapper .search-btn:before{width:24px;height:24px;}body>div.mobile-contact-wrapper .connect-btn{height:48px;padding:0 24px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;text-transform:uppercase;border-radius:25px;color:var(--pillTextColor);background:var(--pillBackgroundColor);border:1px solid rgba(255, 255, 255, 0.2);cursor:pointer;font-size:10px;font-style:normal;font-weight:500;line-height:16px;letter-spacing:0.4px;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-transition:all .4s;transition:all .4s;box-shadow:0 0 0 0 rgba(255, 255, 255, 0.2);-webkit-animation:pulsate 2s ease infinite;animation:pulsate 2s ease infinite;}body>div.mobile-contact-wrapper .connect-btn:before{width:16px;height:16px;}body>div.mobile-contact-wrapper .pop-up{display:none;position:fixed;bottom:0;left:0;width:100%;-webkit-transition:all .3s;transition:all .3s;border-radius:16px 16px 0 0;color:var(--textColor);background:var(--backgroundColor);}@media (max-height: 850px){body>div.mobile-contact-wrapper .pop-up{max-height:85vh;overflow-y:auto;}}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up{max-height:none;overflow-y:initial;max-width:637px;border-radius:16px;bottom:28px;left:19px;}}body>div.mobile-contact-wrapper .pop-up .lp-container{padding-top:24px;padding-bottom:24px;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up .lp-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-top:40px;padding-bottom:40px;min-height:450px;padding-left:56px;padding-right:56px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}body>div.mobile-contact-wrapper .pop-up .close-btn{width:44px;height:44px;background-color:transparent;border-color:transparent;display:block;margin:24px auto 0;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--textColor);cursor:pointer;padding:10px;border:0;}body>div.mobile-contact-wrapper .pop-up .close-btn:before{width:24px;height:24px;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up .close-btn{position:absolute;top:14px;right:12px;margin:0;}}body>div.mobile-contact-wrapper .pop-up .icon-btn{width:44px;height:44px;border-radius:999px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:8px;color:var(--textColor);position:relative;}body>div.mobile-contact-wrapper .pop-up .icon-btn:after{position:absolute;bottom:0;width:100%;left:0;border-radius:999px;
34height:100%;content:'';border:solid 1px var(--textColor);opacity:.3;}body>div.mobile-contact-wrapper .pop-up .icon-btn:before{width:24px;height:24px;}body>div.mobile-contact-wrapper .success-block{display:none;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .success-block{-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}}body>div.mobile-contact-wrapper .success-block .lp-btn{margin-top:24px;}body>div.mobile-contact-wrapper .contact-form{margin:0;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .contact-form__item{width:100%;}}body>div.mobile-contact-wrapper .contact-form__item .lp-input{width:100%;}body>div.mobile-contact-wrapper .contact-form__item .is-placeholder{color:#818181;}body>div.mobile-contact-wrapper .contact-form__item+.contact-form__item{margin-top:16px;}body>div.mobile-contact-wrapper .contact-form.show-success .contact-form__container,body>div.mobile-contact-wrapper .contact-form.success .contact-form__container{display:none;}body>div.mobile-contact-wrapper .contact-form.show-success .success-block,body>div.mobile-contact-wrapper .contact-form.success .success-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}body>div.mobile-contact-wrapper .contact-form .lp-disclaimer{margin-top:16px;}body>div.mobile-contact-wrapper .contact-form .lp-h3{margin-bottom:16px;}body>div.mobile-contact-wrapper .success-message{font-size:22px;}@-webkit-keyframes pulsate{0%{box-shadow:0 0 0 0 rgba(255, 255, 255, 0.2);}50%{box-shadow:0 0 4px 6px rgba(255, 255, 255, .5);}100%{box-shadow:0 0 12px 12px rgba(255, 255, 255, 0);}} 35 </style> 36 <style id="custom-style-css">.hyperlink-style-1{color:rgba(33, 31, 31, 1)!important;}.hyperlink-style-1:hover{color:rgba(119, 154, 208, 1)!important;}.pagination-style-1 li a{color:rgba(119, 154, 208, 1)!important;background-color:rgba(255, 255, 255, 0)!important;border-color:rgba(119, 154, 208, 1)!important;}.pagination-style-1 li a:hover{color:rgba(255, 255, 255, 1)!important;background-color:rgba(119, 154, 208, 1)!important;border-color:rgba(119, 154, 208, 1)!important;}.pagination-style-1 li.active a{color:rgba(255, 255, 255, 1)!important;background-color:rgba(119, 154, 208, 1)!important;border-color:rgba(119, 154, 208, 1)!important;}.social_icons-style-1 a{border-color:rgba(119, 154, 208, 1)!important;background-color:rgba(119, 154, 208, 1)!important;color:rgba(255, 255, 255, 1)!important;}.social_icons-style-1 a:hover{border-color:rgba(73, 121, 193, 1)!important;background-color:rgba(73, 121, 193, 1)!important;color:rgba(255, 255, 255, 1)!important;}.social_icons-style-1 a i{color:inherit!important;}
36.social_icons-style-1 a svg,.social_icons-style-1 a svg path{fill:currentColor!important;}.social_icons-style-2 a{border-color:rgba(255, 255, 255, 1)!important;background-color:rgba(0, 0, 0, 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, 1)!important;color:rgba(119, 154, 208, 1)!important;}.social_icons-style-2 a i{color:inherit!important;}.social_icons-style-2 a svg,.social_icons-style-2 a svg path{fill:currentColor!important;}.hyperlink-style-2{color:rgba(255, 255, 255, 1)!important;}.hyperlink-style-2:hover{color:rgba(119, 154, 208, 1)!important;}.button-style-2{color:rgba(255, 255, 255, 1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(255, 255, 255, 1)!important;}.button-style-2:hover{color:rgba(119, 154, 208, 1)!important;background-color:rgba(255, 255, 255, 1)!important;border-color:rgba(255,255,255,1)!important;}.pagination-style-2 li a{color:rgba(255, 255, 255, 0.5)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(255, 255, 255, 0.5)!important;}.pagination-style-2 li a:hover{color:rgba(255, 255, 255, 0.5)!important;background-color:rgba(119, 154, 208, 1)!important;border-color:rgba(119, 154, 208, 1)!important;}.pagination-style-2 li.active a{color:rgba(255, 255, 255, 0.5)!important;background-color:rgba(119, 154, 208, 1)!important;border-color:rgba(119, 154, 208, 1)!important;}.button-style-3{color:rgba(255, 255, 255, 1)!important;background-color:rgba(119, 154, 208, 1)!important;border-color:rgba(119, 154, 208, 1)!important;}.button-style-3:hover{color:rgba(255, 255, 255, 1)!important;background-color:rgba(73, 121, 193, 1)!important;border-color:rgba(73, 121, 193, 1)!important;}.hyperlink-style-3{color:rgba(0, 0, 0, 1)!important;}.hyperlink-style-3:hover{color:rgba(0, 0, 0, 1)!important;}.button-style-4{color:rgba(119, 154, 208, 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(0, 0, 0, 0)!important;border-color:rgba(255, 255, 255, 1)!important;}.hyperlink-style-4{color:rgba(255, 255, 255, 1)!important;}.hyperlink-style-4:hover{color:rgba(255,255,255,1)!important;}</style> 37 <!-- LP Consent bootstrap: blocking; resolves consent state, pushes Consent Mode 38 defaults, and dynamically loads the locale + main (and banner if needed). --> 39
39<script src="https://cdn.luxurypresence.com/scripts/lp-consent/latest/lp-consent-boot.js" data-website-id="2b9f3b9c-8d13-4525-81b1-0e846aa51be2"></script>
39 40 41 42
42<script> 43 (function utmParse() { 44 const url = new URL(window.location.href); 45 if (url.search) { 46 const utm = url.search.split(/\?|&/g).reduce((acc, current) => { 47 const matched = current.match(/utm_(content|campaign|medium|source|term|id)|gclid/g); 48 if (matched) { 49 acc[matched[0]] = current.replace(`${matched[0]}=`, ''); 50 } 51 return acc; 52 }, {}); 53 if (Object.keys(utm).length) { 54 window.localStorage.setItem('utm_vars', JSON.stringify(utm)); 55 } else { 56 // Remove old utm vars 57 window.localStorage.removeItem('utm_vars'); 58 } 59 } 60 // Set referrer in local storage 61 // This is meant to be stored once to avoid self-referrals and to have the first referrer only. 62 if (!window.localStorage.getItem('referrer')) { 63 // Capture the Referrer URL 64 const referrer = document.referrer; 65 if (referrer) { 66 // Only store the referrer if it comes from outside the current domain (to avoid self-referrals) 67 const currentDomain = window.location.hostname; 68 const referrerDomain = new URL(referrer).hostname; 69 70 if (referrerDomain !== currentDomain) { 71 // Store it in localStorage 72 localStorage.setItem('referrer', referrer); 73 } 74 } 75 } 76 })(); 77 </script>
77 78 <!-- Google Tag Manager -->
79<script>
vendor: 331 bytes, lines 79-83
79(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 80new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 81j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 82'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 83})(window,document,'script','dataLayer','
83GTM-N69GP49
vendor: 3 bytes, line 83
83');
83</script>
83 84<!-- End Google Tag Manager --> 85 86 87<!-- Google Tag Manager -->
88<script>
vendor: 331 bytes, lines 88-92
88(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 89new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 90j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 91'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 92})(window,document,'script','dataLayer','
92GTM-KBFVRKS
vendor: 3 bytes, line 92
92');
92</script>
92 93<!-- End Google Tag Manager --> 94 95 96<meta name="google-site-verification" content="1jluayOJ9KFv_74QacLuP6RyJGQsCL3JUU7j5frkjnM" /> 97 98<!-- Start - Analytics Request -->
99<script src="https://anthonymarguleas.engynesystems.com/condorscripts/10a7b876d79b41f1944da5372a3d7aa1.js?v=1021" type="text/javascript" async defer></script>
99 100<!-- End - Analytics Request --> 101 <!-- GOOGLE TRANSLATE STYLES are moved to external CSS --> 102</head> 103<body> 104 <div id="google_translate_element" style="display: none"></div> 105 106 <nav id="global-navbar" data-el-id="b395957e-29e6-4bd5-99ee-352fbee7732a"> 107 <div class="header theme-auto"> 108 <div class="lp-container header__container"> 109 <div class="header__logo"> 110 <a href="/" class="logo"> 111 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/si9ou55cwnjkkynx63uf" 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/si9ou55cwnjkkynx63uf 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/si9ou55cwnjkkynx63uf 800w" sizes="500px" class="logo__img dark" alt=""> 112 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/swa31xibimcojqvnv7yv" 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/swa31xibimcojqvnv7yv 320w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/swa31xibimcojqvnv7yv 800w" sizes="500px" class="logo__img light" alt=""> 113 </a> 114 </div> 115 116 <div class="header__right"> 117 <ul class="navigation"> 118 <li class="navigation__item"> 119 <a href="/giving-back/" class="navigation__link">Giving Back</a> 120 </li> 121 <li class="navigation__item sub-nav-container"> 122 <a href="#" class="navigation__link">About Us</a> 123 <ul class="sub-nav"> 124 <li class="sub-nav__item"><a href="/about-us" class="sub-nav__link">LA Team</a></li> 125 <li class="sub-nav__item"><a href="/dallas-team" class="sub-nav__link">Dallas Team</a></li> 126 <li class="sub-nav__item"><a href="/press" class="sub-nav__link">In the Press</a></li> 127 <li class="sub-nav__item"><a href="/testimonials" class="sub-nav__link">Testimonials</a></li> 128 <li class="sub-nav__item"><a href="/videos" class="sub-nav__link">Videos</a></li> 129 <li class="sub-nav__item"><a href="/market-update" class="sub-nav__link">Market Updates</a></li> 130 <li class="sub-nav__item"><a href="/blog" class="sub-nav__link">Blogs</a></li> 131 <li class="sub-nav__item"><a href="/careers/" class="sub-nav__link">Careers</a></li> 132 <li class="sub-nav__item"><a href="/contact" class="sub-nav__link">Contact Us</a></li> 133 <li class="sub-nav__item"><a target="_blank" href="/faqs" class="sub-nav__link">FAQs</a></li> 134 </ul> 135 </li> 136 <li class="navigation__item sub-nav-container"> 137 <a href="#" class="navigation__link">Properties</a> 138 <ul class="sub-nav"> 139 <li class="sub-nav__item"><a href="/properties" class="sub-nav__link">Current Listings</a></li> 140 <li class="sub-nav__item"><a href="/sold-homes/" class="sub-nav__link">Sold Homes</a></li> 141 </ul> 142 </li> 143 <li class="navigation__item"> 144 <a href="/communities" class="navigation__link">Communities</a> 145 </li> 146 <li class="navigation__item sub-nav-container"> 147 <a href="#" class="navigation__link">Buying</a> 148 <ul class="sub-nav"> 149 <li class="sub-nav__item"><a href="/buying" class="sub-nav__link">Buying Process</a></li> 150 <li class="sub-nav__item"><a href="/home-search/listings?search_type=envelope&south=34.04336628385183&west=-118.55438156372071&north=34.05019357872283&east=-118.4936134362793&property_type%5B%5D=Co-op&property_type%5B%5D=Condo&property_type%5B%5D=Commercial&property_type%5B%5D=Land&property_type%5B%5D=Multi-family&property_type%5B%5D=Manufactured&property_type%5B%5D=Residential&property_type%5B%5D=Townhouse&property_type%5B%5D=Other&property_type%5B%5D=Co-op&property_type%5B%5D=Condo&property_type%5B%5D=Commercial&property_type%5B%5D=Land&property_type%5B%5D=Multi-family&property_type%5B%5D=Manufactured&property_type%5B%5D=Residential&property_type%5B%5D=Townhouse&property_type%5B%5D=Other&status%5B%5D=Active&status_days%5BActive%5D=36500&status%5B%5D=Under+Contract&status_days%5BUnder+Contract%5D=36500&status%5B%5D=Pending&status_days%5BPending%5D=36500&status_days%5BSold%5D=180&mailer_schedule=instant&order=status_modified_at%3Adesc&page=1" class="sub-nav__link">Search Homes</a></li> 151 </ul> 152 </li> 153 <li class="navigation__item sub-nav-container"> 154 <a href="#" class="navigation__link">Selling</a> 155 <ul class="sub-nav"> 156 <li class="sub-nav__item"><a href="/selling" class="sub-nav__link">Selling Process</a></li> 157 <li class="sub-nav__item"><a href="/home-valuation" class="sub-nav__link">Home Valuation</a></li> 158 <li class="sub-nav__item"><a href="/sellers-marketing/" class="sub-nav__link">
158Sellers Marketing</a></li> 159 <li class="sub-nav__item"><a href="/trade-in/" class="sub-nav__link">Trade In</a></li> 160 </ul> 161 </li> 162 163 </ul> 164 165 166 167 168 169 <button class="hamburger-component header__hamburger"> 170 <svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg"> 171 <circle cx="30" cy="30" r="30" /> 172 <rect class="line line--top" x="18" y="26" width="24" height="2" /> 173 <rect class="line line--bottom" x="30" y="32" width="12" height="2" /> 174 </svg> 175 </button> 176 </div> 177 178 </div> 179</div> 180 </nav> 181 <div id="global-sidemenu" class="sidemenu" data-el-id="1575f740-92ae-4292-919d-936adffb0f46"> 182 <div class="sidemenu__container"> 183 184 185 <div class="sidemenu__img" style="background-image: url('https://media-production.lp-cdn.com/media/bd095128-b987-4418-baab-4b3d1f7297f5');"> 186 </div> 187 188 <div class="sidemenu__wrapper"> 189 <div class="sidemenu__header"> 190 <button class="sidemenu__toggle toggle sidemenu__toggle--right">Close Menu</button> 191 </div> 192 193 <div class="sidemenu__nav"> 194 <ul class="navigation"> 195 <li class="navigation__item" > 196 <a href="/" class="navigation__link" >Home</a> 197 </li> 198 <li class="navigation__item sub-nav-container" data-wow-delay="2.1s"> 199 <a href="#" class="navigation__link"> 200 Properties 201 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="arrow" xmlns="http://www.w3.org/2000/svg"> 202 <path d="M7.41 8.58984L12 13.1698L16.59 8.58984L18 9.99984L12 15.9998L6 9.99984L7.41 8.58984Z" fill="currentColor"/> 203 </svg> 204 </a> 205 <ul class="sub-nav"> 206 <li class="sub-nav__item"><a href="/properties" class="sub-nav__link feature">Current Listings</a></li> 207 <li class="sub-nav__item"><a href="/sold-homes/" class="sub-nav__link feature">Sold Homes</a></li> 208 </ul> 209 210 </li> 211 <li class="navigation__item sub-nav-container" data-wow-delay="2.2s"> 212 <a href="#" class="navigation__link"> 213 Communities 214 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="arrow" xmlns="http://www.w3.org/2000/svg"> 215 <path d="M7.41 8.58984L12 13.1698L16.59 8.58984L18 9.99984L12 15.9998L6 9.99984L7.41 8.58984Z" fill="currentColor"/> 216 </svg> 217 </a> 218 <ul class="sub-nav"> 219 <li class="sub-nav__item"><a href="/communities" class="sub-nav__link feature">All Communities</a></li> 220 <li class="sub-nav__item"><a href="/westside" class="sub-nav__link feature">Westside</a></li> 221 <li class="sub-nav__item"><a href="/mid-wilshire-downtown/" class="sub-nav__link feature">Mid Wilshire-Downtown</a></li> 222 <li class="sub-nav__item"><a href="/san-fernando-valley/" class="sub-nav__link feature">San Fernando Valley</a></li> 223 <li class="sub-nav__item"><a href="/san-gabrielle-valley/" class="sub-nav__link feature">San Gabriel Valley</a></li> 224 <li class="sub-nav__item"><a href="/south-bay/" class="sub-nav__link feature">South Bay</a></li> 225 </ul> 226 227 </li> 228 <li class="navigation__item sub-nav-container" data-wow-delay="2.3s"> 229 <a href="#" class="navigation__link"> 230 Buying 231 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="arrow" xmlns="http://www.w3.org/2000/svg"> 232 <path d="M7.41 8.58984L12 13.1698L16.59 8.58984L18 9.99984L12 15.9998L6 9.99984L7.41 8.58984Z" fill="currentColor"/> 233 </svg> 234 </a> 235 <ul class="sub-nav"> 236 <li class="sub-nav__item"><a href="/buying" class="sub-nav__link feature">Buying Process</a></li> 237 <li class="sub-nav__item"><a href="/home-search/listings?search_type=envelope&south=34.04336628385183&west=-118.55438156372071&north=34.05019357872283&east=-118.4936134362793&property_type%5B%5D=Co-op&property_type%5B%5D=Condo&property_type%5B%5D=Commercial&property_type%5B%5D=Land&property_type%5B%5D=Multi-family&property_type%5B%5D=Manufactured&property_type%5B%5D=Residential&property_type%5B%5D=Townhouse&property_type%5B%5D=Other&property_type%5B%5D=Co-op&property_type%5B%5D=Condo&property_type%5B%5D=Commercial&property_type%5B%5D=Land&property_type%5B%5D=Multi-family&property_type%5B%5D=Manufactured&property_type%5B%5D=Residential&property_type%5B%5D=Townhouse&property_type%5B%5D=Other&status%5B%5D=Active&status_days%5BActive%5D=36500&status%5B%5D=Under+Contract&status_days%5BUnder+Contract%5D=36500&status%5B%5D=Pending&status_days%5BPending%5D=36500&status_days%5BSold%5D=180&mailer_schedule=instant&order=status_modified_at%3Adesc&page=1" class="sub-nav__link feature">Search Homes</a></li> 238 </ul> 239 240 </li> 241 <li class="navigation__item sub-nav-container" data-wow-delay="2.4s"> 242 <a href="#" class="navigation__link"> 243 Selling 244 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="arrow" xmlns="http://www.w3.org/2000/svg"> 245 <path d="M7.41 8.58984L12 13.1698L16.59 8.58984L18 9.99984L12 15.9998L6 9.99984L7.41 8.58984Z" fill="currentColor"/> 246 </svg> 247 </a> 248 <ul class="sub-nav"> 249 <li class="sub-nav__item"><a href="/selling" class="sub-nav__link feature">Selling Process</a></li> 250 <li class="sub-nav__item"><a href="/home-valuation" class="sub-nav__link feature">Home Valuation</a></li> 251 <li class="sub-nav__item"><a href="/sellers-marketing/" class="sub-nav__link feature">
251Sellers Marketing</a></li> 252 <li class="sub-nav__item"><a href="/trade-in/" class="sub-nav__link feature">Trade In</a></li> 253 </ul> 254 255 </li> 256 <li class="navigation__item sub-nav-container" data-wow-delay="2.5s"> 257 <a href="#" class="navigation__link"> 258 About Us 259 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="arrow" xmlns="http://www.w3.org/2000/svg"> 260 <path d="M7.41 8.58984L12 13.1698L16.59 8.58984L18 9.99984L12 15.9998L6 9.99984L7.41 8.58984Z" fill="currentColor"/> 261 </svg> 262 </a> 263 <ul class="sub-nav"> 264 <li class="sub-nav__item"><a href="/about-us" class="sub-nav__link feature">LA Team</a></li> 265 <li class="sub-nav__item"><a href="/dallas-team" class="sub-nav__link feature">Dallas Team</a></li> 266 <li class="sub-nav__item"><a href="/giving-back/" class="sub-nav__link feature">Giving Back</a></li> 267 <li class="sub-nav__item"><a href="/market-update" class="sub-nav__link feature">Market Updates</a></li> 268 <li class="sub-nav__item"><a href="/blog" class="sub-nav__link feature">Blog</a></li> 269 <li class="sub-nav__item"><a target="_blank" href="/careers/" class="sub-nav__link feature">Careers</a></li> 270 <li class="sub-nav__item"><a href="/testimonials" class="sub-nav__link feature">Testimonials</a></li> 271 <li class="sub-nav__item"><a href="/press" class="sub-nav__link feature">In the Press</a></li> 272 </ul> 273 274 </li> 275 <li class="navigation__item" > 276 <a href="/contact" class="navigation__link" >Contact Us</a> 277 </li> 278 </ul> 279 </div> 280 281 <div class="sidemenu__socials"> 282 <ul class="lp-socials social_icons-style-1 sidemenu-social-links"> 283 284 <li> 285 <a 286 href="https://www.instagram.com/amalfiestates/?hl=en" 287 class="lp-socials__link socials__item" 288 data-wow-delay="0s" 289 target="_blank" 290 aria-label="INSTAGRAM" 291 > 292 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 293 </a> 294 </li> 295 <li> 296 <a 297 href="https://www.facebook.com/Amalfiestates/" 298 class="lp-socials__link socials__item" 299 data-wow-delay="0.1s" 300 target="_blank" 301 aria-label="FACEBOOK" 302 > 303 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 304 </a> 305 </li> 306 <li> 307 <a 308 href="https://www.youtube.com/channel/UCF0oITsPGXTiEc3bDRZWBwQ" 309 class="lp-socials__link socials__item" 310 data-wow-delay="0.2s" 311 target="_blank" 312 aria-label="YOUTUBE" 313 > 314 <span class="lp-i lp-i--youtube" aria-hidden="true"></span> 315 </a> 316 </li> 317 <li> 318 <a 319 href="https://www.linkedin.com/company/amalfi-estates/" 320 class="lp-socials__link socials__item" 321 data-wow-delay="0.3s" 322 target="_blank" 323 aria-label="LINKEDIN" 324 > 325 <span class="lp-i lp-i--linkedin" aria-hidden="true"></span> 326 </a> 327 </li> 328 <li> 329 <a 330 href="https://www.yelp.com/biz/amalfi-estates-pacific-palisades" 331 class="lp-socials__link socials__item" 332 data-wow-delay="0.4s" 333 target="_blank" 334 aria-label="YELP" 335 > 336 <span class="lp-i lp-i--yelp" aria-hidden="true"></span> 337 </a> 338 </li> 339 </ul> </div> 340 </div> 341</div> 342 343 </div> 344 <div id="global-mobile-contact" class="mobile-contact-wrapper" data-el-id="befe5af2-a6ca-4119-924a-a85d96d36b51"> 345 <div class="btn-holder" 346style=" 347--backgroundColor: rgba(20, 20, 20, 1); 348--textColor: rgba(255, 255, 255, 1); 349--pillTextColor: rgba(26, 26, 26, 1);
350--pillBackgroundColor: rgba(255, 255, 255, 1);"> 351 352 <button type="button" class="connect-btn lp-ico lp-ico-arrow-top visible">Let's Connect</button> 353</div> 354 355 356<div class="pop-up" style="--backgroundColor: rgba(20, 20, 20, 1); --textColor: rgba(255, 255, 255, 1);"> 357 <div class="lp-container"> 358 <form data-type="contact-form" class="contact-form"> 359 <div class="contact-form__container"> 360 <h3 class="lp-h3">Leave a Message</h3> 361 362 <div class="contact-form__content"> 363 <div class="contact-form__inputs-container"> 364 <div class="contact-form__item"> 365 <input 366 id="__FullName" 367 type="text" name="name" 368 class="lp-input lp-input--light" 369 required 370 placeholder="Full Name"> 371 </div> 372 <div class="contact-form__item"> 373 <input 374 id="__Email" 375 type="email" name="email" 376 class="lp-input js-email-input lp-input--light" 377 required 378 placeholder="Email"> 379 </div> 380 <div class="contact-form__item"> 381 <input 382 class="lp-input lp-input--light" 383 type="tel" 384 placeholder="Phone" 385 id="__Phone" 386 name="phone" 387 required> 388 </div> 389 390 <div class="contact-form__item input-group-select"> 391 <select name="interest" id="-field-interest" placeholder="Interest" 392 class="lp-input dropdown-select js-select js-form-element lp-input--light" required> 393 <option value="" disabled selected data-label="Interest">Interested in...</option> 394 <option value="Selling & Buying">Selling & Buying</option> 395 <option value="Selling">Selling</option> 396 <option value="Buying">Buying</option> 397 <option value="Renting">Renting</option> 398 <option value="Other">Other</option> 399 </select> 400 <label for="-field-interest" class="lp-label sr-only">Interest</label> 401 </div> 402 403 <div class="contact-form__item"> 404 <textarea 405 name="message" 406 rows="4" 407 id="__Message" 408 class="lp-input lp-input--light" 409 placeholder="Message" 410 required></textarea> 411 </div> 412 <div class="lp-disclaimer"> <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label> 413 <label class='lp-tcr-content'> 414 <span class='lp-tcr-checkbox'> 415 <input 416 type='checkbox' 417 id='-termsAccepted' 418 name='termsAccepted' 419 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 420 oninput="this.setCustomValidity('')" 421 required 422 /></span> 423 <span class='lp-tcr-message'> 424 425 I agree to be contacted by 426 Amalfi Estates- 427 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 428 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 429 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 430 </span> 431 </label> 432 433</div> 434 <button type="submit" class="lp-btn lp-btn--filled lp-btn--dark submit contact-form__item">Submit</button> 435 436 <div class="lp-h-pot"> 437 <input id="__newsSignMiddleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 438 </div> 439 440 <input style="display: none;" type="text" name="source" value="CONTACT_INQUIRY" /> 441 <input type="hidden" name="button_text" value="Let's Connect"> 442 </div> 443 </div> 444 </div> 445 446 447 <div class="success-block"> 448 <h3 class="lp-h3 success-message">Thank you for your message. We will be in touch with you shortly.</h3> 449 450 </div> 451 </form> 452 453 <button type="button" class="close-btn lp-ico lp-ico-close"></button> 454 455 456 </div> 457</div> 458 459 460 </div> 461 <section class="image-section is-font-color-light is-background-color-dark" id="section-33514986-d0a9-4c0c-9c08-c60d74b86348" data-el-id="bce33bae-7388-4ccc-abff-e0ce18ec46d2"> 462
463<script> 464 (function(){ 465 const sectionId = 'section-33514986-d0a9-4c0c-9c08-c60d74b86348' 466 const section = document.querySelector(`#${sectionId}`); 467 var sectionBg = window.getComputedStyle(section, null).getPropertyValue('background-image'); 468 469 if('true' === 'true') { 470 section.classList.add('parallax-enabled'); 471 section.style.setProperty('--sectionBackground', sectionBg); 472 section.style.setProperty('background', 'transparent'); 473 } 474 })() 475</script>
475 476 477 478<div class="opening-with-search height-class-770px parallax"> 479 <div class="center-block"> 480 <button class='lp-play video-section__play-button js-play-btn'></button> 481 <div class="container lp-container"> 482 483 <div class="lp-title-group"> 484 485 486 <h1 class="h1 lp-h1 opening-title lp-pre-line" style="color: rgba(255, 255, 255, 1)">Blog</h1> 487 488 489 </div> 490 491 <div class="buttons"></div> 492 493 </div> 494 </div> 495 <div class="bottom-spacer"></div> 496</div> 497</section> 498<section id="section-b77708cd-fdfc-4613-9af8-1194d5b50ae8" class="solid-section is-font-color-dark is-background-color-light" data-el-id="fbce30da-e561-48a0-b724-32c0e1f42ba6">
499<script type="text/x-handlebars-template" class="blogItem pagination-script"> <a class="item" href="/blog/{{slug}}"> 500 <figure> 501 {{#if media.[0]}} 502 {{{mediaImage media.[0] sizes="(min-width: 769px) 381px, (min-width: 561px) 450px, 100vw" alt=../lastName}}} 503 {{/if}} 504 </figure> 505 <div class="text-wrap"> 506 <h5 class="lp-h5">{{title}}</h5> 507 <p class="bf1"> 508 509 </p> 510 <p class="item-text"> 511 {{truncate subtitle 168 "…"}} 512 {{#numCompare subtitle.length 168 ">"}} 513 <span class="hyperlink-style-1 link">Read more</span> 514 {{/numCompare}} 515 </p> 516 </div> 517 </a> 518</script>
518 519 520<div class="section lp-vertical-paddings"> 521 <div class="lp-container"> 522 523 524 <div class="collection collection--3 data-container"> 525 <a class="item" href="/blog/city-councils-proposition-te-provides-limited-aid-for-fire-victims"> 526 <figure> 527 <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/5033efbb-79a8-44ee-aff5-18be6d4c91d7" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/5033efbb-79a8-44ee-aff5-18be6d4c91d7 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/5033efbb-79a8-44ee-aff5-18be6d4c91d7 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/5033efbb-79a8-44ee-aff5-18be6d4c91d7 1282w" alt="" sizes="(min-width: 769px) 381px, (min-width: 561px) 450px, 100vw" loading="lazy"> 528 </figure> 529 <div class="text-wrap"> 530 <h5 class="lp-h5">City Council’s Proposition TE Provides Limited Aid for Fire Victims</h5> 531 <p class="bf1"> 532 533 </p> 534 <p class="item-text"> 535 536 </p> 537 </div> 538 </a> 539 <a class="item" href="/blog/palisades-foreclosures-have-increased-but-still-represent-just-03-of-properties"> 540 <figure> 541 <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/e919b435-d450-4ca8-b19a-3bf113ebdc37" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/e919b435-d450-4ca8-b19a-3bf113ebdc37 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/e919b435-d450-4ca8-b19a-3bf113ebdc37 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/e919b435-d450-4ca8-b19a-3bf113ebdc37 1702w" alt="Aerial view of Pacific Palisades, highlighting the community and surrounding residential landscape." sizes="(min-width: 769px) 381px, (min-width: 561px) 450px, 100vw" loading="lazy"> 542 </figure> 543 <div class="text-wrap"> 544 <h5 class="lp-h5">Palisades Foreclosures Have Increased — But Still Represent Just 0.3% of Properties</h5> 545 <p class="bf1"> 546 547 </p> 548 <p class="item-text"> 549 Foreclosure activity has risen since 2025, but the latest numbers remain a small fraction of the Palisades housing market. 550 </p> 551 </div> 552 </a> 553 <a class="item" href="/blog/why-this-may-be-the-best-time-in-a-decade-to-buy-a-home-in-dallas"> 554 <figure> 555 <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/17b01066-483a-46c0-bd83-034a433fdc2f" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/17b01066-483a-46c0-bd83-034a433fdc2f 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/17b01066-483a-46c0-bd83-034a433fdc2f 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/17b01066-483a-46c0-bd83-034a433fdc2f 1454w" alt="Downtown Dallas Amalfi Estates the best realtor in dallas" sizes="(min-width: 769px) 381px, (min-width: 561px) 450px, 100vw" loading="lazy"> 556 </figure> 557 <div class="text-wrap"> 558 <h5 class="lp-h5">Why This May Be the Best Time in a Decade to Buy a Home in Dallas</h5> 559 <p class="bf1"> 560 561 </p> 562 <p class="item-text"> 563 564 </p> 565 </div> 566 </a> 567 <a class="item" href="/blog/what-i-learned-after-helping-sell-56-palisades-lots-for-70-families-since-the-fire"> 568 <figure> 569 <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/cd7dfc72-22de-44db-90e1-6ce8b11fc73c" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/cd7dfc72-22de-44db-90e1-6ce8b11fc73c 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/cd7dfc72-22de-44db-90e1-6ce8b11fc73c 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/cd7dfc72-22de-44db-90e1-6ce8b11fc73c 1400w" alt="Anthony Marguleas the best Realtor in pacific palisades" sizes="(min-width: 769px) 381px, (min-width: 561px) 450px, 100vw" loading="lazy"> 570 </figure> 571 <div class="text-wrap"> 572 <h5 class="lp-h5">What I Learned After Helping Sell 56 Palisades Lots for 70 Families Since the Fire</h5> 573 <p class="bf1"> 574 575 </p> 576 <p class="item-text"> 577 578 </p> 579 </div> 580 </a> 581 <a class="item" href="/blog/dallas-market-lease-breakdown-2026"> 582 <figure> 583 <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/e9877122-cbac-4aa9-8329-95050c91c16a" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/e9877122-cbac-4aa9-8329-95050c91c16a 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/e9877122-cbac-4aa9-8329-95050c91c16a 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/e9877122-cbac-4aa9-8329-95050c91c16a 1378w" alt="Aerial view of a Dallas apartment community featuring a central lake, walking paths, mature trees, and resort-style amenities surrounded by residential buildings." sizes="(min-width: 769px) 381px, (min-width: 561px) 450px, 100vw" loading="lazy"> 584 </figure> 585 <div class="text-wrap"> 586 <h5 class="lp-h5">Dallas Market Lease Breakdown</h5> 587 <p class="bf1"> 588 589 </p> 590 <p class="item-text"> 591 A Closer Look at Dallas Rental Prices, Hidden Costs, and What Renters Need to Know Before Moving 592 </p> 593 </div> 594 </a> 595 <a class="item" href="/blog/why-amalfi-estates-is-the-leading-independent-brokerage-on-the-westside"> 596 <figure> 597 <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/0bfdf824-5628-4b68-bafe-3d217af0ffa7" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/0bfdf824-5628-4b68-bafe-3d217af0ffa7 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/0bfdf824-5628-4b68-bafe-3d217af0ffa7 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/0bfdf824-5628-4b68-bafe-3d217af0ffa7 1860w" alt="" sizes="(min-width: 769px) 381px, (min-width: 561px) 450px, 100vw" loading="lazy"> 598 </figure> 599 <div class="text-wrap"> 600 <h5 class="lp-h5">Why Amalfi Estates Is the Leading Independent Brokerage on the Westside</h5> 601 <p class="bf1"> 602 603 </p> 604 <p class="item-text"> 605 Trusted Experts in the Palisades, Santa Monica, and Brentwood Real Estate Markets 606 </p> 607 </div> 608 </a> 609 </div> 610 <div class="lp-pagination pagination-container pagination-style-1"></div> 611 </div> 612</div> 613 614</section> 615<section id="section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99" class="solid-section is-font-color-light is-background-color-light" data-el-id="19e4a145-7cee-4338-8873-657ce2636b4c"> 616 617<div class="newsletter-signup lp-vertical-paddings redesign"> 618 <div class="lp-container-custom"> 619 <form data-type="contact-form" class="newsletter-signup__form"> 620 <div class="newsletter-signup__form-container"> 621 <div class="lp-title-group"> 622 <h2 class="lp-h2">Receive market updates in your inbox.</h2> 623 624 </div> 625 <div class="newsletter-signup-form"> 626 <div class="newsletter-signup__inputs-container"> 627 <input id="section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99__newsSignFirstName" type="text" name="name" class="lp-in
627put lp-input--light newsletter-signup__form-item" required placeholder="Name"> 628 629 <input id="section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99__newsSignEmail" type="email" name="email" class="lp-input lp-input--light newsletter-signup__form-item" required placeholder="Email" pattern="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+"> 630 631 <button type="submit" class="lp-btn lp-btn--filled lp-btn--light submit button-style-2 newsletter-signup__form-item lp-btn--mob-full-width">Submit</button> 632 633 <div class="lp-h-pot"> 634 <input id="section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99__newsSignMiddleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 635 </div> 636 637 <input style="display: none;" type="text" name="source" value="NEWSLETTER_SIGNUP" /> 638 </div> 639 </div> 640 <div class="lp-disclaimer"> <label style='display: none;' for='section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99-termsAccepted'>Opt In/Disclaimer Consent:</label> 641 <label class='lp-tcr-content'> 642 <span class='lp-tcr-checkbox'> 643 <input 644 type='checkbox' 645 id='section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99-termsAccepted' 646 name='termsAccepted' 647 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 648 oninput="this.setCustomValidity('')" 649 required 650 /></span> 651 <span class='lp-tcr-message'> 652 653 I agree to be contacted by 654 Amalfi Estates- 655 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 656 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 657 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 658 </span> 659 </label> 660 661</div> 662 </div> 663 <div class="success-block"> 664 <div class="lp-title-group"> 665 <h2 class="lp-h2">Thank You</h2> 666 <div class="lp-text--subtitle">You have successfully been added to our Newsletter. Stay tuned for the latest updates sent straight to your inbox!</div> 667 </div> 668 </div> 669 </form> 670 671 </div> 672</div> 673</section> 674 675 <div id="modals" class="modals"></div> 676 <footer id="global-footer" class="is-font-color-dark is-background-color-light" data-el-id="f3892c1c-f128-483a-b998-cb1ea48c25c1"> 677 <div class="site-footer"> 678 679 <div class="site-footer__bottom"> 680 <div class="lp-container"> 681 682 <div class="site-footer__logo-bar"> 683 <div class="site-footer__logo-container"> 684 <img src="https://media-production.lp-cdn.com/media/ca0c1987-6fa6-4db4-bfcc-be6b3241a014" alt=""> 685 </div> 686 <div class="site-footer__logo-container"> 687 688 </div> 689 </div> 690 691 <div class="site-footer__info"> 692 <div class="site-footer__col"> 693 <h5 class="lp-h5 site-footer__col-title">Amalfi Estates</h5> 694 695 <div class="site-footer__col-content lp-a"><p><a href="tel:3105734245">310.573.4245</a><br /><a href="/cdn-cgi/l/email-protection#b8d1d6ded7f8d9d5d9d4ded1ddcbccd9ccddcb96dbd7d5"><span class="__cf_email__" data-cfemail="bbd2d5ddd4fbdad6dad7ddd2dec8cfdacfdec895d8d4d6">[email protected]</span></a><br /><br />DRE# 02014153</p></div> 696 </div> 697 698 699 <div class="site-footer__col"> 700 <h5 class="lp-h5 site-footer__col-title">Address</h5> 701 702 <div class="site-footer__col-content lp-a"><p>Pacific Palisades, CA 90272</p></div> 703 </div> 704 705 <div class="site-footer__navigation-wrap"> 706 <ul class="footer-navigation"> 707 <li class="footer-navigation__item"> 708 <a href="/" class="footer-navigation__link">Home</a> 709 </li> 710 <li class="footer-navigation__item"> 711 <a href="/properties" class="footer-navigation__link">Properties</a> 712 </li> 713 <li class="footer-navigation__item"> 714 <a href="/about-us" class="footer-navigation__link">LA Team</a> 715 </li> 716 <li class="footer-navigation__item"> 717 <a href="/communities" class="footer-navigation__link">Communities</a> 718 </li> 719 <li class="footer-navigation__item"> 720 <a href="/testimonials" class="footer-navigation__link">Testimonials</a> 721 </li> 722 <li class="footer-navigation__item"> 723 <a href="/contact" class="footer-navigation__link">Contact Us</a> 724 </li> 725 </ul> 726 727 <ul class="lp-socials social_icons-style-1 site-footer__socials socials"> 728 729 <li> 730 <a 731 href="https://twitter.com/amalfiestates?lang=en" 732 class="lp-socials__link socials__item" 733 data-wow-delay="0s" 734 target="_blank" 735 aria-label="TWITTER" 736 >
737 <span class="lp-i lp-i--twitter" aria-hidden="true"></span> 738 </a> 739 </li> 740 <li> 741 <a 742 href="https://www.facebook.com/Amalfiestates/" 743 class="lp-socials__link socials__item" 744 data-wow-delay="0.1s" 745 target="_blank" 746 aria-label="FACEBOOK" 747 > 748 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 749 </a> 750 </li> 751 <li> 752 <a 753 href="https://www.instagram.com/amalfiestates/?hl=en" 754 class="lp-socials__link socials__item" 755 data-wow-delay="0.2s" 756 target="_blank" 757 aria-label="INSTAGRAM" 758 > 759 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 760 </a> 761 </li> 762 <li> 763 <a 764 href="https://www.youtube.com/channel/UCF0oITsPGXTiEc3bDRZWBwQ" 765 class="lp-socials__link socials__item" 766 data-wow-delay="0.3s" 767 target="_blank" 768 aria-label="YOUTUBE" 769 > 770 <span class="lp-i lp-i--youtube" aria-hidden="true"></span> 771 </a> 772 </li> 773 <li> 774 <a 775 href="https://www.linkedin.com/company/amalfi-estates/" 776 class="lp-socials__link socials__item" 777 data-wow-delay="0.4s" 778 target="_blank" 779 aria-label="LINKEDIN" 780 > 781 <span class="lp-i lp-i--linkedin" aria-hidden="true"></span> 782 </a> 783 </li> 784 <li> 785 <a 786 href="https://www.yelp.com/biz/amalfi-estates-pacific-palisades" 787 class="lp-socials__link socials__item" 788 data-wow-delay="0.5s" 789 target="_blank" 790 aria-label="YELP" 791 > 792 <span class="lp-i lp-i--yelp" aria-hidden="true"></span> 793 </a> 794 </li> 795 </ul> 796 797 </div> 798 </div> 799 800 <div class="site-footer__disclaimer"><p style="font-size: 12px;"><a class="link" href="https://d1e1jt2fj4r8r.cloudfront.net/b8947b11-20b5-447c-afdb-bd8d92c8512d/BwYS9e60W/Texas%20ConsumerProtection%20Notice.pdf" target="_blank" rel="noopener">Texas Real Estate Commission Consumer Protection Notice</a><br><a class="link" href="https://d1e1jt2fj4r8r.cloudfront.net/d2a359c0-d879-4840-938b-f0bb8351cc6c/c200b248-cd79-4476-8223-aab98ac83906/Amalfi%20Estates.pdf" target="_blank" rel="noopener">Texas Real Estate Commission Information About Brokerage Services</a></p> 801<p style="font-size: 12px;">All information is deemed reliable but not guaranteed and should be independently reviewed and verified.</p> 802<p><img style="width: 100px; height: auto;
802 margin-top: 1px;" src="https://media-production.lp-cdn.com/media/533e5da4-0053-4b56-898c-070fe2b0e5e5" alt=""> <img style="width: 120px; margin-top: 1px;" src="https://media-production.lp-cdn.com/media/b9e3ed9a-4d2b-4f29-90d3-3b0dd3d0e78f" alt=""></p></div> 803 804 <div class="site-footer__copy"> 805 <div class="lp-a site-footer__copy-lp"> 806 <span>Powered by</span> 807 <a href="https://www.luxurypresence.com/" class="" target="_blank">Luxury Presence</a> 808 </div> 809 <div>Copyright © <span class="auto-year-update">2026</span> | <a href="/terms-and-conditions">Privacy Policy</a></div> 810 </div> 811 812 </div> 813 </div> 814 815 816 817</div> 818 819 </footer> 820 821 <div id="modal-global-contact-us" class="modal " 822 data-el-id="" 823 style="background-color: ;" 824 > 825 <div class="modal-content"> 826 <div class="contact-form"> 827 <div class="contact-form__close close"></div> 828 <div class="contact-form__container"> 829 830 <form class="contact-form__form" data-type="contact-form" style="color: #FFFFFF; background: rgba(119, 154, 208, 1); fill: #FFFFFF;"> 831 <h5 class="lp-h5 contact-form__title1">Get in Touch</h5> 832 <div class="input-container"> 833 <input id="-cmp-name" name="name" type="text" class="lp-input lp-input--light contact-form__input" placeholder="Name" required> 834 <span class="input-icon"></span> 835 </div> 836 837 <div class="input-container"> 838 <input id="-cmp-email" name="email" type="email" class="lp-input lp-input--light contact-form__input" placeholder="Email" required pattern="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+"> 839 <span class="input-icon"></span> 840 </div> 841 842 <div class="input-container"> 843 <input id="-cmp-phone" name="phone" type="tel" class="lp-input lp-input--light contact-form__input" placeholder="Phone" required> 844 <span class="input-icon"></span> 845 </div> 846 847 <div class="input-container"> 848 <textarea id="-cmp-contactMessage" placeholder="Message" name="message" required type="text" class="lp-input lp-input--light contact-form__input"></textarea> 849 <span class="input-icon"></span> 850 </div> 851 852 <div class="h-pot"> 853 <label for="-cmp-middleName">Middle Name</label> 854 <input id="-cmp-middleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 855 </div> 856 857 <div class="lp-disclaimer"> <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label> 858 <label class='lp-tcr-content'> 859 <span class='lp-tcr-checkbox'> 860 <input 861 type='checkbox' 862 id='-termsAccepted' 863 name='termsAccepted' 864 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 865 oninput="this.setCustomValidity('')" 866 required 867 /></span> 868 <span class='lp-tcr-message'> 869 870 I agree to be contacted by 871 Amalfi Estates- 872 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 873 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 874 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 875 </span> 876 </label> 877 878 </div> 879 880 <input type="hidden" name="source" value="CONTACT_INQUIRY"> 881 <button class="contact-form__submit btn lp-btn lp-btn--filled button-style-4" type="submit"> 882 883 <span class="sync-icon lp-i--spin"> 884 <svg width="20" height="15" viewBox="0 0 20 15" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> 885 <path d="M16.3636 3.66667L12.7273 7.33333H15.4545C15.4545 10.3675 13.0091 12.8333 10 12.8333C9.08182 12.8333 8.20909 12.6042 7.45455 12.1917L6.12727 13.53C7.24545 14.245 8.57273 14.6667 10 14.6667C14.0182 14.6667 17.2727 11.385 17.2727 7.33333H20L16.3636 3.66667ZM4.54545 7.33333C4.54545 4.29917 6.99091 1.83333 10 1.83333C10.9182 1.83333 11.7909 2.0625 12.5455 2.475L13.8727 1.13667C12.7545 0.421666 11.4273 0 10 0C5.98182 0 2.72727 3.28167 2.72727 7.33333H0L3.63636 11L7.27273 7.33333H4.54545Z" /> 886 </svg> 887 </span> 888
889 <span class="success-icon"> 890 <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> 891 <path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM10 18C5.59 18 2 14.41 2 10C2 5.59 5.59 2 10 2C14.41 2 18 5.59 18 10C18 14.41 14.41 18 10 18ZM14.59 5.58L8 12.17L5.41 9.59L4 11L8 15L16 7L14.59 5.58Z" /> 892 </svg> 893 </span> 894 895 Submit<span class="success-text">ted</span> 896 </button> 897 </form> 898 899 <div class="contact-form__details"> 900 <h5 class="lp-h5 contact-form__title2">Contact Details</h5> 901 <div class="company"> 902 <div class="company_contact lp-a"> 903 <p><strong>Amalfi Estates</strong></p> 904 <p><a href="tel:3105734245">(310) 573-4245</a></p> 905 <p><a href="/cdn-cgi/l/email-protection#365f58505976575b575a505f534542574253451855595b"> <span class="__cf_email__" data-cfemail="7e171018113e1f131f1218171b0d0a1f0a1b0d501d1113">[email protected]</span></a></p> 906 <p><br /><br /></p> 907 <p>984 Monument St., #105<br />Pacific Palisades, CA 90272</p> 908 </div> 909 </div> 910 911 <div class="socials"> 912 <ul class="lp-socials social_icons-style-1 lp-socials socials--theme-1"> 913 914 <li> 915 <a 916 href="https://twitter.com/amalfiestates?lang=en" 917 class="lp-socials__link lp-socials__link" 918 data-wow-delay="0s" 919 target="_blank" 920 aria-label="TWITTER" 921 > 922 <span class="lp-i lp-i--twitter" aria-hidden="true"></span> 923 </a> 924 </li> 925 <li> 926 <a 927 href="https://www.facebook.com/Amalfiestates/" 928 class="lp-socials__link lp-socials__link" 929 data-wow-delay="0.1s" 930 target="_blank" 931 aria-label="FACEBOOK" 932 > 933 <span class="lp-i lp-i--facebook" aria-hidden="true"></span> 934 </a> 935 </li> 936 <li> 937 <a 938 href="https://www.instagram.com/amalfiestates/?hl=en" 939 class="lp-socials__link lp-socials__link" 940 data-wow-delay="0.2s" 941 target="_blank" 942 aria-label="INSTAGRAM" 943 > 944 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 945 </a> 946 </li> 947 <li> 948 <a 949 href="https://www.youtube.com/channel/UCF0oITsPGXTiEc3bDRZWBwQ" 950 class="lp-socials__link lp-socials__link" 951 data-wow-delay="0.3s" 952 target="_blank" 953 aria-label="YOUTUBE" 954 > 955 <span class="lp-i lp-i--youtube" aria-hidden="true"></span> 956 </a> 957 </li> 958 <li> 959 <a 960 href="https://www.linkedin.com/company/amalfi-estates/" 961 class="lp-socials__link lp-socials__link" 962 data-wow-delay="0.4s" 963 target="_blank" 964 aria-label="LINKEDIN" 965 >
966 <span class="lp-i lp-i--linkedin" aria-hidden="true"></span> 967 </a> 968 </li> 969 <li> 970 <a 971 href="https://www.yelp.com/biz/amalfi-estates-pacific-palisades" 972 class="lp-socials__link lp-socials__link" 973 data-wow-delay="0.5s" 974 target="_blank" 975 aria-label="YELP" 976 > 977 <span class="lp-i lp-i--yelp" aria-hidden="true"></span> 978 </a> 979 </li> 980 </ul> </div> 981 </div> 982 </div> 983 </div> 984 <!-- version 1 --> 985 </div> 986 <button class="close lp-close" type="button" aria-label="close modal"> 987 <span class="lp-close-icon" aria-hidden="true"></span> 988 </button> 989 </div> 990 <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;"> 991 <style> 992 #qualifying-questions-modal .custom-select-toggle { 993 border: 1px solid #848484; 994 border-radius: 8px; 995 padding: 12px 16px; 996 } 997 998 #qualifying-questions-modal .custom-select-toggle.is-placeholder { 999 color: #848484; 1000 } 1001 1002 #qualifying-questions-modal #qualifying-questions-modal-phoneNumber::placeholder { 1003 color: #848484; 1004 opacity: 1; 1005 } 1006 1007 #qualifying-questions-modal .disclaimer-more { 1008 display: none; 1009 } 1010 1011 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-more { 1012 display: inline; 1013 } 1014 1015 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-ellipsis { 1016 display: none; 1017 } 1018 </style>
vendor: 119 bytes, lines 1018-1019
1018 1019 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1019<script> 1020 function toggleDisclaimerQualifyingQuestionsModal() { 1021 const disclaimerText = document.getElementById('qualifying-questions-modal-disclaimer-text'); 1022 const toggleButton = document.getElementById('qualifying-questions-modal-toggle-disclaimer'); 1023 1024 if (disclaimerText.classList.contains('collapsed')) { 1025 disclaimerText.classList.remove('collapsed'); 1026 toggleButton.textContent = 'Read less'; 1027 toggleButton.setAttribute('aria-expanded', 'true'); 1028 } else { 1029 disclaimerText.classList.add('collapsed'); 1030 toggleButton.textContent = 'Read more'; 1031 toggleButton.setAttribute('aria-expanded', 'false'); 1032 } 1033 } 1034 </script>
1034 1035 <div style="max-width: 400px; width: 95%; margin: 0 auto;"> 1036 <div style="background: #fff; border: none; border-radius: 16px; color: black; box-shadow: none; position: relative;"> 1037 <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;"> 1038 <span aria-hidden="true">×</span> 1039 </button> 1040 <div style="padding: 40px 30px 32px;"> 1041 <div style="text-align: left; margin-bottom: 32px;"> 1042 <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;"> 1043 Thanks, please provide more information to help serve you 1044 </h2> 1045 </div> 1046 <form id="qualifying-questions-modal-form" data-type="contact-form"> 1047 <input type="hidden" name="source" value="PROFILE_UPDATE" /> 1048 <input type="hidden" name="email" value="" id="qualifying-questions-modal-email" /> 1049 <input type="hidden" name="triggerSource" id="qualifying-questions-modal-triggerSource" value="" /> 1050 <label for="qualifying-questions-modal-email" style="display:none;"> 1051 Email 1052 </label> 1053 <label for="qualifying-questions-modal-triggerSource" style="display:none;"> 1054 Trigger Source 1055 </label> 1056 1057 <div style="margin-bottom: 20px;"> 1058 <label for="qualifying-questions-modal-phoneNumber" style="display:none;"> 1059 Phone Number 1060 </label> 1061 <input 1062 type="tel" 1063 id="qualifying-questions-modal-phoneNumber" 1064 name="phoneNumber" 1065 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;" 1066 pattern="^\+?1?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$" 1067 required 1068 placeholder="Phone" 1069 aria-label="Phone Number" 1070 inputmode="tel" 1071 autocomplete="tel" 1072 onfocus="this.style.borderColor='black';" 1073 onblur="this.style.borderColor='#848484';" 1074 /> 1075 </div> 1076 1077 <div style="margin-bottom: 20px;"> 1078 <label for="qualifying-questions-modal-interest" style="display:none;"> 1079 Interest 1080 </label> 1081 <select 1082 id="qualifying-questions-modal-interest" 1083 name="interest" 1084 required 1085 data-label="Interest" 1086 aria-label="Interest" 1087 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;" 1088 onfocus="this.style.borderColor='black'; this.style.color='black';" 1089 onblur="this.style.borderColor='#848484'; if(this.value === '') this.style.color='#848484'; else this.style.color='black';" 1090 > 1091 <option value="" style="background: #fff; color: #848484;" disabled selected>Interested in...</option> 1092 <option value="Selling & Buying" style="background: #fff; color: black;">Selling & Buying</option> 1093 <option value="Selling" style="background: #fff; color: black;">Selling</option> 1094 <option value="Buying" style="background: #fff; color: black;">Buying</option> 1095 <option value="Renting" style="background: #fff; color: black;">Renting</option> 1096 <option value="Other" style="background: #fff; color: black;">Other</option> 1097 </select> 1098 </div> 1099 1100 <div style="margin-bottom: 32px; font-size: 12px; line-height: 1.2;"> 1101 <label style='display: none;' for='qualifying-questions-modal-qualifying-questions-termsAccepted'>Opt In/Disclaimer Consent:</label> 1102 <label class='lp-tcr-content'>
1103 <span class='lp-tcr-checkbox'> 1104 <input 1105 type='checkbox' 1106 id='qualifying-questions-modal-qualifying-questions-termsAccepted' 1107 name='termsAccepted' 1108 aria-describedby='qualifying-questions-modal-disclaimer-text' 1109 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 1110 oninput="this.setCustomValidity('')" 1111 required 1112 /></span> 1113 <span class='lp-tcr-message'> 1114 <div id="qualifying-questions-modal-disclaimer-text" class="collapsed" style="color: #848484;"> 1115 1116 I agree to be contacted by 1117 <strong>Amalfi Estates-</strong> 1118 via call, email, and text <span class="disclaimer-more">for real estate services. 1119 To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 1120 You can also click the unsubscribe link in the emails. 1121 Message and data rates may apply. Message frequency may vary.</span> 1122 <span class="disclaimer-ellipsis">...</span> 1123 <a href='/terms-and-conditions' target='_blank' rel='noopener noreferrer' style='text-decoration: underline;'>Privacy Policy</a>. 1124 </div> 1125 <button 1126 id="qualifying-questions-modal-toggle-disclaimer" 1127 type="button" 1128 style="background: none; border: none; color: #848484; font-size: inherit; font-weight: bold; padding: 0; margin-top: 4px; cursor: pointer;" 1129 aria-expanded="false" 1130 onclick="toggleDisclaimerQualifyingQuestionsModal()" 1131 > 1132 Read more 1133 </button> 1134 </span> 1135 </label> 1136 </div> 1137 1138 <div> 1139 <button 1140 type="submit" 1141 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;" 1142 onmouseover="this.style.background='transparent'; this.style.color='black';" 1143 onmouseout="this.style.background='black'; this.style.color='white';" 1144 > 1145 Submit 1146 </button> 1147 </div> 1148 </form> 1149 </div> 1150 </div> 1151 </div> 1152 </div> 1153 1154
1154<script> 1155 (function() { 1156 var lazyVideos = [].slice.call(document.querySelectorAll("video.lazy")); 1157 1158 if ("IntersectionObserver" in window && lazyVideos.length > 0) { 1159 var lazyVideoObserver = new IntersectionObserver(function(entries, observer) { 1160 entries.forEach(function(video) { 1161 if (video.isIntersecting) { 1162 for (var source in video.target.children) { 1163 var videoSource = video.target.children[source]; 1164 if (typeof videoSource.tagName === "string" && videoSource.tagName === "SOURCE") { 1165 videoSource.src = videoSource.dataset.src; 1166 } 1167 } 1168 1169 video.target.load(); 1170 video.target.classList.remove("lazy"); 1171 lazyVideoObserver.unobserve(video.target); 1172 } 1173 }); 1174 }); 1175 1176 lazyVideos.forEach(function(lazyVideo) { 1177 lazyVideoObserver.observe(lazyVideo); 1178 }); 1179 } 1180 })(); 1181 </script>
1181 1182 1183 <!-- Global site tag (gtag.js) - Google Analytics --> 1184
1184<script defer src="https://www.googletagmanager.com/gtag/js"></script>
1184 1185 1186 <!-- Google Tag Manager --> 1187
1187<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1188 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1189 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src= 1190 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1191 })(window,document,'script','dataLayer','GTM-PSHL83P');</script>
1191 1192 <!-- End Google Tag Manager --> 1193 <!-- Google Tag Manager --> 1194
1194<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1195 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1196 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src= 1197 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1198 })(window,document,'script','dataLayer','GTM-NRB4D5T');</script>
1198 1199 <!-- End Google Tag Manager --> 1200 <!-- Google Tag Manager --> 1201
1201<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1202 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1203 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src= 1204 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1205 })(window,document,'script','dataLayer','GTM-T9SFQGHZ');</script>
1205 1206 <!-- End Google Tag Manager --> 1207 1208 1209 <!-- LP Tracker (divolte.js) - LP Divolte --> 1210
1210<script>window.divolteLp=window.divolteLp||function(){(divolteLp.q=divolteLp.q||[]).push(arguments)}</script>
1210 1211 <!-- LP Tracker (eventBus) - LP EventBus --> 1212
1212<script>window.eventBusLp=window.eventBusLp||function(){(eventBusLp.q=eventBusLp.q||[]).push(arguments)}</script>
1212 1213 1214
1214<script> 1215 window.dataLayer = window.dataLayer || []; 1216 document.sendGoogleTagManagerEvent = function() { 1217 /* Honor GPC-enabled browsers and prevent GTM event if GPC is enabled. More details: https://global-privacy-control.glitch.me/ */ 1218 if (window.navigator.globalPrivacyControl) { 1219 return; 1220 } 1221 1222 dataLayer.push(arguments); 1223 } 1224 1225 document.sendGoogleTagManagerEvent('js', new Date()); 1226 document.sendGoogleTagManagerEvent('config', 'G-LRC2PKYE4V', { page: location.pathname, location: location.href }); 1227 document.sendGoogleTagManagerEvent('config', 'G-SGVBV9SDQX', { page: location.pathname, location: location.href }); 1228 document.sendGoogleAnalyticsEvent = function(googleEvent) { 1229 document.sendGoogleTagManagerEvent('event', googleEvent.eventAction || googleEvent.hitType, { 1230 event_category: googleEvent.eventCategory, 1231 event_label: googleEvent.eventLabel, 1232 value: googleEvent.eventValue, 1233 page: googleEvent.page, 1234 location: googleEvent.location 1235 }) 1236 }; 1237 1238 document.addEventListener("DOMContentLoaded", function() { 1239 (function() { 1240 //If the page has an element with ID of auto-year-update the element will be populated with the current year. 1241 var date = new Date(); 1242 var elements = document.getElementsByClassName('auto-year-update'); 1243 var i; 1244 for (i = 0; i < elements.length; i++) { 1245 elements[i].innerText = date.getFullYear(); 1246 } 1247 })(); 1248 if (window.divolteLp) { 1249 window.divolteLp('sendLpPageView', {}); 1250 } 1251 if (window.eventBusLp) { 1252 window.eventBusLp('sendLpPageView', {}); 1253 } 1254 }); 1255 </script>
1255 1256 1257 <!-- Facebook Pixel Code --> 1258
1258<script type="text/plain" data-consent-category="advertising">
vendor: 575 bytes, lines 1258-1267
1258 1259 !function(f,b,e,v,n,t,s) 1260 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 1261 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 1262 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 1263 n.queue=[];t=b.createElement(e);t.async=!0; 1264 t.src=v;s=b.getElementsByTagName(e)[0]; 1265 s.parentNode.insertBefore(t,s)}(window, document,'script', 1266 'https://connect.facebook.net/en_US/fbevents.js'); 1267 fbq('init', '
1267613549979560135
vendor: 58 bytes, lines 1267-1269
1267'); 1268 fbq('track', 'PageView'); 1269
1269</script>
1269 1270 <noscript><img height="1" width="1" style="display:none" 1271 src="https://www.facebook.com/tr?id=613549979560135&ev=PageView&noscript=1" 1272 /></noscript> 1273 <!-- End Facebook Pixel Code --> 1274 1275
1275<script> 1276 // Function to dynamically load a script 1277 function loadScript(url, callback) { 1278 var script = document.createElement('script'); 1279 script.type = 'text/javascript'; 1280 script.src = url; 1281 script.defer = true; 1282 script.async = true; 1283 script.onload = callback; 1284 document.head.appendChild(script); 1285 } 1286 1287 // Function to dynamically load CSS file 1288 function loadCSS(url) { 1289 var link = document.createElement("link"); 1290 link.rel = "stylesheet"; 1291 link.href = url; 1292 document.head.appendChild(link); 1293 } 1294 1295 // Global methods / variables that can be accessed by element js 1296 window.luxuryPresence = { 1297 libs: { 1298 loadJs: loadScript, 1299 loadCss: loadCSS, 1300 jsLibsMap: { 1301 paroller: { 1302 jsSrc: 'https://d1e1jt2fj4r8r.cloudfront.net/javascript/jquery.paroller.min.js', 1303 isLoaded: false, 1304 }, 1305 ionRangeSlider: { 1306 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js', 1307 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css', 1308 isLoaded: false, 1309 requires: ['jquery'], 1310 }, 1311 splide: { 1312 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/js/splide.min.js', 1313 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/css/splide-core.min.css', 1314 isLoaded: false, 1315 }, 1316 wow: { 1317 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js', 1318 isLoaded: false, 1319 }, 1320 jquery: { 1321 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js', 1322 isLoaded: false, 1323 }, 1324 slick: { 1325 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js', 1326 isLoaded: false, 1327 requires: ['jquery'], 1328 }, 1329 libphonenumber: { 1330 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/libphonenumber-js/1.11.8/libphonenumber-js.min.js', 1331 isLoaded: false, 1332 }, 1333 }, 1334 }, 1335 }; 1336 </script>
1336 1337
1337<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>
1337 1338
1338<script defer src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.8/handlebars.min.js"></script>
1338 1339
1339<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/handlebars-intl.min.js"></script>
1339 1340
1340<script defer src="https://cdnjs.cloudflare.com/ajax/libs/superagent/4.1.0/superagent.min.js"></script>
1340 1341
1341<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>
1341 1342
1342<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>
1342 1343
1343<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>
1343 1344 1345 <!-- GOOGLE TRANSLATE SCRIPT --> 1346
1346<script> 1347 function googleTranslateElementInit() { 1348 // list of languages can be overridden by setting window.customLanguages in the head JS. example `window.customLanguages = 'en,de,fr,ro,sk,pl'` 1349 // Language codes can be taken from here https://cloud.google.com/translate/docs/languages 1350 const DEFAULT_LANGUAGES = 'en,es,zh-CN,zh-TW,tl,vi,ar,ko,ru,de,fr,hi,pt'; 1351 document.querySelectorAll('[data-type="TRANSLATE"]').forEach(function(translate){ 1352 translate.innerText = ''; 1353 new google.translate.TranslateElement({ 1354 pageLanguage: 'en', 1355 layout: google.translate.TranslateElement.InlineLayout.SIMPLE, 1356 includedLanguages: window.customLanguages || DEFAULT_LANGUAGES, 1357 }, translate); 1358 }); 1359 } 1360 </script>
1360 1361
1361<script defer src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
1361 1362
1362<script defer src="https://accounts.google.com/gsi/intermediate"></script>
1362 1363 1364 <!-- GOOGLE TRANSLATE SCRIPT END--> 1365
1365<script> 1366 1367 // UI helpers 1368 (function () { 1369 1370 function getSideMenu () { 1371 return document.querySelector('body > div.sidemenu'); 1372 } 1373 1374 function sideMenuHide (instant) { 1375 var sideMenu = getSideMenu(); 1376 if (!sideMenu || !sideMenu.classList.contains('visible')) { 1377 return; 1378 } 1379 sideMenu.classList.remove('visible'); 1380 sideMenu.dispatchEvent(new CustomEvent('lpui-hide', { detail: { instant: !!instant } })); 1381 window.dispatchEvent(new CustomEvent('lpui-sidemenu-hide', { detail: {instant: !!instant} })); 1382 } 1383 1384 function sideMenuShow () { 1385 var sideMenu = getSideMenu(); 1386 if (!sideMenu || sideMenu.classList.contains('visible')) { 1387 return; 1388 } 1389 sideMenu.classList.add('visible'); 1390 sideMenu.dispatchEvent(new Event('lpui-show')); 1391 window.dispatchEvent(new Event('lpui-sidemenu-show')); 1392 } 1393 1394 function sideMenuToggle () { 1395 var sideMenu = getSideMenu(); 1396 if (!sideMenu) { 1397 return; 1398 } 1399 var isSideMenuVisible = sideMenu.classList.contains('visible'); 1400 if (isSideMenuVisible) { 1401 sideMenuHide(); 1402 } else { 1403 sideMenuShow(); 1404 } 1405 } 1406 1407 var scrollLockRequests = {}; 1408 window.__debug_scrollLockRequests = scrollLockRequests; 1409 var hideScrollStyles = ''+ 1410 'body {'+ 1411 'overflow: hidden;' + 1412 '}'; 1413 var hideScrollId = 'hide-body-scroll-style'; 1414 1415 function scrollLock () { 1416 var style = document.createElement('style'); 1417 style.id = hideScrollId; 1418 style.textContent = hideScrollStyles; 1419 document.head.appendChild(style); 1420 window.dispatchEvent(new Event('lpui-scroll-locked')); 1421 } 1422 1423 function scrollUnlock () { 1424 document.getElementById(hideScrollId)?.remove(); 1425 window.dispatchEvent(new Event('lpui-scroll-unlocked')); 1426 } 1427 1428 function requestScrollLock (lockId) { 1429 var wasLocked = Object.keys(scrollLockRequests).length > 0; 1430 scrollLockRequests[lockId || '__anonymous_lock'] = true; 1431 if (!wasLocked) { 1432 scrollLock(); 1433 } 1434 } 1435 1436 function releaseScrollLock (lockId) { 1437 if (lockId) { 1438 delete scrollLockRequests[lockId]; 1439 if (!Object.keys(scrollLockRequests).length) { 1440 scrollUnlock(); 1441 } 1442 } else { 1443 scrollLockRequests = {}; 1444 window.__debug_scrollLockRequests = scrollLockRequests; 1445 scrollUnlock(); 1446 } 1447 } 1448 1449 function showModal (modalId, options) { 1450 var modal = document.getElementById(modalId); 1451 if (!modal) { 1452 return; 1453 } 1454 1455 if (!modal.classList.contains('visible')) { 1456 modal.classList.add('visible'); 1457 if (options && options.scrollLock) { 1458 window.lpUI.requestScrollLock(modalId); 1459 } 1460 modal.dispatchEvent(new Event('lpui-show')); 1461 window.dispatchEvent(new CustomEvent('lpui-modal-show', { detail: { id: modalId } })); 1462 } 1463 1464 const visibleModals = document.querySelectorAll('.modal.visible'); 1465 1466 if (visibleModals.length > 1) { 1467 1468 const maxZIndex = Array.from(visibleModals).reduce((maxZIndex, modal) => { 1469 const zIndex = window.getComputedStyle(modal).zIndex; 1470 const parsedZIndex = zIndex !== 'auto' ? parseInt(zIndex) : 0; 1471 return Math.max(maxZIndex, parsedZIndex); 1472 }, 0); 1473 1474 modal.style.zIndex = maxZIndex + 1; 1475 } 1476 1477 } 1478 1479 function _hideModal (modalEl) { 1480 if (!modalEl) { 1481 return; 1482 } 1483 if (!modalEl.classList.contains('visible')) { 1484 return; 1485 } 1486 modalEl.classList.remove('visible'); 1487 modalEl.style.zIndex = '';
1488 modalEl.dispatchEvent(new Event('lpui-hide')); 1489 var modalId = modalEl.getAttribute('id'); 1490 if (modalId) { 1491 window.lpUI.releaseScrollLock(modalId); 1492 window.dispatchEvent(new CustomEvent('lpui-modal-hide', { detail: { id: modalId } })); 1493 } 1494 } 1495 1496 function hideModal (modalId) { 1497 _hideModal(document.getElementById(modalId)); 1498 } 1499 1500 function hideClosestModal (el) { 1501 const modal = el?.closest('.modal'); 1502 if (!modal) { 1503 return; 1504 } 1505 if (modal.classList) { 1506 _hideModal(modal); 1507 return; 1508 } 1509 if (modal.length && modal[0].classList) { 1510 _hideModal(modal[0]); 1511 } 1512 } 1513 1514 window.lpUI = { 1515 sideMenuHide: sideMenuHide, 1516 sideMenuShow: sideMenuShow, 1517 sideMenuToggle: sideMenuToggle, 1518 requestScrollLock: requestScrollLock, 1519 releaseScrollLock: releaseScrollLock, 1520 showModal: showModal, 1521 hideModal: hideModal, 1522 hideClosestModal: hideClosestModal 1523 } 1524 })(); 1525 1526 var stringifyPrimitive = function(v) { 1527 switch (typeof v) { 1528 case 'string': 1529 return v; 1530 1531 case 'boolean': 1532 return v ? 'true' : 'false'; 1533 1534 case 'number': 1535 return isFinite(v) ? v : ''; 1536 1537 default: 1538 return ''; 1539 } 1540 }; 1541 1542 function objectToQuerystring(obj, sep, eq, name) { 1543 // https://github.com/Gozala/querystring/blob/master/encode.js 1544 sep = sep || '&'; 1545 eq = eq || '='; 1546 if (obj === null) { 1547 obj = undefined; 1548 } 1549 1550 if (typeof obj === 'object') { 1551 return Object.keys(obj).map(function(k) { 1552 var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; 1553 if (Array.isArray(obj[k])) { 1554 return obj[k].map(function(v) { 1555 return ks + encodeURIComponent(stringifyPrimitive(v)); 1556 }).join(sep); 1557 } else { 1558 return ks + encodeURIComponent(stringifyPrimitive(obj[k])); 1559 } 1560 }).filter(Boolean).join(sep); 1561 1562 } 1563 1564 if (!name) return ''; 1565 return encodeURIComponent(stringifyPrimitive(name)) + eq + 1566 encodeURIComponent(stringifyPrimitive(obj)); 1567 } 1568 1569 function getPath(url, options) { 1570 var parser = document.createElement('a'); 1571 parser.href = url || ''; 1572 var path = parser.pathname || ''; 1573 if (path[0] !== '/') { 1574 // IE does not return path starting with a slash 1575 path = '/' + path; 1576 } 1577 1578 if (options && options.queryString) { 1579 path += parser.search; 1580 } 1581 1582 return path; 1583 } 1584 1585 function getMLSAutocomplete(keyword) { 1586 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 1587 var query = { 1588 kind: 'listings', 1589 query: keyword 1590 }; 1591 1592 return superagent 1593 .get(searchURL) 1594 .query(query) 1595 .then(function(res) { 1596 var data = res.body || []; 1597 // Array of listing_auto_complete documents: id, display_address, city, state, 1598 // price, sold_price, status, status_modified_at, photo_urls (array of URLs). 1599 1600 return data; 1601 }); 1602 } 1603 1604 function getMLSAutocompleteWithFilters(keyword, filters = {}) { 1605 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 1606 1607 return superagent 1608 .get(searchURL) 1609 .query({ kind: 'listings', query: keyword, ...filters }) 1610 .then(function(res) { 1611 // Same response shape as getMLSAutocomplete. 1612 return res.body || []; 1613 }); 1614 } 1615 1616 function makeMlsLink(data) { 1617 // Code Dupe from utils/googlePlace 1618 // mapping of google data type to mls data type 1619 var mapping = { 1620 neighborhood: 'neighborhood', 1621 locality: 'place', 1622 administrative_area_level_2: 'county', 1623 administrative_area_level_1: 'state', 1624 postal_code: 'postalcode', 1625 }; 1626 1627 function _filterTypes(types) { 1628 return types.filter(function(type) { return type !== 'political' }); 1629 } 1630 1631 if (!data || !Object.keys(data).length) { 1632 return '/home-search/listings'; 1633 } 1634 1635 var newData = {};
1636 _filterTypes(data.types).forEach(function(type) { 1637 if (mapping[type]) { 1638 newData.search_type = mapping[type]; 1639 } 1640 }); 1641 newData.omnibox = data.formatted_address; 1642 data.address_components.forEach(function(component) { 1643 _filterTypes(component.types).forEach(function(type) { 1644 if (mapping[type]) { 1645 newData[mapping[type]] = component.long_name; 1646 } 1647 }); 1648 }); 1649 var bounds = data.geometry.bounds; 1650 var convertedData = Object.assign(bounds, newData); 1651 1652 return '/home-search/listings?' + objectToQuerystring(convertedData); 1653 } 1654 1655 function debounce(func, wait) { 1656 let timeout; 1657 return function(...args) { 1658 const context = this; 1659 clearTimeout(timeout); 1660 timeout = setTimeout(() => func.apply(context, args), wait) 1661 } 1662 } 1663 1664 // Global methods / variables that can be accessed by element js 1665 window.luxuryPresence = { 1666 ...window.luxuryPresence, 1667 defaults: { 1668 companyId: 'd2a359c0-d879-4840-938b-f0bb8351cc6c', 1669 apiGatewayUrl: '/api-gw', 1670 routerUrl: '/api-nv', 1671 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\
1671n }\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 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
1671s: 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"}, 1672 propertyPlaceholderImage: {"id":"aef1c560-4b29-400d-a892-3b8882fee312","alt":null,"bytes":10180,"width":1920,"format":"jpg","height":1200,"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/ogsa0qrz7utoi4ekwm2u","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/ogsa0qrz7utoi4ekwm2u","authorUrl":null,"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/ogsa0qrz7utoi4ekwm2u","sourceUrl":null,"xLargeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ogsa0qrz7utoi4ekwm2u","__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/ogsa0qrz7utoi4ekwm2u","description":null,"displayName":"property-logo-11","originalUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ogsa0qrz7utoi4ekwm2u","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/ogsa0qrz7utoi4ekwm2u","originalFileName":"Property logo (11)"} 1673 }, 1674 objectToQuerystring: objectToQuerystring, 1675 getPath: getPath, 1676 getMLSAutocomplete: getMLSAutocomplete, 1677 getMLSAutocompleteWithFilters: getMLSAutocompleteWithFilters, 1678 makeMlsLink: makeMlsLink, 1679 debounce: debounce, 1680 }; 1681 1682 var wowOffset = 100; 1683 </script>
1683 1684
1684<script> 1685 (()=>{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("/")}},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""}},l=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?(e=(e=(e=e.replace(/<\!--(.|[\r\n])*?-\->/g,"")).replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi,"")).replace(/ /g," ")).replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g,""):"",striptagsLineBreaks:e=>e?(e=(e=(e=(e=e.replace(/<\!--(.|[\r\n])*?-\->/g,"")).replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi,"")).replace(/(<br\s*\/?>)|(<\/p\s*>)(?=.*(<\/p\s*>|<br\s*\/?>))/g," ")).replace(/ /g," ")).replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g,""):"",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)=>l(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;
1685i&&(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())),`
1685<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 d=s.salesPrice,c=null;"SOLD"!==s.status&&"Leased"!==s.status&&s.reducedPrice&&(i.reducedClass?c=s.reducedPrice:d=s.reducedPrice);let u="";c&&(u+=`<${i.reducedTag||"span"} class="${i.reducedClass}">${r(c,s.currency,a)}</${i.reducedTag||"span"}>`),d&&(d=r(d,s.currency,a),i.priceTag||i.priceClass?u+=`<${i.priceTag||"span"}${i.priceClass?` class="${i.priceClass}"`:""}>${d}</${i.priceTag||"span"}>`:u+=d);let h=s.leasePrice&&r(s.leasePrice,s.currency,a);if(h){u&&(u+=o);let e=`${h}${l(s.leasePeriod,i)}`;i.leaseTag||i.leaseClass?u+=`<${i.leaseTag||"span"}${i.leaseClass?` class="${i.leaseClass}"`:""}>${e}</${i.leaseTag||"span"}>`:u+=e}
1685return 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 s{constructor(e,t,i){if(this.config=e,this.window=t,this.document=i,!this.destroy)throw Error("Controllers must implement a deconstructor")}}let r="lp_lead_form_conversion_fired";function a(e,t){if(e&&t&&"function"==typeof t.sendGoogleTagManagerEvent&&!function(e){try{return"true"===e.sessionStorage.getItem(r)}catch{return!1}}(e))try{t.sendGoogleTagManagerEvent("event","generate_lead");try{e.sessionStorage.setItem(r,"true")}catch{}}catch{}}function o(e){return!!e&&(!!e.expired||Date.now()>=e.expiresAt)}let n="/api/v1/home-valuation";class l extends s{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
1685ontact 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
1685ourceResource,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 n=await a.text(),l=this._parseResponsePayload(n);if(!a.ok)throw this._createResponseError(l,a.status);if(l&&"success"===l.status&&l.redirectUrl){if(o(i))return l;if(!this._isSafeRedirectUrl(l.redirectUrl))return console.error("Home valuation: refusing redirect to unsupported protocol"),l;return this.window.location.href=l.redirectUrl,{redirected:!0,url:l.redirectUrl}}return l}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),l=`${t}${n}`,d=this._buildHomeValuationData(e,r,a,o),c=await this._submitLead(l,d,e.deadline);return this._logLeadEvent("home_valuation_submission_success",e),c}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()}${n}`;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 d="middleName",c="redirect-pending",u=["name","firstName","lastName",d,"email","phone","phoneNumber","source","message","mlsId","sourceUrl"],h="lp_map_key_failed",p="oauthSuccess",m={cookieyes:{eventName:"cookieyes_consent_update",hasAnalyticsConsent:e=>(function(e){let t=e.cookie.match(/cookieyes-consent=([^;
1685]+)/);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 g(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function y(e,t){t.forEach(t=>{let i=e[t];Array.isArray(i)&&0===i.length&&delete e[t]})}function f(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 w(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 v(e){return e&&Array.isArray(e)?e.map(e=>w(e)):e}function b(e){let{region:t}=e;if(!g(t))return e;let{schools:i,pois:s,...r}=t,a={...r,schools:g(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 S(e){return e&&Array.isArray(e)?e.map(e=>b(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 E(e){return e&&Array.isArray(e)?e.map(e=>_(e)):e}function I(e,t){return g(e)?t(e):e}function A(e,t){return Array.isArray(e)?t(e):e}var L={};L=` 1686 query PropertyDisclaimers($input: PropertyDisclaimersInput!) { 1687 propertyDisclaimers(input: $input) { 1688 feedId 1689 listingId 1690 resolvedFromListing 1691 listingCardAttribution 1692 listingDetailCourtesy 1693 listingDetailFooter 1694 logo 1695 } 1696 } 1697`;let $={mlsAttribution:"listingCardAttribution",mlsLogo:"logo",listingDetailCourtesy:"listingDetailCourtesy",listingDetailFooter:"listingDetailFooter"},x=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}}}({}),T=new class extends s{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 >
1697 .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})}}}(x,window,document),k=new class extends s{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=)
1697)|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=` 1698 <div id="modal-${i.id}" class="modal visible"> 1699 <div class="modal-content"> 1700 <div class="lightbox-video"> 1701 <div class="video-player"> 1702 <div class="embed-container"> 1703 ${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>`} 1704 </div> 1705 </div> 1706 </div> 1707 </div> 1708 <button class="close lp-close" type="button" aria-label="close modal"><span class="lp-close-icon" aria-hidden="true"></span></button> 1709 </div> 1710 `;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,{})}}(x,window,document),C=new class extends s{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("")})}}}(x,window,document),M=new class extends s{constructor(e,t,i){super(e,t,i),this.forms=[],this.homeValuationService=new l(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=>!u.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")||"{}",h=s.localStorage.getItem("referrer")||"",p=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:p}},companyId:n,referrer:h,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
1710=>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);a(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(o(i))return null;throw e});try{return await Promise.race([r,s])}finally{clearTimeout(t)}}_showRedirectPending(e){if(e.classList.add(c),e.querySelector(`.${c}__indicator`))return;let t=this.document.createElement("div");t.className=`${c}__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===d)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")}}(x,window,document),P=new class extends s{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(h)}catch(e){return!1}}_setFailureFlag(e){try{e?this.window.sessionStorage.setItem(h,"1"):this.window.sessionStorage.removeItem(h)}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");
1710let 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),""}}}(x,window,document),U=new class extends s{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
1710URIComponent(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}}(x,window,document),N=new class extends s{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=` 1711 <button class="lp-lightbox__close" aria-label="close modal"></button> 1712 <div class="lp-lightbox__content"> 1713 <div class="lp-lightbox__carousel splide" role="group" aria-label="Image Gallery"> 1714 <div class="splide__arrows"> 1715 <button class="splide__arrow splide__arrow--prev lp-lightbox-arrow lp-lightbox-arrow--prev"></button> 1716 <button class="splide__arrow splide__arrow--next lp-lightbox-arrow lp-lightbox-arrow--next"></button> 1717 </div> 1718 <div class="splide__track"> 1719 <ul class="splide__list"></ul> 1720 </div> 1721 </div> 1722 </div> 1723 `,"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
1723h(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=` 1724 <button class="lp-lightbox__close" aria-label="close modal"></button> 1725 <div class="lp-lightbox__content"> 1726 <div class="lp-lightbox__carousel"></div> 1727 </div> 1728 `,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}))}}(x,window,document),R=new class extends s{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",{})}}(x,window,document),B=new class extends s{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"}
1728)),(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",{})}}(x,window,document),D=new class extends s{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(p,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(p);this.window.dispatchEvent(e),a(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"];
1728return 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")}}}(x,window,document),O=new class extends s{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})}}(x,window,document),q=new class extends s{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=` 1729 query { 1730 validSession { 1731 success 1732 } 1733 } 1734 `;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}}(x,window,document),V=new class extends s{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=m[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))}}(x,window,document),F=new class extends s{destroy(){}transformVariables(e,t){let i;return y(i={...t},["testimonialId"]),f(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||"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":y(e,["testimonialIds"]);break;case"agents":case"agentsCount":y(e,["officeId","teamId","developmentId","agentIds","tags"]),f(e,["officeId"],"officeIds"),f(e,["teamId"],"teamIds"),f(e,["developmentId"],"developmentIds");break;case"neighborhoods":case"neighborhoodsCount":y(e,["neighborhoodIds","neighborhoodId"]),f(e,["neighborhoodIds","neighborhoodId"],"neighborhoodId");break;case"developments":case"developmentsCount":y(e,["agentId","neighborhoodIds","neighborhoodId","developmentIds","tag"]),e.agentId&&Array.isArray(e.agentId)&&([e.agentId]=e.agentId),f(e,["neighborhoodIds","neighborhoodId"],"neighborhoodIds");break;case"properties":case"propertiesCount":y(e,["statusIds","statusId","propertyTypeIds","propertyTypeId","propertyId","networkId","propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","
1734spaceTypeIds","addressState","addressCity","backfillProviders","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"]),["propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","spaceTypeIds","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"].forEach(t=>f(e,[t],t)),f(e,["statusIds","statusId"],"propertyStatusId"),e.excludeStatusId&&(e.excludePropertyStatusId=e.excludeStatusId,delete e.excludeStatusId),f(e,["propertyTypeIds","propertyTypeId"],"propertyTypeId"),f(e,["networkId"],"networkId"),f(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":y(e,["categoryIds","categoryId","neighborhoodId"]),void 0!==e.order&&(e.sort=e.order,delete e.order),f(e,["categoryIds","categoryId"],"categoryId");break;case"postCategories":y(e,["categoryId","categoryIds"]),void 0!==e.order&&(e.sort=e.order,delete e.order),f(e,["categoryIds","categoryId"],"categoryId");break;case"pressReleases":case"pressReleasesCount":y(e,["pressReleaseId","categories","propertyId","developmentId","agentId","teamId"]),f(e,["pressReleaseId"],"pressReleaseIds");break;case"offices":case"officesCount":y(e,["officeId","officeIds","tags"]),f(e,["officeId"],"officeIds");break;case"teams":case"teamsCount":y(e,["teamId","teamIds"]),f(e,["teamId"],"teamIds");break;case"pois":y(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?I(t,w):"agents"===e||"agentsCount"===e?A(t,v):"neighborhood"===e?I(t,b):"neighborhoods"===e||"neighborhoodsCount"===e?A(t,S):"development"===e?I(t,_):"developments"===e||"developmentsCount"===e?A(t,E):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[$[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(L),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([]))}}(x,window,document);function j(e,t){if(window.luxuryPresence[e])try{window.luxuryPresence[e].destroy()}catch(e){console.log(e)}window.luxuryPresence[e]=t}j("config",x),j("modals",T),j("buttons",k),j("validation",C),j("contactForms",M),j("mapApiLoader",P),j("pagination",U),j("expandSliders",N),j("divolte",R),j("eventBus",B),j("oauth",D),j("qualifyingQuestionsModal",O),j("session",q),j("consent",V),j("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(){}}),j("routerApi",F),window.luxuryPresence.formatSliderPriceRange=U.formatSliderPriceRange.bind(U),window.luxuryPresence.formatSliderAreaRange=U.formatSliderAreaRange.bind(U),window.luxuryPresence.getSearchFormValues=U.getSearchFormValues.bind(U),window.luxuryPresence.handlebarsHelpersFactory=function(i){return e(t)(i,{isEqual:(e,t)=>e==t})}})(); 1735//# sourceMappingURL=lp-sdk.js.map 1736 1737 </script>
1737 1738 1739
1739<script> 1740 var lpGlobalInitialized = false; 1741 1742 function lpGlobalInit () { 1743 if (lpGlobalInitialized) { 1744 return; 1745 } 1746 lpGlobalInitialized = true; 1747 // Initialize wow animation plugin only according to turbolinks 1748 var wow; 1749 if (window.WOW) { 1750 wow = new WOW({ 1751 animateClass: 'animated', 1752 offset: wowOffset, 1753 live: false, 1754 callback: function(box) {} 1755 }); 1756 } 1757 // Initialize handlebar helpers only once 1758 function handlebarsInit() { 1759 if (!window.Handlebars) { 1760 return; 1761 } 1762 HandlebarsIntl.registerWith(Handlebars); 1763 Handlebars.registerHelper(window.luxuryPresence.handlebarsHelpersFactory(Handlebars)); 1764 } 1765 1766 handlebarsInit(); 1767 1768 var modalContentUrl = "/modals.html"; 1769 const modalsContainer = document.getElementById('modals'); 1770 if (modalsContainer) { 1771 fetch(modalContentUrl).then(function(res) { 1772 if (!res.ok) { 1773 throw new Error(`HTTP error! Status: ${res.status}`); 1774 } 1775 return res.text(); 1776 }).then(function(resultText) { 1777 modalsContainer.innerHTML = resultText; 1778 1779 // now we need to execute all script elements 1780 Array.from(modalsContainer.getElementsByTagName('script')).forEach(function (s) { 1781 const script = document.createElement("script"); 1782 script.text = s.innerHTML; 1783 Array.from(s.attributes).forEach(function (a) { 1784 script.setAttribute(a.name, a.value); 1785 }) 1786 s.parentNode.replaceChild(script, s); 1787 }); 1788 1789 try { 1790 window.luxuryPresence.modals.initialize(window.luxuryPresence._modalIncludes); 1791 window.luxuryPresence.contactForms.initialize({ selector: '#modals' }); 1792 window.luxuryPresence.validation.initialize({ selector: '#modals' }); 1793 window.luxuryPresence.oauth.initialize({ 1794 googleSignOnEnabled: true, 1795 iframe: false }); 1796 } catch (e) { 1797 console.log(e); 1798 } 1799 document.querySelectorAll('.modals > .modal .close').forEach(closeModalBtn => { 1800 closeModalBtn.addEventListener('click', function() { 1801 window.lpUI.hideClosestModal(closeModalBtn); 1802 }); 1803 }); 1804 }).catch((e) => console.log(e)); 1805 } 1806 /* Initialize Luxury Presence SDK */ 1807 try { 1808 window.luxuryPresence.config.setCompany("d2a359c0-d879-4840-938b-f0bb8351cc6c", {}); 1809 window.luxuryPresence.config.setWebsite("2b9f3b9c-8d13-4525-81b1-0e846aa51be2", { 1810 myhomeDashboardEnabled: true, 1811 mlsEnabled: true, 1812 hstValuationRedirectEnabled: true, 1813 hvStepTwoCaptureEnabled: false 1814 }); 1815 const url = new URL(window.location.href); 1816 const shareId = url.searchParams.get('shareId'); 1817 window.luxuryPresence.config.setPage("a4a58f1d-fcc8-41f5-bac1-3c42e699b925", { 1818 sourceResource: "", 1819 pageElementId: "", 1820 pageQueryVariables: {}, 1821 shareId: "", 1822 }); 1823 window.luxuryPresence.config.setWebsiteApiGatewayUrl("https://wgw.luxurypresence.com", {}); 1824 window.luxuryPresence.config.setBuyerSellerServiceUrl("https://bss.luxurypresence.com", {}); 1825 window.luxuryPresence.config.setDivolteServiceUrl("https://t.luxurypresence.com", {}); 1826 window.luxuryPresence.config.setEventBusUrl("https://cdn.luxurypresence.com/scripts/event-bus-js", {}); 1827 window.luxuryPresence.config.setEventBus({ 1828 enabled: true, 1829 apiKey: "phc_PMYT31xlmXBaTCwpIRx1v6RrpLVZIuP47N3mOT6KLnr", 1830 url: "https://p.luxurypresence.com", 1831 }); 1832 window.luxuryPresence.config.setTemplateId("e3960201-1a19-4660-a991-8658653d81e9", {}); 1833 window.luxuryPresence.config.setLeadIngesterUrl("https://leads.luxurypresence.com", {}); 1834 window.luxuryPresence.buttons.initialize({}); 1835 window.luxuryPresence.consent.initialize({ provider: 'lp-consent' }); 1836 window.luxuryPresence.contactForms.initialize({}); 1837 window.luxuryPresence.validation.initialize({}); 1838 window.luxuryPresence.expandSliders.initialize({}); 1839 window.luxuryPresence.oauth.initialize({ googleSignOnEnabled: true, iframe: false }); 1840 window.luxuryPresence.qualifyingQuestionsModal.initialize({ qualifyingQuestionsModalEnabled: true }); 1841 } catch (e) { 1842 console.log(e); 1843 } 1844 1845 /* Inject Section Specific Javascript */ 1846 try { 1847(function init(sectionDomId) { 1848 let address = $('#' + sectionDomId + " .company_address").text().trim(); 1849 $('#' + sectionDomId + " .company_address").text(address); 1850 function setHttp(link) { 1851 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 1852 link = 'http://' + link; 1853 } 1854 return link; 1855 } 1856 $(`#${sectionDomId} .contact-form__form`).on('reset', () => { 1857 const redirectLink = $('#' + sectionDomId + ' .redirect-link'); 1858 if (redirectLink.length) { 1859 const rawHref = redirectLink.attr('href'); 1860 redirectLink.attr('href', setHttp(rawHref)); 1861 redirectLink[0].click(); 1862 } 1863 }); 1864})('modal-global-contact-us'); 1865} catch(e) { 1866console.log(e); 1867} 1868 1869 try { 1870(function init(sectionDomId) { 1871 var resizeMenu = function () { 1872 var widthSoFar = 0; 1873 var availableWidth = $('#' + sectionDomId + ' .navigation').width(); 1874 if ($(window).width() > 1024) { 1875 $('#' + sectionDomId + ' .navigation > li').each(function () { 1876 $(this).hide(); 1877 const currentItemWidth = $(this).outerWidth(); 1878 if (availableWidth - widthSoFar >= currentItemWidth) $(this).css({ 1879 "visibility": "visible", 1880 "display": "list-item", 1881 "height": "auto" 1882 }); 1883 widthSoFar += $(this).outerWidth(); 1884 }); 1885 } 1886 }; 1887 $(window).on('resize.lpui-auto-clean', resizeMenu); 1888 const mediaQuery = window.matchMedia('(hover: hover) and (pointer: fine)'); 1889 var $subNavTrigger = $('body > nav .sub-nav-container a'); 1890 var $subNavContainer = $('body > nav .sub-nav-container'); 1891 if (mediaQuery.matches) { 1892 $subNavTrigger.off('click'); 1893 $subNavContainer.mouseout(function () { 1894 var self = $(this); 1895 self.removeClass('active').find('.sub-nav').removeClass('visible'); 1896 }).mouseover(function () { 1897 $(this).siblings('.sub-nav-container').removeClass('active').find('.sub-nav').removeClass('visible'); 1898 $(this).addClass('active').find('.sub-nav').addClass('visible'); 1899 }).mouseup(function () { 1900 var self = $(this); 1901 self.toggleClass('active'); 1902 }); 1903 } 1904 function isSectionLight(sect) { 1905 if (!sect || !sect.style) { 1906 return true; 1907 } 1908 if (sect.style.backgroundImage) { 1909 return false;
1910 } 1911 if ($(sect).children('.video-wrapper').length) { 1912 return false; 1913 } 1914 return sect.classList.contains('is-background-color-light'); 1915 } 1916 const $header = $(`#${sectionDomId} > .header`); 1917 if ($header.hasClass('theme-auto')) { 1918 if (isSectionLight($('body > section')[0])) { 1919 $header.removeClass('theme-light'); 1920 } else { 1921 $header.addClass('theme-light'); 1922 } 1923 } 1924 var resizeTimeout; 1925 clearTimeout(resizeTimeout); 1926 resizeTimeout = setTimeout(function () { 1927 resizeMenu(); 1928 }, 1000); 1929})('global-navbar'); 1930} catch(e) { 1931console.log(e); 1932} 1933 try { 1934(function init(sectionDomId, options) { 1935 var elementSelector = options.elementSelector || 'nav'; 1936 var element = document.querySelector(elementSelector); 1937 var sections = document.querySelectorAll('body > section'); 1938 var subNavContainers = element.querySelectorAll('.sub-nav'); 1939 var initialBackgroundColor = options.initialBackgroundColor || element.style.backgroundColor; 1940 var backgroundColorScroll = options.backgroundColorScroll || '#191919'; 1941 var fontColor = options.fontColor || '#fff'; 1942 var fontColorScroll = options.fontColorScroll || '#000'; 1943 var didScroll = false; 1944 var lastScrollTop = 0; 1945 var delta = 5; 1946 1947 // eslint-disable-next-line sonarjs/no-collapsible-if 1948 if (wow) { 1949 // Wowjs might not trigger for position fixed elements 1950 if (window.scrollY > 0) { 1951 element.querySelectorAll('.wow').forEach(el => wow.show(el)); 1952 } 1953 } 1954 function adjustNavPinState() { 1955 // Remove 'visible' class from all subNavContainers 1956 for (let i = 0; i < subNavContainers.length; i++) { 1957 subNavContainers[i].classList.remove('visible'); 1958 } 1959 if (window.scrollY > 0) { 1960 element.style.backgroundColor = backgroundColorScroll; 1961 element.style.color = fontColorScroll; 1962 element.classList.add('scroll'); 1963 } else { 1964 element.style.backgroundColor = initialBackgroundColor; 1965 element.style.color = fontColor; 1966 element.classList.remove('scroll'); 1967 } 1968 } 1969 adjustNavPinState(); 1970 function onScroll() { 1971 didScroll = true; 1972 } 1973 window.addEventListener('scroll', onScroll); 1974 1975 // eslint-disable-next-line 1976 var debounceInterval = setInterval(() => { 1977 if (didScroll) { 1978 // eslint-disable-next-line 1979 hasScrolled(); 1980 didScroll = false; 1981 } 1982 }, 250); 1983 function hasScrolled() { 1984 adjustNavPinState(); 1985 // eslint-disable-next-line 1986 var navbarHeight = element.offsetHeight; 1987 // eslint-disable-next-line 1988 var st = window.scrollY; 1989 1990 // Make sure they scroll more than delta 1991 if (Math.abs(lastScrollTop - st) <= delta) { 1992 return; 1993 } 1994 if (st > lastScrollTop && st > navbarHeight) { 1995 // Scroll Down 1996 element.style.transform = `translateY(-${navbarHeight}px) scaleY(0)`; 1997 document.documentElement.style.setProperty('--global-header-height', '0px'); 1998 1999 // Some sections "follow" the navbar with class sticky (i.e. Producer search) 2000 sections.forEach(section => { 2001 if (section.classList.contains('sticky')) { 2002 section.style.top = '0px'; 2003 } 2004 }); 2005 } else { 2006 // Scroll Up 2007 // eslint-disable-next-line 2008 if (st + window.innerHeight < document.documentElement.scrollHeight) { 2009 element.style.transform = `translateY(0) scaleY(1)`; 2010 document.documentElement.style.setProperty('--global-header-height', `${navbarHeight}px`); 2011 sections.forEach(section => { 2012 if (section.classList.contains('sticky')) { 2013 section.style.top = `${navbarHeight}px`; 2014 } 2015 }); 2016 } 2017 } 2018 lastScrollTop = st; 2019 } 2020})('NAVBAR', JSON.parse("{\"fontColor\":\"#211F1F\",\"elementSelector\":\"nav\",\"fontColorScroll\":\"#ffffff\",\"backgroundColorScroll\":\"#2C3426\",\"initialBackgroundColor\":\"transparent\"}")); 2021} catch(e) { 2022console.log(e); 2023} 2024 try { 2025(function init(sectionDomId) { 2026 sectionDomId = "global-sidemenu"; 2027 var $sidemenu = $('#' + sectionDomId); 2028 const subNavItems = $('body > div.sidemenu .sub-nav-container .sub-nav__item'); 2029 const hideSubNavItems = () => { 2030 subNavItems.removeClass('fadeInUp'); 2031 }; 2032 const showSubNavItems = subnav => { 2033 if ($(subnav).find('.arrow').hasClass('active')) { 2034 $(".sidemenu").find('.arrow').removeClass('active'); 2035 } else { 2036 $(".sidemenu").find('.arrow').removeClass('active'); 2037 $(subnav).find('.arrow').addClass('active'); 2038 } 2039 let i = 0; 2040 subnav.find('.sub-nav__item').each((idx, item) => { 2041 i++; 2042 var timeout; 2043 clearTimeout(timeout); 2044 timeout = setTimeout(() => { 2045 $(item).addClass('fadeInUp'); 2046 }, 100 + i * 50); 2047 }); 2048 }; 2049 $(document).on("click", function (e) {
2050 if ($(e.target).closest(".navigation").length < 1) { 2051 hideSubNavItems(); 2052 } 2053 }); 2054 $('body > div.sidemenu .sub-nav-container > a').click(function (e) { 2055 const subnavContainer = $(this).closest('.sub-nav-container'); 2056 hideSubNavItems(); 2057 showSubNavItems(subnavContainer); 2058 }); 2059 const hideSideMenu = () => { 2060 $('body > div.sidemenu').removeClass('visible'); 2061 }; 2062 $('body > div.sidemenu .navigation .navigation__item:not(.sub-nav-container) .navigation__link').on('click', function (e) { 2063 onHide(); 2064 hideSideMenu(); 2065 }); 2066 $('body > div.sidemenu .sub-nav-container .sub-nav__link').on('click', function (e) { 2067 onHide(); 2068 setTimeout(() => { 2069 hideSideMenu(); 2070 }, 1601); 2071 }); 2072 var shown = false; 2073 function onShow() { 2074 if (shown) { 2075 return; 2076 } 2077 shown = true; 2078 window.lpUI.requestScrollLock(sectionDomId); 2079 $('#' + sectionDomId + ' .navigation__link').removeClass('fade-in'); 2080 $('#' + sectionDomId + ' .lp-socials__link').removeClass('fade-in'); 2081 let i = 0; 2082 $('#' + sectionDomId + ' .navigation__link').each(function () { 2083 i++; 2084 setTimeout(() => { 2085 $(this).addClass('fade-in'); 2086 }, 900 + i * 50); 2087 }); 2088 $('#' + sectionDomId + ' .lp-socials__link').each(function () { 2089 i++; 2090 setTimeout(() => { 2091 $(this).addClass('fade-in'); 2092 }, 900 + i * 50); 2093 }); 2094 } 2095 function onHide() { 2096 hideSubNavItems(); 2097 if (!shown) { 2098 return; 2099 } 2100 $('#' + sectionDomId + ' .lp-socials__link').removeClass('fade-in'); 2101 let i = 0; 2102 $($('#' + sectionDomId + ' .navigation__link').get().reverse()).each(function () { 2103 i++; 2104 setTimeout(() => { 2105 $(this).removeClass('fade-in'); 2106 }, i * 50); 2107 }); 2108 shown = false; 2109 setTimeout(() => { 2110 window.lpUI.releaseScrollLock(sectionDomId); 2111 }, 1600); 2112 } 2113 $sidemenu.on('lpui-show', onShow); 2114 $sidemenu.on('lpui-hide', onHide); 2115})('global-sidemenu'); 2116} catch(e) { 2117console.log(e); 2118} 2119 2120 try { 2121(function init(sectionDomId) { 2122 function setHttp(link) { 2123 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 2124 link = 'http://' + link; 2125 } 2126 return link; 2127 } 2128 $(`#${sectionDomId} form`).on("reset", function () { 2129 const redirectLink = $('#' + sectionDomId + ' .redirect-link'); 2130 if (redirectLink.length) { 2131 const rawHref = redirectLink.attr('href'); 2132 redirectLink.attr('href', setHttp(rawHref)); 2133 redirectLink[0].click(); 2134 } 2135 }); 2136})('global-footer'); 2137} catch(e) { 2138console.log(e); 2139} 2140 2141 try { 2142(function init(sectionDomId) { 2143 var _section = $('#' + sectionDomId); 2144 var _footer = document.getElementById('global-footer'); 2145 const redirectLink = _section.find('.js-redirect-link'); 2146 function setHttp(link) { 2147 if (link.search(/^(http[s]?\:\/\/|\/)/) == -1) { 2148 link = 'https://' + link; 2149 } 2150 return link; 2151 } 2152 function redirectPage(link) { 2153 if (link.length) { 2154 window.location.href = setHttp(link.attr('href')); 2155 } 2156 } 2157 const emailInput = _section.find('.js-email-input'); 2158 const emailRegex = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~\-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+/; 2159 emailInput.on('input', function () { 2160 if (emailRegex.test(this.value)) { 2161 this.setCustomValidity(''); 2162 } else { 2163 this.setCustomValidity('Please enter a valid email address.'); 2164 } 2165 this.reportValidity(); 2166 }); 2167 _section.find('input[name="name"]').on("keyup", function () { 2168 if (this.value.replaceAll(/\d/g, "").trim().split(" ").length < 2 || this.value.replaceAll(/\d/g, "").trim() === "") { 2169 this.setCustomValidity("Please input your first name and last name."); 2170 } else { 2171 this.setCustomValidity(""); 2172 } 2173 }); 2174 _section.find('form').on("reset", function () { 2175 $(this).addClass("show-success"); 2176 redirectPage(redirectLink); 2177 }); 2178 $(window).scroll(function () { 2179 if ($(this).scrollTop() >= 150) _section.find('.btn-holder').addClass('visible');else _section.find('.btn-holder').removeClass('visible'); 2180 }); 2181 _section.find('.close-btn, .connect-btn').click(function () { 2182 _section.find('.pop-up').toggle(); 2183 _section.find('.btn-holder').toggle(); 2184 }); 2185 if (!_footer) return; 2186 const observer = new IntersectionObserver(entries => {
2187 entries.forEach(entry => { 2188 if (entry.isIntersecting) _section.hide();else _section.show(); 2189 }); 2190 }, { 2191 threshold: 0.1 2192 }); 2193 observer.observe(_footer); 2194 function selectToDropdown(selectItem) { 2195 let customDropdown = ` 2196 <div class="custom-select" role="presentation"> 2197 <button class="custom-select-toggle is-placeholder" type="button" aria-haspopup="true" aria-expanded="false"></button> 2198 <div class="custom-select-menu" style="display: none;max-height: none;"> 2199 <div class="custom-select-content"> 2200 </div> 2201 </div> 2202 </div>`; 2203 $(customDropdown).insertAfter(selectItem); 2204 let $dropdown = $($(selectItem).next()); 2205 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 2206 let $dropdownMenu = $dropdown.find(".custom-select-menu"); 2207 let $dropdownContent = $dropdown.find(".custom-select-content"); 2208 $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select"); 2209 $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom"); 2210 $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id")); 2211 appendOptionButtons(selectItem, $dropdownContent); 2212 $(selectItem).removeClass().addClass("sr-only"); 2213 var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text(); 2214 $dropdownToggle.html(toggleText); 2215 $dropdown.on("click", ".custom-select-item", function (e) { 2216 if ($(this).hasClass("is-disabled")) return; 2217 let elementNumber = $(this).index(); 2218 let $originalSelect = $(this).closest(".custom-select").siblings("select"); 2219 let $linkedOption = $originalSelect.find("option").eq(elementNumber); 2220 if (!$linkedOption.prop("selected")) { 2221 $linkedOption.prop("selected", true); 2222 $originalSelect.change(); 2223 $(this).addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected"); 2224 $dropdownToggle.html($(this).html()); 2225 closeSelectMenu($(this).closest(".custom-select-menu")); 2226 } 2227 $dropdownToggle.removeClass("is-placeholder"); 2228 }); 2229 function convertOptionToButton(option) { 2230 var optionText = $(option).text(); 2231 var optionValue = $(option).attr("value") || $(option).text(); 2232 var optionIsDisabled = $(option).prop("disabled"); 2233 var outputButton = `<button value="${optionValue}" class="custom-select-item" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`; 2234 return outputButton; 2235 } 2236 function appendOptionButtons(selectItem, appendTarget) { 2237 $(selectItem).find("option").each(function () { 2238 let currentButton = convertOptionToButton(this); 2239 $(appendTarget).append(currentButton); 2240 }); 2241 } 2242 function showSelectMenu(selectMenu) { 2243 var customSelect = $(selectMenu).closest(".custom-select")[0]; 2244 $(customSelect).addClass("open"); 2245 $(selectMenu).slideDown(); 2246 } 2247 function closeSelectMenu(selectMenu) { 2248 var customSelect = $(selectMenu).closest(".custom-select")[0]; 2249 $(customSelect).removeClass("open"); 2250 $(selectMenu).slideUp(); 2251 } 2252 $dropdown.on("click", ".custom-select-toggle", function (e) { 2253 var $customSelect = $(this).closest(".custom-select"); 2254 var selectMenu = $customSelect.find(".custom-select-menu")[0]; 2255 if ($customSelect.hasClass("open")) { 2256 closeSelectMenu(selectMenu); 2257 } else { 2258 showSelectMenu(selectMenu); 2259 } 2260 }); 2261 $(document).on("click", function (e) { 2262 if ($(e.target).closest(".custom-select").length < 1 && $(".custom-select").hasClass("open")) { 2263 $(".custom-select.open").each(function () { 2264 var selectMenu = $(this).find(".custom-select-menu")[0]; 2265 closeSelectMenu(selectMenu); 2266 }); 2267 } 2268 }); 2269 } 2270 $(".pop-up select[name='interest']").each(function () { 2271 selectToDropdown(this); 2272 }); 2273})('global-mobile-contact'); 2274} catch(e) { 2275console.log(e); 2276} 2277 2278 try { 2279(function init(sectionDomId, options) { 2280 const $section = $('#' + sectionDomId); 2281 const $videoWrap = $section.find('.full-screen-video-component > .video-wrapper'); 2282 const $playButton = $section.find('.js-play-btn'); 2283 if ($videoWrap.length) { 2284 const $video = $videoWrap.find('video'); 2285 $video.each(function () { 2286 var v = this; 2287 if (v.readyState > 0) { 2288 $videoWrap.addClass('playing'); 2289 var promise = v.play(); 2290 if (promise !== undefined) { 2291 promise.catch(error => { 2292 $playButton.addClass('visible'); 2293 }).then(() => {}); 2294 } 2295 } else { 2296 v.addEventListener('canplay', function () { 2297 $videoWrap.addClass('playing'); 2298 }, { 2299 once: true 2300 }); 2301 } 2302 }); 2303 } 2304 $playButton.on('click', function () { 2305 const $video = $videoWrap.find('video'); 2306 this.classList.remove('visible'); 2307 if ($video[0].currentTime === 0) { 2308 $video[0].load(); 2309 $video[0].play(); 2310 } 2311 }); 2312 window.luxuryPresence.mapApiLoader.load().then(() => {
2313 const $searchWrapper = $section.find('.search-wrapper'); 2314 if (!$searchWrapper.length) { 2315 return; 2316 } 2317 const searchMls = $searchWrapper[0].dataset.searchMls === 'true'; 2318 const searchProperties = $searchWrapper[0].dataset.searchProperties === 'true'; 2319 const searchPlaces = searchMls; 2320 const showNeighborhoods = searchMls; 2321 const searchNearEnabled = searchMls; 2322 const $searchInput = $section.find('.search-input'); 2323 const $searchResults = $section.find('.search-results'); 2324 const $resultsContainer = $section.find('.results-container'); 2325 const $loader = $section.find('.search-in-progress'); 2326 const $predefined = $section.find('.predefined-links'); 2327 const $searchBtn = $section.find('.search-button'); 2328 const $leaseFalseButton = $section.find('.jsLeaseFalse'); 2329 const $leaseTrueButton = $section.find('.jsLeaseTrue'); 2330 const $nextSection = $section.next(); 2331 const fixZIndex = $nextSection.length && parseInt($nextSection.css('z-index')) || 1; 2332 const searchDelay = 300; 2333 const maxPlaces = 3; 2334 const maxMls = 5; 2335 const leaseFilter = $leaseFalseButton.length > 0 && $leaseTrueButton.length > 0; 2336 const service = new google.maps.places.AutocompleteService(); 2337 const geocoder = new google.maps.Geocoder(); 2338 var keyword; 2339 var leasePropertyState = false; 2340 var leasePropertySearched; 2341 var searchActive = false; 2342 var isLoading = false; 2343 function showSearchResults() { 2344 searchActive = true; 2345 updateSearchDisplay(); 2346 } 2347 function hideSearchResults() { 2348 searchActive = false; 2349 updateSearchDisplay(); 2350 } 2351 function showLoading() { 2352 isLoading = true; 2353 updateSearchDisplay(); 2354 } 2355 function hideLoading() { 2356 isLoading = false; 2357 updateSearchDisplay(); 2358 } 2359 function updateSearchDisplay() { 2360 if (leaseFilter) { 2361 if (leasePropertyState) { 2362 $leaseTrueButton.addClass('active'); 2363 $leaseFalseButton.removeClass('active'); 2364 } else { 2365 $leaseFalseButton.addClass('active'); 2366 $leaseTrueButton.removeClass('active'); 2367 } 2368 } 2369 if (!searchActive) { 2370 $searchResults.removeClass('show'); 2371 $searchResults.css('height', '0'); 2372 return; 2373 } 2374 var hasResults = !!$resultsContainer.html(); 2375 var hasPredefined = $predefined.find('a:not(.not-processed)').length > 0; 2376 if (hasResults) { 2377 $predefined.addClass('not-visible'); 2378 $loader.addClass('not-visible'); 2379 $resultsContainer.removeClass('not-visible'); 2380 } else if (isLoading) { 2381 $resultsContainer.addClass('not-visible'); 2382 $predefined.addClass('not-visible'); 2383 $loader.removeClass('not-visible'); 2384 } else if (hasPredefined) { 2385 $resultsContainer.addClass('not-visible'); 2386 $loader.addClass('not-visible'); 2387 $predefined.removeClass('not-visible'); 2388 } else { 2389 $resultsContainer.addClass('not-visible'); 2390 $loader.addClass('not-visible'); 2391 $predefined.addClass('not-visible'); 2392 } 2393 var height = 0; 2394 height += $predefined[0].getBoundingClientRect().height; 2395 height += $resultsContainer[0].getBoundingClientRect().height; 2396 height += $loader[0].getBoundingClientRect().height; 2397 if (height > 0) { 2398 $searchResults.addClass('show'); 2399 } else { 2400 $searchResults.removeClass('show'); 2401 } 2402 $searchResults.css('height', height + 'px'); 2403 } 2404 function clearSelection() { 2405 $searchResults.find('.selected-link').removeClass('selected-link'); 2406 } 2407 function moveSelection(up) { 2408 var $cont = $resultsContainer.html() ? $resultsContainer : $predefined; 2409 var $links = $cont.find('.results-link'); 2410 if (!$links.length) { 2411 return; 2412 } 2413 var idx = -1; 2414 $links.each(function (i) { 2415 if (idx === -1 && $(this).is('.selected-link')) { 2416 idx = i; 2417 } 2418 }); 2419 var newIdx; 2420 if (up) { 2421 newIdx = idx - 1; 2422 if (newIdx < 0) { 2423 newIdx = $links.length - 1; 2424 } 2425 } else { 2426 newIdx = idx + 1; 2427 if (newIdx > $links.length - 1) { 2428 newIdx = 0; 2429 } 2430 } 2431 if (newIdx !== idx) { 2432 $searchResults.find('.selected-link').removeClass('selected-link'); 2433 $($links.get(newIdx)).addClass('selected-link'); 2434 } 2435 } 2436 var newSearchTimer; 2437 function inputChanged(ev) { 2438 if (ev.which === 38) { 2439 ev.preventDefault(); 2440 moveSelection(true); 2441 return false;
2442 } 2443 if (ev.which === 40) { 2444 ev.preventDefault(); 2445 moveSelection(); 2446 return false; 2447 } 2448 if (ev.which === 13) { 2449 $lnk = $searchResults.find('.selected-link'); 2450 if ($lnk.length) { 2451 $lnk[0].click(); 2452 hideSearchResults(); 2453 } else { 2454 $searchBtn.click(); 2455 } 2456 } 2457 window.clearTimeout(newSearchTimer); 2458 newSearchTimer = window.setTimeout(startSearch, searchDelay); 2459 } 2460 function startSearch() { 2461 const term = $searchInput.val(); 2462 if (term === keyword && leasePropertySearched === leasePropertyState) { 2463 return; 2464 } 2465 leasePropertySearched = leasePropertyState; 2466 keyword = term; 2467 if (term) { 2468 doSearch(term, leasePropertySearched); 2469 } else { 2470 setResults(null); 2471 } 2472 } 2473 function mlsSearch(term, leaseProperty) { 2474 var query = { 2475 keyword_search: term, 2476 limit: maxMls 2477 }; 2478 if (leaseFilter && leaseProperty) { 2479 query.lease_property = true; 2480 } 2481 return superagent.get(window.location.protocol + '//' + window.location.host + '/home-search/listings.json').query(query).then(function (res) { 2482 if (!Array.isArray(res.body)) { 2483 return []; 2484 } 2485 return res.body.map(function (item) { 2486 return { 2487 id: item.id, 2488 display_address: [item.address_1, item.city, [item.state, item.postal_code].filter(function (i) { 2489 return i; 2490 }).join(' ')].filter(function (i) { 2491 return i; 2492 }).join(', ') 2493 }; 2494 }); 2495 }, function (e) { 2496 console.log(e); 2497 return []; 2498 }); 2499 } 2500 function resolveGeoBounds(placeId, description, terms) { 2501 return new Promise(function (resolve, reject) { 2502 geocoder.geocode({ 2503 'placeId': placeId 2504 }, function (results, status) { 2505 if (status != 'OK') { 2506 return resolve(null); 2507 } 2508 var result = results[0]; 2509 var bounds = new google.maps.LatLngBounds();
2510 bounds.extend(result.geometry.viewport.getSouthWest()); 2511 bounds.extend(result.geometry.viewport.getNorthEast()); 2512 result.geometry.bounds = bounds.toJSON(); 2513 var placeUrl = window.luxuryPresence.makeMlsLink(result); 2514 return resolve({ 2515 placeUrl: placeUrl, 2516 description: description, 2517 cityName: terms[0].value, 2518 stateName: terms[1].value 2519 }); 2520 }); 2521 }); 2522 } 2523 function resolveAutocomplete(term, deeper) { 2524 var request = { 2525 input: term, 2526 componentRestrictions: { 2527 country: 'us' 2528 }, 2529 types: deeper ? ['geocode'] : ['(regions)'], 2530 limit: 1 2531 }; 2532 return new Promise(function (resolve, reject) { 2533 service.getPlacePredictions(request, function (results, status) { 2534 if (status !== google.maps.places.PlacesServiceStatus.OK) { 2535 resolve(null); 2536 return; 2537 } 2538 if (!Array.isArray(results)) { 2539 resolve(null); 2540 return; 2541 } 2542 if (deeper) { 2543 var allowedTypes = { 2544 'neighborhood': true, 2545 'administrative_area_level_3': true, 2546 'administrative_area_level_4': true, 2547 'administrative_area_level_5': true, 2548 'sublocality_level_1': true, 2549 'sublocality_level_2': true, 2550 'sublocality_level_3': true 2551 }; 2552 results = results.filter(function (res) { 2553 return res.types.find(t => allowedTypes[t]); 2554 }); 2555 } 2556 if (!results.length) { 2557 resolve(null); 2558 return; 2559 } 2560 resolve(results); 2561 }); 2562 }); 2563 } 2564 var placesResult = {}; 2565 function placesSearch(term, ignoreInput) { 2566 if (placesResult.term !== term) { 2567 placesResult = { 2568 term: term, 2569 result: resolveAutocomplete(term).then(function (results) { 2570 if (!ignoreInput && term !== keyword) { 2571 return null; 2572 } 2573 if (ignoreInput && !results) { 2574 return resolveAutocomplete(term, true); 2575 } 2576 return results; 2577 }).then(function (results) { 2578 if (!ignoreInput && term !== keyword) { 2579 return []; 2580 } 2581 if (!results) { 2582 return []; 2583 } 2584 var geoResultPromises = results.map(function (result) { 2585 return resolveGeoBounds(result.place_id, result.description, result.terms); 2586 }); 2587 return Promise.all(geoResultPromises).then(function (geoLinks) { 2588 return geoLinks.filter(function (i) { 2589 return i; 2590 }).slice(0, maxPlaces); 2591 }); 2592 }) 2593 }; 2594 } 2595 return placesResult.result; 2596 } 2597 function propertiesSearch(term, leaseProperty) { 2598 var payload = { 2599 companyId: window.luxuryPresence.defaults.companyId, 2600 search: term, 2601 offset: 0, 2602 limit: 6, 2603 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"] 2604 }; 2605 if (leaseFilter) { 2606 payload.leaseProperty = !!leaseProperty; 2607 } 2608 var useRouter = Boolean(options && options.useRouterApi); 2609 return superagent.post((useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl) + '/graphql').send({ 2610 query: window.luxuryPresence.defaults.gql.properties, 2611 variables: useRouter ? window.luxuryPresence.routerApi.transformVariables('properties', payload) : payload 2612 }).then(function (res) { 2613 var data = res.body.data || {}; 2614 var page = data.properties || {}; 2615 return useRouter ? page.items || [] : page || []; 2616 }, function (err) { 2617 return []; 2618 }); 2619 } 2620 function doSearch(term, leaseProperty) { 2621 showLoading(); 2622 Promise.all([searchMls ? mlsSearch(term, leaseProperty) : [], searchPlaces ? placesSearch(term) : [], searchProperties ? propertiesSearch(term, leaseProperty) : []]).then(function (res) { 2623 if (term !== keyword) { 2624 return; 2625 } 2626 setResults(res[0], res[1], res[2], leaseProperty); 2627 }); 2628 } 2629 function makeResultsBlockHtml(title, links) { 2630 if (!links || !links.length) { 2631 return ''; 2632 } 2633 var html = '<div class="results-block">'; 2634 html += '<div class="results-block-title">'; 2635 if (searchNearEnabled) { 2636 html += '<div class="search-near-container"><a class="search-near lp-link lp-link--light">Search Near Me</a></div>'; 2637 } 2638 html += '<div class="results-title-label">' + title + '</div></div>'; 2639 html += links.join('') + '</div>'; 2640 return html; 2641 } 2642 function setResults(mlsResults, placesResults, propertiesResults, leaseProperty) { 2643 clearSelection(); 2644 hideLoading(); 2645 if (!mlsResults) { 2646 $resultsContainer.html(''); 2647 updateSearchDisplay(); 2648 return; 2649 } 2650 if (!mlsResults.length && !placesResults.length && !propertiesResults.length) { 2651 $resultsContainer.html('<div class="nothing-found">No results found</div>'); 2652 updateSearchDisplay(); 2653 return; 2654 } 2655 var propertiesHtml = makeResultsBlockHtml('Featured Properties', propertiesResults.map(function (result) { 2656 return `<a href="/properties/${result.slug}" class="results-link">${result.privateAddress ? result.name : result.fullAddress}</a>`; 2657 })); 2658 var placesHtml = makeResultsBlockHtml('Locations', placesResults.map(function (result) { 2659 return `<a class="results-link" href="${result.placeUrl}${leaseProperty ? '&lease_property=true' : ''}&cityName=${result.cityName}&stateName=${result.stateName}">${result.description}</a>`; 2660 })); 2661 var mlsHtml = makeResultsBlockHtml('Address', mlsResults.map(function (result) { 2662 return `<a href="/home-search/listings/${result.id}" class="results-link">${result.display_address}</a>`; 2663 }));
2664 $resultsContainer.html(propertiesHtml + placesHtml + mlsHtml); 2665 updateSearchDisplay(); 2666 } 2667 function searchBtnClicked() { 2668 var resultsBlockHref = $("#" + sectionDomId + " .results-block .results-link").attr("href"); 2669 const term = $searchInput.val(); 2670 if (!term) { 2671 return; 2672 } 2673 if (searchMls) { 2674 window.location.href = resultsBlockHref; 2675 return; 2676 } 2677 if (searchProperties) { 2678 window.location.href = "/properties/sale"; 2679 } 2680 } 2681 var neighborhoods = null; 2682 function fetchNeighborhoods() { 2683 var url = window.luxuryPresence.defaults.apiGatewayUrl; 2684 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'neighborhoods (companyId: $companyId, offset: $offset, limit: $limit) {id, name, mlsLink, googlePlaceData}}'; 2685 var payload = {}; 2686 payload.offset = 0; 2687 payload.limit = 100; 2688 payload.companyId = window.luxuryPresence.defaults.companyId; 2689 return superagent.post(url + '/graphql').withCredentials().send({ 2690 query: gqlQuery, 2691 variables: payload 2692 }).then(function (res) { 2693 neighborhoods = res.body.data && res.body.data.neighborhoods; 2694 if (neighborhoods && !neighborhoods.length) { 2695 neighborhoods = null; 2696 } 2697 }); 2698 } 2699 function setPredefinedNeighborhoods() { 2700 return fetchNeighborhoods().then(function () { 2701 if (!neighborhoods) { 2702 return; 2703 } 2704 var leaseProperty = leaseFilter && leasePropertyState; 2705 var placesHtml = makeResultsBlockHtml('Locations', neighborhoods.map(function (item) { 2706 return `<a class="results-link" href="${item.mlsLink}${leaseProperty ? '&lease_property=true' : ''}">${item.googlePlaceData && item.googlePlaceData.formatted_address || item.name}</a>`; 2707 })); 2708 $predefined.html(placesHtml); 2709 updateSearchDisplay(); 2710 }); 2711 } 2712 if (showNeighborhoods) { 2713 setPredefinedNeighborhoods(); 2714 } 2715 $searchInput.on('focus', showSearchResults); 2716 $searchInput.on('keyup focus', inputChanged); 2717 $searchResults.on('mouseenter', '.results-link', function (ev) { 2718 clearSelection(); 2719 }); 2720 $searchBtn.on('click', searchBtnClicked); 2721 $leaseFalseButton.on('click', function () { 2722 if (leasePropertyState) { 2723 leasePropertyState = false; 2724 if (showNeighborhoods) { 2725 setPredefinedNeighborhoods(); 2726 } 2727 updateSearchDisplay(); 2728 setResults(null); 2729 startSearch(); 2730 } 2731 }); 2732 $leaseTrueButton.on('click', function () { 2733 if (!leasePropertyState) { 2734 leasePropertyState = true; 2735 if (showNeighborhoods) { 2736 setPredefinedNeighborhoods(); 2737 } 2738 updateSearchDisplay(); 2739 setResults(null); 2740 startSearch(); 2741 } 2742 }); 2743 function createPolygonUrl(center, radius, n) { 2744 var step = Math.PI * 2 / n; 2745 var angle = 0 - step / 2; 2746 var points = []; 2747 var kx = 1.0 / Math.cos(center[1] * Math.PI / 180); 2748 for (var i = 0; i < n; i++) { 2749 points.push('[' + (center[0] + radius * Math.sin(angle) * kx).toFixed(5) + ',' + (center[1] - radius * Math.cos(angle)).toFixed(5) + ']'); 2750 angle += step; 2751 } 2752 points.push(points[0]); 2753 var str = '[[' + points.join(',') + ']]'; 2754 return '&polygon=' + encodeURIComponent(str); 2755 } 2756 function makeNearMeUrl(center, leaseProperty) { 2757 var url = '/home-search/listings?search_type=envelope'; 2758 if (leaseProperty) { 2759 url += '&lease_property=true'; 2760 } 2761 var distance = 0.11; 2762 var lat = center[1]; 2763 var lng = center[0]; 2764 url += '&south=' + (lat - distance); 2765 url += '&north=' + (lat + distance); 2766 url += '&west=' + (lng - distance); 2767 url += '&east=' + (lng + distance); 2768 url += createPolygonUrl(center, distance, 54); 2769 return url; 2770 } 2771 var $locMsg = null; 2772 $section.on('click', '.search-near', function () { 2773 showLoading(); 2774 navigator.geolocation.getCurrentPosition(function (position) { 2775 hideLoading(); 2776 hideSearchResults(); 2777 if (!position || !position.coords || !position.coords.latitude || !position.coords.longitude) { 2778 showLocationMessage('Unknown Location', '<p>Getting position of your device failed.</p><p>
2778You can type your address manually in the search field</p>'); 2779 return; 2780 } 2781 var url = makeNearMeUrl([position.coords.longitude, position.coords.latitude], leaseFilter && leasePropertyState); 2782 var link = document.createElement('a'); 2783 link.href = url; 2784 link.class = 'lp-visually-hidden'; 2785 $section[0].appendChild(link); 2786 link.click(); 2787 setTimeout(function () { 2788 $section[0].removeChild(link); 2789 }, 100); 2790 }, function (geoError) { 2791 hideLoading(); 2792 hideSearchResults(); 2793 var title = 'Unknown Location'; 2794 var msg; 2795 if (geoError.code === 1) { 2796 msg = '<p>To be able to search near you we need to know your current location.</p><p>If you don\'t want to give access to your device\'s location, you can type your address in the search field</p>'; 2797 } else { 2798 msg = '<p>Getting position of your device failed.</p><p>You can type your address manually in the search field</p>'; 2799 } 2800 showLocationMessage(title, msg); 2801 }); 2802 }); 2803 var locHideTimer = null; 2804 function showLocationMessage(title, message) { 2805 clearTimeout(locHideTimer); 2806 if (!$locMsg) { 2807 var html = `<div class="loc-msg-backdrop"> 2808 <div class="loc-msg-wrap"> 2809 <div class="loc-msg-modal"> 2810 <div class="loc-msg-close"></div> 2811 <h4 class="loc-msg-title lp-h4"></h4> 2812 <div class="loc-msg-container"></div> 2813 </div> 2814 </div> 2815 </div> 2816 `; 2817 $locMsg = $(html); 2818 $locMsg.on('click', hideLocationMessage); 2819 $section.append($locMsg); 2820 } 2821 $locMsg.find('.loc-msg-container').html(message); 2822 $locMsg.find('.loc-msg-title').html(title); 2823 setTimeout(function () { 2824 if ($locMsg) { 2825 $section.addClass('visible-loc-msg'); 2826 } 2827 }); 2828 } 2829 function hideLocationMessage() { 2830 $section.removeClass('visible-loc-msg'); 2831 locHideTimer = setTimeout(function () { 2832 $locMsg.remove(); 2833 $locMsg = null; 2834 }, 400); 2835 } 2836 function outsideClickHandler(e) { 2837 if ($searchWrapper.find($(e.target)).length > 0) { 2838 return; 2839 } 2840 hideSearchResults(); 2841 } 2842 $(document).on('click', outsideClickHandler); 2843 if ('geolocation' in navigator) { 2844 $searchWrapper.removeClass('search-near-hidden'); 2845 } 2846 updateSearchDisplay(); 2847 }); 2848})('section-33514986-d0a9-4c0c-9c08-c60d74b86348', 'undefined'); 2849} catch(e) { 2850console.log(e); 2851} 2852 try { 2853(function init(sectionDomId, options) { 2854 let section = null; 2855 switch (sectionDomId) { 2856 case 'NAVBAR': 2857 section = document.querySelector('body > nav, #global-navbar'); 2858 break; 2859 case 'FOOTER': 2860 section = document.querySelector('body > footer, #global-footer'); 2861 break; 2862 case 'SIDEMENU': 2863 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 2864 break; 2865 case 'CONTACT': 2866 section = document.querySelector('#modal-global-contact-us'); 2867 break; 2868 case 'MOBILE_CONTACT': 2869 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 2870 break; 2871 case 'SUBSCRIBE': 2872 // Subscribe Not Implemented 2873 section = null; 2874 break; 2875 case 'ACCOUNT': 2876 // Account Not Implemented 2877 section = null; 2878 break; 2879 default: 2880 section = document.querySelector('#' + sectionDomId); 2881 } 2882 if (!section) { 2883 return; 2884 } 2885 2886 // Where content / items are rendered 2887 const dataContainer = section.querySelector('.data-container'); 2888 if (!dataContainer) { 2889 // no place to render items = no need to query server or do anything else 2890 return; 2891 } 2892 let variables = options.variables || {}; 2893 2894 // Some variables in options may not have been injected - remove 2895 Object.keys(variables).forEach(function (variableName) { 2896 if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) { 2897 delete variables[variableName]; 2898 } 2899 }); 2900 2901 // Merge page query variables 2902 if (options.usePageResource) { 2903 variables = { 2904 ...variables, 2905 ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource] 2906 }; 2907 } 2908 2909 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Callers 2910 // resolve the flag — fetchData reads the section stamp, aux fetches read 2911 // their own resource's stamp (auxUsesRouter). 2912 function apiUrl(useRouter) { 2913 return options.url || (useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl); 2914 } 2915 2916 // ROUTER-CLEANUP: aux resources roll out on their own flag, not the section's 2917 // (options.routerApiAux is stamped per aux resource server-side). 2918 function auxUsesRouter(resource) { 2919 return !!(options.routerApiAux && options.routerApiAux[resource]); 2920 } 2921 2922 // Pagination Executes on a Numbered Pagination Container 2923 // Or via a load more button 2924 let mode = 'BUTTONLESS_PAGINATION'; 2925 const container = section.querySelector('.pagination-container');
2926 const loadMoreButton = section.querySelector(options?.loadMoreSelector); 2927 if (container) { 2928 mode = 'NUMBERED_PAGINATION'; 2929 } 2930 if (loadMoreButton) { 2931 mode = 'LOAD_MORE_BUTTON'; 2932 } 2933 let searchContainer = section.querySelector('.search-container'); 2934 const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false; 2935 const eventPrefix = '__pagination-'; 2936 const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{ 2937 param: 'neighborhoodId', 2938 urlKey: 'neighborhood' 2939 }, { 2940 param: 'search', 2941 urlKey: 'search' 2942 }, { 2943 param: 'salesPriceGTE', 2944 urlKey: 'pricemin', 2945 formKey: 'priceMin', 2946 type: 'int' 2947 }, { 2948 param: 'salesPriceLTE', 2949 urlKey: 'pricemax', 2950 formKey: 'priceMax', 2951 type: 'int' 2952 }, { 2953 param: 'livingSpaceSizeGTE', 2954 urlKey: 'areamin', 2955 formKey: 'areaMin', 2956 type: 'int' 2957 }, { 2958 param: 'livingSpaceSizeLTE', 2959 urlKey: 'areamax', 2960 formKey: 'areaMax', 2961 type: 'int' 2962 }] : []); 2963 2964 // Total entries - initialized in first render 2965 let totalNumber = 0; 2966 const DefaultSearchParams = { 2967 page: 1 2968 }; 2969 searchFormParams.forEach(function (formParam) { 2970 DefaultSearchParams[formParam.formKey || formParam.param] = null; 2971 }); 2972 let searchParams = { 2973 ...DefaultSearchParams 2974 }; 2975 const offset = options.variables?.offset || 0; 2976 let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section; 2977 let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100; 2978 2979 // entries of per page 2980 // when query variables for a given section would't be filled options.pageSize can store 2981 // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value 2982 let pageSize = parseInt(options.pageSize, 10) || 9; 2983 2984 // Adding mobile pageRange support 2985 var NARROW_BREAKPOINT = 600; 2986 var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT; 2987 var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`); 2988 2989 // Page range (pages on both sides of the current page) 2990 var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0; 2991 var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2; 2992 var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange; 2993 2994 // Whether to display the 'Previous' button 2995 var showPrevious = true; 2996 2997 // Whether to display the 'Next' button 2998 var showNext = true; 2999 3000 // Whether to display the page buttons 3001 var showPageNumbers = true; 3002 3003 // 'Previous' text 3004 var prevText = options.prevText || '«'; 3005 3006 // 'Next' text 3007 var nextText = options.nextText || '»'; 3008 3009 // Ellipsis text 3010 var ellipsisText = '…'; 3011 var classPrefix = 'paginationjs'; 3012 3013 // Default active class 3014 var activeClassName = 'active'; 3015 3016 // Default disable class 3017 var disableClassName = 'disabled'; 3018 3019 // Pagination element's position in the container 3020 var position = 'bottom'; 3021 3022 // Whether to trigger pagination at initialization 3023 var triggerPagingOnInit = !options.skipInitialLoad; 3024 var showFirstOnEllipsisShow = true; 3025 var showLastOnEllipsisShow = true; 3026 3027 // Instantiated in init() 3028 var el = null; 3029 3030 // Controls scrollTop logic 3031 var firstRender = true; 3032 var renderBySearch = false; 3033 var disabled = false; 3034 3035 // Pagination script class selector 3036 var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script'; 3037 3038 // Property Specific Image Override if No Image 3039 var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage; 3040 3041 // Construct template 3042 var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || ''; 3043 var template = Handlebars.compile(templateHTML); 3044 3045 // Initialize 3046 init(); 3047 function init() { 3048 Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 3049 3050 // Append/prepend pagination element to the pagination container 3051 if (mode === 'NUMBERED_PAGINATION') { 3052 el = document.createElement('div'); 3053 el.className = 'paginationjs';
3054 container[position === 'bottom' ? 'append' : 'prepend'](el); 3055 } 3056 if (searchContainer) { 3057 initSearchContainer({ 3058 fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true', 3059 fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true', 3060 fetchOffices: searchContainer.dataset.fetchOffices === 'true', 3061 fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true' 3062 }, function () { 3063 syncSearchFormState(searchParams); 3064 }); 3065 } 3066 3067 // Bind events 3068 observer(); 3069 } 3070 function syncSearchFormState(params) { 3071 searchContainer.dispatchEvent(new CustomEvent('sync', { 3072 detail: params 3073 })); 3074 } 3075 function initSearchContainer(options, done) { 3076 var promises = []; 3077 if (options.fetchNeighborhoods) { 3078 promises.push(fetchAllNeighborhoods(function (neighborhoods) { 3079 searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', { 3080 detail: { 3081 data: neighborhoods.map(function (item) { 3082 return { 3083 value: item.id, 3084 label: item.name 3085 }; 3086 }) 3087 } 3088 })); 3089 })); 3090 } 3091 if (options.fetchPostCategories) { 3092 promises.push(fetchPostCategories(function (categories) { 3093 searchContainer.dispatchEvent(new CustomEvent('post-categories-data', { 3094 detail: { 3095 data: categories 3096 } 3097 })); 3098 })); 3099 } 3100 if (options.fetchOffices) { 3101 promises.push(fetchOffices(function (offices) { 3102 searchContainer.dispatchEvent(new CustomEvent('offices-data', { 3103 detail: { 3104 data: offices 3105 } 3106 })); 3107 })); 3108 } 3109 if (options.fetchRentalRates) { 3110 promises.push(fetchAllRentalRates(function (rentalRates) { 3111 searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', { 3112 detail: { 3113 data: rentalRates 3114 } 3115 })); 3116 })); 3117 } 3118 if (promises.length > 0) { 3119 Promise.all(promises).then(function () { 3120 done(); 3121 }); 3122 } else { 3123 // element's custom code is not executed yet, so we're scheduling callback to after element's code 3124 setTimeout(done); 3125 } 3126 } 3127 function fetchAllNeighborhoods(done) { 3128 var useRouter = auxUsesRouter('neighborhoods'); 3129 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Same 3130 // args on both APIs (the federated neighborhoods field accepts 3131 // withProperties/withBlogPosts); only the selection set differs. 3132 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') + '}}'; 3133 var payload = {}; 3134 payload.offset = 0; 3135 payload.limit = 100; 3136 payload.companyId = variables.companyId; 3137 if (options.resource === 'properties') { 3138 payload.withProperties = { 3139 active: true 3140 }; 3141 ['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) { 3142 if (variables[field] !== undefined && variables[field] !== null) { 3143 payload.withProperties[field] = variables[field]; 3144 } 3145 }); 3146 } 3147 if (options.resource === 'posts') { 3148 payload.withBlogPosts = { 3149 active: true 3150 }; 3151 ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) { 3152 if (variables[field] !== undefined && variables[field] !== null) { 3153 payload.withBlogPosts[field] = variables[field]; 3154 } 3155 }); 3156 } 3157 3158 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3159 if (useRouter) { 3160 payload = window.luxuryPresence.routerApi.transformVariables('neighborhoods', payload); 3161 } 3162 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3163 query: gqlQuery, 3164 variables: payload 3165 }).then(function (res) { 3166 var value = res.body.data && res.body.data.neighborhoods || {}; 3167 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3168 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3169 done(items, items.length); 3170 }); 3171 } 3172 function fetchPostCategories(done) { 3173 var featured = options.resource === 'posts' && !!variables.featured; 3174 var useRouter = auxUsesRouter('postCategories'); 3175 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3176 // selection set differs ({ items {...} } on the router). 3177 var selection = 'id, name, publishedCount, featuredPublishedCount'; 3178 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) + '}}'; 3179 var payload = {}; 3180 payload.offset = 0; 3181 payload.limit = 100; 3182 payload.companyId = variables.companyId; 3183 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3184 query: gqlQuery, 3185 variables: payload 3186 }).then(function (res) { 3187 var value = res.body.data && res.body.data.postCategories || {}; 3188 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3189 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3190 done(items.map(function (item) { 3191 item.count = featured ? item.featuredPublishedCount : item.publishedCount; 3192 return item; 3193 }), items.length); 3194 }); 3195 } 3196 function fetchOffices(done) { 3197 var useRouter = auxUsesRouter('offices'); 3198 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3199 // selection set differs ({ items {...} } on the router). 3200 var selection = 'id, name, tags'; 3201 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. The two 3202 // APIs differ in more than the items wrapper: federated offices takes 3203 // companyId: ID! (legacy gateway: String), so each branch builds its whole doc. 3204 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 + '}}'; 3205 var payload = { 3206 offset: 0, 3207 limit: 100, 3208 companyId: variables.companyId 3209 }; 3210 3211 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3212 if (useRouter) { 3213 payload = window.luxuryPresence.routerApi.transformVariables('office
3213s', payload); 3214 } 3215 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3216 query: gqlQuery, 3217 variables: payload 3218 }).then(function (res) { 3219 var value = res.body.data && res.body.data.offices || {}; 3220 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3221 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3222 done(items, items.length); 3223 }); 3224 } 3225 3226 // ROUTER-CLEANUP: no rentalRates field on the federated router — legacy only. 3227 function fetchAllRentalRates(done) { 3228 var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl; 3229 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}'; 3230 var payload = { 3231 offset: 0, 3232 limit: 100, 3233 companyId: variables.companyId 3234 }; 3235 superagent.post(url + '/graphql').withCredentials().send({ 3236 query: gqlQuery, 3237 variables: payload 3238 }).then(function (res) { 3239 var items = res.body.data && res.body.data.rentalRates || []; 3240 done(items, items.length); 3241 }).catch(function (err) { 3242 console.error('Error fetching rental rates:', err); 3243 done([], 0); 3244 }); 3245 } 3246 function fetchData(params, done) { 3247 var resource = options.resource; 3248 var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource]; 3249 var payload = {}; 3250 try { 3251 payload = JSON.parse(JSON.stringify(variables)); 3252 } catch (e) { 3253 Object.keys(variables).forEach(function (variableName) { 3254 payload[variableName] = variables[variableName]; 3255 }); 3256 } 3257 payload.offset = (params.page - 1) * pageSize + offset; 3258 payload.limit = pageSize; 3259 payload.companyId = options.companyId; 3260 searchFormParams.forEach(function (formParam) { 3261 var val = params[formParam.formKey || formParam.param]; 3262 if (val !== null && val !== undefined) { 3263 objSet(payload, formParam.param, val); 3264 } 3265 }); 3266 3267 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3268 if (options.useRouterApi) { 3269 payload = window.luxuryPresence.routerApi.transformVariables(resource, payload); 3270 } 3271 3272 // TODO: Disabled loading due to jarring effect 3273 // dataContainer.html('Loading...'); 3274 superagent.post(apiUrl(options.useRouterApi) + '/graphql').withCredentials().send({ 3275 query: gqlQuery, 3276 variables: payload 3277 }).then(function (res) { 3278 if (res.body.errors) { 3279 done(res.body.errors); 3280 return; 3281 } 3282 var data = res.body.data || {}; 3283 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3284 var resources; 3285 var resourceCount; 3286 if (options.useRouterApi) { 3287 var page = window.luxuryPresence.routerApi.transformPage(data[resource]); 3288 resources = window.luxuryPresence.routerApi.transformResponse(resource, page.items); 3289 resourceCount = page.count; 3290 } else { 3291 resources = data[resource] || []; 3292 resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0; 3293 } 3294 const finish = function (items) { 3295 if (resource === 'properties' && propertyPlaceholderImage?.id) { 3296 items = items.map(item => { 3297 if (item.media?.length === 0) { 3298 return Object.assign(item, { 3299 media: [propertyPlaceholderImage] 3300 }); 3301 } 3302 return item; 3303 }); 3304 } 3305 done(null, items, resourceCount); 3306 }; 3307 3308 // ROUTER-CLEANUP: client half of PLAT-4073 — resolve the requested 3309 // disclaimers before rendering; older SDKs skip (keys stay unset). 3310 if (options.useRouterApi && resource === 'properties' && options.routerPropertyDisclaimers && options.routerPropertyDisclaimers.length && window.luxuryPresence.routerApi && typeof window.luxuryPresence.routerApi.applyPropertyDisclaimers === 'function') { 3311 window.luxuryPresence.routerApi.applyPropertyDisclaimers(resources, options.routerPropertyDisclaimers).then(finish); 3312 return; 3313 } 3314 finish(resources); 3315 }); 3316 } 3317 function getTotalPage() { 3318 return Math.ceil(totalNumber / pageSize); 3319 } 3320 function renderPaginationList() { 3321 var totalPages = getTotalPage(); 3322 var rangeStart = searchParams.page - pageRange; 3323 var rangeEnd = searchParams.page + pageRange; 3324 if (rangeEnd > totalPages) { 3325 rangeEnd = totalPages; 3326 rangeStart = totalPages - pageRange * 2; 3327 rangeStart = rangeStart < 1 ? 1 : rangeStart; 3328 } 3329 if (rangeStart <= 1) { 3330 rangeStart = 1; 3331 rangeEnd = Math.min(pageRange * 2 + 1, totalPages); 3332 } 3333 3334 // Making sure that 1 more page button is shown in edge positions 3335 if (pageRange === 0) { 3336 if (searchParams.page === totalPages) { 3337 rangeStart = totalPages <= 1 ? 1 : totalPages - 1; 3338 } 3339 if (searchParams.page === 1) { 3340 rangeEnd = Math.min(2, totalPages); 3341 } 3342 } 3343 3344 // Render pagination list 3345 if (mode === 'NUMBERED_PAGINATION') { 3346 el.innerHTML = generateHTML({ 3347 currentPage: searchParams.page, 3348 pageRange: pageRange, 3349 rangeStart: rangeStart, 3350 rangeEnd: rangeEnd 3351 }); 3352 if (totalPages < 2 && hidePaginationOnFirstPage) { 3353 container.style.display = 'none'; 3354 } else { 3355 container.style.display = ''; 3356 } 3357 } else if (mode === 'LOAD_MORE_BUTTON') { 3358 if (searchParams.page >= totalPages) {
3359 loadMoreButton.style.display = 'none'; 3360 } else { 3361 loadMoreButton.style.display = ''; 3362 } 3363 } 3364 } 3365 function render(data) { 3366 renderPaginationList(); 3367 3368 // Render new content with handlebars 3369 var html = ''; 3370 if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) { 3371 // If using load more, append search results to existing results 3372 html = dataContainer.innerHTML; 3373 } 3374 for (var i = 0; i < data.length; i++) { 3375 var itemData = recursivelyParse(data[i]); 3376 itemData.sectionIndex = options.sectionIndex; 3377 itemData.renderOptions = options.renderOptions; 3378 html += template(itemData); 3379 } 3380 dataContainer.innerHTML = html; 3381 3382 // Scroll Top 3383 if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) { 3384 // Only animate to the top if we replace dataContainer (numbered pagination) 3385 setTimeout(() => { 3386 const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset; 3387 window.scrollTo({ 3388 top: scrollTargetOffsetTop, 3389 behavior: 'smooth' 3390 }); 3391 }, 250); 3392 } 3393 return true; 3394 } 3395 function generateHTML(args) { 3396 const totalPages = getTotalPage(); 3397 const { 3398 rangeStart, 3399 rangeEnd 3400 } = args; 3401 const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 3402 ...searchParams, 3403 page 3404 }); 3405 let html = ''; 3406 if (showPrevious || showPageNumbers || showNext) { 3407 html += '<div class="paginationjs-pages"><ul>'; 3408 3409 // Previous button 3410 if (showPrevious) { 3411 if (searchParams.page <= 1) { 3412 html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`; 3413 } else { 3414 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>`; 3415 } 3416 } 3417 3418 // Pages 3419 if (showPageNumbers) { 3420 if (rangeStart <= 3) { 3421 for (let i = 1; i < rangeStart; i++) { 3422 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>`; 3423 } 3424 } else { 3425 if (showFirstOnEllipsisShow) { 3426 html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`; 3427 } 3428 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 3429 } 3430 for (let i = rangeStart; i <= rangeEnd; i++) { 3431 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>`; 3432 } 3433 if (rangeEnd < totalPages - 2) { 3434 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 3435 if (showLastOnEllipsisShow) { 3436 html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`; 3437 } 3438 } else { 3439 for (let i = rangeEnd + 1; i <= totalPages; i++) { 3440 html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`; 3441 } 3442 } 3443 } 3444 3445 // Next button 3446 if (showNext) { 3447 if (searchParams.page >= totalPages) { 3448 html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`; 3449 } else { 3450 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>`; 3451 } 3452 } 3453 html += '</ul></div>'; 3454 } 3455 return html; 3456 } 3457 function go(newSearchParams, callback, restorationVisit) { 3458 if (disabled) return; 3459 var goToPageNumber = newSearchParams.page; 3460 3461 // Page number is out of bounds 3462 if (!goToPageNumber || goToPageNumber < 1) return; 3463 var totalPage = getTotalPage(); 3464 3465 // Page number is out of bounds 3466 if (!restorationVisit && totalNumber > 0) { 3467 if (goToPageNumber > totalPage) return; 3468 } 3469 if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
3470 var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 3471 ...newSearchParams, 3472 page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null 3473 }); 3474 if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) { 3475 window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, { 3476 queryString: true 3477 })); 3478 } 3479 } 3480 3481 // Fetch and update page 3482 fetchData(newSearchParams, renderWithData); 3483 disabled = true; 3484 function renderWithData(err, data, count) { 3485 if (err) { 3486 dataContainer.dispatchEvent(new Event('error')); 3487 } else { 3488 searchParams = { 3489 ...newSearchParams 3490 }; 3491 totalNumber = count - offset; 3492 if (data.length === 0) { 3493 dataContainer.dispatchEvent(new Event('no-data')); 3494 } else { 3495 dataContainer.dispatchEvent(new Event('data')); 3496 } 3497 render(data); 3498 firstRender = false; 3499 } 3500 disabled = false; 3501 renderBySearch = false; 3502 } 3503 } 3504 function areQueryParamsEqual(first, second) { 3505 var differ = Object.keys(first).find(function (key) { 3506 return first[key] !== undefined && first[key] !== null && first[key] !== second[key]; 3507 }); 3508 if (differ) { 3509 return false; 3510 } 3511 differ = Object.keys(second).find(function (key) { 3512 return second[key] !== undefined && second[key] !== null && second[key] !== first[key]; 3513 }); 3514 return !differ; 3515 } 3516 function next(callback) { 3517 go({ 3518 ...searchParams, 3519 page: searchParams.page + 1 3520 }, callback); 3521 } 3522 function previous(callback) { 3523 go({ 3524 ...searchParams, 3525 page: searchParams.page - 1 3526 }, callback); 3527 } 3528 function refresh(callback) { 3529 go(searchParams, callback); 3530 } 3531 function update(params, callback) { 3532 renderBySearch = true; 3533 go(params, callback); 3534 } 3535 function observer() { 3536 if (searchContainer) { 3537 searchContainer.addEventListener('search', function (event, newSearchParams) { 3538 newSearchParams = event.detail || newSearchParams; 3539 update({ 3540 ...searchParams, 3541 ...newSearchParams, 3542 page: 1 3543 }); 3544 }); 3545 searchContainer.addEventListener('clear-search', function () { 3546 const defaultSearchParams = { 3547 ...DefaultSearchParams 3548 }; 3549 const isCurrentSearchFormStateDefault = areQueryParamsEqual({ 3550 ...defaultSearchParams, 3551 page: null 3552 }, { 3553 ...searchParams, 3554 page: null 3555 }); 3556 3557 // if mode is LOAD_MORE_BUTTON we should't make anything on clear 3558 // when search form have default state 3559 if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') { 3560 return; 3561 } 3562 3563 // if someone initially go to some page and click 'Clear' on search from 3564 // we should't navigate to first page. We should preserve page value 3565 if (isCurrentSearchFormStateDefault) { 3566 defaultSearchParams.page = searchParams.page; 3567 } 3568 syncSearchFormState(defaultSearchParams); 3569 update(defaultSearchParams); 3570 }); 3571 } 3572 if (mode === 'LOAD_MORE_BUTTON') { 3573 loadMoreButton.addEventListener('click', function (event) { 3574 go({ 3575 ...searchParams, 3576 page: searchParams.page + 1 3577 }); 3578 return false; 3579 }); 3580 } 3581 if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') { 3582 // Do initial render 3583 go(Object.assign({}, searchParams, { 3584 page: 1 3585 })); 3586 return; 3587 } 3588 if (mode === 'NUMBERED_PAGINATION') { 3589 // Go to specified page number 3590 container.addEventListener(eventPrefix + 'go', function (event) { 3591 let { 3592 pageNumber, 3593 done 3594 } = event.detail || {}; 3595 pageNumber = parseInt(pageNumber, 10); 3596 if (!pageNumber) { 3597 return; 3598 } 3599 go({ 3600 ...searchParams, 3601 page: pageNumber 3602 }, done); 3603 }); 3604 3605 // Page number button click 3606 el.addEventListener('click', function (event) { 3607 let clickTarget = event.target; 3608 let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next'); 3609 let pageNumber = current?.getAttribute('data-num'); 3610 if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) { 3611 return; 3612 } else { 3613 go({ 3614 ...searchParams, 3615 page: parseInt(pageNumber, 10) 3616 }); 3617 } 3618 event.preventDefault(); 3619 }); 3620 3621 // Whether to load the default page 3622 var defaultPageNumber = searchParams.page; 3623 if (triggerPagingOnInit) {
3624 container.dispatchEvent(new CustomEvent(eventPrefix + 'go', { 3625 detail: { 3626 pageNumber: defaultPageNumber 3627 } 3628 })); 3629 } 3630 } 3631 window.addEventListener('popstate', function (event) { 3632 var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 3633 if (!areQueryParamsEqual(newParams, searchParams)) { 3634 go(newParams, null, true); 3635 if (searchContainer) { 3636 syncSearchFormState(newParams); 3637 } 3638 } 3639 }); 3640 } 3641 function replaceVariables(template, variables) { 3642 var formattedString; 3643 for (var key in variables) { 3644 var value = variables[key]; 3645 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 3646 formattedString = (formattedString || template).replace(regexp, value); 3647 } 3648 return formattedString; 3649 } 3650 function isTextEditorValue(obj) { 3651 return 'raw' in obj || 'gjs' in obj; 3652 } 3653 function getTextEditorValue(obj) { 3654 if (!obj.html) { 3655 return ''; 3656 } 3657 var data = obj.html; 3658 var css = (obj.raw || obj.gjs || {}).css; 3659 if (css) { 3660 data = data + '<style>' + css + '</style>'; 3661 } 3662 return data; 3663 } 3664 3665 /** 3666 * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor. 3667 * strips out raw proprties and returns only HTML if it exists. 3668 * @param {Object} resources a collection retrieved from the database 3669 * @return {Object} the newly modified object. 3670 */ 3671 function recursivelyParse(resources) { 3672 forEach(resources, function (value, key) { 3673 if (!value) { 3674 return; 3675 } 3676 if (value instanceof Object) { 3677 if (isTextEditorValue(value)) { 3678 resources[key] = getTextEditorValue(value); 3679 return; 3680 } else { 3681 return recursivelyParse(value); 3682 } 3683 } 3684 try { 3685 var parsedData = JSON.parse(value); 3686 if (isTextEditorValue(parsedData)) { 3687 resources[key] = getTextEditorValue(parsedData); 3688 } 3689 } catch (e) { 3690 // do nothing if we failed to parse value as JSON 3691 } 3692 }); 3693 return resources; 3694 } 3695 function forEach(collection, iteratee) { 3696 var func = Array.isArray(collection) ? arrayEach : baseFor; 3697 return func(collection, iteratee); 3698 } 3699 function baseFor(object, iteratee) { 3700 if (!object) { 3701 return; 3702 } 3703 var iterable = Object(object); 3704 var props = Object.keys(object); 3705 var length = props.length; 3706 var index = -1; 3707 while (length--) { 3708 var key = props[++index]; 3709 if (iteratee(iterable[key], key, iterable) === false) { 3710 break; 3711 } 3712 } 3713 return object; 3714 } 3715 function objSet(obj, path, value) { 3716 const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g); 3717 pathArray.reduce((acc, key, i) => { 3718 if (acc[key] === undefined) acc[key] = {}; 3719 if (i === pathArray.length - 1) acc[key] = value; 3720 return acc[key]; 3721 }, obj); 3722 } 3723 function arrayEach(array, iteratee) { 3724 var index = -1; 3725 var length = array.length; 3726 while (++index < length) { 3727 if (iteratee(array[index], index, array) === false) { 3728 break; 3729 } 3730 } 3731 return array; 3732 } 3733 function selectPageRangeMode(e) { 3734 pageRange = e.matches ? mobilePageRange : desktopPageRange; 3735 renderPaginationList(); 3736 } 3737 paginationMql.addEventListener('change', selectPageRangeMode); 3738})('section-b77708cd-fdfc-4613-9af8-1194d5b50ae8', JSON.parse("{\"pageSize\":\"6\",\"resource\":\"posts\",\"pageRange\":1,\"variables\":{\"limit\":6,\"offset\":0,\"sortDir\":\"DESC\",\"companyId\":\"d2a359c0-d879-4840-938b-f0bb8351cc6c\",\"categoryId\":\"{{pageElement.categoryId}}\",\"order\":\"createdAt\",\"categoryIds\":[\"cc21cbea-bcdc-48cf-b18a-a2d8e6ee7bc3\"]},\"hidePaginationOnFirstPage\":true,\"companyId\":\"d2a359c0-d879-4840-938b-f0bb8351cc6c\",\"usePageResource\":false,\"sectionIndex\":2,\"useRouterApi\":true,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 3739} catch(e) { 3740console.log(e); 3741} 3742 try { 3743(function init(sectionDomId) {}
3743)('section-b77708cd-fdfc-4613-9af8-1194d5b50ae8', JSON.parse("{\"resource\":\"posts\",\"useRouterApi\":true,\"companyId\":\"d2a359c0-d879-4840-938b-f0bb8351cc6c\",\"usePageResource\":false,\"sectionIndex\":2,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 3744} catch(e) { 3745console.log(e); 3746} 3747 try { 3748(function init(sectionDomId) { 3749 var $contactForm = $('#' + sectionDomId + ' .newsletter-signup__form'); 3750 $contactForm.find('.contact-form__reset').click(function (e) { 3751 e.preventDefault(); 3752 $(this).closest('form').removeClass('success').trigger("reset"); 3753 }); 3754 $contactForm.find('input[name="name"]').on("keyup", function () { 3755 if (this.value.replaceAll(/\d/g, "").trim() === "") { 3756 this.setCustomValidity("Please enter your name."); 3757 } else { 3758 this.setCustomValidity(""); 3759 } 3760 }); 3761 const form = $("#" + sectionDomId).find("form"); 3762 const redirectLink = $('#' + sectionDomId + ' .redirect-link'); 3763 form.on("reset", function () { 3764 redirectPage(redirectLink); 3765 }); 3766 function redirectPage(link) { 3767 if (link.length) { 3768 const rawHref = link.attr('href'); 3769 link.attr('href', setHttp(rawHref)); 3770 link[0].click(); 3771 } 3772 } 3773 function setHttp(link) { 3774 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 3775 link = 'http://' + link; 3776 } 3777 return link; 3778 } 3779})('section-c49e3a85-d2a3-4eeb-a16e-f65587d5fe99', 'undefined'); 3780} catch(e) { 3781console.log(e); 3782} 3783 3784 var { body } = document; 3785 var globalNav = body.querySelector(':scope > nav'); 3786 var globalSideMenu = body.querySelector(':scope > div.sidemenu'); 3787 3788 document.querySelectorAll('body > .modal .close').forEach(modalCloseBtn => { 3789 modalCloseBtn.addEventListener('click', function() { 3790 window.lpUI.hideClosestModal(modalCloseBtn); 3791 }); 3792 }); 3793 3794 window.addEventListener('click', function() { 3795 document.querySelectorAll('.share-popup').forEach(sharedPopup => { 3796 sharedPopup.style.display = 'none' ; 3797 }); 3798 }); 3799 3800 /* Misc Partials / Addons */ 3801 function initWOW() { 3802 if (wow) { 3803 wow.init(); 3804 wow.scrollHandler(); 3805 setTimeout(function () { 3806 const wowHideStyle = document.getElementById('wow-hide-elements'); 3807 if(wowHideStyle) { 3808 wowHideStyle.disabled = true; 3809 } 3810 }, 1); 3811 } 3812 } 3813 3814 const wowHideElements = document.getElementById('wow-hide-elements'); 3815 if (wowHideElements) { 3816 wowHideElements.disabled = false; 3817 } 3818 3819 initWOW(); 3820 3821 /* Generic Navbar Handling */ 3822 globalNav?.querySelectorAll('.hamburger-component').forEach(hamburgerComponent => { 3823 hamburgerComponent.addEventListener('click', function() { 3824 window.lpUI.sideMenuToggle(); 3825 }); 3826 }); 3827 globalSideMenu?.querySelectorAll('.toggle').forEach(toggleEl => { 3828 toggleEl.addEventListener('click', function() { 3829 window.lpUI.sideMenuToggle(); 3830 }); 3831 }); 3832 3833 document.querySelectorAll('body > nav .sub-nav-container > a, body > div.sidemenu .sub-nav-container > a').forEach(linkEl => { 3834 linkEl.addEventListener('click', function(e) { 3835 e.preventDefault(); 3836 e.stopPropagation(); 3837 var subNav = linkEl.parentElement.querySelector(':scope > .sub-nav'); 3838 if (subNav && subNav.classList.contains('visible')){ 3839 subNav.classList.remove('visible'); 3840 } else { 3841 globalNav?.querySelectorAll('.sub-nav-container .sub-nav').forEach(globalSubNav => { 3842 globalSubNav.classList.remove('visible'); 3843 }); 3844 globalSideMenu?.querySelectorAll('.sub-nav').forEach(sideMenuSubNav => { 3845 sideMenuSubNav.classList.remove('visible'); 3846 }); 3847 subNav?.classList.add('visible'); 3848 } 3849 }); 3850 }); 3851 window.addEventListener('click', function() { 3852 document.querySelectorAll('nav .sub-nav.visible, .sidemenu .sub-nav.visible').forEach(subNavEl => { 3853 subNavEl.classList.remove('visible'); 3854 }); 3855 }); 3856 3857 } 3858 3859 document.addEventListener('DOMContentLoaded', lpGlobalInit); 3860 3861 </script>
3861 3862 3863
3863<script type="module"> 3864 function selectorExists(selector) { 3865 return document.querySelector(selector) !== null; 3866 } 3867 3868 // Function to initialize the third-party library 3869 function initParoller(selector = '.my-paroller') { 3870 var $parollerElements = $(selector); 3871 if ($parollerElements.length > 0 && typeof $parollerElements.paroller === 'function') { 3872 $parollerElements.paroller(); 3873 } 3874 } 3875 3876 const parollerSelector = '.my-paroller'; 3877 3878 if (selectorExists(parollerSelector)) { 3879 window.luxuryPresence.libs.loadJs(window.luxuryPresence.libs.jsLibsMap.paroller.jsSrc, function() { 3880 initParoller(parollerSelector); 3881 window.luxuryPresence.libs.jsLibsMap.paroller.isLoaded = true; 3882 }); 3883 } 3884 </script>
3884 3885 3886 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 3886-3887
3886 3887 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3887GTM-PSHL83P
vendor: 107 bytes, lines 3887-3889
3887" 3888 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 3889
3889<!-- End Google Tag Manager --> 3890 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 3890-3891
3890 3891 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3891GTM-NRB4D5T
vendor: 107 bytes, lines 3891-3893
3891" 3892 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 3893
3893<!-- End Google Tag Manager --> 3894 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 3894-3895
3894 3895 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3895GTM-T9SFQGHZ
vendor: 107 bytes, lines 3895-3897
3895" 3896 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 3897
3897<!-- End Google Tag Manager --> 3898 <!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 3898-3899
3898 3899<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3899GTM-N69GP49
vendor: 85 bytes, lines 3899-3900
3899" 3900height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
3901<!-- End Google Tag Manager (noscript) --> 3902 3903 3904<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 3904-3905
3904 3905<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3905GTM-KBFVRKS
vendor: 85 bytes, lines 3905-3906
3905" 3906height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
3907<!-- End Google Tag Manager (noscript) --> 3908 3909 3910
3910<script 3911 src="https://cdn.luxurypresence.com/scripts/a11y-widget/latest/widget.js" 3912 data-website-id="2b9f3b9c-8d13-4525-81b1-0e846aa51be2" 3913 3914 defer></script>
vendor: 1 bytes, line 3914
3914
3915<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:'a450eca8f84523d3',t:'MTc5MTA4MjcwMg=='};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>
3915<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"d2a8f4b3d65944edb8fcd6ffce49ee5e","spa":2}' crossorigin="anonymous"></script>
3915 3916</body> 3917</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.