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>The Team | Hedge Realty | Petaluma Real Estate Team</title> 10 <meta property="og:title" content="The Team | Hedge Realty | Petaluma Real Estate Team"> 11 <meta name="twitter:title" content="The Team | Hedge Realty | Petaluma Real Estate Team"> 12 <meta name="description" content="Our team in the backfield. What makes us click? The things that make you click. Keeping listings up to date and more at your finger tips. Attention to detail. And the big picture. We love it. And do it well."> 13 <meta property="og:description" content="Our team in the backfield. What makes us click? The things that make you click. Keeping listings up to date and more at your finger tips. Attention to detail. And the big picture. We love it. And do it well."> 14 <meta name="twitter:description" content="Our team in the backfield. What makes us click? The things that make you click. Keeping listings up to date and more at your finger tips. Attention to detail. And the big picture. We love it. And d..."> 15 <meta property="og:image" content="https://media-production.lp-cdn.com/media/eba1509a-a365-4d52-b85f-17594a8a53b4"> 16 <meta name="twitter:image" content="https://media-production.lp-cdn.com/media/eba1509a-a365-4d52-b85f-17594a8a53b4"> 17 <meta property="og:url" content="https://hedgerealty.com/agent"> 18 <link rel="canonical" href="https://hedgerealty.com/agent"> 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=Raleway:100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Baskervville:400,400i"> 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:Raleway,sans-serif;--global-primary-font-family-short:Raleway;--global-secondary-font-family:Baskervville,serif;--global-secondary-font-family-short:Baskervville;--global-body-padding:0px;--global-background-color:#fff;--global-body-font-size:19px;--global-h1-font-size:45px;--global-h2-font-size:41px;--global-h3-font-size:30px;--global-h4-font-size:21px;--global-h5-font-size:17px;--global-h6-font-size:16px;--global-section-padding:96px;}@media (max-width: 768px){:root{--global-section-padding:64px;}}body{padding:0px;background-color:#fff;font-family:Baskervville,serif;font-size:19px;}@media (min-width: 768px){body{padding:0px 0px 0px 0px;}}h1,h2,h3,h4,h5,h6,button{font-family:Raleway,sans-serif;}h1{font-size:45px;}h2{font-size:41px;}h3{font-size:30px;}h4{font-size:21px;}h5{font-size:17px;}h6{font-size:16px;}</style> 30 <link rel="stylesheet" type="text/css" href="https://styles.luxurypresence.com/producer/index.css" /> 31 <style id="website-css">@import url('https://fonts.googleapis.com/css?family=Karla|Playfair+Display');@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Medium.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Medium.woff') format('woff');font-weight:500;font-style:normal;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-MediumItalic.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-MediumItalic.woff') format('woff');font-weight:500;font-style:italic;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-HeavyItalic.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-HeavyItalic.woff') format('woff');font-weight:900;font-style:italic;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-LightItalic.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-LightItalic.woff') format('woff');font-weight:300;font-style:italic;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Heavy.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Heavy.woff') format('woff');font-weight:900;font-style:normal;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Book.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Book.woff') format('woff');font-weight:normal;font-style:normal;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-BookItalic.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-BookItalic.woff') format('woff');font-weight:normal;font-style:italic;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-BoldItalic.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-BoldItalic.woff') format('woff');font-weight:bold;font-style:italic;}@font-face{font-family:'Futura';src:url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Light.woff2') format('woff2'),url('https://d1e1jt2fj4r8r.cloudfront.net/fonts/Futura/FuturaBT-Light.woff') format('woff');font-weight:300;font-style:normal;}:root{--global-primary-font-family:"Futura",sans-serif;--global-primary-font-family-short:"Futura",sans-serif;--global-secondary-font-family:"Futura",sans-serif;--global-secondary-font-family-short:"Futura",sans-serif;}nav .header{background-color:transparent;color:#000;}nav .header__logo .dark{display:block!important;}nav .header__logo .light{display:none!important;}nav .header{position:fixed;width:100%;}nav .navigation__link{font-family:var(--global-primary-font-family);}nav .navigation__link:before{display:none!important;}nav .navigation__link span{font-size:14px;}nav .navigation__link span:hover{font-weight:700!important;}nav .sub-nav ul li a{font-family:var(--global-primary-font-family);text-transform:uppercase;font-size:14px!important;}#global-navbar .scroll{color:#000;}#global-navbar{-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;transform:none!important;}nav#global-navbar .header .navigation .navigation__item .sub-nav .sub-nav.visible{background-color:transparent;width:230px;}nav#global-navbar .header .navigation .navigation__item .sub-nav .sub-nav.visible .nav-link:hover{font-weight:700;background-color:transparent;}#global-navbar .header .container{max-width:1920px;}#global-navbar .header .hamburger{display:none;}@media (max-width: 767px){#global-navbar .header .hamburger{display:block;}}#global-sidemenu .sub-nav a{font-size:20px;line-height:20px;}@media (min-width: 1295px){footer .footer div.info-wrap-contact_zone{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important;}}@media (max-width: 768px){footer .footer.no_newsletter .info-wrap-contact_zone:first-of-type{margin-bottom:20px!important;}}@media (max-width: 1300px){section:not(#any) .full-bleed-container .hoverable-image{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}section:not(#any) .full-bleed-container .hoverable-image--reverse .hoverable-image__text-wrap{padding:0;}section:not(#any) .full-bleed-container .hoverable-image--straight .hoverable-image__text-wrap{padding-left:0;}section:not(#any) .full-bleed-container .hoverable-image__text-col{padding:0;margin-top:29px;margin-bottom:0;}section:not(#any) .full-bleed-container .hoverable-image__text-col .lp-container{position:static;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);left:0;}}#global-footer .footer .info-wrap{text-align:center;}h1{font-size:37px;}h2{font-size:36px;}h3{font-size:21px;}#global-navbar.scroll{background-color:#1a1a1a00!important;}.header__left{-webkit-box-pack:end!important;-ms-flex-pack:end!important;
31-webkit-justify-content:flex-end!important;justify-content:flex-end!important;-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;padding:0 100px 0 100px;}.header .header__right{-webkit-box-pack:start!important;-ms-flex-pack:start!important;-webkit-justify-content:flex-start!important;justify-content:flex-start!important;padding:0 100px 0 100px;}nav#global-navbar .sub-nav-container:hover .sub-nav{background-color:transparent;width:230px;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);visibility:visible;opacity:1;}nav#global-navbar .sub-nav-container:hover .sub-nav ul li a.nav-link:hover{font-weight:700!important;background:transparent!important;}nav#global-navbar .sub-nav-container:nth-child(3):hover .sub-nav{-webkit-transform:translate(-30%, 100%)!important;-moz-transform:translate(-30%, 100%)!important;-ms-transform:translate(-30%, 100%)!important;transform:translate(-30%, 100%)!important;}nav#global-navbar .sub-nav-container:nth-child(3):hover .sub-nav ul li a.nav-link:hover{font-weight:700!important;background:transparent!important;}#global-footer .footer .info-wrap-contact_cell{text-transform:none;}.info-wrap-contact_title{text-transform:uppercase;}.contact_title{text-transform:uppercase;}nav .navigation__link{font-size:11px!important;font-weight:400!important;}nav#global-navbar.scroll .header{background-color:rgba(255, 255, 255, 0.8);}nav#global-navbar .header{background-color:rgba(255, 255, 255, 0.8);}nav#global-navbar .header .navigation ul li a{background-color:#fff;}nav#global-navbar .sub-nav-container:nth-child(3):hover .sub-nav ul li a.nav-link:hover{background:rgba(255, 255, 255, 0.8)!important;}nav#global-navbar .sub-nav-container:hover .sub-nav ul li a.nav-link:hover{background:rgba(255, 255, 255, 0.8)!important;}</style> 32 <style id="wow-hide-elements">.wow{visibility:hidden!important}</style> 33 <style id="page-css"> 34 #section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2{background-attachment:fixed;-webkit-background-position:center;background-position:center;background-repeat:...background-size:cover;color:rgba(255, 255, 255, 1);--fontColor:rgba(255, 255, 255, 1);--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#ffffff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#ffffff;--gradient-color:var(--overlay-color, rgba(0, 0, 0, 0.3));background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/qqbrperz6joc7rnguoho');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}@media (max-width: 767px){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2{background-attachment:scroll;}}#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 h1{text-transform:lowercase;letter-spacing:6px;}#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .custom-intro{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:600px;-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;}#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .custom-intro .container{z-index:1;text-align:center;max-width:900px;}#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .custom-intro__title{margin-bottom:0px;font-weight:400;margin-bottom:24px;}@media (max-width: 768px){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .custom-intro__title{font-size:32px;}}@media (max-width: 360px){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .custom-intro__title{font-size:22px;}}#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .custom-intro__subtitle{font-weight:400;white-space:pre-line;font-size:21px;line-height:1.57;}@media (max-width: 768px){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .custom-intro__subtitle{font-size:18px;}}#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2 .description{margin-bottom:15px;}@media (min-width: 960px) and (orientation: landscape){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2{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/qqbrperz6joc7rnguoho');}}@media (min-width: 1280px) and (orientation: landscape){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2{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/qqbrperz6joc7rnguoho');}}@media (min-width: 1920px) and (orientation: landscape){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2{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/qqbrperz6joc7rnguoho');}}@media (min-width: 2560px) and (orientation: landscape){#section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2{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/qqbrperz6joc7rnguoho');}}#section-03af5970-969f-4ce5-87e6-2b86762a7411{color:#000;--fontColor:#000;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:0%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#fff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;--section-padding-bottom:calc(0 / 4 * var(--global-section-padding));background-color:#fff;}#section-03af5970-969f-4ce5-87e6-2b86762a7411 h2{text-transform:lowercase;font-size:36px;letter-spacing:4px;}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .boxed-text__description{margin-bottom:50px;text-align:center;}@media (max-width: 768px){#section-03af5970-969f-4ce5-87e6-2b86762a7411 .boxed-text__description{margin-bottom:30px;}}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .lp-title-group .lp-h2{margin-top:0;}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .button-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;}@media(max-width: 600px){#section-03af5970-969f-4ce5-87e6-2b86762a7411 .button-container{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .button-container .lp-btn{margin-right:20px;}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .button-container .lp-btn:last-of-type{margin-right:0;}@media(max-width: 600px){#section-03af5970-969f-4ce5-87e6-2b86762a7411 .button-container .lp-btn{margin-right:0px;margin-bottom:20px;width:100%;}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .button-container .lp-btn:last-of-type{margin-bottom:0;}}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .lp-text--subtitle{margin-left:auto;margin-right:auto;text-transform:none;}#section-03af5970-969f-4ce5-87e6-2b86762a7411 .redesign p{margin-bottom:1.666rem;}#section-03af5970-969f-4ce5-87e6-2b86762a7411>div:last-child{padding-bottom:calc(0 / 4 * var(--global-section-padding))!important;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174{color:#000000;--fontColor:#000000;--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;background-color:rgba(255, 255, 255, 1);}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(7),#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(9){visibility:hidden;}@media (max-width:900px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(7),#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(9){display:none;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container .team-member__image-wrap .team-member__image{width:61.2%;padding-top:79%;margin:auto;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container .team-member__image-wrap .team-member__hover:before{width:63%!important;height:100%!important;top:0%;left:19%;border:2px solid #000000;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container .team-member__image-wrap .team-member__hover:after{display:none;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container .team-member__image-wrap .team-member__hover .team-member__btn{width:57%;font-size:1vh;margin-left:1%;position:relative;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(4),#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(5),#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(6),#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .container .team-grid__wrapper .team-member__container:nth-child(8){pointer-events:none;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .lp-h2{font-size:36px;letter-spacing:4px;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid{padding:140px 0 90px;}@media (max-width: 768px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid{padding:40px 0;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid__title{text-align:center;margin-bottom:50px;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid .lp-input{width:100%;height:35px;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid__wrapper{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-left:-25px;margin-right:-25px;}@media(min-width: 1001px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid__wrapper.two-col{max-width:750px;width:100%;margin:0 auto;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid__wrapper.two-col .team-member__container{width:50%;}}@media(max-width: 1000px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid__wrapper{max-width:1000px;}}@media (max-width: 768px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-grid__wrapper{-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;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container{width:33.333%;padding-left:25px;padding-right:25px;margin-bottom:50px;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:first-child{margin-left:auto;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:last-child{margin-right:auto;}@media(max-width: 1000px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container{width:50%;}}@media (max-width: 768px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container{width:100%;}}@media (hover: hover) and (pointer: fine){@media (min-width: 769px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:hover .team-member__image{opacity:.5;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:hover .team-member__hover{opacity:1;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:hover .team-member__hover::before,#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:hover .team-member__hover::after{width:100%;height:100%;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:hover .team-member__hover::before{border-top-color:inherit;border-right-color:inherit;-webkit-transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container:hover .team-member__hover::after{border-bottom-color:inherit;border-left-color:inherit;-webkit-transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;}}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__container.filtered-out{display:none;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__link{position:relative;display:block;height:100%;cursor:pointer;color:inherit;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__image{position:relative;width:100%;padding-top:130%;background-color:#cccccc;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__image img{position:absolute;object-fit:cover;width:100%;height:100%;top:0;left:0;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__image-wrap{position:relative;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__hover{opacity:0;position:absolute;top:0;right:0;left:0;bottom:0;-webkit-transform:translate(20px, 20px);-moz-transform:translate(20px, 20px);-ms-transform:translate(20px, 20px);transform:translate(20px, 20px);
34display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:10px;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__hover:before,#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__hover:after{content:' ';position:absolute;border:2px solid transparent;width:0;height:0;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__hover:before{top:0;left:0;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__hover:after{bottom:0;right:0;}@media (hover:none) and (pointer: coarse){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__hover{display:none;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__name{display:block;margin-top:25px;font-size:30px;line-height:40px;font-weight:400;font-family:var(--global-primary-font-family);}@media (max-width: 560px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__name{font-size:18px;line-height:29px;letter-spacing:0.75px;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__role{display:block;margin-top:8px;font-size:14px;line-height:24px;font-weight:700;font-family:inherit;text-transform:uppercase;letter-spacing:1.5px;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__license{font-size:13px;text-transform:uppercase;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__info{text-align:center;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .team-member__btn{margin-bottom:60px;position:relative;z-index:1;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .form-container{padding-bottom:48px;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .search-form{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-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0 -10px -8px;}@media (max-width: 600px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .search-form{-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:0;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .input-group{-webkit-flex:1 0 250px;-ms-flex:1 0 250px;flex:1 0 250px;max-width:300px;position:relative;margin:8px 10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (max-width: 600px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .input-group{-webkit-flex:1;-ms-flex:1;flex:1;max-width:unset;margin:8px 0;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .search-icon{position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:0;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .search-clear-icon{color:#b2b2b2;position:absolute;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:40px;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .search-clear-icon:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .is-empty .search-clear-icon{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .search-input{padding-right:65px;}@media (max-width: 569px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .search-input{padding-bottom:5px;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-toggle{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;outline:none;text-align:left;cursor:pointer;position:relative;padding-right:65px;overflow:hidden;text-overflow:ellipsis;text-transform:none;font-family:var(--global-secondary-font-family);}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-open-icon{position:absolute;right:17px;top:calc(50% - 1px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform .3s ease;transition:transform .3s ease;cursor:pointer;color:#b2b2b2;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-clear{color:#b2b2b2;position:absolute;right:40px;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-clear:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}@media (max-width: 639px){#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-clear{display:none;}}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-dropdown{position:absolute;width:100%;top:calc(100% + 5px);overflow:hidden;height:0;-webkit-transition:height 0.3s ease;transition:height 0.3s ease;background-color:#f5f5f5;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-dropdown.on-top{bottom:calc(100% + 5px);top:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-dropdown.opened{z-index:999;position:fixed;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-dropdown-wrapper{width:100%;overflow:hidden auto;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-optgroup{width:100%;padding:11px 20px;color:#b2b2b2;cursor:default;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-option{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;text-align:left;width:100%;border:none;border-radius:0;background-color:transparent;cursor:pointer;padding:11px 20px;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;text-transform:none;font-family:var(--global-secondary-font-family);}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select-option:hover{background-color:#b2b2b2;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select{-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select.is-empty .c-select-toggle{color:#b2b2b2;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select.is-empty .c-select-clear{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .c-select.opened .c-select-open-icon{color:currentColor;-webkit-transform:translateY(-50%) rotateX(180deg);-moz-transform:translateY(-50%) rotateX(180deg);-ms-transform:translateY(-50%) rotateX(180deg);transform:translateY(-50%) rotateX(180deg);}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .empty-message{padding:160px 0;text-align:center;display:none;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .empty-message.visible{display:block;}#section-40e257c9-edea-4cb8-9ee1-32c3ade9c174 .visually-hidden{position:absolute;overflow:hidden;clip:rect(0 0 0 0);width:1px;height:1px;margin:-1px;padding:0;border:0;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9{color:#000000;--fontColor:#000000;--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;--section-padding-top:calc(2 / 4 * var(--global-section-padding));background-color:rgba(255, 255, 255, 1);}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(7),#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(9){visibility:hidden;}
34@media (max-width:900px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(7),#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(9){display:none;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container .team-member__image-wrap .team-member__image{width:61.2%;padding-top:79%;margin:auto;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container .team-member__image-wrap .team-member__hover:before{width:63%!important;height:100%!important;top:0%;left:19%;border:2px solid #000000;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container .team-member__image-wrap .team-member__hover:after{display:none;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container .team-member__image-wrap .team-member__hover .team-member__btn{width:57%;font-size:1vh;margin-left:1%;position:relative;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(4),#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(5),#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(6),#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .container .team-grid__wrapper .team-member__container:nth-child(8){pointer-events:none;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .lp-h2{font-size:36px;letter-spacing:4px;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid{padding:140px 0 90px;}@media (max-width: 768px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid{padding:40px 0;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid__title{text-align:center;margin-bottom:50px;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid .lp-input{width:100%;height:35px;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid__wrapper{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-left:-25px;margin-right:-25px;}@media(min-width: 1001px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid__wrapper.two-col{max-width:750px;width:100%;margin:0 auto;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid__wrapper.two-col .team-member__container{width:50%;}}@media(max-width: 1000px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid__wrapper{max-width:1000px;}}@media (max-width: 768px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-grid__wrapper{-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;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container{width:33.333%;padding-left:25px;padding-right:25px;margin-bottom:50px;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:first-child{margin-left:auto;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:last-child{margin-right:auto;}@media(max-width: 1000px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container{width:50%;}}@media (max-width: 768px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container{width:100%;}}@media (hover: hover) and (pointer: fine){@media (min-width: 769px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:hover .team-member__image{opacity:.5;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:hover .team-member__hover{opacity:1;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:hover .team-member__hover::before,#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:hover .team-member__hover::after{width:100%;height:100%;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:hover .team-member__hover::before{border-top-color:inherit;border-right-color:inherit;-webkit-transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container:hover .team-member__hover::after{border-bottom-color:inherit;border-left-color:inherit;-webkit-transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;}}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__container.filtered-out{display:none;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__link{position:relative;display:block;height:100%;cursor:pointer;color:inherit;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__image{position:relative;width:100%;padding-top:130%;background-color:#cccccc;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__image img{position:absolute;object-fit:cover;width:100%;height:100%;top:0;left:0;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__image-wrap{position:relative;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__hover{opacity:0;position:absolute;top:0;right:0;left:0;bottom:0;-webkit-transform:translate(20px, 20px);-moz-transform:translate(20px, 20px);-ms-transform:translate(20px, 20px);transform:translate(20px, 20px);
34display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:10px;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__hover:before,#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__hover:after{content:' ';position:absolute;border:2px solid transparent;width:0;height:0;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__hover:before{top:0;left:0;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__hover:after{bottom:0;right:0;}@media (hover:none) and (pointer: coarse){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__hover{display:none;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__name{display:block;margin-top:25px;font-size:30px;line-height:40px;font-weight:400;font-family:var(--global-primary-font-family);}@media (max-width: 560px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__name{font-size:18px;line-height:29px;letter-spacing:0.75px;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__role{display:block;margin-top:8px;font-size:14px;line-height:24px;font-weight:700;font-family:inherit;text-transform:uppercase;letter-spacing:1.5px;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__license{font-size:13px;text-transform:uppercase;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__info{text-align:center;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .team-member__btn{margin-bottom:60px;position:relative;z-index:1;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .form-container{padding-bottom:48px;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .search-form{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-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0 -10px -8px;}@media (max-width: 600px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .search-form{-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:0;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .input-group{-webkit-flex:1 0 250px;-ms-flex:1 0 250px;flex:1 0 250px;max-width:300px;position:relative;margin:8px 10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (max-width: 600px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .input-group{-webkit-flex:1;-ms-flex:1;flex:1;max-width:unset;margin:8px 0;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .search-icon{position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:0;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .search-clear-icon{color:#b2b2b2;position:absolute;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:40px;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .search-clear-icon:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .is-empty .search-clear-icon{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .search-input{padding-right:65px;}@media (max-width: 569px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .search-input{padding-bottom:5px;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-toggle{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;outline:none;text-align:left;cursor:pointer;position:relative;padding-right:65px;overflow:hidden;text-overflow:ellipsis;text-transform:none;font-family:var(--global-secondary-font-family);}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-open-icon{position:absolute;right:17px;top:calc(50% - 1px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform .3s ease;transition:transform .3s ease;cursor:pointer;color:#b2b2b2;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-clear{color:#b2b2b2;position:absolute;right:40px;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-clear:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}@media (max-width: 639px){#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-clear{display:none;}}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-dropdown{position:absolute;width:100%;top:calc(100% + 5px);overflow:hidden;height:0;-webkit-transition:height 0.3s ease;transition:height 0.3s ease;background-color:#f5f5f5;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-dropdown.on-top{bottom:calc(100% + 5px);top:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-dropdown.opened{z-index:999;position:fixed;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-dropdown-wrapper{width:100%;overflow:hidden auto;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-optgroup{width:100%;padding:11px 20px;color:#b2b2b2;cursor:default;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-option{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;text-align:left;width:100%;border:none;border-radius:0;background-color:transparent;cursor:pointer;padding:11px 20px;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;text-transform:none;font-family:var(--global-secondary-font-family);}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select-option:hover{background-color:#b2b2b2;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select{-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select.is-empty .c-select-toggle{color:#b2b2b2;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select.is-empty .c-select-clear{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .c-select.opened .c-select-open-icon{color:currentColor;-webkit-transform:translateY(-50%) rotateX(180deg);-moz-transform:translateY(-50%) rotateX(180deg);-ms-transform:translateY(-50%) rotateX(180deg);transform:translateY(-50%) rotateX(180deg);}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .empty-message{padding:160px 0;text-align:center;display:none;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .empty-message.visible{display:block;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9 .visually-hidden{position:absolute;overflow:hidden;clip:rect(0 0 0 0);width:1px;height:1px;margin:-1px;padding:0;border:0;}#section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9>div:last-child{padding-top:calc(2 / 4 * var(--global-section-padding))!important;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a{color:#000000;--fontColor:#000000;--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;--section-padding-top:calc(2 / 4 * var(--global-section-padding));background-color:rgba(255, 255, 255, 1);}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(7),#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(9){visibility:hidden;}
34@media (max-width:900px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(7),#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(9){display:none;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container .team-member__image-wrap .team-member__image{width:61.2%;padding-top:79%;margin:auto;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container .team-member__image-wrap .team-member__hover:before{width:63%!important;height:100%!important;top:0%;left:19%;border:2px solid #000000;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container .team-member__image-wrap .team-member__hover:after{display:none;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container .team-member__image-wrap .team-member__hover .team-member__btn{width:57%;font-size:1vh;margin-left:1%;position:relative;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(4),#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(5),#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(6),#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .container .team-grid__wrapper .team-member__container:nth-child(8){pointer-events:none;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .lp-h2{font-size:36px;letter-spacing:4px;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid{padding:140px 0 90px;}@media (max-width: 768px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid{padding:40px 0;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid__title{text-align:center;margin-bottom:50px;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid .lp-input{width:100%;height:35px;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid__wrapper{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-left:-25px;margin-right:-25px;}@media(min-width: 1001px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid__wrapper.two-col{max-width:750px;width:100%;margin:0 auto;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid__wrapper.two-col .team-member__container{width:50%;}}@media(max-width: 1000px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid__wrapper{max-width:1000px;}}@media (max-width: 768px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-grid__wrapper{-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;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container{width:33.333%;padding-left:25px;padding-right:25px;margin-bottom:50px;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:first-child{margin-left:auto;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:last-child{margin-right:auto;}@media(max-width: 1000px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container{width:50%;}}@media (max-width: 768px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container{width:100%;}}@media (hover: hover) and (pointer: fine){@media (min-width: 769px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:hover .team-member__image{opacity:.5;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:hover .team-member__hover{opacity:1;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:hover .team-member__hover::before,#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:hover .team-member__hover::after{width:100%;height:100%;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:hover .team-member__hover::before{border-top-color:inherit;border-right-color:inherit;-webkit-transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container:hover .team-member__hover::after{border-bottom-color:inherit;border-left-color:inherit;-webkit-transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;}}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__container.filtered-out{display:none;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__link{position:relative;display:block;height:100%;cursor:pointer;color:inherit;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__image{position:relative;width:100%;padding-top:130%;background-color:#cccccc;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__image img{position:absolute;object-fit:cover;width:100%;height:100%;top:0;left:0;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__image-wrap{position:relative;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__hover{opacity:0;position:absolute;top:0;right:0;left:0;bottom:0;-webkit-transform:translate(20px, 20px);-moz-transform:translate(20px, 20px);-ms-transform:translate(20px, 20px);transform:translate(20px, 20px);
34display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:10px;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__hover:before,#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__hover:after{content:' ';position:absolute;border:2px solid transparent;width:0;height:0;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__hover:before{top:0;left:0;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__hover:after{bottom:0;right:0;}@media (hover:none) and (pointer: coarse){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__hover{display:none;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__name{display:block;margin-top:25px;font-size:30px;line-height:40px;font-weight:400;font-family:var(--global-primary-font-family);}@media (max-width: 560px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__name{font-size:18px;line-height:29px;letter-spacing:0.75px;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__role{display:block;margin-top:8px;font-size:14px;line-height:24px;font-weight:700;font-family:inherit;text-transform:uppercase;letter-spacing:1.5px;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__license{font-size:13px;text-transform:uppercase;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__info{text-align:center;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .team-member__btn{margin-bottom:60px;position:relative;z-index:1;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .form-container{padding-bottom:48px;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .search-form{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-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0 -10px -8px;}@media (max-width: 600px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .search-form{-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:0;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .input-group{-webkit-flex:1 0 250px;-ms-flex:1 0 250px;flex:1 0 250px;max-width:300px;position:relative;margin:8px 10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (max-width: 600px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .input-group{-webkit-flex:1;-ms-flex:1;flex:1;max-width:unset;margin:8px 0;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .search-icon{position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:0;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .search-clear-icon{color:#b2b2b2;position:absolute;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:40px;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .search-clear-icon:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .is-empty .search-clear-icon{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .search-input{padding-right:65px;}@media (max-width: 569px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .search-input{padding-bottom:5px;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-toggle{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;outline:none;text-align:left;cursor:pointer;position:relative;padding-right:65px;overflow:hidden;text-overflow:ellipsis;text-transform:none;font-family:var(--global-secondary-font-family);}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-open-icon{position:absolute;right:17px;top:calc(50% - 1px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform .3s ease;transition:transform .3s ease;cursor:pointer;color:#b2b2b2;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-clear{color:#b2b2b2;position:absolute;right:40px;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-clear:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}@media (max-width: 639px){#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-clear{display:none;}}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-dropdown{position:absolute;width:100%;top:calc(100% + 5px);overflow:hidden;height:0;-webkit-transition:height 0.3s ease;transition:height 0.3s ease;background-color:#f5f5f5;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-dropdown.on-top{bottom:calc(100% + 5px);top:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-dropdown.opened{z-index:999;position:fixed;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-dropdown-wrapper{width:100%;overflow:hidden auto;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-optgroup{width:100%;padding:11px 20px;color:#b2b2b2;cursor:default;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-option{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;text-align:left;width:100%;border:none;border-radius:0;background-color:transparent;cursor:pointer;padding:11px 20px;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;text-transform:none;font-family:var(--global-secondary-font-family);}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select-option:hover{background-color:#b2b2b2;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select{-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select.is-empty .c-select-toggle{color:#b2b2b2;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select.is-empty .c-select-clear{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .c-select.opened .c-select-open-icon{color:currentColor;-webkit-transform:translateY(-50%) rotateX(180deg);-moz-transform:translateY(-50%) rotateX(180deg);-ms-transform:translateY(-50%) rotateX(180deg);transform:translateY(-50%) rotateX(180deg);}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .empty-message{padding:160px 0;text-align:center;display:none;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .empty-message.visible{display:block;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a .visually-hidden{position:absolute;overflow:hidden;clip:rect(0 0 0 0);width:1px;height:1px;margin:-1px;padding:0;border:0;}#section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a>div:last-child{padding-top:calc(2 / 4 * var(--global-section-padding))!important;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de{color:#000000;--fontColor:#000000;--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;--section-padding-top:calc(2 / 4 * var(--global-section-padding));background-color:rgba(255, 255, 255, 1);}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(7),#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(9){visibility:hidden;}
34@media (max-width:900px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(7),#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(9){display:none;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container .team-member__image-wrap .team-member__image{width:61.2%;padding-top:79%;margin:auto;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container .team-member__image-wrap .team-member__hover:before{width:63%!important;height:100%!important;top:0%;left:19%;border:2px solid #000000;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container .team-member__image-wrap .team-member__hover:after{display:none;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container .team-member__image-wrap .team-member__hover .team-member__btn{width:57%;font-size:1vh;margin-left:1%;position:relative;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(4),#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(5),#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(6),#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .container .team-grid__wrapper .team-member__container:nth-child(8){pointer-events:none;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .lp-h2{font-size:36px;letter-spacing:4px;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid{padding:140px 0 90px;}@media (max-width: 768px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid{padding:40px 0;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid__title{text-align:center;margin-bottom:50px;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid .lp-input{width:100%;height:35px;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid__wrapper{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-left:-25px;margin-right:-25px;}@media(min-width: 1001px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid__wrapper.two-col{max-width:750px;width:100%;margin:0 auto;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid__wrapper.two-col .team-member__container{width:50%;}}@media(max-width: 1000px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid__wrapper{max-width:1000px;}}@media (max-width: 768px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-grid__wrapper{-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;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container{width:33.333%;padding-left:25px;padding-right:25px;margin-bottom:50px;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:first-child{margin-left:auto;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:last-child{margin-right:auto;}@media(max-width: 1000px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container{width:50%;}}@media (max-width: 768px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container{width:100%;}}@media (hover: hover) and (pointer: fine){@media (min-width: 769px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:hover .team-member__image{opacity:.5;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:hover .team-member__hover{opacity:1;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:hover .team-member__hover::before,#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:hover .team-member__hover::after{width:100%;height:100%;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:hover .team-member__hover::before{border-top-color:inherit;border-right-color:inherit;-webkit-transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;transition:width 0.25s ease-out,height 0.25s ease-out 0.25s;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container:hover .team-member__hover::after{border-bottom-color:inherit;border-left-color:inherit;-webkit-transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;transition:width 0.25s ease-out 0.5s,height 0.25s ease-out 0.75s,border-color 0.01s ease-out 0.5s;}}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__container.filtered-out{display:none;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__link{position:relative;display:block;height:100%;cursor:pointer;color:inherit;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__image{position:relative;width:100%;padding-top:130%;background-color:#cccccc;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__image img{position:absolute;object-fit:cover;width:100%;height:100%;top:0;left:0;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__image-wrap{position:relative;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__hover{opacity:0;position:absolute;top:0;right:0;left:0;bottom:0;-webkit-transform:translate(20px, 20px);-moz-transform:translate(20px, 20px);-ms-transform:translate(20px, 20px);transform:translate(20px, 20px);
34display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:10px;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__hover:before,#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__hover:after{content:' ';position:absolute;border:2px solid transparent;width:0;height:0;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__hover:before{top:0;left:0;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__hover:after{bottom:0;right:0;}@media (hover:none) and (pointer: coarse){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__hover{display:none;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__name{display:block;margin-top:25px;font-size:30px;line-height:40px;font-weight:400;font-family:var(--global-primary-font-family);}@media (max-width: 560px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__name{font-size:18px;line-height:29px;letter-spacing:0.75px;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__role{display:block;margin-top:8px;font-size:14px;line-height:24px;font-weight:700;font-family:inherit;text-transform:uppercase;letter-spacing:1.5px;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__license{font-size:13px;text-transform:uppercase;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__info{text-align:center;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .team-member__btn{margin-bottom:60px;position:relative;z-index:1;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .form-container{padding-bottom:48px;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .search-form{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-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0 -10px -8px;}@media (max-width: 600px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .search-form{-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:0;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .input-group{-webkit-flex:1 0 250px;-ms-flex:1 0 250px;flex:1 0 250px;max-width:300px;position:relative;margin:8px 10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (max-width: 600px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .input-group{-webkit-flex:1;-ms-flex:1;flex:1;max-width:unset;margin:8px 0;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .search-icon{position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:0;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .search-clear-icon{color:#b2b2b2;position:absolute;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:40px;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .search-clear-icon:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .is-empty .search-clear-icon{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .search-input{padding-right:65px;}@media (max-width: 569px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .search-input{padding-bottom:5px;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-toggle{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;outline:none;text-align:left;cursor:pointer;position:relative;padding-right:65px;overflow:hidden;text-overflow:ellipsis;text-transform:none;font-family:var(--global-secondary-font-family);}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-open-icon{position:absolute;right:17px;top:calc(50% - 1px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform .3s ease;transition:transform .3s ease;cursor:pointer;color:#b2b2b2;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-clear{color:#b2b2b2;position:absolute;right:40px;top:calc(50% + 2px);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0.3s;opacity:1;visibility:visible;cursor:pointer;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-clear:hover{-webkit-transform:translateY(-50%) scale(1.2);-moz-transform:translateY(-50%) scale(1.2);-ms-transform:translateY(-50%) scale(1.2);transform:translateY(-50%) scale(1.2);}@media (max-width: 639px){#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-clear{display:none;}}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-dropdown{position:absolute;width:100%;top:calc(100% + 5px);overflow:hidden;height:0;-webkit-transition:height 0.3s ease;transition:height 0.3s ease;background-color:#f5f5f5;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-dropdown.on-top{bottom:calc(100% + 5px);top:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-dropdown.opened{z-index:999;position:fixed;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-dropdown-wrapper{width:100%;overflow:hidden auto;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-optgroup{width:100%;padding:11px 20px;color:#b2b2b2;cursor:default;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-option{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;text-align:left;width:100%;border:none;border-radius:0;background-color:transparent;cursor:pointer;padding:11px 20px;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;text-transform:none;font-family:var(--global-secondary-font-family);}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select-option:hover{background-color:#b2b2b2;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select{-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select.is-empty .c-select-toggle{color:#b2b2b2;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select.is-empty .c-select-clear{opacity:0;visibility:hidden;-webkit-transition:-webkit-transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;transition:transform 0.3s ease,opacity 0.3s ease,visibility 0s linear 0s;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .c-select.opened .c-select-open-icon{color:currentColor;-webkit-transform:translateY(-50%) rotateX(180deg);-moz-transform:translateY(-50%) rotateX(180deg);-ms-transform:translateY(-50%) rotateX(180deg);transform:translateY(-50%) rotateX(180deg);}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .empty-message{padding:160px 0;text-align:center;display:none;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .empty-message.visible{display:block;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de .visually-hidden{position:absolute;overflow:hidden;clip:rect(0 0 0 0);width:1px;height:1px;margin:-1px;padding:0;border:0;}#section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de>div:last-child{padding-top:calc(2 / 4 * var(--global-section-padding))!important;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5{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;background-color:rgba(255, 255, 255, 1);}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .lp-text--subtitle{font-size:41px;line-height:53px;letter-spacing:12px;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .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;
34-webkit-justify-content:center;justify-content:center;}@media (max-width: 768px){#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup{min-height:80vh;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup .lp-container-custom{padding:0 25px;}}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form{margin:0;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form.success .newsletter-signup__form-container{display:none;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form.success .success-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .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-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__inputs-container{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-container{position:relative;z-index:1;}@media (max-width: 768px){#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-container .lp-h2{margin-bottom:32px;}}@media (max-width: 768px){#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-container .lp-text--subtitle{margin-bottom:32px;}}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-item +.newsletter-signup__form-item{margin-left:16px;}@media (max-width: 768px){#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-item +.newsletter-signup__form-item{margin-left:0px;margin-top:32px;}}@media (min-width: 769px){#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-item.lp-input{padding-top:0;padding-bottom:0;width:250px;}}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-item.lp-btn{text-transform:uppercase;font-weight:700;}@media (min-width: 769px){#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup__form-item.lp-btn{width:200px;}}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .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-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .newsletter-signup .success-block.hide{display:none;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .lp-text--subtitle{margin-left:auto;margin-right:auto;text-transform:none;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .lp-h-pot{max-width:1px;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .lp-title-group{max-width:unset;padding:0 20px;}#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 input:-webkit-autofill,#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 input:-webkit-autofill:hover,#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 input:-webkit-autofill:focus,#section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 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-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5 .lp-disclaimer{max-width:730px;margin:20px auto 0 auto;}#section-90b955a0-1aef-435e-aa96-59c408339909{color:#fff;--fontColor:#fff;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#7F7C7C;--bgColor_H:0;--bgColor_S:1%;--bgColor_L:49%;--bgColor_A:1;--bgColor_darkenDir:1;--section-padding-top:calc(2 / 4 * var(--global-section-padding));--section-padding-bottom:calc(2 / 4 * var(--global-section-padding));background-color:#7F7C7C;}#section-90b955a0-1aef-435e-aa96-59c408339909 .video-wrapper{z-index:1;}#section-90b955a0-1aef-435e-aa96-59c408339909 .overlay-component{z-index:2;}#section-90b955a0-1aef-435e-aa96-59c408339909 .custom-content{z-index:3;position:relative;}#section-90b955a0-1aef-435e-aa96-59c408339909 h1,#section-90b955a0-1aef-435e-aa96-59c408339909 h2,#section-90b955a0-1aef-435e-aa96-59c408339909 h3,#section-90b955a0-1aef-435e-aa96-59c408339909 h4,#section-90b955a0-1aef-435e-aa96-59c408339909 h5,#section-90b955a0-1aef-435e-aa96-59c408339909 h6,#section-90b955a0-1aef-435e-aa96-59c408339909 p{margin-bottom:1.6666rem;}#section-90b955a0-1aef-435e-aa96-59c408339909 .lp-container *:last-child{margin-bottom:0;}#section-90b955a0-1aef-435e-aa96-59c408339909>div:last-child{padding-top:calc(2 / 4 * var(--global-section-padding))!important;padding-bottom:calc(2 / 4 * var(--global-section-padding))!important;}#modal-global-contact-us .close{z-index:11;}#modal-global-contact-us .description{margin-bottom:15px;}#modal-global-contact-us .close:focus{outline:0;}#modal-global-contact-us .contact-form{padding:70px 0;width:100%;min-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;position:relative;color:var(--colorTxt, #ffffff);-webkit-background-size:cover;background-size:cover;}#modal-global-contact-us .contact-form:after{content:'';position:absolute;display:block;background-color:rgba(2, 5, 7, 0.85);height:100%;width:100%;z-index:0;}
34#modal-global-contact-us .contact-form.loading textarea,#modal-global-contact-us .contact-form.loading input,#modal-global-contact-us .contact-form.loading label,#modal-global-contact-us .contact-form.loading button{pointer-events:none;opacity:.5;}#modal-global-contact-us .contact-form.loading .submit-icon{display:inline-block;}#modal-global-contact-us .contact-form .submit-icon{display:none;}#modal-global-contact-us .contact-form .contact-form-close{width:40px;height:50px;display:block;padding:0;border:none;background-color:transparent;cursor:pointer;position:absolute;right:50px;top:50px;z-index:110;}@media (max-width: 560px){#modal-global-contact-us .contact-form .contact-form-close{right:20px;top:20px;width:30px;height:40px;}}#modal-global-contact-us .contact-form .contact-form-close:before,#modal-global-contact-us .contact-form .contact-form-close:after{content:'';display:block;width:40px;height:1px;background-color:#fff;position:absolute;left:50%;top:50%;}@media (max-width: 560px){#modal-global-contact-us .contact-form .contact-form-close:before,#modal-global-contact-us .contact-form .contact-form-close:after{width:30px;}}#modal-global-contact-us .contact-form .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 .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 .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-width:1440px;width:100%;padding:0 160px;margin:0 auto;z-index:10;}@media (max-width: 1320px){#modal-global-contact-us .contact-form .container{padding:0 80px;}}@media (max-width: 1200px){#modal-global-contact-us .contact-form .container{padding:0 30px;}}@media (max-width: 900px){#modal-global-contact-us .contact-form .container{-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}}@media (max-width: 560px){#modal-global-contact-us .contact-form .container{padding:0 20px;}}#modal-global-contact-us .contact-form h2{margin:0 0 18px 0;padding:0;}@media (max-width: 560px){#modal-global-contact-us .contact-form h2{margin:0 0 24px 0;}}#modal-global-contact-us .contact-form .section-details{width:50%;}@media (max-width: 1200px){#modal-global-contact-us .contact-form .section-details{padding-right:30px;}}@media (max-width: 900px){#modal-global-contact-us .contact-form .section-details{width:100%;padding-right:0;max-width:700px;margin-bottom:38px;}}#modal-global-contact-us .contact-form .section-message{width:50%;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;position:relative;}@media (max-width: 1200px){#modal-global-contact-us .contact-form .section-message{padding-left:30px;}}@media (max-width: 900px){#modal-global-contact-us .contact-form .section-message{width:100%;padding-left:0;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;}}#modal-global-contact-us .contact-form .section-message:after{content:'';position:absolute;display:block;width:1px;background:#999999;height:calc(100% + 50px);left:0;top:-20px;}@media (max-width: 900px){#modal-global-contact-us .contact-form .section-message:after{display:none;}}#modal-global-contact-us .contact-form .section-message form{max-width:435px;width:100%;}#modal-global-contact-us .contact-form .section-message form .submitButton{width:auto;}@media (max-width: 560px){#modal-global-contact-us .contact-form .section-message form .submitButton{width:100%;}}@media (max-width: 900px){#modal-global-contact-us .contact-form .section-message form{max-width:700px;}}#modal-global-contact-us .contact-form .section-message form.loading textarea,#modal
34-global-contact-us .contact-form .section-message form.loading input,#modal-global-contact-us .contact-form .section-message form.loading label,#modal-global-contact-us .contact-form .section-message form.loading button{pointer-events:none;opacity:.5;}#modal-global-contact-us .contact-form .section-message form.loading .label-loading{display:inline;}#modal-global-contact-us .contact-form .section-message form.loading .label-success,#modal-global-contact-us .contact-form .section-message form.loading .label-initial{display:none;}#modal-global-contact-us .contact-form .section-message form.loading .submit-icon{display:inline-block;}#modal-global-contact-us .contact-form .section-message form.success .label-loading,#modal-global-contact-us .contact-form .section-message form.success .label-initial{display:none;}#modal-global-contact-us .contact-form .section-message form.success .label-success{display:inline;}#modal-global-contact-us .contact-form .section-message .label-loading,#modal-global-contact-us .contact-form .section-message .label-success{display:none;}#modal-global-contact-us .contact-form .section-message .submit-icon{display:none;}#modal-global-contact-us .contact-form .section-message h2{margin-bottom:28px;}#modal-global-contact-us .contact-form .section-message .form-group_modal{-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:39px;}#modal-global-contact-us .contact-form .section-message .form-group_modal input{border:none;border-bottom:1px solid #c0c0c0;display:block;width:100%;background:transparent;color:#ffffff;height:22px;font-size:16px;}@media (max-width: 560px){#modal-global-contact-us .contact-form .section-message .form-group_modal input{height:25px;}}#modal-global-contact-us .contact-form .section-message .form-group-textarea{margin-bottom:30px;}@media (max-width: 560px){#modal-global-contact-us .contact-form .section-message .form-group-textarea{margin-bottom:23px;}}#modal-global-contact-us .contact-form .section-message label{display:block;width:100%;line-height:1.63;letter-spacing:1px;color:#c0c0c0;font-weight:bold;text-transform:uppercase;}#modal-global-contact-us .contact-form .section-message textarea{resize:none;height:105px;width:100%;background:transparent;border:solid 1px #ffffff;margin:23px 0 0 0;color:#ffffff;padding:10px;font-size:16px;}@media (max-width: 560px){#modal-global-contact-us .contact-form .section-message textarea{margin:10px 0 0 0;height:89px;}}#modal-global-contact-us .contact-form .info-zone h4{margin:0 0 16px 0;}@media (max-width: 560px){#modal-global-contact-us .contact-form .info-zone h4{margin:0 0 13px 0;}}#modal-global-contact-us .contact-form .info-zone .type_user:nth-of-type(2){margin-bottom:30px;}@media (max-width: 560px){#modal-global-contact-us .contact-form .info-zone .type_user{margin-bottom:58px;}}#modal-global-contact-us .contact-form .info-zone_contact{margin-bottom:23px;}#modal-global-contact-us .contact-form .info-zone_contact:nth-last-child(2){margin-bottom:30px;}#modal-global-contact-us .contact-form .info-zone_contact_cell{position:relative;padding-left:45px;margin-bottom:22px;font-weight:bold;font-size:14px;max-width:90%;letter-spacing:1.5px;text-transform:uppercase;}@media (max-width: 560px){#modal-global-contact-us .contact-form .info-zone_contact_cell{padding-left:0;}}#modal-global-contact-us .contact-form .info-zone_contact_cell:last-of-type{margin-bottom:0;}#modal-global-contact-us .contact-form .info-zone_contact_cell i{position:absolute;left:0;top:0;display:block;}@media (max-width: 560px){#modal-global-contact-us .contact-form .info-zone_contact_cell i{position:relative;margin-bottom:7px;}}#modal-global-contact-us .contact-form .info-zone_contact_cell i svg path{fill:var(--colorTxt);}#modal-global-contact-us .contact-form .info-zone_contact_cell div{padding:0;}#modal-global-contact-us .contact-form .info-zone_contact_cell .contact_title{line-height:1;margin-bottom:5px;}#modal-global-contact-us .contact-form .info-zone_contact_link{color:var(--colorTxt);}@media (max-width: 560px){#modal-global-contact-us .contact-form .info-zone .type_user:nth-of-type(2){margin-bottom:58px;}}@media (max-width: 560px){#modal-global-contact-us .contact-form .hours_box{margin-bottom:52px;}}#modal-global-contact-us .contact-form .socials_zone{padding-left:45px;}@media (max-width: 560px){#modal-global-contact-us .contact-form .socials_zone{padding-left:0;}}#modal-global-contact-us .contact-form .socials_zone li{margin-bottom:10px;}#modal-global-contact-us .contact-form .socials_zone li:not(:last-child){padding-right:34px;}@media (max-width: 560px){#modal-global-contact-us .contact-form .socials_zone li:not(:last-child){padding-right:12px;}}#modal-global-contact-us .contact-form .success-message.success{margin-top:15px;color:var(--colorTxt);position:absolute;}#modal-global-contact-us .contact-form .success-message.hide{opacity:0;}#modal-global-contact-us .contact-form.one_contact .info-zone .type_user{margin-bottom:73px;}@media (max-width: 768px){#modal-global-contact-us .contact-form.one_contact .info-zone .type_user{margin-bottom:51px;}}@media (max-width: 560px){#modal-global-contact-us .contact-form.one_contact .info-zone .type_user{margin-bottom:40px;}}#modal-global-contact-us .contact-form.one_contact .hours_box{margin-bottom:38px;}#modal-global-contact-us .contact-form.no_icon .info-zone_contact_cell{padding-left:0;}#modal-global-contact-us .contact-form.no_icon .info-zone_contact_cell i{display:none;}#modal-global-contact-us .contact-form.no_icon .socials_zone{padding-left:0;}#modal-global-contact-us .contact-form .pre-line{white-space:pre-line;}#modal-global-contact-us .lp-input-group{margin-bottom:40px;}#modal-global-contact-us .lp-input-group.m16{margin-bottom:16px;}#modal-global-contact-us .lp-disclaimer{margin-top:0;}#modal-global-contact-us .lp-input{border-color:#ffffff;}#modal-global-contact-us .lp-input:focus,#modal-global-contact-us .lp-input:active{border-color:#5e5e5e;}nav{-webkit-transition:0.2s all;transition:0.2s all;color:#fff;z-index:102;}nav nav{-webkit-transition:0.2s all;transition:0.2s all;color:#fff;}nav nav.scroll .header__logo .dark{display:block;}nav nav.scroll .header__logo .light{display:none;}nav.scroll .header__logo .dark{display:block;}nav.scroll .header__logo .light{display:none;}@-webkit-keyframes producerCustomFadeInUp{to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}@keyframes producerCustomFadeInUp{to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}nav .header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;
34-webkit-justify-content:center;justify-content:center;padding:10px 30px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}nav .header__left{-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;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;}nav .header__logo{display:block;cursor:pointer;}nav .header__logo img{display:block;max-height:52px;max-width:250px;}nav .header__logo .dark{display:none;}nav .header__logo--center{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}nav .header__right{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-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;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}nav .sub-nav{position:absolute;left:50%;bottom:0;-webkit-transform:translate(-50%, calc(100% + 50px));-moz-transform:translate(-50%, calc(100% + 50px));-ms-transform:translate(-50%, calc(100% + 50px));transform:translate(-50%, calc(100% + 50px));z-index:1;background-color:#fff;box-shadow:0 0 3px rgba(0,0,0,0.3);-webkit-transition:0.3s all;transition:0.3s all;opacity:0;visibility:hidden;min-width:178px;max-width:250px;}nav .sub-nav:after{display:block;position:absolute;content:'';left:0;right:0;top:-50px;height:50px;}nav .sub-nav ul{margin:0;padding:0;display:block;}nav .sub-nav ul li{position:relative;display:block;margin:0;text-align:left;}nav .sub-nav ul li a:hover{color:#000;background-color:#eee;}nav .sub-nav ul li:last-child{border-bottom:none;}nav .sub-nav ul li:last-child:after{content:'';}nav .sub-nav ul li a{display:inline-block;color:#000;margin:0;font-size:16px;letter-spacing:1px;padding:6px 16px;position:relative;width:100%;line-height:1.63;}nav .sub-nav ul li a:after{position:absolute;content:'';display:block;width:0;height:1px;bottom:0;left:0;-webkit-transition:0.3s all;transition:0.3s all;background-color:#000;}nav .sub-nav.visible{visibility:visible;opacity:1;-webkit-transform:translate(-50%, 100%);-moz-transform:translate(-50%, 100%);-ms-transform:translate(-50%, 100%);transform:translate(-50%, 100%);}nav .header__left .navigation__item:nth-child(-n + 2) .sub-nav{left:10px;-webkit-transform:translateY(calc(100% + 50px));-moz-transform:translateY(calc(100% + 50px));-ms-transform:translateY(calc(100% + 50px));transform:translateY(calc(100% + 50px));}nav .header__left .navigation__item:nth-child(-n + 2) .sub-nav.visible{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);}nav .header__right .navigation__item:nth-last-child(-n + 1) .sub-nav{left:auto;right:0;-webkit-transform:translateY(calc(100% + 50px));-moz-transform:translateY(calc(100% + 50px));-ms-transform:translateY(calc(100% + 50px));transform:translateY(calc(100% + 50px));}nav .header__right .navigation__item:nth-last-child(-n + 1) .sub-nav.visible{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);}nav .navigation{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;margin:0;list-style-type:none;}@media(max-width: 1200px){nav .navigation{display:none;}}nav .navigation__item{padding:0;margin:0;}nav .navigation__item.sub-nav-container{position:relative;}nav .navigation__item.sub-nav-container .navigation__link{padding-right:36px;}nav .navigation__item.sub-nav-container .navigation__link:before{display:block;width:9px;height:9px;border-bottom:2px solid;border-right:2px solid;content:'';position:absolute;line-height:1;top:calc(50% - 8px);right:18px;font-size:18px;-webkit-transition:0.2s -webkit-transform;transition:0.2s transform;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);}nav .navigation__item.sub-nav-container .navigation__link.visible-dropdown:before{-webkit-transform:rotate(-135deg);-moz-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg);top:calc(50% - 3px);}nav .navigation__link{display:block;color:inherit;position:relative;font-size:13px;font-weight:700;line-height:1;letter-spacing:1.5px;background-color:transparent;border:none;cursor:pointer;text-transform:uppercase;padding:19px 13px;z-index:2;white-space:nowrap;opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);-webkit-animation-name:producerCustomFadeInUp;animation-name:producerCustomFadeInUp;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;}
34nav .navigation__link span{display:inline-block;position:relative;}nav .navigation__link span:after{content:'';display:block;width:0;height:1px;margin-top:3px;background-color:currentColor;-webkit-transition:0.3s all ease;transition:0.3s all ease;}nav .navigation__link:hover:before{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);}nav .navigation__link:hover span:after{width:100%;max-width:100%;}nav .hamburger{border:none;background-color:transparent;cursor:pointer;outline:none;z-index:915;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:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;text-transform:capitalize;letter-spacing:1px;color:inherit;width:37px;height:58px;}nav .hamburger span{display:block;width:26px;height:2px;background-color:currentColor;-webkit-transition:0.3s -webkit-transform;transition:0.3s transform;position:relative;}nav .hamburger span:before,nav .hamburger span:after{display:block;width:26px;height:2px;background-color:currentColor;position:absolute;left:0;content:'';}nav .hamburger span:before{top:-9px;}nav .hamburger span:after{bottom:-9px;}nav .hamburger.active span{-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);}nav .hamburger.active span:before,nav .hamburger.active span:after{top:0;bottom:auto;}nav .hamburger.active span:before{display:none;}nav .hamburger.active span:after{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg);}nav .search{cursor:pointer;}nav .search svg{display:block;}body>div.sidemenu{background-color:transparent;}body>div.sidemenu .wrapper{opacity:1;-webkit-transition:-webkit-transform 0s linear,opacity 0.2s ease-out;transition:transform 0s linear,opacity 0.2s ease-out;background-color:var(--bgColor, rgba(0, 0, 0, 0.9));color:var(--fontColor, #fff);position:fixed;top:0;right:0;height:100%;width:100vw;}body>div.sidemenu .holder{font-size:20px;top:150px;left:auto;right:0;position:absolute;max-width:1200px;width:100%;height:100%;}body>div.sidemenu .title{font-size:12px;text-align:right;width:100%;padding-right:150px;margin-bottom:30px;text-transform:uppercase;letter-spacing:1px;font-weight:bold;}@media (max-width: 992px){body>div.sidemenu .title{padding-right:20px;}}body>div.sidemenu .section-options{margin:0 auto;overflow-y:scroll;height:calc(100% - 200px);list-style:none;}body>div.sidemenu .section-options::-webkit-scrollbar{width:7px;}body>div.sidemenu .section-options::-webkit-scrollbar-thumb{border-radius:10px;background-color:#4d5259;}body>div.sidemenu .section-options .option{text-align:right;border-bottom:2px none;}body>div.sidemenu .section-options a,body>div.sidemenu .section-options button{font-family:var(--global-primary-font-family);line-height:70px;color:var(--fontColor, #fff);font-size:35px;-webkit-text-decoration:none;text-decoration:none;display:inline-block;padding-right:150px;border:none;background-color:transparent;cursor:pointer;border-bottom:2px solid transparent;text-transform:none;-webkit-transition:.3s linear all;transition:.3s linear all;}body>div.sidemenu .section-options a:hover:not(.sub-nav-link),body>div.sidemenu .section-options button:hover:not(.sub-nav-link){color:var(--fontColor, #7a7a7a);}@media (max-width: 992px){body>div.sidemenu .section-options a,body>div.sidemenu .section-options button{padding-right:20px;}}body>div.sidemenu .sidemenu-close{width:24px;height:24px;display:block;padding:0;border:none;background-color:transparent;cursor:pointer;-webkit-transition:all .3s ease;transition:all .3s ease;}body>div.sidemenu .sidemenu-close:hover{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);transform:scale(1.3);}body>div.sidemenu .sidemenu-close:before,body>div.sidemenu .sidemenu-close:after{content:'';display:block;width:30px;height:2px;background-color:var(--fontColor, #fff);position:absolute;
34left:50%;top:50%;}body>div.sidemenu .sidemenu-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);}body>div.sidemenu .sidemenu-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);}body>div.sidemenu button.toggle{border:none;background:none;position:absolute;right:76px;top:74px;}body>div.sidemenu button.toggle:focus,body>div.sidemenu button.toggle:active{outline:none;}body>div.sidemenu .sub-nav-container{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;}body>div.sidemenu .sub-nav-container:hover .main-nav:after{border-bottom:2px solid var(--fontColor, #7a7a7a);border-right:2px solid var(--fontColor, #7a7a7a);}body>div.sidemenu .sub-nav-container .main-nav{position:relative;display:inline-block;}body>div.sidemenu .sub-nav-container .main-nav:after{content:'';display:inline-block;position:relative;width:8px;height:8px;margin-left:25px;-webkit-transform:rotate(45deg) translateX(-150%);-moz-transform:rotate(45deg) translateX(-150%);-ms-transform:rotate(45deg) translateX(-150%);transform:rotate(45deg) translateX(-150%);border-bottom:2px solid var(--fontColor, #fff);border-right:2px solid var(--fontColor, #fff);top:0%;bottom:auto;left:auto;-webkit-transition:0.5s all ease;transition:0.5s all ease;background-color:transparent;}body>div.sidemenu .sub-nav{opacity:0;visibility:hidden;-webkit-transition:all .5s ease;transition:all .5s ease;max-height:0;}body>div.sidemenu .sub-nav ul{margin:0;padding-top:10px;}body>div.sidemenu .sub-nav.visible{opacity:1;visibility:visible;max-height:400px;}body>div.sidemenu .sub-nav.visible+.main-nav{color:#7a7a7a;}body>div.sidemenu .sub-nav.visible+.main-nav:after{margin-left:40px;border-bottom:2px solid var(--fontColor, #7a7a7a);border-right:2px solid var(--fontColor, #7a7a7a);}body>div.sidemenu .sub-nav a,body>div.sidemenu .sub-nav button{font-size:25px;line-height:45px;}body>div.sidemenu .sub-nav a:hover,body>div.sidemenu .sub-nav button:hover{color:var(--fontColor, #fff);}footer{background-color:#fff;color:#000;--fontColor:#000;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:0%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#fff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;--greyColor:hsla( 35var(--fontColor_H), 36var(--fontColor_S), 37calc(var(--fontColor_L) + (50% - var(--fontColor_L)) * 0.445), 38var(--fontColor_A));}footer .redesign .inp--dark-bg input{color:var(--fontColor);border-color:hsla( 39 var(--fontColor_H), 40 var(--fontColor_S), 41 calc(var(--fontColor_L) + (50% - var(--fontColor_L)) * 0.445), 42 var(--fontColor_A));}footer .redesign .inp--dark-bg input:hover{border-color:var(--fontColor);}footer .redesign .inp+.inp{margin-top:24px;}footer .redesign .btn--primary-light{border-color:var(--fontColor);color:var(--fontColor);}footer .redesign .btn--primary-light:hover{background-color:var(--fontColor);color:var(--bgColor);}footer.is-background-color-light .redesign .btn--primary-light{border-width:1px;}footer .redesign .socials--grey{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;}footer .redesign .socials--grey .socials__link{background-color:hsla( 43 var(--bgColor_H), 44 var(--bgColor_S), 45 calc(var(--bgColor_L) + (50% - var(--bgColor_L)) * 0.15), 46 var(--bgColor_A));color:var(--greyColor);}footer .redesign .socials--grey .socials__link svg{fill:var(--greyColor);}footer .redesign .socials--grey .socials__link:hover{background-color:hsla( 47 var(--bgColor_H), 48 var(--bgColor_S), 49 calc(var(--bgColor_L) + (50% - var(--bgColor_L)) * 0.4), 50 var(--bgColor_A));color:var(--fontColor);}footer .redesign .socials--grey .socials__link:hover svg{fill:var
50(--fontColor);}footer .redesign.footer .grey-text{color:var(--fontColor);}footer .footer{position:relative;padding-top:60px;padding-bottom:30px;}@media (max-width: 560px){footer .footer{padding-top:10px;}}@media (max-width: 500px){footer .footer{padding-bottom:70px;}}footer .footer .text_content_wrap p{margin-bottom:15px;}footer .footer .text_content_wrap p:last-of-type{margin-bottom:0;}footer .footer .container{max-width:1440px;}@media (max-width: 768px){footer .footer .container{padding-left:25px;padding-right:25px;}}@media (max-width: 560px){footer .footer .container{padding-left:20px;padding-right:20px;}}footer .footer h3{margin:0 0 15px 0;}footer .footer h5{text-transform:capitalize;}footer .footer .info-wrap{margin-bottom:40px;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;}footer .footer .info-wrap .agent_box{width:70%;}@media (max-width: 1280px){footer .footer .info-wrap .agent_box{width:50%;}}@media (max-width: 768px){footer .footer .info-wrap .agent_box{width:100%;}}footer .footer .info-wrap .newsletter_box{width:30%;}@media (max-width: 1280px){footer .footer .info-wrap .newsletter_box{width:50%;}}@media (max-width: 768px){footer .footer .info-wrap .newsletter_box{width:100%;}}footer .footer .info-wrap .newsletter_box--padding{padding-top:44px;}@media (max-width: 768px){footer .footer .info-wrap .newsletter_box--padding{padding-top:0;}}footer .footer .info-wrap .newsletter_box .contact_title{margin-bottom:13px;line-height:1.6;}@media (max-width: 768px){footer .footer .info-wrap .newsletter_box .info-wrap-contact_cell{margin-bottom:0;padding-left:0;}}@media (max-width: 768px){footer .footer .info-wrap .newsletter_box .icon_text{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;margin-bottom:22px;position:relative;}footer .footer .info-wrap .newsletter_box .icon_text i{position:relative;width:30px;margin-right:20px;}footer .footer .info-wrap .newsletter_box .icon_text .contact_title{margin-bottom:0;}}@media (max-width: 768px){footer .footer .info-wrap .newsletter_box .info-wrap-contact_zone{margin-bottom:0;}}footer .footer .info-wrap-contact{position:relative;}footer .footer .info-wrap-contact_zone{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-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;margin-bottom:39px;}@media (max-width: 768px){footer .footer .info-wrap-contact_zone{margin-bottom:21px;}footer .footer .info-wrap-contact_zone:last-child{margin-bottom:51px;}}footer .footer .info-wrap-contact_zone i{position:absolute;left:0;display:block;}footer .footer .info-wrap-contact_zone i svg path{fill:currentColor;}footer .footer .info-wrap-contact_zone h4{margin:0 0 13px 0;width:100%;}footer .footer .info-wrap-contact_cell{position:relative;padding-left:50px;width:400px;font-size:14px;text-transform:uppercase;font-weight:bold;letter-spacing:1.5px;}@media (max-width: 1280px){footer .footer .info-wrap-contact_cell:first-of-type{margin-bottom:21px;}}footer .footer .info-wrap-contact_cell .contact_title{line-height:1;margin-bottom:5px;}footer .footer .info-wrap-contact_link{color:var(--greyColor);position:relative;}@media (max-width: 560px){footer .footer .info-wrap-contact_link{letter-spacing:0;}}footer .footer .hvr_animation{position:relative;-webkit-text-decoration:none!important;text-decoration:none!important;}footer .footer .hvr_animation:after{content:'';position:absolute;left:0;bottom:0;width:0%;height:1px;background:var(--greyColor);-webkit-transition:.3s linear;transition:.3s linear;}footer .footer .hvr_animation:hover:after{width:100%;}footer .footer .hvr_animation.underlined:after{width:100%;}footer .footer .hvr_animation.underlined:hover:after{width:0%;}footer .footer .form-content{padding:0!important;}footer .footer .form-content label{color:var(--fontColor);text-transform:none;letter-spacing:1;}footer .footer .form-content input{padding:2px 24px 2px 0;}footer .footer .form-content .subscribe_btn{margin-top:20px;position:relative;}footer .footer .form-content .subscribe_btn i{font-size:18px;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);opacity:0;}footer .footer .form-content.success i{opacity:1;}footer .footer .form-content.success .subscribe_btn span{opacity:0;}footer .footer .form-content.success .hide{opacity:0;}footer .footer .form-content.success .hide +span{opacity:1;}footer .footer .text_footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;margin-bottom:39px;}@media (max-width: 1280px){footer .footer .text_footer{-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}}
50@media (max-width: 560px){footer .footer .text_footer{text-align:center;}}footer .footer .text_footer p{white-space:normal;}footer .footer .text_footer .images_box{max-width:186px;width:100%;margin-right:43px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}@media (max-width: 560px){footer .footer .text_footer .images_box{margin:0 auto 20px auto;}}@media (max-width: 1280px){footer .footer .text_footer .img_size{margin-bottom:20px;}}@media (max-width: 560px){footer .footer .text_footer .img_size{margin-bottom:0;}}footer .footer .text_footer .img_size img{width:100%;height:100%;object-fit:contain;}footer .footer .first_text_footer .img_size{width:100%;height:63px;}footer .footer .first_text_footer .img_size img{width:100%;height:100%;object-fit:contain;}@media (max-width: 768px){footer .footer .first_text_footer{margin-bottom:51px;}}footer .footer .second_text_footer .first_img_size{width:45px;height:45px;margin-right:15px;}footer .footer .second_text_footer .second_img_size{width:100px;height:45px;}@media (max-width: 560px){footer .footer .second_text_footer{margin-bottom:21px;}}footer .footer .info-privacy{padding-top:45px;padding-bottom:30px;border-top:1px solid hsla( 51 var(--bgColor_H), 52 var(--bgColor_S), 53 calc(var(--bgColor_L) + (50% - var(--bgColor_L)) * 0.55), 54 var(--bgColor_A));}@media (max-width: 768px){footer .footer .info-privacy{padding-top:0;border-top:none;}}footer .footer .info-privacy__row{-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}footer .footer .info-privacy .copy_zone{font-size:18px;}@media (min-width: 1350px){footer .footer .info-privacy .copy_zone{text-align:center;}}@media (min-width: 1281px){footer .footer .info-privacy .copy_zone{padding-top:8px;padding-bottom:8px;}}@media (max-width: 768px){footer .footer .info-privacy .copy_zone{text-align:center;margin-bottom:10px;padding-top:45px;border-top:1px solid hsla( 55 var(--bgColor_H), 56 var(--bgColor_S), 57 calc(var(--bgColor_L) + (50% - var(--bgColor_L)) * 0.55), 58 var(--bgColor_A));}}footer .footer .info-privacy .copy_zone a{color:var(--greyColor);}footer .footer .info-privacy .powered_zone{font-size:18px;}@media (min-width: 1281px){footer .footer .info-privacy .powered_zone{padding-top:8px;padding-bottom:8px;}}@media (max-width: 1280px){footer .footer .info-privacy .powered_zone{text-align:center;}}@media (max-width: 768px){footer .footer .info-privacy .powered_zone{text-align:center;margin-bottom:24px;}}footer .footer .info-privacy .powered_zone a{color:var(--greyColor);}@media (min-width: 1281px){footer .footer .info-privacy .socials_zone{-webkit-box-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}@media (max-width: 1280px){footer .footer .info-privacy .socials_zone{width:100%;margin-top:20px;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;}}@media (max-width: 768px){footer .footer .info-privacy .socials_zone{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin-top:0;margin-bottom:20px;}footer .footer .info-privacy .socials_zone li{padding:0 7px 10px 7px;}}footer .footer.one_contact .type_user{margin-bottom:73px;}@media (max-width: 768px){footer .footer.one_contact .type_user{margin-bottom:51px;}}footer .footer.no_newsletter h3{margin-bottom:46px;}footer .footer.no_newsletter .newsletter_box{display:none;}footer .footer.no_newsletter .info-wrap-contact{width:calc(70% + 230px);width:100%;padding-left:230px;}@media (max-width: 1200px){footer .footer.no_newsletter .info-wrap-contact{padding-left:0;}}@media (max-width: 768px){footer .footer.no_newsletter .info-wrap-contact{width:100%;}}@media (max-width: 1200px){footer .footer.no_newsletter .info-wrap-contact_cell{width:50%;}}@media (max-width: 768px){footer .footer.no_newsletter .info-wrap-contact_cell{width:100%;}}footer .footer.no_newsletter .info-wrap-contact h4{position:absolute;margin-top:-8px;left:0;
58max-width:200px;}@media (max-width: 1200px){footer .footer.no_newsletter .info-wrap-contact h4{position:relative;left:auto;max-width:100%;width:100%;margin-bottom:20px;margin-top:0;}}@media (max-width: 768px){footer .footer.no_newsletter .info-wrap-contact h4{position:relative;left:auto;max-width:100%;}}footer .footer.no_newsletter .info-wrap-contact_zone:first-of-type{margin-bottom:71px;}@media (max-width: 1200px){footer .footer.no_newsletter .info-wrap-contact_zone:first-of-type{margin-bottom:39px;}}@media (max-width: 768px){footer .footer.no_newsletter .info-wrap-contact_zone:first-of-type{margin-bottom:51px;}}footer .footer.no_newsletter .info-wrap-contact_zone:last-child{margin-bottom:0;}footer .footer.no_icon .info-wrap-contact_cell{padding-left:0;}footer .footer.no_icon .info-wrap-contact_cell i{display:none;}footer .footer.no-names .info-wrap-contact{padding-left:0;}footer .form-row{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: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;margin-left:-15px;margin-right:-15px;}@media (min-width: 1281px){footer .form-row{-webkit-box-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}@media (max-width: 900px){footer .form-row{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}footer .form-col{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;padding-left:15px;padding-right:15px;}@media (min-width: 768px){footer .form-col{-webkit-flex:1 1 0;-ms-flex:1 1 0;flex:1 1 0;}}@media (min-width: 768px){footer .form-col--socials{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;}}@media (min-width: 1281px){footer .form-col--socials{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;}}@media (max-width: 768px){footer .form-col--socials{-webkit-order:-1;-ms-flex-order:-1;order:-1;}}@media (min-width: 1281px){footer .form-col--xl-auto{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;}}footer .additional-links-separator{display:block;width:100%;height:0;overflow:hidden;}@media (min-width: 768px){footer .additional-links-separator{display:inline;width:auto;height:auto;}footer .additional-links-separator:before{content:"|";}}footer .h-pot{height:0;width:0;overflow:hidden;visibility:hidden;}footer .img-wrap{max-width:100px;width:100%;display:block;margin-right:20px;}@media (max-width: 900px){footer .img-wrap{margin-right:0;margin-bottom:10px;}}footer .img-wrap img{width:100%;object-fit:cover;}footer .powered-box{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-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;}@media (max-width: 900px){footer .powered-box{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}footer .form-col--copyright{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;margin:10px 0;}footer .luxury-link{white-space:nowrap;}footer .footer__disclaimers{padding-top:24px;padding-bottom:24px;}@media (max-width: 900px){footer .footer__disclaimers{text-align:center;}}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
58ox='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
58699 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
5871 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;
58-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;
58height: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);}}#modal-global-subscribe .subscribe-modal{width:90%;}#modal-global-subscribe .subscribe-modal .title{width:80%;max-width:400px;font-size:20px;font-weight:bold;line-height:1.5;letter-spacing:2.5px;text-transform:uppercase;text-align:center;padding:45px 0;margin:0 auto;color:#fff;}#modal-global-subscribe .subscribe-modal .form-input{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;margin:0 auto;}#modal-global-subscribe .subscribe-modal .form-input form{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:justify;-webkit-justify-content:space-between;justify-content:space-between;margin:0 auto;}#modal-global-subscribe .subscribe-modal .form-input form input{height:64px;padding:16px 28px;font-size:16px;}#modal-global-subscribe .subscribe-modal .form-input form input[type="email"]{border:1px solid #4a4a4a;color:#fff;marign-right:0;margin-bottom:18px;background-color:transparent;width:100%;}#modal-global-subscribe .subscribe-modal .form-input form input[type="submit"]{border:1px solid #fff;color:#1a1a1a;text-transform:uppercase;width:100%;font-size:16px;font-weight:bold;letter-spacing:2px;}@media (min-width: 992px){#modal-global-subscribe .subscribe-modal{width:50%;}#modal-global-subscribe .subscribe-modal .form-input form{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}#modal-global-subscribe .subscribe-modal .form-input form input[type="email"]{width:460px;margin-right:26px;}#modal-global-subscribe .subscribe-modal .form-input form input[type="submit"]{width:204px;}} 59 </style> 60 <style id="custom-style-css">.pagination-style-1 li a{color:rgba(0,0,0,1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(0, 0, 0, 0)!important;}.pagination-style-1 li a:hover{color:rgba(255,255,255,1)!important;background-color:rgba(0,0,0,1)!important;border-color:rgba(0, 0, 0, 1)!important;}.pagination-style-1 li.active a{color:rgba(255,255,255,1)!important;background-color:rgba(0,0,0,1)!important;border-color:rgba(0, 0, 0, 1)!important;}.hyperlink-style-1{color:#000000!important;}.hyperlink-style-1:hover{color:rgba(125, 125, 125, 1)!important;}.social_icons-style-1 a{border-color:rgba(0,0,0,1)!important;background-color:rgba(255, 255, 255, 0)!important;color:rgba(0,0,0,1)!important;}.social_icons-style-1 a:hover{border-color:rgba(0, 0, 0, 1)!important;background-color:rgba(0,0,0,1)!important;color:rgba(255,255,255,1)!important;}.social_icons-style-1 a i{color:inherit!important;}
60.social_icons-style-1 a svg,.social_icons-style-1 a svg path{fill:currentColor!important;}.button-style-1{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-1:hover{color:rgba(0, 0, 0, 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, 1)!important;background-color:rgba(255, 255, 255, 0)!important;border-color:rgba(255, 255, 255, 1)!important;}.pagination-style-2 li a:hover{color:rgba(0, 0, 0, 1)!important;background-color:rgba(255, 255, 255, 1)!important;border-color:#FFFFFF!important;}.pagination-style-2 li.active a{color:rgba(0, 0, 0, 1)!important;background-color:rgba(255, 255, 255, 1)!important;border-color:#FFFFFF!important;}.button-style-2{color:rgba(0,0,0,1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(0,0,0,1)!important;}.button-style-2:hover{color:rgba(255,255,255,1)!important;background-color:rgba(0,0,0,1)!important;border-color:rgba(0, 0, 0, 1)!important;}.social_icons-style-2 a{border-color:rgba(255, 255, 255, 1)!important;background-color:rgba(255, 255, 255, 0)!important;color:rgba(255, 255, 255, 1)!important;}.social_icons-style-2 a:hover{border-color:rgba(255,255,255,1)!important;background-color:rgba(255, 255, 255, 1)!important;color:rgba(0, 0, 0, 1)!important;}.social_icons-style-2 a i{color:inherit!important;}
60.social_icons-style-2 a svg,.social_icons-style-2 a svg path{fill:currentColor!important;}.button-style-3{color:rgba(0,0,0,1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(0,0,0,1)!important;}.button-style-3:hover{color:rgba(255,255,255,1)!important;background-color:rgba(0,0,0,1)!important;border-color:rgba(0, 0, 0, 1)!important;}.button-style-4{color:rgba(0, 0, 0, 1)!important;background-color:rgba(255, 255, 255, 1)!important;border-color:rgba(255, 255, 255, 1)!important;}.button-style-4:hover{color:rgba(90, 90, 90, 1)!important;background-color:rgba(255, 255, 255, 1)!important;border-color:#FFFFFF!important;}</style> 61 <!-- LP Consent bootstrap: blocking; resolves consent state, pushes Consent Mode 62 defaults, and dynamically loads the locale + main (and banner if needed). --> 63
63<script src="https://cdn.luxurypresence.com/scripts/lp-consent/latest/lp-consent-boot.js" data-website-id="f8eeb622-1c43-422f-bf48-840bd660be00"></script>
63 64 65 66
66<script> 67 (function utmParse() { 68 const url = new URL(window.location.href); 69 if (url.search) { 70 const utm = url.search.split(/\?|&/g).reduce((acc, current) => { 71 const matched = current.match(/utm_(content|campaign|medium|source|term|id)|gclid/g); 72 if (matched) { 73 acc[matched[0]] = current.replace(`${matched[0]}=`, ''); 74 } 75 return acc; 76 }, {}); 77 if (Object.keys(utm).length) { 78 window.localStorage.setItem('utm_vars', JSON.stringify(utm)); 79 } else { 80 // Remove old utm vars 81 window.localStorage.removeItem('utm_vars'); 82 } 83 } 84 // Set referrer in local storage 85 // This is meant to be stored once to avoid self-referrals and to have the first referrer only. 86 if (!window.localStorage.getItem('referrer')) { 87 // Capture the Referrer URL 88 const referrer = document.referrer; 89 if (referrer) { 90 // Only store the referrer if it comes from outside the current domain (to avoid self-referrals) 91 const currentDomain = window.location.hostname; 92 const referrerDomain = new URL(referrer).hostname; 93 94 if (referrerDomain !== currentDomain) { 95 // Store it in localStorage 96 localStorage.setItem('referrer', referrer); 97 } 98 } 99 } 100 })(); 101 </script>
101 102
102<script type="text/javascript"> 103 adroll_adv_id = "AG6YH4BJSFE7JLNROH6VAX"; 104 adroll_pix_id = "C2S6Z47ZJRBCDL4NG35F2H"; 105 adroll_version = "2.0"; 106 107 (function(w, d, e, o, a) { 108 w.__adroll_loaded = true; 109 w.adroll = w.adroll || []; 110 w.adroll.f = [ 'setProperties', 'identify', 'track' ]; 111 var roundtripUrl = "https://s.adroll.com/j/" + adroll_adv_id 112 + "/roundtrip.js"; 113 for (a = 0; a < w.adroll.f.length; a++) { 114 w.adroll[w.adroll.f[a]] = w.adroll[w.adroll.f[a]] || (function(n) { 115 return function() { 116 w.adroll.push([ n, arguments ]) 117 } 118 })(w.adroll.f[a]) 119 } 120 121 e = d.createElement('script'); 122 o = d.getElementsByTagName('script')[0]; 123 e.async = 1; 124 e.src = roundtripUrl; 125 o.parentNode.insertBefore(e, o); 126 })(window, document); 127 adroll.track("pageView"); 128</script>
128 129 130 <!-- GOOGLE TRANSLATE STYLES are moved to external CSS --> 131</head> 132<body> 133 <div id="google_translate_element" style="display: none"></div> 134 135 <nav id="global-navbar" data-el-id="43fa2137-fe5b-4845-ba78-95c0fb5084ae"> 136 <div class="header"> 137 <div class="header__left"> 138 139 <ul class="navigation"> 140 <li class="navigation__item sub-nav-container"> 141 <a href="#" class="navigation__link"><span>About Us</span></a> 142 <div class="sub-nav"> 143 <ul> 144 <li><a href="/the-founders" class="nav-link">The Founders</a></li> 145 <li><a href="/agent" class="nav-link">The Team</a></li> 146 <li><a href="/testimonials" class="nav-link">Testimonials</a></li> 147 </ul> 148 </div> 149 </li> 150 <li class="navigation__item sub-nav-container"> 151 <a href="#" class="navigation__link"><span>Properties</span></a> 152 <div class="sub-nav"> 153 <ul> 154 <li><a href="/properties/sale" class="nav-link">Exclusive Offerings</a></li> 155 <li><a href="/properties/sold" class="nav-link">Past Sales</a></li> 156 </ul> 157 </div> 158 </li> 159 <li class="navigation__item sub-nav-container"> 160 <a href="#" class="navigation__link"><span>Communities</span></a> 161 <div class="sub-nav"> 162 <ul> 163 <li><a href="/neighborhoods-petaluma" class="nav-link">Petaluma</a></li> 164 <li><a href="/neighborhoods-penngrove" class="nav-link">Penngrove</a></li> 165 <li><a href="/neighborhoods-sebastopol" class="nav-link">Sebastopol</a></li> 166 <li><a href="/neighborhoods-sonoma" class="nav-link">Sonoma Valley</a></li> 167 <li><a href="/neighborhoods-west-marin" class="nav-link">West Marin</a></li> 168 <li><a href="/neighborhoods-russian-river" class="nav-link">Russian River</a></li> 169 <li><a href="/neighborhoods-coastal-sonoma" class="nav-link">Coastal Sonoma</a></li> 170 <li><a href="/neighborhoods-healdsburg" class="nav-link">Healdsburg</a></li> 171 <li><a href="/neighborhoods-santa-rosa" class="nav-link">Santa Rosa</a></li> 172 <li><a href="/neighborhoods-cotati+rohnert-Park" class="nav-link">Cotati + Rohnert Park</a></li> 173 </ul> 174 </div> 175 </li> 176 <li class="navigation__item"> 177 <a href="/blog" class="navigation__link"><span>Blog</span></a> 178 </li> 179 </ul> 180 181 182 </div> 183 <a href="/" class="header__logo header__logo--center"> 184 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/dlmcjmdphzsz4isjrcos" alt="" class="dark"> 185 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/exubkz01tqrwp9asj63j" alt="" class="light"> 186 </a> 187 <div class="header__right"> 188 <ul class="navigation"> 189 <li class="navigation__item"> 190 <a href="/film-gallery" class="navigation__link"><span>Film Gallery</span></a> 191 </li> 192 <li class="navigation__item"> 193 <a href="/home-valuation" class="navigation__link"><span>Home Valuation</span></a> 194 </li> 195 <li class="navigation__item"> 196 <a href="/home-search/listings" class="navigation__link"><span>Search Properties</span></a> 197 </li> 198 <li class="navigation__item"> 199 <a data-type="CONTACT_US" class="navigation__link"><span>Contact Us</span></a> 200 </li> 201 </ul> 202 <button class="hamburger-component hamburger"> 203 <span></span> 204 </button> 205 </div> 206</div> 207 208 </nav> 209 <div id="global-sidemenu" class="sidemenu" data-el-id="dd409a90-defd-4b7a-a4fb-816ab12adf2a"> 210 <div class="wrapper"> 211 <div class="holder"> 212 <div class="title">Hedge Realty</div> 213 <ul class="section-options"> 214 <li class="option"><a href="/">HOME</a></li> 215 <li class="option sub-nav-container"> 216 <div class="sub-nav"> 217 <ul> 218 <li><a href="/the-founders" class="link sub-nav-link">THE FOUNDERS</a></li> 219 <li><a href="/agent" class="link sub-nav-link">THE TEAM</a></li> 220 <li><a href="/testimonials" class="link sub-nav-link">TESTIMONIALS</a></li> 221 </ul> 222 </div> 223 <a href="#" class="link main-nav">ABOUT US</a> 224 </li> 225 <li class="option sub-nav-container"> 226 <div class="sub-nav"> 227 <ul> 228 <li><a href="/properties/sale" class="link sub-nav-link">EXCLUSIVE LISTINGS</a></li> 229 <li><a href="/properties/sold" class="link sub-nav-link">PAST SALES</a></li> 230 </ul> 231 </div> 232 <a href="#" class="link main-nav">PROPERTIES</a> 233 </li> 234 <li class="option sub-nav-container"> 235 <div class="sub-nav"> 236 <ul> 237 <li><a href="/neighborhoods-petaluma" class="link sub-nav-link">PETALUMA</a></li> 238 <li>
238<a href="/neighborhoods-penngrove" class="link sub-nav-link">PENNGROVE</a></li> 239 <li><a href="/neighborhoods-sebastopol" class="link sub-nav-link">SEBASTOPOL</a></li> 240 <li><a href="/neighborhoods-sonoma" class="link sub-nav-link">SONOMA VALLEY</a></li> 241 <li><a href="/neighborhoods-west-marin" class="link sub-nav-link">WEST MARIN</a></li> 242 <li><a href="/neighborhoods-russian-river" class="link sub-nav-link">RUSSIAN RIVER</a></li> 243 <li><a href="/neighborhoods-coastal-sonoma" class="link sub-nav-link">COASTAL SONOMA</a></li> 244 <li><a href="/neighborhoods-healdsburg" class="link sub-nav-link">HEALDSBURG</a></li> 245 <li><a href="/neighborhoods-santa-rosa" class="link sub-nav-link">SANTA ROSA</a></li> 246 </ul> 247 </div> 248 <a href="#" class="link main-nav">COMMUNITIES</a> 249 </li> 250 <li class="option"><a href="/home-valuation">HOME VALUATION</a></li> 251 <li class="option"><a href="/home-search/listings?search_type=envelope&south=38.06922258137191&west=-122.83728260234376&north=38.392846631802136&east=-122.42529529765626&property_type%5B%5D=Co-op&property_type%5B%5D=Condo&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=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=price%3Adesc&page=1">SEARCH PROPERTIES</a></li> 252 <li class="option"><button data-type="CONTACT_US">CONTACT US</button></li> 253 </ul> 254 </div> 255 <button class="toggle sidemenu-close"></button> 256</div> 257 258 </div> 259 <div id="global-mobile-contact" class="mobile-contact-wrapper" data-el-id="befe5af2-a6ca-4119-924a-a85d96d36b51"> 260 <div class="btn-holder" 261style=" 262--backgroundColor: rgba(20, 20, 20, 1); 263--textColor: rgba(255, 255, 255, 1); 264--pillTextColor: rgba(26, 26, 26, 1); 265--pillBackgroundColor: rgba(255, 255, 255, 1);"> 266 267 <button type="button" class="connect-btn lp-ico lp-ico-arrow-top visible">Let's Connect</button> 268</div> 269 270 271<div class="pop-up" style="--backgroundColor: rgba(20, 20, 20, 1); --textColor: rgba(255, 255, 255, 1);"> 272 <div class="lp-container"> 273 <form data-type="contact-form" class="contact-form"> 274 <div class="contact-form__container"> 275 <h3 class="lp-h3">Leave a Message</h3> 276 277 <div class="contact-form__content"> 278 <div class="contact-form__inputs-container"> 279 <div class="contact-form__item"> 280 <input 281 id="__FullName" 282 type="text" name="name" 283 class="lp-input lp-input--light" 284 required 285 placeholder="Full Name"> 286 </div> 287 <div class="contact-form__item"> 288 <input 289 id="__Email" 290 type="email" name="email" 291 class="lp-input js-email-input lp-input--light" 292 required 293 placeholder="Email"> 294 </div> 295 <div class="contact-form__item"> 296 <input 297 class="lp-input lp-input--light" 298 type="tel" 299 placeholder="Phone" 300 id="__Phone" 301 name="phone" 302 required> 303 </div> 304 305 <div class="contact-form__item input-group-select"> 306 <select name="interest" id="-field-interest" placeholder="Interest"
307 class="lp-input dropdown-select js-select js-form-element lp-input--light" required> 308 <option value="" disabled selected data-label="Interest">Interested in...</option> 309 <option value="Selling & Buying">Selling & Buying</option> 310 <option value="Selling">Selling</option> 311 <option value="Buying">Buying</option> 312 <option value="Renting">Renting</option> 313 <option value="Other">Other</option> 314 </select> 315 <label for="-field-interest" class="lp-label sr-only">Interest</label> 316 </div> 317 318 <div class="contact-form__item"> 319 <textarea 320 name="message" 321 rows="4" 322 id="__Message" 323 class="lp-input lp-input--light" 324 placeholder="Message" 325 required></textarea> 326 </div> 327 <div class="lp-disclaimer"> <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label> 328 <label class='lp-tcr-content'> 329 <span class='lp-tcr-checkbox'> 330 <input 331 type='checkbox' 332 id='-termsAccepted' 333 name='termsAccepted' 334 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 335 oninput="this.setCustomValidity('')" 336 required 337 /></span> 338 <span class='lp-tcr-message'> 339 340 I agree to be contacted by 341 Hedge Realty 342 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 343 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 344 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 345 </span> 346 </label> 347 348</div> 349 <button type="submit" class="lp-btn lp-btn--filled lp-btn--dark submit contact-form__item">Submit</button> 350 351 <div class="lp-h-pot"> 352 <input id="__newsSignMiddleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 353 </div> 354 355 <input style="display: none;" type="text" name="source" value="CONTACT_INQUIRY" /> 356 <input type="hidden" name="button_text" value="Let's Connect"> 357 </div> 358 </div> 359 </div> 360 361 362 <div class="success-block"> 363 <h3 class="lp-h3 success-message">Thank you for your message. We will be in touch with you shortly.</h3> 364 365 </div> 366 </form> 367 368 <button type="button" class="close-btn lp-ico lp-ico-close"></button> 369 370 371 </div> 372</div> 373 374 375 </div> 376 <section class="image-section is-font-color-light is-background-color-light" id="section-2795aaeb-28d4-404d-8a83-32bc2f7d4bd2" data-el-id="e6c6941b-dd32-4d6b-b4aa-56593f2d58bb"> 377 <div class="redesign custom-intro"> 378 <div class="container"> 379 <h1 class="custom-intro__title">the team</h1> 380 381 </div> 382</div> 383 384</section> 385<section id="section-03af5970-969f-4ce5-87e6-2b86762a7411" class="solid-section is-font-color-dark is-background-color-light" data-el-id="21c5a117-61cb-4f43-8635-2da86e3ae7dd"> 386 387<div class="boxed-text lp-vertical-paddings redesign"> 388 <div class="lp-container"> 389 <div class="lp-title-group"> 390 <h2 class="lp-h2 js-title">hedge realty</h2> 391 392 </div> 393 394 <div class="boxed-text__description"><h3><span style="font-weight: 400;">We live here. We love Sonoma County. We know the ins and outs of every community from wine country to the coast: the thriving culinary scenes, the finest wineries and the best spots for sunsets. We know all the best listings and all the off-market homes that can help you effectively price your property – not just based on comps but on the kind of on-the-ground research, intelligence and insight. We establish excellence, imagination and impact in every project we undertake. Our successes in these markets reflect the decades we’ve invested in the region, the relationships we’ve built and the counsel and insights that knowledge affords our clients.</span></h3></div> 395 </div> 396</div> 397</section> 398<section id="section-40e257c9-edea-4cb8-9ee1-32c3ade9c174" class="solid-section is-font-color-dark is-background-color-light" data-el-id="4fd88bff-4528-4094-a238-bc747e38f1f6">
399<script type="text/x-handlebars-template" class="gridItem pagination-script"><div class="team-member__container" data-search-string="{{firstName}} {{lastName}} {{email}}" 400 data-tags="{{JSONstringify tags}}" 401> 402 <a class="team-member__link" href="/agent/{{slug}}"> 403 <div class="team-member__image-wrap"> 404 <div class="team-member__image"> 405 {{{mediaImage avatar alt=(concat firstName " " lastName) sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw"}}} 406 </div> 407 <div class="team-member__hover"> 408 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 409 </div> 410 </div> 411 <div class="team-member__info"> 412 <span class="team-member__name">{{firstName}} {{lastName}}</span> 413 <span class="team-member__role">{{position}}</span> 414 {{#if license}} 415 <span class="team-member__license">License: #{{license}}</span> 416 {{/if}} 417 </div> 418 </a> 419</div> 420</script>
420<div class="team-grid redesign"> 421 <div class="lp-container"> 422 <div class="lp-title-group"> 423 424 <h2 class="lp-h2">tim little + alexa glockner team</h2> 425 426 </div> 427 428 <div class="js-sync-flag" style="display: none;"></div> 429 430 431 432 433 <div class="team-grid__wrapper ordered-elements"> 434 <div class="team-member__container" data-search-string="Alexa Glockner [email protected]" 435 data-tags="[]" 436 > 437 <a class="team-member__link" href="/agent/alexa-glockner"> 438 <div class="team-member__image-wrap"> 439 <div class="team-member__image"> 440 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/33618675-2f23-4816-88c1-7a2a5cfa6b43" 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/33618675-2f23-4816-88c1-7a2a5cfa6b43 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/33618675-2f23-4816-88c1-7a2a5cfa6b43 1095w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Alexa Glockner" class="portrait" loading="lazy"> 441 </div> 442 <div class="team-member__hover"> 443 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 444 </div> 445 </div> 446 <div class="team-member__info"> 447 <span class="team-member__name">Alexa Glockner</span> 448 <span class="team-member__role">Realtor® + Founder</span> 449 <span class="team-member__license">License: #01329001</span> 450 </div> 451 </a> 452 </div> 453 <div class="team-member__container" data-search-string="Tim Little [email protected]" 454 data-tags="[]" 455 > 456 <a class="team-member__link" href="/agent/tim-little"> 457 <div class="team-member__image-wrap"> 458 <div class="team-member__image"> 459 <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/kj9douoqczf891jyl1iv" 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/kj9douoqczf891jyl1iv 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/kj9douoqczf891jyl1iv 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/kj9douoqczf891jyl1iv 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Tim Little" class="portrait" loading="lazy"> 460 </div> 461 <div class="team-member__hover"> 462 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 463 </div> 464 </div> 465 <div class="team-member__info"> 466 <span class="team-member__name">Tim Little</span> 467 <span class="team-member__role">Broker Associate + Founder</span> 468 <span class="team-member__license">License: #01910516</span> 469 </div> 470 </a> 471 </div> 472 <div class="team-member__container" data-search-string="Shawn Norlin [email protected]" 473 data-tags="[]" 474 > 475 <a class="team-member__link" href="/agent/shawn-norlin"> 476 <div class="team-member__image-wrap"> 477 <div class="team-member__image"> 478 <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/bogjlhn71rqi7gyok6ux" 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/bogjlhn71rqi7gyok6ux 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/bogjlhn71rqi7gyok6ux 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/bogjlhn71rqi7gyok6ux 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Shawn N
478orlin" class="portrait" loading="lazy"> 479 </div> 480 <div class="team-member__hover"> 481 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 482 </div> 483 </div> 484 <div class="team-member__info"> 485 <span class="team-member__name">Shawn Norlin</span> 486 <span class="team-member__role">Realtor® + Admin</span> 487 <span class="team-member__license">License: #02125856</span> 488 </div> 489 </a> 490 </div> 491 <div class="team-member__container" data-search-string="Robyn Poggi [email protected]" 492 data-tags="[]" 493 > 494 <a class="team-member__link" href="/agent/robyn-poggi"> 495 <div class="team-member__image-wrap"> 496 <div class="team-member__image"> 497 <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/32c43e47-1d31-41c5-9088-d464b6a0ba18" 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/32c43e47-1d31-41c5-9088-d464b6a0ba18 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/32c43e47-1d31-41c5-9088-d464b6a0ba18 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/32c43e47-1d31-41c5-9088-d464b6a0ba18 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Robyn Poggi" loading="lazy"> 498 </div> 499 <div class="team-member__hover"> 500 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 501 </div> 502 </div> 503 <div class="team-member__info"> 504 <span class="team-member__name">Robyn Poggi</span> 505 <span class="team-member__role">Realtor®</span> 506 <span class="team-member__license">License: #02439298</span> 507 </div> 508 </a> 509 </div> 510 </div> 511 512 513 <div class="empty-message js-empty-message"> 514 <h3 class="header2 empty-title">No result found</h3> 515 </div> 516 </div> 517</div> 518</section> 519<section id="section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9" class="solid-section is-font-color-dark is-background-color-light" data-el-id="4fd88bff-4528-4094-a238-bc747e38f1f6">
520<script type="text/x-handlebars-template" class="gridItem pagination-script"><div class="team-member__container" data-search-string="{{firstName}} {{lastName}} {{email}}" 521 data-tags="{{JSONstringify tags}}" 522> 523 <a class="team-member__link" href="/agent/{{slug}}"> 524 <div class="team-member__image-wrap"> 525 <div class="team-member__image"> 526 {{{mediaImage avatar alt=(concat firstName " " lastName) sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw"}}} 527 </div> 528 <div class="team-member__hover"> 529 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 530 </div> 531 </div> 532 <div class="team-member__info"> 533 <span class="team-member__name">{{firstName}} {{lastName}}</span> 534 <span class="team-member__role">{{position}}</span> 535 {{#if license}} 536 <span class="team-member__license">License: #{{license}}</span> 537 {{/if}} 538 </div> 539 </a> 540</div> 541</script>
541<div class="team-grid redesign"> 542 <div class="lp-container"> 543 <div class="lp-title-group"> 544 545 <h2 class="lp-h2">pearson fillinger group</h2> 546 547 </div> 548 549 <div class="js-sync-flag" style="display: none;"></div> 550 551 552 553 554 <div class="team-grid__wrapper ordered-elements"> 555 <div class="team-member__container" data-search-string="Stephen Pearson [email protected]" 556 data-tags="[]" 557 > 558 <a class="team-member__link" href="/agent/stephen-pearson"> 559 <div class="team-member__image-wrap"> 560 <div class="team-member__image"> 561 <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/c7a4eb22-1bc1-4440-b417-44504ec79dbb" 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/c7a4eb22-1bc1-4440-b417-44504ec79dbb 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/c7a4eb22-1bc1-4440-b417-44504ec79dbb 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/c7a4eb22-1bc1-4440-b417-44504ec79dbb 1851w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Stephen Pearson" class="portrait" loading="lazy"> 562 </div> 563 <div class="team-member__hover"> 564 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 565 </div> 566 </div> 567 <div class="team-member__info"> 568 <span class="team-member__name">Stephen Pearson</span> 569 <span class="team-member__role">Broker Associate</span> 570 <span class="team-member__license">License: #01973705</span> 571 </div> 572 </a> 573 </div> 574 <div class="team-member__container" data-search-string="Mary Fillinger [email protected]" 575 data-tags="[]" 576 > 577 <a class="team-member__link" href="/agent/mary-fillinger"> 578 <div class="team-member__image-wrap"> 579 <div class="team-member__image"> 580 <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/59ee5d7a-f368-4b1d-9755-b7bf47d03dcc" 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/59ee5d7a-f368-4b1d-9755-b7bf47d03dcc 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/59ee5d7a-f368-4b1d-9755-b7bf47d03dcc 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/59ee5d7a-f368-4b1d-9755-b7bf47d03dcc 1783w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Mary Fillinger" class="portrait" loading="lazy"> 581 </div> 582 <div class="team-member__hover"> 583 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 584 </div> 585 </div> 586 <div class="team-member__info"> 587 <span class="team-member__name">Mary Fillinger</span> 588 <span class="team-member__role">Realtor®</span> 589 <span class="team-member__license">License: #02147040</span> 590 </div> 591 </a> 592 </div> 593 <div class="team-member__container" data-search-string="Jan Frost [email protected]" 594 data-tags="[]" 595 > 596 <a class="team-member__link" href="/agent/jan-frost"> 597 <div class="team-member__image-wrap"> 598 <div class="team-member__image"> 599 <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/f2adstqvvlzz0gcvbhs9" 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/f2adstqvvlzz0gcvbhs9 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/f2adstqvvlzz0gcvbhs9 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/f2adstqvvlzz0gcvbhs9 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Jan Frost" class="portrait" loading="lazy"> 600 </div> 601 <div class="team-member__hover">
602 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 603 </div> 604 </div> 605 <div class="team-member__info"> 606 <span class="team-member__name">Jan Frost</span> 607 <span class="team-member__role">REALTOR®</span> 608 <span class="team-member__license">License: #01107690</span> 609 </div> 610 </a> 611 </div> 612 </div> 613 614 615 <div class="empty-message js-empty-message"> 616 <h3 class="header2 empty-title">No result found</h3> 617 </div> 618 </div> 619</div> 620</section> 621<section id="section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a" class="solid-section is-font-color-dark is-background-color-light" data-el-id="4fd88bff-4528-4094-a238-bc747e38f1f6">
622<script type="text/x-handlebars-template" class="gridItem pagination-script"><div class="team-member__container" data-search-string="{{firstName}} {{lastName}} {{email}}" 623 data-tags="{{JSONstringify tags}}" 624> 625 <a class="team-member__link" href="/agent/{{slug}}"> 626 <div class="team-member__image-wrap"> 627 <div class="team-member__image"> 628 {{{mediaImage avatar alt=(concat firstName " " lastName) sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw"}}} 629 </div> 630 <div class="team-member__hover"> 631 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 632 </div> 633 </div> 634 <div class="team-member__info"> 635 <span class="team-member__name">{{firstName}} {{lastName}}</span> 636 <span class="team-member__role">{{position}}</span> 637 {{#if license}} 638 <span class="team-member__license">License: #{{license}}</span> 639 {{/if}} 640 </div> 641 </a> 642</div> 643</script>
643<div class="team-grid redesign"> 644 <div class="lp-container"> 645 <div class="lp-title-group"> 646 647 <h2 class="lp-h2">chelsea lovascio + team</h2> 648 649 </div> 650 651 <div class="js-sync-flag" style="display: none;"></div> 652 653 654 655 656 <div class="team-grid__wrapper ordered-elements"> 657 <div class="team-member__container" data-search-string="Chelsea Lovascio [email protected]" 658 data-tags="[]" 659 > 660 <a class="team-member__link" href="/agent/chelsea-lovascio"> 661 <div class="team-member__image-wrap"> 662 <div class="team-member__image"> 663 <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/irwjqqeylvsgcgo8kdyw" 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/irwjqqeylvsgcgo8kdyw 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/irwjqqeylvsgcgo8kdyw 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/irwjqqeylvsgcgo8kdyw 1500w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Chelsea Lovascio" class="portrait" loading="lazy"> 664 </div> 665 <div class="team-member__hover"> 666 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 667 </div> 668 </div> 669 <div class="team-member__info"> 670 <span class="team-member__name">Chelsea Lovascio</span> 671 <span class="team-member__role">Realtor®</span> 672 <span class="team-member__license">License: #01958007</span> 673 </div> 674 </a> 675 </div> 676 <div class="team-member__container" data-search-string="Zoe Kimberly [email protected]" 677 data-tags="[]" 678 > 679 <a class="team-member__link" href="/agent/zoe-kimberly"> 680 <div class="team-member__image-wrap"> 681 <div class="team-member__image"> 682 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/cedqsztsewm4y5onz0bc" alt="Zoe Kimberly" class="portrait" loading="lazy"> 683 </div> 684 <div class="team-member__hover"> 685 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 686 </div> 687 </div> 688 <div class="team-member__info"> 689 <span class="team-member__name">Zoe Kimberly</span> 690 <span class="team-member__role">Realtor®</span> 691 <span class="team-member__license">License: #02082252</span> 692 </div> 693 </a> 694 </div> 695 </div> 696 697 698 <div class="empty-message js-empty-message"> 699 <h3 class="header2 empty-title">No result found</h3> 700 </div> 701 </div> 702</div> 703</section> 704<section id="section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de" class="solid-section is-font-color-dark is-background-color-light" data-el-id="4fd88bff-4528-4094-a238-bc747e38f1f6">
705<script type="text/x-handlebars-template" class="gridItem pagination-script"><div class="team-member__container" data-search-string="{{firstName}} {{lastName}} {{email}}" 706 data-tags="{{JSONstringify tags}}" 707> 708 <a class="team-member__link" href="/agent/{{slug}}"> 709 <div class="team-member__image-wrap"> 710 <div class="team-member__image"> 711 {{{mediaImage avatar alt=(concat firstName " " lastName) sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw"}}} 712 </div> 713 <div class="team-member__hover"> 714 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 715 </div> 716 </div> 717 <div class="team-member__info"> 718 <span class="team-member__name">{{firstName}} {{lastName}}</span> 719 <span class="team-member__role">{{position}}</span> 720 {{#if license}} 721 <span class="team-member__license">License: #{{license}}</span> 722 {{/if}} 723 </div> 724 </a> 725</div> 726</script>
726<div class="team-grid redesign"> 727 <div class="lp-container"> 728 <div class="lp-title-group"> 729 730 <h2 class="lp-h2">independent agents</h2> 731 732 </div> 733 734 <div class="js-sync-flag" style="display: none;"></div> 735 736 737 738 739 <div class="team-grid__wrapper ordered-elements"> 740 <div class="team-member__container" data-search-string="Danielle La Noire [email protected]" 741 data-tags="[]" 742 > 743 <a class="team-member__link" href="/agent/dani-la-noire"> 744 <div class="team-member__image-wrap"> 745 <div class="team-member__image"> 746 <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/415bd720-1b95-4ae8-b921-fc4b98303413" 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/415bd720-1b95-4ae8-b921-fc4b98303413 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/415bd720-1b95-4ae8-b921-fc4b98303413 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/415bd720-1b95-4ae8-b921-fc4b98303413 1732w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Danielle La Noire" class="portrait" loading="lazy"> 747 </div> 748 <div class="team-member__hover"> 749 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 750 </div> 751 </div> 752 <div class="team-member__info"> 753 <span class="team-member__name">Danielle La Noire</span> 754 <span class="team-member__role">Realtor®</span> 755 <span class="team-member__license">License: #01957008</span> 756 </div> 757 </a> 758 </div> 759 <div class="team-member__container" data-search-string="Jenny Belforte [email protected]" 760 data-tags="[]" 761 > 762 <a class="team-member__link" href="/agent/jenny-belforte"> 763 <div class="team-member__image-wrap"> 764 <div class="team-member__image"> 765 <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/bca8f21d-614c-4c9d-8aa6-4ab29a11d841" 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/bca8f21d-614c-4c9d-8aa6-4ab29a11d841 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/bca8f21d-614c-4c9d-8aa6-4ab29a11d841 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/bca8f21d-614c-4c9d-8aa6-4ab29a11d841 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Jenny Belforte" class="portrait" loading="lazy"> 766 </div> 767 <div class="team-member__hover"> 768 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 769 </div> 770 </div> 771 <div class="team-member__info"> 772 <span class="team-member__name">Jenny Belforte</span> 773 <span class="team-member__role">Realtor®</span> 774 <span class="team-member__license">License: #01351370</span> 775 </div> 776 </a> 777 </div> 778 <div class="team-member__container" data-search-string="Marni Cunha [email protected]" 779 data-tags="[]" 780 > 781 <a class="team-member__link" href="/agent/marni-cunha"> 782 <div class="team-member__image-wrap"> 783 <div class="team-member__image"> 784 <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/fa64364f-52dd-4ab8-b212-eb0c281e64eb" 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/fa64364f-52dd-4ab8-b212-eb0c281e64eb 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/fa64364f-52dd-4ab8-b212-eb0c281e64eb 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/fa64364f-52dd-4ab8-b212-eb0c281e64eb 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Marni Cunha" class="portrait" loading="lazy"> 785 </div> 786 <div class="team-member__hover">
787 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 788 </div> 789 </div> 790 <div class="team-member__info"> 791 <span class="team-member__name">Marni Cunha</span> 792 <span class="team-member__role">Realtor®</span> 793 <span class="team-member__license">License: #01754207</span> 794 </div> 795 </a> 796 </div> 797 <div class="team-member__container" data-search-string="Jennifer Rochlin [email protected]" 798 data-tags="[]" 799 > 800 <a class="team-member__link" href="/agent/jennifer-rochlin"> 801 <div class="team-member__image-wrap"> 802 <div class="team-member__image"> 803 <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/45674f54-ab52-4ddb-b4bb-8256c76dbc33" 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/45674f54-ab52-4ddb-b4bb-8256c76dbc33 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/45674f54-ab52-4ddb-b4bb-8256c76dbc33 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/45674f54-ab52-4ddb-b4bb-8256c76dbc33 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Jennifer Rochlin" class="portrait" loading="lazy"> 804 </div> 805 <div class="team-member__hover"> 806 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 807 </div> 808 </div> 809 <div class="team-member__info"> 810 <span class="team-member__name">Jennifer Rochlin</span> 811 <span class="team-member__role">Realtor</span> 812 <span class="team-member__license">License: #01991714</span> 813 </div> 814 </a> 815 </div> 816 <div class="team-member__container" data-search-string=" Morisha Ogunkoya [email protected]" 817 data-tags="[]" 818 > 819 <a class="team-member__link" href="/agent/morisha-ogunkoya"> 820 <div class="team-member__image-wrap"> 821 <div class="team-member__image"> 822 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/dzcvbc1milq3pijqcfk6" 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/dzcvbc1milq3pijqcfk6 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/dzcvbc1milq3pijqcfk6 1000w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt=" Morisha Ogunkoya" class="portrait" loading="lazy"> 823 </div> 824 <div class="team-member__hover"> 825 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 826 </div> 827 </div> 828 <div class="team-member__info"> 829 <span class="team-member__name"> Morisha Ogunkoya</span> 830 <span class="team-member__role">Realtor®</span> 831 <span class="team-member__license">License: #02207298</span> 832 </div> 833 </a> 834 </div> 835 <div class="team-member__container" data-search-string="Sandy Spring [email protected]" 836 data-tags="[]" 837 > 838 <a class="team-member__link" href="/agent/sandy-spring"> 839 <div class="team-member__image-wrap"> 840 <div class="team-member__image"> 841 <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/jl0ints0frogpzturfab" 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/jl0ints0frogpzturfab 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/jl0ints0frogpzturfab 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/jl0ints0frogpzturfab 1576w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Sandy Spring" loading="lazy"> 842 </div> 843 <div class="team-member__hover">
844 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 845 </div> 846 </div> 847 <div class="team-member__info"> 848 <span class="team-member__name">Sandy Spring</span> 849 <span class="team-member__role">Broker Associate</span> 850 <span class="team-member__license">License: #01465098</span> 851 </div> 852 </a> 853 </div> 854 <div class="team-member__container" data-search-string="Rachael Dressler [email protected]" 855 data-tags="[]" 856 > 857 <a class="team-member__link" href="/agent/rachael-dressler"> 858 <div class="team-member__image-wrap"> 859 <div class="team-member__image"> 860 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/2ea85dbe-b0dd-4227-9a31-b92fbb020770" 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/2ea85dbe-b0dd-4227-9a31-b92fbb020770 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/2ea85dbe-b0dd-4227-9a31-b92fbb020770 1200w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Rachael Dressler" class="portrait" loading="lazy"> 861 </div> 862 <div class="team-member__hover"> 863 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 864 </div> 865 </div> 866 <div class="team-member__info"> 867 <span class="team-member__name">Rachael Dressler</span> 868 <span class="team-member__role">Realtor®</span> 869 <span class="team-member__license">License: #02176769</span> 870 </div> 871 </a> 872 </div> 873 <div class="team-member__container" data-search-string="Steve Cohn [email protected]" 874 data-tags="[]" 875 > 876 <a class="team-member__link" href="/agent/steve-cohn"> 877 <div class="team-member__image-wrap"> 878 <div class="team-member__image"> 879 <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/c449ibrcfjm9n3cr8wir" 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/c449ibrcfjm9n3cr8wir 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/c449ibrcfjm9n3cr8wir 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/c449ibrcfjm9n3cr8wir 1920w" sizes="(max-width: 768px) 100vw, (max-width: 1000px) 50vw, 33vw" alt="Steve Cohn" class="portrait" loading="lazy"> 880 </div> 881 <div class="team-member__hover"> 882 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 883 </div> 884 </div> 885 <div class="team-member__info"> 886 <span class="team-member__name">Steve Cohn</span> 887 <span class="team-member__role">Realtor®</span> 888 <span class="team-member__license">License: #01211151</span> 889 </div> 890 </a> 891 </div> 892 <div class="team-member__container" data-search-string="Lindsay Doyle [email protected]" 893 data-tags="[]" 894 > 895 <a class="team-member__link" href="/agent/lindsay-doyle"> 896 <div class="team-member__image-wrap"> 897 <div class="team-member__image"> 898 <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/xkkmyt3wzdsxlwpjoewe" alt="Lindsay Doyle" class="portrait" loading="lazy"> 899 </div> 900 <div class="team-member__hover">
901 <span class="btn btn--primary-dark team-member__btn button-style-3">LEARN MORE</span> 902 </div> 903 </div> 904 <div class="team-member__info"> 905 <span class="team-member__name">Lindsay Doyle</span> 906 <span class="team-member__role">Realtor®</span> 907 <span class="team-member__license">License: #01838556</span> 908 </div> 909 </a> 910 </div> 911 </div> 912 913 914 <div class="empty-message js-empty-message"> 915 <h3 class="header2 empty-title">No result found</h3> 916 </div> 917 </div> 918</div> 919</section> 920<section id="section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5" class="solid-section is-font-color-dark is-background-color-light" data-el-id="19e4a145-7cee-4338-8873-657ce2636b4c"> 921 922<div class="newsletter-signup lp-vertical-paddings redesign"> 923 <div class="lp-container-custom"> 924 <form data-type="contact-form" class="newsletter-signup__form"> 925 <div class="newsletter-signup__form-container"> 926 <div class="lp-title-group"> 927 928 <div class="lp-text--subtitle">connect with us</div> 929 </div> 930 <div class="newsletter-signup-form"> 931 <div class="newsletter-signup__inputs-container"> 932 <input id="section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5__newsSignFirstName" type="text" name="name" class="lp-input lp-input--light newsletter-signup__form-item" required placeholder="Name"> 933 934 <input id="section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5__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-]+)+"> 935 936 <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> 937 938 <div class="lp-h-pot"> 939 <input id="section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5__newsSignMiddleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 940 </div> 941 942 <input style="display: none;" type="text" name="source" value="NEWSLETTER_SIGNUP" /> 943 </div> 944 </div> 945 <div class="lp-disclaimer"> <label style='display: none;' for='section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5-termsAccepted'>Opt In/Disclaimer Consent:</label> 946 <label class='lp-tcr-content'> 947 <span class='lp-tcr-checkbox'> 948 <input 949 type='checkbox' 950 id='section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5-termsAccepted' 951 name='termsAccepted' 952 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 953 oninput="this.setCustomValidity('')" 954 required 955 /></span> 956 <span class='lp-tcr-message'> 957 958 I agree to be contacted by 959 Hedge Realty 960 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 961 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 962 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 963 </span> 964 </label> 965 966</div> 967 </div> 968 <div class="success-block"> 969 <div class="lp-title-group"> 970 <h2 class="lp-h2">Thank You</h2> 971 <div class="lp-text--subtitle"><p>You have successfully been added to our Newsletter. Stay tuned for the latest updates sent straight to your inbox!</p></div> 972 </div> 973 </div> 974 </form> 975 976 </div> 977</div> 978</section> 979<section id="section-90b955a0-1aef-435e-aa96-59c408339909" class="solid-section is-font-color-light is-background-color-dark" data-el-id="a261202b-cc2b-4a7e-912a-a4b8ffe6ab1b"> 980<div class="redesign custom-content lp-vertical-paddings"> 981 <div class="lp-container lp-container--l"> 982 <h3 style="text-align: center;">Contact Broker-of-Record</h3> 983<p style="text-align: center;">Hillary Saunders<br />Corporate License No. 02014153<br /><span style="text-decoration: underline;
983 color: #ffffff;"><a style="color: #ffffff; text-decoration: underline;" href="/cdn-cgi/l/email-protection#365e5f5a57444f765559584257554275775444595d53441855595b" rel="noopener" data-aura-rendered-by="17573:0"><span class="__cf_email__" data-cfemail="1b7372777a69625b7874756f7a786f585a796974707e6935787476">[email protected]</span></a></span></p> 984 </div> 985</div> 986</section> 987 988 <div id="modals" class="modals"></div> 989 <footer id="global-footer" class="is-font-color-dark is-background-color-light" data-el-id="874a9373-949d-4275-b72f-04c2a6ec373b"> 990 <div class="footer redesign no_icon no_newsletter no-names"> 991 <div class="container"> 992 <div class="info-wrap"> 993 <div class="info-wrap-contact agent_box"> 994 <div class="info-wrap-contact_zone type_user"> 995 996 <div class="info-wrap-contact_cell"> 997 <p class="contact_title">Email</p> 998 <a href="/cdn-cgi/l/email-protection#b9d0d7dfd6f9d1dcdddedccbdcd8d5cdc097dad6d4" class="lp-link info-wrap-contact_link grey-text "><span class="__cf_email__" data-cfemail="452c2b232a052d2021222037202429313c6b262a28">[email protected]</span></a> 999 </div> 1000 <div class="info-wrap-contact_cell"> 1001 <p class="contact_title">Phone Number</p> 1002 <a href="tel:7075598990" class="lp-link info-wrap-contact_link grey-text ">(707) 559-8990</a> 1003 </div> 1004 </div> 1005 <div class="info-wrap-contact_zone"> 1006 <div class="info-wrap-contact_cell"> 1007 <p class="info-wrap-contact_title">Address</p> 1008 <p class="info-wrap-contact_link grey-text"><p>103 H Street, Suite B Petaluma, CA 94952<br /><br />DRE# 02014153</p></p> 1009 </div> 1010 </div> 1011 </div> 1012 </div> 1013 <div class="text_footer first_text_footer"> 1014 <div class="images_box"> 1015 <div class="img_size"> 1016 <img src="https://media-production.lp-cdn.com/media/ddf381fb-3038-4fa6-8d2a-02980157d37b" alt="Footer Image"> 1017 </div> 1018 </div> 1019 <div class="luxury-text"> 1020 <div id="io64" class="gjs-row"> 1021<div id="isxs" class="gjs-cell"> 1022<div id="ib2f" class="gjs-row"> 1023<div id="ikca" class="gjs-cell"> 1024<div id="id5t"> 1025<div id="i0tby">Hedge Realty is a real estate company affiliated with Side, Inc. Side, Inc is a licensed real estate broker licensed by the state of California and abides by equal housing opportunity laws. All material presented herein is intended for informational purposes only. Information is compiled from sources deemed reliable but is subject to errors, omissions, changes in price, condition, sale, or withdrawal without notice. No statement is made as to the accuracy of any description. All measurements and square footages are approximate. This is not intended to solicit property already listed. Nothing herein shall be construed as legal, accounting or other professional advice outside the realm of real estate brokerage. <br><img id="ihmcj" src="https://media-production.lp-cdn.com/media/d862a8fd-7950-4cd6-9e84-34f9c0a35133" width="100px;"><br><br> 1026<p id="isxkl">Hedge Realty | CA DRE# 02014153</p> 1027</div> 1028</div> 1029</div> 1030</div> 1031<div id="it0l" class="gjs-row"></div> 1032</div> 1033</div> 1034<style>* { box-sizing: border-box; } body {margin: 0;}ul{list-style:inherit;}.gjs-row{display:flex;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;padding-top:10px;padding-right:10px;padding-bottom:10px;padding-left:10px;}.gjs-cell{min-height:75px;flex-grow:1;flex-basis:100%;}#io64{padding:0 0 0 0;}#it0l{padding:0 0 0 0;}#i0tby{font-size:12px;}#ihmcj{margin-top:20px;filter:invert();}#isxkl{font-size:14px;font-weight:700;}@media (max-width: 768px){.gjs-row{flex-wrap:wrap;}}</style> 1035 </div> 1036 </div> 1037 <div class="text_footer second_text_footer"> 1038 <div class="text_content_wrap"> 1039 <div> 1040 All information is deemed reliable but not guaranteed and should be independently reviewed and verified. 1041 </div> 1042 <div> 1043 <div> </div> 1044<style>* { box-sizing: border-box; } body {margin: 0;}ul{list-style:inherit;}</style> 1045 </div> 1046 </div> 1047 </div> 1048 <div class="info-privacy"> 1049 <div class="form-row info-privacy__row"> 1050 1051 <div class="form-col form-col--powered powered-box"> 1052 <div class="powered_zone"> 1053 Powered by <a href="https://www.luxurypresence.com/" target="_blank" class="lp-link grey-text luxury-link underlined ">Luxury Presence</a> 1054 </div> 1055 </div> 1056 1057 <div class="form-col form-col--copyright"> 1058 <div class="copy_zone">
1059 <span class="copy_words">Copyright ©</span> <span class="auto-year-update">2026</span> 1060 | <a href="/terms-and-conditions" class="lp-link grey-text ">Privacy Policy</a> 1061 1062 </div> 1063 </div> 1064 1065 <div class="form-col form-col--socials"> 1066 <ul class="lp-socials social_icons-style-1 socials socials--grey socials_zone"> 1067 1068 <li> 1069 <a 1070 href="https://www.instagram.com/hedgerealty/" 1071 class="lp-socials__link socials__item socials__link wow fadeInUp" 1072 data-wow-delay="0s" 1073 target="_blank" 1074 aria-label="INSTAGRAM" 1075 > 1076 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 1077 </a> 1078 </li> 1079 <li> 1080 <a 1081 href="https://www.linkedin.com/in/alexa-glockner-34a2b1b/" 1082 class="lp-socials__link socials__item socials__link wow fadeInUp" 1083 data-wow-delay="0.1s" 1084 target="_blank" 1085 aria-label="LINKEDIN" 1086 > 1087 <span class="lp-i lp-i--linkedin" aria-hidden="true"></span> 1088 </a> 1089 </li> 1090 </ul> </div> 1091 </div> 1092 </div> 1093 </div> 1094</div> 1095 1096 </footer> 1097 1098 <div id="modal-global-contact-us" class="modal " 1099 data-el-id="" 1100 style="background-color: ;" 1101 > 1102 <div class="modal-content"> 1103 <div class="contact-form redesign " style="background-image: url('https://media-production.lp-cdn.com/media/9af8c31c-523c-4608-ad51-f568b3756d18')"> 1104 <div class="container"> 1105 <div class="section-details" style="--colorTxt: #ffffff"> 1106 <h2>Contact Details</h2> 1107 1108 <div class="info-zone"> 1109 1110 <div class="info-zone_contact type_user"> 1111 <h4 class="serif">Hedge Realty</h4> 1112 <div class="info-zone_contact_cell"> 1113 <i> 1114 <svg width="30" height="25" viewBox="0 0 30 25" fill="none" xmlns="http://www.w3.org/2000/svg"> 1115 <path fill-rule="evenodd" clip-rule="evenodd" d="M10.7964 8.1207H19.2036V8.7279C19.2036 10.8195 20.9082 12.5259 23.001 12.5259H24.741L25.2852 20.7051C25.3776 22.1235 24.2868 23.2719 22.8822 23.2719H7.0032C5.5944 23.2719 4.5084 22.1085 4.6002 20.7039C4.782 17.9895 4.9152 15.2313 5.154 12.5265H6.9996C9.0918 12.5265 10.797 10.8207 10.797 8.7285V8.1207H10.7964ZM11.46 16.5807C11.46 14.6565 13.0188 13.0977 14.943 13.0977C16.8666 13.0977 18.4254 14.6571 18.4254 16.5807C18.4254 18.5055 16.8678 20.0631 14.943 20.0631C13.02 20.0637 11.46 18.5043 11.46 16.5807ZM14.943 12.0381C12.4344 12.0381 10.4004 14.0721 10.4004 16.5807C10.4004 19.0887 12.435 21.1233 14.943 21.1233C17.4486 21.1233 19.485 19.0869 19.485 16.5807C19.485 14.0727 17.451 12.0381 14.943 12.0381ZM9.0846 4.8363C8.22 4.8363 7.512 5.5443 7.512 6.4089V8.7285C7.512 9.0093 7.2804 9.2415 6.999 9.2415H1.5726C1.2906 9.2415 1.0596 9.0111 1.0596 8.7285V6.9285C1.0596 6.4797 1.1628 6.0945 1.3902 5.7069C1.896 4.8465 2.7294 4.1013 3.795 3.4749C9.279 0.2517 20.7192 0.2523 26.2044 3.4749C27.2706 4.1013 28.104 4.8465 28.6098 5.7069C28.8354 6.0921 28.9398 6.4815 28.9398 6.9285V8.7285C28.9398 9.0111 28.71 9.2415 28.4268 9.2415H23.0004C22.719 9.2415 22.4874 9.0093 22.4874 8.7285V6.4089C22.4874 5.5425 21.7806 4.8363 20.9148 4.8363H9.0846ZM8.571 6.4089C8.571 6.1263 8.8026 5.8965 9.0846 5.8965H20.9154C21.1968 5.8965 21.429 6.1275 21.429 6.4089V8.7285C21.429 9.5943 22.1352 10.3017 23.001 10.3017H28.4274C29.292 10.3017 30 9.5931 30 8.7285V6.9285C30 6.2835 29.8464 5.7291 29.5206 5.1729C28.9188 4.1493 27.9564 3.2799 26.7384 2.5641C20.9214 -0.8547 9.0798 -0.8547 3.2622 2.5641C2.0436 3.2799 1.0812 4.1487 0.48 5.1729C0.153 5.7291 0 6.2835 0 6.9279V8.7279C0 9.5925 0.7092 10.3011 1.5726 10.3011H6.999C7.8648 10.3011 8.571 9.5937 8.571 8.7279V6.4089ZM9.7368 7.5915V8.7285C9.7368 10.2387 8.5092 11.4669 6.999 11.4669H4.6686C4.3914 11.4669 4.164 11.6799 4.1412 11.9511C3.8892 14.8347 3.7386 17.7435 3.5448 20.6331C3.4116 22.6425 4.989 24.3315 7.0032 24.3315H22.8822C24.882 24.3315 26.475 22.6575 26.3406 20.6343L25.7622 11.9607C25.7436 11.6811 25.5102 11.4675 25.2342 11.4675L23.001 11.4663C21.4902 11.4663 20.2632 10.2375 20.2632 8.7279V7.5909C20.2632 7.2981 20.0262 7.0611 19.7334 7.0611H10.2666C9.9738 7.0611 9.7368 7.2987 9.7368 7.5915Z" fill="#1A1A1A"/> 1116 </svg> 1117 </i> 1118 <p class="contact_title">Phone</p> 1119 <a href="tel:(707) 559-8990" class="lp-link info-zone_contact_link link hyperlink-style-2">(707) 559-8990</a> 1120 </div> 1121 <div class="info-zone_contact_cell"> 1122 <i> 1123 <svg width="30" height="19" viewBox="0 0 30 19" fill="none" xmlns="http://www.w3.org/2000/svg"> 1124 <path d="M2 0C0.903517 0 0 0.903517 0 2V16.6667C0 17.7631 0.903517 18.6667 2 18.6667H28C29.0965 18.6667 30 17.7631 30 16.6667V2C30 0.903517 29.0965 0 28 0H2ZM2.4375 1.33333H27.5625L15.6458 11.4896C15.3389 11.7512 14.6612 11.7512 14.3542 11.4896L2.4375 1.33333ZM1.33333 2.13542L10.1979 9.6979L1.33333 16.5729V2.13542ZM28.6667 2.13542V16.5729L19.8021 9.6979L28.6667 2.13542ZM11.2396 10.5833L13.4896 12.5C14.3543 13.2369 15.6457 13.2369 16.5104 12.5L18.7604 10.5833L27.4687 17.3333H2.53125L11.2396 10.5833Z" fill="#1A1A1A"/> 1125 </svg> 1126 </i> 1127 <p class="contact_title">Email</p> 1128 <a href="/cdn-cgi/l/email-protection#ddb4b3bbb29db5b8b9bab8afb8bcb1a9a4f3beb2b0" class="lp-link info-zone_contact_link link hyperlink-style-2"><span class="__cf_email__" data-cfemail="11787f777e5179747576746374707d65683f727e7c">[email protected]</span></a> 1129 </div> 1130 </div> 1131 <div class="info-zone_contact"> 1132 <div class="info-zone_contact_cell"> 1133 <i> 1134 <svg width="31" height="30" viewBox="0 0 31 30" fill="none" xmlns="http://www.w3.org/2000/svg"> 1135 <path d="M29.9821 6.49489C29.7931 6.35756 29.679 6.32046 29.4572 6.39228L20.298 9.41368L16.1952 8.03558L15.8172 9.41525L19.7644 10.7038V28.1462L9.89831 25.7069V22.1034H8.71438V25.7515L1.21616 28.2532V15.3945H0.0322266V29.2729C0.0322266 29.5077 0.130098 29.7279 0.321106 29.8645C0.445418 29.9541 0.585911 29.9999 0.735086 29.9999C0.814804 29.9999 0.890971 29.9868 0.967926 29.96L9.48433 27.029L20.1792 29.7887C20.3224 29.8254 20.4751 29.8171 20.6152 29.7654L29.8104 26.2235C30.0942 26.1177 3
11350.0251 25.8466 30.0251 25.5431V7.08291C30.0251 6.85086 30.17 6.63144 29.9821 6.49489ZM28.8412 25.0388L20.9483 28.0361V10.7065L28.8412 8.08649V25.0388Z" fill="#1A1A1A"/> 1136 <path d="M6.57515 19.1142C6.6671 19.422 6.95006 19.6323 7.2713 19.6323C7.59215 19.6323 7.87511 19.422 7.96746 19.1142C8.67742 16.7514 10.0393 15.2447 11.3559 13.788C12.9944 11.9747 14.5422 10.2615 14.5422 7.2717C14.5422 3.39788 11.1451 0 7.2713 0C3.39827 0 0 3.39748 0 7.2717C0 10.2615 1.54819 11.9747 3.18674 13.788C4.50328 15.2447 5.86479 16.7514 6.57515 19.1142ZM7.2713 1.45426C10.316 1.45426 13.0883 4.22663 13.0883 7.2717C13.0883 9.70191 11.7852 11.1435 10.2769 12.8121C9.2461 13.9534 8.10992 15.2096 7.2713 16.9199C6.43229 15.2096 5.29651 13.953 4.2657 12.8121C2.75698 11.1432 1.45426 9.70191 1.45426 7.2717C1.45426 4.22663 4.22663 1.45426 7.2713 1.45426Z" fill="#1A1A1A"/> 1137 <path d="M7.26193 10.1616C8.8705 10.1616 10.1795 8.86084 10.1795 7.26175C10.1795 5.66305 8.87089 4.3623 7.26193 4.3623C5.65297 4.3623 4.34473 5.66305 4.34473 7.26175C4.34512 8.86084 5.65336 10.1616 7.26193 10.1616ZM7.26193 5.81657C8.06898 5.81657 8.72527 6.46536 8.72527 7.26175C8.72527 8.05932 8.06898 8.70733 7.26193 8.70733C6.45528 8.70733 5.79899 8.05893 5.79899 7.26175C5.79899 6.46536 6.45528 5.81657 7.26193 5.81657Z" fill="#1A1A1A"/> 1138 </svg> 1139 </i> 1140 <p class="info-wrap-contact_title">Address</p> 1141 <p class="info-zone_contact_link pre-line">103 H Street, Suite B 1142 Petaluma, CA</p> 1143 </div> 1144 </div> 1145 <div class="info-zone_contact"> 1146 <div class="info-zone_contact_cell"> 1147 <p class="pre-line"><div></div><div id="i3fy"><p id="itkx"></p></div><style>* { box-sizing: border-box; } body {margin: 0;}ul{list-style:inherit;}#itkx{font-weight:700;}</style></p> 1148 </div> 1149 </div> 1150 <ul class="lp-socials social_icons-style-2 socials socials--grey socials_zone footer__contact-column"> 1151 1152 <li> 1153 <a 1154 href="https://www.instagram.com/hedgerealty/" 1155 class="lp-socials__link socials__item wow fadeInUp socials__link" 1156 data-wow-delay="0s" 1157 target="_blank" 1158 aria-label="INSTAGRAM" 1159 > 1160 <span class="lp-i lp-i--instagram" aria-hidden="true"></span> 1161 </a> 1162 </li> 1163 <li> 1164 <a 1165 href="https://www.linkedin.com/in/alexa-glockner-34a2b1b/" 1166 class="lp-socials__link socials__item wow fadeInUp socials__link" 1167 data-wow-delay="0.1s" 1168 target="_blank" 1169 aria-label="LINKEDIN" 1170 > 1171 <span class="lp-i lp-i--linkedin" aria-hidden="true"></span> 1172 </a> 1173 </li> 1174 </ul> </div> 1175 </div> 1176 <div class="section-message"> 1177 <form data-type="contact-form"> 1178 <h2>Submit a Message</h2> 1179 <div class="h-pot"> 1180 <label for="-middleName">Middle Name</label> 1181 <input id="-middleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 1182 </div> 1183 1184
1185 <div class="lp-input-group"> 1186 <label for="prod-name" class="lp-label">Name</label> 1187 <input id="prod-name" name="name" value="" required="" class="lp-input lp-input--light"> 1188 </div> 1189 <div class="lp-input-group"> 1190 <label for="prod-email" class="lp-label">Email</label> 1191 <input id="prod-email" type="email" name="email" value="" required="" class="lp-input lp-input--light"> 1192 </div> 1193 <div class="lp-input-group"> 1194 <label for="prod-phone" class="lp-label">Phone</label> 1195 <input id="prod-phone" type="tel" name="phoneNumber" value="" required="" class="lp-input lp-input--light"> 1196 </div> 1197 <div class="lp-input-group m16"> 1198 <label for="prod-message" class="lp-label">Message</label> 1199 <textarea id="prod-message" name="message" value="" required="" class="lp-input"></textarea> 1200 </div> 1201 1202 <div class="lp-disclaimer"> <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label> 1203 <label class='lp-tcr-content'> 1204 <span class='lp-tcr-checkbox'> 1205 <input 1206 type='checkbox' 1207 id='-termsAccepted' 1208 name='termsAccepted' 1209 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 1210 oninput="this.setCustomValidity('')" 1211 required 1212 /></span> 1213 <span class='lp-tcr-message'> 1214 1215 I agree to be contacted by 1216 Hedge Realty 1217 via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 1218 You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. 1219 <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>. 1220 </span> 1221 </label> 1222 1223 </div> 1224 1225 <input style="display: none;" type="text" name="source" value="CONTACT_INQUIRY" /> 1226 1227 1228 <button type="submit" class="submitButton lp-btn button-style-1"> 1229 <span class="label-initial">Submit</span> 1230 <span class="label-loading">Submitting</span> 1231 <span class="label-success">Submitted</span> 1232 <span class="submit-icon lp-i lp-i--circle-notch lp-i--spin"></span> 1233 </button> 1234 <p class="success-message success hide"> 1235 Message sent successfully! 1236 </p> 1237 </form> 1238 1239 1240 </div> 1241 </div> 1242 </div> 1243 1244 </div> 1245 <button class="close lp-close" type="button" aria-label="close modal"> 1246 <span class="lp-close-icon" aria-hidden="true"></span> 1247 </button> 1248 </div> <div id="modal-global-subscribe" class="modal " 1249 data-el-id="" 1250 style="background-color: ;" 1251 > 1252 <div class="modal-content"> 1253 <div class="subscribe-modal"> 1254 <div class="title"> 1255 Subscribe to receive exclusive news & updates 1256 </div> 1257 <div class="form-input"> 1258 <form id="submitModalForm" data-type="contact-form" action="" method="post"> 1259 <div class="h-pot"> 1260 <label for="-middleName">Middle Name</label> 1261 <input id="-middleName" name="middleName" value="" autocomplete="off" tabindex="-1"> 1262 </div> 1263 <input type="hidden" name="companyId" value=""> 1264 <input type="email" name="email" placeholder="Enter Email Address"> 1265 <input type="submit" value="Submit" class=""> 1266 </form> 1267 </div> 1268 </div> 1269 </div> 1270 <button class="close lp-close" type="button" aria-label="close modal">
1271 <span class="lp-close-icon" aria-hidden="true"></span> 1272 </button> 1273 </div> 1274 <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;"> 1275 <style> 1276 #qualifying-questions-modal .custom-select-toggle { 1277 border: 1px solid #848484; 1278 border-radius: 8px; 1279 padding: 12px 16px; 1280 } 1281 1282 #qualifying-questions-modal .custom-select-toggle.is-placeholder { 1283 color: #848484; 1284 } 1285 1286 #qualifying-questions-modal #qualifying-questions-modal-phoneNumber::placeholder { 1287 color: #848484; 1288 opacity: 1; 1289 } 1290 1291 #qualifying-questions-modal .disclaimer-more { 1292 display: none; 1293 } 1294 1295 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-more { 1296 display: inline; 1297 } 1298 1299 #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-ellipsis { 1300 display: none; 1301 } 1302 </style>
vendor: 119 bytes, lines 1302-1303
1302 1303 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1303<script> 1304 function toggleDisclaimerQualifyingQuestionsModal() { 1305 const disclaimerText = document.getElementById('qualifying-questions-modal-disclaimer-text'); 1306 const toggleButton = document.getElementById('qualifying-questions-modal-toggle-disclaimer'); 1307 1308 if (disclaimerText.classList.contains('collapsed')) { 1309 disclaimerText.classList.remove('collapsed'); 1310 toggleButton.textContent = 'Read less'; 1311 toggleButton.setAttribute('aria-expanded', 'true'); 1312 } else { 1313 disclaimerText.classList.add('collapsed'); 1314 toggleButton.textContent = 'Read more'; 1315 toggleButton.setAttribute('aria-expanded', 'false'); 1316 } 1317 } 1318 </script>
1318 1319 <div style="max-width: 400px; width: 95%; margin: 0 auto;"> 1320 <div style="background: #fff; border: none; border-radius: 16px; color: black; box-shadow: none; position: relative;"> 1321 <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;"> 1322 <span aria-hidden="true">×</span> 1323 </button> 1324 <div style="padding: 40px 30px 32px;"> 1325 <div style="text-align: left; margin-bottom: 32px;"> 1326 <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;"> 1327 Thanks, please provide more information to help serve you 1328 </h2> 1329 </div> 1330 <form id="qualifying-questions-modal-form" data-type="contact-form"> 1331 <input type="hidden" name="source" value="PROFILE_UPDATE" /> 1332 <input type="hidden" name="email" value="" id="qualifying-questions-modal-email" /> 1333 <input type="hidden" name="triggerSource" id="qualifying-questions-modal-triggerSource" value="" /> 1334 <label for="qualifying-questions-modal-email" style="display:none;"> 1335 Email 1336 </label> 1337 <label for="qualifying-questions-modal-triggerSource" style="display:none;"> 1338 Trigger Source 1339 </label> 1340 1341 <div style="margin-bottom: 20px;"> 1342 <label for="qualifying-questions-modal-phoneNumber" style="display:none;"> 1343 Phone Number 1344 </label> 1345 <input 1346 type="tel" 1347 id="qualifying-questions-modal-phoneNumber" 1348 name="phoneNumber" 1349 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;" 1350 pattern="^\+?1?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$" 1351 required 1352 placeholder="Phone" 1353 aria-label="Phone Number" 1354 inputmode="tel" 1355 autocomplete="tel" 1356 onfocus="this.style.borderColor='black';" 1357 onblur="this.style.borderColor='#848484';" 1358 /> 1359 </div> 1360 1361 <div style="margin-bottom: 20px;"> 1362 <label for="qualifying-questions-modal-interest" style="display:none;"> 1363 Interest 1364 </label> 1365 <select 1366 id="qualifying-questions-modal-interest" 1367 name="interest" 1368 required 1369 data-label="Interest" 1370 aria-label="Interest" 1371 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;" 1372 onfocus="this.style.borderColor='black'; this.style.color='black';" 1373 onblur="this.style.borderColor='#848484'; if(this.value === '') this.style.color='#848484'; else this.style.color='black';" 1374 > 1375 <option value="" style="background: #fff; color: #848484;" disabled selected>Interested in...</option> 1376 <option value="Selling & Buying" style="background: #fff; color: black;">Selling & Buying</option> 1377 <option value="Selling" style="background: #fff; color: black;">Selling</option> 1378 <option value="Buying" style="background: #fff; color: black;">Buying</option> 1379 <option value="Renting" style="background: #fff; color: black;">Renting</option> 1380 <option value="Other" style="background: #fff; color: black;">Other</option> 1381 </select> 1382 </div> 1383 1384 <div style="margin-bottom: 32px; font-size: 12px; line-height: 1.2;"> 1385 <label style='display: none;' for='qualifying-questions-modal-qualifying-questions-termsAccepted'>Opt In/Disclaimer Consent:</label> 1386 <label class='lp-tcr-content'>
1387 <span class='lp-tcr-checkbox'> 1388 <input 1389 type='checkbox' 1390 id='qualifying-questions-modal-qualifying-questions-termsAccepted' 1391 name='termsAccepted' 1392 aria-describedby='qualifying-questions-modal-disclaimer-text' 1393 oninvalid="this.setCustomValidity('Please accept the terms and conditions')" 1394 oninput="this.setCustomValidity('')" 1395 required 1396 /></span> 1397 <span class='lp-tcr-message'> 1398 <div id="qualifying-questions-modal-disclaimer-text" class="collapsed" style="color: #848484;"> 1399 1400 I agree to be contacted by 1401 <strong>Hedge Realty</strong> 1402 via call, email, and text <span class="disclaimer-more">for real estate services. 1403 To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 1404 You can also click the unsubscribe link in the emails. 1405 Message and data rates may apply. Message frequency may vary.</span> 1406 <span class="disclaimer-ellipsis">...</span> 1407 <a href='/terms-and-conditions' target='_blank' rel='noopener noreferrer' style='text-decoration: underline;'>Privacy Policy</a>. 1408 </div> 1409 <button 1410 id="qualifying-questions-modal-toggle-disclaimer" 1411 type="button" 1412 style="background: none; border: none; color: #848484; font-size: inherit; font-weight: bold; padding: 0; margin-top: 4px; cursor: pointer;" 1413 aria-expanded="false" 1414 onclick="toggleDisclaimerQualifyingQuestionsModal()" 1415 > 1416 Read more 1417 </button> 1418 </span> 1419 </label> 1420 </div> 1421 1422 <div> 1423 <button 1424 type="submit" 1425 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;" 1426 onmouseover="this.style.background='transparent'; this.style.color='black';" 1427 onmouseout="this.style.background='black'; this.style.color='white';" 1428 > 1429 Submit 1430 </button> 1431 </div> 1432 </form> 1433 </div> 1434 </div> 1435 </div> 1436 </div> 1437 1438
1438<script> 1439 (function() { 1440 var lazyVideos = [].slice.call(document.querySelectorAll("video.lazy")); 1441 1442 if ("IntersectionObserver" in window && lazyVideos.length > 0) { 1443 var lazyVideoObserver = new IntersectionObserver(function(entries, observer) { 1444 entries.forEach(function(video) { 1445 if (video.isIntersecting) { 1446 for (var source in video.target.children) { 1447 var videoSource = video.target.children[source]; 1448 if (typeof videoSource.tagName === "string" && videoSource.tagName === "SOURCE") { 1449 videoSource.src = videoSource.dataset.src; 1450 } 1451 } 1452 1453 video.target.load(); 1454 video.target.classList.remove("lazy"); 1455 lazyVideoObserver.unobserve(video.target); 1456 } 1457 }); 1458 }); 1459 1460 lazyVideos.forEach(function(lazyVideo) { 1461 lazyVideoObserver.observe(lazyVideo); 1462 }); 1463 } 1464 })(); 1465 </script>
1465 1466 1467 <!-- Global site tag (gtag.js) - Google Analytics --> 1468
1468<script defer src="https://www.googletagmanager.com/gtag/js"></script>
1468 1469 1470 <!-- Google Tag Manager --> 1471
1471<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1472 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1473 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src= 1474 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1475 })(window,document,'script','dataLayer','GTM-TTW62GG');</script>
1475 1476 <!-- End Google Tag Manager --> 1477 <!-- Google Tag Manager --> 1478
1478<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1479 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1480 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src= 1481 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1482 })(window,document,'script','dataLayer','GTM-T9SFQGHZ');</script>
1482 1483 <!-- End Google Tag Manager --> 1484 1485 1486 <!-- LP Tracker (divolte.js) - LP Divolte --> 1487
1487<script>window.divolteLp=window.divolteLp||function(){(divolteLp.q=divolteLp.q||[]).push(arguments)}</script>
1487 1488 <!-- LP Tracker (eventBus) - LP EventBus --> 1489
1489<script>window.eventBusLp=window.eventBusLp||function(){(eventBusLp.q=eventBusLp.q||[]).push(arguments)}</script>
1489 1490 1491
1491<script> 1492 window.dataLayer = window.dataLayer || []; 1493 document.sendGoogleTagManagerEvent = function() { 1494 /* Honor GPC-enabled browsers and prevent GTM event if GPC is enabled. More details: https://global-privacy-control.glitch.me/ */ 1495 if (window.navigator.globalPrivacyControl) { 1496 return; 1497 } 1498 1499 dataLayer.push(arguments); 1500 } 1501 1502 document.sendGoogleTagManagerEvent('js', new Date()); 1503 document.sendGoogleTagManagerEvent('config', 'UA-135886338-1', { page: location.pathname, location: location.href }); 1504 document.sendGoogleTagManagerEvent('config', 'G-9B8NV96J8S', { page: location.pathname, location: location.href }); 1505 document.sendGoogleTagManagerEvent('config', 'G-HPY9EXT6DM', { page: location.pathname, location: location.href }); 1506 document.sendGoogleAnalyticsEvent = function(googleEvent) { 1507 document.sendGoogleTagManagerEvent('event', googleEvent.eventAction || googleEvent.hitType, { 1508 event_category: googleEvent.eventCategory, 1509 event_label: googleEvent.eventLabel, 1510 value: googleEvent.eventValue, 1511 page: googleEvent.page, 1512 location: googleEvent.location 1513 }) 1514 }; 1515 1516 document.addEventListener("DOMContentLoaded", function() { 1517 (function() { 1518 //If the page has an element with ID of auto-year-update the element will be populated with the current year. 1519 var date = new Date(); 1520 var elements = document.getElementsByClassName('auto-year-update'); 1521 var i; 1522 for (i = 0; i < elements.length; i++) { 1523 elements[i].innerText = date.getFullYear(); 1524 } 1525 })(); 1526 if (window.divolteLp) { 1527 window.divolteLp('sendLpPageView', {}); 1528 } 1529 if (window.eventBusLp) { 1530 window.eventBusLp('sendLpPageView', {}); 1531 } 1532 }); 1533 </script>
1533 1534 1535 <!-- Facebook Pixel Code --> 1536
1536<script type="text/plain" data-consent-category="advertising">
vendor: 575 bytes, lines 1536-1545
1536 1537 !function(f,b,e,v,n,t,s) 1538 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 1539 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 1540 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 1541 n.queue=[];t=b.createElement(e);t.async=!0; 1542 t.src=v;s=b.getElementsByTagName(e)[0]; 1543 s.parentNode.insertBefore(t,s)}(window, document,'script', 1544 'https://connect.facebook.net/en_US/fbevents.js'); 1545 fbq('init', '
1545771609776960552
vendor: 58 bytes, lines 1545-1547
1545'); 1546 fbq('track', 'PageView'); 1547
1547</script>
1547 1548 <noscript><img height="1" width="1" style="display:none" 1549 src="https://www.facebook.com/tr?id=771609776960552&ev=PageView&noscript=1" 1550 /></noscript> 1551 <!-- End Facebook Pixel Code --> 1552 1553
1553<script> 1554 // Function to dynamically load a script 1555 function loadScript(url, callback) { 1556 var script = document.createElement('script'); 1557 script.type = 'text/javascript'; 1558 script.src = url; 1559 script.defer = true; 1560 script.async = true; 1561 script.onload = callback; 1562 document.head.appendChild(script); 1563 } 1564 1565 // Function to dynamically load CSS file 1566 function loadCSS(url) { 1567 var link = document.createElement("link"); 1568 link.rel = "stylesheet"; 1569 link.href = url; 1570 document.head.appendChild(link); 1571 } 1572 1573 // Global methods / variables that can be accessed by element js 1574 window.luxuryPresence = { 1575 libs: { 1576 loadJs: loadScript, 1577 loadCss: loadCSS, 1578 jsLibsMap: { 1579 paroller: { 1580 jsSrc: 'https://d1e1jt2fj4r8r.cloudfront.net/javascript/jquery.paroller.min.js', 1581 isLoaded: false, 1582 }, 1583 ionRangeSlider: { 1584 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js', 1585 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css', 1586 isLoaded: false, 1587 requires: ['jquery'], 1588 }, 1589 splide: { 1590 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/js/splide.min.js', 1591 cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/css/splide-core.min.css', 1592 isLoaded: false, 1593 }, 1594 wow: { 1595 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js', 1596 isLoaded: false, 1597 }, 1598 jquery: { 1599 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js', 1600 isLoaded: false, 1601 }, 1602 slick: { 1603 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js', 1604 isLoaded: false, 1605 requires: ['jquery'], 1606 }, 1607 libphonenumber: { 1608 jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/libphonenumber-js/1.11.8/libphonenumber-js.min.js', 1609 isLoaded: false, 1610 }, 1611 }, 1612 }, 1613 }; 1614 </script>
1614 1615
1615<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>
1615 1616
1616<script defer src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.8/handlebars.min.js"></script>
1616 1617
1617<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/handlebars-intl.min.js"></script>
1617 1618
1618<script defer src="https://cdnjs.cloudflare.com/ajax/libs/superagent/4.1.0/superagent.min.js"></script>
1618 1619
1619<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>
1619 1620
1620<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>
1620 1621
1621<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>
1621 1622 1623 <!-- GOOGLE TRANSLATE SCRIPT --> 1624
1624<script> 1625 function googleTranslateElementInit() { 1626 // list of languages can be overridden by setting window.customLanguages in the head JS. example `window.customLanguages = 'en,de,fr,ro,sk,pl'` 1627 // Language codes can be taken from here https://cloud.google.com/translate/docs/languages 1628 const DEFAULT_LANGUAGES = 'en,es,zh-CN,zh-TW,tl,vi,ar,ko,ru,de,fr,hi,pt'; 1629 document.querySelectorAll('[data-type="TRANSLATE"]').forEach(function(translate){ 1630 translate.innerText = ''; 1631 new google.translate.TranslateElement({ 1632 pageLanguage: 'en', 1633 layout: google.translate.TranslateElement.InlineLayout.SIMPLE, 1634 includedLanguages: window.customLanguages || DEFAULT_LANGUAGES, 1635 }, translate); 1636 }); 1637 } 1638 </script>
1638 1639
1639<script defer src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
1639 1640 1641 <!-- GOOGLE TRANSLATE SCRIPT END--> 1642
1642<script> 1643 1644 // UI helpers 1645 (function () { 1646 1647 function getSideMenu () { 1648 return document.querySelector('body > div.sidemenu'); 1649 } 1650 1651 function sideMenuHide (instant) { 1652 var sideMenu = getSideMenu(); 1653 if (!sideMenu || !sideMenu.classList.contains('visible')) { 1654 return; 1655 } 1656 sideMenu.classList.remove('visible'); 1657 sideMenu.dispatchEvent(new CustomEvent('lpui-hide', { detail: { instant: !!instant } })); 1658 window.dispatchEvent(new CustomEvent('lpui-sidemenu-hide', { detail: {instant: !!instant} })); 1659 } 1660 1661 function sideMenuShow () { 1662 var sideMenu = getSideMenu(); 1663 if (!sideMenu || sideMenu.classList.contains('visible')) { 1664 return; 1665 } 1666 sideMenu.classList.add('visible'); 1667 sideMenu.dispatchEvent(new Event('lpui-show')); 1668 window.dispatchEvent(new Event('lpui-sidemenu-show')); 1669 } 1670 1671 function sideMenuToggle () { 1672 var sideMenu = getSideMenu(); 1673 if (!sideMenu) { 1674 return; 1675 } 1676 var isSideMenuVisible = sideMenu.classList.contains('visible'); 1677 if (isSideMenuVisible) { 1678 sideMenuHide(); 1679 } else { 1680 sideMenuShow(); 1681 } 1682 } 1683 1684 var scrollLockRequests = {}; 1685 window.__debug_scrollLockRequests = scrollLockRequests; 1686 var hideScrollStyles = ''+ 1687 'body {'+ 1688 'overflow: hidden;' + 1689 '}'; 1690 var hideScrollId = 'hide-body-scroll-style'; 1691 1692 function scrollLock () { 1693 var style = document.createElement('style'); 1694 style.id = hideScrollId; 1695 style.textContent = hideScrollStyles; 1696 document.head.appendChild(style); 1697 window.dispatchEvent(new Event('lpui-scroll-locked')); 1698 } 1699 1700 function scrollUnlock () { 1701 document.getElementById(hideScrollId)?.remove(); 1702 window.dispatchEvent(new Event('lpui-scroll-unlocked')); 1703 } 1704 1705 function requestScrollLock (lockId) { 1706 var wasLocked = Object.keys(scrollLockRequests).length > 0; 1707 scrollLockRequests[lockId || '__anonymous_lock'] = true; 1708 if (!wasLocked) { 1709 scrollLock(); 1710 } 1711 } 1712 1713 function releaseScrollLock (lockId) { 1714 if (lockId) { 1715 delete scrollLockRequests[lockId]; 1716 if (!Object.keys(scrollLockRequests).length) { 1717 scrollUnlock(); 1718 } 1719 } else { 1720 scrollLockRequests = {}; 1721 window.__debug_scrollLockRequests = scrollLockRequests; 1722 scrollUnlock(); 1723 } 1724 } 1725 1726 function showModal (modalId, options) { 1727 var modal = document.getElementById(modalId); 1728 if (!modal) { 1729 return; 1730 } 1731 1732 if (!modal.classList.contains('visible')) { 1733 modal.classList.add('visible'); 1734 if (options && options.scrollLock) { 1735 window.lpUI.requestScrollLock(modalId); 1736 } 1737 modal.dispatchEvent(new Event('lpui-show')); 1738 window.dispatchEvent(new CustomEvent('lpui-modal-show', { detail: { id: modalId } })); 1739 } 1740 1741 const visibleModals = document.querySelectorAll('.modal.visible'); 1742 1743 if (visibleModals.length > 1) { 1744 1745 const maxZIndex = Array.from(visibleModals).reduce((maxZIndex, modal) => { 1746 const zIndex = window.getComputedStyle(modal).zIndex; 1747 const parsedZIndex = zIndex !== 'auto' ? parseInt(zIndex) : 0; 1748 return Math.max(maxZIndex, parsedZIndex); 1749 }, 0); 1750 1751 modal.style.zIndex = maxZIndex + 1; 1752 } 1753 1754 } 1755 1756 function _hideModal (modalEl) { 1757 if (!modalEl) { 1758 return; 1759 } 1760 if (!modalEl.classList.contains('visible')) { 1761 return; 1762 } 1763 modalEl.classList.remove('visible'); 1764 modalEl.style.zIndex = '';
1765 modalEl.dispatchEvent(new Event('lpui-hide')); 1766 var modalId = modalEl.getAttribute('id'); 1767 if (modalId) { 1768 window.lpUI.releaseScrollLock(modalId); 1769 window.dispatchEvent(new CustomEvent('lpui-modal-hide', { detail: { id: modalId } })); 1770 } 1771 } 1772 1773 function hideModal (modalId) { 1774 _hideModal(document.getElementById(modalId)); 1775 } 1776 1777 function hideClosestModal (el) { 1778 const modal = el?.closest('.modal'); 1779 if (!modal) { 1780 return; 1781 } 1782 if (modal.classList) { 1783 _hideModal(modal); 1784 return; 1785 } 1786 if (modal.length && modal[0].classList) { 1787 _hideModal(modal[0]); 1788 } 1789 } 1790 1791 window.lpUI = { 1792 sideMenuHide: sideMenuHide, 1793 sideMenuShow: sideMenuShow, 1794 sideMenuToggle: sideMenuToggle, 1795 requestScrollLock: requestScrollLock, 1796 releaseScrollLock: releaseScrollLock, 1797 showModal: showModal, 1798 hideModal: hideModal, 1799 hideClosestModal: hideClosestModal 1800 } 1801 })(); 1802 1803 var stringifyPrimitive = function(v) { 1804 switch (typeof v) { 1805 case 'string': 1806 return v; 1807 1808 case 'boolean': 1809 return v ? 'true' : 'false'; 1810 1811 case 'number': 1812 return isFinite(v) ? v : ''; 1813 1814 default: 1815 return ''; 1816 } 1817 }; 1818 1819 function objectToQuerystring(obj, sep, eq, name) { 1820 // https://github.com/Gozala/querystring/blob/master/encode.js 1821 sep = sep || '&'; 1822 eq = eq || '='; 1823 if (obj === null) { 1824 obj = undefined; 1825 } 1826 1827 if (typeof obj === 'object') { 1828 return Object.keys(obj).map(function(k) { 1829 var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; 1830 if (Array.isArray(obj[k])) { 1831 return obj[k].map(function(v) { 1832 return ks + encodeURIComponent(stringifyPrimitive(v)); 1833 }).join(sep); 1834 } else { 1835 return ks + encodeURIComponent(stringifyPrimitive(obj[k])); 1836 } 1837 }).filter(Boolean).join(sep); 1838 1839 } 1840 1841 if (!name) return ''; 1842 return encodeURIComponent(stringifyPrimitive(name)) + eq + 1843 encodeURIComponent(stringifyPrimitive(obj)); 1844 } 1845 1846 function getPath(url, options) { 1847 var parser = document.createElement('a'); 1848 parser.href = url || ''; 1849 var path = parser.pathname || ''; 1850 if (path[0] !== '/') { 1851 // IE does not return path starting with a slash 1852 path = '/' + path; 1853 } 1854 1855 if (options && options.queryString) { 1856 path += parser.search; 1857 } 1858 1859 return path; 1860 } 1861 1862 function getMLSAutocomplete(keyword) { 1863 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 1864 var query = { 1865 kind: 'listings', 1866 query: keyword 1867 }; 1868 1869 return superagent 1870 .get(searchURL) 1871 .query(query) 1872 .then(function(res) { 1873 var data = res.body || []; 1874 /* 1875 Of the format: 1876 [{ 1877 "_index": "listing_auto_completes_production_20190723232720775", 1878 "_type": "listing_auto_complete", 1879 "_id": "235875624", 1880 "_score": 0, 1881 "status_modified_at": 1553250708, 1882 "city": "Jupiter", 1883 "price": 1335743, 1884 "display_address": "10088 Calabrese Trail Unit: 9 Jupiter FL 33478", 1885 "sold_price": null, 1886 "id": 235875624, 1887 "state": "FL", 1888 "photo_urls": [ 1889 "http://cdn.photos.sparkplatform.com/fl/20190322153144208228000000-o.jpg" 1890 ], 1891 "status": "Pending" 1892 }, ...] 1893 */ 1894 1895 return data; 1896 }); 1897 } 1898 1899 function getMLSAutocompleteWithFilters(keyword, filters = {}) { 1900 var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete'; 1901 1902 return superagent 1903 .get(searchURL) 1904 .query({ kind: 'listings', query: keyword, ...filters }) 1905 .then(function(res) { 1906 /* 1907 Of the format: 1908 [{ 1909 "_index": "listing_auto_completes_production_20190723232720775", 1910 "_type": "listing_auto_complete", 1911 "_id": "235875624", 1912 "_score": 0, 1913 "status_modified_at": 1553250708, 1914 "city": "Jupiter", 1915 "price": 1335743, 1916 "display_address": "10088 Calabrese Trail Unit: 9 Jupiter FL 33478", 1917 "sold_price": null, 1918 "id": 235875624, 1919 "state": "FL", 1920 "photo_urls": [ 1921 "http://cdn.photos.sparkplatform.com/fl/20190322153144208228000000-o.jpg" 1922 ], 1923 "status": "Pending" 1924 }, ...] 1925 */ 1926 return res.body || []; 1927 }); 1928 } 1929 1930 function makeMlsLink(data) { 1931 // Code Dupe from utils/googlePlace 1932 // mapping of google data type to mls data type 1933 var mapping = { 1934 neighborhood: 'neighborhood', 1935 locality: 'place', 1936 administrative_area_level_2: 'county', 1937 administrative_area_level_1: 'state', 1938 postal_code: 'postalcode', 1939 }; 1940 1941 function _filterTypes(types) { 1942 return types.filter(function(type) { return type !== 'political' }); 1943 } 1944 1945 if (!data || !Object.keys(data).length) { 1946 return '/home-search/listings'; 1947 } 1948 1949 var newData = {};
1950 _filterTypes(data.types).forEach(function(type) { 1951 if (mapping[type]) { 1952 newData.search_type = mapping[type]; 1953 } 1954 }); 1955 newData.omnibox = data.formatted_address; 1956 data.address_components.forEach(function(component) { 1957 _filterTypes(component.types).forEach(function(type) { 1958 if (mapping[type]) { 1959 newData[mapping[type]] = component.long_name; 1960 } 1961 }); 1962 }); 1963 var bounds = data.geometry.bounds; 1964 var convertedData = Object.assign(bounds, newData); 1965 1966 return '/home-search/listings?' + objectToQuerystring(convertedData); 1967 } 1968 1969 function debounce(func, wait) { 1970 let timeout; 1971 return function(...args) { 1972 const context = this; 1973 clearTimeout(timeout); 1974 timeout = setTimeout(() => func.apply(context, args), wait) 1975 } 1976 } 1977 1978 // Global methods / variables that can be accessed by element js 1979 window.luxuryPresence = { 1980 ...window.luxuryPresence, 1981 defaults: { 1982 companyId: 'b8978102-23d8-42d2-b1c5-bbed6df2e9fd', 1983 apiGatewayUrl: '/api-gw', 1984 routerUrl: '/api-nv', 1985 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\
1985n }\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
1985s: 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"}, 1986 propertyPlaceholderImage: {"id":"df0e9335-d2fa-4d3d-9dea-a6d7a9c5dd3e","alt":null,"bytes":7645,"width":1920,"format":"png","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/pbxhbdn3ukhxpmt8u3td","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/pbxhbdn3ukhxpmt8u3td","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/pbxhbdn3ukhxpmt8u3td","sourceUrl":null,"__typename":"Media","altTagText":null,"authorName":null,"sourceName":"r2","description":null,"displayName":"property_alexa-glockner","originalUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/pbxhbdn3ukhxpmt8u3td","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/pbxhbdn3ukhxpmt8u3td","originalFileName":"Property_Alexa Glockner"} 1987 }, 1988 objectToQuerystring: objectToQuerystring, 1989 getPath: getPath, 1990 getMLSAutocomplete: getMLSAutocomplete, 1991 getMLSAutocompleteWithFilters: getMLSAutocompleteWithFilters, 1992 makeMlsLink: makeMlsLink, 1993 debounce: debounce, 1994 }; 1995 1996 var wowOffset = 100; 1997 </script>
1997 1998
1998<script> 1999 (()=>{var e={},t={};t={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("/")}},e=function(e,{isEqual:i}){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,t,s){return i(e,t)?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;
1999i&&(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())),`
1999<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}
1999return 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:t.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 i{constructor(e,t,i){if(this.config=e,this.window=t,this.document=i,!this.destroy)throw Error("Controllers must implement a deconstructor")}}let s="lp_lead_form_conversion_fired";function r(e,t){if(e&&t&&"function"==typeof t.sendGoogleTagManagerEvent&&!function(e){try{return"true"===e.sessionStorage.getItem(s)}catch{return!1}}(e))try{t.sendGoogleTagManagerEvent("event","generate_lead");try{e.sessionStorage.setItem(s,"true")}catch{}}catch{}}function a(e){return!!e&&(!!e.expired||Date.now()>=e.expiresAt)}let o="/api/v1/home-valuation";class n extends i{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
1999ontact 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
1999ourceResource,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 o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),signal:s.signal});clearTimeout(r);let n=await o.text(),l=this._parseResponsePayload(n);if(!o.ok)throw this._createResponseError(l,o.status);if(l&&"success"===l.status&&l.redirectUrl){if(a(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:n}=this._extractAddressAndCoordinates(s),l=`${t}${o}`,d=this._buildHomeValuationData(e,r,a,n),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()}${o}`;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,n=setTimeout(()=>a.abort(),1e4);try{let e=await fetch(r,{headers:{Accept:"application/json"},signal:a.signal});if(clearTimeout(n),!e.ok){let t=Error(`Home valuation estimate failed: ${e.status}`);throw t.status=e.status,t}let t=await e.json();return t?.valueDollars??null}catch(e){throw clearTimeout(n),e}}}let l="middleName",d="redirect-pending",c=["name","firstName","lastName",l,"email","phone","phoneNumber","source","message","mlsId","sourceUrl"],u="lp_map_key_failed",h="oauthSuccess",p={cookieyes:{eventName:"cookieyes_consent_update",hasAnalyticsConsent:e=>(function(e){let t=e.cookie.match(/cookieyes-consent=([^;
1999]+)/);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 m(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function g(e,t){t.forEach(t=>{let i=e[t];Array.isArray(i)&&0===i.length&&delete e[t]})}function y(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 f(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 w(e){return e&&Array.isArray(e)?e.map(e=>f(e)):e}function v(e){let{region:t}=e;if(!m(t))return e;let{schools:i,pois:s,...r}=t,a={...r,schools:m(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 b(e){return e&&Array.isArray(e)?e.map(e=>v(e)):e}function S(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){return e&&Array.isArray(e)?e.map(e=>S(e)):e}function E(e,t){return m(e)?t(e):e}function I(e,t){return Array.isArray(e)?t(e):e}let A=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}}}({}),L=new class extends i{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 >
1999 .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})}}}(A,window,document),$=new class extends i{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=)
1999)|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=` 2000 <div id="modal-${i.id}" class="modal visible"> 2001 <div class="modal-content"> 2002 <div class="lightbox-video"> 2003 <div class="video-player"> 2004 <div class="embed-container"> 2005 ${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>`} 2006 </div> 2007 </div> 2008 </div> 2009 </div> 2010 <button class="close lp-close" type="button" aria-label="close modal"><span class="lp-close-icon" aria-hidden="true"></span></button> 2011 </div> 2012 `;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,{})}}(A,window,document),x=new class extends i{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("")})}}}(A,window,document),T=new class extends i{constructor(e,t,i){super(e,t,i),this.forms=[],this.homeValuationService=new n(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=>!c.includes(e)).reduce((t,i)=>(t[i]=e[i],t),{}),{pageId:o,companyId:n,websiteId:l,pageMeta:d}=r,u=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(u)}},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
2012=>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);r(this.window,this.document);let a=await this._waitForLeadSubmit(e=>this._submitLeadRequest(s,e));if(this._sendGAEvent(s),a?.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(a(i))return null;throw e});try{return await Promise.race([r,s])}finally{clearTimeout(t)}}_showRedirectPending(e){if(e.classList.add(d),e.querySelector(`.${d}__indicator`))return;let t=this.document.createElement("div");t.className=`${d}__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===l)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")}}(A,window,document),k=new class extends i{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(u)}catch(e){return!1}}_setFailureFlag(e){try{e?this.window.sessionStorage.setItem(u,"1"):this.window.sessionStorage.removeItem(u)}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");
2012let 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),""}}}(A,window,document),C=new class extends i{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
2012URIComponent(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}}(A,window,document),M=new class extends i{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=` 2013 <button class="lp-lightbox__close" aria-label="close modal"></button> 2014 <div class="lp-lightbox__content"> 2015 <div class="lp-lightbox__carousel splide" role="group" aria-label="Image Gallery"> 2016 <div class="splide__arrows"> 2017 <button class="splide__arrow splide__arrow--prev lp-lightbox-arrow lp-lightbox-arrow--prev"></button> 2018 <button class="splide__arrow splide__arrow--next lp-lightbox-arrow lp-lightbox-arrow--next"></button> 2019 </div> 2020 <div class="splide__track"> 2021 <ul class="splide__list"></ul> 2022 </div> 2023 </div> 2024 </div> 2025 `,"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
2025h(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=` 2026 <button class="lp-lightbox__close" aria-label="close modal"></button> 2027 <div class="lp-lightbox__content"> 2028 <div class="lp-lightbox__carousel"></div> 2029 </div> 2030 `,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}))}}(A,window,document),P=new class extends i{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",{})}}(A,window,document),U=new class extends i{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"}
2030)),(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",{})}}(A,window,document),N=new class extends i{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(h,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(h);this.window.dispatchEvent(e),r(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"];
2030return 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")}}}(A,window,document),R=new class extends i{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})}}(A,window,document),B=new class extends i{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=` 2031 query { 2032 validSession { 2033 success 2034 } 2035 } 2036 `;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}}(A,window,document),O=new class extends i{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=p[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))}}(A,window,document),V=new class extends i{destroy(){}transformVariables(e,t){let i;return g(i={...t},["testimonialId"]),y(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":g(e,["testimonialIds"]);break;case"agents":case"agentsCount":g(e,["officeId","teamId","developmentId","agentIds","tags"]),y(e,["officeId"],"officeIds"),y(e,["teamId"],"teamIds"),y(e,["developmentId"],"developmentIds");break;case"neighborhoods":case"neighborhoodsCount":g(e,["neighborhoodIds","neighborhoodId"]),y(e,["neighborhoodIds","neighborhoodId"],"neighborhoodId");break;case"developments":case"developmentsCount":g(e,["agentId","neighborhoodIds","neighborhoodId","developmentIds","tag"]),e.agentId&&Array.isArray(e.agentId)&&([e.agentId]=e.agentId),y(e,["neighborhoodIds","neighborhoodId"],"neighborhoodIds");break;case"properties":case"propertiesCount":g(e,["statusIds","statusId","propertyTypeIds","propertyTypeId","propertyId","networkId","propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","
2036spaceTypeIds","addressState","addressCity","backfillProviders","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"]),["propertyIds","agentIds","teamIds","officeIds","neighborhoodIds","spaceTypeIds","backfillMLSListingIds","backfillMLSAgentIds","backfillMLSOfficeIds"].forEach(t=>y(e,[t],t)),y(e,["statusIds","statusId"],"propertyStatusId"),e.excludeStatusId&&(e.excludePropertyStatusId=e.excludeStatusId,delete e.excludeStatusId),y(e,["propertyTypeIds","propertyTypeId"],"propertyTypeId"),y(e,["networkId"],"networkId"),y(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":g(e,["categoryIds","categoryId","neighborhoodId"]),void 0!==e.order&&(e.sort=e.order,delete e.order),y(e,["categoryIds","categoryId"],"categoryId");break;case"postCategories":g(e,["categoryId","categoryIds"]),void 0!==e.order&&(e.sort=e.order,delete e.order),y(e,["categoryIds","categoryId"],"categoryId");break;case"pressReleases":case"pressReleasesCount":g(e,["pressReleaseId","categories","propertyId","developmentId","agentId","teamId"]),y(e,["pressReleaseId"],"pressReleaseIds");break;case"offices":case"officesCount":g(e,["officeId","officeIds","tags"]),y(e,["officeId"],"officeIds");break;case"teams":case"teamsCount":g(e,["teamId","teamIds"]),y(e,["teamId"],"teamIds");break;case"pois":g(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?E(t,f):"agents"===e||"agentsCount"===e?I(t,w):"neighborhood"===e?E(t,v):"neighborhoods"===e||"neighborhoodsCount"===e?I(t,b):"development"===e?E(t,S):"developments"===e||"developmentsCount"===e?I(t,_):t}transformPage(e){return{items:e&&e.items||[],count:e&&e.total||0}}}(A,window,document);function D(e,t){if(window.luxuryPresence[e])try{window.luxuryPresence[e].destroy()}catch(e){console.log(e)}window.luxuryPresence[e]=t}D("config",A),D("modals",L),D("buttons",$),D("validation",x),D("contactForms",T),D("mapApiLoader",k),D("pagination",C),D("expandSliders",M),D("divolte",P),D("eventBus",U),D("oauth",N),D("qualifyingQuestionsModal",R),D("session",B),D("consent",O),D("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(){}}),D("routerApi",V),window.luxuryPresence.formatSliderPriceRange=C.formatSliderPriceRange.bind(C),window.luxuryPresence.formatSliderAreaRange=C.formatSliderAreaRange.bind(C),window.luxuryPresence.getSearchFormValues=C.getSearchFormValues.bind(C),window.luxuryPresence.handlebarsHelpersFactory=function(t){var i;return((i=e)&&i.__esModule?i.default:i)(t,{isEqual:(e,t)=>e==t})}})(); 2037//# sourceMappingURL=lp-sdk.js.map 2038 2039 </script>
2039 2040 2041
2041<script> 2042 var lpGlobalInitialized = false; 2043 2044 function lpGlobalInit () { 2045 if (lpGlobalInitialized) { 2046 return; 2047 } 2048 lpGlobalInitialized = true; 2049 // Initialize wow animation plugin only according to turbolinks 2050 var wow; 2051 if (window.WOW) { 2052 wow = new WOW({ 2053 animateClass: 'animated', 2054 offset: wowOffset, 2055 live: false, 2056 callback: function(box) {} 2057 }); 2058 } 2059 // Initialize handlebar helpers only once 2060 function handlebarsInit() { 2061 if (!window.Handlebars) { 2062 return; 2063 } 2064 HandlebarsIntl.registerWith(Handlebars); 2065 Handlebars.registerHelper(window.luxuryPresence.handlebarsHelpersFactory(Handlebars)); 2066 } 2067 2068 handlebarsInit(); 2069 2070 /* Initialize Luxury Presence SDK */ 2071 try { 2072 window.luxuryPresence.config.setCompany("b8978102-23d8-42d2-b1c5-bbed6df2e9fd", {}); 2073 window.luxuryPresence.config.setWebsite("f8eeb622-1c43-422f-bf48-840bd660be00", { 2074 myhomeDashboardEnabled: true, 2075 mlsEnabled: true, 2076 hstValuationRedirectEnabled: true, 2077 hvStepTwoCaptureEnabled: false 2078 }); 2079 const url = new URL(window.location.href); 2080 const shareId = url.searchParams.get('shareId'); 2081 window.luxuryPresence.config.setPage("1d85eb8e-9986-440e-a9b2-48ec4523181f", { 2082 sourceResource: "", 2083 pageElementId: "", 2084 pageQueryVariables: {}, 2085 shareId: "", 2086 }); 2087 window.luxuryPresence.config.setWebsiteApiGatewayUrl("https://wgw.luxurypresence.com", {}); 2088 window.luxuryPresence.config.setBuyerSellerServiceUrl("https://bss.luxurypresence.com", {}); 2089 window.luxuryPresence.config.setDivolteServiceUrl("https://t.luxurypresence.com", {}); 2090 window.luxuryPresence.config.setEventBusUrl("https://cdn.luxurypresence.com/scripts/event-bus-js", {}); 2091 window.luxuryPresence.config.setEventBus({ 2092 enabled: true, 2093 apiKey: "phc_PMYT31xlmXBaTCwpIRx1v6RrpLVZIuP47N3mOT6KLnr", 2094 url: "https://p.luxurypresence.com", 2095 }); 2096 window.luxuryPresence.config.setTemplateId("dbfbedc7-c7e2-4812-86ee-0ee198862c21", {}); 2097 window.luxuryPresence.config.setLeadIngesterUrl("https://leads.luxurypresence.com", {}); 2098 window.luxuryPresence.buttons.initialize({}); 2099 window.luxuryPresence.consent.initialize({ provider: 'lp-consent' }); 2100 window.luxuryPresence.contactForms.initialize({}); 2101 window.luxuryPresence.validation.initialize({}); 2102 window.luxuryPresence.expandSliders.initialize({}); 2103 window.luxuryPresence.oauth.initialize({ googleSignOnEnabled: false, iframe: false }); 2104 window.luxuryPresence.qualifyingQuestionsModal.initialize({ qualifyingQuestionsModalEnabled: true }); 2105 } catch (e) { 2106 console.log(e); 2107 } 2108 2109 /* Inject Section Specific Javascript */ 2110 try { 2111(function init(sectionDomId) { 2112 const disclaimerLabel = document.querySelector('#' + sectionDomId + ' .lp-tcr-content'); 2113 if (disclaimerLabel) { 2114 const input = disclaimerLabel.querySelector('input'); 2115 if (input) { 2116 input.setAttribute('id', `${sectionDomId}-termsAccepted`); 2117 input.value = 'true'; 2118 const label = document.createElement('label'); 2119 label.setAttribute('for', `${sectionDomId}-termsAccepted`); 2120 label.classList.add('lp-visually-hidden'); 2121 label.textContent = 'Opt in/Disclaimer Consent:'; 2122 disclaimerLabel.prepend(label); 2123 } 2124 } 2125 function setHttp(link) { 2126 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 2127 link = 'https://' + link; 2128 } 2129 return link; 2130 } 2131 const socialLinks = document.querySelectorAll('#' + sectionDomId + ' .socials__link, #' + sectionDomId + ' .lp-socials__link'); 2132 socialLinks.forEach(linkElement => { 2133 const href = linkElement.getAttribute('href'); 2134 if (href) { 2135 linkElement.setAttribute('href', setHttp(href)); 2136 } 2137 }); 2138 const redirectLink = $('#' + sectionDomId + ' .redirect-link'); 2139 if (redirectLink.length) { 2140 const rawHref = setHttp(redirectLink.attr('href')); 2141 let formEvent; 2142 if (rawHref) { 2143 formEvent = redirectLink.data('redirect') ? 'formsubmitted' : 'reset'; 2144 $('#' + sectionDomId + ' .contact-form').find('form').on(formEvent, function () { 2145 redirectLink.attr('href', rawHref); 2146 redirectLink[0].click(); 2147 }); 2148 } 2149 } 2150})('modal-global-contact-us'); 2151} catch(e) { 2152console.log(e); 2153} 2154 2155 try { 2156(function init(sectionDomId) { 2157 const $section = $('#' + sectionDomId); 2158 const $hamburger = $section.find('.hamburger-component'); 2159 const $window = $(window); 2160 $window.on('lpui-sidemenu-show.lpui-auto-clean', function () { 2161 $hamburger.addClass('active'); 2162 }); 2163 $window.on('lpui-sidemenu-hide.lpui-auto-clean', function () { 2164 $hamburger.removeClass('active'); 2165 }); 2166 setTimeout(() => { 2167 if ($window.scrollTop() > 0) { 2168 $section.find('.wow').each(function () { 2169 wow.applyStyle(this, true); 2170 wow.show(this); 2171 }); 2172 } 2173 }, 500); 2174 function updateSubsVisibility(e) { 2175 try { 2176 e.forEach(function (record) { 2177 var $target = $(record.target); 2178 if (!$target.hasClass('sub-nav')) { 2179 return; 2180 } 2181 var $link = $target.siblings('.navigation__link'); 2182 if (!$link.length) { 2183 return; 2184 } 2185 if ($target.hasClass('visible')) { 2186 $link.addClass('visible-dropdown'); 2187 } else { 2188 $link.removeClass('visible-dropdown'); 2189 } 2190 }); 2191 } catch (e) { 2192 console.log(e); 2193 } 2194 } 2195 var observer = new MutationObserver(updateSubsVisibility); 2196 observer.observe($section.find('.header')[0], { 2197 subtree: true, 2198 attributes: true, 2199 attributeFilter: ["class"] 2200 }); 2201})('global-navbar'); 2202} catch(e) { 2203console.log(e); 2204} 2205 try { 2206(function init(sectionDomId, options) { 2207 var elementSelector = options.elementSelector || 'nav'; 2208 var element = document.querySelector(elementSelector); 2209 var sections = document.querySelectorAll('body > section');
2210 var subNavContainers = element.querySelectorAll('.sub-nav'); 2211 var initialBackgroundColor = options.initialBackgroundColor || element.style.backgroundColor; 2212 var backgroundColorScroll = options.backgroundColorScroll || '#191919'; 2213 var fontColor = options.fontColor || '#fff'; 2214 var fontColorScroll = options.fontColorScroll || '#000'; 2215 var didScroll = false; 2216 var lastScrollTop = 0; 2217 var delta = 5; 2218 2219 // eslint-disable-next-line sonarjs/no-collapsible-if 2220 if (wow) { 2221 // Wowjs might not trigger for position fixed elements 2222 if (window.scrollY > 0) { 2223 element.querySelectorAll('.wow').forEach(el => wow.show(el)); 2224 } 2225 } 2226 function adjustNavPinState() { 2227 // Remove 'visible' class from all subNavContainers 2228 for (let i = 0; i < subNavContainers.length; i++) { 2229 subNavContainers[i].classList.remove('visible'); 2230 } 2231 if (window.scrollY > 0) { 2232 element.style.backgroundColor = backgroundColorScroll; 2233 element.style.color = fontColorScroll; 2234 element.classList.add('scroll'); 2235 } else { 2236 element.style.backgroundColor = initialBackgroundColor; 2237 element.style.color = fontColor; 2238 element.classList.remove('scroll'); 2239 } 2240 } 2241 adjustNavPinState(); 2242 function onScroll() { 2243 didScroll = true; 2244 } 2245 window.addEventListener('scroll', onScroll); 2246 2247 // eslint-disable-next-line 2248 var debounceInterval = setInterval(() => { 2249 if (didScroll) { 2250 // eslint-disable-next-line 2251 hasScrolled(); 2252 didScroll = false; 2253 } 2254 }, 250); 2255 function hasScrolled() { 2256 adjustNavPinState(); 2257 // eslint-disable-next-line 2258 var navbarHeight = element.offsetHeight; 2259 // eslint-disable-next-line 2260 var st = window.scrollY; 2261 2262 // Make sure they scroll more than delta 2263 if (Math.abs(lastScrollTop - st) <= delta) { 2264 return; 2265 } 2266 if (st > lastScrollTop && st > navbarHeight) { 2267 // Scroll Down 2268 element.style.transform = `translateY(-${navbarHeight}px) scaleY(0)`; 2269 document.documentElement.style.setProperty('--global-header-height', '0px'); 2270 2271 // Some sections "follow" the navbar with class sticky (i.e. Producer search) 2272 sections.forEach(section => { 2273 if (section.classList.contains('sticky')) { 2274 section.style.top = '0px'; 2275 } 2276 }); 2277 } else { 2278 // Scroll Up 2279 // eslint-disable-next-line 2280 if (st + window.innerHeight < document.documentElement.scrollHeight) { 2281 element.style.transform = `translateY(0) scaleY(1)`; 2282 document.documentElement.style.setProperty('--global-header-height', `${navbarHeight}px`); 2283 sections.forEach(section => { 2284 if (section.classList.contains('sticky')) { 2285 section.style.top = `${navbarHeight}px`; 2286 } 2287 }); 2288 } 2289 } 2290 lastScrollTop = st; 2291 } 2292})('NAVBAR', JSON.parse("{\"fontColor\":\"#ffffff\",\"elementSelector\":\"nav\",\"fontColorScroll\":\"#000000\",\"backgroundColorScroll\":\"#ffffff\",\"initialBackgroundColor\":\"rgba(0,0,0,0)\"}")); 2293} catch(e) { 2294console.log(e); 2295} 2296 try { 2297(function init(sectionDomId) { 2298 var $sidemenu = $('#' + sectionDomId); 2299 var $link = $sidemenu.find('.sub-nav-link'); 2300 var shown = false; 2301 function onShow() { 2302 if (shown) { 2303 return; 2304 } 2305 shown = true; 2306 window.lpUI.requestScrollLock(sectionDomId); 2307 } 2308 function onHide() { 2309 if (!shown) { 2310 return; 2311 } 2312 shown = false; 2313 window.lpUI.releaseScrollLock(sectionDomId); 2314 $('body').removeClass('locked'); 2315 $('.hamburger.active').removeClass('active'); 2316 } 2317 const handleLinkClick = href => { 2318 if (href && href.match(/^#[^#].*$/)) { 2319 window.lpUI.sideMenuHide(); 2320 } 2321 }; 2322 $sidemenu.find('a').click(function () { 2323 const href = $(this).attr('href'); 2324 handleLinkClick(href); 2325 }); 2326 $sidemenu.on('lpui-show', onShow); 2327 $sidemenu.on('lpui-hide', onHide); 2328 $link.click(function () { 2329 lpUI.sideMenuHide(); 2330 }); 2331})('global-sidemenu'); 2332} catch(e) { 2333console.log(e); 2334} 2335 2336 try { 2337(function init(footerId) { 2338 var textContent = $(".text_content_wrap p").text().trim().length; 2339 const socialLinks = $(`#${footerId} .lp-socials__link`); 2340 if (textContent < 1) { 2341 $(".text_content_wrap").remove(); 2342 $(".second_text_footer").css({ 2343 'margin-bottom': 0 2344 }); 2345 } 2346 if (socialLinks.length > 0) { 2347 socialLinks.attr('data-wow-offset', '10'); 2348 } 2349 if ($(window).width() > 1280) { 2350 let footer = document.querySelector("#" + footerId);
2351 let copyrightElem = footer.querySelector(".copy_zone"); 2352 if (copyrightElem) { 2353 copyrightElem.style.whiteSpace = "nowrap"; 2354 let nowrapElemWidth = copyrightElem.clientWidth; 2355 copyrightElem.style.whiteSpace = ""; 2356 let normalElemWidth = copyrightElem.clientWidth; 2357 if (nowrapElemWidth > normalElemWidth) { 2358 footer.querySelector(".form-col--socials").classList.add("form-col--xl-auto"); 2359 } 2360 } 2361 } 2362 const form = $("#" + footerId).find("form"); 2363 const redirectLink = $('#' + footerId + ' .redirect-link'); 2364 form.on("reset", function () { 2365 redirectPage(redirectLink); 2366 }); 2367 function redirectPage(link) { 2368 if (link.length) { 2369 const rawHref = link.attr('href'); 2370 link.attr('href', setHttp(rawHref)); 2371 link[0].click(); 2372 } 2373 } 2374 function setHttp(link) { 2375 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 2376 link = 'http://' + link; 2377 } 2378 return link; 2379 } 2380})('global-footer'); 2381} catch(e) { 2382console.log(e); 2383} 2384 2385 try { 2386(function init(sectionDomId) { 2387 var _section = $('#' + sectionDomId); 2388 var _footer = document.getElementById('global-footer'); 2389 const redirectLink = _section.find('.js-redirect-link'); 2390 function setHttp(link) { 2391 if (link.search(/^(http[s]?\:\/\/|\/)/) == -1) { 2392 link = 'https://' + link; 2393 } 2394 return link; 2395 } 2396 function redirectPage(link) { 2397 if (link.length) { 2398 window.location.href = setHttp(link.attr('href')); 2399 } 2400 } 2401 const emailInput = _section.find('.js-email-input'); 2402 const emailRegex = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~\-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+/; 2403 emailInput.on('input', function () { 2404 if (emailRegex.test(this.value)) { 2405 this.setCustomValidity(''); 2406 } else { 2407 this.setCustomValidity('Please enter a valid email address.'); 2408 } 2409 this.reportValidity(); 2410 }); 2411 _section.find('input[name="name"]').on("keyup", function () { 2412 if (this.value.replaceAll(/\d/g, "").trim().split(" ").length < 2 || this.value.replaceAll(/\d/g, "").trim() === "") { 2413 this.setCustomValidity("Please input your first name and last name."); 2414 } else { 2415 this.setCustomValidity(""); 2416 } 2417 }); 2418 _section.find('form').on("reset", function () { 2419 $(this).addClass("show-success"); 2420 redirectPage(redirectLink); 2421 }); 2422 $(window).scroll(function () { 2423 if ($(this).scrollTop() >= 150) _section.find('.btn-holder').addClass('visible');else _section.find('.btn-holder').removeClass('visible'); 2424 }); 2425 _section.find('.close-btn, .connect-btn').click(function () { 2426 _section.find('.pop-up').toggle(); 2427 _section.find('.btn-holder').toggle(); 2428 }); 2429 if (!_footer) return; 2430 const observer = new IntersectionObserver(entries => { 2431 entries.forEach(entry => { 2432 if (entry.isIntersecting) _section.hide();else _section.show(); 2433 }); 2434 }, { 2435 threshold: 0.1 2436 }); 2437 observer.observe(_footer); 2438 function selectToDropdown(selectItem) { 2439 let customDropdown = ` 2440 <div class="custom-select" role="presentation"> 2441 <button class="custom-select-toggle is-placeholder" type="button" aria-haspopup="true" aria-expanded="false"></button> 2442 <div class="custom-select-menu" style="display: none;max-height: none;"> 2443 <div class="custom-select-content"> 2444 </div> 2445 </div> 2446 </div>`; 2447 $(customDropdown).insertAfter(selectItem); 2448 let $dropdown = $($(selectItem).next()); 2449 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 2450 let $dropdownMenu = $dropdown.find(".custom-select-menu"); 2451 let $dropdownContent = $dropdown.find(".custom-select-content"); 2452 $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select"); 2453 $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom"); 2454 $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id")); 2455 appendOptionButtons(selectItem, $dropdownContent); 2456 $(selectItem).removeClass().addClass("sr-only"); 2457 var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text(); 2458 $dropdownToggle.html(toggleText); 2459 $dropdown.on("click", ".custom-select-item", function (e) { 2460 if ($(this).hasClass("is-disabled")) return; 2461 let elementNumber = $(this).index(); 2462 let $originalSelect = $(this).closest(".custom-select").siblings("select"); 2463 let $linkedOption = $originalSelect.find("option").eq(elementNumber); 2464 if (!$linkedOption.prop("selected")) { 2465 $linkedOption.prop("selected", true); 2466 $originalSelect.change(); 2467 $(this).addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected"); 2468 $dropdownToggle.html($(this).html()); 2469 closeSelectMenu($(this).closest(".custom-select-menu")); 2470 } 2471 $dropdownToggle.removeClass("is-placeholder"); 2472 }); 2473 function convertOptionToButton(option) { 2474 var optionText = $(option).text(); 2475 var optionValue = $(option).attr("value") || $(option).text(); 2476 var optionIsDisabled = $(option).prop("disabled"); 2477 var outputButton = `<button value="${optionValue}" class="custom-select-item" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`; 2478 return outputButton; 2479 } 2480 function appendOptionButtons(selectItem, appendTarget) { 2481 $(selectItem).find("option").each(function () { 2482 let currentButton = convertOptionToButton(this); 2483 $(appendTarget).append(currentButton); 2484 }); 2485 } 2486 function showSelectMenu(selectMenu) { 2487 var customSelect = $(selectMenu).closest(".custom-select")[0]; 2488 $(customSelect).addClass("open"); 2489 $(selectMenu).slideDown(); 2490 } 2491 function closeSelectMenu(selectMenu) { 2492 var customSelect = $(selectMenu).closest(".custom-select")[0]; 2493 $(customSelect).removeClass("open"); 2494 $(selectMenu).slideUp(); 2495 } 2496 $dropdown.on("click", ".custom-select-toggle", function (e) { 2497 var $customSelect = $(this).closest(".custom-select"); 2498 var selectMenu = $customSelect.find(".custom-select-menu")[0]; 2499 if ($customSelect.hasClass("open")) { 2500 closeSelectMenu(selectMenu); 2501 } else { 2502 showSelectMenu(selectMenu); 2503 } 2504 }); 2505 $(document).on("click", function (e) { 2506 if ($(e.target).closest(".custom-select").length < 1 && $(".custom-select").hasClass("open")) { 2507 $(".custom-select.open").each(function () { 2508 var selectMenu = $(this).find(".custom-select-menu")[0]; 2509 closeSelectMenu(selectMenu); 2510 }); 2511 } 2512 }); 2513 } 2514 $(".pop-up select[name='interest']").each(function () { 2515 selectToDropdown(this); 2516 }); 2517})('global-mobile-contact'); 2518} catch(e) { 2519console.log(e); 2520} 2521 2522 try { 2523(function init(sectionDomId) {})('modal-global-subscribe'); 2524} catch(e) { 2525console.log(e); 2526} 2527 2528 try { 2529(function init(sectionDomId) {})('section-03af5970-969f-4ce5-87e6-2b86762a7411', 'undefined'); 2530} catch(e) { 2531console.log(e); 2532} 2533 try { 2534(function init(sectionDomId, options) { 2535 let section = null; 2536 switch (sectionDomId) { 2537 case 'NAVBAR': 2538 section = document.querySelector('body > nav, #global-navbar'); 2539 break; 2540 case 'FOOTER': 2541 section = document.querySelector('body > footer, #global-footer'); 2542 break; 2543 case 'SIDEMENU': 2544 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 2545 break; 2546 case 'CONTACT':
2547 section = document.querySelector('#modal-global-contact-us'); 2548 break; 2549 case 'MOBILE_CONTACT': 2550 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 2551 break; 2552 case 'SUBSCRIBE': 2553 // Subscribe Not Implemented 2554 section = null; 2555 break; 2556 case 'ACCOUNT': 2557 // Account Not Implemented 2558 section = null; 2559 break; 2560 default: 2561 section = document.querySelector('#' + sectionDomId); 2562 } 2563 if (!section) { 2564 return; 2565 } 2566 2567 // Where content / items are rendered 2568 const dataContainer = section.querySelector('.data-container'); 2569 if (!dataContainer) { 2570 // no place to render items = no need to query server or do anything else 2571 return; 2572 } 2573 let variables = options.variables || {}; 2574 2575 // Some variables in options may not have been injected - remove 2576 Object.keys(variables).forEach(function (variableName) { 2577 if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) { 2578 delete variables[variableName]; 2579 } 2580 }); 2581 2582 // Merge page query variables 2583 if (options.usePageResource) { 2584 variables = { 2585 ...variables, 2586 ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource] 2587 }; 2588 } 2589 2590 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Callers 2591 // resolve the flag — fetchData reads the section stamp, aux fetches read 2592 // their own resource's stamp (auxUsesRouter). 2593 function apiUrl(useRouter) { 2594 return options.url || (useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl); 2595 } 2596 2597 // ROUTER-CLEANUP: aux resources roll out on their own flag, not the section's 2598 // (options.routerApiAux is stamped per aux resource server-side). 2599 function auxUsesRouter(resource) { 2600 return !!(options.routerApiAux && options.routerApiAux[resource]); 2601 } 2602 2603 // Pagination Executes on a Numbered Pagination Container 2604 // Or via a load more button 2605 let mode = 'BUTTONLESS_PAGINATION'; 2606 const container = section.querySelector('.pagination-container');
2607 const loadMoreButton = section.querySelector(options?.loadMoreSelector); 2608 if (container) { 2609 mode = 'NUMBERED_PAGINATION'; 2610 } 2611 if (loadMoreButton) { 2612 mode = 'LOAD_MORE_BUTTON'; 2613 } 2614 let searchContainer = section.querySelector('.search-container'); 2615 const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false; 2616 const eventPrefix = '__pagination-'; 2617 const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{ 2618 param: 'neighborhoodId', 2619 urlKey: 'neighborhood' 2620 }, { 2621 param: 'search', 2622 urlKey: 'search' 2623 }, { 2624 param: 'salesPriceGTE', 2625 urlKey: 'pricemin', 2626 formKey: 'priceMin', 2627 type: 'int' 2628 }, { 2629 param: 'salesPriceLTE', 2630 urlKey: 'pricemax', 2631 formKey: 'priceMax', 2632 type: 'int' 2633 }, { 2634 param: 'livingSpaceSizeGTE', 2635 urlKey: 'areamin', 2636 formKey: 'areaMin', 2637 type: 'int' 2638 }, { 2639 param: 'livingSpaceSizeLTE', 2640 urlKey: 'areamax', 2641 formKey: 'areaMax', 2642 type: 'int' 2643 }] : []); 2644 2645 // Total entries - initialized in first render 2646 let totalNumber = 0; 2647 const DefaultSearchParams = { 2648 page: 1 2649 }; 2650 searchFormParams.forEach(function (formParam) { 2651 DefaultSearchParams[formParam.formKey || formParam.param] = null; 2652 }); 2653 let searchParams = { 2654 ...DefaultSearchParams 2655 }; 2656 const offset = options.variables?.offset || 0; 2657 let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section; 2658 let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100; 2659 2660 // entries of per page 2661 // when query variables for a given section would't be filled options.pageSize can store 2662 // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value 2663 let pageSize = parseInt(options.pageSize, 10) || 9; 2664 2665 // Adding mobile pageRange support 2666 var NARROW_BREAKPOINT = 600; 2667 var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT; 2668 var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`); 2669 2670 // Page range (pages on both sides of the current page) 2671 var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0; 2672 var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2; 2673 var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange; 2674 2675 // Whether to display the 'Previous' button 2676 var showPrevious = true; 2677 2678 // Whether to display the 'Next' button 2679 var showNext = true; 2680 2681 // Whether to display the page buttons 2682 var showPageNumbers = true; 2683 2684 // 'Previous' text 2685 var prevText = options.prevText || '«'; 2686 2687 // 'Next' text 2688 var nextText = options.nextText || '»'; 2689 2690 // Ellipsis text 2691 var ellipsisText = '…'; 2692 var classPrefix = 'paginationjs'; 2693 2694 // Default active class 2695 var activeClassName = 'active'; 2696 2697 // Default disable class 2698 var disableClassName = 'disabled'; 2699 2700 // Pagination element's position in the container 2701 var position = 'bottom'; 2702 2703 // Whether to trigger pagination at initialization 2704 var triggerPagingOnInit = !options.skipInitialLoad; 2705 var showFirstOnEllipsisShow = true; 2706 var showLastOnEllipsisShow = true; 2707 2708 // Instantiated in init() 2709 var el = null; 2710 2711 // Controls scrollTop logic 2712 var firstRender = true; 2713 var renderBySearch = false; 2714 var disabled = false; 2715 2716 // Pagination script class selector 2717 var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script'; 2718 2719 // Property Specific Image Override if No Image 2720 var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage; 2721 2722 // Construct template 2723 var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || ''; 2724 var template = Handlebars.compile(templateHTML); 2725 2726 // Initialize 2727 init(); 2728 function init() { 2729 Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 2730 2731 // Append/prepend pagination element to the pagination container 2732 if (mode === 'NUMBERED_PAGINATION') { 2733 el = document.createElement('div'); 2734 el.className = 'paginationjs';
2735 container[position === 'bottom' ? 'append' : 'prepend'](el); 2736 } 2737 if (searchContainer) { 2738 initSearchContainer({ 2739 fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true', 2740 fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true', 2741 fetchOffices: searchContainer.dataset.fetchOffices === 'true', 2742 fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true' 2743 }, function () { 2744 syncSearchFormState(searchParams); 2745 }); 2746 } 2747 2748 // Bind events 2749 observer(); 2750 } 2751 function syncSearchFormState(params) { 2752 searchContainer.dispatchEvent(new CustomEvent('sync', { 2753 detail: params 2754 })); 2755 } 2756 function initSearchContainer(options, done) { 2757 var promises = []; 2758 if (options.fetchNeighborhoods) { 2759 promises.push(fetchAllNeighborhoods(function (neighborhoods) { 2760 searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', { 2761 detail: { 2762 data: neighborhoods.map(function (item) { 2763 return { 2764 value: item.id, 2765 label: item.name 2766 }; 2767 }) 2768 } 2769 })); 2770 })); 2771 } 2772 if (options.fetchPostCategories) { 2773 promises.push(fetchPostCategories(function (categories) { 2774 searchContainer.dispatchEvent(new CustomEvent('post-categories-data', { 2775 detail: { 2776 data: categories 2777 } 2778 })); 2779 })); 2780 } 2781 if (options.fetchOffices) { 2782 promises.push(fetchOffices(function (offices) { 2783 searchContainer.dispatchEvent(new CustomEvent('offices-data', { 2784 detail: { 2785 data: offices 2786 } 2787 })); 2788 })); 2789 } 2790 if (options.fetchRentalRates) { 2791 promises.push(fetchAllRentalRates(function (rentalRates) { 2792 searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', { 2793 detail: { 2794 data: rentalRates 2795 } 2796 })); 2797 })); 2798 } 2799 if (promises.length > 0) { 2800 Promise.all(promises).then(function () { 2801 done(); 2802 }); 2803 } else { 2804 // element's custom code is not executed yet, so we're scheduling callback to after element's code 2805 setTimeout(done); 2806 } 2807 } 2808 function fetchAllNeighborhoods(done) { 2809 var useRouter = auxUsesRouter('neighborhoods'); 2810 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Same 2811 // args on both APIs (the federated neighborhoods field accepts 2812 // withProperties/withBlogPosts); only the selection set differs. 2813 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') + '}}'; 2814 var payload = {}; 2815 payload.offset = 0; 2816 payload.limit = 100; 2817 payload.companyId = variables.companyId; 2818 if (options.resource === 'properties') { 2819 payload.withProperties = { 2820 active: true 2821 }; 2822 ['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) { 2823 if (variables[field] !== undefined && variables[field] !== null) { 2824 payload.withProperties[field] = variables[field]; 2825 } 2826 }); 2827 } 2828 if (options.resource === 'posts') { 2829 payload.withBlogPosts = { 2830 active: true 2831 }; 2832 ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) { 2833 if (variables[field] !== undefined && variables[field] !== null) { 2834 payload.withBlogPosts[field] = variables[field]; 2835 } 2836 }); 2837 } 2838 2839 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 2840 if (useRouter) { 2841 payload = window.luxuryPresence.routerApi.transformVariables('neighborhoods', payload); 2842 } 2843 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 2844 query: gqlQuery, 2845 variables: payload 2846 }).then(function (res) { 2847 var value = res.body.data && res.body.data.neighborhoods || {}; 2848 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 2849 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 2850 done(items, items.length); 2851 }); 2852 } 2853 function fetchPostCategories(done) { 2854 var featured = options.resource === 'posts' && !!variables.featured; 2855 var useRouter = auxUsesRouter('postCategories'); 2856 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 2857 // selection set differs ({ items {...} } on the router). 2858 var selection = 'id, name, publishedCount, featuredPublishedCount'; 2859 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) + '}}'; 2860 var payload = {}; 2861 payload.offset = 0; 2862 payload.limit = 100; 2863 payload.companyId = variables.companyId; 2864 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 2865 query: gqlQuery, 2866 variables: payload 2867 }).then(function (res) { 2868 var value = res.body.data && res.body.data.postCategories || {}; 2869 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 2870 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 2871 done(items.map(function (item) { 2872 item.count = featured ? item.featuredPublishedCount : item.publishedCount; 2873 return item; 2874 }), items.length); 2875 }); 2876 } 2877 function fetchOffices(done) { 2878 var useRouter = auxUsesRouter('offices'); 2879 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 2880 // selection set differs ({ items {...} } on the router). 2881 var selection = 'id, name, tags'; 2882 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. The two 2883 // APIs differ in more than the items wrapper: federated offices takes 2884 // companyId: ID! (legacy gateway: String), so each branch builds its whole doc. 2885 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 + '}}'; 2886 var payload = { 2887 offset: 0, 2888 limit: 100, 2889 companyId: variables.companyId 2890 }; 2891 2892 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 2893 if (useRouter) { 2894 payload = window.luxuryPresence.routerApi.transformVariables('office
2894s', payload); 2895 } 2896 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 2897 query: gqlQuery, 2898 variables: payload 2899 }).then(function (res) { 2900 var value = res.body.data && res.body.data.offices || {}; 2901 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 2902 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 2903 done(items, items.length); 2904 }); 2905 } 2906 2907 // ROUTER-CLEANUP: no rentalRates field on the federated router — legacy only. 2908 function fetchAllRentalRates(done) { 2909 var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl; 2910 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}'; 2911 var payload = { 2912 offset: 0, 2913 limit: 100, 2914 companyId: variables.companyId 2915 }; 2916 superagent.post(url + '/graphql').withCredentials().send({ 2917 query: gqlQuery, 2918 variables: payload 2919 }).then(function (res) { 2920 var items = res.body.data && res.body.data.rentalRates || []; 2921 done(items, items.length); 2922 }).catch(function (err) { 2923 console.error('Error fetching rental rates:', err); 2924 done([], 0); 2925 }); 2926 } 2927 function fetchData(params, done) { 2928 var resource = options.resource; 2929 var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource]; 2930 var payload = {}; 2931 try { 2932 payload = JSON.parse(JSON.stringify(variables)); 2933 } catch (e) { 2934 Object.keys(variables).forEach(function (variableName) { 2935 payload[variableName] = variables[variableName]; 2936 }); 2937 } 2938 payload.offset = (params.page - 1) * pageSize + offset; 2939 payload.limit = pageSize; 2940 payload.companyId = options.companyId; 2941 searchFormParams.forEach(function (formParam) { 2942 var val = params[formParam.formKey || formParam.param]; 2943 if (val !== null && val !== undefined) { 2944 objSet(payload, formParam.param, val); 2945 } 2946 }); 2947 2948 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 2949 if (options.useRouterApi) { 2950 payload = window.luxuryPresence.routerApi.transformVariables(resource, payload); 2951 } 2952 2953 // TODO: Disabled loading due to jarring effect 2954 // dataContainer.html('Loading...'); 2955 superagent.post(apiUrl(options.useRouterApi) + '/graphql').withCredentials().send({ 2956 query: gqlQuery, 2957 variables: payload 2958 }).then(function (res) { 2959 if (res.body.errors) { 2960 done(res.body.errors); 2961 return; 2962 } 2963 var data = res.body.data || {}; 2964 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 2965 var resources; 2966 var resourceCount; 2967 if (options.useRouterApi) { 2968 var page = window.luxuryPresence.routerApi.transformPage(data[resource]); 2969 resources = window.luxuryPresence.routerApi.transformResponse(resource, page.items); 2970 resourceCount = page.count; 2971 } else { 2972 resources = data[resource] || []; 2973 resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0; 2974 } 2975 if (resource === 'properties' && propertyPlaceholderImage?.id) { 2976 resources = resources.map(resource => { 2977 if (resource.media?.length === 0) { 2978 return Object.assign(resource, { 2979 media: [propertyPlaceholderImage] 2980 }); 2981 } 2982 return resource; 2983 }); 2984 } 2985 done(null, resources, resourceCount); 2986 }); 2987 } 2988 function getTotalPage() { 2989 return Math.ceil(totalNumber / pageSize); 2990 } 2991 function renderPaginationList() { 2992 var totalPages = getTotalPage(); 2993 var rangeStart = searchParams.page - pageRange; 2994 var rangeEnd = searchParams.page + pageRange; 2995 if (rangeEnd > totalPages) { 2996 rangeEnd = totalPages; 2997 rangeStart = totalPages - pageRange * 2; 2998 rangeStart = rangeStart < 1 ? 1 : rangeStart; 2999 } 3000 if (rangeStart <= 1) { 3001 rangeStart = 1; 3002 rangeEnd = Math.min(pageRange * 2 + 1, totalPages); 3003 } 3004 3005 // Making sure that 1 more page button is shown in edge positions 3006 if (pageRange === 0) { 3007 if (searchParams.page === totalPages) { 3008 rangeStart = totalPages <= 1 ? 1 : totalPages - 1; 3009 } 3010 if (searchParams.page === 1) { 3011 rangeEnd = Math.min(2, totalPages); 3012 } 3013 } 3014 3015 // Render pagination list 3016 if (mode === 'NUMBERED_PAGINATION') { 3017 el.innerHTML = generateHTML({ 3018 currentPage: searchParams.page, 3019 pageRange: pageRange, 3020 rangeStart: rangeStart, 3021 rangeEnd: rangeEnd 3022 }); 3023 if (totalPages < 2 && hidePaginationOnFirstPage) { 3024 container.style.display = 'none'; 3025 } else { 3026 container.style.display = ''; 3027 } 3028 } else if (mode === 'LOAD_MORE_BUTTON') { 3029 if (searchParams.page >= totalPages) {
3030 loadMoreButton.style.display = 'none'; 3031 } else { 3032 loadMoreButton.style.display = ''; 3033 } 3034 } 3035 } 3036 function render(data) { 3037 renderPaginationList(); 3038 3039 // Render new content with handlebars 3040 var html = ''; 3041 if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) { 3042 // If using load more, append search results to existing results 3043 html = dataContainer.innerHTML; 3044 } 3045 for (var i = 0; i < data.length; i++) { 3046 var itemData = recursivelyParse(data[i]); 3047 itemData.sectionIndex = options.sectionIndex; 3048 itemData.renderOptions = options.renderOptions; 3049 html += template(itemData); 3050 } 3051 dataContainer.innerHTML = html; 3052 3053 // Scroll Top 3054 if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) { 3055 // Only animate to the top if we replace dataContainer (numbered pagination) 3056 setTimeout(() => { 3057 const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset; 3058 window.scrollTo({ 3059 top: scrollTargetOffsetTop, 3060 behavior: 'smooth' 3061 }); 3062 }, 250); 3063 } 3064 return true; 3065 } 3066 function generateHTML(args) { 3067 const totalPages = getTotalPage(); 3068 const { 3069 rangeStart, 3070 rangeEnd 3071 } = args; 3072 const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 3073 ...searchParams, 3074 page 3075 }); 3076 let html = ''; 3077 if (showPrevious || showPageNumbers || showNext) { 3078 html += '<div class="paginationjs-pages"><ul>'; 3079 3080 // Previous button 3081 if (showPrevious) { 3082 if (searchParams.page <= 1) { 3083 html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`; 3084 } else { 3085 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>`; 3086 } 3087 } 3088 3089 // Pages 3090 if (showPageNumbers) { 3091 if (rangeStart <= 3) { 3092 for (let i = 1; i < rangeStart; i++) { 3093 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>`; 3094 } 3095 } else { 3096 if (showFirstOnEllipsisShow) { 3097 html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`; 3098 } 3099 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 3100 } 3101 for (let i = rangeStart; i <= rangeEnd; i++) { 3102 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>`; 3103 } 3104 if (rangeEnd < totalPages - 2) { 3105 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 3106 if (showLastOnEllipsisShow) { 3107 html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`; 3108 } 3109 } else { 3110 for (let i = rangeEnd + 1; i <= totalPages; i++) { 3111 html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`; 3112 } 3113 } 3114 } 3115 3116 // Next button 3117 if (showNext) { 3118 if (searchParams.page >= totalPages) { 3119 html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`; 3120 } else { 3121 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>`; 3122 } 3123 } 3124 html += '</ul></div>'; 3125 } 3126 return html; 3127 } 3128 function go(newSearchParams, callback, restorationVisit) { 3129 if (disabled) return; 3130 var goToPageNumber = newSearchParams.page; 3131 3132 // Page number is out of bounds 3133 if (!goToPageNumber || goToPageNumber < 1) return; 3134 var totalPage = getTotalPage(); 3135 3136 // Page number is out of bounds 3137 if (!restorationVisit && totalNumber > 0) { 3138 if (goToPageNumber > totalPage) return; 3139 } 3140 if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
3141 var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 3142 ...newSearchParams, 3143 page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null 3144 }); 3145 if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) { 3146 window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, { 3147 queryString: true 3148 })); 3149 } 3150 } 3151 3152 // Fetch and update page 3153 fetchData(newSearchParams, renderWithData); 3154 disabled = true; 3155 function renderWithData(err, data, count) { 3156 if (err) { 3157 dataContainer.dispatchEvent(new Event('error')); 3158 } else { 3159 searchParams = { 3160 ...newSearchParams 3161 }; 3162 totalNumber = count - offset; 3163 if (data.length === 0) { 3164 dataContainer.dispatchEvent(new Event('no-data')); 3165 } else { 3166 dataContainer.dispatchEvent(new Event('data')); 3167 } 3168 render(data); 3169 firstRender = false; 3170 } 3171 disabled = false; 3172 renderBySearch = false; 3173 } 3174 } 3175 function areQueryParamsEqual(first, second) { 3176 var differ = Object.keys(first).find(function (key) { 3177 return first[key] !== undefined && first[key] !== null && first[key] !== second[key]; 3178 }); 3179 if (differ) { 3180 return false; 3181 } 3182 differ = Object.keys(second).find(function (key) { 3183 return second[key] !== undefined && second[key] !== null && second[key] !== first[key]; 3184 }); 3185 return !differ; 3186 } 3187 function next(callback) { 3188 go({ 3189 ...searchParams, 3190 page: searchParams.page + 1 3191 }, callback); 3192 } 3193 function previous(callback) { 3194 go({ 3195 ...searchParams, 3196 page: searchParams.page - 1 3197 }, callback); 3198 } 3199 function refresh(callback) { 3200 go(searchParams, callback); 3201 } 3202 function update(params, callback) { 3203 renderBySearch = true; 3204 go(params, callback); 3205 } 3206 function observer() { 3207 if (searchContainer) { 3208 searchContainer.addEventListener('search', function (event, newSearchParams) { 3209 newSearchParams = event.detail || newSearchParams; 3210 update({ 3211 ...searchParams, 3212 ...newSearchParams, 3213 page: 1 3214 }); 3215 }); 3216 searchContainer.addEventListener('clear-search', function () { 3217 const defaultSearchParams = { 3218 ...DefaultSearchParams 3219 }; 3220 const isCurrentSearchFormStateDefault = areQueryParamsEqual({ 3221 ...defaultSearchParams, 3222 page: null 3223 }, { 3224 ...searchParams, 3225 page: null 3226 }); 3227 3228 // if mode is LOAD_MORE_BUTTON we should't make anything on clear 3229 // when search form have default state 3230 if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') { 3231 return; 3232 } 3233 3234 // if someone initially go to some page and click 'Clear' on search from 3235 // we should't navigate to first page. We should preserve page value 3236 if (isCurrentSearchFormStateDefault) { 3237 defaultSearchParams.page = searchParams.page; 3238 } 3239 syncSearchFormState(defaultSearchParams); 3240 update(defaultSearchParams); 3241 }); 3242 } 3243 if (mode === 'LOAD_MORE_BUTTON') { 3244 loadMoreButton.addEventListener('click', function (event) { 3245 go({ 3246 ...searchParams, 3247 page: searchParams.page + 1 3248 }); 3249 return false; 3250 }); 3251 } 3252 if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') { 3253 // Do initial render 3254 go(Object.assign({}, searchParams, { 3255 page: 1 3256 })); 3257 return; 3258 } 3259 if (mode === 'NUMBERED_PAGINATION') { 3260 // Go to specified page number 3261 container.addEventListener(eventPrefix + 'go', function (event) { 3262 let { 3263 pageNumber, 3264 done 3265 } = event.detail || {}; 3266 pageNumber = parseInt(pageNumber, 10); 3267 if (!pageNumber) { 3268 return; 3269 } 3270 go({ 3271 ...searchParams, 3272 page: pageNumber 3273 }, done); 3274 }); 3275 3276 // Page number button click 3277 el.addEventListener('click', function (event) { 3278 let clickTarget = event.target; 3279 let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next'); 3280 let pageNumber = current?.getAttribute('data-num'); 3281 if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) { 3282 return; 3283 } else { 3284 go({ 3285 ...searchParams, 3286 page: parseInt(pageNumber, 10) 3287 }); 3288 } 3289 event.preventDefault(); 3290 }); 3291 3292 // Whether to load the default page 3293 var defaultPageNumber = searchParams.page; 3294 if (triggerPagingOnInit) {
3295 container.dispatchEvent(new CustomEvent(eventPrefix + 'go', { 3296 detail: { 3297 pageNumber: defaultPageNumber 3298 } 3299 })); 3300 } 3301 } 3302 window.addEventListener('popstate', function (event) { 3303 var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 3304 if (!areQueryParamsEqual(newParams, searchParams)) { 3305 go(newParams, null, true); 3306 if (searchContainer) { 3307 syncSearchFormState(newParams); 3308 } 3309 } 3310 }); 3311 } 3312 function replaceVariables(template, variables) { 3313 var formattedString; 3314 for (var key in variables) { 3315 var value = variables[key]; 3316 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 3317 formattedString = (formattedString || template).replace(regexp, value); 3318 } 3319 return formattedString; 3320 } 3321 function isTextEditorValue(obj) { 3322 return 'raw' in obj || 'gjs' in obj; 3323 } 3324 function getTextEditorValue(obj) { 3325 if (!obj.html) { 3326 return ''; 3327 } 3328 var data = obj.html; 3329 var css = (obj.raw || obj.gjs || {}).css; 3330 if (css) { 3331 data = data + '<style>' + css + '</style>'; 3332 } 3333 return data; 3334 } 3335 3336 /** 3337 * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor. 3338 * strips out raw proprties and returns only HTML if it exists. 3339 * @param {Object} resources a collection retrieved from the database 3340 * @return {Object} the newly modified object. 3341 */ 3342 function recursivelyParse(resources) { 3343 forEach(resources, function (value, key) { 3344 if (!value) { 3345 return; 3346 } 3347 if (value instanceof Object) { 3348 if (isTextEditorValue(value)) { 3349 resources[key] = getTextEditorValue(value); 3350 return; 3351 } else { 3352 return recursivelyParse(value); 3353 } 3354 } 3355 try { 3356 var parsedData = JSON.parse(value); 3357 if (isTextEditorValue(parsedData)) { 3358 resources[key] = getTextEditorValue(parsedData); 3359 } 3360 } catch (e) { 3361 // do nothing if we failed to parse value as JSON 3362 } 3363 }); 3364 return resources; 3365 } 3366 function forEach(collection, iteratee) { 3367 var func = Array.isArray(collection) ? arrayEach : baseFor; 3368 return func(collection, iteratee); 3369 } 3370 function baseFor(object, iteratee) { 3371 if (!object) { 3372 return; 3373 } 3374 var iterable = Object(object); 3375 var props = Object.keys(object); 3376 var length = props.length; 3377 var index = -1; 3378 while (length--) { 3379 var key = props[++index]; 3380 if (iteratee(iterable[key], key, iterable) === false) { 3381 break; 3382 } 3383 } 3384 return object; 3385 } 3386 function objSet(obj, path, value) { 3387 const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g); 3388 pathArray.reduce((acc, key, i) => { 3389 if (acc[key] === undefined) acc[key] = {}; 3390 if (i === pathArray.length - 1) acc[key] = value; 3391 return acc[key]; 3392 }, obj); 3393 } 3394 function arrayEach(array, iteratee) { 3395 var index = -1; 3396 var length = array.length; 3397 while (++index < length) { 3398 if (iteratee(array[index], index, array) === false) { 3399 break; 3400 } 3401 } 3402 return array; 3403 } 3404 function selectPageRangeMode(e) { 3405 pageRange = e.matches ? mobilePageRange : desktopPageRange; 3406 renderPaginationList(); 3407 } 3408 paginationMql.addEventListener('change', selectPageRangeMode); 3409})('section-40e257c9-edea-4cb8-9ee1-32c3ade9c174', JSON.parse("{\"pageSize\":\"4\",\"resource\":\"agents\",\"pageRange\":0,\"variables\":{\"limit\":4,\"offset\":0,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"categoryId\":\"{{pageElement.categoryId}}\",\"agentIds\":[\"4cb99f5a-1472-43f5-ad3e-a9785e1fb3f4\",\"804ba048-3147-4865-843d-6aeb2945ad30\",\"bba54182-667c-4b16-86c2-92a7bef69859\",\"68205833-723a-4432-bee8-2a9312b5b5ae\"]},\"searchFormParams\":[{\"param\":\"search\",\"urlKey\":\"search\"},{\"param\":\"officeId\",\"global\":true,\"urlKey\":\"officeId\"},{\"param\":\"tags\",\"global\":true,\"urlKey\":\"area\"}],\"skipScrollOnSearch\":false,\"scrollTargetSelector\":\".search-form\",\"hidePaginationOnFirstPage\":true,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":3,\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 3410} catch(e) { 3411console.log(e); 3412} 3413 try { 3414(function init(sectionDomId) { 3415 const $section = $("#" + sectionDomId); 3416 const $searchContainer = $section.find(".search-container"); 3417 const $officeSelect = $section.find('.js-office-input'); 3418 const $tagSelect = $section.find('.js-tag-input'); 3419 const $searchInput = $section.find('.js-search-input'); 3420 const $emptyMsg = $section.find('.js-empty-message'); 3421 const $dataContainer = $section.find('.data-container'); 3422 const $containter = $section.find('.js-container'); 3423 const officeFilter = $searchContainer.data('fetchOffices'); 3424 const $resetSearchInput = $searchContainer.find('.lp-input-reset'); 3425 convertSelectToDropdown($tagSelect); 3426 $resetSearchInput.on('click', function (event) { 3427 event.preventDefault(); 3428 $searchInput.val(''); 3429 onSearch(); 3430 }); 3431 $dataContainer.on("data", function () { 3432 $emptyMsg.removeClass("visible"); 3433 $containter.removeClass('no-data'); 3434 }); 3435 $dataContainer.on("no-data", function () { 3436 $emptyMsg.addClass("visible"); 3437 $containter.addClass('no-data'); 3438 }); 3439 $searchInput.on('input', window.luxuryPresence.debounce(onSearch, 1000)); 3440 function onSearch() { 3441 const params = {}; 3442 if (officeFilter) params.officeId = $officeSelect.val() === '' ? null : [$officeSelect.val()]; 3443 if ($tagSelect.length > 0) params.tags = $tagSelect.val() === '' ? null : [$tagSelect.val()]; 3444 params.search = $searchInput.val() || null; 3445 $searchContainer[0]?.dispatchEvent(new CustomEvent('search', { 3446 detail: params 3447 })); 3448 } 3449 if (!officeFilter && $tagSelect.length === 0) return; 3450 var previousOption = '';
3451 $searchContainer.on('offices-data', function (evt) { 3452 let { 3453 data 3454 } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 3455 data = evt.detail?.data || data; 3456 $officeSelect.append(data.map(office => `<option value="${office.id}">${office.name}</option>`).join("\n")); 3457 convertSelectToDropdown($officeSelect); 3458 }); 3459 function updateDropdown(select, value) { 3460 let $dropdown = $(select).next(); 3461 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 3462 let $dropdownContent = $dropdown.find(".custom-select-content"); 3463 let $selectedOption = $dropdownContent.find(`button[value="${value}"]`); 3464 function unselectOption() { 3465 $linkedOption = $originalSelect.find("option").eq(0); 3466 $linkedOption.prop("selected", true); 3467 $dropdownToggle.html($linkedOption.html()); 3468 $dropdownContent.find(".custom-select-item").removeClass("is-selected"); 3469 $originalSelect.change(); 3470 previousOption = ""; 3471 } 3472 if (!$selectedOption) return; 3473 if ($selectedOption.hasClass("is-disabled")) return; 3474 let elementNumber = $selectedOption.index(); 3475 let $originalSelect = $selectedOption.closest(".custom-select").siblings("select"); 3476 let $linkedOption = $originalSelect.find("option").eq(elementNumber); 3477 if (previousOption === value) { 3478 unselectOption(); 3479 return; 3480 } 3481 if (!$linkedOption.prop("selected")) { 3482 $linkedOption.prop("selected", true); 3483 previousOption = value; 3484 $originalSelect.change(); 3485 $selectedOption.addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected"); 3486 closeSelectMenu($selectedOption.closest(".custom-select-menu")); 3487 $dropdownToggle.html($linkedOption.html()); 3488 if ($linkedOption.val()) { 3489 $dropdownToggle.removeClass("is-placeholder"); 3490 $dropdown[$linkedOption.val() !== "" ? "addClass" : "removeClass"]("has-selection"); 3491 } else { 3492 $dropdown.removeClass("has-selection"); 3493 $dropdownToggle.addClass("is-placeholder"); 3494 } 3495 } 3496 } 3497 function convertSelectToDropdown(selectItem) { 3498 let customDropdown = ` 3499 <div class="custom-select" role="presentation"> 3500 <button class="custom-select-toggle" type="button" aria-haspopup="true" aria-expanded="false"></button> 3501 <div class="custom-select-menu"> 3502 <div class="custom-select-content"> 3503 </div> 3504 </div> 3505 </div>`; 3506 $(customDropdown).insertAfter(selectItem); 3507 let $dropdown = $(selectItem).next(); 3508 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 3509 let $dropdownMenu = $dropdown.find(".custom-select-menu"); 3510 let $dropdownContent = $dropdown.find(".custom-select-content"); 3511 $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select"); 3512 $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom"); 3513 $dropdownToggle.attr("data-name", $(selectItem).attr("name")); 3514 $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id")); 3515 appendOptionButtons(selectItem, $dropdownContent); 3516 $(selectItem).removeClass().addClass("sr-only"); 3517 $(selectItem).on("focus", function () { 3518 showSelectMenu($dropdownMenu[0]); 3519 $dropdownToggle.focus(); 3520 }); 3521 var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text(); 3522 $dropdownToggle.addClass("is-placeholder").html(toggleText); 3523 $dropdown.on("click", ".custom-select-item", function (e) { 3524 updateDropdown($(this).closest(".lp-input-group").find("select"), $(this).attr("value")); 3525 }); 3526 function convertOptionToButton(option) { 3527 var optionText = $(option).text(); 3528 var optionValue = $(option).attr("value") || $(option).text(); 3529 var optionIsDisabled = $(option).prop("disabled"); 3530 var outputButton = `<button value="${optionValue}" class="custom-select-item lp-icon" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`; 3531 return outputButton; 3532 } 3533 function appendOptionButtons(selectItem, appendTarget) { 3534 $(selectItem).find("option").each(function () { 3535 let currentButton = convertOptionToButton(this); 3536 $(appendTarget).append(currentButton); 3537 }); 3538 } 3539 function showSelectMenu(selectMenu) { 3540 var customSelect = $(selectMenu).closest(".custom-select")[0]; 3541 customSelect.classList.add('open'); 3542 $(selectMenu).slideDown(); 3543 } 3544 $dropdown.on("click", ".custom-select-toggle", function (e) { 3545 var $customSelect = $(this).closest(".custom-select"); 3546 var selectMenu = $customSelect.find(".custom-select-menu")[0]; 3547 if ($customSelect.hasClass("open")) { 3548 closeSelectMenu(selectMenu); 3549 } else { 3550 showSelectMenu(selectMenu); 3551 } 3552 }); 3553 $(document.body).on("click", function (e) { 3554 if (!$(e.target).closest(`#${sectionDomId} .js-select-input`).length) { 3555 $(`#${sectionDomId} .custom-select.open`).each(function () { 3556 const selectMenu = $(this).find(".custom-select-menu")[0]; 3557 closeSelectMenu(selectMenu); 3558 }); 3559 } 3560 }); 3561 } 3562 function closeSelectMenu(selectMenu) { 3563 var customSelect = $(selectMenu).closest(".custom-select")[0]; 3564 $(customSelect).removeClass("open"); 3565 $(selectMenu).slideUp(); 3566 } 3567 $officeSelect.change(onSearch); 3568 $tagSelect.change(onSearch); 3569})('section-40e257c9-edea-4cb8-9ee1-32c3ade9c174', JSON.parse("{\"resource\":\"agents\",\"useRouterApi\":false,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":3,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 3570} catch(e) { 3571console.log(e); 3572} 3573 try { 3574(function init(sectionDomId, options) { 3575 let section = null; 3576 switch (sectionDomId) { 3577 case 'NAVBAR': 3578 section = document.querySelector('body > nav, #global-navbar'); 3579 break; 3580 case 'FOOTER': 3581 section = document.querySelector('body > footer, #global-footer'); 3582 break; 3583 case 'SIDEMENU': 3584 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 3585 break; 3586 case 'CONTACT':
3587 section = document.querySelector('#modal-global-contact-us'); 3588 break; 3589 case 'MOBILE_CONTACT': 3590 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 3591 break; 3592 case 'SUBSCRIBE': 3593 // Subscribe Not Implemented 3594 section = null; 3595 break; 3596 case 'ACCOUNT': 3597 // Account Not Implemented 3598 section = null; 3599 break; 3600 default: 3601 section = document.querySelector('#' + sectionDomId); 3602 } 3603 if (!section) { 3604 return; 3605 } 3606 3607 // Where content / items are rendered 3608 const dataContainer = section.querySelector('.data-container'); 3609 if (!dataContainer) { 3610 // no place to render items = no need to query server or do anything else 3611 return; 3612 } 3613 let variables = options.variables || {}; 3614 3615 // Some variables in options may not have been injected - remove 3616 Object.keys(variables).forEach(function (variableName) { 3617 if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) { 3618 delete variables[variableName]; 3619 } 3620 }); 3621 3622 // Merge page query variables 3623 if (options.usePageResource) { 3624 variables = { 3625 ...variables, 3626 ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource] 3627 }; 3628 } 3629 3630 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Callers 3631 // resolve the flag — fetchData reads the section stamp, aux fetches read 3632 // their own resource's stamp (auxUsesRouter). 3633 function apiUrl(useRouter) { 3634 return options.url || (useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl); 3635 } 3636 3637 // ROUTER-CLEANUP: aux resources roll out on their own flag, not the section's 3638 // (options.routerApiAux is stamped per aux resource server-side). 3639 function auxUsesRouter(resource) { 3640 return !!(options.routerApiAux && options.routerApiAux[resource]); 3641 } 3642 3643 // Pagination Executes on a Numbered Pagination Container 3644 // Or via a load more button 3645 let mode = 'BUTTONLESS_PAGINATION'; 3646 const container = section.querySelector('.pagination-container');
3647 const loadMoreButton = section.querySelector(options?.loadMoreSelector); 3648 if (container) { 3649 mode = 'NUMBERED_PAGINATION'; 3650 } 3651 if (loadMoreButton) { 3652 mode = 'LOAD_MORE_BUTTON'; 3653 } 3654 let searchContainer = section.querySelector('.search-container'); 3655 const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false; 3656 const eventPrefix = '__pagination-'; 3657 const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{ 3658 param: 'neighborhoodId', 3659 urlKey: 'neighborhood' 3660 }, { 3661 param: 'search', 3662 urlKey: 'search' 3663 }, { 3664 param: 'salesPriceGTE', 3665 urlKey: 'pricemin', 3666 formKey: 'priceMin', 3667 type: 'int' 3668 }, { 3669 param: 'salesPriceLTE', 3670 urlKey: 'pricemax', 3671 formKey: 'priceMax', 3672 type: 'int' 3673 }, { 3674 param: 'livingSpaceSizeGTE', 3675 urlKey: 'areamin', 3676 formKey: 'areaMin', 3677 type: 'int' 3678 }, { 3679 param: 'livingSpaceSizeLTE', 3680 urlKey: 'areamax', 3681 formKey: 'areaMax', 3682 type: 'int' 3683 }] : []); 3684 3685 // Total entries - initialized in first render 3686 let totalNumber = 0; 3687 const DefaultSearchParams = { 3688 page: 1 3689 }; 3690 searchFormParams.forEach(function (formParam) { 3691 DefaultSearchParams[formParam.formKey || formParam.param] = null; 3692 }); 3693 let searchParams = { 3694 ...DefaultSearchParams 3695 }; 3696 const offset = options.variables?.offset || 0; 3697 let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section; 3698 let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100; 3699 3700 // entries of per page 3701 // when query variables for a given section would't be filled options.pageSize can store 3702 // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value 3703 let pageSize = parseInt(options.pageSize, 10) || 9; 3704 3705 // Adding mobile pageRange support 3706 var NARROW_BREAKPOINT = 600; 3707 var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT; 3708 var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`); 3709 3710 // Page range (pages on both sides of the current page) 3711 var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0; 3712 var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2; 3713 var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange; 3714 3715 // Whether to display the 'Previous' button 3716 var showPrevious = true; 3717 3718 // Whether to display the 'Next' button 3719 var showNext = true; 3720 3721 // Whether to display the page buttons 3722 var showPageNumbers = true; 3723 3724 // 'Previous' text 3725 var prevText = options.prevText || '«'; 3726 3727 // 'Next' text 3728 var nextText = options.nextText || '»'; 3729 3730 // Ellipsis text 3731 var ellipsisText = '…'; 3732 var classPrefix = 'paginationjs'; 3733 3734 // Default active class 3735 var activeClassName = 'active'; 3736 3737 // Default disable class 3738 var disableClassName = 'disabled'; 3739 3740 // Pagination element's position in the container 3741 var position = 'bottom'; 3742 3743 // Whether to trigger pagination at initialization 3744 var triggerPagingOnInit = !options.skipInitialLoad; 3745 var showFirstOnEllipsisShow = true; 3746 var showLastOnEllipsisShow = true; 3747 3748 // Instantiated in init() 3749 var el = null; 3750 3751 // Controls scrollTop logic 3752 var firstRender = true; 3753 var renderBySearch = false; 3754 var disabled = false; 3755 3756 // Pagination script class selector 3757 var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script'; 3758 3759 // Property Specific Image Override if No Image 3760 var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage; 3761 3762 // Construct template 3763 var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || ''; 3764 var template = Handlebars.compile(templateHTML); 3765 3766 // Initialize 3767 init(); 3768 function init() { 3769 Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 3770 3771 // Append/prepend pagination element to the pagination container 3772 if (mode === 'NUMBERED_PAGINATION') { 3773 el = document.createElement('div'); 3774 el.className = 'paginationjs';
3775 container[position === 'bottom' ? 'append' : 'prepend'](el); 3776 } 3777 if (searchContainer) { 3778 initSearchContainer({ 3779 fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true', 3780 fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true', 3781 fetchOffices: searchContainer.dataset.fetchOffices === 'true', 3782 fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true' 3783 }, function () { 3784 syncSearchFormState(searchParams); 3785 }); 3786 } 3787 3788 // Bind events 3789 observer(); 3790 } 3791 function syncSearchFormState(params) { 3792 searchContainer.dispatchEvent(new CustomEvent('sync', { 3793 detail: params 3794 })); 3795 } 3796 function initSearchContainer(options, done) { 3797 var promises = []; 3798 if (options.fetchNeighborhoods) { 3799 promises.push(fetchAllNeighborhoods(function (neighborhoods) { 3800 searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', { 3801 detail: { 3802 data: neighborhoods.map(function (item) { 3803 return { 3804 value: item.id, 3805 label: item.name 3806 }; 3807 }) 3808 } 3809 })); 3810 })); 3811 } 3812 if (options.fetchPostCategories) { 3813 promises.push(fetchPostCategories(function (categories) { 3814 searchContainer.dispatchEvent(new CustomEvent('post-categories-data', { 3815 detail: { 3816 data: categories 3817 } 3818 })); 3819 })); 3820 } 3821 if (options.fetchOffices) { 3822 promises.push(fetchOffices(function (offices) { 3823 searchContainer.dispatchEvent(new CustomEvent('offices-data', { 3824 detail: { 3825 data: offices 3826 } 3827 })); 3828 })); 3829 } 3830 if (options.fetchRentalRates) { 3831 promises.push(fetchAllRentalRates(function (rentalRates) { 3832 searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', { 3833 detail: { 3834 data: rentalRates 3835 } 3836 })); 3837 })); 3838 } 3839 if (promises.length > 0) { 3840 Promise.all(promises).then(function () { 3841 done(); 3842 }); 3843 } else { 3844 // element's custom code is not executed yet, so we're scheduling callback to after element's code 3845 setTimeout(done); 3846 } 3847 } 3848 function fetchAllNeighborhoods(done) { 3849 var useRouter = auxUsesRouter('neighborhoods'); 3850 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Same 3851 // args on both APIs (the federated neighborhoods field accepts 3852 // withProperties/withBlogPosts); only the selection set differs. 3853 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') + '}}'; 3854 var payload = {}; 3855 payload.offset = 0; 3856 payload.limit = 100; 3857 payload.companyId = variables.companyId; 3858 if (options.resource === 'properties') { 3859 payload.withProperties = { 3860 active: true 3861 }; 3862 ['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) { 3863 if (variables[field] !== undefined && variables[field] !== null) { 3864 payload.withProperties[field] = variables[field]; 3865 } 3866 }); 3867 } 3868 if (options.resource === 'posts') { 3869 payload.withBlogPosts = { 3870 active: true 3871 }; 3872 ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) { 3873 if (variables[field] !== undefined && variables[field] !== null) { 3874 payload.withBlogPosts[field] = variables[field]; 3875 } 3876 }); 3877 } 3878 3879 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3880 if (useRouter) { 3881 payload = window.luxuryPresence.routerApi.transformVariables('neighborhoods', payload); 3882 } 3883 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3884 query: gqlQuery, 3885 variables: payload 3886 }).then(function (res) { 3887 var value = res.body.data && res.body.data.neighborhoods || {}; 3888 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3889 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3890 done(items, items.length); 3891 }); 3892 } 3893 function fetchPostCategories(done) { 3894 var featured = options.resource === 'posts' && !!variables.featured; 3895 var useRouter = auxUsesRouter('postCategories'); 3896 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3897 // selection set differs ({ items {...} } on the router). 3898 var selection = 'id, name, publishedCount, featuredPublishedCount'; 3899 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) + '}}'; 3900 var payload = {}; 3901 payload.offset = 0; 3902 payload.limit = 100; 3903 payload.companyId = variables.companyId; 3904 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3905 query: gqlQuery, 3906 variables: payload 3907 }).then(function (res) { 3908 var value = res.body.data && res.body.data.postCategories || {}; 3909 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3910 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3911 done(items.map(function (item) { 3912 item.count = featured ? item.featuredPublishedCount : item.publishedCount; 3913 return item; 3914 }), items.length); 3915 }); 3916 } 3917 function fetchOffices(done) { 3918 var useRouter = auxUsesRouter('offices'); 3919 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 3920 // selection set differs ({ items {...} } on the router). 3921 var selection = 'id, name, tags'; 3922 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. The two 3923 // APIs differ in more than the items wrapper: federated offices takes 3924 // companyId: ID! (legacy gateway: String), so each branch builds its whole doc. 3925 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 + '}}'; 3926 var payload = { 3927 offset: 0, 3928 limit: 100, 3929 companyId: variables.companyId 3930 }; 3931 3932 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3933 if (useRouter) { 3934 payload = window.luxuryPresence.routerApi.transformVariables('office
3934s', payload); 3935 } 3936 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 3937 query: gqlQuery, 3938 variables: payload 3939 }).then(function (res) { 3940 var value = res.body.data && res.body.data.offices || {}; 3941 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3942 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 3943 done(items, items.length); 3944 }); 3945 } 3946 3947 // ROUTER-CLEANUP: no rentalRates field on the federated router — legacy only. 3948 function fetchAllRentalRates(done) { 3949 var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl; 3950 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}'; 3951 var payload = { 3952 offset: 0, 3953 limit: 100, 3954 companyId: variables.companyId 3955 }; 3956 superagent.post(url + '/graphql').withCredentials().send({ 3957 query: gqlQuery, 3958 variables: payload 3959 }).then(function (res) { 3960 var items = res.body.data && res.body.data.rentalRates || []; 3961 done(items, items.length); 3962 }).catch(function (err) { 3963 console.error('Error fetching rental rates:', err); 3964 done([], 0); 3965 }); 3966 } 3967 function fetchData(params, done) { 3968 var resource = options.resource; 3969 var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource]; 3970 var payload = {}; 3971 try { 3972 payload = JSON.parse(JSON.stringify(variables)); 3973 } catch (e) { 3974 Object.keys(variables).forEach(function (variableName) { 3975 payload[variableName] = variables[variableName]; 3976 }); 3977 } 3978 payload.offset = (params.page - 1) * pageSize + offset; 3979 payload.limit = pageSize; 3980 payload.companyId = options.companyId; 3981 searchFormParams.forEach(function (formParam) { 3982 var val = params[formParam.formKey || formParam.param]; 3983 if (val !== null && val !== undefined) { 3984 objSet(payload, formParam.param, val); 3985 } 3986 }); 3987 3988 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 3989 if (options.useRouterApi) { 3990 payload = window.luxuryPresence.routerApi.transformVariables(resource, payload); 3991 } 3992 3993 // TODO: Disabled loading due to jarring effect 3994 // dataContainer.html('Loading...'); 3995 superagent.post(apiUrl(options.useRouterApi) + '/graphql').withCredentials().send({ 3996 query: gqlQuery, 3997 variables: payload 3998 }).then(function (res) { 3999 if (res.body.errors) { 4000 done(res.body.errors); 4001 return; 4002 } 4003 var data = res.body.data || {}; 4004 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 4005 var resources; 4006 var resourceCount; 4007 if (options.useRouterApi) { 4008 var page = window.luxuryPresence.routerApi.transformPage(data[resource]); 4009 resources = window.luxuryPresence.routerApi.transformResponse(resource, page.items); 4010 resourceCount = page.count; 4011 } else { 4012 resources = data[resource] || []; 4013 resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0; 4014 } 4015 if (resource === 'properties' && propertyPlaceholderImage?.id) { 4016 resources = resources.map(resource => { 4017 if (resource.media?.length === 0) { 4018 return Object.assign(resource, { 4019 media: [propertyPlaceholderImage] 4020 }); 4021 } 4022 return resource; 4023 }); 4024 } 4025 done(null, resources, resourceCount); 4026 }); 4027 } 4028 function getTotalPage() { 4029 return Math.ceil(totalNumber / pageSize); 4030 } 4031 function renderPaginationList() { 4032 var totalPages = getTotalPage(); 4033 var rangeStart = searchParams.page - pageRange; 4034 var rangeEnd = searchParams.page + pageRange; 4035 if (rangeEnd > totalPages) { 4036 rangeEnd = totalPages; 4037 rangeStart = totalPages - pageRange * 2; 4038 rangeStart = rangeStart < 1 ? 1 : rangeStart; 4039 } 4040 if (rangeStart <= 1) { 4041 rangeStart = 1; 4042 rangeEnd = Math.min(pageRange * 2 + 1, totalPages); 4043 } 4044 4045 // Making sure that 1 more page button is shown in edge positions 4046 if (pageRange === 0) { 4047 if (searchParams.page === totalPages) { 4048 rangeStart = totalPages <= 1 ? 1 : totalPages - 1; 4049 } 4050 if (searchParams.page === 1) { 4051 rangeEnd = Math.min(2, totalPages); 4052 } 4053 } 4054 4055 // Render pagination list 4056 if (mode === 'NUMBERED_PAGINATION') { 4057 el.innerHTML = generateHTML({ 4058 currentPage: searchParams.page, 4059 pageRange: pageRange, 4060 rangeStart: rangeStart, 4061 rangeEnd: rangeEnd 4062 }); 4063 if (totalPages < 2 && hidePaginationOnFirstPage) { 4064 container.style.display = 'none'; 4065 } else { 4066 container.style.display = ''; 4067 } 4068 } else if (mode === 'LOAD_MORE_BUTTON') { 4069 if (searchParams.page >= totalPages) {
4070 loadMoreButton.style.display = 'none'; 4071 } else { 4072 loadMoreButton.style.display = ''; 4073 } 4074 } 4075 } 4076 function render(data) { 4077 renderPaginationList(); 4078 4079 // Render new content with handlebars 4080 var html = ''; 4081 if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) { 4082 // If using load more, append search results to existing results 4083 html = dataContainer.innerHTML; 4084 } 4085 for (var i = 0; i < data.length; i++) { 4086 var itemData = recursivelyParse(data[i]); 4087 itemData.sectionIndex = options.sectionIndex; 4088 itemData.renderOptions = options.renderOptions; 4089 html += template(itemData); 4090 } 4091 dataContainer.innerHTML = html; 4092 4093 // Scroll Top 4094 if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) { 4095 // Only animate to the top if we replace dataContainer (numbered pagination) 4096 setTimeout(() => { 4097 const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset; 4098 window.scrollTo({ 4099 top: scrollTargetOffsetTop, 4100 behavior: 'smooth' 4101 }); 4102 }, 250); 4103 } 4104 return true; 4105 } 4106 function generateHTML(args) { 4107 const totalPages = getTotalPage(); 4108 const { 4109 rangeStart, 4110 rangeEnd 4111 } = args; 4112 const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 4113 ...searchParams, 4114 page 4115 }); 4116 let html = ''; 4117 if (showPrevious || showPageNumbers || showNext) { 4118 html += '<div class="paginationjs-pages"><ul>'; 4119 4120 // Previous button 4121 if (showPrevious) { 4122 if (searchParams.page <= 1) { 4123 html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`; 4124 } else { 4125 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>`; 4126 } 4127 } 4128 4129 // Pages 4130 if (showPageNumbers) { 4131 if (rangeStart <= 3) { 4132 for (let i = 1; i < rangeStart; i++) { 4133 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>`; 4134 } 4135 } else { 4136 if (showFirstOnEllipsisShow) { 4137 html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`; 4138 } 4139 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 4140 } 4141 for (let i = rangeStart; i <= rangeEnd; i++) { 4142 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>`; 4143 } 4144 if (rangeEnd < totalPages - 2) { 4145 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 4146 if (showLastOnEllipsisShow) { 4147 html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`; 4148 } 4149 } else { 4150 for (let i = rangeEnd + 1; i <= totalPages; i++) { 4151 html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`; 4152 } 4153 } 4154 } 4155 4156 // Next button 4157 if (showNext) { 4158 if (searchParams.page >= totalPages) { 4159 html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`; 4160 } else { 4161 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>`; 4162 } 4163 } 4164 html += '</ul></div>'; 4165 } 4166 return html; 4167 } 4168 function go(newSearchParams, callback, restorationVisit) { 4169 if (disabled) return; 4170 var goToPageNumber = newSearchParams.page; 4171 4172 // Page number is out of bounds 4173 if (!goToPageNumber || goToPageNumber < 1) return; 4174 var totalPage = getTotalPage(); 4175 4176 // Page number is out of bounds 4177 if (!restorationVisit && totalNumber > 0) { 4178 if (goToPageNumber > totalPage) return; 4179 } 4180 if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
4181 var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 4182 ...newSearchParams, 4183 page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null 4184 }); 4185 if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) { 4186 window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, { 4187 queryString: true 4188 })); 4189 } 4190 } 4191 4192 // Fetch and update page 4193 fetchData(newSearchParams, renderWithData); 4194 disabled = true; 4195 function renderWithData(err, data, count) { 4196 if (err) { 4197 dataContainer.dispatchEvent(new Event('error')); 4198 } else { 4199 searchParams = { 4200 ...newSearchParams 4201 }; 4202 totalNumber = count - offset; 4203 if (data.length === 0) { 4204 dataContainer.dispatchEvent(new Event('no-data')); 4205 } else { 4206 dataContainer.dispatchEvent(new Event('data')); 4207 } 4208 render(data); 4209 firstRender = false; 4210 } 4211 disabled = false; 4212 renderBySearch = false; 4213 } 4214 } 4215 function areQueryParamsEqual(first, second) { 4216 var differ = Object.keys(first).find(function (key) { 4217 return first[key] !== undefined && first[key] !== null && first[key] !== second[key]; 4218 }); 4219 if (differ) { 4220 return false; 4221 } 4222 differ = Object.keys(second).find(function (key) { 4223 return second[key] !== undefined && second[key] !== null && second[key] !== first[key]; 4224 }); 4225 return !differ; 4226 } 4227 function next(callback) { 4228 go({ 4229 ...searchParams, 4230 page: searchParams.page + 1 4231 }, callback); 4232 } 4233 function previous(callback) { 4234 go({ 4235 ...searchParams, 4236 page: searchParams.page - 1 4237 }, callback); 4238 } 4239 function refresh(callback) { 4240 go(searchParams, callback); 4241 } 4242 function update(params, callback) { 4243 renderBySearch = true; 4244 go(params, callback); 4245 } 4246 function observer() { 4247 if (searchContainer) { 4248 searchContainer.addEventListener('search', function (event, newSearchParams) { 4249 newSearchParams = event.detail || newSearchParams; 4250 update({ 4251 ...searchParams, 4252 ...newSearchParams, 4253 page: 1 4254 }); 4255 }); 4256 searchContainer.addEventListener('clear-search', function () { 4257 const defaultSearchParams = { 4258 ...DefaultSearchParams 4259 }; 4260 const isCurrentSearchFormStateDefault = areQueryParamsEqual({ 4261 ...defaultSearchParams, 4262 page: null 4263 }, { 4264 ...searchParams, 4265 page: null 4266 }); 4267 4268 // if mode is LOAD_MORE_BUTTON we should't make anything on clear 4269 // when search form have default state 4270 if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') { 4271 return; 4272 } 4273 4274 // if someone initially go to some page and click 'Clear' on search from 4275 // we should't navigate to first page. We should preserve page value 4276 if (isCurrentSearchFormStateDefault) { 4277 defaultSearchParams.page = searchParams.page; 4278 } 4279 syncSearchFormState(defaultSearchParams); 4280 update(defaultSearchParams); 4281 }); 4282 } 4283 if (mode === 'LOAD_MORE_BUTTON') { 4284 loadMoreButton.addEventListener('click', function (event) { 4285 go({ 4286 ...searchParams, 4287 page: searchParams.page + 1 4288 }); 4289 return false; 4290 }); 4291 } 4292 if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') { 4293 // Do initial render 4294 go(Object.assign({}, searchParams, { 4295 page: 1 4296 })); 4297 return; 4298 } 4299 if (mode === 'NUMBERED_PAGINATION') { 4300 // Go to specified page number 4301 container.addEventListener(eventPrefix + 'go', function (event) { 4302 let { 4303 pageNumber, 4304 done 4305 } = event.detail || {}; 4306 pageNumber = parseInt(pageNumber, 10); 4307 if (!pageNumber) { 4308 return; 4309 } 4310 go({ 4311 ...searchParams, 4312 page: pageNumber 4313 }, done); 4314 }); 4315 4316 // Page number button click 4317 el.addEventListener('click', function (event) { 4318 let clickTarget = event.target; 4319 let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next'); 4320 let pageNumber = current?.getAttribute('data-num'); 4321 if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) { 4322 return; 4323 } else { 4324 go({ 4325 ...searchParams, 4326 page: parseInt(pageNumber, 10) 4327 }); 4328 } 4329 event.preventDefault(); 4330 }); 4331 4332 // Whether to load the default page 4333 var defaultPageNumber = searchParams.page; 4334 if (triggerPagingOnInit) {
4335 container.dispatchEvent(new CustomEvent(eventPrefix + 'go', { 4336 detail: { 4337 pageNumber: defaultPageNumber 4338 } 4339 })); 4340 } 4341 } 4342 window.addEventListener('popstate', function (event) { 4343 var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 4344 if (!areQueryParamsEqual(newParams, searchParams)) { 4345 go(newParams, null, true); 4346 if (searchContainer) { 4347 syncSearchFormState(newParams); 4348 } 4349 } 4350 }); 4351 } 4352 function replaceVariables(template, variables) { 4353 var formattedString; 4354 for (var key in variables) { 4355 var value = variables[key]; 4356 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 4357 formattedString = (formattedString || template).replace(regexp, value); 4358 } 4359 return formattedString; 4360 } 4361 function isTextEditorValue(obj) { 4362 return 'raw' in obj || 'gjs' in obj; 4363 } 4364 function getTextEditorValue(obj) { 4365 if (!obj.html) { 4366 return ''; 4367 } 4368 var data = obj.html; 4369 var css = (obj.raw || obj.gjs || {}).css; 4370 if (css) { 4371 data = data + '<style>' + css + '</style>'; 4372 } 4373 return data; 4374 } 4375 4376 /** 4377 * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor. 4378 * strips out raw proprties and returns only HTML if it exists. 4379 * @param {Object} resources a collection retrieved from the database 4380 * @return {Object} the newly modified object. 4381 */ 4382 function recursivelyParse(resources) { 4383 forEach(resources, function (value, key) { 4384 if (!value) { 4385 return; 4386 } 4387 if (value instanceof Object) { 4388 if (isTextEditorValue(value)) { 4389 resources[key] = getTextEditorValue(value); 4390 return; 4391 } else { 4392 return recursivelyParse(value); 4393 } 4394 } 4395 try { 4396 var parsedData = JSON.parse(value); 4397 if (isTextEditorValue(parsedData)) { 4398 resources[key] = getTextEditorValue(parsedData); 4399 } 4400 } catch (e) { 4401 // do nothing if we failed to parse value as JSON 4402 } 4403 }); 4404 return resources; 4405 } 4406 function forEach(collection, iteratee) { 4407 var func = Array.isArray(collection) ? arrayEach : baseFor; 4408 return func(collection, iteratee); 4409 } 4410 function baseFor(object, iteratee) { 4411 if (!object) { 4412 return; 4413 } 4414 var iterable = Object(object); 4415 var props = Object.keys(object); 4416 var length = props.length; 4417 var index = -1; 4418 while (length--) { 4419 var key = props[++index]; 4420 if (iteratee(iterable[key], key, iterable) === false) { 4421 break; 4422 } 4423 } 4424 return object; 4425 } 4426 function objSet(obj, path, value) { 4427 const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g); 4428 pathArray.reduce((acc, key, i) => { 4429 if (acc[key] === undefined) acc[key] = {}; 4430 if (i === pathArray.length - 1) acc[key] = value; 4431 return acc[key]; 4432 }, obj); 4433 } 4434 function arrayEach(array, iteratee) { 4435 var index = -1; 4436 var length = array.length; 4437 while (++index < length) { 4438 if (iteratee(array[index], index, array) === false) { 4439 break; 4440 } 4441 } 4442 return array; 4443 } 4444 function selectPageRangeMode(e) { 4445 pageRange = e.matches ? mobilePageRange : desktopPageRange; 4446 renderPaginationList(); 4447 } 4448 paginationMql.addEventListener('change', selectPageRangeMode); 4449})('section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9', JSON.parse("{\"pageSize\":\"3\",\"resource\":\"agents\",\"pageRange\":0,\"variables\":{\"limit\":3,\"offset\":0,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"categoryId\":\"{{pageElement.categoryId}}\",\"agentIds\":[\"79c24224-08a8-465d-bbe5-1aa21a8e451d\",\"44189d60-a252-41b5-8fdb-5e0caaa5dcfa\",\"9d5035ff-29b6-472d-bda8-fe57f2abea13\"]},\"searchFormParams\":[{\"param\":\"search\",\"urlKey\":\"search\"},{\"param\":\"officeId\",\"global\":true,\"urlKey\":\"officeId\"},{\"param\":\"tags\",\"global\":true,\"urlKey\":\"area\"}],\"skipScrollOnSearch\":false,\"scrollTargetSelector\":\".search-form\",\"hidePaginationOnFirstPage\":true,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":4,\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 4450} catch(e) { 4451console.log(e); 4452} 4453 try { 4454(function init(sectionDomId) { 4455 const $section = $("#" + sectionDomId); 4456 const $searchContainer = $section.find(".search-container"); 4457 const $officeSelect = $section.find('.js-office-input'); 4458 const $tagSelect = $section.find('.js-tag-input'); 4459 const $searchInput = $section.find('.js-search-input'); 4460 const $emptyMsg = $section.find('.js-empty-message'); 4461 const $dataContainer = $section.find('.data-container'); 4462 const $containter = $section.find('.js-container'); 4463 const officeFilter = $searchContainer.data('fetchOffices'); 4464 const $resetSearchInput = $searchContainer.find('.lp-input-reset'); 4465 convertSelectToDropdown($tagSelect); 4466 $resetSearchInput.on('click', function (event) { 4467 event.preventDefault(); 4468 $searchInput.val(''); 4469 onSearch(); 4470 }); 4471 $dataContainer.on("data", function () { 4472 $emptyMsg.removeClass("visible"); 4473 $containter.removeClass('no-data'); 4474 }); 4475 $dataContainer.on("no-data", function () { 4476 $emptyMsg.addClass("visible"); 4477 $containter.addClass('no-data'); 4478 }); 4479 $searchInput.on('input', window.luxuryPresence.debounce(onSearch, 1000)); 4480 function onSearch() { 4481 const params = {}; 4482 if (officeFilter) params.officeId = $officeSelect.val() === '' ? null : [$officeSelect.val()]; 4483 if ($tagSelect.length > 0) params.tags = $tagSelect.val() === '' ? null : [$tagSelect.val()]; 4484 params.search = $searchInput.val() || null; 4485 $searchContainer[0]?.dispatchEvent(new CustomEvent('search', { 4486 detail: params 4487 })); 4488 } 4489 if (!officeFilter && $tagSelect.length === 0) return; 4490 var previousOption = '';
4491 $searchContainer.on('offices-data', function (evt) { 4492 let { 4493 data 4494 } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 4495 data = evt.detail?.data || data; 4496 $officeSelect.append(data.map(office => `<option value="${office.id}">${office.name}</option>`).join("\n")); 4497 convertSelectToDropdown($officeSelect); 4498 }); 4499 function updateDropdown(select, value) { 4500 let $dropdown = $(select).next(); 4501 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 4502 let $dropdownContent = $dropdown.find(".custom-select-content"); 4503 let $selectedOption = $dropdownContent.find(`button[value="${value}"]`); 4504 function unselectOption() { 4505 $linkedOption = $originalSelect.find("option").eq(0); 4506 $linkedOption.prop("selected", true); 4507 $dropdownToggle.html($linkedOption.html()); 4508 $dropdownContent.find(".custom-select-item").removeClass("is-selected"); 4509 $originalSelect.change(); 4510 previousOption = ""; 4511 } 4512 if (!$selectedOption) return; 4513 if ($selectedOption.hasClass("is-disabled")) return; 4514 let elementNumber = $selectedOption.index(); 4515 let $originalSelect = $selectedOption.closest(".custom-select").siblings("select"); 4516 let $linkedOption = $originalSelect.find("option").eq(elementNumber); 4517 if (previousOption === value) { 4518 unselectOption(); 4519 return; 4520 } 4521 if (!$linkedOption.prop("selected")) { 4522 $linkedOption.prop("selected", true); 4523 previousOption = value; 4524 $originalSelect.change(); 4525 $selectedOption.addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected"); 4526 closeSelectMenu($selectedOption.closest(".custom-select-menu")); 4527 $dropdownToggle.html($linkedOption.html()); 4528 if ($linkedOption.val()) { 4529 $dropdownToggle.removeClass("is-placeholder"); 4530 $dropdown[$linkedOption.val() !== "" ? "addClass" : "removeClass"]("has-selection"); 4531 } else { 4532 $dropdown.removeClass("has-selection"); 4533 $dropdownToggle.addClass("is-placeholder"); 4534 } 4535 } 4536 } 4537 function convertSelectToDropdown(selectItem) { 4538 let customDropdown = ` 4539 <div class="custom-select" role="presentation"> 4540 <button class="custom-select-toggle" type="button" aria-haspopup="true" aria-expanded="false"></button> 4541 <div class="custom-select-menu"> 4542 <div class="custom-select-content"> 4543 </div> 4544 </div> 4545 </div>`; 4546 $(customDropdown).insertAfter(selectItem); 4547 let $dropdown = $(selectItem).next(); 4548 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 4549 let $dropdownMenu = $dropdown.find(".custom-select-menu"); 4550 let $dropdownContent = $dropdown.find(".custom-select-content"); 4551 $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select"); 4552 $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom"); 4553 $dropdownToggle.attr("data-name", $(selectItem).attr("name")); 4554 $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id")); 4555 appendOptionButtons(selectItem, $dropdownContent); 4556 $(selectItem).removeClass().addClass("sr-only"); 4557 $(selectItem).on("focus", function () { 4558 showSelectMenu($dropdownMenu[0]); 4559 $dropdownToggle.focus(); 4560 }); 4561 var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text(); 4562 $dropdownToggle.addClass("is-placeholder").html(toggleText); 4563 $dropdown.on("click", ".custom-select-item", function (e) { 4564 updateDropdown($(this).closest(".lp-input-group").find("select"), $(this).attr("value")); 4565 }); 4566 function convertOptionToButton(option) { 4567 var optionText = $(option).text(); 4568 var optionValue = $(option).attr("value") || $(option).text(); 4569 var optionIsDisabled = $(option).prop("disabled"); 4570 var outputButton = `<button value="${optionValue}" class="custom-select-item lp-icon" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`; 4571 return outputButton; 4572 } 4573 function appendOptionButtons(selectItem, appendTarget) { 4574 $(selectItem).find("option").each(function () { 4575 let currentButton = convertOptionToButton(this); 4576 $(appendTarget).append(currentButton); 4577 }); 4578 } 4579 function showSelectMenu(selectMenu) { 4580 var customSelect = $(selectMenu).closest(".custom-select")[0]; 4581 customSelect.classList.add('open'); 4582 $(selectMenu).slideDown(); 4583 } 4584 $dropdown.on("click", ".custom-select-toggle", function (e) { 4585 var $customSelect = $(this).closest(".custom-select"); 4586 var selectMenu = $customSelect.find(".custom-select-menu")[0]; 4587 if ($customSelect.hasClass("open")) { 4588 closeSelectMenu(selectMenu); 4589 } else { 4590 showSelectMenu(selectMenu); 4591 } 4592 }); 4593 $(document.body).on("click", function (e) { 4594 if (!$(e.target).closest(`#${sectionDomId} .js-select-input`).length) { 4595 $(`#${sectionDomId} .custom-select.open`).each(function () { 4596 const selectMenu = $(this).find(".custom-select-menu")[0]; 4597 closeSelectMenu(selectMenu); 4598 }); 4599 } 4600 }); 4601 } 4602 function closeSelectMenu(selectMenu) { 4603 var customSelect = $(selectMenu).closest(".custom-select")[0]; 4604 $(customSelect).removeClass("open"); 4605 $(selectMenu).slideUp(); 4606 } 4607 $officeSelect.change(onSearch); 4608 $tagSelect.change(onSearch); 4609})('section-439bbb2d-a7c3-4707-8b5f-73fd8b5c86e9', JSON.parse("{\"resource\":\"agents\",\"useRouterApi\":false,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":4,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 4610} catch(e) { 4611console.log(e); 4612} 4613 try { 4614(function init(sectionDomId, options) { 4615 let section = null; 4616 switch (sectionDomId) { 4617 case 'NAVBAR': 4618 section = document.querySelector('body > nav, #global-navbar'); 4619 break; 4620 case 'FOOTER': 4621 section = document.querySelector('body > footer, #global-footer'); 4622 break; 4623 case 'SIDEMENU': 4624 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 4625 break; 4626 case 'CONTACT':
4627 section = document.querySelector('#modal-global-contact-us'); 4628 break; 4629 case 'MOBILE_CONTACT': 4630 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 4631 break; 4632 case 'SUBSCRIBE': 4633 // Subscribe Not Implemented 4634 section = null; 4635 break; 4636 case 'ACCOUNT': 4637 // Account Not Implemented 4638 section = null; 4639 break; 4640 default: 4641 section = document.querySelector('#' + sectionDomId); 4642 } 4643 if (!section) { 4644 return; 4645 } 4646 4647 // Where content / items are rendered 4648 const dataContainer = section.querySelector('.data-container'); 4649 if (!dataContainer) { 4650 // no place to render items = no need to query server or do anything else 4651 return; 4652 } 4653 let variables = options.variables || {}; 4654 4655 // Some variables in options may not have been injected - remove 4656 Object.keys(variables).forEach(function (variableName) { 4657 if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) { 4658 delete variables[variableName]; 4659 } 4660 }); 4661 4662 // Merge page query variables 4663 if (options.usePageResource) { 4664 variables = { 4665 ...variables, 4666 ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource] 4667 }; 4668 } 4669 4670 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Callers 4671 // resolve the flag — fetchData reads the section stamp, aux fetches read 4672 // their own resource's stamp (auxUsesRouter). 4673 function apiUrl(useRouter) { 4674 return options.url || (useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl); 4675 } 4676 4677 // ROUTER-CLEANUP: aux resources roll out on their own flag, not the section's 4678 // (options.routerApiAux is stamped per aux resource server-side). 4679 function auxUsesRouter(resource) { 4680 return !!(options.routerApiAux && options.routerApiAux[resource]); 4681 } 4682 4683 // Pagination Executes on a Numbered Pagination Container 4684 // Or via a load more button 4685 let mode = 'BUTTONLESS_PAGINATION'; 4686 const container = section.querySelector('.pagination-container');
4687 const loadMoreButton = section.querySelector(options?.loadMoreSelector); 4688 if (container) { 4689 mode = 'NUMBERED_PAGINATION'; 4690 } 4691 if (loadMoreButton) { 4692 mode = 'LOAD_MORE_BUTTON'; 4693 } 4694 let searchContainer = section.querySelector('.search-container'); 4695 const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false; 4696 const eventPrefix = '__pagination-'; 4697 const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{ 4698 param: 'neighborhoodId', 4699 urlKey: 'neighborhood' 4700 }, { 4701 param: 'search', 4702 urlKey: 'search' 4703 }, { 4704 param: 'salesPriceGTE', 4705 urlKey: 'pricemin', 4706 formKey: 'priceMin', 4707 type: 'int' 4708 }, { 4709 param: 'salesPriceLTE', 4710 urlKey: 'pricemax', 4711 formKey: 'priceMax', 4712 type: 'int' 4713 }, { 4714 param: 'livingSpaceSizeGTE', 4715 urlKey: 'areamin', 4716 formKey: 'areaMin', 4717 type: 'int' 4718 }, { 4719 param: 'livingSpaceSizeLTE', 4720 urlKey: 'areamax', 4721 formKey: 'areaMax', 4722 type: 'int' 4723 }] : []); 4724 4725 // Total entries - initialized in first render 4726 let totalNumber = 0; 4727 const DefaultSearchParams = { 4728 page: 1 4729 }; 4730 searchFormParams.forEach(function (formParam) { 4731 DefaultSearchParams[formParam.formKey || formParam.param] = null; 4732 }); 4733 let searchParams = { 4734 ...DefaultSearchParams 4735 }; 4736 const offset = options.variables?.offset || 0; 4737 let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section; 4738 let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100; 4739 4740 // entries of per page 4741 // when query variables for a given section would't be filled options.pageSize can store 4742 // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value 4743 let pageSize = parseInt(options.pageSize, 10) || 9; 4744 4745 // Adding mobile pageRange support 4746 var NARROW_BREAKPOINT = 600; 4747 var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT; 4748 var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`); 4749 4750 // Page range (pages on both sides of the current page) 4751 var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0; 4752 var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2; 4753 var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange; 4754 4755 // Whether to display the 'Previous' button 4756 var showPrevious = true; 4757 4758 // Whether to display the 'Next' button 4759 var showNext = true; 4760 4761 // Whether to display the page buttons 4762 var showPageNumbers = true; 4763 4764 // 'Previous' text 4765 var prevText = options.prevText || '«'; 4766 4767 // 'Next' text 4768 var nextText = options.nextText || '»'; 4769 4770 // Ellipsis text 4771 var ellipsisText = '…'; 4772 var classPrefix = 'paginationjs'; 4773 4774 // Default active class 4775 var activeClassName = 'active'; 4776 4777 // Default disable class 4778 var disableClassName = 'disabled'; 4779 4780 // Pagination element's position in the container 4781 var position = 'bottom'; 4782 4783 // Whether to trigger pagination at initialization 4784 var triggerPagingOnInit = !options.skipInitialLoad; 4785 var showFirstOnEllipsisShow = true; 4786 var showLastOnEllipsisShow = true; 4787 4788 // Instantiated in init() 4789 var el = null; 4790 4791 // Controls scrollTop logic 4792 var firstRender = true; 4793 var renderBySearch = false; 4794 var disabled = false; 4795 4796 // Pagination script class selector 4797 var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script'; 4798 4799 // Property Specific Image Override if No Image 4800 var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage; 4801 4802 // Construct template 4803 var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || ''; 4804 var template = Handlebars.compile(templateHTML); 4805 4806 // Initialize 4807 init(); 4808 function init() { 4809 Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 4810 4811 // Append/prepend pagination element to the pagination container 4812 if (mode === 'NUMBERED_PAGINATION') { 4813 el = document.createElement('div'); 4814 el.className = 'paginationjs';
4815 container[position === 'bottom' ? 'append' : 'prepend'](el); 4816 } 4817 if (searchContainer) { 4818 initSearchContainer({ 4819 fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true', 4820 fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true', 4821 fetchOffices: searchContainer.dataset.fetchOffices === 'true', 4822 fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true' 4823 }, function () { 4824 syncSearchFormState(searchParams); 4825 }); 4826 } 4827 4828 // Bind events 4829 observer(); 4830 } 4831 function syncSearchFormState(params) { 4832 searchContainer.dispatchEvent(new CustomEvent('sync', { 4833 detail: params 4834 })); 4835 } 4836 function initSearchContainer(options, done) { 4837 var promises = []; 4838 if (options.fetchNeighborhoods) { 4839 promises.push(fetchAllNeighborhoods(function (neighborhoods) { 4840 searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', { 4841 detail: { 4842 data: neighborhoods.map(function (item) { 4843 return { 4844 value: item.id, 4845 label: item.name 4846 }; 4847 }) 4848 } 4849 })); 4850 })); 4851 } 4852 if (options.fetchPostCategories) { 4853 promises.push(fetchPostCategories(function (categories) { 4854 searchContainer.dispatchEvent(new CustomEvent('post-categories-data', { 4855 detail: { 4856 data: categories 4857 } 4858 })); 4859 })); 4860 } 4861 if (options.fetchOffices) { 4862 promises.push(fetchOffices(function (offices) { 4863 searchContainer.dispatchEvent(new CustomEvent('offices-data', { 4864 detail: { 4865 data: offices 4866 } 4867 })); 4868 })); 4869 } 4870 if (options.fetchRentalRates) { 4871 promises.push(fetchAllRentalRates(function (rentalRates) { 4872 searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', { 4873 detail: { 4874 data: rentalRates 4875 } 4876 })); 4877 })); 4878 } 4879 if (promises.length > 0) { 4880 Promise.all(promises).then(function () { 4881 done(); 4882 }); 4883 } else { 4884 // element's custom code is not executed yet, so we're scheduling callback to after element's code 4885 setTimeout(done); 4886 } 4887 } 4888 function fetchAllNeighborhoods(done) { 4889 var useRouter = auxUsesRouter('neighborhoods'); 4890 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Same 4891 // args on both APIs (the federated neighborhoods field accepts 4892 // withProperties/withBlogPosts); only the selection set differs. 4893 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') + '}}'; 4894 var payload = {}; 4895 payload.offset = 0; 4896 payload.limit = 100; 4897 payload.companyId = variables.companyId; 4898 if (options.resource === 'properties') { 4899 payload.withProperties = { 4900 active: true 4901 }; 4902 ['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) { 4903 if (variables[field] !== undefined && variables[field] !== null) { 4904 payload.withProperties[field] = variables[field]; 4905 } 4906 }); 4907 } 4908 if (options.resource === 'posts') { 4909 payload.withBlogPosts = { 4910 active: true 4911 }; 4912 ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) { 4913 if (variables[field] !== undefined && variables[field] !== null) { 4914 payload.withBlogPosts[field] = variables[field]; 4915 } 4916 }); 4917 } 4918 4919 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 4920 if (useRouter) { 4921 payload = window.luxuryPresence.routerApi.transformVariables('neighborhoods', payload); 4922 } 4923 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 4924 query: gqlQuery, 4925 variables: payload 4926 }).then(function (res) { 4927 var value = res.body.data && res.body.data.neighborhoods || {}; 4928 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 4929 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 4930 done(items, items.length); 4931 }); 4932 } 4933 function fetchPostCategories(done) { 4934 var featured = options.resource === 'posts' && !!variables.featured; 4935 var useRouter = auxUsesRouter('postCategories'); 4936 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 4937 // selection set differs ({ items {...} } on the router). 4938 var selection = 'id, name, publishedCount, featuredPublishedCount'; 4939 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) + '}}'; 4940 var payload = {}; 4941 payload.offset = 0; 4942 payload.limit = 100; 4943 payload.companyId = variables.companyId; 4944 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 4945 query: gqlQuery, 4946 variables: payload 4947 }).then(function (res) { 4948 var value = res.body.data && res.body.data.postCategories || {}; 4949 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 4950 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 4951 done(items.map(function (item) { 4952 item.count = featured ? item.featuredPublishedCount : item.publishedCount; 4953 return item; 4954 }), items.length); 4955 }); 4956 } 4957 function fetchOffices(done) { 4958 var useRouter = auxUsesRouter('offices'); 4959 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 4960 // selection set differs ({ items {...} } on the router). 4961 var selection = 'id, name, tags'; 4962 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. The two 4963 // APIs differ in more than the items wrapper: federated offices takes 4964 // companyId: ID! (legacy gateway: String), so each branch builds its whole doc. 4965 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 + '}}'; 4966 var payload = { 4967 offset: 0, 4968 limit: 100, 4969 companyId: variables.companyId 4970 }; 4971 4972 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 4973 if (useRouter) { 4974 payload = window.luxuryPresence.routerApi.transformVariables('office
4974s', payload); 4975 } 4976 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 4977 query: gqlQuery, 4978 variables: payload 4979 }).then(function (res) { 4980 var value = res.body.data && res.body.data.offices || {}; 4981 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 4982 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 4983 done(items, items.length); 4984 }); 4985 } 4986 4987 // ROUTER-CLEANUP: no rentalRates field on the federated router — legacy only. 4988 function fetchAllRentalRates(done) { 4989 var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl; 4990 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}'; 4991 var payload = { 4992 offset: 0, 4993 limit: 100, 4994 companyId: variables.companyId 4995 }; 4996 superagent.post(url + '/graphql').withCredentials().send({ 4997 query: gqlQuery, 4998 variables: payload 4999 }).then(function (res) { 5000 var items = res.body.data && res.body.data.rentalRates || []; 5001 done(items, items.length); 5002 }).catch(function (err) { 5003 console.error('Error fetching rental rates:', err); 5004 done([], 0); 5005 }); 5006 } 5007 function fetchData(params, done) { 5008 var resource = options.resource; 5009 var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource]; 5010 var payload = {}; 5011 try { 5012 payload = JSON.parse(JSON.stringify(variables)); 5013 } catch (e) { 5014 Object.keys(variables).forEach(function (variableName) { 5015 payload[variableName] = variables[variableName]; 5016 }); 5017 } 5018 payload.offset = (params.page - 1) * pageSize + offset; 5019 payload.limit = pageSize; 5020 payload.companyId = options.companyId; 5021 searchFormParams.forEach(function (formParam) { 5022 var val = params[formParam.formKey || formParam.param]; 5023 if (val !== null && val !== undefined) { 5024 objSet(payload, formParam.param, val); 5025 } 5026 }); 5027 5028 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 5029 if (options.useRouterApi) { 5030 payload = window.luxuryPresence.routerApi.transformVariables(resource, payload); 5031 } 5032 5033 // TODO: Disabled loading due to jarring effect 5034 // dataContainer.html('Loading...'); 5035 superagent.post(apiUrl(options.useRouterApi) + '/graphql').withCredentials().send({ 5036 query: gqlQuery, 5037 variables: payload 5038 }).then(function (res) { 5039 if (res.body.errors) { 5040 done(res.body.errors); 5041 return; 5042 } 5043 var data = res.body.data || {}; 5044 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 5045 var resources; 5046 var resourceCount; 5047 if (options.useRouterApi) { 5048 var page = window.luxuryPresence.routerApi.transformPage(data[resource]); 5049 resources = window.luxuryPresence.routerApi.transformResponse(resource, page.items); 5050 resourceCount = page.count; 5051 } else { 5052 resources = data[resource] || []; 5053 resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0; 5054 } 5055 if (resource === 'properties' && propertyPlaceholderImage?.id) { 5056 resources = resources.map(resource => { 5057 if (resource.media?.length === 0) { 5058 return Object.assign(resource, { 5059 media: [propertyPlaceholderImage] 5060 }); 5061 } 5062 return resource; 5063 }); 5064 } 5065 done(null, resources, resourceCount); 5066 }); 5067 } 5068 function getTotalPage() { 5069 return Math.ceil(totalNumber / pageSize); 5070 } 5071 function renderPaginationList() { 5072 var totalPages = getTotalPage(); 5073 var rangeStart = searchParams.page - pageRange; 5074 var rangeEnd = searchParams.page + pageRange; 5075 if (rangeEnd > totalPages) { 5076 rangeEnd = totalPages; 5077 rangeStart = totalPages - pageRange * 2; 5078 rangeStart = rangeStart < 1 ? 1 : rangeStart; 5079 } 5080 if (rangeStart <= 1) { 5081 rangeStart = 1; 5082 rangeEnd = Math.min(pageRange * 2 + 1, totalPages); 5083 } 5084 5085 // Making sure that 1 more page button is shown in edge positions 5086 if (pageRange === 0) { 5087 if (searchParams.page === totalPages) { 5088 rangeStart = totalPages <= 1 ? 1 : totalPages - 1; 5089 } 5090 if (searchParams.page === 1) { 5091 rangeEnd = Math.min(2, totalPages); 5092 } 5093 } 5094 5095 // Render pagination list 5096 if (mode === 'NUMBERED_PAGINATION') { 5097 el.innerHTML = generateHTML({ 5098 currentPage: searchParams.page, 5099 pageRange: pageRange, 5100 rangeStart: rangeStart, 5101 rangeEnd: rangeEnd 5102 }); 5103 if (totalPages < 2 && hidePaginationOnFirstPage) { 5104 container.style.display = 'none'; 5105 } else { 5106 container.style.display = ''; 5107 } 5108 } else if (mode === 'LOAD_MORE_BUTTON') { 5109 if (searchParams.page >= totalPages) {
5110 loadMoreButton.style.display = 'none'; 5111 } else { 5112 loadMoreButton.style.display = ''; 5113 } 5114 } 5115 } 5116 function render(data) { 5117 renderPaginationList(); 5118 5119 // Render new content with handlebars 5120 var html = ''; 5121 if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) { 5122 // If using load more, append search results to existing results 5123 html = dataContainer.innerHTML; 5124 } 5125 for (var i = 0; i < data.length; i++) { 5126 var itemData = recursivelyParse(data[i]); 5127 itemData.sectionIndex = options.sectionIndex; 5128 itemData.renderOptions = options.renderOptions; 5129 html += template(itemData); 5130 } 5131 dataContainer.innerHTML = html; 5132 5133 // Scroll Top 5134 if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) { 5135 // Only animate to the top if we replace dataContainer (numbered pagination) 5136 setTimeout(() => { 5137 const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset; 5138 window.scrollTo({ 5139 top: scrollTargetOffsetTop, 5140 behavior: 'smooth' 5141 }); 5142 }, 250); 5143 } 5144 return true; 5145 } 5146 function generateHTML(args) { 5147 const totalPages = getTotalPage(); 5148 const { 5149 rangeStart, 5150 rangeEnd 5151 } = args; 5152 const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 5153 ...searchParams, 5154 page 5155 }); 5156 let html = ''; 5157 if (showPrevious || showPageNumbers || showNext) { 5158 html += '<div class="paginationjs-pages"><ul>'; 5159 5160 // Previous button 5161 if (showPrevious) { 5162 if (searchParams.page <= 1) { 5163 html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`; 5164 } else { 5165 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>`; 5166 } 5167 } 5168 5169 // Pages 5170 if (showPageNumbers) { 5171 if (rangeStart <= 3) { 5172 for (let i = 1; i < rangeStart; i++) { 5173 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>`; 5174 } 5175 } else { 5176 if (showFirstOnEllipsisShow) { 5177 html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`; 5178 } 5179 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 5180 } 5181 for (let i = rangeStart; i <= rangeEnd; i++) { 5182 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>`; 5183 } 5184 if (rangeEnd < totalPages - 2) { 5185 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 5186 if (showLastOnEllipsisShow) { 5187 html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`; 5188 } 5189 } else { 5190 for (let i = rangeEnd + 1; i <= totalPages; i++) { 5191 html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`; 5192 } 5193 } 5194 } 5195 5196 // Next button 5197 if (showNext) { 5198 if (searchParams.page >= totalPages) { 5199 html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`; 5200 } else { 5201 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>`; 5202 } 5203 } 5204 html += '</ul></div>'; 5205 } 5206 return html; 5207 } 5208 function go(newSearchParams, callback, restorationVisit) { 5209 if (disabled) return; 5210 var goToPageNumber = newSearchParams.page; 5211 5212 // Page number is out of bounds 5213 if (!goToPageNumber || goToPageNumber < 1) return; 5214 var totalPage = getTotalPage(); 5215 5216 // Page number is out of bounds 5217 if (!restorationVisit && totalNumber > 0) { 5218 if (goToPageNumber > totalPage) return; 5219 } 5220 if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
5221 var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 5222 ...newSearchParams, 5223 page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null 5224 }); 5225 if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) { 5226 window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, { 5227 queryString: true 5228 })); 5229 } 5230 } 5231 5232 // Fetch and update page 5233 fetchData(newSearchParams, renderWithData); 5234 disabled = true; 5235 function renderWithData(err, data, count) { 5236 if (err) { 5237 dataContainer.dispatchEvent(new Event('error')); 5238 } else { 5239 searchParams = { 5240 ...newSearchParams 5241 }; 5242 totalNumber = count - offset; 5243 if (data.length === 0) { 5244 dataContainer.dispatchEvent(new Event('no-data')); 5245 } else { 5246 dataContainer.dispatchEvent(new Event('data')); 5247 } 5248 render(data); 5249 firstRender = false; 5250 } 5251 disabled = false; 5252 renderBySearch = false; 5253 } 5254 } 5255 function areQueryParamsEqual(first, second) { 5256 var differ = Object.keys(first).find(function (key) { 5257 return first[key] !== undefined && first[key] !== null && first[key] !== second[key]; 5258 }); 5259 if (differ) { 5260 return false; 5261 } 5262 differ = Object.keys(second).find(function (key) { 5263 return second[key] !== undefined && second[key] !== null && second[key] !== first[key]; 5264 }); 5265 return !differ; 5266 } 5267 function next(callback) { 5268 go({ 5269 ...searchParams, 5270 page: searchParams.page + 1 5271 }, callback); 5272 } 5273 function previous(callback) { 5274 go({ 5275 ...searchParams, 5276 page: searchParams.page - 1 5277 }, callback); 5278 } 5279 function refresh(callback) { 5280 go(searchParams, callback); 5281 } 5282 function update(params, callback) { 5283 renderBySearch = true; 5284 go(params, callback); 5285 } 5286 function observer() { 5287 if (searchContainer) { 5288 searchContainer.addEventListener('search', function (event, newSearchParams) { 5289 newSearchParams = event.detail || newSearchParams; 5290 update({ 5291 ...searchParams, 5292 ...newSearchParams, 5293 page: 1 5294 }); 5295 }); 5296 searchContainer.addEventListener('clear-search', function () { 5297 const defaultSearchParams = { 5298 ...DefaultSearchParams 5299 }; 5300 const isCurrentSearchFormStateDefault = areQueryParamsEqual({ 5301 ...defaultSearchParams, 5302 page: null 5303 }, { 5304 ...searchParams, 5305 page: null 5306 }); 5307 5308 // if mode is LOAD_MORE_BUTTON we should't make anything on clear 5309 // when search form have default state 5310 if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') { 5311 return; 5312 } 5313 5314 // if someone initially go to some page and click 'Clear' on search from 5315 // we should't navigate to first page. We should preserve page value 5316 if (isCurrentSearchFormStateDefault) { 5317 defaultSearchParams.page = searchParams.page; 5318 } 5319 syncSearchFormState(defaultSearchParams); 5320 update(defaultSearchParams); 5321 }); 5322 } 5323 if (mode === 'LOAD_MORE_BUTTON') { 5324 loadMoreButton.addEventListener('click', function (event) { 5325 go({ 5326 ...searchParams, 5327 page: searchParams.page + 1 5328 }); 5329 return false; 5330 }); 5331 } 5332 if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') { 5333 // Do initial render 5334 go(Object.assign({}, searchParams, { 5335 page: 1 5336 })); 5337 return; 5338 } 5339 if (mode === 'NUMBERED_PAGINATION') { 5340 // Go to specified page number 5341 container.addEventListener(eventPrefix + 'go', function (event) { 5342 let { 5343 pageNumber, 5344 done 5345 } = event.detail || {}; 5346 pageNumber = parseInt(pageNumber, 10); 5347 if (!pageNumber) { 5348 return; 5349 } 5350 go({ 5351 ...searchParams, 5352 page: pageNumber 5353 }, done); 5354 }); 5355 5356 // Page number button click 5357 el.addEventListener('click', function (event) { 5358 let clickTarget = event.target; 5359 let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next'); 5360 let pageNumber = current?.getAttribute('data-num'); 5361 if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) { 5362 return; 5363 } else { 5364 go({ 5365 ...searchParams, 5366 page: parseInt(pageNumber, 10) 5367 }); 5368 } 5369 event.preventDefault(); 5370 }); 5371 5372 // Whether to load the default page 5373 var defaultPageNumber = searchParams.page; 5374 if (triggerPagingOnInit) {
5375 container.dispatchEvent(new CustomEvent(eventPrefix + 'go', { 5376 detail: { 5377 pageNumber: defaultPageNumber 5378 } 5379 })); 5380 } 5381 } 5382 window.addEventListener('popstate', function (event) { 5383 var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 5384 if (!areQueryParamsEqual(newParams, searchParams)) { 5385 go(newParams, null, true); 5386 if (searchContainer) { 5387 syncSearchFormState(newParams); 5388 } 5389 } 5390 }); 5391 } 5392 function replaceVariables(template, variables) { 5393 var formattedString; 5394 for (var key in variables) { 5395 var value = variables[key]; 5396 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 5397 formattedString = (formattedString || template).replace(regexp, value); 5398 } 5399 return formattedString; 5400 } 5401 function isTextEditorValue(obj) { 5402 return 'raw' in obj || 'gjs' in obj; 5403 } 5404 function getTextEditorValue(obj) { 5405 if (!obj.html) { 5406 return ''; 5407 } 5408 var data = obj.html; 5409 var css = (obj.raw || obj.gjs || {}).css; 5410 if (css) { 5411 data = data + '<style>' + css + '</style>'; 5412 } 5413 return data; 5414 } 5415 5416 /** 5417 * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor. 5418 * strips out raw proprties and returns only HTML if it exists. 5419 * @param {Object} resources a collection retrieved from the database 5420 * @return {Object} the newly modified object. 5421 */ 5422 function recursivelyParse(resources) { 5423 forEach(resources, function (value, key) { 5424 if (!value) { 5425 return; 5426 } 5427 if (value instanceof Object) { 5428 if (isTextEditorValue(value)) { 5429 resources[key] = getTextEditorValue(value); 5430 return; 5431 } else { 5432 return recursivelyParse(value); 5433 } 5434 } 5435 try { 5436 var parsedData = JSON.parse(value); 5437 if (isTextEditorValue(parsedData)) { 5438 resources[key] = getTextEditorValue(parsedData); 5439 } 5440 } catch (e) { 5441 // do nothing if we failed to parse value as JSON 5442 } 5443 }); 5444 return resources; 5445 } 5446 function forEach(collection, iteratee) { 5447 var func = Array.isArray(collection) ? arrayEach : baseFor; 5448 return func(collection, iteratee); 5449 } 5450 function baseFor(object, iteratee) { 5451 if (!object) { 5452 return; 5453 } 5454 var iterable = Object(object); 5455 var props = Object.keys(object); 5456 var length = props.length; 5457 var index = -1; 5458 while (length--) { 5459 var key = props[++index]; 5460 if (iteratee(iterable[key], key, iterable) === false) { 5461 break; 5462 } 5463 } 5464 return object; 5465 } 5466 function objSet(obj, path, value) { 5467 const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g); 5468 pathArray.reduce((acc, key, i) => { 5469 if (acc[key] === undefined) acc[key] = {}; 5470 if (i === pathArray.length - 1) acc[key] = value; 5471 return acc[key]; 5472 }, obj); 5473 } 5474 function arrayEach(array, iteratee) { 5475 var index = -1; 5476 var length = array.length; 5477 while (++index < length) { 5478 if (iteratee(array[index], index, array) === false) { 5479 break; 5480 } 5481 } 5482 return array; 5483 } 5484 function selectPageRangeMode(e) { 5485 pageRange = e.matches ? mobilePageRange : desktopPageRange; 5486 renderPaginationList(); 5487 } 5488 paginationMql.addEventListener('change', selectPageRangeMode); 5489})('section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a', JSON.parse("{\"pageSize\":\"2\",\"resource\":\"agents\",\"pageRange\":0,\"variables\":{\"limit\":2,\"offset\":0,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"categoryId\":\"{{pageElement.categoryId}}\",\"agentIds\":[\"c07d8560-1e42-40d1-8f2c-1bdda81ca00c\",\"e76d0d28-213d-480d-b033-83f3840a78bd\"]},\"searchFormParams\":[{\"param\":\"search\",\"urlKey\":\"search\"},{\"param\":\"officeId\",\"global\":true,\"urlKey\":\"officeId\"},{\"param\":\"tags\",\"global\":true,\"urlKey\":\"area\"}],\"skipScrollOnSearch\":false,\"scrollTargetSelector\":\".search-form\",\"hidePaginationOnFirstPage\":true,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":5,\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 5490} catch(e) { 5491console.log(e); 5492} 5493 try { 5494(function init(sectionDomId) { 5495 const $section = $("#" + sectionDomId); 5496 const $searchContainer = $section.find(".search-container"); 5497 const $officeSelect = $section.find('.js-office-input'); 5498 const $tagSelect = $section.find('.js-tag-input'); 5499 const $searchInput = $section.find('.js-search-input'); 5500 const $emptyMsg = $section.find('.js-empty-message'); 5501 const $dataContainer = $section.find('.data-container'); 5502 const $containter = $section.find('.js-container'); 5503 const officeFilter = $searchContainer.data('fetchOffices'); 5504 const $resetSearchInput = $searchContainer.find('.lp-input-reset'); 5505 convertSelectToDropdown($tagSelect); 5506 $resetSearchInput.on('click', function (event) { 5507 event.preventDefault(); 5508 $searchInput.val(''); 5509 onSearch(); 5510 }); 5511 $dataContainer.on("data", function () { 5512 $emptyMsg.removeClass("visible"); 5513 $containter.removeClass('no-data'); 5514 }); 5515 $dataContainer.on("no-data", function () { 5516 $emptyMsg.addClass("visible"); 5517 $containter.addClass('no-data'); 5518 }); 5519 $searchInput.on('input', window.luxuryPresence.debounce(onSearch, 1000)); 5520 function onSearch() { 5521 const params = {}; 5522 if (officeFilter) params.officeId = $officeSelect.val() === '' ? null : [$officeSelect.val()]; 5523 if ($tagSelect.length > 0) params.tags = $tagSelect.val() === '' ? null : [$tagSelect.val()]; 5524 params.search = $searchInput.val() || null; 5525 $searchContainer[0]?.dispatchEvent(new CustomEvent('search', { 5526 detail: params 5527 })); 5528 } 5529 if (!officeFilter && $tagSelect.length === 0) return; 5530 var previousOption = '';
5531 $searchContainer.on('offices-data', function (evt) { 5532 let { 5533 data 5534 } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 5535 data = evt.detail?.data || data; 5536 $officeSelect.append(data.map(office => `<option value="${office.id}">${office.name}</option>`).join("\n")); 5537 convertSelectToDropdown($officeSelect); 5538 }); 5539 function updateDropdown(select, value) { 5540 let $dropdown = $(select).next(); 5541 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 5542 let $dropdownContent = $dropdown.find(".custom-select-content"); 5543 let $selectedOption = $dropdownContent.find(`button[value="${value}"]`); 5544 function unselectOption() { 5545 $linkedOption = $originalSelect.find("option").eq(0); 5546 $linkedOption.prop("selected", true); 5547 $dropdownToggle.html($linkedOption.html()); 5548 $dropdownContent.find(".custom-select-item").removeClass("is-selected"); 5549 $originalSelect.change(); 5550 previousOption = ""; 5551 } 5552 if (!$selectedOption) return; 5553 if ($selectedOption.hasClass("is-disabled")) return; 5554 let elementNumber = $selectedOption.index(); 5555 let $originalSelect = $selectedOption.closest(".custom-select").siblings("select"); 5556 let $linkedOption = $originalSelect.find("option").eq(elementNumber); 5557 if (previousOption === value) { 5558 unselectOption(); 5559 return; 5560 } 5561 if (!$linkedOption.prop("selected")) { 5562 $linkedOption.prop("selected", true); 5563 previousOption = value; 5564 $originalSelect.change(); 5565 $selectedOption.addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected"); 5566 closeSelectMenu($selectedOption.closest(".custom-select-menu")); 5567 $dropdownToggle.html($linkedOption.html()); 5568 if ($linkedOption.val()) { 5569 $dropdownToggle.removeClass("is-placeholder"); 5570 $dropdown[$linkedOption.val() !== "" ? "addClass" : "removeClass"]("has-selection"); 5571 } else { 5572 $dropdown.removeClass("has-selection"); 5573 $dropdownToggle.addClass("is-placeholder"); 5574 } 5575 } 5576 } 5577 function convertSelectToDropdown(selectItem) { 5578 let customDropdown = ` 5579 <div class="custom-select" role="presentation"> 5580 <button class="custom-select-toggle" type="button" aria-haspopup="true" aria-expanded="false"></button> 5581 <div class="custom-select-menu"> 5582 <div class="custom-select-content"> 5583 </div> 5584 </div> 5585 </div>`; 5586 $(customDropdown).insertAfter(selectItem); 5587 let $dropdown = $(selectItem).next(); 5588 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 5589 let $dropdownMenu = $dropdown.find(".custom-select-menu"); 5590 let $dropdownContent = $dropdown.find(".custom-select-content"); 5591 $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select"); 5592 $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom"); 5593 $dropdownToggle.attr("data-name", $(selectItem).attr("name")); 5594 $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id")); 5595 appendOptionButtons(selectItem, $dropdownContent); 5596 $(selectItem).removeClass().addClass("sr-only"); 5597 $(selectItem).on("focus", function () { 5598 showSelectMenu($dropdownMenu[0]); 5599 $dropdownToggle.focus(); 5600 }); 5601 var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text(); 5602 $dropdownToggle.addClass("is-placeholder").html(toggleText); 5603 $dropdown.on("click", ".custom-select-item", function (e) { 5604 updateDropdown($(this).closest(".lp-input-group").find("select"), $(this).attr("value")); 5605 }); 5606 function convertOptionToButton(option) { 5607 var optionText = $(option).text(); 5608 var optionValue = $(option).attr("value") || $(option).text(); 5609 var optionIsDisabled = $(option).prop("disabled"); 5610 var outputButton = `<button value="${optionValue}" class="custom-select-item lp-icon" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`; 5611 return outputButton; 5612 } 5613 function appendOptionButtons(selectItem, appendTarget) { 5614 $(selectItem).find("option").each(function () { 5615 let currentButton = convertOptionToButton(this); 5616 $(appendTarget).append(currentButton); 5617 }); 5618 } 5619 function showSelectMenu(selectMenu) { 5620 var customSelect = $(selectMenu).closest(".custom-select")[0]; 5621 customSelect.classList.add('open'); 5622 $(selectMenu).slideDown(); 5623 } 5624 $dropdown.on("click", ".custom-select-toggle", function (e) { 5625 var $customSelect = $(this).closest(".custom-select"); 5626 var selectMenu = $customSelect.find(".custom-select-menu")[0]; 5627 if ($customSelect.hasClass("open")) { 5628 closeSelectMenu(selectMenu); 5629 } else { 5630 showSelectMenu(selectMenu); 5631 } 5632 }); 5633 $(document.body).on("click", function (e) { 5634 if (!$(e.target).closest(`#${sectionDomId} .js-select-input`).length) { 5635 $(`#${sectionDomId} .custom-select.open`).each(function () { 5636 const selectMenu = $(this).find(".custom-select-menu")[0]; 5637 closeSelectMenu(selectMenu); 5638 }); 5639 } 5640 }); 5641 } 5642 function closeSelectMenu(selectMenu) { 5643 var customSelect = $(selectMenu).closest(".custom-select")[0]; 5644 $(customSelect).removeClass("open"); 5645 $(selectMenu).slideUp(); 5646 } 5647 $officeSelect.change(onSearch); 5648 $tagSelect.change(onSearch); 5649})('section-0f5f1393-37b8-4030-be8d-83cc8d9ae46a', JSON.parse("{\"resource\":\"agents\",\"useRouterApi\":false,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":5,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 5650} catch(e) { 5651console.log(e); 5652} 5653 try { 5654(function init(sectionDomId, options) { 5655 let section = null; 5656 switch (sectionDomId) { 5657 case 'NAVBAR': 5658 section = document.querySelector('body > nav, #global-navbar'); 5659 break; 5660 case 'FOOTER': 5661 section = document.querySelector('body > footer, #global-footer'); 5662 break; 5663 case 'SIDEMENU': 5664 section = document.querySelector('body > div.sidemenu, #global-sidemenu'); 5665 break; 5666 case 'CONTACT':
5667 section = document.querySelector('#modal-global-contact-us'); 5668 break; 5669 case 'MOBILE_CONTACT': 5670 section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact'); 5671 break; 5672 case 'SUBSCRIBE': 5673 // Subscribe Not Implemented 5674 section = null; 5675 break; 5676 case 'ACCOUNT': 5677 // Account Not Implemented 5678 section = null; 5679 break; 5680 default: 5681 section = document.querySelector('#' + sectionDomId); 5682 } 5683 if (!section) { 5684 return; 5685 } 5686 5687 // Where content / items are rendered 5688 const dataContainer = section.querySelector('.data-container'); 5689 if (!dataContainer) { 5690 // no place to render items = no need to query server or do anything else 5691 return; 5692 } 5693 let variables = options.variables || {}; 5694 5695 // Some variables in options may not have been injected - remove 5696 Object.keys(variables).forEach(function (variableName) { 5697 if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) { 5698 delete variables[variableName]; 5699 } 5700 }); 5701 5702 // Merge page query variables 5703 if (options.usePageResource) { 5704 variables = { 5705 ...variables, 5706 ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource] 5707 }; 5708 } 5709 5710 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Callers 5711 // resolve the flag — fetchData reads the section stamp, aux fetches read 5712 // their own resource's stamp (auxUsesRouter). 5713 function apiUrl(useRouter) { 5714 return options.url || (useRouter ? window.luxuryPresence.defaults.routerUrl : window.luxuryPresence.defaults.apiGatewayUrl); 5715 } 5716 5717 // ROUTER-CLEANUP: aux resources roll out on their own flag, not the section's 5718 // (options.routerApiAux is stamped per aux resource server-side). 5719 function auxUsesRouter(resource) { 5720 return !!(options.routerApiAux && options.routerApiAux[resource]); 5721 } 5722 5723 // Pagination Executes on a Numbered Pagination Container 5724 // Or via a load more button 5725 let mode = 'BUTTONLESS_PAGINATION'; 5726 const container = section.querySelector('.pagination-container');
5727 const loadMoreButton = section.querySelector(options?.loadMoreSelector); 5728 if (container) { 5729 mode = 'NUMBERED_PAGINATION'; 5730 } 5731 if (loadMoreButton) { 5732 mode = 'LOAD_MORE_BUTTON'; 5733 } 5734 let searchContainer = section.querySelector('.search-container'); 5735 const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false; 5736 const eventPrefix = '__pagination-'; 5737 const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{ 5738 param: 'neighborhoodId', 5739 urlKey: 'neighborhood' 5740 }, { 5741 param: 'search', 5742 urlKey: 'search' 5743 }, { 5744 param: 'salesPriceGTE', 5745 urlKey: 'pricemin', 5746 formKey: 'priceMin', 5747 type: 'int' 5748 }, { 5749 param: 'salesPriceLTE', 5750 urlKey: 'pricemax', 5751 formKey: 'priceMax', 5752 type: 'int' 5753 }, { 5754 param: 'livingSpaceSizeGTE', 5755 urlKey: 'areamin', 5756 formKey: 'areaMin', 5757 type: 'int' 5758 }, { 5759 param: 'livingSpaceSizeLTE', 5760 urlKey: 'areamax', 5761 formKey: 'areaMax', 5762 type: 'int' 5763 }] : []); 5764 5765 // Total entries - initialized in first render 5766 let totalNumber = 0; 5767 const DefaultSearchParams = { 5768 page: 1 5769 }; 5770 searchFormParams.forEach(function (formParam) { 5771 DefaultSearchParams[formParam.formKey || formParam.param] = null; 5772 }); 5773 let searchParams = { 5774 ...DefaultSearchParams 5775 }; 5776 const offset = options.variables?.offset || 0; 5777 let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section; 5778 let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100; 5779 5780 // entries of per page 5781 // when query variables for a given section would't be filled options.pageSize can store 5782 // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value 5783 let pageSize = parseInt(options.pageSize, 10) || 9; 5784 5785 // Adding mobile pageRange support 5786 var NARROW_BREAKPOINT = 600; 5787 var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT; 5788 var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`); 5789 5790 // Page range (pages on both sides of the current page) 5791 var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0; 5792 var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2; 5793 var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange; 5794 5795 // Whether to display the 'Previous' button 5796 var showPrevious = true; 5797 5798 // Whether to display the 'Next' button 5799 var showNext = true; 5800 5801 // Whether to display the page buttons 5802 var showPageNumbers = true; 5803 5804 // 'Previous' text 5805 var prevText = options.prevText || '«'; 5806 5807 // 'Next' text 5808 var nextText = options.nextText || '»'; 5809 5810 // Ellipsis text 5811 var ellipsisText = '…'; 5812 var classPrefix = 'paginationjs'; 5813 5814 // Default active class 5815 var activeClassName = 'active'; 5816 5817 // Default disable class 5818 var disableClassName = 'disabled'; 5819 5820 // Pagination element's position in the container 5821 var position = 'bottom'; 5822 5823 // Whether to trigger pagination at initialization 5824 var triggerPagingOnInit = !options.skipInitialLoad; 5825 var showFirstOnEllipsisShow = true; 5826 var showLastOnEllipsisShow = true; 5827 5828 // Instantiated in init() 5829 var el = null; 5830 5831 // Controls scrollTop logic 5832 var firstRender = true; 5833 var renderBySearch = false; 5834 var disabled = false; 5835 5836 // Pagination script class selector 5837 var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script'; 5838 5839 // Property Specific Image Override if No Image 5840 var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage; 5841 5842 // Construct template 5843 var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || ''; 5844 var template = Handlebars.compile(templateHTML); 5845 5846 // Initialize 5847 init(); 5848 function init() { 5849 Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 5850 5851 // Append/prepend pagination element to the pagination container 5852 if (mode === 'NUMBERED_PAGINATION') { 5853 el = document.createElement('div'); 5854 el.className = 'paginationjs';
5855 container[position === 'bottom' ? 'append' : 'prepend'](el); 5856 } 5857 if (searchContainer) { 5858 initSearchContainer({ 5859 fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true', 5860 fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true', 5861 fetchOffices: searchContainer.dataset.fetchOffices === 'true', 5862 fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true' 5863 }, function () { 5864 syncSearchFormState(searchParams); 5865 }); 5866 } 5867 5868 // Bind events 5869 observer(); 5870 } 5871 function syncSearchFormState(params) { 5872 searchContainer.dispatchEvent(new CustomEvent('sync', { 5873 detail: params 5874 })); 5875 } 5876 function initSearchContainer(options, done) { 5877 var promises = []; 5878 if (options.fetchNeighborhoods) { 5879 promises.push(fetchAllNeighborhoods(function (neighborhoods) { 5880 searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', { 5881 detail: { 5882 data: neighborhoods.map(function (item) { 5883 return { 5884 value: item.id, 5885 label: item.name 5886 }; 5887 }) 5888 } 5889 })); 5890 })); 5891 } 5892 if (options.fetchPostCategories) { 5893 promises.push(fetchPostCategories(function (categories) { 5894 searchContainer.dispatchEvent(new CustomEvent('post-categories-data', { 5895 detail: { 5896 data: categories 5897 } 5898 })); 5899 })); 5900 } 5901 if (options.fetchOffices) { 5902 promises.push(fetchOffices(function (offices) { 5903 searchContainer.dispatchEvent(new CustomEvent('offices-data', { 5904 detail: { 5905 data: offices 5906 } 5907 })); 5908 })); 5909 } 5910 if (options.fetchRentalRates) { 5911 promises.push(fetchAllRentalRates(function (rentalRates) { 5912 searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', { 5913 detail: { 5914 data: rentalRates 5915 } 5916 })); 5917 })); 5918 } 5919 if (promises.length > 0) { 5920 Promise.all(promises).then(function () { 5921 done(); 5922 }); 5923 } else { 5924 // element's custom code is not executed yet, so we're scheduling callback to after element's code 5925 setTimeout(done); 5926 } 5927 } 5928 function fetchAllNeighborhoods(done) { 5929 var useRouter = auxUsesRouter('neighborhoods'); 5930 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Same 5931 // args on both APIs (the federated neighborhoods field accepts 5932 // withProperties/withBlogPosts); only the selection set differs. 5933 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') + '}}'; 5934 var payload = {}; 5935 payload.offset = 0; 5936 payload.limit = 100; 5937 payload.companyId = variables.companyId; 5938 if (options.resource === 'properties') { 5939 payload.withProperties = { 5940 active: true 5941 }; 5942 ['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) { 5943 if (variables[field] !== undefined && variables[field] !== null) { 5944 payload.withProperties[field] = variables[field]; 5945 } 5946 }); 5947 } 5948 if (options.resource === 'posts') { 5949 payload.withBlogPosts = { 5950 active: true 5951 }; 5952 ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) { 5953 if (variables[field] !== undefined && variables[field] !== null) { 5954 payload.withBlogPosts[field] = variables[field]; 5955 } 5956 }); 5957 } 5958 5959 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 5960 if (useRouter) { 5961 payload = window.luxuryPresence.routerApi.transformVariables('neighborhoods', payload); 5962 } 5963 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 5964 query: gqlQuery, 5965 variables: payload 5966 }).then(function (res) { 5967 var value = res.body.data && res.body.data.neighborhoods || {}; 5968 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 5969 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 5970 done(items, items.length); 5971 }); 5972 } 5973 function fetchPostCategories(done) { 5974 var featured = options.resource === 'posts' && !!variables.featured; 5975 var useRouter = auxUsesRouter('postCategories'); 5976 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 5977 // selection set differs ({ items {...} } on the router). 5978 var selection = 'id, name, publishedCount, featuredPublishedCount'; 5979 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) + '}}'; 5980 var payload = {}; 5981 payload.offset = 0; 5982 payload.limit = 100; 5983 payload.companyId = variables.companyId; 5984 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 5985 query: gqlQuery, 5986 variables: payload 5987 }).then(function (res) { 5988 var value = res.body.data && res.body.data.postCategories || {}; 5989 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 5990 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 5991 done(items.map(function (item) { 5992 item.count = featured ? item.featuredPublishedCount : item.publishedCount; 5993 return item; 5994 }), items.length); 5995 }); 5996 } 5997 function fetchOffices(done) { 5998 var useRouter = auxUsesRouter('offices'); 5999 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. Only the 6000 // selection set differs ({ items {...} } on the router). 6001 var selection = 'id, name, tags'; 6002 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired. The two 6003 // APIs differ in more than the items wrapper: federated offices takes 6004 // companyId: ID! (legacy gateway: String), so each branch builds its whole doc. 6005 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 + '}}'; 6006 var payload = { 6007 offset: 0, 6008 limit: 100, 6009 companyId: variables.companyId 6010 }; 6011 6012 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 6013 if (useRouter) { 6014 payload = window.luxuryPresence.routerApi.transformVariables('office
6014s', payload); 6015 } 6016 superagent.post(apiUrl(useRouter) + '/graphql').withCredentials().send({ 6017 query: gqlQuery, 6018 variables: payload 6019 }).then(function (res) { 6020 var value = res.body.data && res.body.data.offices || {}; 6021 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 6022 var items = useRouter ? window.luxuryPresence.routerApi.transformPage(value).items : value || []; 6023 done(items, items.length); 6024 }); 6025 } 6026 6027 // ROUTER-CLEANUP: no rentalRates field on the federated router — legacy only. 6028 function fetchAllRentalRates(done) { 6029 var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl; 6030 var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}'; 6031 var payload = { 6032 offset: 0, 6033 limit: 100, 6034 companyId: variables.companyId 6035 }; 6036 superagent.post(url + '/graphql').withCredentials().send({ 6037 query: gqlQuery, 6038 variables: payload 6039 }).then(function (res) { 6040 var items = res.body.data && res.body.data.rentalRates || []; 6041 done(items, items.length); 6042 }).catch(function (err) { 6043 console.error('Error fetching rental rates:', err); 6044 done([], 0); 6045 }); 6046 } 6047 function fetchData(params, done) { 6048 var resource = options.resource; 6049 var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource]; 6050 var payload = {}; 6051 try { 6052 payload = JSON.parse(JSON.stringify(variables)); 6053 } catch (e) { 6054 Object.keys(variables).forEach(function (variableName) { 6055 payload[variableName] = variables[variableName]; 6056 }); 6057 } 6058 payload.offset = (params.page - 1) * pageSize + offset; 6059 payload.limit = pageSize; 6060 payload.companyId = options.companyId; 6061 searchFormParams.forEach(function (formParam) { 6062 var val = params[formParam.formKey || formParam.param]; 6063 if (val !== null && val !== undefined) { 6064 objSet(payload, formParam.param, val); 6065 } 6066 }); 6067 6068 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 6069 if (options.useRouterApi) { 6070 payload = window.luxuryPresence.routerApi.transformVariables(resource, payload); 6071 } 6072 6073 // TODO: Disabled loading due to jarring effect 6074 // dataContainer.html('Loading...'); 6075 superagent.post(apiUrl(options.useRouterApi) + '/graphql').withCredentials().send({ 6076 query: gqlQuery, 6077 variables: payload 6078 }).then(function (res) { 6079 if (res.body.errors) { 6080 done(res.body.errors); 6081 return; 6082 } 6083 var data = res.body.data || {}; 6084 // ROUTER-CLEANUP: keep router branch, drop legacy when API retired 6085 var resources; 6086 var resourceCount; 6087 if (options.useRouterApi) { 6088 var page = window.luxuryPresence.routerApi.transformPage(data[resource]); 6089 resources = window.luxuryPresence.routerApi.transformResponse(resource, page.items); 6090 resourceCount = page.count; 6091 } else { 6092 resources = data[resource] || []; 6093 resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0; 6094 } 6095 if (resource === 'properties' && propertyPlaceholderImage?.id) { 6096 resources = resources.map(resource => { 6097 if (resource.media?.length === 0) { 6098 return Object.assign(resource, { 6099 media: [propertyPlaceholderImage] 6100 }); 6101 } 6102 return resource; 6103 }); 6104 } 6105 done(null, resources, resourceCount); 6106 }); 6107 } 6108 function getTotalPage() { 6109 return Math.ceil(totalNumber / pageSize); 6110 } 6111 function renderPaginationList() { 6112 var totalPages = getTotalPage(); 6113 var rangeStart = searchParams.page - pageRange; 6114 var rangeEnd = searchParams.page + pageRange; 6115 if (rangeEnd > totalPages) { 6116 rangeEnd = totalPages; 6117 rangeStart = totalPages - pageRange * 2; 6118 rangeStart = rangeStart < 1 ? 1 : rangeStart; 6119 } 6120 if (rangeStart <= 1) { 6121 rangeStart = 1; 6122 rangeEnd = Math.min(pageRange * 2 + 1, totalPages); 6123 } 6124 6125 // Making sure that 1 more page button is shown in edge positions 6126 if (pageRange === 0) { 6127 if (searchParams.page === totalPages) { 6128 rangeStart = totalPages <= 1 ? 1 : totalPages - 1; 6129 } 6130 if (searchParams.page === 1) { 6131 rangeEnd = Math.min(2, totalPages); 6132 } 6133 } 6134 6135 // Render pagination list 6136 if (mode === 'NUMBERED_PAGINATION') { 6137 el.innerHTML = generateHTML({ 6138 currentPage: searchParams.page, 6139 pageRange: pageRange, 6140 rangeStart: rangeStart, 6141 rangeEnd: rangeEnd 6142 }); 6143 if (totalPages < 2 && hidePaginationOnFirstPage) { 6144 container.style.display = 'none'; 6145 } else { 6146 container.style.display = ''; 6147 } 6148 } else if (mode === 'LOAD_MORE_BUTTON') { 6149 if (searchParams.page >= totalPages) {
6150 loadMoreButton.style.display = 'none'; 6151 } else { 6152 loadMoreButton.style.display = ''; 6153 } 6154 } 6155 } 6156 function render(data) { 6157 renderPaginationList(); 6158 6159 // Render new content with handlebars 6160 var html = ''; 6161 if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) { 6162 // If using load more, append search results to existing results 6163 html = dataContainer.innerHTML; 6164 } 6165 for (var i = 0; i < data.length; i++) { 6166 var itemData = recursivelyParse(data[i]); 6167 itemData.sectionIndex = options.sectionIndex; 6168 itemData.renderOptions = options.renderOptions; 6169 html += template(itemData); 6170 } 6171 dataContainer.innerHTML = html; 6172 6173 // Scroll Top 6174 if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) { 6175 // Only animate to the top if we replace dataContainer (numbered pagination) 6176 setTimeout(() => { 6177 const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset; 6178 window.scrollTo({ 6179 top: scrollTargetOffsetTop, 6180 behavior: 'smooth' 6181 }); 6182 }, 250); 6183 } 6184 return true; 6185 } 6186 function generateHTML(args) { 6187 const totalPages = getTotalPage(); 6188 const { 6189 rangeStart, 6190 rangeEnd 6191 } = args; 6192 const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 6193 ...searchParams, 6194 page 6195 }); 6196 let html = ''; 6197 if (showPrevious || showPageNumbers || showNext) { 6198 html += '<div class="paginationjs-pages"><ul>'; 6199 6200 // Previous button 6201 if (showPrevious) { 6202 if (searchParams.page <= 1) { 6203 html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`; 6204 } else { 6205 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>`; 6206 } 6207 } 6208 6209 // Pages 6210 if (showPageNumbers) { 6211 if (rangeStart <= 3) { 6212 for (let i = 1; i < rangeStart; i++) { 6213 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>`; 6214 } 6215 } else { 6216 if (showFirstOnEllipsisShow) { 6217 html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`; 6218 } 6219 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 6220 } 6221 for (let i = rangeStart; i <= rangeEnd; i++) { 6222 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>`; 6223 } 6224 if (rangeEnd < totalPages - 2) { 6225 html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`; 6226 if (showLastOnEllipsisShow) { 6227 html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`; 6228 } 6229 } else { 6230 for (let i = rangeEnd + 1; i <= totalPages; i++) { 6231 html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`; 6232 } 6233 } 6234 } 6235 6236 // Next button 6237 if (showNext) { 6238 if (searchParams.page >= totalPages) { 6239 html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`; 6240 } else { 6241 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>`; 6242 } 6243 } 6244 html += '</ul></div>'; 6245 } 6246 return html; 6247 } 6248 function go(newSearchParams, callback, restorationVisit) { 6249 if (disabled) return; 6250 var goToPageNumber = newSearchParams.page; 6251 6252 // Page number is out of bounds 6253 if (!goToPageNumber || goToPageNumber < 1) return; 6254 var totalPage = getTotalPage(); 6255 6256 // Page number is out of bounds 6257 if (!restorationVisit && totalNumber > 0) { 6258 if (goToPageNumber > totalPage) return; 6259 } 6260 if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
6261 var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, { 6262 ...newSearchParams, 6263 page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null 6264 }); 6265 if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) { 6266 window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, { 6267 queryString: true 6268 })); 6269 } 6270 } 6271 6272 // Fetch and update page 6273 fetchData(newSearchParams, renderWithData); 6274 disabled = true; 6275 function renderWithData(err, data, count) { 6276 if (err) { 6277 dataContainer.dispatchEvent(new Event('error')); 6278 } else { 6279 searchParams = { 6280 ...newSearchParams 6281 }; 6282 totalNumber = count - offset; 6283 if (data.length === 0) { 6284 dataContainer.dispatchEvent(new Event('no-data')); 6285 } else { 6286 dataContainer.dispatchEvent(new Event('data')); 6287 } 6288 render(data); 6289 firstRender = false; 6290 } 6291 disabled = false; 6292 renderBySearch = false; 6293 } 6294 } 6295 function areQueryParamsEqual(first, second) { 6296 var differ = Object.keys(first).find(function (key) { 6297 return first[key] !== undefined && first[key] !== null && first[key] !== second[key]; 6298 }); 6299 if (differ) { 6300 return false; 6301 } 6302 differ = Object.keys(second).find(function (key) { 6303 return second[key] !== undefined && second[key] !== null && second[key] !== first[key]; 6304 }); 6305 return !differ; 6306 } 6307 function next(callback) { 6308 go({ 6309 ...searchParams, 6310 page: searchParams.page + 1 6311 }, callback); 6312 } 6313 function previous(callback) { 6314 go({ 6315 ...searchParams, 6316 page: searchParams.page - 1 6317 }, callback); 6318 } 6319 function refresh(callback) { 6320 go(searchParams, callback); 6321 } 6322 function update(params, callback) { 6323 renderBySearch = true; 6324 go(params, callback); 6325 } 6326 function observer() { 6327 if (searchContainer) { 6328 searchContainer.addEventListener('search', function (event, newSearchParams) { 6329 newSearchParams = event.detail || newSearchParams; 6330 update({ 6331 ...searchParams, 6332 ...newSearchParams, 6333 page: 1 6334 }); 6335 }); 6336 searchContainer.addEventListener('clear-search', function () { 6337 const defaultSearchParams = { 6338 ...DefaultSearchParams 6339 }; 6340 const isCurrentSearchFormStateDefault = areQueryParamsEqual({ 6341 ...defaultSearchParams, 6342 page: null 6343 }, { 6344 ...searchParams, 6345 page: null 6346 }); 6347 6348 // if mode is LOAD_MORE_BUTTON we should't make anything on clear 6349 // when search form have default state 6350 if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') { 6351 return; 6352 } 6353 6354 // if someone initially go to some page and click 'Clear' on search from 6355 // we should't navigate to first page. We should preserve page value 6356 if (isCurrentSearchFormStateDefault) { 6357 defaultSearchParams.page = searchParams.page; 6358 } 6359 syncSearchFormState(defaultSearchParams); 6360 update(defaultSearchParams); 6361 }); 6362 } 6363 if (mode === 'LOAD_MORE_BUTTON') { 6364 loadMoreButton.addEventListener('click', function (event) { 6365 go({ 6366 ...searchParams, 6367 page: searchParams.page + 1 6368 }); 6369 return false; 6370 }); 6371 } 6372 if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') { 6373 // Do initial render 6374 go(Object.assign({}, searchParams, { 6375 page: 1 6376 })); 6377 return; 6378 } 6379 if (mode === 'NUMBERED_PAGINATION') { 6380 // Go to specified page number 6381 container.addEventListener(eventPrefix + 'go', function (event) { 6382 let { 6383 pageNumber, 6384 done 6385 } = event.detail || {}; 6386 pageNumber = parseInt(pageNumber, 10); 6387 if (!pageNumber) { 6388 return; 6389 } 6390 go({ 6391 ...searchParams, 6392 page: pageNumber 6393 }, done); 6394 }); 6395 6396 // Page number button click 6397 el.addEventListener('click', function (event) { 6398 let clickTarget = event.target; 6399 let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next'); 6400 let pageNumber = current?.getAttribute('data-num'); 6401 if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) { 6402 return; 6403 } else { 6404 go({ 6405 ...searchParams, 6406 page: parseInt(pageNumber, 10) 6407 }); 6408 } 6409 event.preventDefault(); 6410 }); 6411 6412 // Whether to load the default page 6413 var defaultPageNumber = searchParams.page; 6414 if (triggerPagingOnInit) {
6415 container.dispatchEvent(new CustomEvent(eventPrefix + 'go', { 6416 detail: { 6417 pageNumber: defaultPageNumber 6418 } 6419 })); 6420 } 6421 } 6422 window.addEventListener('popstate', function (event) { 6423 var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId)); 6424 if (!areQueryParamsEqual(newParams, searchParams)) { 6425 go(newParams, null, true); 6426 if (searchContainer) { 6427 syncSearchFormState(newParams); 6428 } 6429 } 6430 }); 6431 } 6432 function replaceVariables(template, variables) { 6433 var formattedString; 6434 for (var key in variables) { 6435 var value = variables[key]; 6436 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 6437 formattedString = (formattedString || template).replace(regexp, value); 6438 } 6439 return formattedString; 6440 } 6441 function isTextEditorValue(obj) { 6442 return 'raw' in obj || 'gjs' in obj; 6443 } 6444 function getTextEditorValue(obj) { 6445 if (!obj.html) { 6446 return ''; 6447 } 6448 var data = obj.html; 6449 var css = (obj.raw || obj.gjs || {}).css; 6450 if (css) { 6451 data = data + '<style>' + css + '</style>'; 6452 } 6453 return data; 6454 } 6455 6456 /** 6457 * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor. 6458 * strips out raw proprties and returns only HTML if it exists. 6459 * @param {Object} resources a collection retrieved from the database 6460 * @return {Object} the newly modified object. 6461 */ 6462 function recursivelyParse(resources) { 6463 forEach(resources, function (value, key) { 6464 if (!value) { 6465 return; 6466 } 6467 if (value instanceof Object) { 6468 if (isTextEditorValue(value)) { 6469 resources[key] = getTextEditorValue(value); 6470 return; 6471 } else { 6472 return recursivelyParse(value); 6473 } 6474 } 6475 try { 6476 var parsedData = JSON.parse(value); 6477 if (isTextEditorValue(parsedData)) { 6478 resources[key] = getTextEditorValue(parsedData); 6479 } 6480 } catch (e) { 6481 // do nothing if we failed to parse value as JSON 6482 } 6483 }); 6484 return resources; 6485 } 6486 function forEach(collection, iteratee) { 6487 var func = Array.isArray(collection) ? arrayEach : baseFor; 6488 return func(collection, iteratee); 6489 } 6490 function baseFor(object, iteratee) { 6491 if (!object) { 6492 return; 6493 } 6494 var iterable = Object(object); 6495 var props = Object.keys(object); 6496 var length = props.length; 6497 var index = -1; 6498 while (length--) { 6499 var key = props[++index]; 6500 if (iteratee(iterable[key], key, iterable) === false) { 6501 break; 6502 } 6503 } 6504 return object; 6505 } 6506 function objSet(obj, path, value) { 6507 const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g); 6508 pathArray.reduce((acc, key, i) => { 6509 if (acc[key] === undefined) acc[key] = {}; 6510 if (i === pathArray.length - 1) acc[key] = value; 6511 return acc[key]; 6512 }, obj); 6513 } 6514 function arrayEach(array, iteratee) { 6515 var index = -1; 6516 var length = array.length; 6517 while (++index < length) { 6518 if (iteratee(array[index], index, array) === false) { 6519 break; 6520 } 6521 } 6522 return array; 6523 } 6524 function selectPageRangeMode(e) { 6525 pageRange = e.matches ? mobilePageRange : desktopPageRange; 6526 renderPaginationList(); 6527 } 6528 paginationMql.addEventListener('change', selectPageRangeMode); 6529})('section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de', JSON.parse("{\"pageSize\":\"9\",\"resource\":\"agents\",\"pageRange\":0,\"variables\":{\"limit\":9,\"offset\":0,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"categoryId\":\"{{pageElement.categoryId}}\",\"agentIds\":[\"0cf0a601-c484-4cc2-ac21-c28c15be3cb1\",\"1a58f8d0-84e2-4d90-9a17-fd7402860c7d\",\"a15a7a3b-224b-4746-99d2-1c6fc342c207\",\"afbd345c-b824-4bbf-b0b8-3ff57854c6ec\",\"9b86d143-978c-4fc7-9e1e-2e899ba2725a\",\"2fede9a8-b094-45eb-886d-ce39b87034a3\",\"20e2e2d7-90c1-4cca-80a2-9a26bb29638f\",\"ad415e28-f716-4c5a-a978-6e51539d440d\",\"a2f39871-ee1b-45f1-9b29-ce4ec14ca942\"]},\"searchFormParams\":[{\"param\":\"search\",\"urlKey\":\"search\"},{\"param\":\"officeId\",\"global\":true,\"urlKey\":\"officeId\"},{\"param\":\"tags\",\"global\":true,\"urlKey\":\"area\"}],\"skipScrollOnSearch\":false,\"scrollTargetSelector\":\".search-form\",\"hidePaginationOnFirstPage\":true,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":6,\"useRouterApi\":false,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 6530} catch(e) { 6531console.log(e); 6532} 6533 try { 6534(function init(sectionDomId) { 6535 const $section = $("#" + sectionDomId); 6536 const $searchContainer = $section.find(".search-container"); 6537 const $officeSelect = $section.find('.js-office-input'); 6538 const $tagSelect = $section.find('.js-tag-input'); 6539 const $searchInput = $section.find('.js-search-input'); 6540 const $emptyMsg = $section.find('.js-empty-message'); 6541 const $dataContainer = $section.find('.data-container'); 6542 const $containter = $section.find('.js-container'); 6543 const officeFilter = $searchContainer.data('fetchOffices'); 6544 const $resetSearchInput = $searchContainer.find('.lp-input-reset'); 6545 convertSelectToDropdown($tagSelect); 6546 $resetSearchInput.on('click', function (event) { 6547 event.preventDefault(); 6548 $searchInput.val(''); 6549 onSearch(); 6550 }); 6551 $dataContainer.on("data", function () { 6552 $emptyMsg.removeClass("visible"); 6553 $containter.removeClass('no-data'); 6554 }); 6555 $dataContainer.on("no-data", function () { 6556 $emptyMsg.addClass("visible"); 6557 $containter.addClass('no-data'); 6558 }); 6559 $searchInput.on('input', window.luxuryPresence.debounce(onSearch, 1000)); 6560 function onSearch() { 6561 const params = {}; 6562 if (officeFilter) params.officeId = $officeSelect.val() === '' ? null : [$officeSelect.val()]; 6563 if ($tagSelect.length > 0) params.tags = $tagSelect.val() === '' ? null : [$tagSelect.val()]; 6564 params.search = $searchInput.val() || null; 6565 $searchContainer[0]?.dispatchEvent(new CustomEvent('search', { 6566 detail: params 6567 })); 6568 } 6569 if (!officeFilter && $tagSelect.length === 0) return; 6570 var previousOption = '';
6571 $searchContainer.on('offices-data', function (evt) { 6572 let { 6573 data 6574 } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 6575 data = evt.detail?.data || data; 6576 $officeSelect.append(data.map(office => `<option value="${office.id}">${office.name}</option>`).join("\n")); 6577 convertSelectToDropdown($officeSelect); 6578 }); 6579 function updateDropdown(select, value) { 6580 let $dropdown = $(select).next(); 6581 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 6582 let $dropdownContent = $dropdown.find(".custom-select-content"); 6583 let $selectedOption = $dropdownContent.find(`button[value="${value}"]`); 6584 function unselectOption() { 6585 $linkedOption = $originalSelect.find("option").eq(0); 6586 $linkedOption.prop("selected", true); 6587 $dropdownToggle.html($linkedOption.html()); 6588 $dropdownContent.find(".custom-select-item").removeClass("is-selected"); 6589 $originalSelect.change(); 6590 previousOption = ""; 6591 } 6592 if (!$selectedOption) return; 6593 if ($selectedOption.hasClass("is-disabled")) return; 6594 let elementNumber = $selectedOption.index(); 6595 let $originalSelect = $selectedOption.closest(".custom-select").siblings("select"); 6596 let $linkedOption = $originalSelect.find("option").eq(elementNumber); 6597 if (previousOption === value) { 6598 unselectOption(); 6599 return; 6600 } 6601 if (!$linkedOption.prop("selected")) { 6602 $linkedOption.prop("selected", true); 6603 previousOption = value; 6604 $originalSelect.change(); 6605 $selectedOption.addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected"); 6606 closeSelectMenu($selectedOption.closest(".custom-select-menu")); 6607 $dropdownToggle.html($linkedOption.html()); 6608 if ($linkedOption.val()) { 6609 $dropdownToggle.removeClass("is-placeholder"); 6610 $dropdown[$linkedOption.val() !== "" ? "addClass" : "removeClass"]("has-selection"); 6611 } else { 6612 $dropdown.removeClass("has-selection"); 6613 $dropdownToggle.addClass("is-placeholder"); 6614 } 6615 } 6616 } 6617 function convertSelectToDropdown(selectItem) { 6618 let customDropdown = ` 6619 <div class="custom-select" role="presentation"> 6620 <button class="custom-select-toggle" type="button" aria-haspopup="true" aria-expanded="false"></button> 6621 <div class="custom-select-menu"> 6622 <div class="custom-select-content"> 6623 </div> 6624 </div> 6625 </div>`; 6626 $(customDropdown).insertAfter(selectItem); 6627 let $dropdown = $(selectItem).next(); 6628 let $dropdownToggle = $dropdown.find(".custom-select-toggle"); 6629 let $dropdownMenu = $dropdown.find(".custom-select-menu"); 6630 let $dropdownContent = $dropdown.find(".custom-select-content"); 6631 $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select"); 6632 $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom"); 6633 $dropdownToggle.attr("data-name", $(selectItem).attr("name")); 6634 $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id")); 6635 appendOptionButtons(selectItem, $dropdownContent); 6636 $(selectItem).removeClass().addClass("sr-only"); 6637 $(selectItem).on("focus", function () { 6638 showSelectMenu($dropdownMenu[0]); 6639 $dropdownToggle.focus(); 6640 }); 6641 var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text(); 6642 $dropdownToggle.addClass("is-placeholder").html(toggleText); 6643 $dropdown.on("click", ".custom-select-item", function (e) { 6644 updateDropdown($(this).closest(".lp-input-group").find("select"), $(this).attr("value")); 6645 }); 6646 function convertOptionToButton(option) { 6647 var optionText = $(option).text(); 6648 var optionValue = $(option).attr("value") || $(option).text(); 6649 var optionIsDisabled = $(option).prop("disabled"); 6650 var outputButton = `<button value="${optionValue}" class="custom-select-item lp-icon" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`; 6651 return outputButton; 6652 } 6653 function appendOptionButtons(selectItem, appendTarget) { 6654 $(selectItem).find("option").each(function () { 6655 let currentButton = convertOptionToButton(this); 6656 $(appendTarget).append(currentButton); 6657 }); 6658 } 6659 function showSelectMenu(selectMenu) { 6660 var customSelect = $(selectMenu).closest(".custom-select")[0]; 6661 customSelect.classList.add('open'); 6662 $(selectMenu).slideDown(); 6663 } 6664 $dropdown.on("click", ".custom-select-toggle", function (e) { 6665 var $customSelect = $(this).closest(".custom-select"); 6666 var selectMenu = $customSelect.find(".custom-select-menu")[0]; 6667 if ($customSelect.hasClass("open")) { 6668 closeSelectMenu(selectMenu); 6669 } else { 6670 showSelectMenu(selectMenu); 6671 } 6672 }); 6673 $(document.body).on("click", function (e) { 6674 if (!$(e.target).closest(`#${sectionDomId} .js-select-input`).length) { 6675 $(`#${sectionDomId} .custom-select.open`).each(function () { 6676 const selectMenu = $(this).find(".custom-select-menu")[0]; 6677 closeSelectMenu(selectMenu); 6678 }); 6679 } 6680 }); 6681 } 6682 function closeSelectMenu(selectMenu) { 6683 var customSelect = $(selectMenu).closest(".custom-select")[0]; 6684 $(customSelect).removeClass("open"); 6685 $(selectMenu).slideUp(); 6686 } 6687 $officeSelect.change(onSearch); 6688 $tagSelect.change(onSearch); 6689})('section-5e3b5ca5-96e5-4866-9c1f-384cbb2438de', JSON.parse("{\"resource\":\"agents\",\"useRouterApi\":false,\"companyId\":\"b8978102-23d8-42d2-b1c5-bbed6df2e9fd\",\"usePageResource\":false,\"sectionIndex\":6,\"routerApiAux\":{\"testimonials\":true,\"agents\":false,\"neighborhoods\":false,\"developments\":false,\"properties\":false,\"posts\":true,\"pressReleases\":true,\"offices\":true,\"teams\":true,\"pois\":true,\"postCategories\":true}}")); 6690} catch(e) { 6691console.log(e); 6692} 6693 try { 6694(function init(sectionDomId) { 6695 var $contactForm = $('#' + sectionDomId + ' .newsletter-signup__form'); 6696 $contactForm.find('.contact-form__reset').click(function (e) { 6697 e.preventDefault(); 6698 $(this).closest('form').removeClass('success').trigger("reset"); 6699 }); 6700 $contactForm.find('input[name="name"]').on("keyup", function () { 6701 if (this.value.replaceAll(/\d/g, "").trim() === "") { 6702 this.setCustomValidity("Please enter your name."); 6703 } else { 6704 this.setCustomValidity(""); 6705 } 6706 }); 6707 const form = $("#" + sectionDomId).find("form"); 6708 const redirectLink = $('#' + sectionDomId + ' .redirect-link'); 6709 form.on("reset", function () { 6710 redirectPage(redirectLink); 6711 }); 6712 function redirectPage(link) { 6713 if (link.length) { 6714 const rawHref = link.attr('href'); 6715 link.attr('href', setHttp(rawHref)); 6716 link[0].click(); 6717 } 6718 } 6719 function setHttp(link) { 6720 if (link.search(/^http[s]?\:\/\/|\//) == -1) { 6721 link = 'http://' + link; 6722 } 6723 return link; 6724 } 6725})('section-2c81dbbf-0b52-4cc5-a6fa-5bc175d67ec5', 'undefined'); 6726} catch(e) { 6727console.log(e); 6728} 6729 try { 6730(function init(sectionDomId) {// please write all js here and use sectionDomId in selectors in order of DOM encapsulation 6731})('section-90b955a0-1aef-435e-aa96-59c408339909', 'undefined'); 6732} catch(e) { 6733console.log(e); 6734} 6735 6736 var { body } = document; 6737 var globalNav = body.querySelector(':scope > nav'); 6738 var globalSideMenu = body.querySelector(':scope > div.sidemenu'); 6739 6740 document.querySelectorAll('body > .modal .close').forEach(modalCloseBtn => { 6741 modalCloseBtn.addEventListener('click', function() { 6742 window.lpUI.hideClosestModal(modalCloseBtn); 6743 }); 6744 }); 6745 6746 window.addEventListener('click', function() { 6747 document.querySelectorAll('.share-popup').forEach(sharedPopup => { 6748 sharedPopup.style.display = 'none' ; 6749 }); 6750 }); 6751 6752 /* Misc Partials / Addons */ 6753 function initWOW() { 6754 if (wow) { 6755 wow.init(); 6756 wow.scrollHandler(); 6757 setTimeout(function () { 6758 const wowHideStyle = document.getElementById('wow-hide-elements'); 6759 if(wowHideStyle) { 6760 wowHideStyle.disabled = true; 6761 } 6762 }, 1); 6763 } 6764 } 6765 6766 const wowHideElements = document.getElementById('wow-hide-elements'); 6767 if (wowHideElements) { 6768 wowHideElements.disabled = false;
6769 } 6770 6771 initWOW(); 6772 6773 /* Generic Navbar Handling */ 6774 globalNav?.querySelectorAll('.hamburger-component').forEach(hamburgerComponent => { 6775 hamburgerComponent.addEventListener('click', function() { 6776 window.lpUI.sideMenuToggle(); 6777 }); 6778 }); 6779 globalSideMenu?.querySelectorAll('.toggle').forEach(toggleEl => { 6780 toggleEl.addEventListener('click', function() { 6781 window.lpUI.sideMenuToggle(); 6782 }); 6783 }); 6784 6785 document.querySelectorAll('body > nav .sub-nav-container > a, body > div.sidemenu .sub-nav-container > a').forEach(linkEl => { 6786 linkEl.addEventListener('click', function(e) { 6787 e.preventDefault(); 6788 e.stopPropagation(); 6789 var subNav = linkEl.parentElement.querySelector(':scope > .sub-nav'); 6790 if (subNav && subNav.classList.contains('visible')){ 6791 subNav.classList.remove('visible'); 6792 } else { 6793 globalNav?.querySelectorAll('.sub-nav-container .sub-nav').forEach(globalSubNav => { 6794 globalSubNav.classList.remove('visible'); 6795 }); 6796 globalSideMenu?.querySelectorAll('.sub-nav').forEach(sideMenuSubNav => { 6797 sideMenuSubNav.classList.remove('visible'); 6798 }); 6799 subNav?.classList.add('visible'); 6800 } 6801 }); 6802 }); 6803 window.addEventListener('click', function() { 6804 document.querySelectorAll('nav .sub-nav.visible, .sidemenu .sub-nav.visible').forEach(subNavEl => { 6805 subNavEl.classList.remove('visible'); 6806 }); 6807 }); 6808 6809 } 6810 6811 document.addEventListener('DOMContentLoaded', lpGlobalInit); 6812 6813 </script>
6813 6814 6815
6815<script type="module"> 6816 function selectorExists(selector) { 6817 return document.querySelector(selector) !== null; 6818 } 6819 6820 // Function to initialize the third-party library 6821 function initParoller(selector = '.my-paroller') { 6822 var $parollerElements = $(selector); 6823 if ($parollerElements.length > 0 && typeof $parollerElements.paroller === 'function') { 6824 $parollerElements.paroller(); 6825 } 6826 } 6827 6828 const parollerSelector = '.my-paroller'; 6829 6830 if (selectorExists(parollerSelector)) { 6831 window.luxuryPresence.libs.loadJs(window.luxuryPresence.libs.jsLibsMap.paroller.jsSrc, function() { 6832 initParoller(parollerSelector); 6833 window.luxuryPresence.libs.jsLibsMap.paroller.isLoaded = true; 6834 }); 6835 } 6836 </script>
6836 6837 6838 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 6838-6839
6838 6839 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
6839GTM-TTW62GG
vendor: 107 bytes, lines 6839-6841
6839" 6840 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 6841
6841<!-- End Google Tag Manager --> 6842 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 6842-6843
6842 6843 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
6843GTM-T9SFQGHZ
vendor: 107 bytes, lines 6843-6845
6843" 6844 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 6845
6845<!-- End Google Tag Manager --> 6846 6847
6847<script 6848 src="https://cdn.luxurypresence.com/scripts/a11y-widget/latest/widget.js" 6849 data-website-id="f8eeb622-1c43-422f-bf48-840bd660be00" 6850 6851 defer></script>
vendor: 1 bytes, line 6851
6851
6852<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>
vendor: 1 bytes, line 6852
6852
6853<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:'a42a11c29a5ea468',t:'MTc5MDY3NTI3Nw=='};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>
6853</body> 6854</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.