{"id":50903,"date":"2026-07-13T17:19:58","date_gmt":"2026-07-13T17:19:58","guid":{"rendered":"https:\/\/zeas.immo\/?page_id=50903"},"modified":"2026-07-13T21:03:23","modified_gmt":"2026-07-13T21:03:23","slug":"holidays-homes","status":"publish","type":"page","link":"https:\/\/zeas.immo\/en\/holidays-homes\/","title":{"rendered":"Holidays homes"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"50903\" class=\"elementor elementor-50903\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ce106b3 e-flex e-con-boxed e-con e-parent\" data-id=\"ce106b3\" 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-d59d2eb elementor-widget elementor-widget-html\" data-id=\"d59d2eb\" 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<!--\n  ZEAS \u2014 International Listings Page  (v1)\n  Adrian Buzea's own listings OUTSIDE Luxembourg (Spain \/ France \/ \u2026).\n  Paste into an Elementor HTML widget on  \/en\/international-properties\/\n  Section \u2192 Full Width, Container \u2192 Full Width, Padding 0\n\n  Data split (identical logic to homepage International section):\n    \u2022 isMine(l)   \u2192 agent tokens 'adrian' + 'buzea' across agent_* fields\n    \u2022 realCountry \u2192 full_payload.country  (top-level country_code is unreliable \u2192 always \"LU\")\n    \u2022 isIntl(l)   \u2192 isMine(l) && country !== 'LU'\n    \u2022 localizeEN  \u2192 pulls the English title\/description\/subtitle from full_payload.comments\n\n  Add a new destination? Extend COUNTRY_NAMES + FLAG_CODES below; it activates on publish.\n-->\n<style>\n\/* \u2500\u2500 Base \u2500\u2500 *\/\n#ziapp * { box-sizing: border-box; margin: 0; padding: 0; }\n#ziapp {\n  font-family: 'DM Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  color: #111110;\n  color-scheme: light;                 \/* stop dark-mode inversions site-wide *\/\n  padding: 62px 0 88px;\n  background: #ffffff;\n}\n\/* One consistent font across the page + its modals *\/\n#ziapp, #ziapp *,\n.zi-overlay, .zi-overlay *,\n.zi-enq-overlay, .zi-enq-overlay *,\n.zi-lightbox, .zi-lightbox * {\n  font-family: 'DM Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif !important;\n}\n.zi-inner { max-width: 1240px; margin: 0 auto; padding: 0 60px; }\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\n   PAGE HEADING\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 *\/\n.zi-page-hd { text-align: center; margin-bottom: 76px; }\n.zi-eyebrow {\n  display: flex; align-items: center; justify-content: center; gap: 12px;\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 12px; font-weight: 600;\n  letter-spacing: 0.2em; text-transform: uppercase;\n  color: #FF5C0B; margin-bottom: 26px;\n}\n.zi-eyebrow::before, .zi-eyebrow::after {\n  content: ''; width: 26px; height: 1px; background: #e0b79e; flex-shrink: 0;\n}\n.zi-page-title {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: clamp(30px, 3.8vw, 48px);\n  font-weight: 500; color: #111110;\n  line-height: 1.06; letter-spacing: -0.028em;\n  margin: 0 0 28px 0;\n}\n.zi-page-sub {\n  font-size: 16.5px; color: #555552; line-height: 1.8;\n  max-width: 640px; margin: 0 auto;\n}\n.zi-page-sub strong { color: #111110; font-weight: 500; }\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\n   COUNTRY SELECTOR  (hero filter \u2014 flag pills)\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 *\/\n.zi-countries {\n  display: flex; flex-wrap: wrap; justify-content: center; gap: 10px;\n  margin-bottom: 24px;\n}\n.zi-country {\n  display: inline-flex; align-items: center; gap: 9px;\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13.5px; font-weight: 500; letter-spacing: 0.02em;\n  padding: 9px 18px; border: 1.5px solid #e4e0da; background: #ffffff; color: #555552;\n  cursor: pointer; transition: border-color 150ms, color 150ms, background 150ms;\n}\n.zi-country:hover { border-color: #FF5C0B; color: #FF5C0B; }\n.zi-country.active { background: #FF5C0B; border-color: #FF5C0B; color: #ffffff; }\n.zi-country .zi-flag { display: block; border: 1px solid rgba(17,17,16,0.1); object-fit: cover; }\n.zi-country .zi-c-count { opacity: 0.6; font-weight: 400; font-size: 12px; }\n.zi-country.active .zi-c-count { opacity: 0.85; }\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\n   REFINE STRIP  (secondary filters)\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 *\/\n\/* One quiet, centered row of identical minimal dropdowns.\n   Each control self-labels at rest (\"Any bedrooms\", \"Any price\") \u2014 no floating labels,\n   no slider, one baseline. Renders only the controls that have >1 real option. *\/\n.zi-toolbar {\n  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;\n  gap: 12px; margin-top: 20px;\n}\n.zi-select {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13.5px; color: #111110; font-weight: 500;\n  height: 44px; padding: 0 40px 0 17px; min-width: 154px;\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='%23999895' stroke-width='1.5' fill='none' stroke-linecap='round'\/%3E%3C\/svg%3E\");\n  background-repeat: no-repeat; background-position: right 15px center;\n  appearance: none; -webkit-appearance: none; cursor: pointer; outline: none;\n  transition: border-color 180ms;\n}\n.zi-select:hover { border-color: #c9c4bc; }\n.zi-select:focus { border-color: #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\u2550\u2550\n   RESULTS META  (count + sort + clear)\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 *\/\n.zi-meta {\n  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;\n  flex-wrap: wrap; text-align: center;\n  margin: 40px 0 28px; padding-bottom: 18px;\n  border-bottom: 1px solid #f0efed;\n}\n.zi-count { font-size: 14px; color: #555552; font-weight: 500; text-align: center; }\n.zi-count strong { color: #111110; font-weight: 700; }\n.zi-meta-right { display: flex; align-items: center; justify-content: center; gap: 18px; flex-wrap: wrap; }\n.zi-clear {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 12px; font-weight: 500; letter-spacing: 0.03em;\n  color: #999895; background: none; border: none; cursor: pointer;\n  display: none; align-items: center; gap: 6px; padding: 0;\n  transition: color 150ms;\n}\n.zi-clear:hover { color: #FF5C0B; }\n.zi-clear.show { display: inline-flex; }\n.zi-sort-wrap { display: flex; align-items: center; gap: 9px; }\n.zi-sort-label {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 10.5px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase;\n  color: #999895;\n}\n.zi-sort { min-width: 168px; height: 40px; padding: 0 36px 0 14px; font-size: 13px; }\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\n   STATES\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 *\/\n.zi-loading { display: flex; align-items: center; justify-content: center; gap: 12px; color: #999895; font-size: 14px; padding: 60px 0; }\n.zi-spinner { width: 20px; height: 20px; border: 2px solid #e4e0da; border-top-color: #FF5C0B; border-radius: 50%; animation: zispin .7s linear infinite; flex-shrink: 0; }\n@keyframes zispin { to { transform: rotate(360deg); } }\n.zi-error { font-size: 13px; color: #c0392b; padding: 24px 0; text-align: center; }\n.zi-empty { text-align: center; padding: 72px 20px; }\n.zi-empty-t { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 19px; font-weight: 500; color: #111110; margin-bottom: 10px; }\n.zi-empty-p { font-size: 15px; color: #777470; line-height: 1.7; max-width: 440px; margin: 0 auto 22px; }\n.zi-empty-cta {\n  display: inline-flex; align-items: center; gap: 8px;\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; font-weight: 600; letter-spacing: 0.02em;\n  background: #FF5C0B; color: #ffffff; text-decoration: none;\n  padding: 12px 26px; transition: background 180ms;\n}\n.zi-empty-cta:hover { background: #e04e00; color: #fff; }\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\n   GRID + EDITORIAL CARD\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 *\/\n.zi-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 34px; }\n\n\/* Card \u2014 matches the homepage eXp card (clean, minimal, premium) *\/\n.icard {\n  background: #ffffff;\n  border: 1px solid #e4e0da; border-bottom: 2px solid transparent;\n  display: flex; flex-direction: column; cursor: pointer;\n  transition: transform 220ms, box-shadow 220ms, border-color 220ms;\n}\n.icard: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.icard-img {\n  position: relative; aspect-ratio: 4\/3; overflow: hidden; background: #f0efed;\n}\n.icard-img img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 400ms; }\n.icard:hover .icard-img img { transform: scale(1.04); }\n.excl-badge {\n  position: absolute; top: 10px; left: 10px; z-index: 2;\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 9px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;\n  background: #111110; color: #fff; padding: 3px 8px;\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: 10px; right: 10px; z-index: 2;\n  display: inline-flex; align-items: center; gap: 7px;\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 9px; font-weight: 600; letter-spacing: .09em; text-transform: uppercase;\n  background: rgba(255,255,255,.92); color: #111110; padding: 3px 8px;\n}\n.icard-country .zi-flag { display: block; border: 1px solid rgba(17,17,16,0.12); }\n.icard-rent {\n  position: absolute; bottom: 10px; left: 10px; z-index: 2;\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 10px; font-weight: 500; letter-spacing: .04em;\n  background: rgba(17,17,16,.65); backdrop-filter: blur(4px); color: #fff; padding: 3px 8px;\n}\n.icard-body {\n  padding: 18px 18px 16px; flex: 1;\n  display: flex; flex-direction: column; gap: 6px;\n}\n.icard-price {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 24px; font-weight: 600; color: #FF5C0B; line-height: 1;\n}\n.icard-price .pm { font-size: 13px; font-weight: 400; color: #999895; }\n.icard-title {\n  font-family: '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; -webkit-box-orient: vertical; overflow: hidden;\n}\n.icard-loc {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14.5px; color: #777470; letter-spacing: normal; text-transform: none;\n  display: flex; align-items: center; gap: 5px;\n}\n.icard-loc svg { color: #FF5C0B; flex-shrink: 0; }\n.icard-specs {\n  display: flex; gap: 16px;\n  padding-top: 12px; border-top: 1px solid #f0efed; margin-top: 4px;\n}\n.icard-spec {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14.5px; color: #555552;\n  display: flex; align-items: center; gap: 5px;\n}\n.icard-spec strong { color: #111110; font-weight: 700; }\n.icard-enq {\n  display: flex; align-items: center; gap: 6px;\n  padding-top: 12px; border-top: 1px solid #f0efed; margin-top: auto;\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 14px; font-weight: 500; color: #FF5C0B; letter-spacing: 0.01em;\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\n   PAGINATION\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 *\/\n.zi-pagination { display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 52px; flex-wrap: wrap; }\n.zi-page-btn {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 13px; font-weight: 500;\n  min-width: 38px; height: 38px; border: 1.5px solid #e4e0da;\n  background: #ffffff; color: #555552; cursor: pointer;\n  display: inline-flex; align-items: center; justify-content: center;\n  transition: border-color 150ms, background 150ms, color 150ms;\n  padding: 0 11px; line-height: 1; white-space: nowrap;\n}\n.zi-page-btn:hover:not(.active):not(.disabled) { border-color: #FF5C0B; color: #FF5C0B; }\n.zi-page-btn.active { background: #FF5C0B; border-color: #FF5C0B; color: #ffffff; cursor: default; }\n.zi-page-btn.disabled { opacity: .32; cursor: default; pointer-events: none; }\n.zi-page-ellipsis { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; color: #999895; display: inline-flex; align-items: center; padding: 0 4px; height: 38px; user-select: none; }\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\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 *\/\n.zi-overlay {\n  display: none; position: fixed; inset: 0;\n  background: rgba(17,17,16,.78); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);\n  z-index: 99999; overflow-y: auto; padding: 24px 20px;\n  align-items: flex-start; justify-content: center;\n}\n.zi-overlay.open { display: flex; }\n.zi-modal { background: #ffffff; width: 100%; max-width: 1100px; margin: auto; position: relative; overflow: hidden; animation: zimodalin .22s ease; }\n@keyframes zimodalin { from { opacity:0; transform:translateY(14px); } to { opacity:1; transform:translateY(0); } }\n.zi-modal-close {\n  position: absolute; top: 14px; right: 14px; z-index: 10; width: 40px; height: 40px;\n  background: #ffffff; border: none; border-radius: 50%; cursor: pointer;\n  display: flex; align-items: center; justify-content: center; color: #111110;\n  transition: background 180ms, color 180ms; box-shadow: 0 2px 8px rgba(17,17,16,.22);\n}\n.zi-modal-close:hover { background: #FF5C0B; color: #ffffff; }\n.zi-modal-gallery { position: relative; height: 60vh; min-height: 320px; max-height: 640px; background: #111110; overflow: hidden; cursor: zoom-in; }\n.zi-modal-gallery img { width:100%; height:100%; object-fit:cover; display:block; }\n.zi-modal-gallery.has-multi::before, .zi-modal-gallery.has-multi::after { content: ''; position: absolute; top: 0; bottom: 0; width: 110px; z-index: 2; pointer-events: none; }\n.zi-modal-gallery.has-multi::before { left: 0; background: linear-gradient(to right, rgba(17,17,16,.45), rgba(17,17,16,0)); }\n.zi-modal-gallery.has-multi::after  { right: 0; background: linear-gradient(to left,  rgba(17,17,16,.45), rgba(17,17,16,0)); }\n.zi-gal-btn {\n  position: absolute; top: 50%; transform: translateY(-50%); width: 48px; height: 48px;\n  background: rgba(17,17,16,.62); border: 1.5px solid rgba(255,255,255,.7); border-radius: 50%;\n  cursor: pointer; color: #ffffff; display: flex; align-items: center; justify-content: center;\n  transition: background 180ms, transform 180ms; z-index: 6; box-shadow: 0 3px 14px rgba(0,0,0,.4);\n}\n.zi-gal-btn svg { width: 22px; height: 22px; }\n.zi-gal-btn:hover { background: #FF5C0B; border-color: #FF5C0B; transform: translateY(-50%) scale(1.06); }\n.zi-gal-prev { left: 16px; } .zi-gal-next { right: 16px; }\n.zi-gal-ctr { position: absolute; bottom: 14px; right: 16px; z-index: 6; background: rgba(17,17,16,.72); color: #ffffff; font-size: 12px; font-weight: 600; padding: 5px 12px; letter-spacing: .04em; display: inline-flex; align-items: center; gap: 6px; }\n.zi-modal-body { padding: 28px 32px 32px; }\n.zi-modal-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 20px; }\n.zi-modal-title { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 22px; font-weight: 500; color: #111110; letter-spacing: -0.012em; margin-bottom: 7px; }\n.zi-modal-addr { font-size: 14px; color: #777470; display: flex; align-items: center; gap: 6px; }\n.zi-modal-addr svg { color: #FF5C0B; flex-shrink: 0; }\n.zi-listing-attr {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  font-size: 11.5px; color: #999895; font-style: italic; margin-top: 8px; letter-spacing: 0.01em;\n  display: inline-flex; align-items: center; gap: 7px;\n}\n.zi-listing-attr .zi-flag { display: block; border: 1px solid rgba(17,17,16,0.12); flex-shrink: 0; }\n.zi-modal-price { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 29px; font-weight: 500; color: #FF5C0B; line-height: 1; }\n.zi-modal-price .pm { font-size: 14px; font-weight: 400; color: #999895; }\n.zi-energy { display: inline-flex; align-items: center; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 11px; font-weight: 700; padding: 3px 9px; letter-spacing: 0.04em; background: #f0efed; color: #555552; margin-top: 8px; }\n.zi-energy[data-c=\"A\"]{background:#1e7e34;color:#fff}\n.zi-energy[data-c=\"B\"]{background:#28a745;color:#fff}\n.zi-energy[data-c=\"C\"]{background:#ffc107;color:#333}\n.zi-energy[data-c=\"D\"]{background:#fd7e14;color:#fff}\n.zi-energy[data-c=\"E\"]{background:#dc3545;color:#fff}\n.zi-energy[data-c=\"F\"]{background:#9c1313;color:#fff}\n.zi-energy[data-c=\"G\"]{background:#6b0f0f;color:#fff}\n.zi-modal-specs { display: flex; gap: 22px; flex-wrap: wrap; padding: 16px 0; border-top: 1px solid #f0efed; border-bottom: 1px solid #f0efed; margin: 16px 0; }\n.zi-modal-spec { display: flex; align-items: center; gap: 8px; font-size: 14px; color: #111110; }\n.zi-modal-spec svg { color: #FF5C0B; flex-shrink: 0; }\n.zi-modal-spec strong { font-weight: 700; }\n.zi-modal-desc { font-size: 13.5px; line-height: 1.75; color: #555552; white-space: pre-line; max-height: 190px; overflow-y: auto; }\n.zi-modal-desc::-webkit-scrollbar { width: 4px; }\n.zi-modal-desc::-webkit-scrollbar-thumb { background: #FF5C0B; }\n.zi-modal-footer { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; margin-top: 24px; padding-top: 20px; border-top: 1px solid #f0efed; }\n.zi-modal-footer-text { font-size: 13.5px; color: #555552; line-height: 1.5; }\n.zi-modal-footer-text span { display: block; font-size: 12px; color: #999895; margin-top: 3px; }\n.zi-cta-btn { display: inline-flex; align-items: center; gap: 8px; background: #FF5C0B; color: #ffffff; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; font-weight: 600; padding: 12px 26px; border: none; cursor: pointer; text-decoration: none; letter-spacing: 0.02em; transition: background 180ms, transform 120ms; }\n.zi-cta-btn:hover { background: #e04e00; transform: translateY(-1px); color: #fff; text-decoration: none; }\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\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 *\/\n.zi-enq-overlay { display: none; position: fixed; inset: 0; background: rgba(17,17,16,.82); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); z-index: 999999; overflow-y: auto; padding: 24px 20px; align-items: flex-start; justify-content: center; }\n.zi-enq-overlay.open { display: flex; }\n.zi-enq-modal { background: #ffffff; width: 100%; max-width: 560px; margin: auto; padding: 36px 36px 32px; position: relative; animation: zimodalin .22s ease; }\n.zi-enq-close { position: absolute; top: 14px; right: 14px; width: 40px; height: 40px; background: #ffffff; border: none; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; color: #111110; transition: background 180ms, color 180ms; box-shadow: 0 2px 8px rgba(17,17,16,.22); }\n.zi-enq-close:hover { background: #FF5C0B; color: #ffffff; }\n.zi-enq-prop-ref { background: #faf9f7; border-left: 3px solid #FF5C0B; padding: 12px 16px; margin-bottom: 24px; font-size: 13px; color: #555552; line-height: 1.5; }\n.zi-enq-prop-ref strong { display: block; font-size: 14px; color: #111110; margin-bottom: 2px; }\n.zi-enq-title { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 21px; font-weight: 500; color: #111110; letter-spacing: -0.012em; margin-bottom: 6px; }\n.zi-enq-sub { font-size: 13px; color: #999895; margin-bottom: 24px; line-height: 1.55; }\n.zi-enq-label { display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: #555552; margin-bottom: 6px; }\n.zi-enq-field { width: 100%; font-size: 14px; color: #111110; padding: 10px 14px; margin-bottom: 16px; border: 1.5px solid #e4e0da; background: #ffffff; outline: none; transition: border-color 180ms; }\n.zi-enq-field:focus { border-color: #FF5C0B; }\n.zi-enq-textarea { min-height: 120px; resize: vertical; line-height: 1.6; }\n.zi-enq-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\n.zi-enq-submit { width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; background: #FF5C0B; color: #ffffff; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 600; padding: 13px 24px; border: none; cursor: pointer; letter-spacing: 0.02em; margin-top: 8px; transition: background 180ms; }\n.zi-enq-submit:hover { background: #e04e00; }\n.zi-enq-note { font-size: 11px; color: #999895; text-align: center; margin-top: 12px; line-height: 1.5; }\n.zi-enq-success { text-align: center; padding: 20px 0; }\n.zi-enq-success .zi-tick { width: 48px; height: 48px; background: #FF5C0B; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 16px; }\n.zi-enq-success h3 { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 500; color: #111110; margin-bottom: 8px; }\n.zi-enq-success p { font-size: 14px; color: #555552; line-height: 1.6; }\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\n   LIGHTBOX\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 *\/\n.zi-lightbox { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.96); z-index: 9999999; align-items: center; justify-content: center; }\n.zi-lightbox.open { display: flex; }\n.zi-lightbox-img { max-width: 95vw; max-height: 95vh; object-fit: contain; display: block; }\n.zi-lb-btn { position: fixed; width: 44px; height: 44px; background: rgba(255,255,255,0.15); border: none; border-radius: 50%; cursor: pointer; color: #ffffff; display: flex; align-items: center; justify-content: center; transition: background 180ms; z-index: 10; }\n.zi-lb-btn:hover { background: #FF5C0B; }\n.zi-lb-close { top: 16px; right: 16px; }\n.zi-lb-prev { left: 16px; top: 50%; transform: translateY(-50%); }\n.zi-lb-next { right: 16px; top: 50%; transform: translateY(-50%); }\n.zi-lb-ctr { position: fixed; bottom: 16px; left: 50%; transform: translateX(-50%); background: rgba(255,255,255,0.15); color: #ffffff; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; padding: 4px 14px; border-radius: 20px; }\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\n   RESPONSIVE\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 *\/\n@media (max-width: 960px) {\n  .zi-inner { padding: 0 32px; }\n  .zi-grid  { grid-template-columns: repeat(2, 1fr); }\n  .zi-toolbar { gap: 10px; }\n}\n@media (max-width: 600px) {\n  .zi-inner { padding: 0 20px; }\n  .zi-grid  { grid-template-columns: 1fr; }\n  #ziapp    { padding: 44px 0 64px; }\n  .zi-toolbar { flex-direction: column; align-items: stretch; gap: 10px; }\n  .zi-toolbar .zi-select { width: 100%; min-width: 0; }\n  .zi-meta { flex-direction: column; align-items: center; gap: 14px; }\n  .zi-meta-right { width: 100%; justify-content: center; }\n  .zi-sort { flex: 1; }\n  .zi-modal-body { padding: 22px 20px; }\n  .zi-enq-modal { padding: 24px 20px; }\n  .zi-enq-row { grid-template-columns: 1fr; }\n}\n<\/style>\n\n\n<div id=\"ziapp\">\n<div class=\"zi-inner\">\n\n  <!-- Page heading -->\n  <div class=\"zi-page-hd\">\n    <p class=\"zi-eyebrow\">International \u00b7 Exclusive in Luxembourg<\/p>\n    <h1 class=\"zi-page-title\">Holiday homes abroad, arranged from Luxembourg<\/h1>\n    <p class=\"zi-page-sub\">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 \u2014 handled end to end, in your language, from your Luxembourg coach.<\/p>\n  <\/div>\n\n  <!-- Country selector (hero filter) -->\n  <div id=\"ziCountries\" class=\"zi-countries\"><\/div>\n\n  <!-- Secondary filters (quiet dropdown toolbar) -->\n  <div id=\"ziRefine\" class=\"zi-toolbar\" style=\"display:none\"><\/div>\n\n  <!-- Results meta -->\n  <div id=\"ziMeta\" class=\"zi-meta\" style=\"display:none\">\n    <div id=\"ziCount\" class=\"zi-count\"><\/div>\n    <div class=\"zi-meta-right\">\n      <button id=\"ziClear\" class=\"zi-clear\">\n        <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M2 2l12 12M14 2L2 14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"\/><\/svg>\n        Clear all\n      <\/button>\n      <div class=\"zi-sort-wrap\">\n        <span class=\"zi-sort-label\">Sort<\/span>\n        <select class=\"zi-select zi-sort\" id=\"ziSort\">\n          <option value=\"featured\">Featured<\/option>\n          <option value=\"price-desc\">Price \u00b7 high to low<\/option>\n          <option value=\"price-asc\">Price \u00b7 low to high<\/option>\n        <\/select>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- State \/ Grid -->\n  <div id=\"ziState\">\n    <div class=\"zi-loading\"><div class=\"zi-spinner\"><\/div> Loading listings\u2026<\/div>\n  <\/div>\n  <div id=\"ziGrid\" class=\"zi-grid\" style=\"display:none\"><\/div>\n  <div id=\"ziPagination\" class=\"zi-pagination\"><\/div>\n\n<\/div>\n<\/div>\n\n\n<!-- Fullscreen lightbox -->\n<div class=\"zi-lightbox\" id=\"ziLightbox\">\n  <button class=\"zi-lb-btn zi-lb-close\" id=\"ziLbClose\"><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=\"zi-lb-btn zi-lb-prev\" id=\"ziLbPrev\"><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=\"zi-lightbox-img\" id=\"ziLbImg\" src=\"\" alt=\"\">\n  <button class=\"zi-lb-btn zi-lb-next\" id=\"ziLbNext\"><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=\"zi-lb-ctr\" id=\"ziLbCtr\"><\/span>\n<\/div>\n\n<!-- Property detail modal -->\n<div class=\"zi-overlay\" id=\"ziOverlay\">\n  <div class=\"zi-modal\" id=\"ziModal\">\n    <button class=\"zi-modal-close\" id=\"ziModalClose\">\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M2 2l12 12M14 2L2 14\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\/><\/svg>\n    <\/button>\n    <div id=\"ziModalBody\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- Enquiry modal -->\n<div class=\"zi-enq-overlay\" id=\"ziEnqOverlay\">\n  <div class=\"zi-enq-modal\" id=\"ziEnqModal\">\n    <button class=\"zi-enq-close\" id=\"ziEnqClose\">\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M2 2l12 12M14 2L2 14\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\/><\/svg>\n    <\/button>\n    <div id=\"ziEnqBody\"><\/div>\n  <\/div>\n<\/div>\n\n\n<script>\n(function () {\n  const PROXY     = 'https:\/\/zeas.immo\/zeas-proxy.php';\n  const PAGE_SIZE = 12;\n\n  \/* \u2500\u2500 State \u2500\u2500 *\/\n  let all = [];            \/\/ international listings only (Adrian Buzea, abroad)\n  let filtered = [];\n  let activeCountry = 'all';\n  let activeStatus  = 'all';   \/\/ listing_type: 'all' | '1' sale | '2' rent\n  let activeType    = 'all';\n  let activeBeds    = 0;       \/\/ minimum bedrooms\n  let PRICE_LO = 0, PRICE_HI = 0, priceMin = 0, priceMax = Infinity;\n  let PRICE_BANDS = [];        \/\/ [{label, lo, hi}]\n  let activePriceBand = 'any';\n  let sortBy = 'featured';\n  let currentPage = 1;\n\n  let galImages = [], galIdx = 0, currentListing = null;\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     LISTING SPLIT \u2014 identical to the homepage logic\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  const MY_AGENT_TOKENS  = ['adrian', 'buzea'];\n  const AGENT_STR_FIELDS = ['agent_first_name','agent_last_name','agent_email','agent_name','listing_agent'];\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  \/\/ Top-level country_code reads \"LU\" even abroad \u2192 use 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) { var c = realCountry(l); return !!c && c !== 'LU'; }\n  function isIntl(l)   { return isMine(l) && isAbroad(l); }\n\n  const COUNTRY_NAMES = { ES:'Spain', FR:'France', MA:'Morocco', PT:'Portugal', IT:'Italy', GR:'Greece', LU:'Luxembourg' };\n  const FLAG_CODES    = { Spain:'es', France:'fr', Morocco:'ma', Portugal:'pt', Italy:'it', Greece:'gr' };\n  function countryOf(l) { var c = realCountry(l); return COUNTRY_NAMES[c] || c || 'International'; }\n  function flagImg(country, w) {\n    w = w || 40; var code = FLAG_CODES[country];\n    var px = w === 40 ? 22 : Math.round(w * 22 \/ 40);\n    return code ? '<img decoding=\"async\" class=\"zi-flag\" src=\"https:\/\/flagcdn.com\/w' + w + '\/' + code + '.png\" alt=\"' + esc(country) + '\" width=\"' + px + '\" height=\"' + Math.round(px * 15 \/ 22) + '\" loading=\"lazy\">' : '';\n  }\n\n  \/\/ English content lives in full_payload.comments \u2014 surface it for card + modal.\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  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, 170) + (d.length > 170 ? '\u2026' : '');\n  }\n\n  \/* \u2500\u2500 DOM \u2500\u2500 *\/\n  const $state    = document.getElementById('ziState');\n  const $grid     = document.getElementById('ziGrid');\n  const $countries= document.getElementById('ziCountries');\n  const $refine   = document.getElementById('ziRefine');\n  const $meta     = document.getElementById('ziMeta');\n  const $count    = document.getElementById('ziCount');\n  const $clear    = document.getElementById('ziClear');\n  const $sort     = document.getElementById('ziSort');\n  const $pagination = document.getElementById('ziPagination');\n  const $overlay  = document.getElementById('ziOverlay');\n  const $modalBody= document.getElementById('ziModalBody');\n  const $enqOvl   = document.getElementById('ziEnqOverlay');\n  const $enqBody  = document.getElementById('ziEnqBody');\n\n  \/* \u2500\u2500 Fetch (paginate defensively so no abroad listing is missed) \u2500\u2500 *\/\n  async function fetchAll() {\n    var out = [], page = 1, LIMIT = 100, SAFETY = 6;\n    while (page <= SAFETY) {\n      var res = await fetch(PROXY + '?action=listings&page=' + page + '&limit=' + LIMIT);\n      if (!res.ok) throw new Error('HTTP ' + res.status);\n      var data = await res.json();\n      var batch = data.data || [];\n      out = out.concat(batch);\n      if (batch.length < LIMIT) break;\n      page++;\n    }\n    return out;\n  }\n\n  async function init() {\n    try {\n      var feed = await fetchAll();\n      all = feed.filter(isIntl).map(localizeEN);\n      buildCountries();\n      if (!all.length) { renderEmptyPage(); return; }\n      buildRefine();\n      $sort.addEventListener('change', function(){ sortBy = this.value; applyFilters(); });\n      $clear.addEventListener('click', clearAll);\n      applyFilters();\n    } catch (e) {\n      $state.innerHTML = '<div class=\"zi-error\">Could not load listings. (' + esc(e.message) + ')<\/div>';\n      $countries.style.display = 'none';\n    }\n  }\n\n  function renderEmptyPage() {\n    $countries.style.display = 'none';\n    $state.innerHTML =\n      '<div class=\"zi-empty\">' +\n        '<div class=\"zi-empty-t\">No international listings just now<\/div>' +\n        '<p class=\"zi-empty-p\">New holiday homes abroad are added as my partners bring them to market. Tell me what you\\'re looking for and I\\'ll come back the moment something fits.<\/p>' +\n        '<a class=\"zi-empty-cta\" href=\"https:\/\/cal.eu\/zeasimmo\/quick-introduction\">' + si('mail','14') + ' Tell me what you\\'re after<\/a>' +\n      '<\/div>';\n  }\n\n  \/* \u2500\u2500 Country selector (hero) \u2500\u2500 *\/\n  function buildCountries() {\n    var counts = {};\n    all.forEach(function(l){ var c = countryOf(l); counts[c] = (counts[c]||0)+1; });\n    var countries = Object.keys(counts)\n      .filter(function(c){ return c && c !== 'International'; })\n      .sort(function(a,b){ return a.localeCompare(b); });\n\n    if (!all.length) { $countries.style.display = 'none'; return; }\n\n    var html = '<button class=\"zi-country active\" data-c=\"all\"><span>All destinations<\/span> <span class=\"zi-c-count\">' + all.length + '<\/span><\/button>';\n    html += countries.map(function(c){\n      return '<button class=\"zi-country\" data-c=\"' + esc(c) + '\">' + flagImg(c) + '<span>' + esc(c) + '<\/span> <span class=\"zi-c-count\">' + counts[c] + '<\/span><\/button>';\n    }).join('');\n    $countries.innerHTML = html;\n\n    $countries.querySelectorAll('.zi-country').forEach(function(btn){\n      btn.addEventListener('click', function(){\n        $countries.querySelectorAll('.zi-country').forEach(function(b){ b.classList.remove('active'); });\n        btn.classList.add('active');\n        activeCountry = btn.getAttribute('data-c');\n        applyFilters();\n      });\n    });\n  }\n\n  \/* \u2500\u2500 Price band helpers (data-derived, \"nice\"-rounded) \u2500\u2500 *\/\n  function fmtK(v) {\n    if (v >= 1000000) { var m = v \/ 1000000; return '\u20ac' + (m % 1 ? m.toFixed(1).replace(\/\\.0$\/, '') : m) + 'M'; }\n    return '\u20ac' + Math.round(v \/ 1000) + 'k';\n  }\n  function niceRound(v) {\n    var step = v >= 2000000 ? 250000 : v >= 1000000 ? 100000 : v >= 500000 ? 50000 : v >= 100000 ? 25000 : 10000;\n    return Math.round(v \/ step) * step;\n  }\n  function buildPriceBands(prices) {\n    var lo = Math.min.apply(null, prices), hi = Math.max.apply(null, prices);\n    if (hi <= lo) return [];\n    var cuts = [];\n    [1\/3, 2\/3].forEach(function(f){\n      var c = niceRound(lo + (hi - lo) * f);\n      if (c > lo && c < hi && cuts.indexOf(c) < 0) cuts.push(c);\n    });\n    cuts.sort(function(a,b){ return a - b; });\n    if (!cuts.length) { var mid = niceRound((lo + hi) \/ 2); if (mid > lo && mid < hi) cuts = [mid]; }\n    if (!cuts.length) return [];\n    var bands = [];\n    bands.push({ label: 'Under ' + fmtK(cuts[0]), lo: 0, hi: cuts[0] });\n    for (var i = 0; i < cuts.length - 1; i++) bands.push({ label: fmtK(cuts[i]) + ' \u2013 ' + fmtK(cuts[i+1]), lo: cuts[i], hi: cuts[i+1] });\n    bands.push({ label: fmtK(cuts[cuts.length-1]) + ' or more', lo: cuts[cuts.length-1], hi: Infinity });\n    bands = bands.filter(function(b){ return prices.some(function(p){ return p >= b.lo && (b.hi === Infinity ? true : p < b.hi); }); });\n    return bands.length >= 2 ? bands : [];\n  }\n  function setPriceBand(v) {\n    activePriceBand = v;\n    if (v === 'any') { priceMin = 0; priceMax = Infinity; return; }\n    var b = PRICE_BANDS[+v];\n    priceMin = b ? b.lo : 0;\n    priceMax = b ? b.hi : Infinity;\n  }\n\n  \/* \u2500\u2500 Secondary filters \u2014 one quiet row of matching dropdowns.\n        Each renders only when it has more than one real option. \u2500\u2500 *\/\n  function buildRefine() {\n    var blocks = [];\n\n    \/\/ Transaction \u2014 only if a mix of sale\/rent exists\n    var hasSale = all.some(function(l){ return l.listing_type !== '2'; });\n    var hasRent = all.some(function(l){ return l.listing_type === '2'; });\n    if (hasSale && hasRent) {\n      blocks.push(\n        '<select class=\"zi-select\" id=\"ziStatus\" aria-label=\"Transaction\">' +\n          '<option value=\"all\">For sale &amp; rent<\/option>' +\n          '<option value=\"1\">For sale<\/option>' +\n          '<option value=\"2\">For rent<\/option>' +\n        '<\/select>');\n    }\n\n    \/\/ Property type \u2014 only if more than one distinct type\n    var types = all.map(function(l){ return l.property_type; })\n      .filter(function(t,i,a){ return t && a.indexOf(t) === i; })\n      .sort(function(a,b){ return a.localeCompare(b); });\n    if (types.length > 1) {\n      blocks.push(\n        '<select class=\"zi-select\" id=\"ziType\" aria-label=\"Property type\">' +\n          '<option value=\"all\">All property types<\/option>' +\n          types.map(function(t){ return '<option value=\"' + esc(t) + '\">' + esc(t) + '<\/option>'; }).join('') +\n        '<\/select>');\n    }\n\n    \/\/ Bedrooms \u2014 only if any listing reports bedrooms\n    var maxBeds = Math.max.apply(null, all.map(function(l){ return +l.bedrooms || 0; }).concat([0]));\n    if (maxBeds >= 1) {\n      var bedOpts = [1,2,3,4,5].filter(function(n){ return n <= maxBeds; });\n      blocks.push(\n        '<select class=\"zi-select\" id=\"ziBeds\" aria-label=\"Bedrooms\">' +\n          '<option value=\"0\">Any bedrooms<\/option>' +\n          bedOpts.map(function(n){ return '<option value=\"' + n + '\">' + n + '+ bedrooms<\/option>'; }).join('') +\n        '<\/select>');\n    }\n\n    \/\/ Price \u2014 data-derived bands, only if they can be formed\n    var prices = all.map(function(l){ return +l.price; }).filter(function(p){ return p > 0; });\n    PRICE_LO = prices.length ? Math.min.apply(null, prices) : 0;\n    PRICE_HI = prices.length ? Math.max.apply(null, prices) : 0;\n    PRICE_BANDS = prices.length ? buildPriceBands(prices) : [];\n    priceMin = 0; priceMax = Infinity; activePriceBand = 'any';\n    if (PRICE_BANDS.length) {\n      blocks.push(\n        '<select class=\"zi-select\" id=\"ziPrice\" aria-label=\"Price\">' +\n          '<option value=\"any\">Any price<\/option>' +\n          PRICE_BANDS.map(function(b,i){ return '<option value=\"' + i + '\">' + esc(b.label) + '<\/option>'; }).join('') +\n        '<\/select>');\n    }\n\n    if (!blocks.length) { $refine.style.display = 'none'; return; }\n    $refine.innerHTML = blocks.join('');\n    $refine.style.display = 'flex';\n\n    var st = document.getElementById('ziStatus');\n    if (st) st.addEventListener('change', function(){ activeStatus = this.value; applyFilters(); });\n    var ty = document.getElementById('ziType');\n    if (ty) ty.addEventListener('change', function(){ activeType = this.value; applyFilters(); });\n    var bd = document.getElementById('ziBeds');\n    if (bd) bd.addEventListener('change', function(){ activeBeds = +this.value; applyFilters(); });\n    var pr = document.getElementById('ziPrice');\n    if (pr) pr.addEventListener('change', function(){ setPriceBand(this.value); applyFilters(); });\n  }\n\n  \/* \u2500\u2500 Filter + sort + render \u2500\u2500 *\/\n  function matchFilters(l) {\n    var p = +l.price || 0;\n    var beds = +l.bedrooms || 0;\n    return (activeCountry === 'all' || countryOf(l) === activeCountry) &&\n           (activeStatus  === 'all' || l.listing_type  === activeStatus) &&\n           (activeType    === 'all' || l.property_type === activeType) &&\n           (activeBeds    === 0     || beds >= activeBeds) &&\n           (!p || (p >= priceMin && (priceMax === Infinity || p < priceMax)));\n  }\n\n  function isFiltered() {\n    return activeCountry !== 'all' || activeStatus !== 'all' || activeType !== 'all' ||\n           activeBeds !== 0 || activePriceBand !== 'any';\n  }\n\n  function applyFilters() {\n    filtered = all.filter(matchFilters);\n    if (sortBy === 'price-asc')  filtered.sort(function(a,b){ return (+a.price||Infinity) - (+b.price||Infinity); });\n    if (sortBy === 'price-desc') filtered.sort(function(a,b){ return (+b.price||-1) - (+a.price||-1); });\n    currentPage = 1;\n    $clear.classList.toggle('show', isFiltered());\n    renderGrid();\n  }\n\n  function clearAll() {\n    activeCountry = 'all'; activeStatus = 'all'; activeType = 'all'; activeBeds = 0;\n    activePriceBand = 'any'; priceMin = 0; priceMax = Infinity; sortBy = 'featured';\n    $countries.querySelectorAll('.zi-country').forEach(function(b){ b.classList.toggle('active', b.dataset.c === 'all'); });\n    ['ziStatus','ziType','ziBeds','ziPrice'].forEach(function(id){ var el = document.getElementById(id); if (el) el.selectedIndex = 0; });\n    $sort.value = 'featured';\n    applyFilters();\n  }\n\n  function renderGrid() {\n    $state.innerHTML = '';\n    $pagination.innerHTML = '';\n\n    if (!filtered.length) {\n      $grid.style.display = 'none';\n      $meta.style.display = 'flex';\n      $count.innerHTML = 'No matches';\n      $state.innerHTML =\n        '<div class=\"zi-empty\">' +\n          '<div class=\"zi-empty-t\">Nothing matches those filters<\/div>' +\n          '<p class=\"zi-empty-p\">Try widening the price range or clearing a filter to see more destinations.<\/p>' +\n          '<button class=\"zi-empty-cta\" id=\"ziEmptyClear\" style=\"border:none\">Clear all filters<\/button>' +\n        '<\/div>';\n      var ec = document.getElementById('ziEmptyClear');\n      if (ec) ec.addEventListener('click', clearAll);\n      return;\n    }\n\n    var total = filtered.length;\n    var totalPages = Math.ceil(total \/ PAGE_SIZE);\n    currentPage = Math.min(currentPage, totalPages);\n    var start = (currentPage - 1) * PAGE_SIZE;\n    var end   = Math.min(start + PAGE_SIZE, total);\n    var pageItems = filtered.slice(start, end);\n\n    $meta.style.display = 'flex';\n    $count.innerHTML = 'Showing <strong>' + (start + 1) + '\u2013' + end + '<\/strong> of <strong>' + total + '<\/strong> ' + (total === 1 ? 'home' : 'homes');\n\n    $grid.innerHTML = pageItems.map(cardHTML).join('');\n    $grid.style.display = 'grid';\n    $grid.querySelectorAll('.icard').forEach(function(card, i){\n      card.addEventListener('click', function(){ openPropertyModal(pageItems[i]); });\n    });\n\n    renderPagination(totalPages);\n  }\n\n  \/* \u2500\u2500 Card \u2500\u2500 *\/\n  function cardHTML(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 specs = '';\n    if (l.bedrooms)    specs += '<span class=\"icard-spec\">' + si('bed','16')  + '<strong>' + l.bedrooms + '<\/strong>&nbsp;bed<\/span>';\n    if (l.bathrooms)   specs += '<span class=\"icard-spec\">' + si('bath','16') + '<strong>' + l.bathrooms + '<\/strong>&nbsp;bath<\/span>';\n    if (l.square_feet) specs += '<span class=\"icard-spec\">' + si('sqm','16')  + '<strong>' + Math.round(l.square_feet) + '<\/strong>&nbsp;m\u00b2<\/span>';\n\n    return '<article class=\"icard\">' +\n      '<div class=\"icard-img\">' +\n        (img ? '<img decoding=\"async\" src=\"' + esc(img) + '\" alt=\"' + esc(l.title) + '\" loading=\"lazy\">' : '') +\n        '<span class=\"excl-badge\">Exclusive<\/span>' +\n        '<span class=\"icard-country\">' + flagImg(country) + esc(country) + '<\/span>' +\n        (rental ? '<span class=\"icard-rent\">To rent<\/span>' : '') +\n      '<\/div>' +\n      '<div class=\"icard-body\">' +\n        '<div class=\"icard-price\">' + price + (rental ? ' <span class=\"pm\">\/ month<\/span>' : '') + '<\/div>' +\n        '<div class=\"icard-title\">' + esc(l.title) + '<\/div>' +\n        '<div class=\"icard-loc\">' + si('pin','15') + esc(l.city || l.address || country) + '<\/div>' +\n        (specs ? '<div class=\"icard-specs\">' + specs + '<\/div>' : '') +\n        '<div class=\"icard-enq\">' + si('mail','15') + 'Ask for details<\/div>' +\n      '<\/div>' +\n    '<\/article>';\n  }\n\n  \/* \u2500\u2500 Pagination \u2500\u2500 *\/\n  function renderPagination(totalPages) {\n    if (totalPages <= 1) { $pagination.innerHTML = ''; return; }\n    var pages = [];\n    for (var p = 1; p <= totalPages; p++) {\n      if (p === 1 || p === totalPages || (p >= currentPage - 1 && p <= currentPage + 1)) pages.push(p);\n    }\n    var items = [];\n    for (var j = 0; j < pages.length; j++) {\n      if (j > 0 && pages[j] - pages[j-1] > 1) items.push('\u2026');\n      items.push(pages[j]);\n    }\n    var html = '';\n    html += '<button class=\"zi-page-btn' + (currentPage === 1 ? ' disabled' : '') + '\" id=\"ziPgPrev\">' +\n      '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"\/><\/svg>&nbsp;Prev<\/button>';\n    items.forEach(function(item){\n      if (item === '\u2026') html += '<span class=\"zi-page-ellipsis\">\u2026<\/span>';\n      else html += '<button class=\"zi-page-btn' + (item === currentPage ? ' active' : '') + '\" data-page=\"' + item + '\">' + item + '<\/button>';\n    });\n    html += '<button class=\"zi-page-btn' + (currentPage === totalPages ? ' disabled' : '') + '\" id=\"ziPgNext\">' +\n      'Next&nbsp;<svg width=\"14\" height=\"14\" 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    $pagination.innerHTML = html;\n\n    $pagination.querySelectorAll('.zi-page-btn[data-page]').forEach(function(btn){\n      btn.addEventListener('click', function(){ goToPage(parseInt(btn.dataset.page, 10)); });\n    });\n    var prevBtn = document.getElementById('ziPgPrev');\n    var nextBtn = document.getElementById('ziPgNext');\n    if (prevBtn && !prevBtn.classList.contains('disabled')) prevBtn.addEventListener('click', function(){ goToPage(currentPage - 1); });\n    if (nextBtn && !nextBtn.classList.contains('disabled')) nextBtn.addEventListener('click', function(){ goToPage(currentPage + 1); });\n  }\n  function goToPage(p) {\n    currentPage = p; renderGrid();\n    var section = document.getElementById('ziapp');\n    if (section) {\n      var top = section.getBoundingClientRect().top + window.pageYOffset - 80;\n      window.scrollTo({ top: top, behavior: 'smooth' });\n    }\n  }\n\n  \/* \u2500\u2500 Property modal \u2500\u2500 *\/\n  function openPropertyModal(l) {\n    currentListing = 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('de-DE') + ' \u20ac' : 'Price on request';\n    var ec      = l.energy_efficiency_class;\n    var country = countryOf(l);\n\n    var specs = '';\n    if (l.bedrooms)        specs += '<div class=\"zi-modal-spec\">' + si('bed','16')  + '<strong>' + l.bedrooms + '<\/strong> bed' + (l.bedrooms > 1 ? 's' : '') + '<\/div>';\n    if (l.bathrooms)       specs += '<div class=\"zi-modal-spec\">' + si('bath','16') + '<strong>' + l.bathrooms + '<\/strong> bath' + (l.bathrooms > 1 ? 's' : '') + '<\/div>';\n    if (l.square_feet)     specs += '<div class=\"zi-modal-spec\">' + si('sqm','16')  + '<strong>' + Math.round(l.square_feet) + '<\/strong> m\u00b2<\/div>';\n    if (l.plot_size_sqm)   specs += '<div class=\"zi-modal-spec\">' + si('sqm','16')  + '<strong>' + Math.round(l.plot_size_sqm) + '<\/strong> m\u00b2 plot<\/div>';\n    if (l.total_rooms)     specs += '<div class=\"zi-modal-spec\">' + si('rooms','16')+ '<strong>' + l.total_rooms + '<\/strong> rooms<\/div>';\n    if (l.construction_year) specs += '<div class=\"zi-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(\/\\+\\d[\\d .\\-]{7,}\/g, '')\n      .replace(\/\\n{3,}\/g, '\\n\\n').trim();\n    var desc = rawDesc.substring(0, 950) + (rawDesc.length > 950 ? '\u2026' : '');\n\n    $modalBody.innerHTML =\n      '<div class=\"zi-modal-gallery' + (galImages.length > 1 ? ' has-multi' : '') + '\">' +\n        (galImages.length ? '<img decoding=\"async\" id=\"ziGalImg\" src=\"' + esc(galImages[0]) + '\" alt=\"' + esc(l.title) + '\">' : '') +\n        (galImages.length > 1\n          ? '<button class=\"zi-gal-btn zi-gal-prev\" id=\"ziGalPrev\" aria-label=\"Previous photo\">' + si('chevL','22') + '<\/button>' +\n            '<button class=\"zi-gal-btn zi-gal-next\" id=\"ziGalNext\" aria-label=\"Next photo\">' + si('chevR','22') + '<\/button>' +\n            '<span class=\"zi-gal-ctr\" id=\"ziGalCtr\">' + si('camera','13') + '1 \/ ' + galImages.length + '<\/span>'\n          : '') +\n      '<\/div>' +\n      '<div class=\"zi-modal-body\">' +\n        '<div class=\"zi-modal-top\">' +\n          '<div>' +\n            '<div class=\"zi-modal-title\">' + esc(l.title) + '<\/div>' +\n            '<div class=\"zi-modal-addr\">' + si('pin','13') + esc(l.address || l.city || country) + '<\/div>' +\n            '<p class=\"zi-listing-attr\">' + flagImg(country) + 'Exclusive Luxembourg point of contact \u00b7 handled end to end by Zeas<\/p>' +\n          '<\/div>' +\n          '<div style=\"text-align:right\">' +\n            '<div class=\"zi-modal-price\">' + price + (rental ? ' <span class=\"pm\">\/ month<\/span>' : '') + '<\/div>' +\n            (ec && ec.length <= 2 ? '<span class=\"zi-energy\" data-c=\"' + esc(ec) + '\">EPC ' + esc(ec) + '<\/span>' : '') +\n          '<\/div>' +\n        '<\/div>' +\n        (specs ? '<div class=\"zi-modal-specs\">' + specs + '<\/div>' : '') +\n        (desc  ? '<div class=\"zi-modal-desc\">'  + esc(desc)  + '<\/div>' : '') +\n        '<div class=\"zi-modal-footer\">' +\n          '<div class=\"zi-modal-footer-text\">Interested in this property?<span>I\\'ll arrange everything on your behalf \u2014 viewings, paperwork, negotiation.<\/span><\/div>' +\n          '<button class=\"zi-cta-btn\" id=\"ziModalEnqBtn\">' + si('mail','14') + ' Ask for details<\/button>' +\n        '<\/div>' +\n      '<\/div>';\n\n    if (galImages.length > 1) {\n      document.getElementById('ziGalPrev').addEventListener('click', function(){ galNav(-1); });\n      document.getElementById('ziGalNext').addEventListener('click', function(){ galNav(1); });\n    }\n    var gi = document.getElementById('ziGalImg');\n    if (gi) gi.addEventListener('click', function(){ openLB(galIdx); });\n    document.getElementById('ziModalEnqBtn').addEventListener('click', function(){ closePropertyModal(); openEnquiry(l); });\n\n    $overlay.classList.add('open');\n    document.body.style.overflow = 'hidden';\n  }\n  function galNav(dir) {\n    galIdx = (galIdx + dir + galImages.length) % galImages.length;\n    document.getElementById('ziGalImg').src = galImages[galIdx];\n    document.getElementById('ziGalCtr').innerHTML = si('camera','13') + (galIdx + 1) + ' \/ ' + galImages.length;\n  }\n  function closePropertyModal() { $overlay.classList.remove('open'); document.body.style.overflow = ''; }\n  document.getElementById('ziModalClose').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    currentListing = l;\n    var rental = l.listing_type === '2';\n    var country = countryOf(l);\n    var price  = l.price ? l.price.toLocaleString('de-DE') + ' \u20ac' + (rental ? ' \/ month' : '') : 'Price on request';\n    var ref    = l.source_id || l.id.substring(0, 8).toUpperCase();\n    var defaultMsg = 'Hello Adrian,\\n\\nI am interested in the following international property:\\n\\n' +\n      esc(l.title) + '\\n' +\n      esc([l.city || l.address, country].filter(Boolean).join(', ')) + '\\n' +\n      'Price: ' + price + '\\n' +\n      'Ref: ' + ref + '\\n\\n' +\n      'Could you please share more information and arrange a viewing? Thank you.';\n\n    $enqBody.innerHTML =\n      '<div class=\"zi-enq-prop-ref\">' +\n        '<strong>' + esc(l.title) + '<\/strong>' +\n        esc([l.city || l.address, country].filter(Boolean).join(', ')) + ' \u00b7 ' + price +\n      '<\/div>' +\n      '<h3 class=\"zi-enq-title\">Ask for details<\/h3>' +\n      '<p class=\"zi-enq-sub\">As your exclusive point of contact in Luxembourg, I\\'ll liaise with the local partner and come back to you within 24 hours.<\/p>' +\n      '<div id=\"ziEnqForm\">' +\n        '<div class=\"zi-enq-row\">' +\n          '<div><label class=\"zi-enq-label\">First name<\/label><input class=\"zi-enq-field\" id=\"ziEnqFirst\" type=\"text\" placeholder=\"Your first name\"><\/div>' +\n          '<div><label class=\"zi-enq-label\">Last name<\/label><input class=\"zi-enq-field\" id=\"ziEnqLast\" type=\"text\" placeholder=\"Your last name\"><\/div>' +\n        '<\/div>' +\n        '<label class=\"zi-enq-label\">Email<\/label>' +\n        '<input class=\"zi-enq-field\" id=\"ziEnqEmail\" type=\"email\" placeholder=\"your@email.com\">' +\n        '<label class=\"zi-enq-label\">Phone (optional)<\/label>' +\n        '<input class=\"zi-enq-field\" id=\"ziEnqPhone\" type=\"tel\" placeholder=\"+352 ...\">' +\n        '<label class=\"zi-enq-label\">Message<\/label>' +\n        '<textarea class=\"zi-enq-field zi-enq-textarea\" id=\"ziEnqMsg\">' + defaultMsg + '<\/textarea>' +\n        '<button class=\"zi-enq-submit\" id=\"ziEnqSend\">' + si('mail','15') + ' Send enquiry<\/button>' +\n        '<p class=\"zi-enq-note\">Your details are only used to respond to your enquiry. We never share them with third parties.<\/p>' +\n      '<\/div>';\n\n    document.getElementById('ziEnqSend').addEventListener('click', function(){\n      var first = document.getElementById('ziEnqFirst').value.trim();\n      var email = document.getElementById('ziEnqEmail').value.trim();\n      if (!first || !email) { alert('Please enter your first name and email address.'); return; }\n      submitEnquiry({\n        first: first, last: document.getElementById('ziEnqLast').value.trim(),\n        email: email, phone: document.getElementById('ziEnqPhone').value.trim(),\n        message: document.getElementById('ziEnqMsg').value.trim(),\n        ref: ref, listing: l.title,\n        address: [l.city || l.address, country].filter(Boolean).join(', '),\n        price: price\n      });\n    });\n\n    $enqOvl.classList.add('open');\n    document.body.style.overflow = 'hidden';\n  }\n\n  function submitEnquiry(data) {\n    var btn = document.getElementById('ziEnqSend');\n    btn.disabled = true; btn.textContent = 'Sending...';\n    var fd = new FormData();\n    fd.append('action',   'enquiry');\n    fd.append('name',     data.first + (data.last ? ' ' + data.last : ''));\n    fd.append('email',    data.email);\n    fd.append('phone',    data.phone || '');\n    fd.append('message',  data.message);\n    fd.append('property', data.listing || '');\n    fd.append('ref',      data.ref || '');\n    fd.append('price',    data.price || '');\n    fetch(PROXY, { method: 'POST', body: fd })\n      .then(function(r){ return r.json(); })\n      .then(function(res){\n        if (res.success) showEnquirySuccess();\n        else { btn.disabled = false; btn.textContent = 'Send enquiry'; alert(res.error || 'Something went wrong. Please email hello@zeas.immo directly.'); }\n      })\n      .catch(function(){ btn.disabled = false; btn.textContent = 'Send enquiry'; alert('Something went wrong. Please email hello@zeas.immo directly.'); });\n  }\n\n  function showEnquirySuccess() {\n    $enqBody.innerHTML =\n      '<div class=\"zi-enq-success\">' +\n        '<div class=\"zi-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>Thanks \u2014 I\\'ll be in touch within 24 hours to talk you through next steps.<\/p>' +\n      '<\/div>';\n  }\n  function closeEnquiry() { $enqOvl.classList.remove('open'); document.body.style.overflow = ''; }\n  document.getElementById('ziEnqClose').addEventListener('click', closeEnquiry);\n  $enqOvl.addEventListener('click', function(e){ if (e.target === $enqOvl) closeEnquiry(); });\n\n  \/* \u2500\u2500 Lightbox \u2500\u2500 *\/\n  var $lb = document.getElementById('ziLightbox');\n  var $lbImg = document.getElementById('ziLbImg');\n  var $lbCtr = document.getElementById('ziLbCtr');\n  var lbIdx = 0;\n  function openLB(idx) { lbIdx = idx; $lbImg.src = galImages[lbIdx]; $lbCtr.textContent = (lbIdx+1) + ' \/ ' + galImages.length; $lb.classList.add('open'); }\n  function lbNav(d) { lbIdx = (lbIdx + d + galImages.length) % galImages.length; $lbImg.src = galImages[lbIdx]; $lbCtr.textContent = (lbIdx+1) + ' \/ ' + galImages.length; }\n  function closeLB() { $lb.classList.remove('open'); }\n  document.getElementById('ziLbClose').addEventListener('click', closeLB);\n  document.getElementById('ziLbPrev').addEventListener('click', function(){ lbNav(-1); });\n  document.getElementById('ziLbNext').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(); }\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  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  init();\n})();\n<\/script>\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>International \u00b7 Exclusive in Luxembourg Holiday homes abroad, arranged from Luxembourg A place in the sun, sourced and vetted by the agent you already trust here. Through my international partnerships, I&#8217;m your exclusive point of contact in Luxembourg for these properties \u2014 handled end to end, in your language, from your Luxembourg coach. Clear all [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-50903","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/pages\/50903","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/comments?post=50903"}],"version-history":[{"count":4,"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/pages\/50903\/revisions"}],"predecessor-version":[{"id":50921,"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/pages\/50903\/revisions\/50921"}],"wp:attachment":[{"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/media?parent=50903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}