{"id":17232,"date":"2020-03-11T20:26:23","date_gmt":"2020-03-11T20:26:23","guid":{"rendered":"https:\/\/demo37.houzez.co\/?page_id=17232"},"modified":"2026-07-30T23:13:43","modified_gmt":"2026-07-30T23:13:43","slug":"agence-immobiliere-anglaise-hesperange","status":"publish","type":"page","link":"https:\/\/zeas.immo\/fr\/","title":{"rendered":"Immobilier \u00e0 Hesperange"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"17232\" class=\"elementor elementor-17232\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7562bbd e-flex e-con-boxed e-con e-parent\" data-id=\"7562bbd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-35172d9 elementor-widget elementor-widget-html\" data-id=\"35172d9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Zeas Immo \u2014 Hesperange Real Estate<\/title>\n\n  <!-- Brand font: Inter, loaded sitewide via the child theme's own @font-face\n       (same-origin, all weights, no CORS) \u2014 no separate Google Fonts import\n       needed on this page. -->\n\n  <style>\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   zeas.immo \u2014 Homepage Part 1  (v4 \u2014 Jul 2026)\n   v4 changes:\n   - Section reorder (widening lens): Market grid moved up under Pillars\n   - NEW International (exclusive) section \u2014 editorial cards\n   - eXp listings renamed \"The wider network behind us\" + eXp-blue accent\n   - NEW closing CTA band\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n.eyebrow {\n  display: flex; align-items: center; gap: 12px;\n  font-size: 11px; font-weight: 600;\n  letter-spacing: 0.18em; text-transform: uppercase;\n  color: #FF5C0B; margin-bottom: 16px;\n}\n.eyebrow::before, .eyebrow::after {\n  content: ''; width: 24px; height: 1px; background: #FF5C0B; flex-shrink: 0;\n}\n.eyebrow.center  { justify-content: center; }\n.eyebrow.no-line::before, .eyebrow.no-line::after { display: none; }\n.eyebrow.dk::before, .eyebrow.dk::after { background: #444240; }\n\n\/* Mobile-safe eyebrow for market section *\/\n.market-eyebrow {\n  width: 100%;\n  max-width: 100%;\n  padding: 0 16px;\n  box-sizing: border-box;\n}\n.market-eyebrow::before,\n.market-eyebrow::after {\n  flex: 1 1 24px;\n  width: auto;\n  min-width: 16px;\n}\n.market-eyebrow .eyebrow-text {\n  display: block;\n  min-width: 0;\n  text-align: center;\n  white-space: normal;\n  overflow-wrap: anywhere;\n  word-break: normal;\n  line-height: 1.45;\n}\n\n\n.stitle {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: clamp(26px, 3vw, 40px); font-weight: 500;\n  color: #111110; line-height: 1.1; letter-spacing: -0.02em;\n}\n.stitle.dk  { color: #f5f3ef; }\n.stitle.ctr { text-align: center; }\n\n\/* \u2500\u2500\u2500 BUTTONS \u2500\u2500\u2500 *\/\n.btn-primary {\n  display: inline-flex; align-items: center; gap: 10px;\n  background: #FF5C0B !important; color: #fff !important;\n  padding: 15px 38px; font-family: 'Inter', sans-serif;\n  font-size: 15px; font-weight: 500; letter-spacing: 0.05em;\n  text-decoration: none !important; border: none; cursor: pointer;\n  transition: background 220ms, transform 150ms;\n}\n.btn-primary:hover,\n.btn-primary:focus { background: #FF6E28 !important; color: #fff !important; transform: translateY(-2px); }\n.btn-primary svg   { width: 16px; height: 16px; transition: transform 220ms; color: #fff !important; }\n.btn-primary:hover svg { transform: translateX(4px); }\n\n.btn-outline {\n  display: inline-flex !important; align-items: center !important; gap: 10px !important;\n  background: transparent !important; color: #f5f3ef !important;\n  padding: 14px 36px !important; border: 1px solid rgba(255,255,255,0.35) !important;\n  font-family: 'Inter', sans-serif !important; font-size: 15px !important;\n  font-weight: 500 !important; letter-spacing: 0.05em !important;\n  text-decoration: none !important; cursor: pointer !important;\n  transition: border-color 220ms, background 220ms, color 220ms !important;\n}\n.btn-outline:hover { border-color: #FF5C0B !important; background: #FF5C0B !important; color: #fff !important; }\n.btn-outline svg   { width: 16px; height: 16px; transition: transform 220ms; color: #f5f3ef !important; }\n.btn-outline:hover svg { transform: translateX(4px); }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   HERO\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.hero {\n  background: #111110;\n  position: relative; overflow: hidden; text-align: center;\n}\n.hero::after {\n  content: ''; position: absolute; inset: 0; pointer-events: none;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'\/%3E%3C\/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'\/%3E%3C\/svg%3E\");\n}\n.hero-body {\n  position: relative; z-index: 1;\n  display: flex; flex-direction: column; align-items: center;\n  padding-top: 72px; padding-bottom: 64px;\n}\n.hero h1 {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: clamp(40px, 5.5vw, 66px); font-weight: 500;\n  line-height: 1.05; letter-spacing: -0.025em;\n  color: #f5f3ef; margin-bottom: 24px; max-width: 820px;\n  white-space: normal !important; overflow-wrap: break-word;\n}\n.hero h1 em { font-style: italic; color: #FF5C0B; }\n.hero-sub {\n  font-size: 16px; font-weight: 300; color: #a9a49d;\n  line-height: 1.8; max-width: 560px; margin: 0 auto 64px;\n}\n.hero-cta-row {\n  display: flex; align-items: center;\n  justify-content: center; gap: 24px; flex-wrap: wrap;\n}\n.stat-bar {\n  position: relative; z-index: 1;\n  display: grid; grid-template-columns: repeat(4, 1fr);\n  border-top: 1px solid #2e2e2b;\n}\n.stat-item {\n  padding: 28px 20px; text-align: center;\n  border-right: 1px solid #2e2e2b;\n}\n.stat-item:last-child { border-right: none; }\n.stat-num {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 48px; font-weight: 300;\n  line-height: 1; color: #f5f3ef; letter-spacing: -0.03em;\n}\n.stat-num sup { font-size: 20px; font-weight: 400; vertical-align: super; color: #FF5C0B; }\n.stat-label { font-size: 15px; font-weight: 300; color: #c8c4be; line-height: 1.5; margin-top: 6px; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   MANDATE BANNER\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.mandate {\n  background: #FF5C0B; padding: 14px 60px;\n  display: flex; align-items: center; justify-content: center;\n  gap: 28px; flex-wrap: wrap;\n}\n.mitem { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 500; color: #fff; }\n.mitem svg { width: 15px; height: 15px; flex-shrink: 0; }\n.msep { width: 1px; height: 16px; background: rgba(255,255,255,0.3); }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   THREE PILLARS\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.pillars-section {\n  background: #faf9f7;\n  border-top: 1px solid #e4e0da;\n  border-bottom: 1px solid #e4e0da;\n  padding: 80px 0;\n}\n.pillars-intro {\n  text-align: center; margin-bottom: 56px;\n}\n.pillars-intro p {\n  font-size: 16px; color: #555552;\n  max-width: 540px; margin: 0 auto; line-height: 1.75;\n}\n\n\/* 3-column cards + shared panel below *\/\n.pillars-grid {\n  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px;\n  max-width: 1240px !important; margin-left: auto !important; margin-right: auto !important; width: 100%;\n}\n.pillar-card {\n  display: flex; flex-direction: column; min-width: 0; overflow: hidden;\n  background: #fff; border: 1px solid #e4e0da; border-bottom: 2px solid transparent;\n  padding: 26px 24px 22px; text-align: left; cursor: pointer;\n  font-family: inherit;\n  transition: border-color .2s, transform .2s, box-shadow .2s;\n}\n.pillar-card:hover {\n  transform: translateY(-3px);\n  border-color: #d8d4ce !important;\n  box-shadow: 0 10px 28px rgba(17,17,16,.09) !important;\n}\n.pillar-card.open {\n  border-color: #d8d4ce;\n  border-bottom-color: #FF5C0B !important;\n  box-shadow: 0 8px 22px rgba(17,17,16,.07);\n}\n.pillar-tag {\n  font-size: 10px; font-weight: 600; letter-spacing: 0.2em;\n  text-transform: uppercase; color: #FF5C0B; margin-bottom: 12px;\n}\n.pillar-line-1, .pillar-line-2, .pillar-line-3 {\n  white-space: normal !important; overflow-wrap: break-word; word-break: normal; max-width: 100%;\n}\n.pillar-line-1 {\n  font-size: clamp(16px, 1.5vw, 19px); font-weight: 500;\n  color: #111110; line-height: 1.3; letter-spacing: -0.015em; margin-bottom: 8px;\n}\n.pillar-line-2 {\n  font-size: 14px; font-weight: 400; color: #FF5C0B; line-height: 1.45;\n}\n.pillar-card-foot {\n  display: flex; align-items: center; justify-content: space-between; gap: 12px;\n  margin-top: auto; padding-top: 20px;\n}\n.pillar-line-3 {\n  font-size: 12px; color: #999895; font-weight: 400; line-height: 1.4;\n  transition: color 220ms;\n}\n.pillar-card:hover .pillar-line-3, .pillar-card.open .pillar-line-3 { color: #FF5C0B; }\n.pillar-toggle {\n  width: 30px; height: 30px; flex-shrink: 0;\n  border: 1px solid #e4e0da; display: flex; align-items: center; justify-content: center;\n  transition: border-color 220ms, background 220ms;\n}\n.pillar-card:hover .pillar-toggle { border-color: #FF5C0B; background: rgba(255,92,11,.06); }\n.pillar-card.open .pillar-toggle { border-color: #FF5C0B; background: #FF5C0B; }\n.pillar-toggle-icon {\n  width: 13px; height: 13px; color: #FF5C0B; transition: transform 250ms, color 220ms;\n  animation: pillarPulse 2.4s ease-in-out infinite;\n}\n.pillar-card.open .pillar-toggle-icon { transform: rotate(45deg); color: #fff; animation: none; }\n@keyframes pillarPulse {\n  0%, 100% { opacity: 1; transform: scale(1); }\n  50%       { opacity: 0.45; transform: scale(0.82); }\n}\n\n\/* Shared panel below the card row \u2014 only the active one is visible *\/\n.pillars-panels { max-width: 1240px; margin: 0 auto; width: 100%; }\n.pillars-expanded {\n  max-height: 0; overflow: hidden;\n  transition: max-height 0.45s cubic-bezier(0, 0, 0.3, 1);\n}\n.pillars-expanded.visible { max-height: 1400px; }\n.pillars-expanded-inner {\n  position: relative;\n  margin-top: 18px; padding: 36px 40px;\n  background: #ffffff; border: 1px solid #e4e0da; border-top: 2px solid #FF5C0B;\n  display: grid; grid-template-columns: 1.6fr 1fr;\n  gap: 40px; align-items: stretch;\n}\n\/* Pointer\/notch connecting the panel to the active card *\/\n.pillars-expanded-inner::before {\n  content: ''; position: absolute; top: -9px; left: 50%; width: 16px; height: 16px;\n  background: #ffffff; border-left: 1px solid #e4e0da; border-top: 1px solid #e4e0da;\n  transform: translateX(-50%) rotate(45deg);\n}\n#expand-buying  .pillars-expanded-inner::before { left: 16.6%; }\n#expand-selling .pillars-expanded-inner::before { left: 50%; }\n#expand-renting .pillars-expanded-inner::before { left: 83.4%; }\n@media (max-width: 860px) {\n  .pillars-grid { grid-template-columns: 1fr; }\n  \/* panel now sits directly under its card (moved by JS) \u2014 the grid gap is enough *\/\n  .pillars-expanded-inner { margin-top: 0; }\n}\n.pillar-proof-label {\n  font-size: 11px; font-weight: 600; letter-spacing: 0.14em;\n  text-transform: uppercase; color: #FF5C0B; margin-bottom: 14px;\n  display: block;\n}\n.pillar-proof p {\n  font-size: 16px; color: #555552; line-height: 1.8;\n  font-weight: 300; margin-bottom: 14px;\n}\n.pillar-proof strong { color: #111110; font-weight: 500; }\n.pillar-proof-stat {\n  display: inline-flex; align-items: baseline; gap: 10px;\n  padding: 12px 20px; background: rgba(255,92,11,0.06);\n  border-left: 2px solid #FF5C0B; margin-top: 8px;\n}\n.pstat-num {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 32px; font-weight: 300; color: #111110;\n  letter-spacing: -0.02em; line-height: 1;\n}\n.pstat-label { font-size: 13px; color: #555552; font-weight: 300; line-height: 1.4; }\n.pstat-note { font-size: 11px; color: #999895; margin-top: 8px; display: block; }\n.pillar-cta-col {\n  display: flex; flex-direction: column;\n  justify-content: center; gap: 18px;\n  background: #faf9f7; border: 1px solid #e4e0da; padding: 28px 26px;\n}\n.pillar-ac-label {\n  font-size: 11px; font-weight: 600; letter-spacing: 0.14em;\n  text-transform: uppercase; color: #999895;\n}\n.pillar-ac-stat { display: flex; align-items: baseline; gap: 10px; }\n.pillar-ac-stat .n {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 40px; font-weight: 300; color: #111110; letter-spacing: -0.02em; line-height: 1;\n}\n.pillar-ac-stat .t { font-size: 13px; color: #555552; line-height: 1.4; }\n.pillar-ac-bullets { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }\n.pillar-ac-bullets li { display: flex; align-items: flex-start; gap: 9px; font-size: 14px; color: #555552; line-height: 1.4; }\n.pillar-ac-bullets svg { width: 15px; height: 15px; color: #FF5C0B; flex-shrink: 0; margin-top: 2px; }\n.pillar-cta-link {\n  display: inline-flex; align-items: center; gap: 10px;\n  background: #FF5C0B; color: #fff;\n  padding: 15px 32px; font-family: 'Inter', sans-serif;\n  font-size: 14px; font-weight: 500; letter-spacing: 0.04em;\n  text-decoration: none; transition: background 220ms, transform 150ms;\n  align-self: flex-start;\n}\n.pillar-cta-link:hover { background: #FF6E28; transform: translateY(-2px); }\n.pillar-cta-link svg { width: 14px; height: 14px; transition: transform 200ms; }\n.pillar-cta-link:hover svg { transform: translateX(4px); }\n.pillar-secondary-link {\n  font-size: 13px; color: #555552; font-weight: 400;\n  border-bottom: 1px solid #e4e0da; padding-bottom: 2px;\n  align-self: flex-start;\n  transition: color 220ms, border-color 220ms;\n}\n.pillar-secondary-link:hover { color: #FF5C0B; border-color: #FF5C0B; }\n\n\/* \u2500\u2500 ANIMATIONS \u2500\u2500 *\/\n@keyframes fadeUp {\n  from { opacity: 0; transform: translateY(18px); }\n  to   { opacity: 1; transform: translateY(0); }\n}\n.hero .eyebrow { animation: fadeUp .5s cubic-bezier(0.25, 0.1, 0.25, 1) both; }\n.hero h1       { animation: fadeUp .6s .08s cubic-bezier(0.25, 0.1, 0.25, 1) both; }\n.hero-sub      { animation: fadeUp .6s .16s cubic-bezier(0.25, 0.1, 0.25, 1) both; }\n.hero-cta-row  { animation: fadeUp .6s .24s cubic-bezier(0.25, 0.1, 0.25, 1) both; }\n.stat-bar      { animation: fadeUp .5s .30s cubic-bezier(0.25, 0.1, 0.25, 1) both; }\n\n\/* \u2500\u2500 RESPONSIVE \u2500\u2500 *\/\n@media (max-width: 960px) {\n  .stat-bar { grid-template-columns: repeat(2, 1fr); }\n  .stat-item:nth-child(2) { border-right: none; }\n  .stat-item:nth-child(3), .stat-item:nth-child(4) { border-top: 1px solid #2e2e2b; }\n  .stat-item:nth-child(4) { border-right: none; }\n  .pillars-expanded-inner { padding: 28px 24px; grid-template-columns: 1fr; gap: 28px; }\n  .pillars-expanded-inner::before { display: none; }\n  .pillar-cta-col { padding-top: 4px; }\n  .msep      { display: none; }\n  .mandate   { gap: 12px; }\n  .drawer-sub { white-space: normal; }\n  .drawer-title { font-size: 20px; }\n  \/* Pillars container padding *\/\n  .pillars-inner { padding-left: 24px !important; padding-right: 24px !important; }\n  \/* Toggle box *\/\n  .pillar-toggle { width: 28px !important; height: 28px !important; }\n}\n@media (max-width: 600px) {\n  .hero h1 { font-size: 36px; }\n  .hero-cta-row { flex-direction: column; align-items: stretch; }\n  .btn-primary, .btn-outline { justify-content: center; }\n  .stat-bar { grid-template-columns: 1fr 1fr; }\n  .mandate   { flex-direction: column; gap: 8px; padding: 14px 20px; }\n  \/* Pillars container padding *\/\n  .pillars-inner { padding-left: 20px !important; padding-right: 20px !important; }\n  \/* Pillar cards tighter on mobile *\/\n  .pillar-card { padding: 22px 20px 20px; }\n  .pillar-line-1,\n  .pillar-line-2,\n  .pillar-line-3 {\n    white-space: normal !important;\n    word-break: break-word !important;\n    overflow-wrap: break-word !important;\n  }\n  \/* Expanded panel *\/\n  .pillars-expanded-inner { padding: 24px 20px !important; grid-template-columns: 1fr !important; gap: 20px !important; }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   FORM DRAWERS\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.form-drawer {\n  background: #faf9f7; border-bottom: 1px solid #e4e0da;\n  max-height: 0; overflow: hidden;\n  transition: max-height 500ms cubic-bezier(0, 0, 0.3, 1), opacity 400ms ease;\n  opacity: 0;\n}\n.form-drawer.open { max-height: 800px; opacity: 1; }\n.drawer-inner { padding: 64px 0 40px; }\n.drawer-hd {\n  display: flex; align-items: flex-start;\n  justify-content: space-between; gap: 40px; margin-bottom: 40px;\n}\n.drawer-eyebrow { font-size: 10px; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; color: #FF5C0B; margin-bottom: 8px; }\n.drawer-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: clamp(22px, 2.5vw, 30px); font-weight: 500;\n  color: #111110; letter-spacing: -0.02em; margin-bottom: 8px;\n}\n.drawer-sub { font-size: 14px; color: #555552; line-height: 1.7; max-width: 480px; }\n.drawer-close {\n  flex-shrink: 0; width: 40px; height: 40px;\n  background: #edeae4; border: none; cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  color: #555552; transition: background 220ms, color 220ms;\n}\n.drawer-close:hover { background: #FF5C0B; color: #fff; }\n.drawer-close svg { width: 18px; height: 18px; }\n.drawer-form-wrap { margin-bottom: 24px; }\n.form-placeholder {\n  background: #f5f3ef; border: 1px dashed #e4e0da;\n  padding: 32px; text-align: center;\n  font-size: 13px; color: #999895; font-style: italic;\n}\n.drawer-footer-link { font-size: 13px; color: #999895; }\n.drawer-footer-link a { color: #FF5C0B; }\n.drawer-footer-link a:hover { text-decoration: underline; }\n\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   zeas.immo \u2014 eXp Listings Section (homepage insert)\n   v6 \u2014 filters + enquiry modal, no agent names\n   Section \u2192 Full Width, Container \u2192 Full Width, Padding 0\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n.exp-section {\n  padding: 96px 0 72px;\n  background: #ffffff;\n  border-top: 1px solid #e4e0da;\n  border-bottom: 1px solid #e4e0da;\n}\n.exp-inner {\n  max-width: 1240px;\n  margin: 0 auto;\n  padding: 0 60px;\n}\n\n\/* \u2500\u2500 Header \u2500\u2500 *\/\n.exp-hd { text-align: center; margin-bottom: 36px; }\n.exp-eyebrow {\n  display: flex; align-items: center; justify-content: center; gap: 12px;\n  font-size: 12.5px; font-weight: 600;\n  letter-spacing: 0.18em; text-transform: uppercase;\n  color: #FF5C0B; margin-bottom: 22px;\n}\n.exp-eyebrow::before, .exp-eyebrow::after {\n  content: ''; width: 24px; height: 1px; background: #FF5C0B; flex-shrink: 0;\n}\n.exp-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: clamp(26px, 3vw, 40px);\n  font-weight: 500; color: #111110;\n  line-height: 1.1; letter-spacing: -0.02em;\n  margin-bottom: 20px;\n}\n.exp-see-all {\n  display: inline-block;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; font-weight: 500;\n  color: #FF5C0B; text-decoration: none;\n  letter-spacing: 0.04em;\n  border-bottom: 1px solid #FF5C0B;\n  padding-bottom: 1px;\n  transition: opacity 200ms;\n}\n.exp-see-all:hover { opacity: 0.7; }\n\n\/* Shared \"See all \u2026\" button \u2014 orange, turns black on hover *\/\n.btn-seeall {\n  display: inline-flex !important; align-items: center; gap: 10px;\n  background: #FF5C0B !important; color: #ffffff !important;\n  padding: 15px 38px; font-family: 'Inter', sans-serif;\n  font-size: 15px; font-weight: 500; letter-spacing: 0.05em;\n  text-decoration: none !important; border: none; cursor: pointer;\n  transition: background 220ms, transform 150ms;\n}\n.btn-seeall:hover, .btn-seeall:focus {\n  background: #111110 !important; color: #ffffff !important; transform: translateY(-2px);\n}\n\n\/* \u2500\u2500 Filter bar \u2500\u2500 *\/\n.exp-filter-row {\n  display: flex; align-items: center; gap: 12px;\n  flex-wrap: wrap; margin-bottom: 20px;\n  justify-content: center;\n}\n.exp-filter-label {\n  font-size: 11px; font-weight: 600;\n  letter-spacing: 0.1em; text-transform: uppercase;\n  color: #999895; flex-shrink: 0;\n}\n.exp-filters { display: flex; gap: 6px; flex-wrap: wrap; }\n.exp-filter-btn {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 11px; font-weight: 500;\n  padding: 5px 14px;\n  border: 1.5px solid #e4e0da;\n  background: #ffffff; color: #555552;\n  cursor: pointer; transition: all 150ms;\n  text-transform: uppercase; letter-spacing: 0.05em; white-space: nowrap;\n}\n.exp-filter-btn:hover { border-color: #FF5C0B; color: #FF5C0B; }\n.exp-filter-btn.active { background: #FF5C0B; border-color: #FF5C0B; color: #ffffff; }\n\n.exp-reset-btn {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 11px; font-weight: 500;\n  padding: 5px 16px;\n  border: 1.5px solid #d4cfc7;\n  background: #ffffff; color: #777470;\n  cursor: pointer; transition: all 150ms;\n  text-transform: uppercase; letter-spacing: 0.05em; white-space: nowrap;\n  \/* No auto margin: it used to yank Reset to the far edge of the row and,\n     once the row wrapped to two lines, leave a growing empty gap behind it.\n     Keeping it in normal flow lets it sit with the filters as one centered\n     cluster at every width, wrapping cleanly instead of flying off. *\/\n  margin-left: 4px;\n}\n.exp-reset-btn:hover { border-color: #FF5C0B; background: #FF5C0B; color: #ffffff; }\n\n.exp-filter-select {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 11px; color: #555552;\n  padding: 5px 26px 5px 11px;\n  border: 1.5px solid #e4e0da;\n  background: #ffffff url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23999895' stroke-width='1.5' fill='none' stroke-linecap='round'\/%3E%3C\/svg%3E\") no-repeat right 9px center;\n  appearance: none; -webkit-appearance: none; cursor: pointer; outline: none;\n}\n.exp-filter-select:focus { border-color: #FF5C0B; }\n\n\/* \u2500\u2500 Refine panel: commune + price on one row \u2500\u2500 *\/\n.exp-refine {\n  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;\n  gap: 30px; margin: 22px auto 0; max-width: 800px;\n  background: transparent; border: none; padding: 22px 32px;\n}\n.exp-f-field { display: flex; flex-direction: column; gap: 11px; min-width: 0; flex: 0 1 220px; }\n.exp-f-label {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 11px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase;\n  color: #999895; text-align: left;\n}\n.exp-f-divider { width: 1px; align-self: stretch; background: #e4e0da; margin: 6px 0; }\n.exp-f-price { flex: 0 1 320px; }\n\n\/* Commune select *\/\n.exp-select-wrap { position: relative; display: inline-flex; align-items: center; }\n.exp-select-pin { position: absolute; left: 13px; color: #FF5C0B; pointer-events: none; }\n.exp-select {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; color: #111110; font-weight: 500;\n  padding: 12px 36px 12px 36px; min-width: 190px; width: 100%;\n  border: 1.5px solid #e4e0da; background-color: #ffffff;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23555552' stroke-width='1.5' fill='none' stroke-linecap='round'\/%3E%3C\/svg%3E\");\n  background-repeat: no-repeat; background-position: right 13px center;\n  appearance: none; -webkit-appearance: none; cursor: pointer; outline: none;\n  transition: border-color 180ms;\n}\n.exp-select:hover { border-color: #c9c4bc; }\n.exp-select:focus { border-color: #FF5C0B; }\n\n\/* Price range \u2014 two plain dropdowns (min \/ max) instead of a slider.\n   Reuses .exp-select styling; just narrower, since two sit side by side. *\/\n.exp-price-fields { display: flex; align-items: center; gap: 10px; height: 48px; }\n.exp-price-select { flex: 1 1 0; min-width: 0; }\n.exp-price-select .exp-select {\n  min-width: 0; width: 100%;\n  padding: 12px 30px 12px 14px;\n}\n.exp-price-sep { color: #999895; font-size: 13px; flex-shrink: 0; }\n\n@media (max-width: 620px) {\n  \/* keep the whole filter cluster centered (don't shove Reset to the far right) *\/\n  .exp-filter-row { gap: 8px 10px; margin-bottom: 12px; }\n  .exp-reset-btn { margin-left: 0; }\n  \/* commune + price stacked, compact, centered, and close to the cards *\/\n  .exp-refine { flex-direction: column; gap: 16px; padding: 12px 4px 0; margin: 12px auto 0; max-width: 420px; }\n  .exp-f-divider { display: none; }\n  \/* flex: 0 1 auto resets the desktop flex-basis (220px\/320px) \u2014 those\n     numbers set WIDTH in the row layout above, but once .exp-refine\n     switches to flex-direction:column here, flex-basis controls HEIGHT\n     instead, stretching each field to that many px tall and leaving a\n     large empty gap. Explicitly resetting it to auto avoids that. *\/\n  .exp-f-field, .exp-f-price { width: 100%; flex: 0 1 auto; }\n  \/* ~20px between the price slider and the property grid *\/\n  .exp-count { margin: 8px 0 12px; }\n}\n\n\/* Mobile: consistent ~15px spacing at the top\/bottom of each section *\/\n@media (max-width: 600px) {\n  .pillars-section, .market, .intl, .exp-section {\n    padding-top: 15px !important;\n    padding-bottom: 15px !important;\n  }\n}\n\n\/* \u2500\u2500 Count \u2014 PATCH 1: larger + darker \u2500\u2500 *\/\n.exp-count {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; color: #555552; font-weight: 500; margin-bottom: 16px; text-align: center;\n}\n.exp-count strong { color: #111110; font-weight: 700; }\n\n\/* \u2500\u2500 Loading \/ error \u2500\u2500 *\/\n.exp-loading {\n  display: flex; align-items: center; justify-content: center; gap: 12px;\n  color: #999895; font-size: 14px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; padding: 32px 0;\n}\n.exp-spinner {\n  width: 18px; height: 18px;\n  border: 2px solid #e4e0da; border-top-color: #FF5C0B;\n  border-radius: 50%; animation: expspin 0.7s linear infinite; flex-shrink: 0;\n}\n@keyframes expspin { to { transform: rotate(360deg); } }\n.exp-error { font-size: 13px; color: #c0392b; padding: 16px 0; text-align: center; }\n.exp-empty { text-align: center; padding: 40px 0; color: #999895; font-size: 14px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; }\n\n\/* \u2500\u2500 Grid \u2500\u2500 *\/\n.exp-grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 24px;\n  max-width: 1240px; margin: 0 auto; width: 100%;\n}\n\n\/* \u2500\u2500 Card \u2500\u2500 *\/\n.exp-card {\n  background: #ffffff;\n  border: 1px solid #e4e0da; border-bottom: 2px solid transparent;\n  display: flex; flex-direction: column;\n  cursor: pointer;\n  transition: transform 220ms, box-shadow 220ms, border-color 220ms;\n}\n.exp-card:hover {\n  transform: translateY(-3px);\n  box-shadow: 0 6px 20px rgba(17,17,16,.08);\n  border-color: #e4e0da; border-bottom-color: #FF5C0B;\n}\n.exp-card-img {\n  position: relative; aspect-ratio: 4\/3;\n  overflow: hidden; background: #f0efed;\n}\n.exp-card-img img {\n  width:100%; height:100%; object-fit:cover; display:block;\n  transition: transform 400ms;\n}\n.exp-card:hover .exp-card-img img { transform: scale(1.04); }\n.exp-card-badge {\n  position: absolute; top: 10px; left: 10px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 9px; font-weight: 700;\n  letter-spacing: 0.1em; text-transform: uppercase;\n  padding: 3px 8px; background: #FF5C0B; color: #ffffff;\n}\n.exp-card-badge.rental { background: #111110; }\n.exp-card-type {\n  position: absolute; bottom: 10px; left: 10px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 10px; font-weight: 500; letter-spacing: 0.04em;\n  background: rgba(17,17,16,0.65); backdrop-filter: blur(4px);\n  color: #ffffff; padding: 3px 8px;\n}\n\/* PATCH 9: eXp network badge \u2014 top-right of card image *\/\n.exp-card-network-badge {\n  position: absolute; top: 10px; right: 10px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 9px; font-weight: 700;\n  letter-spacing: 0.09em; text-transform: uppercase;\n  padding: 3px 8px;\n  background: rgba(119,116,112,0.85);\n  backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);\n  color: #ffffff;\n}\n.exp-card-body {\n  padding: 18px 18px 16px; flex: 1;\n  display: flex; flex-direction: column; gap: 6px;\n}\n.exp-card-price {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 24px; font-weight: 600; color: #FF5C0B; line-height: 1;\n}\n.exp-card-price .pm { font-size: 13px; font-weight: 400; color: #999895; }\n.exp-card-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 16px; font-weight: 600; color: #111110; line-height: 1.35;\n  display: -webkit-box; -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical; overflow: hidden;\n}\n.exp-card-city {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14.5px; color: #777470;\n  display: flex; align-items: center; gap: 5px;\n}\n.exp-card-city svg { flex-shrink: 0; color: #FF5C0B; }\n.exp-card-specs {\n  display: flex; gap: 16px;\n  padding-top: 12px; border-top: 1px solid #f0efed; margin-top: 4px;\n}\n.exp-spec {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14.5px; color: #555552;\n  display: flex; align-items: center; gap: 5px;\n}\n.exp-spec strong { color: #111110; font-weight: 700; }\n.exp-card-contact {\n  display: flex; align-items: center; gap: 6px;\n  padding-top: 12px; border-top: 1px solid #f0efed; margin-top: auto;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; font-weight: 500; color: #FF5C0B; letter-spacing: 0.01em;\n  pointer-events: none;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   PROPERTY MODAL\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.exp-overlay {\n  display: none; position: fixed; inset: 0;\n  background: rgba(17,17,16,.78);\n  backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);\n  z-index: 99999; overflow-y: auto;\n  padding: 24px 20px; align-items: flex-start; justify-content: center;\n}\n.exp-overlay.open { display: flex; }\n.exp-modal {\n  background: #ffffff; width: 100%; max-width: 1100px;\n  margin: auto; position: relative; overflow: hidden;\n  animation: expmi .22s ease;\n}\n@keyframes expmi { from{opacity:0;transform:translateY(14px)} to{opacity:1;transform:translateY(0)} }\n.exp-modal-close {\n  position: absolute; top: 14px; right: 14px; z-index: 10;\n  width: 40px; height: 40px;\n  background: #ffffff; border: none; border-radius: 50%; cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  color: #111110; transition: background 180ms, color 180ms;\n  box-shadow: 0 2px 8px rgba(17,17,16,.22);\n}\n.exp-modal-close:hover { background: #FF5C0B; color: #ffffff; }\n.exp-modal-gallery {\n  position: relative; height: 60vh; min-height: 320px; max-height: 640px;\n  background: #111110; overflow: hidden; cursor: zoom-in;\n}\n.exp-modal-gallery img { width:100%; height:100%; object-fit:cover; display:block; }\n\/* Edge scrims so the arrows are always legible over any photo *\/\n.exp-modal-gallery.has-multi::before,\n.exp-modal-gallery.has-multi::after {\n  content: ''; position: absolute; top: 0; bottom: 0; width: 110px; z-index: 2;\n  pointer-events: none;\n}\n.exp-modal-gallery.has-multi::before { left: 0;  background: linear-gradient(to right, rgba(17,17,16,.45), rgba(17,17,16,0)); }\n.exp-modal-gallery.has-multi::after  { right: 0; background: linear-gradient(to left,  rgba(17,17,16,.45), rgba(17,17,16,0)); }\n.exp-gal-btn {\n  position: absolute; top: 50%; transform: translateY(-50%);\n  width: 48px; height: 48px; background: rgba(17,17,16,.62);\n  border: 1.5px solid rgba(255,255,255,.7); border-radius: 50%; cursor: pointer; color: #ffffff;\n  display: flex; align-items: center; justify-content: center;\n  transition: background 180ms, transform 180ms; z-index: 6;\n  box-shadow: 0 3px 14px rgba(0,0,0,.4);\n}\n.exp-gal-btn svg { width: 22px; height: 22px; }\n.exp-gal-btn:hover { background: #FF5C0B; border-color: #FF5C0B; transform: translateY(-50%) scale(1.06); }\n.exp-gal-prev { left: 16px; } .exp-gal-next { right: 16px; }\n.exp-gal-ctr {\n  position: absolute; bottom: 14px; right: 16px; z-index: 6;\n  background: rgba(17,17,16,.72); color: #ffffff; font-size: 12px; font-weight: 600;\n  padding: 5px 12px; letter-spacing: .04em; border-radius: 2px;\n  display: inline-flex; align-items: center; gap: 6px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n.exp-modal-body { padding: 28px 32px 32px; }\n.exp-modal-top {\n  display: flex; align-items: flex-start; justify-content: space-between;\n  gap: 16px; flex-wrap: wrap; margin-bottom: 20px;\n}\n.exp-modal-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 23px; font-weight: 600; color: #111110;\n  letter-spacing: -0.01em; margin-bottom: 8px;\n}\n.exp-modal-addr {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 15.5px; color: #777470; display: flex; align-items: center; gap: 5px;\n}\n.exp-listing-attr {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; color: #999895; font-style: italic;\n  margin-top: 8px; letter-spacing: 0.01em;\n}\n.exp-modal-price {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 28px; font-weight: 500; color: #FF5C0B; line-height: 1;\n}\n.exp-modal-price .pm { font-size: 14px; font-weight: 400; color: #999895; }\n.exp-energy {\n  display: inline-flex; align-items: center; margin-top: 6px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 11px; font-weight: 700; padding: 3px 9px; letter-spacing: 0.04em;\n  background: #f0efed; color: #555552;\n}\n.exp-energy[data-c=\"A\"]{background:#1e7e34;color:#fff} .exp-energy[data-c=\"B\"]{background:#28a745;color:#fff}\n.exp-energy[data-c=\"C\"]{background:#ffc107;color:#333} .exp-energy[data-c=\"D\"]{background:#fd7e14;color:#fff}\n.exp-energy[data-c=\"E\"]{background:#dc3545;color:#fff} .exp-energy[data-c=\"F\"]{background:#9c1313;color:#fff}\n.exp-modal-specs {\n  display: flex; gap: 20px; flex-wrap: wrap;\n  padding: 16px 0; border-top: 1px solid #f0efed; border-bottom: 1px solid #f0efed; margin: 16px 0;\n}\n\/* PATCH 6: modal spec 14px *\/\n.exp-modal-spec {\n  display: flex; align-items: center; gap: 7px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 15.5px; color: #111110;\n}\n.exp-modal-spec svg { color: #FF5C0B; flex-shrink: 0; }\n.exp-modal-desc {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 15.5px; line-height: 1.8; color: #444442;\n  white-space: pre-line;\n}\n\n\/* \u2500\u2500 Read more \/ read less \u2500\u2500 *\/\n.exp-desc-wrap { position: relative; }\n.exp-desc-wrap.is-collapsed .exp-modal-desc { max-height: 230px; overflow: hidden; }\n.exp-desc-fade {\n  display: none; position: absolute; left: 0; right: 0; bottom: 40px; height: 64px;\n  background: linear-gradient(to bottom, rgba(255,255,255,0), #ffffff 85%);\n  pointer-events: none;\n}\n.exp-desc-wrap.is-collapsed .exp-desc-fade { display: block; }\n.exp-read-more {\n  display: inline-flex; align-items: center; gap: 6px; margin-top: 14px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; font-weight: 600; letter-spacing: .01em;\n  color: #FF5C0B; background: none; border: none; cursor: pointer; padding: 0;\n  transition: color 150ms;\n}\n.exp-read-more:hover { color: #e04e00; }\n.exp-read-more svg { transition: transform 200ms; flex-shrink: 0; }\n.exp-desc-wrap.is-expanded .exp-read-more svg { transform: rotate(180deg); }\n\/* Column layout \u2014 now holds a lead line plus a 3-column action row\n   (Ask \/ Book a viewing \/ See full cost overview), matching the action\n   bar on render.php's direct-listing pages, not a single side-by-side\n   text+button row. *\/\n.exp-modal-footer {\n  display: flex; flex-direction: column; align-items: stretch;\n  gap: 14px;\n  margin-top: 24px; padding-top: 20px; border-top: 1px solid #f0efed;\n}\n.exp-modal-footer-text {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 15px; color: #555552; line-height: 1.55;\n}\n.exp-modal-footer-text span { display: block; font-size: 13.5px; color: #999895; margin-top: 3px; }\n\/* Primary actions row \u2014 auto-fit means it still fills evenly when the\n   cost-overview button is absent (non-LU listings), and stacks to one\n   column on narrow phones without a dedicated breakpoint. *\/\n.exp-actions { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; }\n.exp-actions .exp-cta-btn { justify-content: center; width: 100%; }\n.exp-cta-btn.exp-cta-btn--ghost { background: #ffffff; color: #111110; border: 1.5px solid #111110; }\n.exp-cta-btn.exp-cta-btn--ghost:hover { background: #111110; color: #ffffff; }\n.exp-cta-btn {\n  display: inline-flex; align-items: center; gap: 8px;\n  background: #FF5C0B; color: #ffffff;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14.5px; font-weight: 600;\n  padding: 13px 26px; border: none; cursor: pointer;\n  text-decoration: none; letter-spacing: 0.02em;\n  transition: background 180ms, transform 120ms;\n}\n\n.exp-modal-similar { margin-top: 32px; padding-top: 26px; border-top: 1px solid #f0efed; }\n.exp-modal-similar-head { margin-bottom: 18px; }\n.exp-sim-eyebrow {\n  font-size: 10px; letter-spacing: .22em; text-transform: uppercase;\n  color: #FF5C0B; font-weight: 600; display: block; margin-bottom: 6px;\n}\n.exp-modal-similar-head h3 {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 18px; font-weight: 600; margin: 0; color: #111110;\n}\n.exp-modal-similar-track {\n  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(220px,1fr);\n  gap: 16px; overflow-x: auto; scroll-snap-type: x mandatory;\n  padding-bottom: 6px; scrollbar-width: none;\n}\n.exp-modal-similar-track::-webkit-scrollbar { display: none; }\n@media(min-width:700px){ .exp-modal-similar-track{ grid-auto-columns: calc((100% - 32px)\/3); } }\n.exp-sim-card {\n  scroll-snap-align: start; border: 1px solid #e4e0da; background: #fff;\n  display: flex; flex-direction: column; text-decoration: none; color: inherit;\n  transition: transform 200ms, box-shadow 200ms;\n}\n.exp-sim-card:hover { transform: translateY(-3px); box-shadow: 0 12px 28px rgba(17,17,16,.10); }\n.exp-sim-img { aspect-ratio: 4\/3; overflow: hidden; background: #f0efed; }\n.exp-sim-img img { width:100%; height:100%; object-fit:cover; display:block; transition: transform 350ms; }\n.exp-sim-card:hover .exp-sim-img img { transform: scale(1.04); }\n.exp-sim-body { padding: 14px 16px 16px; display: flex; flex-direction: column; flex: 1; }\n.exp-sim-city {\n  font-size: 11px; color: #777470; display: flex; align-items: center; gap: 4px;\n  margin-bottom: 6px; letter-spacing: .02em;\n}\n.exp-sim-city svg { flex-shrink: 0; color: #FF5C0B; }\n.exp-sim-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; font-weight: 600; color: #111110; line-height: 1.32;\n  margin-bottom: 10px;\n  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;\n  min-height: 2.5em;\n}\n.exp-sim-specs { display: flex; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }\n.exp-sim-spec { font-size: 11.5px; color: #555552; display: flex; align-items: center; gap: 4px; }\n.exp-sim-spec svg { color: #FF5C0B; flex-shrink: 0; }\n.exp-sim-spec strong { color: #111110; font-weight: 700; }\n.exp-sim-foot {\n  margin-top: auto; padding-top: 12px; border-top: 1px solid #f0efed;\n  display: flex; align-items: center; justify-content: space-between;\n}\n.exp-sim-price {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14.5px; font-weight: 600; color: #FF5C0B;\n}\n.exp-sim-cta { font-size: 11.5px; font-weight: 600; color: #111110; display: flex; align-items: center; gap: 3px; }\n.exp-sim-cta svg { transition: transform 200ms; }\n.exp-sim-card:hover .exp-sim-cta { color: #FF5C0B; }\n.exp-sim-card:hover .exp-sim-cta svg { transform: translateX(3px); }\n.exp-cta-btn:hover { background: #FF6E28; transform: translateY(-1px); color: #fff; }\n\/* Same low-contrast issue as the acquisition teaser button \u2014 orange to\n   lighter-orange barely reads as a hover state. \"Contact the listing agent\"\n   in the modal footer gets the same dark-on-hover treatment. *\/\n.exp-modal-footer .exp-cta-btn:hover { background: #111110; color: #ffffff; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   ENQUIRY MODAL\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.exp-enq-overlay {\n  display: none; position: fixed; inset: 0;\n  background: rgba(17,17,16,.82);\n  backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);\n  z-index: 999999; overflow-y: auto;\n  padding: 24px 20px; align-items: flex-start; justify-content: center;\n}\n.exp-enq-overlay.open { display: flex; }\n.exp-enq-modal {\n  background: #ffffff; width: 100%; max-width: 540px;\n  margin: auto; padding: 36px 36px 32px; position: relative;\n  animation: expmi .22s ease;\n}\n.exp-enq-close {\n  position: absolute; top: 14px; right: 14px;\n  width: 40px; height: 40px; background: #ffffff;\n  border: none; border-radius: 50%; cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  color: #111110; transition: background 180ms, color 180ms;\n  box-shadow: 0 2px 8px rgba(17,17,16,.22);\n}\n.exp-enq-close:hover { background: #FF5C0B; color: #ffffff; }\n.exp-enq-prop-ref {\n  background: #faf9f7; border-left: 3px solid #FF5C0B;\n  padding: 12px 16px; margin-bottom: 24px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; color: #555552; line-height: 1.5;\n}\n.exp-enq-prop-ref strong {\n  display: block; font-size: 14px; color: #111110; margin-bottom: 2px;\n}\n.exp-enq-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 20px; font-weight: 500; color: #111110;\n  letter-spacing: -0.01em; margin-bottom: 6px;\n}\n.exp-enq-sub {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; color: #999895; margin-bottom: 24px; line-height: 1.5;\n}\n.exp-enq-label {\n  display: block; font-size: 11px; font-weight: 600;\n  letter-spacing: 0.08em; text-transform: uppercase;\n  color: #555552; margin-bottom: 6px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n.exp-enq-field {\n  width: 100%;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; color: #111110;\n  padding: 10px 14px; margin-bottom: 16px;\n  border: 1.5px solid #e4e0da; background: #ffffff; outline: none;\n  transition: border-color 180ms;\n}\n.exp-enq-field:focus { border-color: #FF5C0B; }\n.exp-enq-textarea { min-height: 120px; resize: vertical; line-height: 1.6; }\n.exp-enq-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\n.exp-enq-submit {\n  width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px;\n  background: #FF5C0B; color: #ffffff;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; font-weight: 600;\n  padding: 13px 24px; border: none; cursor: pointer;\n  letter-spacing: 0.02em; margin-top: 8px; transition: background 180ms;\n}\n.exp-enq-submit:hover { background: #FF6E28; }\n.exp-enq-note {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 11px; color: #999895; text-align: center; margin-top: 12px; line-height: 1.5;\n}\n.exp-enq-success { text-align: center; padding: 20px 0; }\n.exp-enq-success .exp-tick {\n  width: 48px; height: 48px; background: #FF5C0B; border-radius: 50%;\n  display: flex; align-items: center; justify-content: center; margin: 0 auto 16px;\n}\n.exp-enq-success h3 {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 18px; font-weight: 500; color: #111110; margin-bottom: 8px;\n}\n.exp-enq-success p {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; color: #555552; line-height: 1.6;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   ACQUISITION COST MODAL (Luxembourg listings only)\n   Same idea as render.php's native calculator: a table of the three\n   flat charges every buyer pays, then a short form for the handful of\n   inputs that vary by buyer (B\u00ebllegen Akt, resale duty, commune\n   surcharge). Computed entirely client-side \u2014 there's no server render\n   for network listings, see cpt.php: \"network listings stay modal-only\".\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.exp-acq-overlay {\n  display: none; position: fixed; inset: 0;\n  background: rgba(17,17,16,.82);\n  backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);\n  z-index: 999999; overflow-y: auto;\n  padding: 24px 20px; align-items: flex-start; justify-content: center;\n}\n.exp-acq-overlay.open { display: flex; }\n.exp-acq-modal {\n  background: #ffffff; width: 100%; max-width: 640px;\n  margin: auto; padding: 36px 36px 32px; position: relative;\n  animation: expmi .22s ease;\n}\n.exp-acq-close {\n  position: absolute; top: 14px; right: 14px;\n  width: 40px; height: 40px; background: #ffffff;\n  border: none; border-radius: 50%; cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  color: #111110; transition: background 180ms, color 180ms;\n  box-shadow: 0 2px 8px rgba(17,17,16,.22);\n}\n.exp-acq-close:hover { background: #FF5C0B; color: #ffffff; }\n.exp-acq-h {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 17px; font-weight: 600; color: #111110; margin: 2px 0 6px;\n}\n.exp-acq-lead {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; color: #555552; line-height: 1.6; margin-bottom: 16px;\n}\n.exp-acq-eyebrow {\n  font-size: 10px; letter-spacing: .22em; text-transform: uppercase;\n  color: #FF5C0B; font-weight: 600; display: block; margin-bottom: 6px;\n}\n.exp-acq-table { border: 1px solid #e4e0da; }\n.exp-acq-row {\n  display: flex; justify-content: space-between; align-items: center; gap: 16px;\n  padding: 12px 16px; border-bottom: 1px solid #e4e0da;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px;\n}\n.exp-acq-row:last-child { border-bottom: none; }\n.exp-acq-row span { color: #444442; font-weight: 400; }\n.exp-acq-row span i { display: block; font-style: normal; font-size: 11.5px; color: #999895; margin-top: 2px; }\n.exp-acq-row b { font-weight: 600; color: #111110; white-space: nowrap; }\n.exp-acq-row--tot { background: #111110; }\n.exp-acq-row--tot span { color: #fff; font-weight: 500; }\n.exp-acq-row--tot span i { color: #a9a49d; }\n.exp-acq-row--tot b { color: #FF5C0B; font-size: 17px; }\n.exp-acq-hr { border: none; border-top: 1px solid #e4e0da; margin: 26px 0 18px; }\n#expAcqForm { display: flex; flex-direction: column; gap: 4px; }\n.exp-acq-check {\n  display: flex !important; flex-direction: row !important; align-items: center; gap: 8px !important;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px !important; font-weight: 500 !important; text-transform: none !important;\n  color: #111110 !important; letter-spacing: 0 !important; margin-bottom: 16px;\n}\n.exp-acq-check input { width: 16px; height: 16px; accent-color: #FF5C0B; }\n.exp-acq-gate-note { font-size: 12.5px; color: #999895; margin: 0 0 10px; font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; }\n.exp-acq-results { margin-top: 22px; }\n.exp-acq-fine { font-size: 11.5px; color: #999895; margin-top: 12px; line-height: 1.6; font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; }\n.exp-acq-fine a { color: #FF5C0B; font-weight: 600; text-decoration: none; }\n.exp-acq-fine a:hover { text-decoration: underline; }\n@media (max-width: 620px) { .exp-acq-modal { padding: 24px 20px; } .exp-enq-row { grid-template-columns: 1fr; } }\n\n\/* Acquisition-cost teaser inside the property modal itself *\/\n.exp-acq-teaser {\n  display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;\n  background: #faf9f7; border: 1px solid #e4e0da; padding: 18px 20px; margin: 16px 0;\n}\n.exp-acq-teaser-text { flex: 1 1 260px; min-width: 200px; }\n.exp-acq-teaser-text h4 {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 15px; font-weight: 600; color: #111110; margin: 2px 0 4px;\n}\n.exp-acq-teaser-text p {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; color: #555552; line-height: 1.55; margin: 0;\n}\n.exp-acq-teaser .exp-cta-btn { flex-shrink: 0; }\n\/* Orange\u2192lighter-orange (the default .exp-cta-btn:hover) barely reads as a\n   hover state \u2014 swap this one to a dark\/grey nuance so it's unmistakable. *\/\n.exp-acq-teaser .exp-cta-btn:hover { background: #111110; color: #ffffff; transform: translateY(-1px); }\n\n\/* \u2500\u2500 Responsive \u2500\u2500 *\/\n@media (max-width: 960px) {\n  .exp-inner { padding: 0 32px; }\n  .exp-grid  { grid-template-columns: repeat(2, 1fr); gap: 16px; }\n}\n@media (max-width: 600px) {\n  .exp-inner { padding: 0 20px; }\n  .exp-grid  { grid-template-columns: 1fr 1fr; gap: 12px; }\n  .exp-section { padding: 48px 0; }\n  .exp-modal-body { padding: 20px; }\n  .exp-enq-modal  { padding: 24px 20px; }\n  .exp-enq-row    { grid-template-columns: 1fr; }\n}\n@media (max-width: 420px) { .exp-grid { grid-template-columns: 1fr; } }\n\n\/* \u2500\u2500 Fullscreen lightbox \u2500\u2500 *\/\n.exp-lightbox {\n  display: none; position: fixed; inset: 0;\n  background: rgba(0,0,0,0.96); z-index: 9999999;\n  align-items: center; justify-content: center;\n}\n.exp-lightbox.open { display: flex; }\n.exp-lightbox-img { max-width: 95vw; max-height: 95vh; object-fit: contain; display: block; }\n.exp-lb-btn {\n  position: fixed; width: 44px; height: 44px;\n  background: rgba(255,255,255,0.15); border: none; border-radius: 50%;\n  cursor: pointer; color: #ffffff;\n  display: flex; align-items: center; justify-content: center;\n  transition: background 180ms; z-index: 10;\n}\n.exp-lb-btn:hover { background: #FF5C0B; }\n.exp-lb-close { top: 16px; right: 16px; }\n.exp-lb-prev  { left: 16px; top: 50%; transform: translateY(-50%); }\n.exp-lb-next  { right: 16px; top: 50%; transform: translateY(-50%); }\n.exp-lb-ctr {\n  position: fixed; bottom: 16px; left: 50%; transform: translateX(-50%);\n  background: rgba(255,255,255,0.15); color: #ffffff;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 12px; padding: 4px 14px; border-radius: 20px;\n}\n\n\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   zeas.immo \u2014 Homepage Part 2  (v2 \u2014 Apr 2026)\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n.eyebrow {\n  display: flex; align-items: center; gap: 12px;\n  font-size: 11px; font-weight: 600;\n  letter-spacing: 0.18em; text-transform: uppercase;\n  color: #FF5C0B; margin-bottom: 16px;\n}\n.eyebrow::before, .eyebrow::after {\n  content: ''; width: 24px; height: 1px; background: #FF5C0B; flex-shrink: 0;\n}\n.eyebrow.center { justify-content: center; }\n.eyebrow.no-line::before, .eyebrow.no-line::after { display: none; }\n\n.sec-hd { text-align: center; margin-bottom: 48px; }\n.sec-hd .stitle { margin-bottom: 8px; }\n.sec-hd p { font-size: 16px; color: #555552; max-width: 500px; margin: 0 auto; line-height: 1.75; }\n\n.btn-ghost-dark {\n  display: inline-flex; align-items: center; gap: 10px;\n  padding: 10px 32px; border: 1px solid #111110 !important;\n  font-family: 'Inter', sans-serif; font-size: 14px;\n  font-weight: 500; letter-spacing: 0.05em;\n  color: #111110 !important; text-decoration: none !important; white-space: nowrap;\n  transition: border-color 220ms, background 220ms, color 220ms;\n}\n.btn-ghost-dark:hover { border-color: #FF5C0B; background: #FF5C0B; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   MARKET DATA \u2014 VILLAGE GRID (Option B)\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.market {\n  border-top: 1px solid #e4e0da;\n  border-bottom: 1px solid #e4e0da;\n  padding: 72px 0 40px;\n  background: #faf9f7;\n}\n.market-inner,\n.referral-inner,\n.pillars-inner { padding-left: 60px; padding-right: 60px; }\n\n.village-grid {\n  display: grid;\n  grid-template-columns: repeat(5, 1fr);\n  gap: 1px;\n  background: #e4e0da;\n  border: 1px solid #e4e0da;\n}\n\n.vcard {\n  background: #faf9f7 !important;\n  padding: 40px 30px 34px;\n  text-decoration: none !important;\n  display: flex; flex-direction: column; align-items: center; text-align: center;\n  border: 1px solid #e4e0da;\n  border-bottom: 2px solid transparent;\n  transition: background 220ms, border-color 220ms, transform 220ms, box-shadow 220ms;\n  position: relative;\n  color: inherit !important;\n}\n.vcard:hover {\n  background: #edeae4 !important;\n  border-bottom-color: #FF5C0B !important;\n  transform: translateY(-3px);\n  box-shadow: 0 10px 28px rgba(17,17,16,.08);\n  color: inherit !important;\n  text-decoration: none !important;\n}\n\n.vc-name {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 22px; font-weight: 600; color: #111110;\n  margin-bottom: 28px; line-height: 1.15;\n  transition: color 220ms;\n}\n.vcard:hover .vc-name { color: #111110; }\n\n.vc-asking {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 40px; font-weight: 600; color: #FF5C0B;\n  line-height: 1; margin-bottom: 10px; display: block;\n}\n.vc-asking sup { font-size: 17px; font-weight: 400; }\n\n.vc-sub {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; font-weight: 400; color: #999895;\n  letter-spacing: 0.02em; text-transform: none;\n}\n\n.vc-link {\n  font-size: 15px; color: #555552;\n  letter-spacing: 0.04em;\n  display: flex; align-items: center; justify-content: center; gap: 7px;\n  transition: color 220ms;\n  border-top: 1px solid #e4e0da;\n  padding-top: 22px; margin-top: 28px; width: 100%;\n}\n.vc-link svg { width: 14px; height: 14px; transition: transform 200ms; flex-shrink: 0; }\n.vcard:hover .vc-link { color: #FF5C0B; }\n.vcard:hover .vc-link svg { transform: translateX(3px); }\n\n.market-note {\n  font-size: 11px; color: #999895;\n  margin-top: 20px; line-height: 1.6;\n}\n\n\/* \u2500\u2500 Village price band \u2014 a stepped carousel of pill-shaped cards.\n      (Previously a continuously-scrolling marquee; dropped that in favour\n      of this because continuous scroll and \"only ever show whole pills,\n      never a partial one\" are mutually exclusive \u2014 a marquee by\n      definition has content crossing the edges at all times. This reuses\n      the same initCarousel() engine as International\/Network: fixedWidth\n      mode sizes pills to a genuinely compact width, computes how many\n      whole pills actually fit, and steps between positions every 3s \u2014\n      arrows\/dots only appear once they no longer all fit.) \u2500\u2500 *\/\n.vpill {\n  display: inline-flex; align-items: center; gap: 16px; flex: 0 0 auto;\n  background: #ffffff; border: 1px solid #e4e0da; border-radius: 999px;\n  padding: 30px 32px 30px 28px; white-space: nowrap; overflow: hidden;\n  text-decoration: none !important; color: inherit !important;\n  transition: border-color 200ms, background 200ms, transform 200ms, box-shadow 200ms;\n}\n.vpill:hover {\n  border-color: #FF5C0B; background: #fff8f3; transform: translateY(-2px);\n  box-shadow: 0 8px 20px rgba(17,17,16,.08);\n}\n.vpill-name {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 18px; font-weight: 600; color: #111110;\n}\n.vpill-price {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 24px; font-weight: 700; color: #FF5C0B;\n}\n.vpill-price sup { font-size: 13px; font-weight: 400; }\n.vpill-arrow {\n  width: 36px; height: 36px; border-radius: 50%; background: #f0efec;\n  display: flex; align-items: center; justify-content: center; flex-shrink: 0;\n  transition: background 200ms;\n}\n.vpill-arrow svg { width: 16px; height: 16px; color: #111110; transition: color 200ms; }\n.vpill:hover .vpill-arrow { background: #FF5C0B; }\n.vpill:hover .vpill-arrow svg { color: #ffffff; }\n\/* This carousel's track holds far more, much smaller items than\n   International\/Network do, so give it a bit less vertical padding\n   around the arrows than the shared .intl-stage default. *\/\n.vil-carousel .intl-stage { padding: 0 44px; }\n@media (max-width: 620px) {\n  .vpill { padding: 22px 24px 22px 20px; gap: 14px; }\n  .vpill-name { font-size: 16px; }\n  .vpill-price { font-size: 18px; }\n  .vpill-arrow { width: 30px; height: 30px; }\n  .vpill-arrow svg { width: 13px; height: 13px; }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   REFERRAL\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.referral {\n  background: #edeae4 !important;\n  border-top: 1px solid #d8d4ce !important;\n  border-bottom: 1px solid #d8d4ce !important;\n}\n.ref-inner {\n  display: flex; align-items: center;\n  justify-content: space-between; gap: 64px;\n}\n.ref-eyebrow {\n  font-size: 11px; font-weight: 600;\n  letter-spacing: 0.18em; text-transform: uppercase;\n  color: #FF5C0B !important; margin-bottom: 12px;\n}\n.ref-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: clamp(20px, 2.5vw, 28px);\n  font-weight: 500; color: #111110 !important;\n  margin-bottom: 8px; letter-spacing: -0.01em;\n}\n.ref-sub { font-size: 16px; color: #555552 !important; font-weight: 300; line-height: 1.7; }\n.ref-sub strong { color: #FF5C0B !important; font-weight: 500; }\n.ref-sub strong a { color: #FF5C0B !important; text-decoration: underline; text-underline-offset: 3px; }\n\n\/* \u2500\u2500 RESPONSIVE \u2500\u2500 *\/\n@media (max-width: 960px) {\n  .ref-inner { flex-direction: column; gap: 24px; align-items: flex-start; }\n  .market-inner,\n  .referral-inner,\n  .pillars-inner {\n    padding-left: 24px !important;\n    padding-right: 24px !important;\n  }\n}\n@media (max-width: 780px) {\n  .village-grid { grid-template-columns: 1fr 1fr; }\n  .village-grid .vcard:last-child {\n    grid-column: 1 \/ -1;\n    max-width: none;\n    margin: 0;\n    width: 100%;\n  }\n}\n@media (max-width: 600px) {\n  .market { padding: 56px 0; }\n  .village-grid { grid-template-columns: 1fr; }\n  .village-grid .vcard:last-child {\n    grid-column: auto;\n    max-width: none;\n    margin: 0;\n    width: 100%;\n  }\n  .market-inner,\n  .referral-inner,\n  .pillars-inner {\n    padding-left: 20px !important;\n    padding-right: 20px !important;\n  }\n  .market-eyebrow {\n    padding: 0 12px;\n    gap: 8px;\n  }\n  .market-eyebrow .eyebrow-text {\n    font-size: 10px;\n    letter-spacing: 0.14em;\n  }\n  .sec-hd { margin-bottom: 32px; }\n  .sec-hd p {\n    font-size: 15px;\n    line-height: 1.65;\n  }\n  .vcard {\n    padding: 20px 16px 18px;\n    text-align: center;\n  }\n  .vc-name { margin-bottom: 12px; }\n  .vc-asking { font-size: 18px; }\n  .vc-transacted { font-size: 12px; }\n  .vc-gap {\n    margin: 8px auto 12px;\n  }\n  .vc-link {\n    justify-content: center;\n  }\n  .market-note {\n    font-size: 10.5px;\n    line-height: 1.55;\n    margin-top: 14px;\n    text-align: center;\n  }\n  .ref-inner {\n    gap: 18px;\n    align-items: center;\n    text-align: center;\n  }\n  .ref-sub {\n    font-size: 15px;\n    line-height: 1.65;\n  }\n  .btn-ghost-dark {\n    width: 100%;\n    justify-content: center;\n    text-align: center;\n    white-space: normal;\n    padding: 12px 20px;\n  }\n}\n\n\n\/* Grey hover \/ press feedback on pillar cards (also beats theme button hover) *\/\n.pillar-card:hover,\n.pillar-card:focus { background-color: #efedea !important; color: inherit !important; }\n.pillar-card:active { background-color: #e6e3de !important; }\n.pillar-card.open  { background-color: #efedea !important; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   zeas.immo \u2014 v4 ADDITIONS (Jul 2026)\n   International section \u00b7 eXp-network reframing \u00b7 closing CTA\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n\/* \u2500\u2500 ZEAS.IMMO EXCLUSIVE (our own Luxembourg listings \u2014 featured, sits above\n      both International and the eXp network) \u2500\u2500 *\/\n.zx { padding: 80px 0; background: #fff8f3; border-bottom: 1px solid #e4e0da; }\n.zx-wrap { max-width: 1240px; margin: 0 auto; padding: 0 60px; }\n.zx-hd { max-width: 720px; margin: 0 auto 44px; text-align: center; }\n.zx-hd .stitle { margin-bottom: 16px; }\n.zx-hd p { font-size: 16px; color: #555552; line-height: 1.8; margin: 0; }\n.zx-hd p strong { color: #111110; font-weight: 500; }\n.zx-badge {\n  position: absolute; top: 14px; left: 14px; z-index: 2;\n  font-size: 9.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;\n  background: #FF5C0B; color: #fff; padding: 6px 11px;\n  display: inline-flex; align-items: center; gap: 6px;\n}\n.zx-badge::before { content: ''; width: 5px; height: 5px; background: #111110; border-radius: 50%; }\n@media (max-width: 960px) { .zx-wrap { padding: 0 32px; } }\n\n\/* \u2500\u2500 Local Listings tabs (zeas.immo Exclusive \/ Network \u2014 one shared\n      card design, see localCardHTML in the script) \u2500\u2500 *\/\n.ll-tabs { display: flex; justify-content: center; gap: 10px; margin-bottom: 40px; flex-wrap: wrap; }\n.ll-tab {\n  display: inline-flex; align-items: center; gap: 8px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 15px; font-weight: 600; letter-spacing: 0.01em;\n  padding: 14px 28px; border: 1.5px solid #e4e0da; background: #ffffff; color: #111110;\n  cursor: pointer; transition: border-color 150ms, color 150ms, background 150ms;\n}\n.ll-tab:hover { border-color: #FF5C0B; color: #FF5C0B; }\n.ll-tab.active { background: #111110; border-color: #111110; color: #ffffff; }\n.ll-tab-count { font-size: 13px; font-weight: 400; color: #999895; }\n.ll-tab.active .ll-tab-count { color: rgba(255,255,255,.62); }\n\/* \"Our Listings\" stays visually orange even when inactive, so it reads\n   as the special\/branded option next to the neutral \"All Listings\". *\/\n.ll-tab-mine { border-color: #FF5C0B; color: #FF5C0B; }\n.ll-tab-mine .ll-tab-count { color: #FF5C0B; opacity: .75; }\n.ll-tab-mine:hover { background: #FF5C0B; color: #ffffff; }\n.ll-tab-mine:hover .ll-tab-count { color: #ffffff; opacity: .8; }\n.ll-tab-mine.active { background: #FF5C0B; border-color: #FF5C0B; color: #ffffff; }\n.ll-tab-mine.active .ll-tab-count { color: #ffffff; opacity: .8; }\n@media (max-width: 480px) { .ll-tabs { flex-direction: column; } }\n\n\/* Featured \u2014 any of your own listings that surface inside the combined\n   \"All Listings\" view get this accent border, so they stand out even\n   sitting next to plain network cards rather than needing their own tab. *\/\n.icard.is-featured { border-color: #FF5C0B; }\n.icard.is-featured:hover { border-color: #FF5C0B; }\n\n\n\/* Network cards share .icard with zx\/international \u2014 this badge is the\n   only thing that visually tells them apart (grey vs. the orange\n   \"Direct Listing\" badge on your own listings). *\/\n.net-badge {\n  position: absolute; top: 14px; left: 14px; z-index: 2;\n  font-size: 9.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;\n  background: #555552; color: #fff; padding: 6px 11px;\n  display: inline-flex; align-items: center; gap: 6px;\n}\n.net-badge::before { content: ''; width: 5px; height: 5px; background: #fff; opacity: .5; border-radius: 50%; }\n@media (max-width: 620px) { .zx-wrap { padding: 0 20px; } }\n\n\/* \u2500\u2500 INTERNATIONAL (editorial \/ exclusive) \u2500\u2500 *\/\n.intl { padding: 80px 0; background: #ffffff; border-bottom: 1px solid #e4e0da; }\n.intl-wrap { max-width: 1240px; margin: 0 auto; padding: 0 60px; }\n.intl-hd { max-width: 720px; margin: 0 auto 44px; text-align: center; }\n.intl-hd .stitle { margin-bottom: 16px; }\n.intl-hd p { font-size: 16px; color: #555552; line-height: 1.8; margin: 0; }\n.intl-hd p strong { color: #111110; font-weight: 500; }\n\n\/* \u2500\u2500 International country selector \u2500\u2500 *\/\n.intl-countries { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-bottom: 34px; }\n.intl-country {\n  display: inline-flex; align-items: center; gap: 10px;\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 15px; font-weight: 600; letter-spacing: 0.01em;\n  padding: 14px 22px; border: 1.5px solid #e4e0da; border-radius: 12px; background: #ffffff; color: #111110;\n  cursor: pointer; transition: border-color 150ms, color 150ms, background 150ms;\n}\n.intl-country:hover { border-color: #FF5C0B; color: #FF5C0B; }\n.intl-country.active { background: #FF5C0B; border-color: #FF5C0B; color: #ffffff; }\n.intl-flag { display: block; border: 1px solid rgba(17,17,16,0.1); object-fit: cover; }\n.intl-country-count {\n  font-size: 13px; font-weight: 400; color: #999895;\n}\n.intl-country.active .intl-country-count { color: rgba(255,255,255,0.78); }\n\n.intl-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; }\n\n\/* \u2500\u2500 International carousel \u2500\u2500 *\/\n.intl-carousel { position: relative; }\n.intl-stage { position: relative; }\n.intl-viewport { overflow: hidden; }\n.intl-track {\n  display: flex; gap: 28px; padding: 8px 0 14px;\n  transition: transform .55s cubic-bezier(.4,0,.2,1); will-change: transform;\n}\n.intl-carousel.is-static .intl-track { justify-content: center; transform: none !important; }\n.intl-track > * { flex: 0 0 auto; }\n.intl-arrow {\n  position: absolute; top: 50%; transform: translateY(-50%);\n  width: 46px; height: 46px; border-radius: 50%; border: none; cursor: pointer;\n  background: #111110; color: #fff; display: flex; align-items: center; justify-content: center;\n  box-shadow: 0 4px 16px rgba(17,17,16,.22); z-index: 5; transition: background .2s, transform .2s;\n}\n.intl-arrow:hover { background: #FF5C0B; }\n.intl-arrow svg { width: 20px; height: 20px; }\n.intl-prev { left: -14px; } .intl-next { right: -14px; }\n.intl-dots { display: flex; gap: 8px; justify-content: center; margin-top: 24px; }\n.intl-dot {\n  width: 8px; height: 8px; border-radius: 50%; background: #d8d4ce;\n  border: none; padding: 0; cursor: pointer; transition: background .2s, transform .2s;\n}\n.intl-dot.active { background: #FF5C0B; transform: scale(1.3); }\n.intl-carousel.is-static .intl-arrow,\n.intl-carousel.is-static .intl-dots { display: none; }\n@media (max-width: 620px) {\n  .intl-prev { left: 2px; } .intl-next { right: 2px; }\n}\n.icard {\n  border: 1px solid #e4e0da; background: #ffffff;\n  display: flex; flex-direction: column; cursor: pointer;\n  transition: transform .25s, box-shadow .25s;\n  text-decoration: none; color: inherit;\n}\n.icard:hover, .icard:visited { text-decoration: none; color: inherit; }\n.icard:hover { transform: translateY(-4px); box-shadow: 0 14px 40px rgba(17,17,16,.12); }\n.icard-img {\n  position: relative; aspect-ratio: 4\/3; overflow: hidden;\n  background: #e7e4df; background-size: cover; background-position: center;\n}\n.excl-badge {\n  position: absolute; top: 14px; left: 14px; z-index: 2;\n  font-size: 9.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;\n  background: #111110; color: #fff; padding: 6px 11px;\n  display: inline-flex; align-items: center; gap: 6px;\n}\n.excl-badge::before { content: ''; width: 5px; height: 5px; background: #FF5C0B; border-radius: 50%; }\n.icard-country {\n  position: absolute; top: 14px; right: 14px; z-index: 2;\n  font-size: 10px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;\n  background: rgba(255,255,255,.92); color: #111110; padding: 5px 10px;\n}\n.icard-body { padding: 24px 24px 26px; display: flex; flex-direction: column; gap: 12px; flex: 1; }\n.icard-loc {\n  font-size: 13px; letter-spacing: .06em; text-transform: uppercase; color: #999895;\n  display: flex; align-items: center; gap: 6px;\n}\n.icard-loc svg { color: #FF5C0B; flex-shrink: 0; }\n.icard-title { font-size: 17px; font-weight: 500; line-height: 1.35; letter-spacing: -.005em; color: #111110; }\n.icard-desc { font-size: 15px; line-height: 1.7; color: #555552; flex: 1; }\n.icard-foot {\n  display: flex; align-items: flex-end; justify-content: space-between;\n  padding-top: 16px; border-top: 1px solid #e4e0da; margin-top: 4px; gap: 12px;\n}\n.icard-price { font-size: 25px; font-weight: 600; color: #FF5C0B; line-height: 1; }\n.icard-price small { display: block; font-size: 13px; color: #777470; font-weight: 400; margin-top: 6px; letter-spacing: .02em; }\n.icard-enq {\n  font-size: 13.5px; font-weight: 600; color: #111110;\n  display: inline-flex; align-items: center; gap: 6px;\n  border-bottom: 1.5px solid #FF5C0B; padding-bottom: 2px; white-space: nowrap;\n}\n.intl-foot { text-align: center; margin-top: 48px; }\n.intl-note { font-size: 12.5px; color: #999895; max-width: 560px; margin: 0 auto 22px; line-height: 1.7; }\n\n@media (max-width: 960px) {\n  .intl-wrap { padding: 0 32px; }\n  .intl-grid { grid-template-columns: 1fr 1fr; }\n}\n@media (max-width: 620px) {\n  .intl-wrap { padding: 0 20px; }\n  .intl-grid { grid-template-columns: 1fr; }\n  .icard-foot { flex-direction: column; align-items: flex-start; }\n}\n\n\/* \u2500\u2500 eXp NETWORK reframing (scoped: reads as \"not mine \/ scale\") \u2500\u2500 *\/\n#exp-listings-section .exp-eyebrow { color: #777470; }\n#exp-listings-section .exp-eyebrow::before,\n#exp-listings-section .exp-eyebrow::after { background: #777470; }\n#exp-listings-section .exp-sub {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 17px; color: #555552; max-width: 660px; margin: 0 auto 18px; line-height: 1.75;\n}\n#exp-listings-section .exp-sub em { color: #111110; font-style: italic; }\n#exp-listings-section .exp-card-contact { color: #777470; }\n#exp-listings-section .exp-card:hover { border-bottom-color: #777470; }\n#exp-listings-section .exp-see-all { color: #777470; border-bottom-color: #777470; }\n\n\/* \u2500\u2500 CLOSING CTA band \u2500\u2500 *\/\n.closing-cta { background: #111110 !important; position: relative; overflow: hidden; text-align: center; padding: 80px 0; }\n.closing-cta::after {\n  content: ''; position: absolute; inset: 0; pointer-events: none;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'\/%3E%3C\/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'\/%3E%3C\/svg%3E\");\n}\n.cc-wrap { max-width: 1080px !important; margin-left: auto !important; margin-right: auto !important; padding: 0 40px; position: relative; z-index: 1; }\n.cc-eyebrow { font-size: 11px; font-weight: 600; letter-spacing: .2em; text-transform: uppercase; color: #FF5C0B !important; margin-bottom: 16px; }\n.cc-title {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: clamp(26px, 3vw, 38px); font-weight: 500; color: #f5f3ef !important;\n  letter-spacing: -.02em; margin-bottom: 14px;\n}\n.cc-sub { font-size: 18px; color: #b5b1ab !important; line-height: 1.4; margin: 0 auto 44px; max-width: 640px; }\n\n\/* Buy \/ sell \/ rent \u2014 three linked cards, each to its own consultation type *\/\n.cc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; text-align: center; }\n.cc-card {\n  display: flex; flex-direction: column; align-items: center; gap: 14px;\n  background: #1b1a18; border: 1px solid #333230; border-radius: 0;\n  padding: 40px 24px; text-decoration: none !important;\n  transition: transform 180ms, border-color 180ms, background 180ms;\n}\n.cc-card:hover {\n  transform: translateY(-3px);\n  background: #FF5C0B; border-color: #FF5C0B;\n}\n.cc-card-icon { width: 44px; height: 44px; color: #FF5C0B; transition: color 180ms; }\n.cc-card:hover .cc-card-icon { color: #111110; }\n.cc-card-title {\n  font-size: 18px; font-weight: 500; color: #f5f3ef; letter-spacing: -.01em;\n  transition: color 180ms;\n}\n.cc-card:hover .cc-card-title { color: #111110; }\n.cc-card-text {\n  font-size: 13px; color: #a9a49d; line-height: 1.6; flex-grow: 1;\n  transition: color 180ms;\n}\n.cc-card:hover .cc-card-text { color: #4a2c14; }\n.cc-card-action {\n  display: flex; align-items: center; gap: 8px; justify-content: center; width: 100%;\n  font-size: 12px; font-weight: 500; letter-spacing: .06em; text-transform: uppercase;\n  color: #f5f3ef; padding-top: 14px; border-top: 1px solid rgba(255,255,255,.14);\n  transition: color 180ms, border-top-color 180ms;\n}\n.cc-card:hover .cc-card-action { color: #111110; border-top-color: rgba(17,17,16,.18); }\n.cc-card-action svg { width: 14px; height: 14px; transition: transform 200ms; }\n.cc-card:hover .cc-card-action svg { transform: translateX(4px); }\n\n@media (max-width: 860px) {\n  .cc-grid { grid-template-columns: 1fr; }\n  .closing-cta { padding: 56px 0; }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   LIVE-THEME HARDENING (Jul 2026)\n   The WordPress theme was stretching section content past 1240px and\n   overriding inline max-widths. Force the constraint and one readable font.\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n\/* 1 \u2014 Keep every section's content centred at 1240px, whatever the theme does *\/\n.pillars-inner, .pillars-grid, .pillars-panels,\n.market-inner, .referral-inner, .intl-wrap, .exp-inner,\n.hero-body, .stat-bar {\n  max-width: 1240px !important;\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n\/* 2 \u2014 One consistent, easy-to-read font family across all homepage content.\n   Uses the brand font (Inter \u2014 same one the theme loads sitewide) with safe\n   fallbacks, so headings, cards, numbers and paragraphs all match instead of\n   mixing fonts section to section. *\/\n.hero, .hero *,\n.mandate, .mandate *,\n.form-drawer, .form-drawer *,\n.pillars-section, .pillars-section *,\n.market, .market *,\n.intl, .intl *,\n.exp-section, .exp-section *,\n.exp-overlay, .exp-overlay *,\n.exp-enq-overlay, .exp-enq-overlay *,\n.referral, .referral *,\n.closing-cta, .closing-cta * {\n  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif !important;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   REDUCED MOTION (Jul 2026)\n   Respect the OS \"reduce motion\" setting: calm the entrance fades,\n   the pulsing pillar icon, and card lifts. Carousel auto-advance is\n   also disabled in JS (see initCarousel) for the same users.\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n@media (prefers-reduced-motion: reduce) {\n  *, *::before, *::after {\n    animation-duration: 0.001ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.001ms !important;\n    scroll-behavior: auto !important;\n  }\n  .hero .eyebrow, .hero h1, .hero-sub, .hero-cta-row, .stat-bar { animation: none !important; }\n  .pillar-toggle-icon { animation: none !important; }\n  .pillar-card:hover, .vcard:hover, .vpill:hover, .exp-card:hover, .icard:hover { transform: none !important; }\n}\n  <\/style>\n<\/head>\n<body>\n\n<!-- HERO -->\n<section class=\"hero\">\n  <div class=\"hero-body\">\n    <p class=\"eyebrow center no-line\">Hesperange Real Estate<\/p>\n    <h1>The Hesperange agent obsessed<br>with <em>your outcome.<\/em><\/h1>\n    <p class=\"hero-sub\">\n      Buy, sell, or rent in Howald, Alzingen, Itzig, Fentange, or Hesperange village \u2014 differently.<br>\n      A plan-driven search. A personalised marketing campaign.<br>\n      Everything centered around your best outcome.\n    <\/p>\n    <div class=\"hero-cta-row\">\n      <button class=\"btn-primary\" onclick=\"toggleDrawer('buy-drawer', this)\">\n        I'm buying in Hesperange\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n      <\/button>\n      <button class=\"btn-outline\" onclick=\"toggleDrawer('sell-drawer', this)\">\n        I'm selling my property\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n  <div class=\"stat-bar\">\n    <div class=\"stat-item\">\n      <div class=\"stat-num\">5<sup>+<\/sup><\/div>\n      <div class=\"stat-label\">Villages \u2014 Howald, Alzingen,<br>Itzig, Fentange, Hesperange<\/div>\n    <\/div>\n    <div class=\"stat-item\">\n      <div class=\"stat-num\">6<sup>mo<\/sup><\/div>\n      <div class=\"stat-label\">Rolling notarial transaction data<br>Observatoire de l'Habitat<\/div>\n    <\/div>\n    <div class=\"stat-item\">\n      <div class=\"stat-num\">1<sup>\u00d7<\/sup><\/div>\n      <div class=\"stat-label\">Mandate per village \u2014<br>your interests, undivided<\/div>\n    <\/div>\n    <div class=\"stat-item\">\n      <div class=\"stat-num\">30<sup>%<\/sup><\/div>\n      <div class=\"stat-label\">Of the saving we achieve \u2014<br>buyers pay nothing upfront<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- FORM DRAWERS -->\n<div id=\"buy-drawer\" class=\"form-drawer\" aria-hidden=\"true\">\n  <div class=\"drawer-inner\">\n    <div class=\"drawer-hd\">\n      <div>\n        <p class=\"drawer-eyebrow\">Buyer's enquiry \u00b7 Hesperange<\/p>\n        <h3 class=\"drawer-title\">Tell us what you're looking for<\/h3>\n        <p class=\"drawer-sub\">We review your criteria, pull current transaction data for your target village, and come back within 24 hours with a clear next step. No obligation, no upfront cost.<\/p>\n      <\/div>\n      <button class=\"drawer-close\" onclick=\"toggleDrawer('buy-drawer', null)\" aria-label=\"Close\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 6L6 18M6 6l12 12\"\/><\/svg>\n      <\/button>\n    <\/div>\n    <div class=\"drawer-form-wrap\">\n      <!-- WORDPRESS: replace with [fluentform id=\"11\"] -->\n      <div class=\"form-placeholder\"><div class='fluentform ff-default fluentform_wrapper_11 ffs_custom_wrap'><form data-form_id=\"11\" id=\"fluentform_11\" class=\"frm-fluent-form fluent_form_11 ff-el-form-top ff_form_instance_11_1 ff-form-loading ffs_custom\" data-form_instance=\"ff_form_instance_11_1\" method=\"POST\" ><fieldset  style=\"border: none!important;margin: 0!important;padding: 0!important;background-color: transparent!important;box-shadow: none!important;outline: none!important; min-inline-size: 100%;\">\n                    <legend class=\"ff_screen_reader_title\" style=\"display: block; margin: 0!important;padding: 0!important;height: 0!important;text-indent: -999999px;width: 0!important;overflow:hidden;\">Property search<\/legend>        <div\n                style=\"display: none!important; position: absolute!important; transform: translateX(1000%)!important;\"\n                class=\"ff-el-group ff-hpsf-container\"\n        >\n            <div class=\"ff-el-input--label asterisk-right\">\n                <label for=\"ff_11_item_sf\" aria-label=\"Updates\">\n                    Updates                <\/label>\n            <\/div>\n            <div class=\"ff-el-input--content\">\n                <input type=\"text\"\n                       name=\"item_11__fluent_sf\"\n                       class=\"ff-el-form-control\"\n                       id=\"ff_11_item_sf\"\n                \/>\n            <\/div>\n        <\/div>\n        <input type='hidden' name='__fluent_form_embded_post_id' value='17232' \/><input type=\"hidden\" id=\"_fluentform_11_fluentformnonce\" name=\"_fluentform_11_fluentformnonce\" value=\"ac8e426aca\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/fr\/wp-json\/wp\/v2\/pages\/17232\" \/><div data-name=\"ff_cn_id_1\"  class='ff-t-container ff-column-container ff_columns_total_5 '><div class='ff-t-cell ff-t-column-1' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><select name=\"dropdown\" id=\"ff_11_dropdown\" class=\"ff-el-form-control\" data-name=\"dropdown\" data-calc_value=\"0\" tabindex=\"1\"  aria-invalid=\"false\" aria-required=\"true\" aria-labelledby=\"label_ff_11_dropdown\"><option value=\"\">Village<\/option><option value=\"Howald\"  >Howald<\/option><option value=\"Hesperange\"  >Hesperange<\/option><option value=\"Fentange\"  >Fentange<\/option><option value=\"Itzig\"  >Itzig<\/option><option value=\"Alzingen\"  >Alzingen<\/option><option value=\"Any village in Hesperange\"  >Any village in Hesperange<\/option><option value=\"Any commune\"  >Any commune<\/option><\/select><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-2' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><select name=\"dropdown_1\" id=\"ff_11_dropdown_1\" class=\"ff-el-form-control\" data-name=\"dropdown_1\" data-calc_value=\"0\" tabindex=\"2\"  aria-invalid=\"false\" aria-required=\"true\" aria-labelledby=\"label_ff_11_dropdown_1\"><option value=\"\">Property type<\/option><option value=\"House\"  >House<\/option><option value=\"Apartment\"  >Apartment<\/option><\/select><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-3' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><select name=\"dropdown_2\" id=\"ff_11_dropdown_2\" class=\"ff-el-form-control\" data-name=\"dropdown_2\" data-calc_value=\"0\" tabindex=\"3\"  aria-invalid=\"false\" aria-required=\"true\" aria-labelledby=\"label_ff_11_dropdown_2\"><option value=\"\">Budget<\/option><option value=\"&lt; 700.000 Euro\"  >< 700.000 Euro<\/option><option value=\"between 700.000-1.000.000 Euro\"  >between 700.000-1.000.000 Euro<\/option><option value=\"between 1.000.000-1.500.000 Euro\"  >between 1.000.000-1.500.000 Euro<\/option><option value=\"&gt;1.500.000 Euro\"  >>1.500.000 Euro<\/option><\/select><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-4' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><select name=\"dropdown_3\" id=\"ff_11_dropdown_3\" class=\"ff-el-form-control\" data-name=\"dropdown_3\" data-calc_value=\"0\" tabindex=\"4\"  aria-invalid=\"false\" aria-required=\"true\" aria-labelledby=\"label_ff_11_dropdown_3\"><option value=\"\">Bedrooms<\/option><option value=\"Studio\"  >Studio<\/option><option value=\"2\"  >2<\/option><option value=\"3\"  >3<\/option><option value=\"4\"  >4<\/option><option value=\"&gt;5\"  >>5<\/option><\/select><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-5' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><select name=\"dropdown_4\" id=\"ff_11_dropdown_4\" class=\"ff-el-form-control\" data-name=\"dropdown_4\" data-calc_value=\"0\" tabindex=\"5\"  aria-invalid=\"false\" aria-required=\"true\" aria-labelledby=\"label_ff_11_dropdown_4\"><option value=\"\">moving timeline<\/option><option value=\"Immediate (0-3 months)\"  >Immediate (0-3 months)<\/option><option value=\"Soon (3-6 months)\"  >Soon (3-6 months)<\/option><option value=\"Flexible (6-12 months)\"  >Flexible (6-12 months)<\/option><\/select><\/div><\/div><\/div><\/div><div data-name=\"ff_cn_id_2\"  class='ff-t-container ff-column-container ff_columns_total_5 '><div class='ff-t-cell ff-t-column-1' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><input type=\"text\" name=\"input_text_1\" class=\"ff-el-form-control\" placeholder=\"First name\" data-name=\"input_text_1\" tabindex=\"6\" id=\"ff_11_input_text_1\"  aria-invalid=\"false\" aria-required=true><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-2' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><input type=\"text\" name=\"input_text\" class=\"ff-el-form-control\" placeholder=\"Last name\" data-name=\"input_text\" tabindex=\"7\" id=\"ff_11_input_text\"  aria-invalid=\"false\" aria-required=true><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-3' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><input name=\"phone\" class=\"ff-el-form-control ff-el-phone\" type=\"tel\" placeholder=\"Mobile Number\" data-name=\"phone\" id=\"ff_11_phone\" tabindex=\"8\" inputmode=\"tel\"  aria-invalid='false' aria-required=true><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-4' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><input type=\"email\" name=\"email\" id=\"ff_11_email\" class=\"ff-el-form-control\" placeholder=\"Email Address\" data-name=\"email\" tabindex=\"9\"  aria-invalid=\"false\" aria-required=true><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-5' style='flex-basis: 20%;'><div class='ff-el-group ff-text-center ff_submit_btn_wrapper ff_submit_btn_wrapper_custom'><button class=\"ff-btn ff-btn-submit ff-btn-md ff_btn_style wpf_has_custom_css\" type=\"submit\" name=\"custom_submit_button-11_1\" data-name=\"custom_submit_button-11_1\" tabindex=\"10\"  aria-label=\"search property\">search property<\/button><style>form.fluent_form_11 .wpf_has_custom_css.ff-btn-submit { background-color:rgba(255, 92, 11, 1);border-color:rgba(10, 10, 10, 1);color:#ffffff;border-radius:5px;min-width:100%; }form.fluent_form_11 .wpf_has_custom_css.ff-btn-submit:hover { background-color:#ffffff;border-color:rgba(13, 13, 13, 1);color:rgba(255, 92, 11, 1);min-width:100%; } <\/style><\/div><\/div><\/div><\/fieldset><\/form><div id='fluentform_11_errors' class='ff-errors-in-stack ff_form_instance_11_1 ff-form-loading_errors ff_form_instance_11_1_errors'><\/div><\/div>            <script type=\"text\/javascript\">\n                window.fluent_form_ff_form_instance_11_1 = {\"id\":\"11\",\"ajaxUrl\":\"https:\\\/\\\/zeas.immo\\\/wp-admin\\\/admin-ajax.php\",\"settings\":{\"layout\":{\"labelPlacement\":\"top\",\"asteriskPlacement\":\"asterisk-right\",\"helpMessagePlacement\":\"with_label\",\"errorMessagePlacement\":\"inline\",\"cssClassName\":\"\"},\"restrictions\":{\"denyEmptySubmission\":{\"enabled\":false}}},\"form_instance\":\"ff_form_instance_11_1\",\"form_id_selector\":\"fluentform_11\",\"rules\":{\"dropdown\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"dropdown_1\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"dropdown_2\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"dropdown_3\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"dropdown_4\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"input_text_1\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"input_text\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"phone\":{\"required\":{\"value\":true,\"global\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\"},\"valid_phone_number\":{\"value\":false,\"global\":true,\"message\":\"Phone number is not valid\",\"global_message\":\"Phone number is not valid\"}},\"email\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true},\"email\":{\"value\":true,\"message\":\"This field must contain a valid email\",\"global_message\":\"This field must contain a valid email\",\"global\":true}}},\"debounce_time\":300,\"file_upload_settings\":[]};\n                            <\/script>\n            <\/div>\n    <\/div>\n    <p class=\"drawer-footer-link\">\n      Want to read more first? <a href=\"https:\/\/zeas.immo\/en\/buy-property\/\">See the full buyer's page \u2192<\/a>\n    <\/p>\n  <\/div>\n<\/div>\n\n<div id=\"sell-drawer\" class=\"form-drawer\" aria-hidden=\"true\">\n  <div class=\"drawer-inner\">\n    <div class=\"drawer-hd\">\n      <div>\n        <p class=\"drawer-eyebrow\">Seller's enquiry \u00b7 Hesperange<\/p>\n        <h3 class=\"drawer-title\">Tell us about your property<\/h3>\n        <p class=\"drawer-sub\">We prepare a data-backed price assessment using notarial transaction records for your village \u2014 no exclusivity contract required to get started.<\/p>\n      <\/div>\n      <button class=\"drawer-close\" onclick=\"toggleDrawer('sell-drawer', null)\" aria-label=\"Close\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 6L6 18M6 6l12 12\"\/><\/svg>\n      <\/button>\n    <\/div>\n    <div class=\"drawer-form-wrap\">\n      <!-- WORDPRESS: replace with [fluentform id=\"9\"] -->\n      <div class=\"form-placeholder\"><div class='fluentform ff-default fluentform_wrapper_9 ffs_default_wrap'><form data-form_id=\"9\" id=\"fluentform_9\" class=\"frm-fluent-form fluent_form_9 ff-el-form-top ff_form_instance_9_2 ff-form-loading ffs_default\" data-form_instance=\"ff_form_instance_9_2\" method=\"POST\" ><fieldset  style=\"border: none!important;margin: 0!important;padding: 0!important;background-color: transparent!important;box-shadow: none!important;outline: none!important; min-inline-size: 100%;\">\n                    <legend class=\"ff_screen_reader_title\" style=\"display: block; margin: 0!important;padding: 0!important;height: 0!important;text-indent: -999999px;width: 0!important;overflow:hidden;\">Main page leads form<\/legend>        <div\n                style=\"display: none!important; position: absolute!important; transform: translateX(1000%)!important;\"\n                class=\"ff-el-group ff-hpsf-container\"\n        >\n            <div class=\"ff-el-input--label asterisk-right\">\n                <label for=\"ff_9_item_sf\" aria-label=\"Newsletter\">\n                    Newsletter                <\/label>\n            <\/div>\n            <div class=\"ff-el-input--content\">\n                <input type=\"text\"\n                       name=\"item_9__fluent_sf\"\n                       class=\"ff-el-form-control\"\n                       id=\"ff_9_item_sf\"\n                \/>\n            <\/div>\n        <\/div>\n        <input type='hidden' name='__fluent_form_embded_post_id' value='17232' \/><input type=\"hidden\" id=\"_fluentform_9_fluentformnonce\" name=\"_fluentform_9_fluentformnonce\" value=\"ac8e426aca\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/fr\/wp-json\/wp\/v2\/pages\/17232\" \/><div data-name=\"ff_cn_id_1\"  class='ff-t-container ff-column-container ff_columns_total_4 '><div class='ff-t-cell ff-t-column-1' style='flex-basis: 20%;'><div class='ff-el-group'><div class='ff-el-input--content'><input type=\"text\" name=\"input_text\" class=\"ff-el-form-control\" placeholder=\"Your name\" data-name=\"input_text\" tabindex=\"11\" id=\"ff_9_2_input_text\"  aria-invalid=\"false\" aria-required=true><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-2' style='flex-basis: 30%;'><div class='ff-el-group'><div class='ff-el-input--content'><input name=\"phone\" class=\"ff-el-form-control ff-el-phone\" type=\"tel\" placeholder=\"phone number\" data-name=\"phone\" id=\"ff_9_2_phone\" tabindex=\"12\" inputmode=\"tel\"  aria-invalid='false' aria-required=true><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-3' style='flex-basis: 25%;'><div class='ff-el-group'><div class='ff-el-input--content'><input type=\"email\" name=\"email\" id=\"ff_9_2_email\" class=\"ff-el-form-control\" placeholder=\"email address\" data-name=\"email\" tabindex=\"13\"  aria-invalid=\"false\" aria-required=true><\/div><\/div><\/div><div class='ff-t-cell ff-t-column-4' style='flex-basis: 25%;'><div class='ff-el-group ff-text-left ff_submit_btn_wrapper ff_submit_btn_wrapper_custom'><button class=\"ff-btn ff-btn-submit ff-btn-md ff_btn_style wpf_has_custom_css\" type=\"submit\" name=\"custom_submit_button-9_1\" data-name=\"custom_submit_button-9_1\" tabindex=\"14\"  aria-label=\"Let&#039;s work on your sale\">Let's work on your sale<\/button><style>form.fluent_form_9 .wpf_has_custom_css.ff-btn-submit { background-color:rgba(251, 90, 26, 1);border-color:rgba(15, 15, 15, 1);color:#ffffff;min-width:100%; }form.fluent_form_9 .wpf_has_custom_css.ff-btn-submit:hover { background-color:#ffffff;border-color:rgba(9, 9, 9, 1);color:rgba(255, 92, 11, 1);min-width:100%; } <\/style><\/div><\/div><\/div><\/fieldset><\/form><div id='fluentform_9_errors' class='ff-errors-in-stack ff_form_instance_9_2 ff-form-loading_errors ff_form_instance_9_2_errors'><\/div><\/div>            <script type=\"text\/javascript\">\n                window.fluent_form_ff_form_instance_9_2 = {\"id\":\"9\",\"ajaxUrl\":\"https:\\\/\\\/zeas.immo\\\/wp-admin\\\/admin-ajax.php\",\"settings\":{\"layout\":{\"labelPlacement\":\"top\",\"asteriskPlacement\":\"asterisk-right\",\"helpMessagePlacement\":\"with_label\",\"errorMessagePlacement\":\"inline\",\"cssClassName\":\"\"},\"restrictions\":{\"denyEmptySubmission\":{\"enabled\":false}}},\"form_instance\":\"ff_form_instance_9_2\",\"form_id_selector\":\"fluentform_9\",\"rules\":{\"input_text\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true}},\"phone\":{\"required\":{\"value\":true,\"global\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\"},\"valid_phone_number\":{\"value\":false,\"global\":true,\"message\":\"Phone number is not valid\",\"global_message\":\"Phone number is not valid\"}},\"email\":{\"required\":{\"value\":true,\"message\":\"This field is required\",\"global_message\":\"This field is required\",\"global\":true},\"email\":{\"value\":true,\"message\":\"This field must contain a valid email\",\"global_message\":\"This field must contain a valid email\",\"global\":true}}},\"debounce_time\":300,\"file_upload_settings\":[]};\n                            <\/script>\n            <\/div>\n    <\/div>\n    <p class=\"drawer-footer-link\">\n      Want to read more first? <a href=\"https:\/\/zeas.immo\/en\/sell-property\/\">See the full seller's page \u2192<\/a>\n    <\/p>\n  <\/div>\n<\/div>\n\n<!-- MANDATE BANNER -->\n<div class=\"mandate\">\n  <div class=\"mitem\">\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\/><\/svg>\n    We never represent both parties on the same deal\n  <\/div>\n  <div class=\"msep\"><\/div>\n  <div class=\"mitem\">\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\/><\/svg>\n    No exclusivity contract required for sellers\n  <\/div>\n  <div class=\"msep\"><\/div>\n  <div class=\"mitem\">\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\/><\/svg>\n    Buyers pay only a share of what we save them\n  <\/div>\n<\/div>\n\n<!-- PILLARS -->\n<section class=\"pillars-section\">\n  <div class=\"pillars-inner\" style=\"max-width:1240px;margin:0 auto;\">\n\n    <div class=\"pillars-intro\">\n      <h2 class=\"stitle ctr\" style=\"margin-bottom:12px\">What brings you to zeas.immo?<\/h2>\n      <p>Whether you're buying, selling, or letting \u2014 the standard approach in Luxembourg probably hasn't worked in your favour.<br><strong>Here's what we do differently.<\/strong><\/p>\n    <\/div>\n\n    <div class=\"pillars-grid\">\n\n      <!-- BUYING -->\n      <button class=\"pillar-card\" id=\"card-buying\" onclick=\"togglePillar('buying')\" aria-expanded=\"false\">\n        <span class=\"pillar-tag\">Buying<\/span>\n        <div class=\"pillar-line-1\">You visited six properties. None of them were right.<\/div>\n        <div class=\"pillar-line-2\">Because the agent was selling their portfolio \u2014 not finding yours.<\/div>\n        <div class=\"pillar-card-foot\">\n          <span class=\"pillar-line-3\">See how we search differently \u2192<\/span>\n          <span class=\"pillar-toggle\"><svg class=\"pillar-toggle-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 5v14M5 12h14\"\/><\/svg><\/span>\n        <\/div>\n      <\/button>\n\n      <!-- SELLING -->\n      <button class=\"pillar-card\" id=\"card-selling\" onclick=\"togglePillar('selling')\" aria-expanded=\"false\">\n        <span class=\"pillar-tag\">Selling<\/span>\n        <div class=\"pillar-line-1\">Overpriced to win your mandate. Then quietly reduced.<\/div>\n        <div class=\"pillar-line-2\">For them, any sale counts. For you, only yours does.<\/div>\n        <div class=\"pillar-card-foot\">\n          <span class=\"pillar-line-3\">See why one mandate per village changes everything \u2192<\/span>\n          <span class=\"pillar-toggle\"><svg class=\"pillar-toggle-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 5v14M5 12h14\"\/><\/svg><\/span>\n        <\/div>\n      <\/button>\n\n      <!-- RENTING -->\n      <button class=\"pillar-card\" id=\"card-renting\" onclick=\"togglePillar('renting')\" aria-expanded=\"false\">\n        <span class=\"pillar-tag\">Renting<\/span>\n        <div class=\"pillar-line-1\">You found a tenant. Then the problems started.<\/div>\n        <div class=\"pillar-line-2\">Unverified income. No property record. No one to call.<\/div>\n        <div class=\"pillar-card-foot\">\n          <span class=\"pillar-line-3\">See how we screen and protect you from day one \u2192<\/span>\n          <span class=\"pillar-toggle\"><svg class=\"pillar-toggle-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 5v14M5 12h14\"\/><\/svg><\/span>\n        <\/div>\n      <\/button>\n\n    <\/div>\n\n    <div class=\"pillars-panels\">\n\n      <!-- BUYING PANEL -->\n      <div class=\"pillars-expanded\" id=\"expand-buying\">\n        <div class=\"pillars-expanded-inner\">\n          <div class=\"pillar-proof\">\n            <span class=\"pillar-proof-label\">How we search<\/span>\n            <p>We work for your outcome \u2014 no listings portfolio, no inventory to push. We take on one property at a time, one mandate per zone, so that when we say your property is our obsession, we mean it. We source properties that match your criteria, including off-market options agents with portfolios never show you.<\/p>\n            <p>Our success fee is <strong>30% of what we negotiate off the asking price.<\/strong> If we don't achieve a saving, the success fee is zero. An engagement fee applies to start.*<\/p>\n          <\/div>\n          <div class=\"pillar-cta-col\">\n            <span class=\"pillar-ac-label\">What you get<\/span>\n            <div class=\"pillar-ac-stat\"><span class=\"n\">30%<\/span><span class=\"t\">of the saving \u2014 our success fee.<br>No saving, no fee.<\/span><\/div>\n            <span class=\"pstat-note\">* Engagement fee applies. Full details on our fees page.<\/span>\n            <ul class=\"pillar-ac-bullets\">\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>Off-market access, not a portfolio<\/li>\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>One mandate per zone \u2014 your interests only<\/li>\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>Nothing upfront beyond the engagement fee<\/li>\n            <\/ul>\n            <a href=\"https:\/\/zeas.immo\/en\/buy-property\/\" class=\"pillar-cta-link\">\n              Read the buyer's guide\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n            <\/a>\n            <a href=\"https:\/\/zeas.immo\/en\/real-estate-agency-fees-in-hesperange\/\" class=\"pillar-secondary-link\">How our fees work \u2192<\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- SELLING PANEL -->\n      <div class=\"pillars-expanded\" id=\"expand-selling\">\n        <div class=\"pillars-expanded-inner\">\n          <div class=\"pillar-proof\">\n            <span class=\"pillar-proof-label\">One mandate. Full attention.<\/span>\n            <p>We take one seller mandate per village at a time. When you list with us, we are not simultaneously representing three other sellers in your street. <strong>Your sale gets our full attention<\/strong> \u2014 not a share of it.<\/p>\n            <p>Multi-channel advertising, targeted campaigns, and guerrilla marketing strategies built around your property's strongest selling points. We go beyond the standard listing \u2014 we do everything and more to put your property in front of the right buyer.<\/p>\n          <\/div>\n          <div class=\"pillar-cta-col\">\n            <span class=\"pillar-ac-label\">What you get<\/span>\n            <div class=\"pillar-ac-stat\"><span class=\"n\">1<\/span><span class=\"t\">seller mandate per village.<br>Your listing, undivided.<\/span><\/div>\n            <ul class=\"pillar-ac-bullets\">\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>One seller mandate per village<\/li>\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>Multi-channel, targeted campaigns<\/li>\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>Built around your property's strengths<\/li>\n            <\/ul>\n            <a href=\"https:\/\/zeas.immo\/en\/sell-property\/\" class=\"pillar-cta-link\">\n              Read the seller's guide\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n            <\/a>\n            <a href=\"https:\/\/zeas.immo\/en\/real-estate-agency-fees-in-hesperange\/\" class=\"pillar-secondary-link\">How our fees work \u2192<\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- RENTING PANEL -->\n      <div class=\"pillars-expanded\" id=\"expand-renting\">\n        <div class=\"pillars-expanded-inner\">\n          <div class=\"pillar-proof\">\n            <span class=\"pillar-proof-label\">Screened tenants. Protected property.<\/span>\n            <p>Every applicant is verified before you meet them \u2014 income, employment contract, and references. You only spend time on tenants who are genuinely qualified and serious about your property.<\/p>\n            <p>At handover we produce a <strong>full property condition record<\/strong> \u2014 photographs, inventory, and signed documentation. If a dispute arises at the end of the lease, you have evidence. Most landlords don't.<\/p>\n          <\/div>\n          <div class=\"pillar-cta-col\">\n            <span class=\"pillar-ac-label\">What you get<\/span>\n            <div class=\"pillar-ac-stat\"><span class=\"n\">100%<\/span><span class=\"t\">of applicants pre-screened<br>before you meet them.<\/span><\/div>\n            <ul class=\"pillar-ac-bullets\">\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>Income, contract &amp; references verified<\/li>\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>Full photographic condition record<\/li>\n              <li><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>Signed documentation at handover<\/li>\n            <\/ul>\n            <a href=\"https:\/\/zeas.immo\/en\/rent-out-property-in-hesperange\/\" class=\"pillar-cta-link\">\n              Read the rental guide\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n            <\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     LOCAL LISTINGS \u2014 ONE UNIFIED GRID (NEW)\n     zeas.immo Exclusive listings are now merged directly into the same\n     pool as the eXp network, filtered\/sorted through one shared filter\n     bar. \"Our Listings\" is a scope filter, not a separate dataset \u2014 pick\n     it to see only your own; leave \"All\" selected and any of your own\n     listings that match the active filters are sorted to the front and\n     get the orange \"Direct Listing\" badge + accent border, so they're\n     featured wherever they show up rather than confined to their own tab.\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"exp-section\" id=\"local-listings-section\">\n  <div class=\"exp-inner\">\n\n    <div class=\"exp-hd\">\n      <p class=\"exp-eyebrow\">Real Estate in Luxembourg<\/p>\n      <h2 class=\"exp-title\">Property in Luxembourg<\/h2>\n      <p class=\"exp-sub\">The listings we represent directly, and the wider eXp Realty network across the country \u2014 one search, both included.<\/p>\n    <\/div>\n\n    <div class=\"ll-tabs\" id=\"llTabs\" role=\"tablist\">\n      <button class=\"ll-tab active\" id=\"llTabAll\" data-scope=\"all\" role=\"tab\" aria-selected=\"true\" type=\"button\">All Listings <span class=\"ll-tab-count\" id=\"llTabAllCount\"><\/span><\/button>\n      <button class=\"ll-tab ll-tab-mine\" id=\"llTabMine\" data-scope=\"mine\" role=\"tab\" aria-selected=\"false\" type=\"button\">Our Listings <span class=\"ll-tab-count\" id=\"llTabMineCount\"><\/span><\/button>\n    <\/div>\n\n    <div id=\"expFilterBar\"><\/div>\n    <div id=\"expCount\" class=\"exp-count\" style=\"display:none\"><\/div>\n\n    <div id=\"expState\">\n      <div class=\"exp-loading\"><div class=\"exp-spinner\"><\/div> Loading listings\u2026<\/div>\n    <\/div>\n    <div id=\"expGrid\" class=\"exp-grid\" style=\"display:none\"><\/div>\n\n    <div id=\"expSeeAllWrap\" style=\"display:none; text-align:center; margin-top:40px;\">\n      <a href=\"https:\/\/zeas.immo\/en\/exp-luxembourg-properties\/\" class=\"btn-seeall\">See all Luxembourg eXp properties &rarr;<\/a>\n    <\/div>\n\n  <\/div>\n<\/section>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     INTERNATIONAL \u2014 EXCLUSIVE LISTINGS   (NEW)\n     Populated from the proxy feed, filtered to your own (non-LU) listings.\n     Hides itself automatically if no international listings are returned.\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"intl\" id=\"intl-section\">\n  <div class=\"intl-wrap\">\n\n    <div class=\"intl-hd\">\n      <div class=\"eyebrow center\">International \u00b7 Exclusive in Luxembourg<\/div>\n      <h2 class=\"stitle ctr\">A holiday home abroad \u2014 arranged from Luxembourg<\/h2>\n      <p>A place in the sun, sourced and vetted by the agent you already trust here. Through my international partnerships, I'm your <strong>exclusive point of contact in Luxembourg<\/strong> for these properties in Spain and France \u2014 handled end to end, in your language, from the comfort of your Luxembourg&nbsp;coach.<\/p>\n    <\/div>\n\n    <div id=\"intlState\"><\/div>\n    <div id=\"intlCountries\" class=\"intl-countries\"><\/div>\n    <div id=\"intlCarousel\" class=\"intl-carousel\">\n      <div class=\"intl-stage\">\n        <button id=\"intlPrev\" class=\"intl-arrow intl-prev\" aria-label=\"Previous\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"\/><\/svg><\/button>\n        <div id=\"intlViewport\" class=\"intl-viewport\"><div id=\"intlTrack\" class=\"intl-track\"><\/div><\/div>\n        <button id=\"intlNext\" class=\"intl-arrow intl-next\" aria-label=\"Next\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"\/><\/svg><\/button>\n      <\/div>\n      <div id=\"intlDots\" class=\"intl-dots\"><\/div>\n    <\/div>\n\n    <div class=\"intl-foot\">\n      <a href=\"https:\/\/zeas.immo\/en\/holiday-homes\/\" class=\"btn-seeall\">See all international listings \u2192<\/a>\n    <\/div>\n\n  <\/div>\n<\/section>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     MARKET DATA \u2014 rolling band (v2). Reverted to a light background\n     (the dark v1 read as too heavy stacked against the closing CTA\n     below), and swapped the small static square tiles for a\n     continuously scrolling pill band \u2014 reads as \"alive\" rather than\n     boxed, and the 15s loop over 5 pills works out to ~3s per pill.\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"market\">\n  <div class=\"market-inner\" style=\"max-width:1240px;margin:0 auto;\">\n\n    <div class=\"sec-hd\">\n      <div class=\"eyebrow center market-eyebrow\"><span class=\"eyebrow-text\">Hesperange real estate \u00b7 Market data<\/span><\/div>\n      <h2 class=\"stitle ctr\" style=\"margin-bottom:8px\">Average asking price per m\u00b2 across Hesperange commune<\/h2>\n      <p>A live snapshot of what sellers are asking across the five villages \u2014 compiled fresh every week from public listings.<\/p>\n    <\/div>\n\n    <div id=\"vilCarousel\" class=\"intl-carousel vil-carousel\">\n      <div class=\"intl-stage\">\n        <button id=\"vilPrev\" class=\"intl-arrow intl-prev\" aria-label=\"Previous\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"\/><\/svg><\/button>\n        <div id=\"vilViewport\" class=\"intl-viewport\"><div id=\"vilTrack\" class=\"intl-track\">\n\n          <a href=\"https:\/\/zeas.immo\/en\/buy-property-in-howald\/\" class=\"vpill\">\n            <span class=\"vpill-name\">Howald<\/span>\n            <span class=\"vpill-price\">~\u20ac10.3k<sup>\/m\u00b2<\/sup><\/span>\n            <span class=\"vpill-arrow\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/span>\n          <\/a>\n          <a href=\"https:\/\/zeas.immo\/en\/buy-property-in-alzingen\/\" class=\"vpill\">\n            <span class=\"vpill-name\">Alzingen<\/span>\n            <span class=\"vpill-price\">~\u20ac9.6k<sup>\/m\u00b2<\/sup><\/span>\n            <span class=\"vpill-arrow\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/span>\n          <\/a>\n          <a href=\"https:\/\/zeas.immo\/en\/buy-property-in-itzig\/\" class=\"vpill\">\n            <span class=\"vpill-name\">Itzig<\/span>\n            <span class=\"vpill-price\">~\u20ac9.0k<sup>\/m\u00b2<\/sup><\/span>\n            <span class=\"vpill-arrow\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/span>\n          <\/a>\n          <a href=\"https:\/\/zeas.immo\/en\/buy-property-in-fentange\/\" class=\"vpill\">\n            <span class=\"vpill-name\">Fentange<\/span>\n            <span class=\"vpill-price\">~\u20ac9.8k<sup>\/m\u00b2<\/sup><\/span>\n            <span class=\"vpill-arrow\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/span>\n          <\/a>\n          <a href=\"https:\/\/zeas.immo\/en\/buy-property-in-hesperange-village\/\" class=\"vpill\">\n            <span class=\"vpill-name\">Hesperange village<\/span>\n            <span class=\"vpill-price\">~\u20ac8.8k<sup>\/m\u00b2<\/sup><\/span>\n            <span class=\"vpill-arrow\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/span>\n          <\/a>\n\n        <\/div><\/div>\n        <button id=\"vilNext\" class=\"intl-arrow intl-next\" aria-label=\"Next\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"\/><\/svg><\/button>\n      <\/div>\n      <div id=\"vilDots\" class=\"intl-dots\"><\/div>\n    <\/div>\n\n    <p class=\"market-note\">\n      Average asking prices per m\u00b2, compiled weekly from public real estate aggregators across the Hesperange commune. Figures are indicative and updated regularly.\n    <\/p>\n\n  <\/div>\n<\/section>\n\n<!-- Property modal -->\n<div class=\"exp-overlay\" id=\"expOverlay\">\n  <div class=\"exp-modal\" id=\"expModal\">\n    <button class=\"exp-modal-close\" id=\"expModalClose\" aria-label=\"Close\">\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\">\n        <path d=\"M2 2l12 12M14 2L2 14\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\/>\n      <\/svg>\n    <\/button>\n    <div id=\"expModalBody\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- Fullscreen lightbox -->\n<div class=\"exp-lightbox\" id=\"expLightbox\">\n  <button class=\"exp-lb-btn exp-lb-close\" id=\"expLbClose\" aria-label=\"Close image viewer\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M2 2l12 12M14 2L2 14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\/><\/svg><\/button>\n  <button class=\"exp-lb-btn exp-lb-prev\" id=\"expLbPrev\" aria-label=\"Previous image\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"\/><\/svg><\/button>\n  <img decoding=\"async\" class=\"exp-lightbox-img\" id=\"expLbImg\" src=\"\" alt=\"\">\n  <button class=\"exp-lb-btn exp-lb-next\" id=\"expLbNext\" aria-label=\"Next image\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M9 18l6-6-6-6\"\/><\/svg><\/button>\n  <span class=\"exp-lb-ctr\" id=\"expLbCtr\"><\/span>\n<\/div>\n\n<!-- Enquiry modal -->\n<div class=\"exp-enq-overlay\" id=\"expEnqOverlay\">\n  <div class=\"exp-enq-modal\">\n    <button class=\"exp-enq-close\" id=\"expEnqClose\" aria-label=\"Close\">\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\">\n        <path d=\"M2 2l12 12M14 2L2 14\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\/>\n      <\/svg>\n    <\/button>\n    <div id=\"expEnqBody\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- Acquisition cost modal \u2014 Luxembourg listings only. Native, not an\n     iframe: same fixed-cost-table + short-form pattern as render.php's\n     calculator on your own listing pages, computed client-side here since\n     network listings never get a server-rendered page (see cpt.php). -->\n<div class=\"exp-acq-overlay\" id=\"expAcqOverlay\">\n  <div class=\"exp-acq-modal\">\n    <button class=\"exp-acq-close\" id=\"expAcqClose\" aria-label=\"Close\">\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\">\n        <path d=\"M2 2l12 12M14 2L2 14\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\/>\n      <\/svg>\n    <\/button>\n    <div id=\"expAcqBody\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- CLOSING CTA  (NEW \u2014 ends the page on an action) -->\n<section class=\"closing-cta\">\n  <div class=\"cc-wrap\">\n    <p class=\"cc-eyebrow\" style=\"text-align:center\">Not sure where to start?<\/p>\n    <h2 class=\"cc-title\" style=\"text-align:center\">Let's talk \u2014 about what, exactly?<\/h2>\n    <p class=\"cc-sub\" style=\"text-align:center\">Buying, selling, or renting out are three different conversations.<br>Pick the one that's yours \u2014 no obligation.<\/p>\n\n    <!-- All three link to on-site contact pages (not calendar bookings),\n         so the action labels say \"get in touch\" rather than \"book a call\". -->\n    <div class=\"cc-grid\">\n      <a href=\"https:\/\/zeas.immo\/en\/contact-us\/buying-opportunity\" class=\"cc-card\" target=\"_blank\" rel=\"noopener\">\n        <svg class=\"cc-card-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"M21 21l-4.35-4.35\"\/><\/svg>\n        <span class=\"cc-card-title\">Buying<\/span>\n        <span class=\"cc-card-text\">30 minutes to map your search \u2014 village, budget, timeline.<\/span>\n        <span class=\"cc-card-action\">Get in touch about buying\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n        <\/span>\n      <\/a>\n      <a href=\"https:\/\/zeas.immo\/en\/contact-us\/selling\" class=\"cc-card\" target=\"_blank\" rel=\"noopener\">\n        <svg class=\"cc-card-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M3 11l9-7 9 7v9a1 1 0 01-1 1h-5v-6H9v6H4a1 1 0 01-1-1v-9z\"\/><\/svg>\n        <span class=\"cc-card-title\">Selling<\/span>\n        <span class=\"cc-card-text\">A data-backed price read on your property, no exclusivity required.<\/span>\n        <span class=\"cc-card-action\">Get in touch about selling\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n        <\/span>\n      <\/a>\n      <a href=\"https:\/\/zeas.immo\/en\/contact-us\/business-opportunity\" class=\"cc-card\" target=\"_blank\" rel=\"noopener\">\n        <svg class=\"cc-card-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><circle cx=\"8\" cy=\"15\" r=\"3.2\"\/><path d=\"M10.2 12.8L19 4M16 6l2 2M13 9l2 2\"\/><\/svg>\n        <span class=\"cc-card-title\">Renting out<\/span>\n        <span class=\"cc-card-text\">Find the right long-term tenant, vetted and managed for you.<\/span>\n        <span class=\"cc-card-action\">Get in touch about renting\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\n        <\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/section>\n\n<script>\n\nfunction togglePillar(key) {\n  var keys = ['buying', 'selling', 'renting'];\n  keys.forEach(function(k) {\n    var card = document.getElementById('card-' + k);\n    var exp  = document.getElementById('expand-' + k);\n    if (!card || !exp) return;\n    if (k === key) {\n      var isOpen = card.classList.contains('open');\n      card.classList.toggle('open', !isOpen);\n      card.setAttribute('aria-expanded', String(!isOpen));\n      exp.classList.toggle('visible', !isOpen);\n    } else {\n      card.classList.remove('open');\n      card.setAttribute('aria-expanded', 'false');\n      exp.classList.remove('visible');\n    }\n  });\n}\n\n\/* The expand panels sit in a separate row below the 3 cards \u2014 perfect for the\n   desktop 3-up layout, but on a single-column phone they'd all open under the\n   LAST card. Relocate each panel directly beneath its own card on mobile, and\n   move them back into the shared row on desktop. *\/\nfunction layoutPillarPanels() {\n  var grid = document.querySelector('.pillars-grid');\n  var panelsWrap = document.querySelector('.pillars-panels');\n  if (!grid || !panelsWrap) return;\n  var mobile = window.matchMedia('(max-width: 860px)').matches;\n  ['buying', 'selling', 'renting'].forEach(function(k) {\n    var card  = document.getElementById('card-' + k);\n    var panel = document.getElementById('expand-' + k);\n    if (!card || !panel) return;\n    if (mobile) {\n      if (card.nextElementSibling !== panel) card.after(panel);   \/\/ put panel under its card\n    } else if (panel.parentNode !== panelsWrap) {\n      panelsWrap.appendChild(panel);                              \/\/ restore the shared desktop row\n    }\n  });\n}\nif (window.matchMedia) {\n  window.addEventListener('resize', layoutPillarPanels);\n  layoutPillarPanels();\n}\n\nfunction toggleDrawer(id, triggerBtn) {\n  var drawer = document.getElementById(id);\n  var allDrawers = document.querySelectorAll('.form-drawer');\n  var allBtns = document.querySelectorAll('.hero .btn-primary, .hero .btn-outline');\n  var isOpen = drawer.classList.contains('open');\n  allDrawers.forEach(function(d) {\n    d.classList.remove('open');\n    d.setAttribute('aria-hidden', 'true');\n  });\n  allBtns.forEach(function(b) { b.classList.remove('active'); });\n  if (!isOpen) {\n    drawer.classList.add('open');\n    drawer.setAttribute('aria-hidden', 'false');\n    if (triggerBtn) triggerBtn.classList.add('active');\n    setTimeout(function() {\n      var top = drawer.getBoundingClientRect().top + window.pageYOffset - 80;\n      window.scrollTo({ top: top, behavior: 'smooth' });\n    }, 120);\n  }\n}\n\n\n\n(function () {\n  const PROXY     = 'https:\/\/zeas.immo\/zeas-proxy.php';   \/\/ still used for the enquiry POST only\n  const API       = 'https:\/\/zeas.immo\/wp-json\/zeas\/v1\/listings';\n  const PAGE_URL  = '\/en\/exp-properties\/';\n  const MAX_CARDS = 9;\n  const MAX_INTL  = 9;\n  const MAX_ZX    = 9;\n\n  let all      = [];\n  let luListings   = [];   \/\/ Luxembourg \/ network listings (not yours)\n  let intlListings = [];   \/\/ your own exclusive listings (outside LU)\n  let zxListings   = [];   \/\/ your own exclusive listings (INSIDE Luxembourg \u2014 featured)\n  let localAll = [];       \/\/ zxListings + luListings combined \u2014 the one pool the\n                           \/\/ local-listings filter bar\/grid actually searches\n  let filtered = [];\n  let activeScope   = 'all'; \/\/ 'all' | 'mine' \u2014 the \"All Listings\"\/\"Our Listings\" tabs\n  let activeType    = 'all';\n  let activeStatus  = 'all';\n  let activeCommune = 'all';\n  let PRICE_LO = 0, PRICE_HI = 0, priceMin = 0, priceMax = 0;\n  let galImages = [];\n  let galIdx    = 0;\n\n  const $state    = document.getElementById('expState');\n  const $grid     = document.getElementById('expGrid');\n  const $count    = document.getElementById('expCount');\n  const $filterBar= document.getElementById('expFilterBar');\n  const $overlay  = document.getElementById('expOverlay');\n  const $modalBody= document.getElementById('expModalBody');\n  const $enqOvl   = document.getElementById('expEnqOverlay');\n  const $enqBody  = document.getElementById('expEnqBody');\n  const $acqOvl   = document.getElementById('expAcqOverlay');\n  const $acqBody  = document.getElementById('expAcqBody');\n  let   knownContact = null; \/\/ { firstName, email } \u2014 captured from a successful\n                              \/\/ enquiry send, reused so the acquisition-cost\n                              \/\/ gate below doesn't ask twice in the same visit.\n  const $intlTrack = document.getElementById('intlTrack');\n  const $intlState= document.getElementById('intlState');\n  const $intlSection = document.getElementById('intl-section');\n  const $llTabAll      = document.getElementById('llTabAll');\n  const $llTabMine     = document.getElementById('llTabMine');\n  const $llTabAllCount = document.getElementById('llTabAllCount');\n  const $llTabMineCount= document.getElementById('llTabMineCount');\n  const $llTabs        = document.getElementById('llTabs');\n\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     LISTING SPLIT\n     \"International\" = your own listings, published under agent Adrian Buzea\n     (all outside Luxembourg). Everything else = the wider eXp network.\n\n     MY_AGENT is matched loosely (case-insensitive, order-independent) across\n     whatever agent fields the feed exposes. If the International section comes\n     up empty on the live site, open one listing's JSON and add the real agent\n     field name to AGENT_STR_FIELDS \/ AGENT_OBJ below.\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  \/\/ Your listings are published under agent Adrian Buzea (confirmed against the\n  \/\/ live feed: top-level agent_first_name \/ agent_last_name \/ agent_email).\n  const MY_AGENT_TOKENS  = ['adrian', 'buzea'];\n  const AGENT_STR_FIELDS = ['agent_first_name','agent_last_name','agent_email','agent_name','listing_agent'];\n\n  function agentName(l) {\n    var s = '';\n    AGENT_STR_FIELDS.forEach(function(f){ if (typeof l[f] === 'string') s += ' ' + l[f]; });\n    return s.toLowerCase();\n  }\n  function isMine(l) {\n    var n = agentName(l);\n    return MY_AGENT_TOKENS.every(function(tok){ return n.indexOf(tok) > -1; });\n  }\n\n  \/\/ IMPORTANT: the feed's top-level country_code is unreliable \u2014 it reads \"LU\"\n  \/\/ even for properties abroad. The real country lives in full_payload.country.\n  function realCountry(l) {\n    var fp = l.full_payload || {};\n    return (fp.country || l.country_code || '').toString().toUpperCase();\n  }\n  function isAbroad(l) {\n    var c = realCountry(l);\n    return !!c && c !== 'LU';\n  }\n  \/\/ Gate for the acquisition-cost calculator \u2014 Luxembourg tax rules only\n  \/\/ apply to Luxembourg properties, and the table needs a real price.\n  function isLU(l) { return realCountry(l) === 'LU' && +l.price > 0; }\n  \/\/ International = your own listings that are outside Luxembourg\n  function isIntl(l) { return isMine(l) && isAbroad(l); }\n  \/\/ zeas.immo Exclusive = your own listings INSIDE Luxembourg (featured section)\n  function isZx(l) { return isMine(l) && !isAbroad(l); }\n\n  var COUNTRY_NAMES = { ES:'Spain', FR:'France', MA:'Morocco', PT:'Portugal', IT:'Italy', GR:'Greece', LU:'Luxembourg' };\n  function countryOf(l) {\n    var c = realCountry(l);\n    return COUNTRY_NAMES[c] || c || 'International';\n  }\n\n  \/\/ Editorial blurb for the International card \u2014 prefer the feed's English\n  \/\/ subtitle; fall back to a cleaned-up description (stripping the location\n  \/\/ disclaimer line and marketing emojis).\n  function intlBlurb(l) {\n    if (l._subtitle) return l._subtitle;\n    var d = (l.description || '')\n      .replace(\/^\\s*\ud83d\udccd[^\\n]*(\\n|$)\/gm, '')\n      .replace(\/[\\u{1F300}-\\u{1FAFF}\\u{2600}-\\u{27BF}\\u{2190}-\\u{21FF}]\/gu, '')\n      .replace(\/\\s{2,}\/g, ' ').replace(\/\\r?\\n+\/g, ' ').trim();\n    return d.substring(0, 160) + (d.length > 160 ? '\u2026' : '');\n  }\n\n  \/\/ The site is English, so present international listings in English: pull the\n  \/\/ English title \/ description \/ subtitle from full_payload.comments and use\n  \/\/ them for both the card and the modal. (Only applied to intl listings.)\n  function localizeEN(l) {\n    var fp = l.full_payload || {};\n    var cs = fp.comments || [];\n    var en = cs.filter(function(c){ return c && c.language === 'en'; })[0];\n    if (en) {\n      if (en.title)   l.title = en.title;\n      if (en.comment) l.description = en.comment;\n      l._subtitle = en.subtitle || '';\n    }\n    return l;\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     ADAPTER \u2014 reshapes the new \/wp-json\/zeas\/v1 output into the\n     legacy \"l\" shape this page was built against. Identical to\n     the one on the international page; keep the two in sync.\n     Duplicates are already excluded server-side.\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  function toLegacy(item) {\n    var content  = item.content || {};\n    var en       = content.en || {};\n    var comments = Object.keys(content).map(function (lang) {\n      var c = content[lang] || {};\n      return { language: lang, title: c.headline, subtitle: c.hook, comment: c.summary, comment_full: c.narrative };\n    });\n    return {\n      id: item.reference,\n      source_id: item.reference,\n      title: en.headline || '',\n      description: en.summary || '',\n      _subtitle: en.hook || '',\n      narrative: en.narrative || '',\n      url: item.url || null,\n      full_payload: { country: item.country, comments: comments },\n      country_code: item.country,\n      price: item.price,\n      listing_type: String(item.listing_type || 1),\n      bedrooms: item.bedrooms,\n      bathrooms: item.bathrooms,\n      square_feet: item.area_living,\n      total_rooms: item.rooms,\n      construction_year: item.year_built,\n      property_type: item.property_type,\n      city: item.city,\n      address: item.address,\n      energy_efficiency_class: (item.energy && item.energy.class) || null,\n      images: (item.photos || []).map(function (p) { return { url: p.url, is_front_cover: false }; }),\n      status: item.status || 'live',\n      agent_first_name: item.is_mine ? 'Adrian' : '',\n      agent_last_name:  item.is_mine ? 'Buzea'  : '',\n      agent_email:      item.is_mine ? 'adrian.buzea@expluxembourg.com' : ''\n    };\n  }\n\n  async function fetchAll() {\n    var out = [], page = 1, LIMIT = 100, SAFETY = 6;\n    while (page <= SAFETY) {\n      var res = await fetch(API + '?scope=all&per_page=' + LIMIT + '&page=' + page);\n      if (!res.ok) throw new Error('HTTP ' + res.status);\n      var data = await res.json();\n      var batch = (data.items || []).map(toLegacy);\n      out = out.concat(batch);\n      if (!data.pages || page >= data.pages) break;\n      page++;\n    }\n    return out.filter(function (l) { return l.status !== 'sold'; });\n  }\n\n  \/* \u2500\u2500 Fetch \u2500\u2500 *\/\n  async function init() {\n    try {\n      const feed = await fetchAll();\n      all = feed;\n      \/\/ zeas.immo Exclusive = your own listings INSIDE Luxembourg.\n      zxListings = all.filter(isZx).map(localizeEN);\n      \/\/ International = your listings (Adrian Buzea) that are outside Luxembourg.\n      intlListings = all.filter(isIntl).map(localizeEN);\n      \/\/ Network = everything NOT yours.\n      luListings   = all.filter(function(l){ return !isMine(l); }).map(localizeEN);\n      \/\/ The Local Listings section searches this combined pool \u2014 your own\n      \/\/ LU listings aren't a separate dataset anymore, just listings that\n      \/\/ happen to carry is_mine, so they surface (and get featured) inside\n      \/\/ whatever filter someone's actually using instead of being confined\n      \/\/ to their own tab.\n      localAll = zxListings.concat(luListings);\n      setupLocalTabs();\n      renderIntl();\n      buildFilters();\n      applyFilters();\n    } catch(e) {\n      $state.innerHTML = '<div class=\"exp-error\">Could not load listings (' + e.message + ')<\/div>';\n      if ($intlSection) $intlSection.style.display = 'none';\n    }\n  }\n\n  \/* \u2500\u2500 Local Listings scope tabs \u2014 \"All Listings\" vs \"Our Listings\".\n        This is a filter dimension (like type\/status\/commune below), not a\n        separate dataset switch \u2014 see matchFilters(). \u2500\u2500 *\/\n  function setupLocalTabs() {\n    if ($llTabAllCount)  $llTabAllCount.textContent  = localAll.length;\n    if ($llTabMineCount) $llTabMineCount.textContent = zxListings.length;\n\n    if (!zxListings.length) {\n      \/\/ Nothing of your own yet \u2014 no point offering a scope with one option.\n      if ($llTabs) $llTabs.style.display = 'none';\n      return;\n    }\n    if ($llTabAll)  $llTabAll.addEventListener('click',  function(){ switchLocalScope('all'); });\n    if ($llTabMine) $llTabMine.addEventListener('click', function(){ switchLocalScope('mine'); });\n  }\n\n  function switchLocalScope(scope) {\n    activeScope = scope;\n    var mineActive = scope === 'mine';\n    if ($llTabAll)  { $llTabAll.classList.toggle('active', !mineActive);  $llTabAll.setAttribute('aria-selected', !mineActive); }\n    if ($llTabMine) { $llTabMine.classList.toggle('active', mineActive); $llTabMine.setAttribute('aria-selected', mineActive); }\n    applyFilters();\n  }\n\n  \/* \u2500\u2500 Shared card component \u2014 used for every card in the combined Local\n        Listings grid. isZxCard drives the orange \"Direct Listing\" badge\n        and the featured accent border; everything else is identical so\n        your own listings never look inconsistent next to network ones.\n        International keeps its own richer intlCardHTML further down\n        (longer editorial blurb) since it's doing a different job. \u2500\u2500 *\/\n  function localCardHTML(l, isZxCard) {\n    var cover  = (l.images && l.images.find(function(i){ return i.is_front_cover; })) || (l.images && l.images[0]);\n    var img    = cover ? (cover.thumbnail_url || cover.url) : '';\n    var rental = l.listing_type === '2';\n    var price  = l.price ? l.price.toLocaleString('fr-LU') + ' \u20ac' : 'Prix sur demande';\n    var loc    = l.city || l.address || 'Luxembourg';\n    var badge  = isZxCard ? '<span class=\"zx-badge\">Direct Listing<\/span>' : '<span class=\"net-badge\">eXp Network<\/span>';\n\n    var specs = [];\n    if (l.bedrooms)    specs.push(l.bedrooms + ' bed');\n    if (l.bathrooms)   specs.push(l.bathrooms + ' bath');\n    if (l.square_feet) specs.push(Math.round(l.square_feet) + ' m\u00b2');\n\n    return '<a class=\"icard' + (isZxCard ? ' is-featured' : '') + '\" href=\"' + (l.url ? esc(l.url) : '#') + '\"' + (l.url ? '' : ' data-no-url=\"1\"') + '>' +\n      '<div class=\"icard-img\" role=\"img\" aria-label=\"' + esc(l.title || 'Property') + '\"' + (img ? ' style=\"background-image:url(\\'' + esc(img) + '\\')\"' : '') + '>' +\n        badge +\n        '<span class=\"icard-country\">' + esc(loc) + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"icard-body\">' +\n        '<div class=\"icard-loc\">' + si('pin','12') + esc(loc) + '<\/div>' +\n        '<div class=\"icard-title\">' + esc(l.title) + '<\/div>' +\n        '<div class=\"icard-foot\">' +\n          '<div class=\"icard-price\">' + price + (rental ? ' <small>\/ month<\/small>' : '') +\n            (specs.length ? '<small>' + specs.join(' \u00b7 ') + '<\/small>' : '') + '<\/div>' +\n          '<span class=\"icard-enq\">' + (l.url ? 'View full listing \u2192' : 'Ask for details \u2192') + '<\/span>' +\n        '<\/div>' +\n      '<\/div>' +\n    '<\/a>';\n  }\n\n  \/* \u2500\u2500 International render \u2500\u2500 *\/\n  var activeIntlCountry = 'all';\n\n  function flagImg(country) {\n    var codes = { Spain:'es', France:'fr', Morocco:'ma', Portugal:'pt', Italy:'it', Greece:'gr' };\n    var code = codes[country];\n    return code ? '<img loading=\"lazy\" decoding=\"async\" class=\"intl-flag\" src=\"https:\/\/flagcdn.com\/w40\/' + code + '.png\" alt=\"' + esc(country) + '\" width=\"22\" height=\"15\" loading=\"lazy\">' : '';\n  }\n\n  function renderIntl() {\n    if (!intlListings.length) {\n      if ($intlSection) $intlSection.style.display = 'none';\n      return;\n    }\n    if ($intlState) $intlState.innerHTML = '';\n    buildIntlCountries();\n    renderIntlCards();\n  }\n\n  function buildIntlCountries() {\n    var wrap = document.getElementById('intlCountries');\n    if (!wrap) return;\n    var countries = intlListings.map(countryOf)\n      .filter(function(c,i,a){ return c && c !== 'International' && a.indexOf(c) === i; })\n      .sort(function(a,b){ return a.localeCompare(b); });\n    if (countries.length < 2) { wrap.innerHTML = ''; wrap.style.display = 'none'; return; }\n    wrap.style.display = '';\n    wrap.innerHTML =\n      '<button class=\"intl-country active\" data-c=\"all\">All destinations <span class=\"intl-country-count\">' + intlListings.length + '<\/span><\/button>' +\n      countries.map(function(c){\n        var count = intlListings.filter(function(l){ return countryOf(l) === c; }).length;\n        return '<button class=\"intl-country\" data-c=\"' + esc(c) + '\">' + flagImg(c) + '<span>' + esc(c) + '<\/span><span class=\"intl-country-count\">' + count + '<\/span><\/button>';\n      }).join('');\n    wrap.querySelectorAll('.intl-country').forEach(function(btn){\n      btn.addEventListener('click', function(){\n        wrap.querySelectorAll('.intl-country').forEach(function(b){ b.classList.remove('active'); });\n        btn.classList.add('active');\n        activeIntlCountry = btn.getAttribute('data-c');\n        renderIntlCards();\n      });\n    });\n  }\n\n  function renderIntlCards() {\n    var list = intlListings.filter(function(l){\n      return activeIntlCountry === 'all' || countryOf(l) === activeIntlCountry;\n    }).slice(0, MAX_INTL);\n    $intlTrack.innerHTML = list.map(intlCardHTML).join('');\n    $intlTrack.querySelectorAll('.icard').forEach(function(card, i){\n      if (card.dataset.noUrl) {\n        card.addEventListener('click', function(e){ e.preventDefault(); openPropertyModal(list[i]); });\n      }\n    });\n    initCarousel({\n      carousel: document.getElementById('intlCarousel'),\n      viewport: document.getElementById('intlViewport'),\n      track:    $intlTrack,\n      dots:     document.getElementById('intlDots'),\n      prev:     document.getElementById('intlPrev'),\n      next:     document.getElementById('intlNext'),\n      count:    list.length, gap: 28, cardSel: '.icard', dotClass: 'intl-dot', singleMax: 380, interval: 3000\n    });\n  }\n\n  \/* \u2500\u2500 Generic carousel controller (auto-advance, pause on hover, responsive) \u2500\u2500 *\/\n  function initCarousel(cfg) {\n    var carousel = cfg.carousel, viewport = cfg.viewport, track = cfg.track,\n        dotsWrap = cfg.dots, prevBtn = cfg.prev, nextBtn = cfg.next,\n        count = cfg.count, GAP = cfg.gap || 28, cardSel = cfg.cardSel,\n        dotClass = cfg.dotClass || 'intl-dot', singleMax = cfg.singleMax || 380,\n        interval = cfg.interval || 3000, autoScroll = cfg.autoScroll,\n        fixedWidth = cfg.fixedWidth || null;\n    if (!carousel || !viewport || !track || !count) return;\n    if (carousel._cleanup) carousel._cleanup();\n    var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    var idx = 0, step = 0, maxIdx = 0, isStatic = false, timer = null;\n\n    function perView() {\n      var w = viewport.clientWidth;\n      \/\/ fixedWidth mode (small tiles): however many actually fit at that\n      \/\/ width, rather than a fixed 3\/2\/1 breakpoint step \u2014 a ticker, not\n      \/\/ a column grid.\n      if (fixedWidth) {\n        var fit = Math.max(1, Math.floor((w + GAP) \/ (fixedWidth + GAP)));\n        return autoScroll ? Math.min(fit, Math.max(1, count - 1)) : fit;\n      }\n      var base = w >= 960 ? 3 : (w >= 620 ? 2 : 1);\n      \/\/ autoScroll: always leave at least one card off-screen so it auto-rotates\n      \/\/ whenever there are 2+ cards (instead of sitting static when they all fit).\n      return autoScroll ? Math.min(base, Math.max(1, count - 1)) : base;\n    }\n    function layout() {\n      var pv = perView(), vw = viewport.clientWidth;\n      isStatic = count <= pv;\n      carousel.classList.toggle('is-static', isStatic);\n      var visible = isStatic ? count : pv;\n      var cardW = fixedWidth\n        ? fixedWidth\n        : ((isStatic && count === 1) ? Math.min(vw, singleMax) : ((vw - (visible - 1) * GAP) \/ visible));\n      var cards = track.querySelectorAll(cardSel);\n      for (var i = 0; i < cards.length; i++) cards[i].style.width = cardW + 'px';\n      step = cardW + GAP;\n      maxIdx = Math.max(0, count - pv);\n      if (idx > maxIdx) idx = maxIdx;\n      move(); buildDots(); stopAuto(); if (!isStatic) startAuto();\n    }\n    function move() { track.style.transform = 'translateX(' + (-idx * step) + 'px)'; updateDots(); }\n    function go(n) { idx = n < 0 ? maxIdx : (n > maxIdx ? 0 : n); move(); }\n    function buildDots() {\n      if (!dotsWrap) return;\n      if (isStatic) { dotsWrap.innerHTML = ''; return; }\n      var h = '';\n      for (var i = 0; i <= maxIdx; i++) h += '<button class=\"' + dotClass + (i === idx ? ' active' : '') + '\" data-i=\"' + i + '\" aria-label=\"Go to slide ' + (i + 1) + '\"><\/button>';\n      dotsWrap.innerHTML = h;\n      dotsWrap.querySelectorAll('.' + dotClass).forEach(function(d){\n        d.addEventListener('click', function(){ go(parseInt(d.getAttribute('data-i'), 10)); restartAuto(); });\n      });\n    }\n    function updateDots() {\n      if (!dotsWrap) return;\n      var ds = dotsWrap.querySelectorAll('.' + dotClass);\n      for (var i = 0; i < ds.length; i++) ds[i].classList.toggle('active', i === idx);\n    }\n    function startAuto() { stopAuto(); if (reduceMotion) return; timer = setInterval(function(){ go(idx + 1); }, interval); }\n    function stopAuto()  { if (timer) { clearInterval(timer); timer = null; } }\n    function restartAuto(){ if (!isStatic) startAuto(); }\n\n    if (prevBtn) prevBtn.onclick = function(){ go(idx - 1); restartAuto(); };\n    if (nextBtn) nextBtn.onclick = function(){ go(idx + 1); restartAuto(); };\n    carousel.addEventListener('mouseenter', stopAuto);\n    carousel.addEventListener('mouseleave', restartAuto);\n    var rt;\n    function onResize(){ clearTimeout(rt); rt = setTimeout(layout, 150); }\n    window.addEventListener('resize', onResize);\n    carousel._cleanup = function(){\n      stopAuto();\n      window.removeEventListener('resize', onResize);\n      carousel.removeEventListener('mouseenter', stopAuto);\n      carousel.removeEventListener('mouseleave', restartAuto);\n    };\n    layout();\n  }\n\n  \/* \u2500\u2500 Village market-data carousel \u2014 small pill cards, fixedWidth mode\n        (see initCarousel above): sizes pills to a compact fixed width,\n        computes how many whole ones actually fit, and steps between\n        positions every 3s. Arrows\/dots only appear once they no longer\n        all fit \u2014 never a cropped pill, whole positions only. \u2500\u2500 *\/\n  function initVillageCarousel() {\n    var track = document.getElementById('vilTrack');\n    if (!track) return;\n    var count = track.querySelectorAll('.vpill').length;\n    if (!count) return;\n    initCarousel({\n      carousel: document.getElementById('vilCarousel'),\n      viewport: document.getElementById('vilViewport'),\n      track:    track,\n      dots:     document.getElementById('vilDots'),\n      prev:     document.getElementById('vilPrev'),\n      next:     document.getElementById('vilNext'),\n      count:    count, gap: 20, cardSel: '.vpill', dotClass: 'intl-dot', fixedWidth: 280, interval: 3000\n    });\n  }\n\n  function intlCardHTML(l) {\n    var cover  = (l.images && l.images.find(function(i){ return i.is_front_cover; })) || (l.images && l.images[0]);\n    var img    = cover ? (cover.thumbnail_url || cover.url) : '';\n    var rental = l.listing_type === '2';\n    var price  = l.price ? l.price.toLocaleString('de-DE') + ' \u20ac' : 'Price on request';\n    var country= countryOf(l);\n\n    var desc = intlBlurb(l);\n\n    var specs = [];\n    if (l.bedrooms)    specs.push(l.bedrooms + ' bed');\n    if (l.bathrooms)   specs.push(l.bathrooms + ' bath');\n    if (l.square_feet) specs.push(Math.round(l.square_feet) + ' m\u00b2');\n\n    return '<a class=\"icard\" href=\"' + (l.url ? esc(l.url) : '#') + '\"' + (l.url ? '' : ' data-no-url=\"1\"') + '>' +\n      '<div class=\"icard-img\" role=\"img\" aria-label=\"' + esc((l.title || 'Property') + ' \u2014 ' + country) + '\"' + (img ? ' style=\"background-image:url(\\'' + esc(img) + '\\')\"' : '') + '>' +\n        '<span class=\"excl-badge\">Exclusive<\/span>' +\n        '<span class=\"icard-country\">' + esc(country) + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"icard-body\">' +\n        '<div class=\"icard-loc\">' + si('pin','12') + esc(l.city || l.address || '') + '<\/div>' +\n        '<div class=\"icard-title\">' + esc(l.title) + '<\/div>' +\n        (desc ? '<div class=\"icard-desc\">' + esc(desc) + '<\/div>' : '') +\n        '<div class=\"icard-foot\">' +\n          '<div class=\"icard-price\">' + price + (rental ? ' <small>\/ month<\/small>' : '') +\n            (specs.length ? '<small>' + specs.join(' \u00b7 ') + '<\/small>' : '') + '<\/div>' +\n          '<span class=\"icard-enq\">' + (l.url ? 'View full listing \u2192' : 'Ask for details \u2192') + '<\/span>' +\n        '<\/div>' +\n      '<\/div>' +\n    '<\/a>';\n  }\n\n  \/* \u2500\u2500 Filters (network grid only) \u2500\u2500 *\/\n  function fmtPrice(v) {\n    if (v >= 1000000) { var m = v \/ 1000000; return '\u20ac' + (m % 1 ? m.toFixed(1) : m) + 'M'; }\n    return '\u20ac' + Math.round(v \/ 1000) + 'k';\n  }\n\n  function matchFilters(l) {\n    var p = +l.price || 0;\n    var commune = (l.city || l.address || '').trim();\n    return (activeScope   === 'all' || isZx(l)) &&\n           (activeType    === 'all' || l.property_type === activeType) &&\n           (activeStatus  === 'all' || l.listing_type  === activeStatus) &&\n           (activeCommune === 'all' || commune === activeCommune) &&\n           (!p || (p >= priceMin && p <= priceMax));\n  }\n\n  \/\/ French property types -> English labels + preferred display order\n  var EXP_TYPE_LABELS = {\n    'Appartement': 'Apartment', 'Appartment': 'Apartment',\n    'Maison': 'House', 'Bureau': 'Office', 'Bureaux': 'Office',\n    'Commerce': 'Commercial', 'Local commercial': 'Commercial',\n    'Terrain': 'Land', 'Immeuble': 'Building', 'Garage': 'Garage'\n  };\n  var EXP_TYPE_ORDER = ['Appartement', 'Appartment', 'Maison', 'Bureau', 'Bureaux', 'Commerce', 'Local commercial', 'Terrain', 'Immeuble', 'Garage'];\n  function expTypeLabel(t) { return EXP_TYPE_LABELS[t] || t; }\n\n  function buildFilters() {\n    \/\/ Fixed English order: All, Apartment, House, Office, Commercial, Land.\n    \/\/ data-t keeps the raw (French) value so filtering still matches l.property_type.\n    \/\/ Sourced from localAll (zx + network combined) so a type\/commune that\n    \/\/ only exists among your own listings still shows up as a filter option.\n    var present = localAll.map(function(l){ return l.property_type; })\n         .filter(function(t,i,a){ return t && a.indexOf(t) === i; });\n    var ordered = EXP_TYPE_ORDER.filter(function(t){ return present.indexOf(t) > -1; });\n    present.forEach(function(t){ if (ordered.indexOf(t) < 0) ordered.push(t); });\n    var types = ['all'].concat(ordered);\n\n    var communes = localAll.map(function(l){ return (l.city || l.address || '').trim(); })\n         .filter(function(c,i,a){ return c && a.indexOf(c) === i; })\n         .sort(function(a,b){ return a.localeCompare(b); });\n\n    \/\/ Price bounds from all priced local listings\n    var prices = localAll.map(function(l){ return +l.price; }).filter(function(p){ return p > 0; });\n    var hasPrice = prices.length > 0;\n    var RAW_LO = hasPrice ? Math.min.apply(null, prices) : 0;\n    var RAW_HI = hasPrice ? Math.max.apply(null, prices) : 0;\n    \/\/ Round the dropdown scale to clean, portal-familiar steps rather than\n    \/\/ raw \u20ac10k increments \u2014 a 200k\u20132M spread doesn't need 180 options.\n    var DSTEP = (RAW_HI - RAW_LO) <= 500000 ? 50000 : (RAW_HI - RAW_LO) <= 1500000 ? 100000 : 250000;\n    PRICE_LO = Math.floor(RAW_LO \/ DSTEP) * DSTEP;\n    PRICE_HI = Math.ceil(RAW_HI \/ DSTEP) * DSTEP;\n    priceMin = PRICE_LO; priceMax = PRICE_HI;\n\n    var priceSteps = [];\n    for (var pv = PRICE_LO; pv <= PRICE_HI; pv += DSTEP) priceSteps.push(pv);\n    var priceOptionsHTML = priceSteps.map(function(v){ return '<option value=\"' + v + '\">' + fmtPrice(v) + '<\/option>'; }).join('');\n\n    var priceBlock = hasPrice\n      ? '<div class=\"exp-price-fields\">' +\n          '<div class=\"exp-select-wrap exp-price-select\">' +\n            '<select class=\"exp-select\" id=\"expPriceMin\"><option value=\"\">No min<\/option>' + priceOptionsHTML + '<\/select>' +\n          '<\/div>' +\n          '<span class=\"exp-price-sep\">\u2013<\/span>' +\n          '<div class=\"exp-select-wrap exp-price-select\">' +\n            '<select class=\"exp-select\" id=\"expPriceMax\"><option value=\"\">No max<\/option>' + priceOptionsHTML + '<\/select>' +\n          '<\/div>' +\n        '<\/div>'\n      : '';\n\n    $filterBar.innerHTML =\n      '<div class=\"exp-filter-row\">' +\n        '<span class=\"exp-filter-label\">Transaction<\/span>' +\n        '<div class=\"exp-filters\" id=\"expStatusFilters\">' +\n          '<button class=\"exp-filter-btn active\" data-s=\"all\">All<\/button>' +\n          '<button class=\"exp-filter-btn\" data-s=\"1\">For sale<\/button>' +\n          '<button class=\"exp-filter-btn\" data-s=\"2\">For rent<\/button>' +\n        '<\/div>' +\n        '<span class=\"exp-filter-label\" style=\"margin-left:8px\">Type<\/span>' +\n        '<div class=\"exp-filters\" id=\"expTypeFilters\">' +\n          types.map(function(t){\n            return '<button class=\"exp-filter-btn' + (t==='all'?' active':'') + '\" data-t=\"' + esc(t) + '\">' + (t==='all'?'All':esc(expTypeLabel(t))) + '<\/button>';\n          }).join('') +\n        '<\/div>' +\n        '<button class=\"exp-reset-btn\" id=\"expResetBtn\">Reset<\/button>' +\n      '<\/div>' +\n      '<div class=\"exp-refine\">' +\n        '<div class=\"exp-f-field\">' +\n          '<span class=\"exp-f-label\">Commune<\/span>' +\n          '<div class=\"exp-select-wrap\">' +\n            '<svg class=\"exp-select-pin\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5a2.5 2.5 0 110-5 2.5 2.5 0 010 5z\"\/><\/svg>' +\n            '<select class=\"exp-select\" id=\"expCommune\">' +\n              '<option value=\"all\">All communes<\/option>' +\n              communes.map(function(c){ return '<option value=\"' + esc(c) + '\">' + esc(c) + '<\/option>'; }).join('') +\n            '<\/select>' +\n          '<\/div>' +\n        '<\/div>' +\n        (hasPrice\n          ? '<div class=\"exp-f-divider\"><\/div>' +\n            '<div class=\"exp-f-field exp-f-price\">' +\n              '<span class=\"exp-f-label\">Price range<\/span>' +\n              priceBlock +\n            '<\/div>'\n          : '') +\n      '<\/div>';\n\n    document.getElementById('expStatusFilters').querySelectorAll('.exp-filter-btn').forEach(function(btn){\n      btn.addEventListener('click', function(){\n        document.getElementById('expStatusFilters').querySelectorAll('.exp-filter-btn').forEach(function(b){ b.classList.remove('active'); });\n        btn.classList.add('active');\n        activeStatus = btn.dataset.s;\n        applyFilters();\n      });\n    });\n    document.getElementById('expTypeFilters').querySelectorAll('.exp-filter-btn').forEach(function(btn){\n      btn.addEventListener('click', function(){\n        document.getElementById('expTypeFilters').querySelectorAll('.exp-filter-btn').forEach(function(b){ b.classList.remove('active'); });\n        btn.classList.add('active');\n        activeType = btn.dataset.t;\n        applyFilters();\n      });\n    });\n    document.getElementById('expCommune').addEventListener('change', function(){\n      activeCommune = this.value;\n      applyFilters();\n    });\n    \n    \/\/ Reset button handler\n    document.getElementById('expResetBtn').addEventListener('click', function(){\n      \/\/ Reset status filter to \"All\"\n      activeStatus = 'all';\n      document.getElementById('expStatusFilters').querySelectorAll('.exp-filter-btn').forEach(function(b){ b.classList.remove('active'); });\n      document.getElementById('expStatusFilters').querySelector('[data-s=\"all\"]').classList.add('active');\n      \n      \/\/ Reset type filter to \"All\"\n      activeType = 'all';\n      document.getElementById('expTypeFilters').querySelectorAll('.exp-filter-btn').forEach(function(b){ b.classList.remove('active'); });\n      document.getElementById('expTypeFilters').querySelector('[data-t=\"all\"]').classList.add('active');\n      \n      \/\/ Reset commune dropdown to \"All communes\"\n      activeCommune = 'all';\n      document.getElementById('expCommune').value = 'all';\n      \n      \/\/ Reset price fields if present\n      if (hasPrice) {\n        priceMin = PRICE_LO;\n        priceMax = PRICE_HI;\n        document.getElementById('expPriceMin').value = '';\n        document.getElementById('expPriceMax').value = '';\n      }\n      \n      applyFilters();\n    });\n\n    if (hasPrice) {\n      var minEl = document.getElementById('expPriceMin');\n      var maxEl = document.getElementById('expPriceMax');\n      function priceChanged(which) {\n        var lo = minEl.value === '' ? PRICE_LO : parseInt(minEl.value, 10);\n        var hi = maxEl.value === '' ? PRICE_HI : parseInt(maxEl.value, 10);\n        if (lo > hi) {\n          if (which === 'min') { hi = lo; maxEl.value = (hi === PRICE_HI) ? '' : String(hi); }\n          else { lo = hi; minEl.value = (lo === PRICE_LO) ? '' : String(lo); }\n        }\n        priceMin = lo; priceMax = hi;\n        applyFilters();\n      }\n      minEl.addEventListener('change', function(){ priceChanged('min'); });\n      maxEl.addEventListener('change', function(){ priceChanged('max'); });\n    }\n  }\n\n  function applyFilters() {\n    \/\/ Featured-first: any of your own listings that pass the active\n    \/\/ filters sort ahead of network results \u2014 \"when one of our properties\n    \/\/ matches a search, it's shown first\" \u2014 rather than being confined to\n    \/\/ the separate \"Our Listings\" scope.\n    filtered = localAll.filter(matchFilters);\n    filtered.sort(function(a, b){ return (isZx(b) ? 1 : 0) - (isZx(a) ? 1 : 0); });\n    filtered = filtered.slice(0, MAX_CARDS);\n    renderGrid();\n  }\n\n  \/* \u2500\u2500 Grid \u2014 one shared card component for both your own listings and\n        the network, so they're never visually inconsistent. \u2500\u2500 *\/\n  function renderGrid() {\n    $state.innerHTML = '';\n    if (!filtered.length) {\n      $grid.style.display = 'none';\n      $state.innerHTML = '<div class=\"exp-empty\">No listings match your filters.<\/div>';\n      $count.style.display = 'none';\n      return;\n    }\n    var total = localAll.filter(matchFilters).length;\n    $count.innerHTML = 'Showing <strong>' + filtered.length + '<\/strong> of <strong>' + total + '<\/strong> listings';\n    $count.style.display = 'block';\n    $grid.innerHTML = filtered.map(function(l){ return localCardHTML(l, isZx(l)); }).join('');\n    $grid.style.display = 'grid';\n    document.getElementById('expSeeAllWrap').style.display = 'block';\n\n    $grid.querySelectorAll('.icard').forEach(function(card, i){\n      if (card.dataset.noUrl) {\n        card.addEventListener('click', function(e){ e.preventDefault(); openPropertyModal(filtered[i]); });\n      }\n    });\n  }\n\n  \/* \u2500\u2500 Similar properties \u2014 sourced from whichever pool the current\n        listing belongs to (network, zeas.immo exclusive, or international),\n        never mixed. Network: same property_type only (a garage shouldn't\n        surface a house). zeas.immo exclusive: just excludes itself, the\n        pool is small by design. International: same country only. \u2500\u2500 *\/\n  function similarCardsHTML(current) {\n    var poolName, source;\n    if (luListings.indexOf(current) !== -1)      { poolName = 'lu';   source = luListings; }\n    else if (zxListings.indexOf(current) !== -1) { poolName = 'zx';   source = zxListings; }\n    else                                          { poolName = 'intl'; source = intlListings; }\n\n    var pool;\n    if (poolName === 'lu') {\n      pool = source.filter(function(x){ return x !== current && x.property_type === current.property_type; });\n    } else if (poolName === 'zx') {\n      pool = source.filter(function(x){ return x !== current; });\n    } else {\n      pool = source.filter(function(x){ return x !== current && countryOf(x) === countryOf(current); });\n    }\n    pool = pool.slice(0, 3);\n    if (!pool.length) return '';\n\n    var cards = pool.map(function(x){\n      var sourceArr = source;\n      var img = (x.images && x.images[0]) ? (x.images[0].url || x.images[0].original_url) : '';\n      var xPrice = x.price ? x.price.toLocaleString('fr-LU') + ' \u20ac' : 'Prix sur demande';\n      var xSpecs = '';\n      if (x.bedrooms)    xSpecs += '<span class=\"exp-sim-spec\">' + si('bed','15') + '<strong>' + x.bedrooms + '<\/strong> ch.<\/span>';\n      if (x.square_feet) xSpecs += '<span class=\"exp-sim-spec\">' + si('sqm','15') + '<strong>' + Math.round(x.square_feet) + '<\/strong> m\u00b2<\/span>';\n      return '<a class=\"exp-sim-card\" href=\"#\" data-pool=\"' + poolName + '\" data-idx=\"' + sourceArr.indexOf(x) + '\">' +\n        '<div class=\"exp-sim-img\">' + (img ? '<img decoding=\"async\" src=\"' + esc(img) + '\" alt=\"\" loading=\"lazy\">' : '') + '<\/div>' +\n        '<div class=\"exp-sim-body\">' +\n          '<div class=\"exp-sim-city\">' + si('pin','12') + esc(x.city || x.address || '') + '<\/div>' +\n          '<div class=\"exp-sim-title\">' + esc(x.title) + '<\/div>' +\n          (xSpecs ? '<div class=\"exp-sim-specs\">' + xSpecs + '<\/div>' : '') +\n          '<div class=\"exp-sim-foot\"><span class=\"exp-sim-price\">' + xPrice + '<\/span><span class=\"exp-sim-cta\">View ' + si('chevR','13') + '<\/span><\/div>' +\n        '<\/div>' +\n      '<\/a>';\n    }).join('');\n\n    return '<div class=\"exp-modal-similar\">' +\n      '<div class=\"exp-modal-similar-head\"><span class=\"exp-sim-eyebrow\">You may also like<\/span><h3>Similar properties<\/h3><\/div>' +\n      '<div class=\"exp-modal-similar-track\">' + cards + '<\/div>' +\n    '<\/div>';\n  }\n\n  \/* \u2500\u2500 Property modal \u2500\u2500 *\/\n  function openPropertyModal(l) {\n    galImages = (l.images || []).map(function(i){ return i.url || i.original_url; }).filter(Boolean);\n    galIdx = 0;\n    var rental = l.listing_type === '2';\n    var price  = l.price ? l.price.toLocaleString('fr-LU') + ' \u20ac' : 'Prix sur demande';\n    var ec     = l.energy_efficiency_class;\n\n    var specs = '';\n    if (l.bedrooms)        specs += '<div class=\"exp-modal-spec\">' + si('bed','16')  + '<strong>' + l.bedrooms + '<\/strong> chambre' + (l.bedrooms>1?'s':'') + '<\/div>';\n    if (l.bathrooms)       specs += '<div class=\"exp-modal-spec\">' + si('bath','16') + '<strong>' + l.bathrooms + '<\/strong> sdb.<\/div>';\n    if (l.square_feet)     specs += '<div class=\"exp-modal-spec\">' + si('sqm','16')  + '<strong>' + Math.round(l.square_feet) + '<\/strong> m\u00b2 hab.<\/div>';\n    if (l.plot_size_sqm)   specs += '<div class=\"exp-modal-spec\">' + si('sqm','16')  + '<strong>' + Math.round(l.plot_size_sqm) + '<\/strong> m\u00b2 terrain<\/div>';\n    if (l.total_rooms)     specs += '<div class=\"exp-modal-spec\">' + si('rooms','16')+ '<strong>' + l.total_rooms + '<\/strong> pi\u00e8ces<\/div>';\n    if (l.construction_year) specs += '<div class=\"exp-modal-spec\">' + si('cal','16') + '<strong>' + l.construction_year + '<\/strong><\/div>';\n\n    var rawDesc = (l.description || '')\n      .replace(\/^[A-Z][A-Z ]+\\s*\\([^)]*\\+[\\d ]+\\)[^\\n]*\/gm, '')\n      .replace(\/\\+352[\\d .\\-]{6,}\/g, '')\n      .replace(\/^.*\\+\\d[\\d .\\-]{7,}.*$\/gm, '')\n      .replace(\/\\n{3,}\/g, '\\n\\n').trim();\n    var narrative = (l.narrative || '').replace(\/\\n{3,}\/g, '\\n\\n').trim();\n    var desc = [rawDesc, narrative].filter(Boolean).join('\\n\\n');\n\n    \/\/ Same \"Book a viewing\" destination as render.php's direct-listing\n    \/\/ pages \u2014 a generic contact page, pre-filled with whatever identifies\n    \/\/ this listing (network listings have no WP permalink, so l.url falls\n    \/\/ back to the page the visitor is already on).\n    var bookingUrl = 'https:\/\/zeas.immo\/en\/contact-us\/buying-opportunity?' +\n      'property=' + encodeURIComponent(l.title || '') +\n      '&ref=' + encodeURIComponent(l.source_id || l.id || '') +\n      '&url=' + encodeURIComponent(l.url || location.href);\n\n    $modalBody.innerHTML =\n      '<div class=\"exp-modal-gallery' + (galImages.length > 1 ? ' has-multi' : '') + '\">' +\n        (galImages.length ? '<img decoding=\"async\" id=\"expGalImg\" src=\"' + esc(galImages[0]) + '\" alt=\"' + esc(l.title) + '\">' : '') +\n        (galImages.length > 1\n          ? '<button class=\"exp-gal-btn exp-gal-prev\" id=\"expGalPrev\" aria-label=\"Previous photo\">' + si('chevL','22') + '<\/button>' +\n            '<button class=\"exp-gal-btn exp-gal-next\" id=\"expGalNext\" aria-label=\"Next photo\">' + si('chevR','22') + '<\/button>' +\n            '<span class=\"exp-gal-ctr\" id=\"expGalCtr\">' + si('camera','13') + '1 \/ ' + galImages.length + '<\/span>'\n          : '') +\n      '<\/div>' +\n      '<div class=\"exp-modal-body\">' +\n        '<div class=\"exp-modal-top\">' +\n          '<div>' +\n            '<div class=\"exp-modal-title\">' + esc(l.title) + '<\/div>' +\n            '<div class=\"exp-modal-addr\">' + si('pin','13') + esc(l.address || l.city || '') + '<\/div>' +\n            '<p class=\"exp-listing-attr\">Listing presented by an eXp Realty Luxembourg agent<\/p>' +\n          '<\/div>' +\n          '<div style=\"text-align:right\">' +\n            '<div class=\"exp-modal-price\">' + price + (rental?' <span class=\"pm\">\/ mois<\/span>':'') + '<\/div>' +\n            (ec && ec.length <= 2 ? '<span class=\"exp-energy\" data-c=\"' + esc(ec) + '\">CPE ' + esc(ec) + '<\/span>' : '') +\n          '<\/div>' +\n        '<\/div>' +\n        '<div class=\"exp-modal-footer\">' +\n          '<div class=\"exp-actions\">' +\n            '<button type=\"button\" class=\"exp-cta-btn exp-cta-btn--ghost\" id=\"expModalEnqBtn\">' + si('mail','14') + ' Ask about this property<\/button>' +\n            '<a class=\"exp-cta-btn\" href=\"' + esc(bookingUrl) + '\" target=\"_blank\" rel=\"noopener noreferrer\">Book a viewing<\/a>' +\n            (isLU(l) ? '<button type=\"button\" class=\"exp-cta-btn exp-cta-btn--ghost js-exp-acq-open\">See full cost overview<\/button>' : '') +\n          '<\/div>' +\n        '<\/div>' +\n        (specs ? '<div class=\"exp-modal-specs\">' + specs + '<\/div>' : '') +\n        (isLU(l) ? '<div class=\"exp-acq-teaser\">' +\n            '<div class=\"exp-acq-teaser-text\">' +\n              '<span class=\"exp-acq-eyebrow\">Acquisition cost<\/span>' +\n              '<h4>What would it cost to acquire this property?<\/h4>' +\n              '<p>Registration duties, notary fees and VAT typically add 8\u201313% on top of the asking price \u2014 the B\u00ebllegen Akt credit can hand back up to \u20ac40.000.<\/p>' +\n            '<\/div>' +\n            '<button type=\"button\" class=\"exp-cta-btn exp-cta-btn--ghost js-exp-acq-open\">See full cost breakdown<\/button>' +\n          '<\/div>' : '') +\n        (desc  ? '<div class=\"exp-desc-wrap is-collapsed\" id=\"expDescWrap\">' +\n                   '<div class=\"exp-modal-desc\" id=\"expDescText\">' + esc(desc) + '<\/div>' +\n                   '<div class=\"exp-desc-fade\"><\/div>' +\n                   '<button class=\"exp-read-more\" id=\"expReadMore\"><span>Read full description<\/span>' +\n                     '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>' +\n                   '<\/button>' +\n                 '<\/div>' : '') +\n        (similarCardsHTML(l)) +\n      '<\/div>';\n\n    if (galImages.length > 1) {\n      document.getElementById('expGalPrev').addEventListener('click', function(){ galNav(-1); });\n      document.getElementById('expGalNext').addEventListener('click', function(){ galNav(1); });\n    }\n    var gi = document.getElementById('expGalImg');\n    if (gi) gi.addEventListener('click', function(){ openLB(galIdx); });\n    document.getElementById('expModalEnqBtn').addEventListener('click', function(){\n      closePropertyModal();\n      openEnquiry(l);\n    });\n    \/\/ Two triggers can open the acquisition modal now (the teaser card and\n    \/\/ the footer's action-row button) \u2014 both share this class rather than\n    \/\/ an id, since an id can only ever belong to one element.\n    document.querySelectorAll('.js-exp-acq-open').forEach(function(b){\n      b.addEventListener('click', function(){\n        closePropertyModal();\n        openAcqModal(l);\n      });\n    });\n\n    $modalBody.querySelectorAll('.exp-sim-card').forEach(function(card){\n      card.addEventListener('click', function(e){\n        e.preventDefault();\n        var idx  = parseInt(card.dataset.idx, 10);\n        var pool = card.dataset.pool === 'lu' ? luListings : (card.dataset.pool === 'zx' ? zxListings : intlListings);\n        if (!isNaN(idx) && pool[idx]) openPropertyModal(pool[idx]);\n      });\n    });\n\n    initReadMore('exp');\n\n    $overlay.classList.add('open');\n    document.body.style.overflow = 'hidden';\n  }\n\n  function galNav(dir) {\n    galIdx = (galIdx + dir + galImages.length) % galImages.length;\n    document.getElementById('expGalImg').src = galImages[galIdx];\n    document.getElementById('expGalCtr').innerHTML = si('camera','13') + (galIdx+1) + ' \/ ' + galImages.length;\n  }\n  function closePropertyModal() {\n    $overlay.classList.remove('open');\n    document.body.style.overflow = '';\n  }\n  document.getElementById('expModalClose').addEventListener('click', closePropertyModal);\n  $overlay.addEventListener('click', function(e){ if(e.target===$overlay) closePropertyModal(); });\n\n  \/* \u2500\u2500 Enquiry modal \u2500\u2500 *\/\n  function openEnquiry(l) {\n    var rental = l.listing_type === '2';\n    var price  = l.price ? l.price.toLocaleString('fr-LU') + ' \u20ac' + (rental?' \/ mois':'') : 'Price on request';\n    var ref    = l.source_id || l.id.substring(0,8).toUpperCase();\n    var msg    = 'Hello,\\n\\nI am interested in the following property:\\n\\n' +\n      l.title + '\\n' + (l.address || l.city || '') + '\\nPrice: ' + price + '\\nRef: ' + ref +\n      '\\n\\nCould you please provide more information and arrange a viewing?\\n\\nThank you.';\n\n    $enqBody.innerHTML =\n      '<div class=\"exp-enq-prop-ref\"><strong>' + esc(l.title) + '<\/strong>' + esc(l.address || l.city || '') + ' \u00b7 ' + price + '<\/div>' +\n      '<h3 class=\"exp-enq-title\">Request more information<\/h3>' +\n      '<p class=\"exp-enq-sub\">We\\'ll contact the listing agent on your behalf and get back to you within 24 hours.<\/p>' +\n      '<div class=\"exp-enq-row\">' +\n        '<div><label class=\"exp-enq-label\">First name<\/label><input class=\"exp-enq-field\" id=\"expEnqFirst\" type=\"text\" placeholder=\"First name\"><\/div>' +\n        '<div><label class=\"exp-enq-label\">Last name<\/label><input class=\"exp-enq-field\" id=\"expEnqLast\" type=\"text\" placeholder=\"Last name\"><\/div>' +\n      '<\/div>' +\n      '<label class=\"exp-enq-label\">Email<\/label><input class=\"exp-enq-field\" id=\"expEnqEmail\" type=\"email\" placeholder=\"your@email.com\">' +\n      '<label class=\"exp-enq-label\">Phone (optional)<\/label><input class=\"exp-enq-field\" id=\"expEnqPhone\" type=\"tel\" placeholder=\"+352 ...\">' +\n      '<label class=\"exp-enq-label\">Message<\/label>' +\n      '<textarea class=\"exp-enq-field exp-enq-textarea\" id=\"expEnqMsg\">' + msg + '<\/textarea>' +\n      '<button class=\"exp-enq-submit\" id=\"expEnqSend\">' + si('mail','15') + ' Send enquiry<\/button>' +\n      '<p class=\"exp-enq-note\">Your details are only used to respond to your enquiry and are never shared.<\/p>';\n\n    document.getElementById('expEnqSend').addEventListener('click', function(){\n      var first = document.getElementById('expEnqFirst').value.trim();\n      var email = document.getElementById('expEnqEmail').value.trim();\n      if (!first || !email) { alert('Please enter your first name and email.'); return; }\n      var btn = document.getElementById('expEnqSend');\n      btn.disabled = true; btn.textContent = 'Sending...';\n      var fd = new FormData();\n      fd.append('action',   'enquiry');\n      fd.append('name',     first + ' ' + document.getElementById('expEnqLast').value.trim());\n      fd.append('email',    email);\n      fd.append('phone',    document.getElementById('expEnqPhone').value.trim());\n      fd.append('message',  document.getElementById('expEnqMsg').value.trim());\n      fd.append('property', l.title || '');\n      fd.append('ref',      ref);\n      fd.append('price',    price);\n      fetch(PROXY, { method: 'POST', body: fd })\n        .then(function(r){ return r.json(); })\n        .then(function(res){\n          if (res.success) {\n            knownContact = { firstName: first, email: email };\n            $enqBody.innerHTML =\n              '<div class=\"exp-enq-success\">' +\n                '<div class=\"exp-tick\"><svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M5 13l4 4L19 7\"\/><\/svg><\/div>' +\n                '<h3>Enquiry sent!<\/h3>' +\n                '<p>Thank you \u2014 we\\'ll be in touch within 24 hours.<\/p>' +\n              '<\/div>';\n          } else {\n            btn.disabled = false; btn.textContent = 'Send enquiry';\n            alert(res.error || 'Something went wrong. Please email hello@zeas.immo directly.');\n          }\n        })\n        .catch(function(){\n          btn.disabled = false; btn.textContent = 'Send enquiry';\n          alert('Something went wrong. Please email hello@zeas.immo directly.');\n        });\n    });\n\n    $enqOvl.classList.add('open');\n    document.body.style.overflow = 'hidden';\n  }\n\n  function closeEnquiry() {\n    $enqOvl.classList.remove('open');\n    document.body.style.overflow = '';\n  }\n  document.getElementById('expEnqClose').addEventListener('click', closeEnquiry);\n  $enqOvl.addEventListener('click', function(e){ if(e.target===$enqOvl) closeEnquiry(); });\n\n  \/* \u2500\u2500 Acquisition cost modal \u2500\u2500\n     Fixed-cost table (registration\/transcription\/notary \u2014 never depend on\n     who's buying) + a short form for what does (use, commune, first-buyer,\n     marital, agency\/expert). calc() mirrors the fixed-rate + B\u00ebllegen Akt\n     portion of runCalc() in buying-cost-calculator.html; VEFA\/VAT is\n     intentionally left out here, same as render.php, since this feed has\n     no reliable \"new build\" flag either. Keep rates in sync across all\n     three if Luxembourg changes them. *\/\n  function fmtEUR(n) { return '\u20ac ' + Math.round(n).toLocaleString('de-DE'); }\n\n  function openAcqModal(l) {\n    var price = +l.price || 0;\n    var regDuty   = price * 0.06;\n    var transcript= price * 0.01;\n    var notaryEst = price * 0.01;\n    var certainTotal = price + regDuty + transcript + notaryEst;\n    var priceFmt = price.toLocaleString('fr-LU') + ' \u20ac';\n\n    $acqBody.innerHTML =\n      '<div class=\"exp-enq-prop-ref\"><strong>' + esc(l.title) + '<\/strong>' + esc(l.address || l.city || '') + ' \u00b7 ' + priceFmt + '<\/div>' +\n      '<span class=\"exp-acq-eyebrow\">Fixed costs<\/span>' +\n      '<h3 class=\"exp-acq-h\">What you\\'ll pay no matter what<\/h3>' +\n      '<p class=\"exp-acq-lead\">These apply to every buyer of this property, whatever your personal situation.<\/p>' +\n      '<div class=\"exp-acq-table\">' +\n        '<div class=\"exp-acq-row\"><span>Purchase price<\/span><b>' + fmtEUR(price) + '<\/b><\/div>' +\n        '<div class=\"exp-acq-row\"><span>Registration duty<i>6% of price<\/i><\/span><b>' + fmtEUR(regDuty) + '<\/b><\/div>' +\n        '<div class=\"exp-acq-row\"><span>Transcription duty<i>1% of price<\/i><\/span><b>' + fmtEUR(transcript) + '<\/b><\/div>' +\n        '<div class=\"exp-acq-row\"><span>Notary fee<i>~1% estimate<\/i><\/span><b>' + fmtEUR(notaryEst) + '<\/b><\/div>' +\n        '<div class=\"exp-acq-row exp-acq-row--tot\"><span>Estimated minimum total<\/span><b>' + fmtEUR(certainTotal) + '<\/b><\/div>' +\n      '<\/div>' +\n      '<hr class=\"exp-acq-hr\">' +\n      '<span class=\"exp-acq-eyebrow\">Your situation<\/span>' +\n      '<h3 class=\"exp-acq-h\">A few things that change your number<\/h3>' +\n      '<p class=\"exp-acq-lead\">The B\u00ebllegen Akt credit, resale duty and Luxembourg City\\'s surcharge depend on who\\'s buying.<\/p>' +\n      '<form id=\"expAcqForm\">' +\n        '<div class=\"exp-enq-row\">' +\n          '<div><label class=\"exp-enq-label\">How will you use it?<\/label>' +\n            '<select class=\"exp-enq-field\" id=\"acqUse\"><option value=\"primary\">Primary residence<\/option><option value=\"secondary\">2nd home \/ holiday<\/option><option value=\"resale\">Buy-to-sell \/ investor<\/option><\/select><\/div>' +\n          '<div><label class=\"exp-enq-label\">Registration commune<\/label>' +\n            '<select class=\"exp-enq-field\" id=\"acqCommune\"><option value=\"other\" selected>Other commune<\/option><option value=\"lux\">Luxembourg City<\/option><\/select><\/div>' +\n        '<\/div>' +\n        '<div class=\"exp-enq-row\" id=\"acqPrimaryRow\">' +\n          '<div><label class=\"exp-enq-label\">First property in Luxembourg?<\/label>' +\n            '<select class=\"exp-enq-field\" id=\"acqFirstBuyer\"><option value=\"yes\">Yes \u2014 first buy<\/option><option value=\"no\">No \u2014 second buy<\/option><\/select><\/div>' +\n          '<div><label class=\"exp-enq-label\">Purchasing as<\/label>' +\n            '<select class=\"exp-enq-field\" id=\"acqMarital\"><option value=\"single\">Single buyer<\/option><option value=\"couple\">Couple \/ PACS<\/option><\/select><\/div>' +\n        '<\/div>' +\n        '<div id=\"acqCreditRow\" style=\"display:none\">' +\n          '<label class=\"exp-enq-label\">Remaining B\u00ebllegen Akt credit (\u20ac)<\/label>' +\n          '<input class=\"exp-enq-field\" id=\"acqRemCredit\" type=\"text\" placeholder=\"e.g. 25.000\" inputmode=\"numeric\">' +\n        '<\/div>' +\n        '<label class=\"exp-acq-check\"><input type=\"checkbox\" id=\"acqAgency\" checked> Include buyer\\'s agency fee (3.51%)<\/label>' +\n        '<label class=\"exp-acq-check\"><input type=\"checkbox\" id=\"acqExpert\"> Include expert valuation (\u20ac1.000)<\/label>' +\n        '<div id=\"acqGate\">' +\n          '<p class=\"exp-acq-gate-note\">Enter your name and email to see your exact total.<\/p>' +\n          '<div class=\"exp-enq-row\">' +\n            '<div><label class=\"exp-enq-label\">First name<\/label><input class=\"exp-enq-field\" id=\"acqFName\" type=\"text\"><\/div>' +\n            '<div><label class=\"exp-enq-label\">Email<\/label><input class=\"exp-enq-field\" id=\"acqEmail\" type=\"email\"><\/div>' +\n          '<\/div>' +\n        '<\/div>' +\n        '<button type=\"submit\" class=\"exp-enq-submit\" id=\"acqCalcBtn\">Calculate my exact total<\/button>' +\n      '<\/form>' +\n      '<div class=\"exp-acq-results\" id=\"acqResults\" style=\"display:none\">' +\n        '<div class=\"exp-acq-table\">' +\n          '<div class=\"exp-acq-row\"><span>State taxes<i id=\"acqCreditLine\"><\/i><\/span><b id=\"r_acqTax\">\u2014<\/b><\/div>' +\n          '<div class=\"exp-acq-row\"><span>Professional fees<\/span><b id=\"r_acqFees\">\u2014<\/b><\/div>' +\n          '<div class=\"exp-acq-row exp-acq-row--tot\"><span>Final acquisition cost<\/span><b id=\"r_acqFinal\">\u2014<\/b><\/div>' +\n        '<\/div>' +\n        '<p class=\"exp-acq-fine\">Estimate for guidance only \u2014 confirm exact figures with your notary. Need VEFA, VAT or a mortgage estimate too? <a href=\"https:\/\/zeas.immo\/en\/buying-cost-calculator-luxembourg\/?price=' + Math.round(price) + '&type=existing\" target=\"_blank\" rel=\"noopener noreferrer\">Open the full calculator \u2197<\/a><\/p>' +\n      '<\/div>';\n\n    var useSel = document.getElementById('acqUse');\n    var communeSel = document.getElementById('acqCommune');\n    var firstBuyerSel = document.getElementById('acqFirstBuyer');\n    var maritalSel = document.getElementById('acqMarital');\n    var remCreditEl = document.getElementById('acqRemCredit');\n    var agencyEl = document.getElementById('acqAgency');\n    var expertEl = document.getElementById('acqExpert');\n    var primaryRow = document.getElementById('acqPrimaryRow');\n    var creditRow = document.getElementById('acqCreditRow');\n    var gate = document.getElementById('acqGate');\n    var fNameEl = document.getElementById('acqFName');\n    var emailEl = document.getElementById('acqEmail');\n\n    function updateVisibility() {\n      var isPrimary = useSel.value === 'primary';\n      primaryRow.style.display = isPrimary ? '' : 'none';\n      creditRow.style.display = (isPrimary && firstBuyerSel.value === 'no') ? '' : 'none';\n    }\n    useSel.addEventListener('change', updateVisibility);\n    firstBuyerSel.addEventListener('change', updateVisibility);\n    updateVisibility();\n\n    if (knownContact) {\n      if (fNameEl && !fNameEl.value) fNameEl.value = knownContact.firstName || '';\n      if (emailEl && !emailEl.value) emailEl.value = knownContact.email || '';\n      if (knownContact.firstName && knownContact.email) gate.style.display = 'none';\n    }\n\n    document.getElementById('expAcqForm').addEventListener('submit', function(e){\n      e.preventDefault();\n      if (gate.style.display !== 'none') {\n        if (!fNameEl.value.trim() || !\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(emailEl.value)) {\n          alert('Please enter your first name and a valid email.');\n          return;\n        }\n        knownContact = { firstName: fNameEl.value, email: emailEl.value };\n        gate.style.display = 'none';\n      }\n\n      var isResale = useSel.value === 'resale';\n      var isPrimary = useSel.value === 'primary';\n      var isLuxC = communeSel.value === 'lux';\n      var is1st = firstBuyerSel.value === 'yes';\n      var isCouple = maritalSel.value === 'couple';\n      var remCredit = parseFloat((remCreditEl.value || '0').replace(\/\\.\/g,'').replace(',', '.')) || 0;\n\n      var rd = price * (isResale ? 0.072 : 0.06);\n      var tr = price * 0.01;\n      var luxSurch = isLuxC ? (price * 0.06) * 0.5 : 0;\n      var taxGross = rd + tr + luxSurch;\n      var eligTaxes = rd + tr;\n      var creditApplied = 0, taxNet = taxGross;\n      if (isPrimary) {\n        var creditAvail = is1st ? (isCouple ? 80000 : 40000) : Math.min(remCredit, isCouple ? 80000 : 40000);\n        creditApplied = Math.min(eligTaxes, creditAvail);\n        taxNet = Math.max(0, eligTaxes - creditApplied) + luxSurch;\n      }\n      var notaryFee = price * 0.01;\n      var agencyFee = agencyEl.checked ? price * 0.03 * 1.17 : 0;\n      var expertFee = expertEl.checked ? 1000 : 0;\n      var totalFees = notaryFee + agencyFee + expertFee;\n      var finalTotal = price + taxNet + totalFees;\n\n      document.getElementById('r_acqTax').textContent = fmtEUR(taxNet);\n      document.getElementById('r_acqFees').textContent = fmtEUR(totalFees);\n      document.getElementById('r_acqFinal').textContent = fmtEUR(finalTotal);\n      document.getElementById('acqCreditLine').textContent = creditApplied > 0\n        ? (' \u00b7 B\u00ebllegen Akt \u2212' + fmtEUR(creditApplied) + ' applied') : '';\n      var results = document.getElementById('acqResults');\n      results.style.display = 'block';\n      results.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n    });\n\n    $acqOvl.classList.add('open');\n    document.body.style.overflow = 'hidden';\n  }\n  function closeAcqModal() {\n    $acqOvl.classList.remove('open');\n    document.body.style.overflow = '';\n  }\n  document.getElementById('expAcqClose').addEventListener('click', closeAcqModal);\n  $acqOvl.addEventListener('click', function(e){ if(e.target===$acqOvl) closeAcqModal(); });\n\n  \/* \u2500\u2500 Lightbox \u2500\u2500 *\/\n  var $lb    = document.getElementById('expLightbox');\n  var $lbImg = document.getElementById('expLbImg');\n  var $lbCtr = document.getElementById('expLbCtr');\n  var lbIdx  = 0;\n  function openLB(idx) {\n    lbIdx = idx; $lbImg.src = galImages[lbIdx];\n    $lbImg.alt = 'Property photo ' + (lbIdx+1) + ' of ' + galImages.length;\n    $lbCtr.textContent = (lbIdx+1)+' \/ '+galImages.length;\n    $lb.classList.add('open');\n  }\n  function lbNav(d) {\n    lbIdx = (lbIdx+d+galImages.length)%galImages.length;\n    $lbImg.src = galImages[lbIdx];\n    $lbImg.alt = 'Property photo ' + (lbIdx+1) + ' of ' + galImages.length;\n    $lbCtr.textContent = (lbIdx+1)+' \/ '+galImages.length;\n  }\n  function closeLB() { $lb.classList.remove('open'); }\n  document.getElementById('expLbClose').addEventListener('click', closeLB);\n  document.getElementById('expLbPrev').addEventListener('click', function(){ lbNav(-1); });\n  document.getElementById('expLbNext').addEventListener('click', function(){ lbNav(1); });\n  $lb.addEventListener('click', function(e){ if(e.target===$lb||e.target===$lbImg) closeLB(); });\n\n  document.addEventListener('keydown', function(e){\n    if(e.key==='Escape'){closeLB();closePropertyModal();closeEnquiry();closeAcqModal();}\n    if(e.key==='ArrowLeft'&&$lb.classList.contains('open'))lbNav(-1);\n    if(e.key==='ArrowRight'&&$lb.classList.contains('open'))lbNav(1);\n  });\n\n  \/* \u2500\u2500 Icons \u2500\u2500 *\/\n  function si(name, size) {\n    size = size || '11';\n    var a = ' width=\"'+size+'\" height=\"'+size+'\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"';\n    var p = {\n      bed:   '<path d=\"M2 20V8a2 2 0 012-2h16a2 2 0 012 2v12\"\/><path d=\"M2 14h20\"\/><path d=\"M7 14V9\"\/>',\n      bath:  '<path d=\"M9 6a3 3 0 00-3 3v7h12V9\"\/><path d=\"M3 13h18v3a4 4 0 01-4 4H7a4 4 0 01-4-4v-3z\"\/>',\n      sqm:   '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\"\/><path d=\"M3 9h18M9 3v18\"\/>',\n      pin:   '<path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5a2.5 2.5 0 110-5 2.5 2.5 0 010 5z\"\/>',\n      rooms: '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"\/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"\/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"\/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"\/>',\n      cal:   '<rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"\/><path d=\"M16 2v4M8 2v4M3 10h18\"\/>',\n      mail:  '<path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"\/><polyline points=\"22,6 12,13 2,6\"\/>',\n      chevL: '<path d=\"M15 18l-6-6 6-6\"\/>',\n      chevR: '<path d=\"M9 18l6-6-6-6\"\/>',\n      camera:'<path d=\"M23 19a2 2 0 01-2 2H3a2 2 0 01-2-2V8a2 2 0 012-2h4l2-3h6l2 3h4a2 2 0 012 2z\"\/><circle cx=\"12\" cy=\"13\" r=\"4\"\/>',\n    };\n    return '<svg' + a + '>' + (p[name]||'') + '<\/svg>';\n  }\n\n  function esc(s) {\n    return String(s||'').replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;').replace(\/'\/g,'&#39;');\n  }\n\n  \/* \u2500\u2500 Read more \/ read less \u2014 only shown when the text actually overflows\n        the collapsed height, so short descriptions never get an inert button. \u2500\u2500 *\/\n  function initReadMore(prefix) {\n    var wrap = document.getElementById(prefix + 'DescWrap');\n    if (!wrap) return;\n    var text = document.getElementById(prefix + 'DescText');\n    var btn  = document.getElementById(prefix + 'ReadMore');\n    requestAnimationFrame(function () {\n      if (text.scrollHeight <= text.clientHeight + 4) {\n        wrap.classList.remove('is-collapsed');\n        btn.style.display = 'none';\n        return;\n      }\n      btn.addEventListener('click', function () {\n        var expanding = wrap.classList.contains('is-collapsed');\n        wrap.classList.toggle('is-collapsed', !expanding);\n        wrap.classList.toggle('is-expanded', expanding);\n        btn.querySelector('span').textContent = expanding ? 'Show less' : 'Read full description';\n      });\n    });\n  }\n\n  init();\n  initVillageCarousel();\n})();\n\n<\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Zeas Immo \u2014 Hesperange Real Estate Hesperange Real Estate The Hesperange agent obsessedwith your outcome. Buy, sell, or rent in Howald, Alzingen, Itzig, Fentange, or Hesperange village \u2014 differently. A plan-driven search. A personalised marketing campaign. Everything centered around your best outcome. I&#8217;m buying in Hesperange I&#8217;m selling my property 5+ Villages \u2014 Howald, Alzingen,Itzig, [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-17232","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/pages\/17232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/comments?post=17232"}],"version-history":[{"count":3,"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/pages\/17232\/revisions"}],"predecessor-version":[{"id":51305,"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/pages\/17232\/revisions\/51305"}],"wp:attachment":[{"href":"https:\/\/zeas.immo\/fr\/wp-json\/wp\/v2\/media?parent=17232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}