{"id":31005,"date":"2025-12-18T21:19:13","date_gmt":"2025-12-18T21:19:13","guid":{"rendered":"https:\/\/zeas.immo\/?page_id=31005"},"modified":"2026-04-22T18:00:22","modified_gmt":"2026-04-22T18:00:22","slug":"buying-cost-calculator-luxembourg","status":"publish","type":"page","link":"https:\/\/zeas.immo\/en\/buying-cost-calculator-luxembourg\/","title":{"rendered":"Buying cost calculator Luxembourg"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"31005\" class=\"elementor elementor-31005\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-92978d6 e-flex e-con-boxed e-con e-parent\" data-id=\"92978d6\" 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-ffb86ba elementor-widget elementor-widget-html\" data-id=\"ffb86ba\" 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>Buying Cost Calculator Luxembourg \u2014 zeas.immo<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Poppins:wght@300;400;500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\n:root {\n  --orange: #FF5C0B;\n  --orange-hover: #e54f00;\n  --orange-light: rgba(255,92,11,0.07);\n  --orange-ring: rgba(255,92,11,0.15);\n  --dark: #111110;\n  --cream: #faf9f7;\n  --border: #E4E0DA;\n  --label: #555552;\n  --muted: #999895;\n  --body: #2A2A28;\n  --white: #ffffff;\n  --error: #e5320a;\n  --success: #1a7a42;\n  --max-w: 1203px;\n  --page-pad: 60px;\n  --font: 'Poppins', sans-serif;\n}\n@media(max-width:960px){:root{--page-pad:32px;}}\n@media(max-width:600px){:root{--page-pad:20px;}}\n\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;}\nhtml{font-size:16px;-webkit-font-smoothing:antialiased;}\nbody{font-family:var(--font);background:var(--cream);color:var(--body);line-height:1.5;min-height:100vh;}\n\n\/* PAGE HEADER \u2014 cream *\/\n.page-header{text-align:center;padding:44px var(--page-pad) 32px;border-bottom:1px solid var(--border);background:var(--cream);}\n.brand-label{font-size:11px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:14px;}\n.brand-label span{color:var(--orange);}\n.page-header h1{font-size:clamp(20px,2.8vw,29px);font-weight:700;color:var(--dark);letter-spacing:-.02em;line-height:1.2;margin-bottom:10px;}\n.page-header p{font-size:14px;font-weight:300;color:var(--muted);max-width:520px;margin:0 auto;line-height:1.65;}\n\n\/* WRAPPER *\/\n.calc-wrap{max-width:var(--max-w);margin:0 auto;padding:36px var(--page-pad) 60px;}\n\n\/* STEP BAR *\/\n.step-bar{display:flex;align-items:center;margin-bottom:32px;}\n.step-item{display:flex;flex-direction:column;align-items:center;gap:5px;flex:1;position:relative;}\n.step-item:not(:last-child)::after{content:'';position:absolute;top:12px;left:calc(50% + 12px);right:calc(-50% + 12px);height:1px;background:var(--border);transition:background .3s;}\n.step-item.done:not(:last-child)::after{background:var(--orange);}\n.step-dot{width:24px;height:24px;border-radius:50%;border:2px solid var(--border);background:var(--cream);display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;color:var(--muted);transition:all .3s;position:relative;z-index:1;}\n.step-item.active .step-dot{border-color:var(--orange);color:var(--orange);background:var(--white);}\n.step-item.done .step-dot{background:var(--orange);border-color:var(--orange);color:var(--white);}\n.step-lbl{font-size:9px;font-weight:500;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);text-align:center;line-height:1.2;transition:color .3s;}\n.step-item.active .step-lbl,.step-item.done .step-lbl{color:var(--dark);}\n\n\/* CARD *\/\n.card{background:var(--white);border:1px solid var(--border);padding:28px;margin-bottom:14px;}\n.card-hd{margin-bottom:22px;padding-bottom:16px;border-bottom:1px solid var(--border);text-align:center;}\n.card-hd h2{font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--dark);margin-bottom:4px;}\n.card-hd p{font-size:13px;font-weight:300;color:var(--muted);line-height:1.5;}\n\n\/* FIELD ROWS *\/\n.row{display:grid;gap:16px;margin-bottom:22px;}\n.row.c2{grid-template-columns:1fr 1fr;}\n.row.c3{grid-template-columns:1fr 1fr 1fr;}\n.row:last-child{margin-bottom:0;}\n\n\/* FIELD *\/\n.f{display:flex;flex-direction:column;gap:6px;}\n.f label{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--label);display:flex;align-items:center;gap:5px;}\n\n\/* TOOLTIP *\/\n.tip{position:relative;display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:var(--border);color:var(--muted);font-size:9px;font-weight:700;cursor:help;flex-shrink:0;font-style:normal;}\n.tip::before{content:attr(data-t);position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);background:var(--dark);color:var(--white);font-size:11px;font-weight:300;letter-spacing:0;text-transform:none;padding:7px 11px;width:220px;line-height:1.45;z-index:300;pointer-events:none;opacity:0;transition:opacity .15s;border-radius:2px;}\n.tip::after{content:'';position:absolute;bottom:calc(100% + 2px);left:50%;transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--dark);opacity:0;transition:opacity .15s;}\n.tip:hover::before,.tip:hover::after{opacity:1;}\n\n\/* INPUT *\/\n.inp{font-family:var(--font);font-size:14px;font-weight:300;color:var(--dark);background:var(--white);border:1px solid var(--border);padding:10px 12px;width:100%;outline:none;transition:border-color .15s,box-shadow .15s;-webkit-appearance:none;appearance:none;border-radius:0;}\n.inp:focus{border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-ring);}\n.inp.ro{background:var(--cream);font-weight:500;cursor:default;-webkit-text-fill-color:var(--dark);}\n.iw{position:relative;}\n.iw .pre{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:13px;color:var(--muted);pointer-events:none;}\n.iw .suf{position:absolute;right:12px;top:50%;transform:translateY(-50%);font-size:12px;color:var(--muted);pointer-events:none;}\n.iw .inp{padding-left:22px;}\n.iw .inp.rs{padding-right:32px;}\n.ferr{font-size:11px;color:var(--error);display:none;}\n.ferr.on{display:block;}\n\n\/* RADIO *\/\n.rg{display:flex;gap:6px;flex-wrap:wrap;}\n.rb{flex:1;}\n.rb input[type=radio]{position:absolute;opacity:0;pointer-events:none;width:0;height:0;}\n.rb label{display:flex;align-items:center;justify-content:center;text-align:center;padding:9px 10px;border:1px solid var(--border);background:var(--white);font-family:var(--font);font-size:12px;font-weight:300;color:var(--body);cursor:pointer;transition:border-color .15s,color .15s;line-height:1.3;min-height:38px;user-select:none;}\n.rb label:hover{border-color:var(--orange);color:var(--orange);}\n.rb input[type=radio]:checked+label{border-color:var(--orange);color:var(--orange);font-weight:500;}\n\n\/* SELECT *\/\n.sel{font-family:var(--font);font-size:14px;font-weight:300;color:var(--dark);background:var(--white);border:1px solid var(--border);padding:10px 36px 10px 12px;width:100%;outline:none;-webkit-appearance:none;appearance:none;border-radius:0;cursor:pointer;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' fill='none'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999895' stroke-width='1.5' stroke-linecap='round'\/%3E%3C\/svg%3E\");background-repeat:no-repeat;background-position:right 12px center;}\n.sel:focus{border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-ring);}\n\n\/* SLIDER *\/\n.sl-wrap{display:flex;flex-direction:column;gap:5px;}\n.sl-row{display:flex;align-items:center;gap:8px;}\n.sl-val{font-size:13px;font-weight:600;color:var(--dark);min-width:38px;text-align:right;white-space:nowrap;}\ninput[type=range]{-webkit-appearance:none;appearance:none;flex:1;height:4px;background:var(--border);outline:none;border-radius:2px;cursor:pointer;}\ninput[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;background:var(--orange);border-radius:50%;cursor:pointer;border:2px solid var(--white);box-shadow:0 0 0 1px var(--orange);}\ninput[type=range]::-moz-range-thumb{width:16px;height:16px;background:var(--orange);border-radius:50%;cursor:pointer;border:2px solid var(--white);}\n.sl-labels{display:flex;justify-content:space-between;font-size:10px;color:var(--muted);}\n\n\/* VALUE PILLS *\/\n.val-pills{display:flex;flex-direction:column;gap:5px;}\n.vp{display:flex;justify-content:space-between;align-items:center;padding:7px 10px;font-size:12px;}\n.vp.n{background:var(--cream);border:1px solid var(--border);}\n.vp.n .vl{color:var(--muted);}\n.vp.n .vv{font-weight:600;color:var(--dark);}\n.vp.o{background:var(--orange-light);border:1px solid rgba(255,92,11,.2);}\n.vp.o .vl{color:var(--orange);font-weight:500;}\n.vp.o .vv{font-weight:700;color:var(--orange);}\n\n\/* CHECKBOX *\/\n.cb{display:flex;align-items:flex-start;gap:9px;}\n.cb input[type=checkbox]{appearance:none;-webkit-appearance:none;width:17px;height:17px;min-width:17px;border:1.5px solid var(--border);background:var(--white);cursor:pointer;margin-top:2px;flex-shrink:0;transition:background .15s,border-color .15s;border-radius:0;}\n.cb input[type=checkbox]:checked{background:var(--orange);border-color:var(--orange);}\n.cb input[type=checkbox]:checked::after{content:'';display:block;width:100%;height:100%;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 12 12' fill='none'%3E%3Cpolyline points='2,6 5,9 10,3' stroke='%23fff' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'\/%3E%3C\/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:10px;}\n.cb label{font-size:13px;font-weight:300;color:var(--body);cursor:pointer;line-height:1.6;}\n\n\/* NOTICE *\/\n.notice{padding:10px 13px;background:var(--orange-light);border-left:3px solid var(--orange);font-size:12px;font-weight:300;color:var(--body);line-height:1.5;}\n.notice strong{font-weight:500;}\n\n\/* COND *\/\n.cond{display:none;}\n.cond.on{display:block;}\n\n\/* DIVIDER *\/\nhr.div{border:none;border-top:1px solid var(--border);margin:20px 0;}\n\n\/* PREVIEW ROWS *\/\n.prev-card{background:var(--white);border:1px solid var(--border);padding:22px;margin-bottom:14px;}\n.prev-title{font-size:10px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:var(--orange);margin-bottom:14px;}\n.pr{display:flex;justify-content:space-between;align-items:center;padding:9px 0;border-bottom:1px solid var(--border);font-size:13px;}\n.pr:last-child{border-bottom:none;}\n.pr .pl{font-weight:300;color:var(--body);}\n.pr .pv{font-weight:500;color:var(--dark);}\n.pr.hi .pl{font-weight:500;color:var(--dark);}\n.pr.hi .pv{color:var(--orange);font-size:16px;font-weight:700;}\n\n\/* GATE *\/\n.gate{position:relative;margin-bottom:14px;}\n.gate-blur{filter:blur(5px);user-select:none;pointer-events:none;}\n.gate-ov{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:rgba(250,249,247,.7);gap:10px;}\n.gate-ov p{font-size:13px;font-weight:400;color:var(--dark);text-align:center;line-height:1.5;}\n\n\/* RESULTS *\/\n.rr{display:flex;justify-content:space-between;align-items:flex-start;padding:10px 0;border-bottom:1px solid var(--border);font-size:13px;gap:12px;}\n.rr:last-child{border-bottom:none;}\n.rl{font-weight:300;color:var(--body);flex:1;}\n.rl small{display:block;font-size:11px;color:var(--muted);margin-top:2px;}\n.rv{font-weight:500;color:var(--dark);white-space:nowrap;}\n.rr.sub{background:var(--cream);padding:10px 12px;margin:3px 0;}\n.rr.sub .rl{font-weight:500;}\n.rr.tot{background:var(--cream);border:1px solid var(--border);padding:16px 14px;margin-top:10px;}\n.rr.tot .rl{color:var(--dark);font-weight:600;font-size:14px;}\n.rr.tot .rv{color:var(--orange);font-size:20px;font-weight:700;}\n.rr.credit .rv{color:var(--success);}\n\n\/* STEP PANEL *\/\n.sp{display:none;}\n.sp.active{display:block;}\n\n\/* ACCORDION *\/\n.acc{margin:5px 0;}\n.acc-t{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 0;background:none;border:none;border-bottom:1px solid var(--border);cursor:pointer;font-family:var(--font);font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--dark);text-align:left;}\n.acc-ic{width:18px;height:18px;border:1px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--muted);flex-shrink:0;transition:transform .2s;}\n.acc-t.open .acc-ic{transform:rotate(45deg);}\n.acc-b{display:none;padding:4px 0 6px;}\n.acc-b.open{display:block;}\n\n\/* BUTTONS *\/\n.btn{font-family:var(--font);font-size:13px;font-weight:500;letter-spacing:.03em;padding:13px 32px;cursor:pointer;border:none;transition:all .15s;display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:0;}\n.btn-p{background:var(--orange);color:var(--white);}\n.btn-p:hover{background:var(--orange-hover);}\n.btn-s{background:transparent;color:var(--orange);border:1px solid var(--orange);}\n.btn-s:hover{background:var(--orange);color:var(--white);}\n.btn-full{width:100%;}\n.btn-row{display:flex;gap:10px;flex-wrap:wrap;margin-top:20px;}\n.btn-row .btn-s{flex-shrink:0;}\n.btn-row .btn-p{flex:1;}\n\n\/* CTA \u2014 cream *\/\n.cta-box{background:var(--cream);border:1px solid var(--border);padding:28px;margin-top:16px;text-align:center;}\n.cta-box h3{font-size:16px;font-weight:700;color:var(--dark);margin-bottom:6px;letter-spacing:-.01em;}\n.cta-box p{font-size:13px;font-weight:300;color:var(--muted);margin-bottom:20px;line-height:1.6;}\n.cta-acts{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;}\n.cp{font-family:var(--font);font-size:12px;font-weight:500;padding:11px 22px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;letter-spacing:.02em;border-radius:0;transition:all .15s;}\n.cp.pri{background:var(--orange);color:var(--white);border:1px solid var(--orange);}\n.cp.pri:hover{background:var(--orange-hover);border-color:var(--orange-hover);}\n.cp.out{background:var(--white);color:var(--dark);border:1px solid var(--border);}\n.cp.out:hover{border-color:var(--orange);color:var(--orange);}\n\n\/* MORTGAGE TEASER *\/\n.mort-box{background:var(--white);border:1px solid var(--border);padding:18px 22px;margin-top:14px;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;}\n.mort-box .mt-txt h4{font-size:13px;font-weight:600;color:var(--dark);margin-bottom:2px;}\n.mort-box .mt-txt p{font-size:12px;font-weight:300;color:var(--muted);}\n\n\/* EXPLAINER SECTION *\/\n.explainer{max-width:var(--max-w);margin:0 auto;padding:40px var(--page-pad) 60px;border-top:1px solid var(--border);}\n.explainer h2{font-size:16px;font-weight:700;color:var(--dark);margin-bottom:20px;letter-spacing:-.01em;}\n.explainer p{font-size:14px;font-weight:300;color:var(--body);line-height:1.8;margin-bottom:14px;}\n.explainer p:last-child{margin-bottom:0;}\n.explainer strong{font-weight:500;color:var(--dark);}\n.explainer a{color:var(--orange);text-decoration:none;}\n.explainer a:hover{text-decoration:underline;}\n.explainer .disc-note{font-size:12px;color:var(--muted);font-style:italic;line-height:1.6;padding-top:14px;border-top:1px solid var(--border);margin-top:20px;}\n\n\/* PRINT STYLES *\/\n@media print {\n  .step-bar,.btn,.btn-row,.cta-box,.mort-box,.gate-ov,.explainer,\n  .sp:not(.active){ display:none !important; }\n  body{ background:white; }\n  .card,.prev-card{ border:1px solid #ddd; page-break-inside:avoid; }\n  .page-header{ background:white !important; }\n}\n\n\/* RESP *\/\n@media(max-width:880px){\n  .row.c3{grid-template-columns:1fr 1fr;}\n}\n@media(max-width:580px){\n  .calc-wrap,.explainer{padding-left:var(--page-pad);padding-right:var(--page-pad);}\n  .card{padding:18px;}\n  .row.c2,.row.c3{grid-template-columns:1fr;}\n  .rg{flex-direction:column;}\n  .rb{flex:none;width:100%;}\n  .step-lbl{display:none;}\n  .cta-acts{flex-direction:column;}\n  .mort-box{flex-direction:column;text-align:center;}\n}\n\n\/* ============================================================\n   MORTGAGE CALCULATOR\n============================================================ *\/\n#mortgageCalc{display:none;margin-top:0;}\n#mortgageCalc.visible{display:block;}\n\n.mort-section-title{font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--dark);margin-bottom:14px;padding-bottom:10px;border-bottom:1px solid var(--border);}\n\n\/* Summary bar *\/\n.mort-summary{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1px;background:var(--border);border:1px solid var(--border);margin-bottom:14px;}\n.mort-sum-cell{background:var(--white);padding:16px 14px;text-align:center;}\n.mort-sum-cell .msc-label{font-size:10px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);margin-bottom:4px;}\n.mort-sum-cell .msc-value{font-size:20px;font-weight:700;color:var(--dark);}\n.mort-sum-cell .msc-value.orange{color:var(--orange);}\n.mort-sum-cell .msc-sub{font-size:11px;font-weight:300;color:var(--muted);margin-top:2px;}\n\n\/* Amortisation table *\/\n.mort-table{width:100%;border-collapse:collapse;font-size:12px;}\n.mort-table th{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);padding:8px 10px;border-bottom:2px solid var(--border);text-align:right;}\n.mort-table th:first-child{text-align:left;}\n.mort-table td{padding:8px 10px;border-bottom:1px solid var(--border);color:var(--body);text-align:right;font-weight:300;}\n.mort-table td:first-child{text-align:left;font-weight:500;color:var(--dark);}\n.mort-table tr:last-child td{border-bottom:none;}\n.mort-table tr:nth-child(even) td{background:var(--cream);}\n.mort-table .equity-pos{color:var(--success);font-weight:500;}\n\n\/* Chart bar *\/\n.mort-bar-wrap{display:flex;height:24px;border-radius:2px;overflow:hidden;margin-bottom:6px;}\n.mort-bar-interest{background:#E4E0DA;transition:width .4s;}\n.mort-bar-principal{background:var(--orange);transition:width .4s;}\n.mort-bar-legend{display:flex;gap:16px;font-size:11px;color:var(--muted);}\n.mort-bar-legend span{display:flex;align-items:center;gap:5px;}\n.mort-bar-legend .dot{width:10px;height:10px;border-radius:2px;flex-shrink:0;}\n.dot-interest{background:#E4E0DA;}\n.dot-principal{background:var(--orange);}\n.dot-charges{background:#c8c4be;}\n\n\/* Show more button *\/\n.btn-show-more{font-family:var(--font);font-size:12px;font-weight:500;color:var(--orange);background:none;border:1px solid var(--border);padding:8px 20px;cursor:pointer;width:100%;margin-top:8px;transition:border-color .15s;}\n.btn-show-more:hover{border-color:var(--orange);}\n\n\/* Equity accordion content *\/\n.equity-note{font-size:11px;font-weight:300;color:var(--muted);font-style:italic;line-height:1.5;padding:10px 0;}\n\n@media(max-width:580px){\n  .mort-summary{grid-template-columns:1fr;}\n  .mort-table{font-size:11px;}\n  .mort-table th,.mort-table td{padding:6px 7px;}\n}\n<\/style>\n<\/head>\n<body>\n\n<!-- PAGE HEADER (cream background) -->\n<header class=\"page-header\">\n  <div class=\"brand-label\">zeas<span>.<\/span>immo &nbsp;\u00b7&nbsp; Buyer's Agency Luxembourg<\/div>\n  <h1>Buying Cost Calculator Luxembourg<\/h1>\n  <p>Know your full acquisition budget before you make an offer. Registration duties, notary fees and VAT can add 8\u201313% on top of the asking price.<\/p>\n<\/header>\n\n<div class=\"calc-wrap\">\n\n  <!-- STEP BAR -->\n  <div class=\"step-bar\">\n    <div class=\"step-item active\" data-s=\"1\"><div class=\"step-dot\">1<\/div><div class=\"step-lbl\">Property Details<\/div><\/div>\n    <div class=\"step-item\" data-s=\"2\"><div class=\"step-dot\">2<\/div><div class=\"step-lbl\">Preview Taxes<\/div><\/div>\n    <div class=\"step-item\" data-s=\"3\"><div class=\"step-dot\">3<\/div><div class=\"step-lbl\">Your Details<\/div><\/div>\n    <div class=\"step-item\" data-s=\"4\"><div class=\"step-dot\">4<\/div><div class=\"step-lbl\">Full Breakdown<\/div><\/div>\n  <\/div>\n\n  <!-- ==================== STEP 1 ==================== -->\n  <div class=\"sp active\" id=\"step1\">\n    <div class=\"card\">\n      <div class=\"card-hd\">\n        <h2>Your Property Details<\/h2>\n        <p>Tell us about the property you're buying so we can calculate the exact taxes and fees.<\/p>\n      <\/div>\n\n      <div class=\"row c3\">\n        <div class=\"f\">\n          <label>Purchase Price (\u20ac) <i class=\"tip\" data-t=\"Total agreed price as stated in the sales agreement. For VEFA, include VAT if already embedded in the developer's price.\">?<\/i><\/label>\n          <div class=\"iw\">\n            <span class=\"pre\">\u20ac<\/span>\n            <input class=\"inp\" type=\"text\" id=\"purchasePrice\" placeholder=\"e.g. 650.000\" inputmode=\"numeric\">\n          <\/div>\n          <span class=\"ferr\" id=\"err_price\">Please enter the purchase price.<\/span>\n        <\/div>\n        <div class=\"f\">\n          <label>Property Type <i class=\"tip\" data-t=\"New build (VEFA) = under construction or first occupation. Existing = previously owned or completed \u2014 VAT does not apply.\">?<\/i><\/label>\n          <div class=\"rg\">\n            <div class=\"rb\"><input type=\"radio\" name=\"pType\" id=\"pt_new\" value=\"new\"><label for=\"pt_new\">New property<\/label><\/div>\n            <div class=\"rb\"><input type=\"radio\" name=\"pType\" id=\"pt_ex\" value=\"existing\" checked><label for=\"pt_ex\">Existing property<\/label><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"f\">\n          <label>Intended use <i class=\"tip\" data-t=\"Determines VAT rate and B\u00ebllegen Akt eligibility. Primary = your main and permanent residence for at least 2 years.\">?<\/i><\/label>\n          <div class=\"rg\" style=\"flex-direction:column;gap:5px;\">\n            <div class=\"rb\" style=\"flex:none;\"><input type=\"radio\" name=\"pUse\" id=\"pu_pri\" value=\"primary\" checked><label for=\"pu_pri\">Primary residence<\/label><\/div>\n            <div class=\"rb\" style=\"flex:none;\"><input type=\"radio\" name=\"pUse\" id=\"pu_sec\" value=\"secondary\"><label for=\"pu_sec\">2nd home \/ holiday property<\/label><\/div>\n            <div class=\"rb\" style=\"flex:none;\"><input type=\"radio\" name=\"pUse\" id=\"pu_res\" value=\"resale\"><label for=\"pu_res\">Buy-to-sell \/ investor resale<\/label><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"row c3\">\n        <div class=\"f\">\n          <label>First property in Luxembourg? <i class=\"tip\" data-t=\"First-time buyers receive the full B\u00ebllegen Akt credit automatically. Second-time buyers enter their remaining balance from a prior purchase.\">?<\/i><\/label>\n          <div class=\"rg\">\n            <div class=\"rb\"><input type=\"radio\" name=\"fBuyer\" id=\"fb_y\" value=\"yes\" checked><label for=\"fb_y\">Yes \u2014 first buy<\/label><\/div>\n            <div class=\"rb\"><input type=\"radio\" name=\"fBuyer\" id=\"fb_n\" value=\"no\"><label for=\"fb_n\">No \u2014 second buy<\/label><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"f\">\n          <label>Purchasing as <i class=\"tip\" data-t=\"Married partners and PACS (civil union) buying jointly receive \u20ac80.000 total B\u00ebllegen Akt credit \u2014 \u20ac40.000 per person.\">?<\/i><\/label>\n          <div class=\"rg\">\n            <div class=\"rb\"><input type=\"radio\" name=\"marital\" id=\"ms_s\" value=\"single\" checked><label for=\"ms_s\">Single buyer<\/label><\/div>\n            <div class=\"rb\"><input type=\"radio\" name=\"marital\" id=\"ms_c\" value=\"couple\"><label for=\"ms_c\">Couple \/ PACS<\/label><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"f\">\n          <label>Registration commune <i class=\"tip\" data-t=\"Luxembourg City applies a 50% surcharge on registration duty \u2014 equivalent to an additional 3% of the purchase price. All other communes do not.\">?<\/i><\/label>\n          <div class=\"rg\">\n            <div class=\"rb\"><input type=\"radio\" name=\"commune\" id=\"co_lux\" value=\"lux\"><label for=\"co_lux\">Lux City<\/label><\/div>\n            <div class=\"rb\"><input type=\"radio\" name=\"commune\" id=\"co_oth\" value=\"other\" checked><label for=\"co_oth\">Other commune<\/label><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- VEFA FIELDS -->\n      <div class=\"cond\" id=\"vefaFields\">\n        <hr class=\"div\">\n        <div style=\"text-align:center;margin-bottom:16px;\">\n          <p style=\"font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--dark);\">VEFA \u2014 Property Value Split<\/p>\n          <p style=\"font-size:12px;font-weight:300;color:var(--muted);margin-top:3px;\">Land and completed construction \u2192 registration\/transcription duties. Remaining construction \u2192 VAT.<\/p>\n        <\/div>\n        <div class=\"row c3\">\n          <div class=\"f\">\n            <label>Land share <i class=\"tip\" data-t=\"Typical land share is 25\u201335% of total VEFA price. Check your sales agreement for the exact split.\">?<\/i><\/label>\n            <select class=\"sel\" id=\"landPct\">\n              <option value=\"20\">20% of price<\/option>\n              <option value=\"25\">25% of price<\/option>\n              <option value=\"30\" selected>30% of price (typical)<\/option>\n              <option value=\"35\">35% of price<\/option>\n              <option value=\"40\">40% of price<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"f\">\n            <label>Construction completion <i class=\"tip\" data-t=\"Percentage of the building already built at signing. The remainder is 'to be built' and is the VAT base.\">?<\/i><\/label>\n            <div class=\"sl-wrap\">\n              <div class=\"sl-row\">\n                <input type=\"range\" id=\"constrPct\" min=\"10\" max=\"100\" value=\"50\" step=\"5\">\n                <span class=\"sl-val\" id=\"constrVal\">50%<\/span>\n              <\/div>\n              <div class=\"sl-labels\"><span>10%<\/span><span>100%<\/span><\/div>\n            <\/div>\n          <\/div>\n          <div class=\"f\">\n            <label>Calculated split <i class=\"tip\" data-t=\"Land and completed part \u2192 registration duty. To-be-built \u2192 VAT at 3% (primary) or 17% (other).\">?<\/i><\/label>\n            <div class=\"val-pills\">\n              <div class=\"vp n\"><span class=\"vl\">Land value<\/span><span class=\"vv\" id=\"cv_land\">\u20ac 0<\/span><\/div>\n              <div class=\"vp n\"><span class=\"vl\">Completed construction<\/span><span class=\"vv\" id=\"cv_compl\">\u20ac 0<\/span><\/div>\n              <div class=\"vp o\"><span class=\"vl\">To be built (VAT base)<\/span><span class=\"vv\" id=\"cv_build\">\u20ac 0<\/span><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div class=\"cond notice\" id=\"notePrimary\" style=\"margin-top:12px;\"><strong>3% super-reduced VAT applies<\/strong> to the first \u20ac357.143 of remaining construction (max saving \u20ac50.000). Any amount above that threshold is billed at the standard 17%.<\/div>\n        <div class=\"cond notice\" id=\"noteNonPrimary\" style=\"margin-top:12px;\"><strong>17% standard VAT applies<\/strong> to the entire remaining construction portion. The 3% super-reduced rate is reserved exclusively for primary residences.<\/div>\n      <\/div>\n\n      <!-- SECOND BUYER -->\n      <div class=\"cond\" id=\"secBuyerF\">\n        <hr class=\"div\">\n        <div class=\"f\" style=\"max-width:340px;\">\n          <label>Remaining B\u00ebllegen Akt credit <i class=\"tip\" data-t=\"Check your balance on MyGuichet.lu. Lifetime max: \u20ac40.000 per person \/ \u20ac80.000 per couple. Unused credit from a prior purchase carries forward.\">?<\/i><\/label>\n          <div class=\"iw\"><span class=\"pre\">\u20ac<\/span><input class=\"inp\" type=\"text\" id=\"remCredit\" placeholder=\"e.g. 25.000\" inputmode=\"numeric\"><\/div>\n        <\/div>\n      <\/div>\n\n      <!-- FEES -->\n      <hr class=\"div\">\n      <div class=\"row c3\">\n        <div class=\"f\">\n          <label>Agency? <i class=\"tip\" data-t=\"Buyer's agency fee: 3% + 17% VAT = 3.51% of purchase price. Covers property search, offer negotiation and full transaction guidance.\">?<\/i><\/label>\n          <div class=\"rg\">\n            <div class=\"rb\"><input type=\"radio\" name=\"agency\" id=\"ag_y\" value=\"yes\" checked><label for=\"ag_y\">Yes<\/label><\/div>\n            <div class=\"rb\"><input type=\"radio\" name=\"agency\" id=\"ag_n\" value=\"no\"><label for=\"ag_n\">No<\/label><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"f\">\n          <label>Expert valuation? <i class=\"tip\" data-t=\"Independent property valuation \u2014 fixed \u20ac1.000. Recommended when verifying the asking price or negotiating below it.\">?<\/i><\/label>\n          <div class=\"rg\">\n            <div class=\"rb\"><input type=\"radio\" name=\"expert\" id=\"ex_y\" value=\"yes\"><label for=\"ex_y\">Yes<\/label><\/div>\n            <div class=\"rb\"><input type=\"radio\" name=\"expert\" id=\"ex_n\" value=\"no\" checked><label for=\"ex_n\">No<\/label><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"f\">\n          <label>Notary fee rate <i class=\"tip\" data-t=\"Standard Luxembourg notary fee is ~1% of purchase price. You can adjust based on your notary's specific quote.\">?<\/i><\/label>\n          <div class=\"iw\"><input class=\"inp rs\" type=\"number\" id=\"notaryRate\" value=\"1\" min=\"0.5\" max=\"3\" step=\"0.1\"><span class=\"suf\">%<\/span><\/div>\n        <\/div>\n      <\/div>\n\n      <button class=\"btn btn-p btn-full\" style=\"margin-top:22px;\" id=\"btnS1\">Calculate State Taxes \u2192<\/button>\n    <\/div>\n  <\/div><!-- \/step1 -->\n\n  <!-- ==================== STEP 2 ==================== -->\n  <div class=\"sp\" id=\"step2\">\n    <div class=\"prev-card\">\n      <div class=\"prev-title\">State Taxes Preview<\/div>\n      <div class=\"prev-rows\">\n        <div class=\"pr\"><span class=\"pl\" id=\"s2_regLbl\">Registration duty (6%)<\/span><span class=\"pv\" id=\"s2_reg\">\u2014<\/span><\/div>\n        <div class=\"pr\" id=\"s2_resRow\" style=\"display:none;\"><span class=\"pl\">Resale surcharge (+1.2%)<\/span><span class=\"pv\" id=\"s2_res\">\u2014<\/span><\/div>\n        <div class=\"pr\"><span class=\"pl\">Transcription duty (1%)<\/span><span class=\"pv\" id=\"s2_trans\">\u2014<\/span><\/div>\n        <div class=\"pr\" id=\"s2_luxRow\" style=\"display:none;\">\n          <span class=\"pl\">Municipal surcharge \u2014 Luxembourg City <i class=\"tip\" data-t=\"Luxembourg City charges a 50% surcharge on registration duty, equivalent to an additional 3% of the purchase price.\">?<\/i><\/span>\n          <span class=\"pv\" id=\"s2_lux\">\u2014<\/span>\n        <\/div>\n        <div class=\"pr\" id=\"s2_vatRow\" style=\"display:none;\">\n          <span class=\"pl\">VAT on construction <i class=\"tip\" data-t=\"Applies to new properties only. 3% on first \u20ac357.143 of construction for primary residences; 17% on anything above or for non-primary use.\">?<\/i><\/span>\n          <span class=\"pv\" id=\"s2_vat\">\u2014<\/span>\n        <\/div>\n        <div class=\"pr hi\"><span class=\"pl\">Total state taxes <i class=\"tip\" data-t=\"Sum of registration duty, transcription duty, any municipal surcharge, and VAT. B\u00ebllegen Akt credit shown in the full breakdown.\">?<\/i><\/span><span class=\"pv\" id=\"s2_tot\">\u2014<\/span><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"gate\">\n      <div class=\"gate-blur\">\n        <div class=\"card\" style=\"padding:18px;\">\n          <div class=\"rr tot\" style=\"margin:0 0 8px;\"><span class=\"rl\">Final Acquisition Cost<\/span><span class=\"rv\">\u20ac \u2588\u2588\u2588\u2588\u2588\u2588<\/span><\/div>\n          <div class=\"rr credit\"><span class=\"rl\">B\u00ebllegen Akt Credit Applied<\/span><span class=\"rv\">\u2212 \u20ac \u2588\u2588\u2588\u2588\u2588<\/span><\/div>\n          <div class=\"rr sub\"><span class=\"rl\">Net State Taxes After Credit<\/span><span class=\"rv\">\u20ac \u2588\u2588\u2588\u2588\u2588<\/span><\/div>\n          <div class=\"rr\"><span class=\"rl\">Total Professional Fees<\/span><span class=\"rv\">\u20ac \u2588\u2588\u2588\u2588<\/span><\/div>\n        <\/div>\n      <\/div>\n      <div class=\"gate-ov\">\n        <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#FF5C0B\" stroke-width=\"1.5\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0110 0v4\"\/><\/svg>\n        <p><strong>Enter your contact details<\/strong><br>to unlock the full breakdown.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"btn-row\">\n      <button class=\"btn btn-s\" id=\"btnBackS1\">\u2190 Edit Details<\/button>\n      <button class=\"btn btn-p\" id=\"btnS2\">Unlock Full Breakdown \u2192<\/button>\n    <\/div>\n  <\/div><!-- \/step2 -->\n\n  <!-- ==================== STEP 3 ==================== -->\n  <div class=\"sp\" id=\"step3\">\n    <div class=\"card\">\n      <div class=\"card-hd\">\n        <h2>Receive Your Calculation<\/h2>\n        <p>Enter your details to unlock the full breakdown and receive it by email. Processed in compliance with EU GDPR.<\/p>\n      <\/div>\n      <div class=\"row c2\">\n        <div class=\"f\"><label>First Name<\/label><input class=\"inp\" type=\"text\" id=\"fName\" placeholder=\"First name\"><span class=\"ferr\" id=\"err_fn\">Required.<\/span><\/div>\n        <div class=\"f\"><label>Last Name<\/label><input class=\"inp\" type=\"text\" id=\"lName\" placeholder=\"Last name\"><span class=\"ferr\" id=\"err_ln\">Required.<\/span><\/div>\n        <div class=\"f\"><label>Email <i class=\"tip\" data-t=\"Your calculation summary will be sent to this address.\">?<\/i><\/label><input class=\"inp\" type=\"email\" id=\"uEmail\" placeholder=\"your@email.com\"><span class=\"ferr\" id=\"err_em\">Please enter a valid email.<\/span><\/div>\n        <div class=\"f\"><label>Phone \/ Mobile<\/label><input class=\"inp\" type=\"tel\" id=\"uPhone\" placeholder=\"+352 000 000 000\"><\/div>\n      <\/div>\n      <div class=\"cb\" style=\"margin-top:20px;\">\n        <input type=\"checkbox\" id=\"gdpr\">\n        <label for=\"gdpr\">I agree to store my information so zeas.immo can contact me with expert guidance on my property search.<\/label>\n      <\/div>\n      <span class=\"ferr\" id=\"err_gdpr\">Please accept to continue.<\/span>\n      <div class=\"btn-row\">\n        <button class=\"btn btn-s\" id=\"btnBackS2\">\u2190 Back<\/button>\n        <button class=\"btn btn-p\" id=\"btnS3\">Show Full Breakdown \u2192<\/button>\n      <\/div>\n    <\/div>\n  <\/div><!-- \/step3 -->\n\n  <!-- ==================== STEP 4 ==================== -->\n  <div class=\"sp\" id=\"step4\">\n\n    <div class=\"prev-card\">\n      <div class=\"prev-title\">Your Complete Acquisition Cost<\/div>\n      <div class=\"prev-rows\">\n        <div class=\"pr\"><span class=\"pl\">Purchase price<\/span><span class=\"pv\" id=\"r_price\">\u2014<\/span><\/div>\n        <div class=\"pr\"><span class=\"pl\">State taxes (after credit)<\/span><span class=\"pv\" id=\"r_taxNet\">\u2014<\/span><\/div>\n        <div class=\"pr\"><span class=\"pl\">Professional fees<\/span><span class=\"pv\" id=\"r_fees\">\u2014<\/span><\/div>\n        <div class=\"pr hi\"><span class=\"pl\">Total acquisition cost<\/span><span class=\"pv\" id=\"r_total\">\u2014<\/span><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"card-hd\"><h2 id=\"r_taxTitle\">State Taxes Breakdown<\/h2><p id=\"r_taxSub\"><\/p><\/div>\n      <div class=\"rr\"><span class=\"rl\">Registration duty<small id=\"r_regRateLbl\"><\/small><\/span><span class=\"rv\" id=\"r_reg\">\u2014<\/span><\/div>\n      <div class=\"rr\" id=\"r_resRow\" style=\"display:none;\"><span class=\"rl\">Resale surcharge<small>+1.2% \u2014 property purchased for buy-to-sell \/ investor resale<\/small><\/span><span class=\"rv\" id=\"r_res\">\u2014<\/span><\/div>\n      <div class=\"rr\"><span class=\"rl\">Transcription duty<small>1% of purchase price<\/small><\/span><span class=\"rv\" id=\"r_trans\">\u2014<\/span><\/div>\n      <div class=\"rr\" id=\"r_luxRow\" style=\"display:none;\"><span class=\"rl\">Municipal surcharge<small>50% of registration duty \u2014 Luxembourg City only (= 3% of purchase price)<\/small><\/span><span class=\"rv\" id=\"r_lux\">\u2014<\/span><\/div>\n      <div id=\"r_vatSec\" style=\"display:none;\">\n        <div class=\"acc\">\n          <button class=\"acc-t\" id=\"aVatT\">VAT on construction <span class=\"acc-ic\">+<\/span><\/button>\n          <div class=\"acc-b\" id=\"aVatB\">\n            <div class=\"rr\" id=\"r_vat3Row\" style=\"display:none;\"><span class=\"rl\">3% super-reduced VAT<small id=\"r_vat3Lbl\"><\/small><\/span><span class=\"rv\" id=\"r_vat3\">\u2014<\/span><\/div>\n            <div class=\"rr\" id=\"r_vat17Row\" style=\"display:none;\"><span class=\"rl\">17% standard VAT<small id=\"r_vat17Lbl\"><\/small><\/span><span class=\"rv\" id=\"r_vat17\">\u2014<\/span><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"rr sub\"><span class=\"rl\">Total VAT on construction<\/span><span class=\"rv\" id=\"r_vatTot\">\u2014<\/span><\/div>\n      <\/div>\n      <div class=\"rr sub\"><span class=\"rl\">Total state taxes (before credit)<\/span><span class=\"rv\" id=\"r_taxGross\">\u2014<\/span><\/div>\n      <div id=\"r_belSec\" style=\"display:none;\">\n        <div class=\"acc\">\n          <button class=\"acc-t\" id=\"aBelT\">B\u00ebllegen Akt Tax Credit <span class=\"acc-ic\">+<\/span><\/button>\n          <div class=\"acc-b\" id=\"aBelB\">\n            <div class=\"rr\"><span class=\"rl\">Eligible taxes<small>Registration + transcription duty only. VAT and municipal surcharge are not eligible.<\/small><\/span><span class=\"rv\" id=\"r_elig\">\u2014<\/span><\/div>\n            <div class=\"rr\"><span class=\"rl\">Credit available<small id=\"r_creditLbl\"><\/small><\/span><span class=\"rv\" id=\"r_creditAvail\">\u2014<\/span><\/div>\n            <div class=\"rr credit\"><span class=\"rl\">Credit applied<\/span><span class=\"rv\" id=\"r_creditApp\">\u2014<\/span><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"rr sub\"><span class=\"rl\">Net state taxes (after credit)<\/span><span class=\"rv\" id=\"r_taxNetCard\">\u2014<\/span><\/div>\n        <div class=\"notice cond\" id=\"r_creditNote\" style=\"margin-top:8px;\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"card-hd\"><h2>Professional Fees<\/h2><p>Estimated fees based on your inputs. Confirm exact amounts with your notary.<\/p><\/div>\n      <div class=\"acc\">\n        <button class=\"acc-t\" id=\"aFeesT\">Fees Breakdown <span class=\"acc-ic\">+<\/span><\/button>\n        <div class=\"acc-b\" id=\"aFeesB\">\n          <div class=\"rr\"><span class=\"rl\">Notary fees<small id=\"r_notaryLbl\"><\/small><\/span><span class=\"rv\" id=\"r_notary\">\u2014<\/span><\/div>\n          <div class=\"rr\" id=\"r_agRow\" style=\"display:none;\"><span class=\"rl\">Agency fees<small>3% + 17% VAT = 3.51% of purchase price<\/small><\/span><span class=\"rv\" id=\"r_agency\">\u2014<\/span><\/div>\n          <div class=\"rr\" id=\"r_expRow\" style=\"display:none;\"><span class=\"rl\">Expert valuation<small>Fixed fee \u2014 independent property assessment<\/small><\/span><span class=\"rv\">\u20ac 1.000<\/span><\/div>\n        <\/div>\n      <\/div>\n      <div class=\"rr sub\"><span class=\"rl\">Total professional fees<\/span><span class=\"rv\" id=\"r_feesSub\">\u2014<\/span><\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"padding:0;overflow:hidden;\">\n      <div class=\"rr tot\" style=\"margin:0;border:none;\"><span class=\"rl\">Final Acquisition Cost<\/span><span class=\"rv\" id=\"r_final\">\u2014<\/span><\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"margin-top:14px;\">\n      <div class=\"acc\">\n        <button class=\"acc-t\" id=\"aMarketT\" style=\"font-size:11px;padding:12px 0;\">\ud83c\udfd8&nbsp; Are you buying in Hesperange? Find out more <span class=\"acc-ic\">+<\/span><\/button>\n        <div class=\"acc-b\" id=\"aMarketB\">\n          <div style=\"padding-top:8px;\">\n            <p style=\"font-size:10px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--dark);margin-bottom:10px;\">Market Context \u2014 Hesperange Commune<\/p>\n            <div class=\"rr\"><span class=\"rl\">Average asking price\/m\u00b2<\/span><span class=\"rv\">\u20ac 9.008<\/span><\/div>\n            <div class=\"rr\"><span class=\"rl\">Average transacted price\/m\u00b2<\/span><span class=\"rv\">\u20ac 8.462<\/span><\/div>\n            <div class=\"rr\"><span class=\"rl\">Typical negotiation gap<\/span><span class=\"rv\">\u20ac 546 \/ m\u00b2<\/span><\/div>\n            <div class=\"rr\"><span class=\"rl\">Market correction from Nov 2023 peak<\/span><span class=\"rv\">\u221212%<\/span><\/div>\n            <div class=\"rr\"><span class=\"rl\">Property mix<\/span><span class=\"rv\">~60% apartments<\/span><\/div>\n            <div class=\"notice\" style=\"margin-top:12px;\"><strong>Buying in Hesperange?<\/strong> zeas.immo is the first buyer's agency focused exclusively on Hesperange commune. We advise on pricing, guide you through the offer, and sit on your side of the table \u2014 every time.<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"mort-box\">\n      <div class=\"mt-txt\">\n        <h4>Want to know your monthly payment?<\/h4>\n        <p>Estimate your mortgage based on down payment, interest rate and loan term.<\/p>\n      <\/div>\n      <button class=\"btn btn-s\" id=\"btnMort\">Calculate monthly payment \u2192<\/button>\n    <\/div>\n\n\n    <!-- ==================== MORTGAGE CALCULATOR ==================== -->\n    <div id=\"mortgageCalc\">\n      <div class=\"card\">\n        <div class=\"card-hd\">\n          <h2>Monthly Payment Estimator<\/h2>\n          <p>Based on your acquisition cost. Adjust the inputs below to match your financing plan.<\/p>\n        <\/div>\n\n        <!-- LOAN SETUP -->\n        <p class=\"mort-section-title\">Loan Setup<\/p>\n        <div class=\"row c3\">\n          <div class=\"f\">\n            <label>Property value (\u20ac) <i class=\"tip\" data-t=\"Pre-filled from your total acquisition cost. You can adjust this to match your actual offer price.\">?<\/i><\/label>\n            <div class=\"iw\"><span class=\"pre\">\u20ac<\/span><input class=\"inp\" type=\"text\" id=\"m_propVal\" inputmode=\"numeric\"><\/div>\n          <\/div>\n          <div class=\"f\">\n            <label>Down payment <i class=\"tip\" data-t=\"Luxembourg banks typically require 10\u201320% for residents. 20% is the standard starting point. Some banks allow up to 90% LTV for strong profiles.\">?<\/i><\/label>\n            <div class=\"sl-wrap\">\n              <div class=\"sl-row\">\n                <input type=\"range\" id=\"m_dpPct\" min=\"10\" max=\"40\" value=\"20\" step=\"1\">\n                <span class=\"sl-val\" id=\"m_dpPctVal\">20%<\/span>\n              <\/div>\n              <div class=\"sl-labels\"><span>10%<\/span><span>40%<\/span><\/div>\n            <\/div>\n          <\/div>\n          <div class=\"f\">\n            <label>Loan amount (\u20ac) <i class=\"tip\" data-t=\"Property value minus your down payment. This is the amount you borrow from the bank.\">?<\/i><\/label>\n            <div class=\"iw\"><span class=\"pre\">\u20ac<\/span><input class=\"inp ro\" type=\"text\" id=\"m_loanAmt\" readonly><\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"row c3\">\n          <div class=\"f\">\n            <label>Loan term <i class=\"tip\" data-t=\"Luxembourg banks typically allow up to 25\u201330 years. Longer terms lower monthly payments but increase total interest paid.\">?<\/i><\/label>\n            <select class=\"sel\" id=\"m_term\">\n              <option value=\"10\">10 years<\/option>\n              <option value=\"15\">15 years<\/option>\n              <option value=\"20\">20 years<\/option>\n              <option value=\"25\" selected>25 years<\/option>\n              <option value=\"30\">30 years<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"f\">\n            <label>Rate type <i class=\"tip\" data-t=\"Rates as observed in Luxembourg market, April 2026. BCL and Switchr data. Your actual rate depends on your profile and bank \u2014 adjust the field on the right.\">?<\/i><\/label>\n            <select class=\"sel\" id=\"m_rateType\">\n              <option value=\"3.10\">Variable \/ up to 1yr \u2014 3.10%<\/option>\n              <option value=\"3.27\">Fixed 1\u20135 years \u2014 3.27%<\/option>\n              <option value=\"3.52\">Fixed 5\u201310 years \u2014 3.52%<\/option>\n              <option value=\"3.65\">Fixed 10\u201320 years \u2014 3.65%<\/option>\n              <option value=\"3.75\">Fixed 20\u201325 years \u2014 3.75%<\/option>\n              <option value=\"3.85\" selected>Fixed 25\u201330 years \u2014 3.85%<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"f\">\n            <label>Interest rate (%) <i class=\"tip\" data-t=\"Pre-filled from the rate type selected. Override with your actual bank quote for a precise calculation.\">?<\/i><\/label>\n            <div class=\"iw\"><input class=\"inp rs\" type=\"number\" id=\"m_rate\" value=\"3.85\" min=\"0.1\" max=\"10\" step=\"0.01\"><span class=\"suf\">%<\/span><\/div>\n          <\/div>\n        <\/div>\n\n        <!-- MONTHLY COSTS -->\n        <hr class=\"div\">\n        <p class=\"mort-section-title\">Monthly Costs<\/p>\n        <div class=\"row c3\">\n          <div class=\"f\">\n            <label>Home insurance (\u20ac\/year) <i class=\"tip\" data-t=\"Typical Luxembourg home insurance is \u20ac500\u2013800\/year. Default \u20ac600. Adjust based on your property size and insurer quote.\">?<\/i><\/label>\n            <div class=\"iw\"><span class=\"pre\">\u20ac<\/span><input class=\"inp\" type=\"number\" id=\"m_insurance\" value=\"600\" min=\"0\" step=\"50\"><\/div>\n          <\/div>\n          <div class=\"f\">\n            <label>Property charges (\u20ac\/month) <i class=\"tip\" data-t=\"Includes syndic fees, maintenance fund, and communal charges for apartments. Typically \u20ac200\u2013500\/month. Default \u20ac300.\">?<\/i><\/label>\n            <div class=\"iw\"><span class=\"pre\">\u20ac<\/span><input class=\"inp\" type=\"number\" id=\"m_charges\" value=\"300\" min=\"0\" step=\"25\"><\/div>\n          <\/div>\n          <div class=\"f\">\n            <label>Total monthly cost <i class=\"tip\" data-t=\"Mortgage payment + insurance (monthly) + property charges. This is your all-in monthly housing cost.\">?<\/i><\/label>\n            <div class=\"iw\"><span class=\"pre\">\u20ac<\/span><input class=\"inp ro\" type=\"text\" id=\"m_totalMonthly\" readonly><\/div>\n          <\/div>\n        <\/div>\n\n      <\/div><!-- \/card -->\n\n      <!-- SUMMARY BAR -->\n      <div class=\"mort-summary\">\n        <div class=\"mort-sum-cell\">\n          <div class=\"msc-label\">Monthly mortgage<\/div>\n          <div class=\"msc-value orange\" id=\"ms_payment\">\u2014<\/div>\n          <div class=\"msc-sub\">principal + interest<\/div>\n        <\/div>\n        <div class=\"mort-sum-cell\">\n          <div class=\"msc-label\">Monthly charges<\/div>\n          <div class=\"msc-value\" id=\"ms_charges\">\u2014<\/div>\n          <div class=\"msc-sub\">insurance + property costs<\/div>\n        <\/div>\n        <div class=\"mort-sum-cell\">\n          <div class=\"msc-label\">Total monthly cost<\/div>\n          <div class=\"msc-value orange\" id=\"ms_total\">\u2014<\/div>\n          <div class=\"msc-sub\">all-in housing budget<\/div>\n        <\/div>\n      <\/div>\n\n      <!-- AMORTISATION TABLE -->\n      <div class=\"card\">\n        <div class=\"card-hd\">\n          <h2>Amortisation Schedule<\/h2>\n          <p>Year-by-year breakdown of your mortgage payments, balance, and equity.<\/p>\n        <\/div>\n\n        <!-- Payment split bar -->\n        <div style=\"margin-bottom:16px;\">\n          <div class=\"mort-bar-wrap\">\n            <div class=\"mort-bar-interest\" id=\"m_barInterest\" style=\"width:60%;\"><\/div>\n            <div class=\"mort-bar-principal\" id=\"m_barPrincipal\" style=\"width:40%;\"><\/div>\n          <\/div>\n          <div class=\"mort-bar-legend\">\n            <span><span class=\"dot dot-interest\"><\/span>Interest<\/span>\n            <span><span class=\"dot dot-principal\"><\/span>Principal repaid<\/span>\n          <\/div>\n          <p style=\"font-size:11px;font-weight:300;color:var(--muted);margin-top:6px;\" id=\"m_splitLabel\"><\/p>\n        <\/div>\n\n        <div style=\"overflow-x:auto;\">\n          <table class=\"mort-table\">\n            <thead>\n              <tr>\n                <th>Year<\/th>\n                <th>Interest paid<\/th>\n                <th>Principal paid<\/th>\n                <th>Mortgage balance<\/th>\n                <th>Home value<\/th>\n                <th>Home equity<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"m_tableBody\"><\/tbody>\n          <\/table>\n        <\/div>\n        <button class=\"btn-show-more\" id=\"m_showMore\">Show all years \u2193<\/button>\n\n        <!-- Long-term view accordion -->\n        <div class=\"acc\" style=\"margin-top:12px;\">\n          <button class=\"acc-t\" id=\"aEquityT\" style=\"font-size:11px;\">\n            \ud83d\udcc8 Long-term equity view \u2014 assumptions\n            <span class=\"acc-ic\">+<\/span>\n          <\/button>\n          <div class=\"acc-b\" id=\"aEquityB\">\n            <div class=\"row c2\" style=\"margin-top:10px;\">\n              <div class=\"f\">\n                <label>Property appreciation (% \/ year) <i class=\"tip\" data-t=\"Luxembourg property prices rose ~4.6% nominally in 2026. Conservative 5-year forecast: 2\u20133%\/year. Source: Investropa \/ STATEC. Adjust to your scenario.\">?<\/i><\/label>\n                <div class=\"iw\"><input class=\"inp rs\" type=\"number\" id=\"m_appreciation\" value=\"2.5\" min=\"0\" max=\"10\" step=\"0.1\"><span class=\"suf\">%<\/span><\/div>\n              <\/div>\n              <div class=\"f\">\n                <label>Inflation (% \/ year) <i class=\"tip\" data-t=\"STATEC forecast: 1.8% for 2026. Used to show real vs nominal equity. Source: STATEC February 2026.\">?<\/i><\/label>\n                <div class=\"iw\"><input class=\"inp rs\" type=\"number\" id=\"m_inflation\" value=\"1.8\" min=\"0\" max=\"10\" step=\"0.1\"><span class=\"suf\">%<\/span><\/div>\n              <\/div>\n            <\/div>\n            <p class=\"equity-note\">Property value projection is for illustrative purposes only and does not constitute a guarantee of future returns. Based on STATEC 2026 data and Investropa\/BCL market analysis. Actual appreciation may vary significantly.<\/p>\n          <\/div>\n        <\/div>\n\n      <\/div><!-- \/amortisation card -->\n\n    <\/div><!-- \/mortgageCalc -->\n\n    <div class=\"cta-box\">\n      <h3>Ready to move forward?<\/h3>\n      <p>You've got the numbers \u2014 now let's find the right property at the right price. zeas.immo works exclusively for buyers, starting in Hesperange.<\/p>\n      <div class=\"cta-acts\">\n        <button class=\"cp pri\" id=\"btnBook\">\n          <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"\/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"\/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"\/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"\/><\/svg>\n          Book a free consultation\n        <\/button>\n        <button class=\"cp out\" id=\"btnEmail\">\n          <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"\/><polyline points=\"2,4 12,13 22,4\"\/><\/svg>\n          Email me this calculation\n        <\/button>\n        <button class=\"cp out\" id=\"btnPrint\">\n          <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 6 2 18 2 18 9\"\/><path d=\"M6 18H4a2 2 0 01-2-2v-5a2 2 0 012-2h16a2 2 0 012 2v5a2 2 0 01-2 2h-2\"\/><rect x=\"6\" y=\"14\" width=\"12\" height=\"8\"\/><\/svg>\n          Save as PDF\n        <\/button>\n        <button class=\"cp out\" id=\"btnReset\">\n          <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"1 4 1 10 7 10\"\/><path d=\"M3.51 15a9 9 0 1 0 .49-3.32\"\/><\/svg>\n          New calculation\n        <\/button>\n      <\/div>\n    <\/div>\n\n  <\/div><!-- \/step4 -->\n\n<\/div><!-- \/calc-wrap -->\n\n<!-- ==================== EXPLAINER SECTION ==================== -->\n<div class=\"explainer\">\n  <h2>Understanding your buying costs in Luxembourg<\/h2>\n  <p>Luxembourg property transactions involve several layers of costs that go beyond the sale price. Here is what each one means:<\/p>\n  <p><strong>Registration tax<\/strong> is charged by the state on the transfer of ownership. The standard rate is 6%, with an additional 1% transcription tax. First-time buyers purchasing a primary residence may qualify for the B\u00ebllegen Akt credit of up to \u20ac40,000 per buyer \u2014 permanently in place since July 2025.<\/p>\n  <p><strong>Notary fees<\/strong> are set by law and calculated as a percentage of the purchase price. They cover the legal preparation and registration of the deed and typically range between 1% and 1.5% of the transaction value.<\/p>\n  <p><strong>VAT<\/strong> applies to new properties (VEFA) only. The standard rate is 17%, reduced to 3% for a primary residence on the construction portion still to be completed. The exact amount depends on the land share, construction progress, and how you intend to use the property. Existing properties are VAT-exempt \u2014 only registration and transcription duties apply.<\/p>\n  <p>You can check <a href=\"https:\/\/zeas.immo\/en\/fees\/\" target=\"_blank\">zeas.immo agency fees here<\/a>. For a detailed breakdown of Luxembourg property buying costs, you can also refer to the <a href=\"https:\/\/aed.public.lu\" target=\"_blank\" rel=\"noopener\">Administration de l'Enregistrement, des Domaines et de la TVA (AED)<\/a>.<\/p>\n  <div class=\"disc-note\">*All figures are estimates for guidance only. Final costs are determined by the notary office and may vary based on your specific situation. zeas.immo accepts no liability for differences between estimated and actual amounts.<\/div>\n<\/div>\n\n<script>\n\/* ============ UTILS ============ *\/\nconst $ = id => document.getElementById(id);\nconst fmtEU = n => '\u20ac ' + Math.round(n).toLocaleString('de-DE');\nconst radioVal = name => { const c = document.querySelector(`input[name=\"${name}\"]:checked`); return c ? c.value : ''; };\nconst showEl = id => { const e=$(id); if(e) e.style.display=''; };\nconst hideEl = id => { const e=$(id); if(e) e.style.display='none'; };\nconst showC = id => { const e=$(id); if(e) e.classList.add('on'); };\nconst hideC = id => { const e=$(id); if(e) e.classList.remove('on'); };\nconst showErr = id => { const e=$(id); if(e) e.classList.add('on'); };\nconst hideErr = id => { const e=$(id); if(e) e.classList.remove('on'); };\n\n\/* ============ THOUSAND FORMAT ON INPUT ============ *\/\nfunction attachNumFmt(id) {\n  const el = $(id);\n  if(!el) return;\n  el.addEventListener('input', () => {\n    const raw = el.value.replace(\/[^\\d]\/g,'');\n    el.value = raw ? parseInt(raw).toLocaleString('de-DE') : '';\n  });\n}\nattachNumFmt('purchasePrice');\nattachNumFmt('remCredit');\n\nfunction parseFieldNum(id) {\n  const el = $(id);\n  if(!el) return 0;\n  return parseFloat(el.value.replace(\/\\.\/g,'').replace(',','.')) || 0;\n}\n\n\/* ============ STEP NAVIGATION ============ *\/\nfunction goStep(n) {\n  document.querySelectorAll('.sp').forEach(p => p.classList.remove('active'));\n  $(`step${n}`).classList.add('active');\n  document.querySelectorAll('.step-item').forEach(item => {\n    const s = parseInt(item.dataset.s);\n    item.classList.remove('active','done');\n    if(s < n) item.classList.add('done');\n    if(s === n) item.classList.add('active');\n  });\n  window.scrollTo({top:0,behavior:'smooth'});\n}\n\n\/* ============ CONDITIONALS ============ *\/\nfunction updateConds() {\n  const isNew = radioVal('pType') === 'new';\n  const isPrimary = radioVal('pUse') === 'primary';\n  const is2nd = radioVal('fBuyer') === 'no';\n  if(isNew) showC('vefaFields'); else hideC('vefaFields');\n  if(isNew && isPrimary){ showC('notePrimary'); hideC('noteNonPrimary'); }\n  else if(isNew && !isPrimary){ showC('noteNonPrimary'); hideC('notePrimary'); }\n  else { hideC('notePrimary'); hideC('noteNonPrimary'); }\n  if(is2nd && isPrimary) showC('secBuyerF'); else hideC('secBuyerF');\n  updateVefa();\n}\n\nfunction updateVefa() {\n  const price = parseFieldNum('purchasePrice');\n  if(!price || radioVal('pType') !== 'new') return;\n  const lp = parseInt($('landPct').value) \/ 100;\n  const cp = parseInt($('constrPct').value) \/ 100;\n  const land = price * lp;\n  const bldg = price - land;\n  const compl = bldg * cp;\n  const tobuild = bldg * (1 - cp);\n  $('cv_land').textContent = fmtEU(land);\n  $('cv_compl').textContent = fmtEU(compl);\n  $('cv_build').textContent = fmtEU(tobuild);\n}\n\n$('constrPct').addEventListener('input', () => { $('constrVal').textContent = $('constrPct').value + '%'; updateVefa(); });\n$('landPct').addEventListener('change', updateVefa);\n$('purchasePrice').addEventListener('input', updateVefa);\ndocument.querySelectorAll('input[name=\"pType\"],input[name=\"pUse\"],input[name=\"fBuyer\"]')\n  .forEach(r => r.addEventListener('change', updateConds));\n\n\/* ============ CALC ENGINE ============ *\/\nlet C = {};\n\nfunction runCalc() {\n  const price = parseFieldNum('purchasePrice');\n  const isNew = radioVal('pType') === 'new';\n  const isPrimary = radioVal('pUse') === 'primary';\n  const isResale = radioVal('pUse') === 'resale';\n  const is1st = radioVal('fBuyer') === 'yes';\n  const isCouple = radioVal('marital') === 'couple';\n  const isLux = radioVal('commune') === 'lux';\n  const hasAgency = radioVal('agency') === 'yes';\n  const hasExpert = radioVal('expert') === 'yes';\n  const notaryRate = parseFloat($('notaryRate').value) \/ 100 || 0.01;\n  const remCredit = parseFieldNum('remCredit');\n\n  const regRate = isResale ? 0.072 : 0.06;\n  const regDuty = price * regRate;\n  const resaleSurch = isResale ? price * 0.012 : 0;\n  const transcription = price * 0.01;\n  \/\/ Lux City surcharge = 50% of the communal 6% registration duty only.\n  \/\/ For resale (7.2%), the extra 1.2% is a state-level charge \u2014 excluded from the surcharge base.\n  const luxSurch = isLux ? (price * 0.06) * 0.50 : 0;\n\n  const VAT_THRESH = 357143;\n  let vat3=0, vat3Base=0, vat17=0, vat17Base=0, vatTotal=0;\n\n  if(isNew) {\n    const lp = parseInt($('landPct').value) \/ 100;\n    const cp = parseInt($('constrPct').value) \/ 100;\n    const land = price * lp;\n    const bldg = price - land;\n    const toBuild = bldg * (1 - cp);\n    if(toBuild > 0) {\n      if(isPrimary) {\n        vat3Base = Math.min(toBuild, VAT_THRESH);\n        vat3 = vat3Base * 0.03;\n        if(toBuild > VAT_THRESH) { vat17Base = toBuild - VAT_THRESH; vat17 = vat17Base * 0.17; }\n      } else {\n        vat17Base = toBuild; vat17 = vat17Base * 0.17;\n      }\n      vatTotal = vat3 + vat17;\n    }\n  }\n\n  const taxGross = regDuty + (isResale ? resaleSurch : 0) + transcription + luxSurch + vatTotal;\n  const eligTaxes = regDuty + transcription;\n  let creditAvail=0, creditApplied=0, taxNet=taxGross, creditNote='';\n\n  if(isPrimary) {\n    creditAvail = is1st ? (isCouple ? 80000 : 40000) : Math.min(remCredit, isCouple ? 80000 : 40000);\n    creditApplied = Math.min(eligTaxes, creditAvail);\n    const netElig = Math.max(100, eligTaxes - creditApplied);\n    taxNet = netElig + luxSurch + vatTotal;\n    if(eligTaxes < creditAvail) creditNote = `You have ${fmtEU(creditAvail - eligTaxes)} of B\u00ebllegen Akt credit remaining \u2014 it can be applied to a future property purchase.`;\n  }\n\n  const notaryFee = price * notaryRate;\n  const agencyFee = hasAgency ? price * 0.03 * 1.17 : 0;\n  const expertFee = hasExpert ? 1000 : 0;\n  const totalFees = notaryFee + agencyFee + expertFee;\n  const finalTotal = price + taxNet + totalFees;\n\n  C = { price, isNew, isPrimary, isResale, is1st, isCouple, isLux,\n    hasAgency, hasExpert, notaryRate,\n    regRate, regDuty, resaleSurch, transcription, luxSurch,\n    vat3, vat3Base, vat17, vat17Base, vatTotal,\n    taxGross, eligTaxes, creditAvail, creditApplied,\n    taxNet, creditNote, notaryFee, agencyFee, expertFee, totalFees, finalTotal };\n  return C;\n}\n\n\/* ============ FILL PREVIEW ============ *\/\nfunction fillPreview(c) {\n  $('s2_regLbl').textContent = c.isResale ? 'Registration duty (7.2%)' : 'Registration duty (6%)';\n  $('s2_reg').textContent = fmtEU(c.regDuty);\n  $('s2_trans').textContent = fmtEU(c.transcription);\n  if(c.isResale){ showEl('s2_resRow'); $('s2_res').textContent=fmtEU(c.resaleSurch); } else hideEl('s2_resRow');\n  if(c.isLux){ showEl('s2_luxRow'); $('s2_lux').textContent=fmtEU(c.luxSurch); } else hideEl('s2_luxRow');\n  if(c.isNew && c.vatTotal>0){ showEl('s2_vatRow'); $('s2_vat').textContent=fmtEU(c.vatTotal); } else hideEl('s2_vatRow');\n  $('s2_tot').textContent = fmtEU(c.taxGross);\n}\n\n\/* ============ FILL RESULTS ============ *\/\nfunction fillResults(c) {\n  $('r_price').textContent = fmtEU(c.price);\n  $('r_taxNet').textContent = fmtEU(c.taxNet);\n  $('r_fees').textContent = fmtEU(c.totalFees);\n  $('r_total').textContent = fmtEU(c.finalTotal);\n  $('r_taxTitle').textContent = c.isNew ? 'New Property \u2014 State Taxes' : 'Existing Property \u2014 State Taxes';\n  $('r_taxSub').textContent = c.isNew ? 'Registration\/transcription on land and completed portions; VAT on remaining construction.' : 'Registration and transcription duties applied to the full purchase price.';\n  $('r_regRateLbl').textContent = c.isResale ? '7.2% of purchase price (investor \/ buy-to-sell rate)' : '6% of purchase price';\n  $('r_reg').textContent = fmtEU(c.regDuty);\n  $('r_trans').textContent = fmtEU(c.transcription);\n  if(c.isResale){ showEl('r_resRow'); $('r_res').textContent=fmtEU(c.resaleSurch); } else hideEl('r_resRow');\n  if(c.isLux){ showEl('r_luxRow'); $('r_lux').textContent=fmtEU(c.luxSurch); } else hideEl('r_luxRow');\n  if(c.isNew && c.vatTotal>0) {\n    showEl('r_vatSec');\n    if(c.vat3>0){ showEl('r_vat3Row'); $('r_vat3Lbl').textContent=`3% on ${fmtEU(c.vat3Base)} (up to \u20ac357.143 threshold)`; $('r_vat3').textContent=fmtEU(c.vat3); } else hideEl('r_vat3Row');\n    if(c.vat17>0){ showEl('r_vat17Row'); $('r_vat17Lbl').textContent=c.isPrimary?`17% on ${fmtEU(c.vat17Base)} (above \u20ac357.143 threshold)`:`17% on ${fmtEU(c.vat17Base)} (full construction \u2014 non-primary)`; $('r_vat17').textContent=fmtEU(c.vat17); } else hideEl('r_vat17Row');\n    $('r_vatTot').textContent = fmtEU(c.vatTotal);\n  } else hideEl('r_vatSec');\n  $('r_taxGross').textContent = fmtEU(c.taxGross);\n  if(c.isPrimary) {\n    showEl('r_belSec');\n    $('r_elig').textContent = fmtEU(c.eligTaxes);\n    $('r_creditLbl').textContent = c.isCouple ? 'Couple \/ PACS \u2014 \u20ac80.000 total (\u20ac40.000 each)' : 'Single buyer \u2014 \u20ac40.000 maximum';\n    $('r_creditAvail').textContent = fmtEU(c.creditAvail);\n    $('r_creditApp').textContent = '\u2212 ' + fmtEU(c.creditApplied);\n    $('r_taxNetCard').textContent = fmtEU(c.taxNet);\n    if(c.creditNote){ const n=$('r_creditNote'); n.innerHTML=c.creditNote; n.classList.add('on'); } else $('r_creditNote').classList.remove('on');\n  } else hideEl('r_belSec');\n  $('r_notaryLbl').textContent = `${(c.notaryRate*100).toFixed(1)}% of purchase price`;\n  $('r_notary').textContent = fmtEU(c.notaryFee);\n  if(c.hasAgency){ showEl('r_agRow'); $('r_agency').textContent=fmtEU(c.agencyFee); } else hideEl('r_agRow');\n  if(c.hasExpert) showEl('r_expRow'); else hideEl('r_expRow');\n  $('r_feesSub').textContent = fmtEU(c.totalFees);\n  $('r_final').textContent = fmtEU(c.finalTotal);\n}\n\n\/* ============ ACCORDIONS ============ *\/\nfunction acc(tId, bId) {\n  const t=$(tId), b=$(bId);\n  if(!t||!b) return;\n  t.addEventListener('click',()=>{ const o=b.classList.contains('open'); b.classList.toggle('open',!o); t.classList.toggle('open',!o); });\n}\nacc('aVatT','aVatB'); acc('aBelT','aBelB'); acc('aFeesT','aFeesB'); acc('aMarketT','aMarketB');\n\n\/* ============ VALIDATION ============ *\/\nfunction v1() {\n  let ok=true;\n  if(!parseFieldNum('purchasePrice')||parseFieldNum('purchasePrice')<1){ showErr('err_price'); ok=false; } else hideErr('err_price');\n  return ok;\n}\nfunction v3() {\n  let ok=true;\n  if(!$('fName').value.trim()){ showErr('err_fn'); ok=false; } else hideErr('err_fn');\n  if(!$('lName').value.trim()){ showErr('err_ln'); ok=false; } else hideErr('err_ln');\n  if(!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test($('uEmail').value)){ showErr('err_em'); ok=false; } else hideErr('err_em');\n  if(!$('gdpr').checked){ showErr('err_gdpr'); ok=false; } else hideErr('err_gdpr');\n  return ok;\n}\n\n\/* ============ EMAIL \u2014 POST to zeas-proxy.php ============ *\/\nasync function sendCalcEmail() {\n  const c = C;\n  const btn = $('btnEmail');\n  btn.textContent = 'Sending\u2026';\n  btn.disabled = true;\n\n  const payload = {\n    \/\/ Contact\n    firstName:    $('fName').value,\n    lastName:     $('lName').value,\n    email:        $('uEmail').value,\n    phone:        $('uPhone').value,\n    \/\/ Property\n    propertyType: c.isNew    ? 'New property (VEFA)' : 'Existing property',\n    propertyUse:  c.isPrimary ? 'Primary residence'  : c.isResale ? 'Investor \/ buy-to-sell' : '2nd home \/ holiday property',\n    buyerType:    c.is1st    ? 'First buy'           : 'Second buy',\n    marital:      c.isCouple ? 'Couple \/ PACS'       : 'Single buyer',\n    commune:      c.isLux    ? 'Luxembourg City'     : 'Other commune',\n    \/\/ Numbers (raw, PHP formats them)\n    price:          c.price,\n    regDuty:        c.regDuty,\n    transcription:  c.transcription,\n    luxSurcharge:   c.luxSurch,\n    vatTotal:       c.vatTotal,\n    taxGross:       c.taxGross,\n    creditApplied:  c.creditApplied,\n    taxNet:         c.taxNet,\n    notaryFee:      c.notaryFee,\n    agencyFee:      c.agencyFee,\n    expertFee:      c.expertFee,\n    totalFees:      c.totalFees,\n    finalTotal:     c.finalTotal,\n    \/\/ Mortgage (only included if calculator was used)\n    mortgage: (() => {\n      const mc = $('mortgageCalc');\n      if (!mc || !mc.classList.contains('visible')) return null;\n      const propValRaw = $('m_propVal').value.replace(\/\\.\/g,'').replace(',','.');\n      const propVal = parseFloat(propValRaw) || 0;\n      if (!propVal) return null;\n      const dpPct = parseInt($('m_dpPct').value);\n      const loan = propVal * (1 - dpPct\/100);\n      const rate = parseFloat($('m_rate').value);\n      const term = parseInt($('m_term').value);\n      const insurance = parseFloat($('m_insurance').value) || 600;\n      const charges = parseFloat($('m_charges').value) || 300;\n      const n = term * 12;\n      const mr = rate \/ 100 \/ 12;\n      const monthly = loan * (mr * Math.pow(1+mr,n)) \/ (Math.pow(1+mr,n)-1);\n      const rateLabel = $('m_rateType').options[$('m_rateType').selectedIndex].text;\n      return {\n        propertyValue: propVal,\n        downPaymentPct: dpPct,\n        downPayment: propVal * dpPct\/100,\n        loanAmount: loan,\n        termYears: term,\n        rateLabel: rateLabel,\n        interestRate: rate,\n        monthlyPayment: monthly,\n        insuranceYear: insurance,\n        chargesMonth: charges,\n        totalMonthly: monthly + insurance\/12 + charges,\n      };\n    })(),\n  };\n\n  try {\n    const res = await fetch('\/zeas-proxy.php?action=calc_lead', {\n      method:  'POST',\n      headers: { 'Content-Type': 'application\/json' },\n      body:    JSON.stringify(payload),\n    });\n    const json = await res.json();\n\n    if (json.success) {\n      btn.textContent = '\u2713 Sent to your inbox';\n      btn.style.borderColor = 'var(--success)';\n      btn.style.color = 'var(--success)';\n    } else {\n      throw new Error(json.error || 'Unknown error');\n    }\n  } catch (err) {\n    console.error('calc_lead error:', err);\n    btn.textContent = 'Send failed \u2014 retry';\n    btn.disabled = false;\n    \/\/ Graceful fallback: open mailto so the user isn't stuck\n    const sub = 'My Luxembourg Buying Cost Calculation';\n    const body = `Purchase price: ${fmtEU(c.price)}\\nFinal acquisition cost: ${fmtEU(c.finalTotal)}\\n\\nPlease send me the full breakdown.`;\n    window.open(`mailto:hello@zeas.immo?subject=${encodeURIComponent(sub)}&body=${encodeURIComponent(body)}`);\n  }\n}\n\n\/* ============ NAVIGATION ============ *\/\n$('btnS1').addEventListener('click', () => { if(!v1()) return; fillPreview(runCalc()); goStep(2); });\n$('btnBackS1').addEventListener('click', () => goStep(1));\n$('btnS2').addEventListener('click', () => goStep(3));\n$('btnBackS2').addEventListener('click', () => goStep(2));\n$('btnS3').addEventListener('click', () => { if(!v3()) return; fillResults(C); goStep(4); });\n$('btnBook').addEventListener('click', () => {\n  \/\/ Replace with your Calendly link, e.g.: window.open('https:\/\/calendly.com\/adrian-buzea', '_blank');\n  window.open('https:\/\/calendly.com\/zeas-immo', '_blank');\n});\n$('btnEmail').addEventListener('click', sendCalcEmail);\n$('btnPrint').addEventListener('click', () => window.print());\n$('btnReset').addEventListener('click', () => goStep(1));\n\/* ============ MORTGAGE CALCULATOR ============ *\/\n\n\/\/ Rate type \u2192 auto-fill rate field\n$('m_rateType').addEventListener('change', () => {\n  $('m_rate').value = $('m_rateType').value;\n  calcMortgage();\n});\n\n\/\/ Attach thousand format to prop value\nattachNumFmt('m_propVal');\n\n\/\/ Down payment slider\n$('m_dpPct').addEventListener('input', () => {\n  $('m_dpPctVal').textContent = $('m_dpPct').value + '%';\n  calcMortgage();\n});\n\n\/\/ All mortgage inputs trigger recalc\n['m_propVal','m_rate','m_term','m_insurance','m_charges','m_appreciation','m_inflation'].forEach(id => {\n  const el = $(id);\n  if(el) el.addEventListener('input', calcMortgage);\n});\n$('m_term').addEventListener('change', calcMortgage);\n\nfunction calcMortgage() {\n  const propValRaw = $('m_propVal').value.replace(\/\\.\/g,'').replace(',','.');\n  const propVal = parseFloat(propValRaw) || 0;\n  const dpPct = parseInt($('m_dpPct').value) \/ 100;\n  const dp = propVal * dpPct;\n  const loan = propVal - dp;\n  const annualRate = parseFloat($('m_rate').value) \/ 100 || 0.0385;\n  const monthlyRate = annualRate \/ 12;\n  const termYears = parseInt($('m_term').value) || 25;\n  const n = termYears * 12;\n  const insuranceYear = parseFloat($('m_insurance').value) || 600;\n  const chargesMonth = parseFloat($('m_charges').value) || 300;\n  const appreciationRate = parseFloat($('m_appreciation').value) \/ 100 || 0.025;\n  const inflationRate = parseFloat($('m_inflation').value) \/ 100 || 0.018;\n\n  \/\/ Update loan amount display\n  $('m_loanAmt').value = loan > 0 ? Math.round(loan).toLocaleString('de-DE') : '';\n\n  if(loan <= 0 || monthlyRate <= 0) return;\n\n  \/\/ Monthly mortgage payment (standard annuity formula)\n  const monthlyPayment = loan * (monthlyRate * Math.pow(1 + monthlyRate, n)) \/ (Math.pow(1 + monthlyRate, n) - 1);\n  const insuranceMonth = insuranceYear \/ 12;\n  const totalMonthly = monthlyPayment + insuranceMonth + chargesMonth;\n\n  \/\/ Summary bar\n  $('ms_payment').textContent = fmtEU(monthlyPayment);\n  $('ms_charges').textContent = fmtEU(insuranceMonth + chargesMonth);\n  $('ms_total').textContent = fmtEU(totalMonthly);\n  $('m_totalMonthly').value = Math.round(totalMonthly).toLocaleString('de-DE');\n\n  \/\/ Payment split bar (year 1 interest ratio)\n  const yr1Interest = loan * annualRate;\n  const yr1Principal = monthlyPayment * 12 - yr1Interest;\n  const interestPct = Math.max(5, Math.min(95, (yr1Interest \/ (monthlyPayment * 12)) * 100));\n  $('m_barInterest').style.width = interestPct + '%';\n  $('m_barPrincipal').style.width = (100 - interestPct) + '%';\n  $('m_splitLabel').textContent = `Year 1: ${fmtEU(yr1Interest\/12)}\/month interest \u00b7 ${fmtEU(yr1Principal\/12)}\/month principal`;\n\n  \/\/ Build amortisation schedule\n  let balance = loan;\n  let rows = [];\n  for(let yr = 1; yr <= termYears; yr++) {\n    let yearInterest = 0, yearPrincipal = 0;\n    for(let m = 0; m < 12; m++) {\n      const intAmt = balance * monthlyRate;\n      const princAmt = Math.min(monthlyPayment - intAmt, balance);\n      yearInterest += intAmt;\n      yearPrincipal += princAmt;\n      balance = Math.max(0, balance - princAmt);\n    }\n    const homeValue = propVal * Math.pow(1 + appreciationRate, yr);\n    const equity = homeValue - balance;\n    rows.push({ yr, yearInterest, yearPrincipal, balance, homeValue, equity });\n  }\n\n  \/\/ Render table \u2014 first 5 rows visible, rest hidden\n  const tbody = $('m_tableBody');\n  tbody.innerHTML = '';\n  rows.forEach((r, i) => {\n    const tr = document.createElement('tr');\n    if(i >= 5) tr.classList.add('mort-hidden-row');\n    tr.innerHTML = `\n      <td>Year ${r.yr}<\/td>\n      <td>${fmtEU(r.yearInterest)}<\/td>\n      <td>${fmtEU(r.yearPrincipal)}<\/td>\n      <td>${fmtEU(r.balance)}<\/td>\n      <td style=\"color:var(--muted)\">${fmtEU(r.homeValue)}<\/td>\n      <td class=\"equity-pos\">${fmtEU(r.equity)}<\/td>`;\n    tbody.appendChild(tr);\n  });\n\n  \/\/ Apply hidden rows CSS\n  const style = document.getElementById('mort-hidden-style') || (() => {\n    const s = document.createElement('style');\n    s.id = 'mort-hidden-style';\n    document.head.appendChild(s);\n    return s;\n  })();\n  style.textContent = '.mort-hidden-row { display: none; }';\n\n  \/\/ Show more toggle\n  let expanded = false;\n  $('m_showMore').onclick = () => {\n    expanded = !expanded;\n    style.textContent = expanded ? '' : '.mort-hidden-row { display: none; }';\n    $('m_showMore').textContent = expanded ? 'Show less \u2191' : 'Show all years \u2193';\n  };\n  $('m_showMore').style.display = termYears > 5 ? 'block' : 'none';\n}\n\n\/\/ ['m_appreciation','m_inflation'] already wired above\nacc('aEquityT','aEquityB');\n\n$('btnMort').addEventListener('click', () => {\n  const mc = $('mortgageCalc');\n  mc.classList.add('visible');\n  \/\/ Pre-fill property value from acquisition cost\n  if(C && C.finalTotal && !$('m_propVal').value) {\n    $('m_propVal').value = Math.round(C.finalTotal).toLocaleString('de-DE');\n  }\n  calcMortgage();\n  setTimeout(() => mc.scrollIntoView({ behavior: 'smooth', block: 'start' }), 50);\n});\n\n\/* ============ INIT ============ *\/\nupdateConds();\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<div class=\"elementor-element elementor-element-7f9dbc4 e-flex e-con-boxed e-con e-parent\" data-id=\"7f9dbc4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\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>Buying Cost Calculator Luxembourg \u2014 zeas.immo zeas.immo &nbsp;\u00b7&nbsp; Buyer&#8217;s Agency Luxembourg Buying Cost Calculator Luxembourg Know your full acquisition budget before you make an offer. Registration duties, notary fees and VAT can add 8\u201313% on top of the asking price. 1Property Details 2Preview Taxes 3Your Details 4Full Breakdown Your Property Details Tell us about the [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":49901,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-31005","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/pages\/31005","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=31005"}],"version-history":[{"count":3,"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/pages\/31005\/revisions"}],"predecessor-version":[{"id":50220,"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/pages\/31005\/revisions\/50220"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/media\/49901"}],"wp:attachment":[{"href":"https:\/\/zeas.immo\/en\/wp-json\/wp\/v2\/media?parent=31005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}