PageSourceSearch

https://arcanes.be/assets/ExplorationPage-cjg0g6fp.js

js arcanes.be collected 2026-09-25 12:39:26 UTC 127,858 bytes, 130 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/jspdf.es.min-DJr0GaCK.js","assets/index-DrUUimuw.js","assets/index-CHXb3IAR.css"])))=>i.map(i=>d[i]);
2import{p as Dn,u as Bn,a as Nn,ay as Rn,r as c,aW as Mn,s as we,j as e,bn as In,Y as Ln,h as vn,q as Tn,X as $e,S as We,am as On,aq as ue,o as _n,b$ as qn,N as Vn,$ as sn,aK as Hn,ac as $n,aE as ln,A as Wn}from"./index-DrUUimuw.js";import{u as Gn,b as Un}from"./belgium-communes-MN9JERNN.js";import{L as Fe}from"./leaflet-src-I6r_vzy2.js";/* empty css                */import{P as Yn}from"./plus-DVCuMdlE.js";import{R as cn}from"./rotate-ccw-D161T2jj.js";import{L as Qn}from"./layers-CsJdPwTU.js";import{F as dn}from"./filter-CslEiwCL.js";import{C as Kn}from"./chevron-left-DE05ZfE7.js";/**
3 * @license lucide-react v0.462.0 - ISC
4 *
5 * This source code is licensed under the ISC license.
6 * See the LICENSE file in the root directory of this source tree.
7 */const pn=Dn("Table2",[["path",{d:"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18",key:"gugj83"}]]),u={pu:["#F3E8FF","#E9D5FF","#D8B4FE","#C084FC","#A855F7","#9333EA","#7C3AED"],gn:["#FEE2E2","#FECACA","#FEF08A","#D9F99D","#86EFAC","#4ADE80","#22C55E"],bl:["#DBEAFE","#BFDBFE","#93C5FD","#60A5FA","#3B82F6","#2563EB","#1D4ED8"],am:["#FEF3C7","#FDE68A","#FBBF24","#F59E0B","#D97706","#B45309","#92400E"],rg:["#DC2626","#EA580C","#D97706","#CA8A04","#65A30D","#16A34A","#059669"],tl:["#F0FDFA","#CCFBF1","#99F6E4","#5EEAD4","#2DD4BF","#14B8A6","#0D9488"],rs:["#FFF1F2","#FFE4E6","#FECDD3","#FDA4AF","#FB7185","#F43F5E","#E11D48"]},fe=t=>t!=null?`${(t/1e3).toFixed(0)}k €`:"—",mn=t=>t!=null?t.toLocaleString("fr-BE",{style:"currency",currency:"EUR",maximumFractionDigits:0}):"—",ne=t=>t!=null?`${t>0?"+":""}${Number(t).toFixed(1)}%`:"—",Z=t=>t!=null?`${Math.round(t)}`:"—",H=t=>t!=null?`${Math.round(t)}/100`:"—",Zn=t=>t!=null?`${Number(t).toFixed(1)}x`:"—",G=t=>t!=null?`${Number(t).toFixed(1)}%`:"—",Ge=t=>t!=null?`${Math.round(t)} €`:"—",xe=[{id:"prix",emoji:"",fr:"Prix & Coûts",nl:"Prijs & Kosten",en:"Price & Costs",layers:[{id:"prix_m",fr:"Prix maison médian",nl:"Mediaanprijs woning",en:"Median house price",field:"prix_maison_median",gradient:u.pu,format:fe,invert:!0,free:!0},{id:"prix_a",fr:"Prix appart. médian",nl:"Mediaanprijs appart.",en:"Median apt. price",field:"prix_appart_median",gradient:u.pu,format:fe,invert:!0,free:!0},{id:"evol5",fr:"Évolution prix 5 ans",nl:"Prijsevolutie 5 jaar",en:"Price change 5 yrs",field:"evol_prix_maison_5ans_pct",gradient:u.gn,format:ne,free:!0},{id:"evol10",fr:"Évolution prix 10 ans",nl:"Prijsevolutie 10 jaar",en:"Price change 10 yrs",field:"evol_prix_maison_10ans_pct",gradient:u.gn,format:ne,free:!0},{id:"trans",fr:"Transactions annuelles",nl:"Jaarlijkse transacties",en:"Annual transactions",field:"nb_transactions_total",gradient:u.bl,format:Z,free:!0},{id:"ecart_r",fr:"Écart vs. région",nl:"Verschil vs. gewest",en:"Gap vs. region",field:"ecart_prix_region_pct",gradient:u.rg,format:ne,free:!0},{id:"cout_m",fr:"Coût total achat maison",nl:"Totale aankoopkost woning",en:"Total house purchase cost",field:"cout_total_achat_maison",gradient:u.pu,format:fe,invert:!0,free:!0},{id:"access",fr:"Accessibilité (ratio)",nl:"Betaalbaarheid (ratio)",en:"Affordability (ratio)",field:"affordability_ratio",gradient:u.rg,format:Zn,invert:!0,free:!0}]},{id:"pop",emoji:"",fr:"Population & Ménages",nl:"Bevolking & Huishoudens",en:"Population & Households",layers:[{id:"pop",fr:"Population totale",nl:"Totale bevolking",en:"Total population",field:"population_totale",gradient:u.bl,format:Z,free:!0},{id:"menages",fr:"Nombre de ménages",nl:"Aantal huishoudens",en:"Number of households",field:"nb_menages_total",gradient:u.bl,format:Z,free:!0},{id:"evol_men",fr:"Évolution ménages 5a",nl:"Evolutie huishoudens 5j",en:"Household change 5 yrs",field:"evol_menages_5ans_pct",gradient:u.gn,format:ne,free:!0},{id:"isoles",fr:"Part isolés",nl:"Aandeel alleenstaanden",en:"Share single-person",field:"part_isoles_pct",gradient:u.bl,format:G,free:!0},{id:"familles",fr:"Part familles + enfants",nl:"Aandeel gezinnen + kinderen",en:"Share families w/ children",field:"part_familles_avec_enfants_pct",gradient:u.gn,format:G,free:!0},{id:"revenu",fr:"Revenu médian",nl:"Mediaaninkomen",en:"Median income",field:"revenu_median",gradient:u.tl,format:t=>t!=null?`${(t/1e3).toFixed(1)}
7k €`:"—",free:!0},{id:"precarite",fr:"Taux de précarité",nl:"Armoederatio",en:"Poverty rate",field:"taux_precarite_pct",gradient:u.rs,format:G,invert:!0,free:!0}]},{id:"bati",emoji:"",fr:"Bâti & Logement",nl:"Gebouwen & Woningen",en:"Buildings & Housing",layers:[{id:"avant46",fr:"Part bâti avant 1946",nl:"Aandeel gebouwd voor 1946",en:"Share built before 1946",field:"part_bat_avant_1946_pct",gradient:u.am,format:G,free:!0},{id:"apres11",fr:"Part bâti après 2011",nl:"Aandeel gebouwd na 2011",en:"Share built after 2011",field:"part_bat_apres_2011_pct",gradient:u.gn,format:G,free:!0},{id:"apparts",fr:"Part appartements",nl:"Aandeel appartementen",en:"Share apartments",field:"part_appartements_pct",gradient:u.bl,format:G,free:!0},{id:"urbanite",fr:"Score urbanité",nl:"Urbaniteitsscore",en:"Urbanity score",field:"score_urbanite",gradient:u.bl,format:H,free:!0},{id:"risque_r",fr:"Risque rénovation",nl:"Renovatierisico",en:"Renovation risk",field:"indice_risque_renovation",gradient:u.rs,format:Z,invert:!0,free:!0}]},{id:"cadre",emoji:"",fr:"Sécurité & Transport",nl:"Veiligheid & Transport",en:"Safety & Transport",layers:[{id:"faits",fr:"Faits / 1000 hab.",nl:"Feiten / 1000 inw.",en:"Incidents / 1000 inhab.",field:"nb_faits_pour_1000_hab",gradient:u.rg,format:Z,invert:!0,free:!0},{id:"cambr",fr:"Cambriolages / 1000 hab.",nl:"Inbraken / 1000 inw.",en:"Burglaries / 1000 inhab.",field:"nb_cambriolages_pour_1000_hab",gradient:u.rg,format:t=>t!=null?Number(t).toFixed(1):"—",invert:!0,free:!0},{id:"evol_cr",fr:"Évolution criminalité 5a",nl:"Evolutie criminaliteit 5j",en:"Crime change 5 yrs",field:"evol_criminalite_5ans_pct",gradient:u.rg,format:ne,invert:!0,free:!0},{id:"transp",fr:"Score transport",nl:"Transportscore",en:"Transport score",field:"score_transport",gradient:u.tl,format:H,free:!0},{id:"trains",fr:"Trains / jour",nl:"Treinen / dag",en:"Trains / day",field:"trains_par_jour",gradient:u.bl,format:Z,free:!0}]},{id:"rend",emoji:"",fr:"Rendement & Loyers",nl:"Rendement & Huur",en:"Yield & Rent",layers:[{id:"rend_m",fr:"Rendement brut maison",nl:"Brutorendement woning",en:"Gross house yield",field:"rendement_brut_maison_pct",gradient:u.gn,format:G},{id:"rend_a",fr:"Rendement brut appart.",nl:"Brutorendement appart.",en:"Gross apt. yield",field:"rendement_brut_appart_pct",gradient:u.gn,format:G},{id:"loyer_m",fr:"Loyer médian maison",nl:"Mediaan huur woning",en:"Median house rent",field:"loyer_median_maison",gradient:u.tl,format:Ge},{id:"loyer_a",fr:"Loyer médian appart.",nl:"Mediaan huur appart.",en:"Median apt. rent",field:"loyer_median_appart",gradient:u.tl,format:Ge},{id:"evol_l",fr:"Évolution loyer maison 3a",nl:"Evolutie huur woning 3j",en:"House rent change 3 yrs",field:"evol_loyer_maison_3ans_pct",gradient:u.gn,format:ne}]},{id:"fisc",emoji:"",fr:"Fiscalité",nl:"Fiscaliteit",en:"Taxation",layers:[{id:"pri",fr:"Centimes additionnels PRI",nl:"Opcentiemen OV",en:"Additional PRI surcharges",field:"centimes_additionnels_pri",gradient:u.rs,format:Z,invert:!0},{id:"cout_f",fr:"Coût fiscal annuel",nl:"Jaarlijkse fiscale kost",en:"Annual tax cost",field:"cout_fiscal_annuel_estime",gradient:u.rs,format:Ge,invert:!0},{id:"ipp",fr:"Taux additionnel IPP",nl:"Aanvullende PB",en:"Additional PIT rate",field:"taux_additionnel_ipp_pct",gradient:u.rs,format:G,invert:!0}]},{id:"scores",emoji:"",fr:"Scores Arcanes",nl:"Arcanes Scores",en:"Arcanes Scores",layers:[{id:"ais",fr:"Score investissement",nl:"Investeringsscore",en:"Investment score",field:"arcanes_investment_score",gradient:u.rg,format:H},{id:"rds",fr:"Demande locative",nl:"Huurvraag",en:"Rental demand",field:"rental_demand_score",gradient:u.bl,format:H},{id:"tod",fr:"Tension offre/demande",nl:"Vraag/aanbod spanning",en:"Supply/demand tension",field:"tension_offre_demande",gradient:u.am,format:G},{id:"rpi",fr:"Potentiel rénovation",nl:"Renovatiepotentieel",en:"Renovation potential",field:"renovation_potential_index",gradient:u.am,format:H},{id:"fas",fr:"Attractivité familles",nl:"Gezinsaantrekkelijkheid",en:"Family attractiveness",field:"family_attractiveness_score",gradient:u.gn,format:H},{id:"pfi",fr:"Prévision prix",nl:"Prijsvoorspelling",en:"Price forecast",field:"price_forecast_index",gradient:u.rg,format:t=>t!=null?`${t>=0?"+":""}${Math.round(t)}`:"—"},{id:"opp",fr:"Opportunités",nl:"Kansen",en:"Opportunities",field:"opportunity_score",gradient:u.am,format:Z}]}
7,{id:"strat",emoji:"",fr:"Stratégies combinées",nl:"Gecombineerde strategieën",en:"Combined Strategies",layers:[{id:"s_cash",fr:"Cashflow Max",nl:"Max Cashflow",en:"Max Cashflow",field:"_c",gradient:u.rg,format:H,composite:{fields:["rendement_brut_maison_pct","rental_demand_score","prix_maison_median"],inverts:[!1,!1,!0],descFr:"Rendement brut + Demande locative + Prix bas",descNl:"Brutorendement + Huurvraag + Lage prijs",descEn:"Gross yield + Rental demand + Low price"}},{id:"s_secu",fr:"Investissement sûr",nl:"Veilige investering",en:"Safe investment",field:"_c",gradient:u.rg,format:H,composite:{fields:["arcanes_investment_score","score_securite_criminalite","affordability_ratio"],inverts:[!1,!1,!0],descFr:"Score Arcanes + Sécurité + Accessibilité",descNl:"Arcanes Score + Veiligheid + Betaalbaarheid",descEn:"Arcanes Score + Safety + Affordability"}},{id:"s_plus",fr:"Plus-value potentielle",nl:"Potentiële meerwaarde",en:"Potential capital gain",field:"_c",gradient:u.rg,format:H,composite:{fields:["price_forecast_index","evol_prix_maison_5ans_pct","tension_offre_demande"],inverts:[!1,!1,!1],descFr:"Prévision prix + Évolution 5a + Tension marché",descNl:"Prijsvoorspelling + Evolutie 5j + Marktspanning",descEn:"Price forecast + 5yr change + Market tension"}}]}],ie=xe.flatMap(t=>t.layers),U=t=>ie.find(d=>d.id===t),Jn=["Anvers","Brabant flamand","Brabant wallon","Bruxelles","Flandre occidentale","Flandre orientale","Hainaut","Liège","Limbourg","Luxembourg","Namur"],Xn=t=>{if(!t)return"";if(t==="04000")return"Bruxelles";if(t==="02000")return"Flandre";if(t==="03000")return"Wallonie";const d=parseInt(t);return d>=2e4&&d<3e4?"Flandre":d>=3e4&&d<4e4?"Wallonie":d>=4e4?"Bruxelles":""},ge=t=>String((t==null?void 0:t.NSI)||(t==null?void 0:t.NIS)||(t==null?void 0:t.NIS5)||(t==null?void 0:t.nis)||(t==null?void 0:t.cd_munty_refnis)||(t==null?void 0:t.CD_MUNTY_REFNIS)||(t==null?void 0:t.niscode)||(t==null?void 0:t.NISCODE)||"");function Ce(t,d){const o=[];return t.forEach(k=>{const _=k[d];_!=null&&!isNaN(Number(_))&&o.push(Number(_))}),o.length?(o.sort((k,_)=>k-_),{min:o[Math.floor(o.length*.05)],max:o[Math.floor(o.length*.95)]}):{min:0,max:100}}function un(t,d,o,k,_){if(t==null||isNaN(t))return"#E8E4DE";let v=(t-d)/(o-d);return v=Math.max(0,Math.min(1,v)),_&&(v=1-v),k[Math.min(Math.floor(v*(k.length-1)),k.length-1)]}function et(t,d,o,k){let _=0,v=0;for(let y=0;y<d.length;y++){const A=t[d[y]];if(A==null)continue;const l=k.get(d[y]);if(!l||l.max===l.min)continue;let z=(Number(A)-l.min)/(l.max-l.min);z=Math.max(0,Math.min(1,z)),o[y]&&(z=1-z),_+=z,v++}return v>0?_/v*100:null}const nt=t=>t==null?{bg:"#F0EDE8",fg:"#7A7670"}:t>=70?{bg:"#dcfce7",fg:"#16a34a"}:t>=50?{bg:"#fef9c3",fg:"#ca8a04"}:t>=30?{bg:"#fed7aa",fg:"#ea580c"}:{bg:"#fecaca",fg:"#dc2626"},gn=[50.5,4.5],tt=[[49.1,1.8],[51.8,7]],Ae=50;async function it(t,d,o,k,_="fr"){const v=(y,A,l)=>_==="nl"?A:_==="en"?l:y;try{const A=(await ln(()=>import("./jspdf.es.min-DJr0GaCK.js").then(b=>b.j),__vite__mapDeps([0,1,2]))).default;try{await ln(()=>import("./jspdf.plugin.autotable-CyVc7Jkq.js"),[])}catch{}const l=new A({orientation:"landscape",unit:"mm",format:"a4"}),z=l.internal.pageSize.getWidth(),w=14;l.setFillColor(15,76,76),l.rect(0,0,z,22,"F"),l.setFont("helvetica","bold"),l.setFontSize(16),l.setTextColor(255,255,255),l.text("Arcanes",w,14),l.setFontSize(9),l.setFont("helvetica","normal"),l.text(v("Screener Immobilier — Rapport","Vastgoedscreener — Rapport","Property Screener — Report"),55,14),l.setFontSize(7),l.text(new Date().toLocaleDateString("fr-BE",{day:"2-digit",month:"long",year:"numeric"}),z-w,14,{align:"right"}),l.setFillColor(212,175,55),l.rect(0,22,z,1,"F");let F=30;l.setTextColor(13,17,9),l.setFontSize(9),l.setFont("helvetica","bold"),l.text(v("Indicateurs","Indicatoren","Indicators"),w,F),F+=5,l.setFont("helvetica","normal"),l.setFontSize(8);const p=d.filter(b=>!b.composite).map(b=>_==="nl"?b.nl:_==="en"?b.en:b.fr),C=d.find(b=>b.composite);C&&p.push(_==="nl"?C.nl:_==="en"?C.en:C.fr),l.text(p.join(" | ")||"--",w,F),F+=4,k.size>0&&(l.text([...k].join(", "),w,F),F+=4),l.text(`${t.length} ${v("communes","gemeenten","municipalities")}`,w,F),F+=8;const m=["#",v("Commune","Gemeente","Municipality"),v("Province","Provincie","Province"),...d.filter(b=>!b.composite).map(b=>(_==="nl"?b.nl:_==="en"?b.en:b.fr).substring(0,20))],M=t.slice(0,60).map((b,E)=>{const B=[String(E+1),_==="nl"&&b.nom_commune_nl||b.nom_commune,b.nom_province||""];return d.filter(j=>!j.composite).forEach(j=>{B.push(j.format(b[j.field]))}),B});if(typeof l.autoTable=="function")l.autoTable({head:[m],body:M,startY:F,theme:"grid",styles:{fontSize:7,cellPadding:1.5,font:"helvetica"},headStyles:{fillColor:[15,76,76],textColor:255,fontStyle:"bold"},alternateRowStyles:{fillColor:[247,245,242]},margin:{left:w,right:w}});else{const b=m.length,E=(z-w*2)/b,B=5;l.setFillColor(15,76,76),l.rect(w,F,z-w*2,B,"F"),l.setFont("helvetica","bold"),l.setFontSize(6),l.setTextColor(255,255,255),m.forEach((j,re)=>l.text(j,w+re*E+1,F+3.5)),F+=B,l.setFont("helvetica","normal"),l.setTextColor(13,17,9),M.forEach((j,re)=>{F+B>l.internal.pageSize.getHeight()-10&&(l.addPage(),F=10),re%2===1&&(l.setFillColor(247,245,242),l.rect(w,F,z-w*2,B,"F")),l.setTextColor(13,17,9),j.forEac
7h((S,ae)=>l.text(String(S).substring(0,22),w+ae*E+1,F+3.5)),F+=B})}const f=l.internal.pageSize.getHeight();l.setFillColor(15,76,76),l.rect(0,f-8,z,8,"F"),l.setFontSize(6),l.setTextColor(255,255,255),l.text("arcanes.be — See Beyond the Bricks",w,f-3),l.text(v("Document informatif — ne constitue pas un conseil en investissement","Informatief document — geen beleggingsadvies","Informational document — not investment advice"),z-w,f-3,{align:"right"}),l.save(`arcanes-screener-${new Date().toISOString().slice(0,10)}.pdf`)}catch(y){console.error("PDF export failed:",y)}}const rt=`
8/* Scope reset — override global arcanes.css !important rules (explicit px, not inherit) */
9.xp button,.xp .btn{font-size:10px!important;padding:4px 10px!important;min-height:auto!important;border-radius:7px!important}
10.xp h1{font-size:clamp(24px,4vw,38px)!important;font-weight:800!important;letter-spacing:-1.5px!important;margin-bottom:10px!important}
11.xp h2{font-size:16px!important;font-weight:700!important;margin-bottom:6px!important}
12.xp h3{font-size:13px!important;font-weight:700!important;margin-bottom:4px!important}
13.xp p{font-size:12px!important;line-height:1.5!important}
14.xp label{font-size:10px!important;line-height:1.4!important}
15.xp small{font-size:9px!important}
16.xp input,.xp textarea,.xp select{font-size:11px!important;line-height:1.4!important}
17.xp section{padding:0!important}
18@media(min-width:1024px){.xp button,.xp .btn{font-size:10px!important;padding:4px 10px!important;min-height:auto!important;border-radius:7px!important}.xp h1{font-size:clamp(24px,4vw,38px)!important}.xp h2{font-size:16px!important}.xp p{font-size:12px!important}.xp label{font-size:10px!important}.xp input,.xp select{font-size:11px!important}}
19@media(min-width:1280px){.xp button,.xp .btn{font-size:10px!important;padding:4px 10px!important;min-height:auto!important;border-radius:7px!important}.xp h1{font-size:clamp(24px,4vw,38px)!important}.xp h2{font-size:16px!important}.xp p{font-size:12px!important}.xp label{font-size:10px!important}.xp input,.xp select{font-size:11px!important}}
20.xp{font-family:'Outfit',sans-serif;background:#F7F5F2;min-height:100vh}.xp *{box-sizing:border-box}.xp-w{max-width:1440px;margin:0 auto;padding:0 20px}
21.xp-hero{background:linear-gradient(180deg,white 0%,#F7F5F2 100%);padding-top:72px}
22.xp-hero-inner{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;padding:10px 0 6px}
23.xp-hero-left{flex:1;
23min-width:200px}
24.xp-hero-eyebrow{display:inline-flex;align-items:center;gap:5px;font-size:10px;font-weight:700;color:#0F4C4C;text-transform:uppercase;letter-spacing:1px;margin-bottom:6px}
25.xp-hero-eyebrow::before{content:'';width:20px;height:2px;background:#D4AF37;border-radius:1px}
26.xp-hero h1{font-family:'Outfit',sans-serif;font-size:clamp(22px,3.5vw,32px);font-weight:800;letter-spacing:-1px;color:#0D1109;margin:0;line-height:1.1}
27.xp-hero h1 span{color:#0F4C4C}
28.xp-hero-sub{font-size:12px;color:#7A7670;margin-top:4px;line-height:1.4;max-width:420px}
29@media(max-width:640px){.xp-hero-sub{font-size:11px;margin-top:2px}.xp-hero-inner{padding:8px 0 4px}.xp-hero-eyebrow{font-size:9px;margin-bottom:3px}.xp-hero h1{font-size:22px}}
30.xp-hero-stats{display:flex;gap:16px;flex-wrap:wrap}
31@media(max-width:640px){.xp-hero-stats{display:none}}
32.xp-hero-stat{text-align:center}.xp-hero-stat-n{font-size:18px;font-weight:800;color:#0F4C4C}.xp-hero-stat-l{font-size:9px;color:#B8B4AE;text-transform:uppercase;letter-spacing:.3px;font-weight:600}
33.xp-bar{display:flex;align-items:center;gap:6px;padding:7px 0;flex-wrap:wrap}
34@media(max-width:640px){.xp-bar{gap:4px;padding:5px 0}.xp-srch{max-width:130px;min-width:80px}.xp-add{font-size:9px!important;padding:3px 8px!important}.xp-btn-s{padding:3px 7px!important;font-size:9px!important}.xp-vt button{padding:3px 7px!important}.xp-cnt{font-size:9px}}
35.xp-srch{display:flex;align-items:center;gap:4px;background:white;border:1.5px solid #E8E4DE;border-radius:9px;padding:3px 5px 3px 10px;min-width:100px;max-width:170px;flex:1}.xp-srch:focus-within{border-color:rgba(15,76,76,.3)}.xp-srch input{border:none;outline:none;font-size:11px;font-family:'Outfit',sans-serif;color:#0D1109;background:transparent;height:26px;width:100%}.xp-srch input::placeholder{color:#B8B4AE}
36.xp-add{padding:4px 11px!important;border-radius:8px!important;font-size:10px!important;font-weight:600;border:1.5px solid #0F4C4C;background:rgba(15,76,76,.04);color:#0F4C4C;cursor:pointer;font-family:'Outfit',sans-serif;display:inline-flex;align-items:center;gap:4px;transition:all .12s;min-height:auto!important}.xp-add:hover{background:rgba(15,76,76,.1)}.xp-add.empty{border-style:dashed;border-color:#D4AF37;color:#B88A2E;background:rgba(212,175,55,.04);animation:xp-pulse 2s ease-in-out infinite}.xp-add.empty:hover{border-color:#0F4C4C;color:#0F4C4C;background:rgba(15,76,76,.04);animation:none}
37@keyframes xp-pulse{0%,100%{box-shadow:0 0 0 0 rgba(212,175,55,0)}50%{box-shadow:0 0 0 4px rgba(212,175,55,.12)}}
38.xp-ind-cnt{font-size:8px;font-weight:800;background:#0F4C4C;color:white;border-radius:4px;padding:1px 5px;min-width:14px;text-align:center}
39.xp-reset{background:none;border:none;cursor:pointer;padding:2px;color:#7A7670;display:inline-flex;align-items:center;gap:2px;font-size:9px;font-weight:600;font-family:'Outfit',sans-serif}.xp-reset:hover{color:#dc2626}
40.xp-btn-s{padding:4px 9px!important;border-radius:7px!important;font-size:10px!important;font-weight:600;border:1.5px solid #E8E4DE;background:white;color:#7A7670;cursor:pointer;font-family:'Outfit',sans-serif;display:inline-flex;align-items:center;gap:3px;transition:all .1s;min-height:auto!important}.xp-btn-s:hover{border-color:#0F4C4C;color:#0F4C4C}.xp-btn-s.has{border-color:rgba(15,76,76,.3);color:#0F4C4C}
41.xp-pk{position:absolute;top:calc(100% + 4px);left:0;background:white;border:1px solid #E8E4DE;border-radius:13px;box-shadow:0 10px 36px rgba(0,0,0,.14);z-index:40;width:320px;max-height:65vh;overflow-y:auto;padding:4px 0}
42@media(max-width:640px){.xp-pk{position:fixed;left:0;right:0;bottom:0;top:auto;width:100%;max-height:75vh;border-radius:16px 16px 0 0;box-shadow:0 -8px 32px rgba(0,0,0,.18)}}
43.xp-pk-head{display:flex;align-items:center;justify-content:space-between;padding:10px 14px 6px;border-bottom:1px solid #F0EDE8;position:sticky;top:0;background:white;z-index:1}
44.xp-pk-done{display:none}
45.xp-pk-reset{padding:3px 8px!important;border-radius:5px!important;border:1px solid #E8E4DE;background:white;color:#7A7670;font-size:9px!important;font-weight:600;font-family:'Outfit',sans-serif;cursor:pointer;display:inline-flex;align-items:center;gap:3px;min-height:auto!important}
45.xp-pk-reset:hover{color:#dc2626;border-color:#fecaca}
46.xp-pk-act{flex:1;padding:5px 0!important;border-radius:6px!important;font-size:9px!important;font-weight:700;cursor:pointer;font-family:'Outfit',sans-serif;display:flex;align-items:center;justify-content:center;gap:4px;min-height:auto!important}
47.xp-ss-apply{padding:2px 8px!important;border-radius:5px!important;font-size:8px!important;font-weight:700;border:1px solid #0F4C4C;background:white;color:#0F4C4C;cursor:pointer;font-family:'Outfit',sans-serif;min-height:auto!important}
48.xp-more{width:100%;padding:5px 0!important;border:1.5px solid #E8E4DE;border-radius:7px!important;background:white;font-size:9px!important;font-weight:600;color:#0F4C4C;cursor:pointer;font-family:'Outfit',sans-serif;margin-top:3px;min-height:auto!important}
49.xp-cta-gold{padding:7px 16px!important;border-radius:7px!important;border:none;background:#D4AF37;color:#0D1109;font-size:10px!important;font-weight:700;font-family:'Outfit',sans-serif;cursor:pointer;display:inline-flex;align-items:center;gap:4px;min-height:auto!important}
50.xp-cta-teal{width:100%;padding:9px 0!important;border:none;border-radius:8px!important;background:#0F4C4C;color:white;font-size:11px!important;font-weight:700;font-family:'Outfit',sans-serif;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:4px;min-height:auto!important}
51.xp-pk-cat{padding:6px 14px 3px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.7px;color:#B8B4AE;display:flex;align-items:center;gap:5px;border-top:1px solid #F0EDE8}.xp-pk-cat:first-child{border-top:none}
52.xp-pk-item{display:flex;align-items:center;gap:9px;padding:7px 14px;cursor:pointer;transition:background .08s;min-height:38px}.xp-pk-item:hover{background:rgba(15,76,76,.03)}.xp-pk-item.on{background:rgba(15,76,76,.06)}
53@media(max-width:640px){.xp-pk-item{padding:10px 14px;min-height:44px}}
54.xp-pk-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0}
55.xp-pk-cb{width:14px;height:14px;border:1.5px solid #C8C4BE;border-radius:3px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:8px;transition:all .1s}.xp-pk-cb.on{background:#0F4C4C;border-color:#0F4C4C;color:white}
56.xp-pk-name{font-size:11px;font-weight:600;color:#0D1109;display:flex;align-items:center;gap:4px}
57.xp-pk-range{font-size:8px;color:#B8B4AE;margin-top:1px}
58.xp-pk-comp{font-size:8px;color:#7A7670;margin-top:1px;font-style:italic}
59.xp-pk-free{font-size:7px;font-weight:700;color:#059669;background:rgba(5,150,105,.08);padding:0 4px;border-radius:3px}
60.xp-pk-lock{font-size:7px;font-weight:800;color:#D4AF37;display:inline-flex;align-items:center;gap:2px}
61.xp-pk-backdrop{display:none}
62@media(max-width:640px){.xp-pk-backdrop{display:block;position:fixed;inset:0;background:rgba(0,0,0,.3);z-index:39}}
63.xp-dd{position:relative;display:inline-block}
64.xp-dd-list{position:absolute;top:calc(100% + 3px);left:0;background:white;border:1px solid #E8E4DE;border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,.1);z-index:20;min-width:155px;max-height:200px;overflow-y:auto;padding:3px 0}
65@media(max-width:640px){.xp-dd-list{position:fixed;left:20px;right:20px;top:auto;bottom:60px;width:auto;max-height:50vh;border-radius:12px;box-shadow:0 -8px 32px rgba(0,0,0,.15)}}.xp-dd-item{display:flex;align-items:center;gap:6px;padding:5px 11px;font-size:11px;color:#0D1109;cursor:pointer}.xp-dd-item:hover{background:rgba(15,76,76,.03)}.xp-dd-cb{width:12px;height:12px;border:1.5px solid #C8C4BE;border-radius:3px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:7px}.xp-dd-cb.on{background:#0F4C4C;border-color:#0F4C4C;color:white}
66.xp-vt{display:inline-flex;border:1.5px solid #E8E4DE;border-radius:8px;overflow:hidden}.xp-vt button{padding:4px 9px!important;border:none;background:white;cursor:pointer;display:flex;align-items:center;gap:2px;font-size:10px!important;font-weight:600;color:#7A7670;font-family:'Outfit',sans-serif;transition:all .1s;min-height:auto!important;border-radius:0!important}.xp-vt button:not(:last-child){border-right:1px solid #E8E4DE}.xp-vt button.on{background:#0F4C4C;color:white}
67.xp-cnt{font-size:10px;color:#B8B4AE;font-weight:500;margin-left:auto;white-space:nowrap}
68.xp-main{display:flex;flex-direction:column;gap:0}@media(min-width:1024px){.xp-main{flex-direction:row;gap:12px;height:calc(100vh - 190px)}}
69.xp-map{position:relative;border-radius:13px;overflow:hidden;border:1px solid #E8E4DE;flex-shrink:0}
70.xp-map.m-hybrid{width:100%;height:40vh;min-height:240px}@media(min-width:1024px){.xp-map.m-hybrid{width:var(--map-w,55%);min-width:45%;height:100%;transition:width .3s ease}}@media(max-width:640px){.xp-map.m-hybrid{height:30vh;min-height:180px;border-radius:10px}}
71.xp-map.m-table{display:none}
72.xp-right{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}.xp-right.full{max-width:100%}
73.xp-list{flex:1;overflow-y:auto;overflow-x:auto;scrollbar-width:thin;scrollbar-color:#E8E4DE transparent;padding-top:4px}.xp-list::-webkit-scrollbar{width:3px}.xp-list::-webkit-scrollbar-thumb{background:#E8E4DE;border-radius:2px}
74.xp-tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:10px;table-layout:auto}
75.xp-right:not(.full) .xp-tbl.cols-many{table-layout:fixed}
76.xp-right:not(.full) .xp-tbl{font-size:9px}
77.xp-right:not(.full) .xp-tbl th{padding:5px 5px;font-size:10px}
78.xp-right:not(.full) .xp-tbl td{padding:3px 5px;font-size:9px}
79.xp-right:not(.full) .xp-list{overflow-x:hidden;padding-left:8px;padding-right:4px}
80.xp-trunc-note{font-size:8px;color:#0F4C4C;text-align:center;padding:3px 8px;font-weight:600;background:rgba(15,76,76,.03);border-radius:5px;margin-bottom:2px;cursor:pointer;transition:background .1s}.xp-trunc-note:hover{background:rgba(15,76,76,.07)}
81.xp-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:30px 16px;color:#7A7670}
82.xp-dov{position:absolute;inset:0;z-index:10;background:white;border-radius:13px;overflow-y:auto;transform:translateX(100%);transition:transform .25s cubic-bezier(.4,0,.2,1);opacity:0}.xp-dov.open{transform:translateX(0);opacity:1}
83.xp-det{padding:16px}.xp-det-back{display:inline-flex;align-items:center;gap:3px;background:none;border:none;font-size:10px;font-weight:600;color:#7A7670;cursor:pointer;padding:0;font-family:'Outfit',sans-serif;margin-bottom:6px}.xp-det-back:hover{color:#0F4C4C}
84.xp-det-name{font-size:17px;font-weight:800;color:#0D1109;letter-spacing:-.3px}.xp-det-sub{font-size:9px;color:#B8B4AE;margin-top:1px}
85.xp-det-grid{display:grid;grid-template-columns:1fr 1fr;gap:5px;margin:10px 0}@media(min-width:500px){.xp-det-grid{grid-template-columns:1fr 1fr 1fr}}
86.xp-dk{background:#FAFAF8;border:1px solid #F0EDE8;border-radius:7px;padding:6px;position:relative;overflow:hidden}.xp-dkl{font-size:7px;color:#B8B4AE;text-transform:uppercase;letter-spacing:.2px;font-weight:600;margin-bottom:1px}.xp-dkv{font-size:12px;font-weight:800;color:#0D1109;font-variant-numeric:tabular-nums}.xp-dk.lk .xp-dkv{filter:blur(6px);user-select:none}.xp-dk .xp-lov{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:2}
87.xp-det-link{display:inline-flex;align-items:center;gap:4px;padding:7px 12px;border-radius:8px;background:#0F4C4C;color:white;font-size:10px;font-weight:700;font-family:'Outfit',sans-serif;text-decoration:none}.xp-det-link:hover{background:#0A3535}
88.xp-row{display:flex;align-items:center;gap:8px;background:white;border:1px solid #E8E4DE;border-radius:10px;padding:8px 11px;margin-bottom:4px;cursor:pointer;transition:all .1s}
89.xp-row:hover{border-color:rgba(15,76,76,.15);transform:translateY(-1px)}.xp-row.sel{border-color:#0F4C4C;box-shadow:0 0 0 2px rgba(15,76,76,.08)}.xp-row.hov{border-color:rgba(15,76,76,.25);background:rgba(15,76,76,.02)}
90.xp-row-left{min-width:100px;max-width:140px;flex-shrink:0}
91@media(max-width:640px){.xp-row{flex-wrap:wrap}.xp-row-left{min-width:auto;max-width:none;width:100%}}
92.xp-rn{font-size:11px;font-weight:700;color:#0D1109;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xp-rs{font-size:8px;color:#B8B4AE;margin-top:1px}
93.xp-rm{display:flex;gap:7px;flex-wrap:wrap;align-items:center;flex:1}
94.xp-m{min-width:38px}.xp-ml{font-size:7px;color:#B8B4AE;text-transform:uppercase;letter-spacing:.2px;font-weight:600;line-height:1}.xp-mv{font-size:10px;font-weight:700;color:#0D1109;font-variant-numeric:tabular-nums;margin-top:1px}.xp-mv.g{color:#059669}.xp-mv.r{color:#dc2626}
95.xp-blur{filter:blur(5px);user-select:none;pointer-events:none;display:inline-block}
96.xp-tbl th{position:sticky;top:0;background:white;padding:7px 8px;text-align:left;font-size:11px;font-weight:700;color:#0F4C4C;border-bottom:2px solid #0F4C4C;cursor:pointer;user-select:none;white-space:nowrap;z-index:5}.xp-tbl th:hover{background:#F0FDFA}.xp-tbl th.num{text-align:right}
97.xp-tbl td{padding:6px 8px;border-bottom:1px solid #F0EDE8;font-variant-numeric:tabular-nums;color:#0D1109}.xp-tbl td.num{text-align:right}
98.xp-tbl tr:hover{background:rgba(15,76,76,.02)}.xp-tbl tr.sel{background:rgba(15,76,76,.05)}.xp-tbl tr.hov{background:rgba(15,76,76,.04)}
99.xp-tbl .lk-cell{color:#D4AF37;cursor:pointer;font-weight:600;font-size:9px}
100.xp-leg{position:absolute;bottom:6px;left:6px;z-index:5;background:rgba(255,255,255,.92);backdrop-filter:blur(6px);border-radius:8px;padding:6px 9px;border:1px solid #E8E4DE;
100font-size:7px;min-width:140px;max-width:200px}.xp-leg-bar{display:flex;height:4px;border-radius:2px;overflow:hidden;width:100%;min-width:80px;margin:2px 0}
101.xp-mo-bg{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:100;display:flex;align-items:center;justify-content:center;padding:20px;opacity:0;pointer-events:none;transition:opacity .2s}.xp-mo-bg.open{opacity:1;pointer-events:auto}.xp-mo{background:white;border-radius:14px;max-width:320px;width:100%;padding:22px 18px;position:relative;box-shadow:0 16px 44px rgba(0,0,0,.15);transform:scale(.95);transition:transform .2s}.xp-mo-bg.open .xp-mo{transform:scale(1)}.xp-mo-x{position:absolute;top:8px;right:8px;background:rgba(0,0,0,.05);border:none;border-radius:5px;width:22px;height:22px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#7A7670}
102.xp-bs{display:none;position:fixed;bottom:0;left:0;right:0;z-index:40;background:white;border-top-left-radius:14px;border-top-right-radius:14px;box-shadow:0 -4px 14px rgba(0,0,0,.08);transition:transform .3s;max-height:70vh;overflow:hidden}
103@media(max-width:1023px){.xp-bs{display:block}.xp-right:not(.full){display:none}.xp-map.m-hybrid{width:100%;margin:0}.xp-right.full{padding:0 4px}.xp-right.full .xp-list{padding-left:8px;padding-right:8px}.xp-col-pop{position:fixed!important;left:16px!important;right:16px!important;top:auto!important;bottom:60px!important;width:auto!important;border-radius:12px;box-shadow:0 -8px 32px rgba(0,0,0,.15)}}.xp-bs-handle{width:28px;height:3px;background:#E0DCD5;border-radius:2px;margin:7px auto 3px}.xp-bs-head{display:flex;align-items:center;justify-content:space-between;padding:4px 14px 8px;cursor:pointer;gap:6px}.xp-bs-scroll{overflow-y:auto;max-height:calc(70vh - 44px);padding:4px 8px 14px}
104.xp-tip{background:white!important;border:none!important;border-radius:6px!important;box-shadow:0 3px 8px rgba(0,0,0,.1)!important;padding:5px 8px!important;font-size:9px!important;font-family:'Outfit',sans-serif!important}.xp-tip strong{color:#0F4C4C}.leaflet-tooltip-left.xp-tip::before,.leaflet-tooltip-right.xp-tip::before{display:none}
105.xp-seo{max-width:800px;margin:0 auto;padding:40px 20px}
106@media(max-width:640px){.xp-seo{padding:24px 16px}}
107.xp-seo h2{font-size:18px;font-weight:800;color:#0D1109;margin:0 0 8px;letter-spacing:-.3px}
108.xp-seo p{font-size:12px;color:#7A7670;line-height:1.6;margin:0 0 12px}
109.xp-seo details{border:1px solid #E8E4DE;border-radius:8px;margin-bottom:4px;background:white}
110.xp-seo summary{padding:10px 14px;font-size:12px;font-weight:600;color:#0D1109;cursor:pointer;list-style:none}
111.xp-seo summary::-webkit-details-marker{display:none}
112.xp-seo details[open] summary{border-bottom:1px solid #F0EDE8}
113.xp-seo details p{padding:10px 14px;margin:0}
114@keyframes xp-in{from{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}.xp-a{animation:xp-in .12s ease-out both}
115/* Column header popover */
116.xp-col-pop{position:absolute;top:100%;right:0;background:white;border:1px solid #E8E4DE;border-radius:10px;box-shadow:0 8px 28px rgba(0,0,0,.14);z-index:50;width:190px;padding:10px;margin-top:4px}
117.xp-col-pop-title{font-size:10px;font-weight:700;color:#0D1109;padding:0 0 6px;border-bottom:1px solid #F0EDE8;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
118.xp-col-sort{display:flex;gap:4px;margin-bottom:10px}
119.xp-col-sort button{flex:1;padding:6px 0!important;border:1.5px solid #E8E4DE;border-radius:6px!important;background:white;font-size:9px!important;font-weight:600;color:#7A7670;cursor:pointer;font-family:'Outfit',sans-serif;transition:all .1s;min-height:auto!important}.xp-col-sort button:hover{border-color:#0F4C4C;color:#0F4C4C}.xp-col-sort button.on{background:#0F4C4C;color:white;border-color:#0F4C4C}
120.xp-col-range{display:flex;flex-direction:column;gap:4px}
121.xp-col-range label{font-size:9px;font-weight:700;color:#0F4C4C;letter-spacing:.2px}
122.xp-col-range-row{display:flex;align-items:center;gap:6px}
123.xp-col-range input{flex:1;border:1.5px solid #E8E4DE;border-radius:6px;padding:5px 8px;font-size:10px;font-family:'Outfit',sans-serif;text-align:right;outline:none;color:#0D1109;background:white;
123width:65px;-moz-appearance:textfield;appearance:textfield}
124.xp-col-range input::-webkit-outer-spin-button,.xp-col-range input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0;display:none}
125.xp-col-range input:focus{border-color:#0F4C4C;box-shadow:0 0 0 2px rgba(15,76,76,.08)}.xp-col-range input::placeholder{color:#C8C4BE}
126.xp-col-clear{width:100%;padding:5px 0!important;border:1.5px solid #E8E4DE;border-radius:6px!important;background:white;font-size:9px!important;font-weight:600;color:#7A7670;cursor:pointer;font-family:'Outfit',sans-serif;margin-top:6px;min-height:auto!important}.xp-col-clear:hover{color:#dc2626;border-color:#fecaca}
127.xp-fx{background:none;border:none;cursor:pointer;padding:1px;color:#B8B4AE;display:inline-flex;border-radius:3px}.xp-fx:hover{color:#dc2626;background:rgba(220,38,38,.06)}
128/* Suggestions dropdown override */
129.xp-sug-dd{position:absolute;top:calc(100% + 4px);right:0;left:auto;width:290px}
130`,xn={prix_maison_median:"Prix médian des maisons vendues sur les 12 derniers mois dans la commune. Calculé sur base des actes notariés enregistrés. Source : Statbel (SPF Économie).",prix_appart_median:"Prix médian des appartements vendus sur les 12 derniers mois. Certaines communes rurales n'ont pas assez de transactions pour un calcul fiable. Source : Statbel (SPF Économie).",evol_prix_maison_5ans_pct:"Variation en pourcentage du prix médian des maisons sur 5 ans. Permet de mesurer la dynamique de valorisation à moyen terme. Source : Statbel, calcul Arcanes.",evol_prix_maison_10ans_pct:"Variation en pourcentage du prix médian des maisons sur 10 ans. Indicateur de tendance long terme du marché immobilier local. Source : Statbel, calcul Arcanes.",nb_transactions_total:"Nombre total de transactions immobilières enregistrées dans la commune sur l'année. Mesure la liquidité du marché local. Source : Statbel (SPF Économie).",ecart_prix_region_pct:"Écart en pourcentage entre le prix médian communal et le prix médian régional (Wallonie, Flandre ou Bruxelles). Un chiffre négatif indique un prix inférieur à la moyenne régionale. Source : calcul Arcanes sur données Statbel.",cout_total_achat_maison:"Coût total estimé d'acquisition d'une maison au prix médian, incluant les droits d'enregistrement régionaux (12,5% Wallonie/Bruxelles, 3% Flandre avec abattement), les frais de notaire et les frais administratifs. Source : calcul Arcanes.",affordability_ratio:"Ratio entre le prix médian d'une maison et le revenu médian annuel des ménages de la commune. Plus le ratio est bas, plus l'immobilier est accessible. Un ratio de 5x signifie qu'il faut 5 années de revenu brut pour acheter. Source : calcul Arcanes sur données Statbel.",population_totale:"Population officielle de la commune au 1er janvier de l'année de référence, selon le Registre national. Source : Statbel (SPF Économie), registre de population.",nb_menages_total:"Nombre total de ménages privés (personnes vivant sous le même toit) dans la commune. Source : Statbel, registre de population.",evol_menages_5ans_pct:"Variation du nombre de ménages sur 5 ans. Une croissance positive indique une attractivité résidentielle et une demande potentielle en logements. Source : Statbel, calcul Arcanes.",part_isoles_pct:"Pourcentage de ménages composés d'une seule personne. Indicateur de la demande en petits logements (studios, appartements 1 chambre). Source : Statbel.",part_familles_avec_enfants_pct:"Pourcentage de ménages avec au moins un enfant mineur. Indicateur de l'attractivité familiale de la commune (écoles, crèches, espaces verts). Source : Statbel.",revenu_median:"Revenu net imposable médian par déclaration fiscale dans la commune. Indicateur du pouvoir d'achat local et de la capacité d'emprunt des résidents. Source : Statbel (données fiscales SPF Finances).",taux_precarite_pct:"Pourcentage de la population bénéficiant d'un revenu d'intégration sociale ou équivalent. Indicateur de fragilité socio-économique. Source : SPP Intégration sociale, via Statbel.",part_bat_avant_1946_pct:"Pourcentage des bâtiments résidentiels construits avant 1946. Indicateur de l'ancienneté du parc immobilier et du potentiel de rénovation. Source : Statbel, registre des bâtiments.",part_bat_apres_2011_pct:"Pourcentage des bâtiments résidentiels construits après 2011. Indicateur de dynamisme constructif et de modernité du parc. Source : Statbel, registre des bâtiments.",part_appartements_pct:"Part des logements de type appartement dans le parc résidentiel total. Indicateur d'urbanisation et de densit
130é. Source : Statbel, registre des bâtiments.",score_urbanite:"Score de 0 à 100 mesurant le degré d'urbanisation basé sur la densité de population, la part d'appartements, la couverture en transports et la diversité des services. Source : calcul Arcanes multi-sources.",indice_risque_renovation:"Indice de 0 à 100 estimant le risque de coûts de rénovation élevés, basé sur l'âge moyen du bâti, la part de logements anciens et les performances énergétiques moyennes. Plus l'indice est élevé, plus le risque est important. Source : calcul Arcanes.",nb_faits_pour_1000_hab:"Nombre total de faits criminels enregistrés par la police pour 1000 habitants. Inclut toutes les catégories (vols, violences, dégradations). Source : Police fédérale (SPF Intérieur), statistiques par zone de police.",nb_cambriolages_pour_1000_hab:"Nombre de cambriolages dans habitations pour 1000 habitants. Indicateur spécifique de sécurité résidentielle. Source : Police fédérale (SPF Intérieur).",evol_criminalite_5ans_pct:"Évolution du nombre total de faits criminels sur 5 ans. Une baisse indique une amélioration de la sécurité. Source : Police fédérale, calcul Arcanes.",score_transport:"Score de 0 à 100 évaluant l'accessibilité en transports en commun, basé sur le nombre de gares, la fréquence des trains, la présence de bus TEC/De Lijn/STIB et la distance aux axes autoroutiers. Source : SNCB/NMBS, TEC, De Lijn, calcul Arcanes.",trains_par_jour:"Nombre de passages de trains par jour dans les gares de la commune (somme de toutes les gares). Source : SNCB/NMBS, horaires officiels.",rendement_brut_maison_pct:"Rendement locatif brut annuel estimé pour une maison : (loyer médian mensuel × 12) / prix médian d'achat × 100. Ne tient pas compte des charges, taxes et vacance locative. Source : calcul Arcanes sur données Statbel (prix) et SPF MyRent (loyers).",rendement_brut_appart_pct:"Rendement locatif brut annuel estimé pour un appartement : (loyer médian mensuel × 12) / prix médian d'achat × 100. Source : calcul Arcanes sur données Statbel et SPF MyRent.",loyer_median_maison:"Loyer mensuel médian des maisons dans la commune, basé sur les contrats de bail enregistrés. Source : SPF Finances — MyRent (contrats enregistrés).",loyer_median_appart:"Loyer mensuel médian des appartements dans la commune. Source : SPF Finances — MyRent.",evol_loyer_maison_3ans_pct:"Évolution du loyer médian des maisons sur 3 ans. Indicateur de la pression locative et de l'attractivité du marché locatif. Source : SPF MyRent, calcul Arcanes.",centimes_additionnels_pri:"Centimes additionnels communaux sur le précompte immobilier (PRI). Multipliés par le revenu cadastral indexé, ils déterminent la taxe foncière annuelle. Varient de ~750 à ~4000 selon les communes. Source : SPF Finances, cadastre.",cout_fiscal_annuel_estime:"Coût fiscal annuel estimé pour un bien au revenu cadastral médian de la commune, incluant le précompte immobilier (base + centimes communaux + centimes provinciaux). Source : calcul Arcanes sur données SPF Finances.",taux_additionnel_ipp_pct:"Taux additionnel communal à l'impôt des personnes physiques (IPP). S'ajoute à l'impôt fédéral et régional. Varie de 0% à ~9% selon les communes. Source : SPF Finances.",arcanes_investment_score:"Score Arcanes de 0 à 100 évaluant le potentiel d'investissement global. Combine Rendement (50%) et Potentiel de valorisation (50%). Le potentiel intègre l'évolution des prix, le momentum, la croissance des ménages, l'attractivité familles et la tension offre/demande. Source : calcul propriétaire Arcanes.",rental_demand_score:"Score de 0 à 100 mesurant la demande locative estimée, basé sur la tension offre/demande, le taux de vacance, la croissance démographique et la présence d'employeurs. Source : calcul Arcanes multi-sources.",tension_offre_demande:"Ratio entre la demande estimée et l'offre disponible sur le marché immobilier local. Un pourcentage élevé indique un marché tendu favorable aux propriétaires. Source : calcul Arcanes.",renovation_potential_index:"Score de 0 à 100 estimant le potentiel de plus-value par rénovation, basé sur l'écart entre les prix du neuf et de l'ancien, l'âge du parc et les performances PEB moyennes. Source : calcul Arcanes.",family_attractiveness_score:"Score de 0 à 100 évaluant l'attractivité pour les familles avec enfants, basé sur les écoles, crèches, espace
130s verts, sécurité, transports et services de proximité. Source : calcul Arcanes multi-sources.",price_forecast_index:"Indice de prévision de l'évolution des prix à 2-3 ans, basé sur les tendances historiques, la démographie, l'offre de construction et les facteurs macro-économiques. Un chiffre positif indique une hausse attendue. Source : modèle prédictif Arcanes.",opportunity_score:"Score synthétique de 0 à 100 identifiant les communes sous-évaluées par rapport à leurs fondamentaux (qualité de vie, accessibilité, croissance). Source : calcul Arcanes."},fn={prix_maison_median:"Mediaanprijs van woningen verkocht in de afgelopen 12 maanden in de gemeente. Berekend op basis van geregistreerde notariële akten. Bron: Statbel (FOD Economie).",prix_appart_median:"Mediaanprijs van appartementen verkocht in de afgelopen 12 maanden. Sommige landelijke gemeenten hebben onvoldoende transacties voor een betrouwbare berekening. Bron: Statbel (FOD Economie).",evol_prix_maison_5ans_pct:"Procentuele verandering van de mediaanprijs van woningen over 5 jaar. Meet de dynamiek van waardevermeerdering op middellange termijn. Bron: Statbel, berekening Arcanes.",evol_prix_maison_10ans_pct:"Procentuele verandering van de mediaanprijs van woningen over 10 jaar. Indicator van de langetermijntrend van de lokale vastgoedmarkt. Bron: Statbel, berekening Arcanes.",nb_transactions_total:"Totaal aantal geregistreerde vastgoedtransacties in de gemeente per jaar. Meet de liquiditeit van de lokale markt. Bron: Statbel (FOD Economie).",ecart_prix_region_pct:"Procentueel verschil tussen de gemeentelijke mediaanprijs en de gewestelijke mediaanprijs (Wallonië, Vlaanderen of Brussel). Bron: berekening Arcanes op Statbel-gegevens.",cout_total_achat_maison:"Geschatte totale verwervingskost van een woning aan de mediaanprijs, inclusief registratierechten (12,5% Wallonië/Brussel, 3% Vlaanderen met vermindering), notariskosten en administratieve kosten. Bron: berekening Arcanes.",affordability_ratio:"Verhouding tussen de mediaanprijs van een woning en het mediaan jaarinkomen van de huishoudens in de gemeente. Hoe lager de ratio, hoe betaalbaarder. Bron: berekening Arcanes op Statbel-gegevens.",population_totale:"Officiële bevolking van de gemeente op 1 januari van het referentiejaar. Bron: Statbel (FOD Economie), bevolkingsregister.",nb_menages_total:"Totaal aantal privéhuishoudens in de gemeente. Bron: Statbel, bevolkingsregister.",evol_menages_5ans_pct:"Verandering van het aantal huishoudens over 5 jaar. Positieve groei wijst op residentiële aantrekkelijkheid. Bron: Statbel, berekening Arcanes.",part_isoles_pct:"Percentage eenpersoonshuishoudens. Indicator van de vraag naar kleine woningen. Bron: Statbel.",part_familles_avec_enfants_pct:"Percentage huishoudens met minstens één minderjarig kind. Indicator van gezinsaantrekkelijkheid. Bron: Statbel.",revenu_median:"Mediaan netto belastbaar inkomen per belastingaangifte in de gemeente. Bron: Statbel (fiscale gegevens FOD Financiën).",taux_precarite_pct:"Percentage van de bevolking met een leefloon of equivalent. Indicator van socio-economische kwetsbaarheid. Bron: POD Maatschappelijke Integratie, via Statbel.",part_bat_avant_1946_pct:"Percentage residentiële gebouwen gebouwd voor 1946. Indicator van ouderdom van het patrimonium. Bron: Statbel, gebouwenregister.",part_bat_apres_2011_pct:"Percentage residentiële gebouwen gebouwd na 2011. Indicator van bouwdynamiek. Bron: Statbel, gebouwenregister.",part_appartements_pct:"Aandeel appartementen in het totale woningenpark. Indicator van urbanisatie en dichtheid. Bron: Statbel.",score_urbanite:"Score van 0 tot 100 die de mate van verstedelijking meet op basis van bevolkingsdichtheid, aandeel appartementen, openbaar vervoer en diensten. Bron: berekening Arcanes.",indice_risque_renovation:"Index van 0 tot 100 die het risico op hoge renovatiekosten schat. Hoe hoger, hoe groter het risico. Bron: berekening Arcanes.",nb_faits_pour_1000_hab:"Totaal aantal geregistreerde strafbare feiten per 1000 inwoners. Bron: Federale Politie (FOD Binnenlandse Zaken).",nb_cambriolages_pour_1000_hab:"Aantal woninginbraken per 1000 inwoners. Bron: Federale Politie (FOD Binnenlandse Zaken).",evol_criminalite_5ans_pct:"Evolutie van het totaal aantal strafbare feiten over 5 jaar. Bron: Federale Politie, berekening Arcanes.",score_transport:"Score van 0 tot 100 voor bereikbaarheid met openbaar vervoer, gebaseerd op stations, treinfrequentie, bus en autosnelwegen. Bron: NMBS, TEC, De Lijn, berekening Arcanes.",trains_par_jour:"Aantal treindoorgangen per dag in de stations van de gemeente. Bron: NMBS, officiële dienstregeling.",rendement_brut_maison_pct:"Geschat bruto jaarlijks huurrendement voor een woning: (mediaan maandhuur × 12) / mediaan aankoopprijs × 100. Bron: berekening Arcanes op Statbel en FOD MyRent.",rendement_brut_appart_pct:"Geschat bruto jaarlijks huurrendement voor een appartement. Bron: berekening Arcanes op Statbel en FOD MyRent.",loyer_median_maison:"Mediaan maandelijkse huurprijs van woningen, gebaseerd op geregistreerde huurcontracten. Bron: FOD Financiën — MyRent.",loyer_median_appart:"Mediaan maandelijkse huurprijs van appartementen. Bron: FOD Financiën — MyRent.",evol_loyer_maison_3ans_pct:"Evolutie van de mediaan huurprijs van woningen over 3 jaar. Bron: FOD MyRent, berekening Arcanes.",centimes_additionnels_pri:"Gemeentelijke opcentiemen op de onroerende voorheffing (OV). Variëren van ~750 tot ~4000 per gemeente. Bron: FOD Financiën, kadaster.",cout_fiscal_annuel_estime:"Geschatte jaarlijkse fiscale kost voor een eigend
130om met het mediaan kadastraal inkomen van de gemeente. Bron: berekening Arcanes op FOD Financiën.",taux_additionnel_ipp_pct:"Gemeentelijk aanvullend tarief op de personenbelasting (PB). Bron: FOD Financiën.",arcanes_investment_score:"Arcanes score van 0 tot 100 voor investeringspotentieel. Combineert Rendement (50%) en Waardestijgingspotentieel (50%). Het potentieel integreert prijsevolutie, momentum, huishoudensgroei, gezinsaantrekkelijkheid en vraag/aanbod-spanning. Bron: eigen berekening Arcanes.",rental_demand_score:"Score van 0 tot 100 voor geschatte huurvraag, gebaseerd op spanning vraag/aanbod, leegstand, demografische groei en werkgelegenheid. Bron: berekening Arcanes.",tension_offre_demande:"Verhouding tussen geschatte vraag en beschikbaar aanbod op de lokale vastgoedmarkt. Bron: berekening Arcanes.",renovation_potential_index:"Score van 0 tot 100 voor meerwaardepotentieel door renovatie. Bron: berekening Arcanes.",family_attractiveness_score:"Score van 0 tot 100 voor gezinsaantrekkelijkheid, gebaseerd op scholen, kinderopvang, groen, veiligheid en bereikbaarheid. Bron: berekening Arcanes.",price_forecast_index:"Voorspellingsindex voor prijsevolutie op 2-3 jaar. Positief getal wijst op verwachte stijging. Bron: voorspellingsmodel Arcanes.",opportunity_score:"Synthetische score van 0 tot 100 die ondergewaardeerde gemeenten identificeert ten opzichte van hun fundamenten. Bron: berekening Arcanes."}
130,at={cashflow:"Stratégie optimisée pour les investisseurs cherchant un flux de trésorerie positif dès l'achat. Cible les communes où le rendement locatif brut est supérieur à la moyenne nationale, où la demande locative est forte (faible vacance, croissance démographique) et où les prix d'acquisition restent bas, permettant un cash-on-cash return élevé. Idéale pour le locatif résidentiel classique avec un horizon de 5-10 ans.",famille:"Stratégie pour les acheteurs cherchant un cadre de vie familial optimal. Combine l'attractivité familles (écoles, crèches, espaces verts), la qualité des transports (accès gares, bus), des prix accessibles et un environnement sûr (faible criminalité). Pertinente pour l'achat de résidence principale avec enfants.",plusvalue:"Stratégie pour les investisseurs misant sur l'appréciation du capital. Identifie les communes où les prévisions de prix sont haussières, où l'évolution passée confirme la tendance et où la tension offre/demande soutient les prix. Horizon recommandé de 5-10 ans minimum. Les communes en phase d'accélération obtiennent les meilleurs scores.",securite:"Stratégie défensive pour les investisseurs averses au risque. Privilégie les communes avec un score Arcanes élevé (fondamentaux solides), une criminalité faible et un ratio d'accessibilité raisonnable (marché pas surévalué). Combine stabilité et prévisibilité. Adaptée aux profils patrimoniaux long terme.",fiscal:"Stratégie d'optimisation fiscale pour les propriétaires soucieux de minimiser la charge fiscale annuelle. Cible les communes avec des centimes additionnels PRI bas, un taux additionnel IPP faible et des prix d'acquisition modérés. Particulièrement pertinente en Flandre où les droits d'enregistrement sont réduits à 3%.",renov:"Stratégie pour les investisseurs-rénovateurs cherchant à créer de la valeur par les travaux. Identifie les communes avec un fort potentiel de rénovation (parc ancien, écart prix ancien/neuf élevé), des prix d'achat bas et un parc immobilier majoritairement construit avant 1946. L'écart de prix post-rénovation peut atteindre 30-60%.",urban:"Stratég
130ie pour les investisseurs ciblant les centres urbains dynamiques. Combine l'urbanité (densité, services), le transport (gares, fréquence), la taille de population et la croissance des ménages. Vise les villes moyennes belges en pleine expansion où la demande locative est structurellement forte.",rural:"Stratégie pour les acheteurs cherchant la qualité de vie en milieu rural. Cible les communes avec des prix bas, une criminalité faible et un parc immobilier au charme ancien (constructions d'avant 1946). Idéale pour les résidences secondaires, les télétravailleurs ou les retraités.",etudiant:"Stratégie optimisée pour l'investissement locatif étudiant. Cible les villes universitaires avec des loyers d'appartements élevés, un bon rendement brut sur les appartements, un excellent réseau de transport et une grande population (proxy de la présence universitaire). Focus sur les kots et studios.",premiere:"Stratégie pour les primo-accédants cherchant leur premier bien. Combine prix bas, ratio d'accessibilité favorable (rapport prix/revenu), une évolution positive des prix sur 5 ans (valorisation du patrimoine) et un bon accès aux transports (mobilité domicile-travail). Optimisée pour les jeunes ménages.",patrimonial:"Stratégie de constitution de patrimoine sur le long terme. Sélectionne les communes avec un score Arcanes élevé (fondamentaux solides), une forte évolution des prix sur 10 ans, un rendement locatif attractif et un marché liquide (nombre de transactions élevé). Horizon de 10-20 ans, diversification recommandée.",revenu:"Stratégie ciblant les zones résidentielles à hauts revenus. Identifie les communes où le revenu médian est élevé, les prix restent accessibles par rapport au pouvoir d'achat local et la part de familles avec enfants est importante (indicateur de stabilité résidentielle). Marchés premium avec faible rotation."},ot={cashflow:"Strategie geoptimaliseerd voor investeerders die een positieve cashflow zoeken vanaf de aankoop. Richt zich op gemeenten met een bovengemiddeld bruto huurrendement, sterke huurvraag en lage aankoopprijzen. Ideaal voor klassieke residentiële verhuur met een horizon van 5-10 jaar.",famille:"Strategie voor kopers die een optimaal gezinsleven zoeken. Combineert gezinsaantrekkelijkheid (scholen, kinderopvang, groen), transportkwaliteit, betaalbare prijzen en een veilige omgeving. Relevant voor de aankoop van een gezinswoning.",plusvalue:"Strategie voor investeerders die inzetten op kapitaalgroei. Identificeert gemeenten met stijgende prijsvoorspellingen, bevestigde historische trend en ondersteunende vraag/aanbod-spanning. Aanbevolen horizon van minimum 5-10 jaar.",securite:"Defensieve strategie voor risicomijdende investeerders. Geeft voorrang aan gemeenten met een hoge Arcanes score, lage criminaliteit en een redelijke betaalbaarheidsratio. Geschikt voor langetermijn vermogensprofielen.",fiscal:"Fiscale optimalisatiestrategie voor eigenaars die de jaarlijkse belastingdruk willen minimaliseren. Richt zich op gemeenten met lage opcentiemen OV, laag aanvullend PB-tarief en gematigde aankoopprijzen.",renov:"Strategie voor investeerders-renoveerders die waarde willen creëren door werken. Identificeert gemeenten met hoog renovatiepotentieel, lage aankoopprijzen en een overwegend oud gebouwenpark.",urban:"Strategie gericht op dynamische stedelijke centra. Combineert urbaniteit, transport, bevolkingsomvang en groei van huishoudens. Richt zich op groeiende Belgische middelgrote steden.",rural:"Strategie voor kopers die levenskwaliteit op het platteland zoeken. Richt zich op gemeenten met lage prijzen, lage criminaliteit en charmant oud patrimonium. Ideaal voor tweede verblijven of telewerkers.",etudiant:"Strategie geoptimaliseerd voor studentenverhuur. Richt zich op universiteitssteden met hoge appartementshuren, goed rendement, uitstekend transport en grote bevolking.",premiere:"Strategie voor eerste kopers. Combineert lage prijzen, gunstige betaalbaarheidsratio, positieve prijsevolutie over 5 jaar en goede transportverbindingen. Geoptimaliseerd voor jonge huishoudens.",patrimonial:"Langetermijn vermogensopbouwstrategie. Selecteert gemeenten met hoge Arcanes score, sterke 10-jarige prijsevolutie, aantrekkelijk huurrendement en een liquide markt. Horizon van 10-20 jaar.",revenu:"Strategie gericht op residentiële zones met hoge inkomens. Identificeert gemeenten met hoog mediaaninkomen, betaalbare prijzen ten opzichte van lokale koopkracht en hoog aandeel gezinnen. Premiummarkten met lage rotatie."},hn={prix_maison_median:"Median price of houses sold in the past 12 months. Source: Statbel.",prix_appart_median:"Median price of apartments sold in the past 12 months. Source: Statbel.",evol_prix_maison_5ans_pct:"Percentage change in median house price over 5 years. Source: Statbel, Arcanes.",evol_prix_maison_10ans_pct:"Percentage change in median house price over 10 years. Source: Statbel, Arcanes.",nb_transactions_total:"Total registered property transactions per year. Measures local market liquidity. Source: Statbel.",ecart_prix_region_pct:"Gap between municipal and regional median price. Source: Arcanes on Statbel data.",cout_total_achat_maison:"Estimated total acquisition cost including registration duties, notary and admin fees. Source: Arcanes.",affordability_ratio:"Ratio of median house price to median annual household income. Lower = more affordable. Source: Arcanes.",population_totale:"Official municipality population. Source: Statbel, population register.",nb_menages_total:"Total private households. Source: Statbel.",evol_menages_5ans_pct:"Household change over 5 years. Positive = residential attractiveness. Source: Statbel, Arcanes.",part_isoles_pct:"Share of single-person households. Demand indicator for small dwellings. Source: Statbel.",part_familles_avec_enfants_pct:"Share of households with minor children. Family attractiveness indicator. Source: Statbel.",revenu_median:"Median net taxable income. Local purchasing power indicator. Source: Statbel (FPS Finance).",taux_precarite_pct:"Share of population on social integration income. Socio-economic vulnerability. Source: Statbel.",part_bat_avant_1946_pct:"Share of residential buildings built before 1946. Renovation potential indicator. Source: Statbel.",part_bat_apres_2011_pct:"Share of residential buildings built after 2011. Construction dynamism indicator. Source: Statbel.",part_appartements_pct:"Share of apartments in total housing stock. Urbanisation indicator. Source: Statbel.",score_urbanite:"Urbanisation score 0-100 based on density, apartments, transport and services. Source: Arcanes.",indice_risque_renovation:"Renovation risk index 0-100. Higher = greater r
130isk. Source: Arcanes.",nb_faits_pour_1000_hab:"Total criminal incidents per 1,000 inhabitants. Source: Federal Police.",nb_cambriolages_pour_1000_hab:"Residential burglaries per 1,000 inhabitants. Source: Federal Police.",evol_criminalite_5ans_pct:"Change in crime over 5 years. Decrease = improved safety. Source: Federal Police, Arcanes.",score_transport:"Public transport accessibility score 0-100. Source: SNCB/NMBS, TEC, De Lijn, Arcanes.",trains_par_jour:"Train services per day at municipality stations. Source: SNCB/NMBS.",rendement_brut_maison_pct:"Estimated gross annual house rental yield. Source: Arcanes on Statbel + FPS MyRent.",rendement_brut_appart_pct:"Estimated gross annual apartment rental yield. Source: Arcanes on Statbel + FPS MyRent.",loyer_median_maison:"Median monthly house rent from registered leases. Source: FPS Finance — MyRent.",loyer_median_appart:"Median monthly apartment rent. Source: FPS Finance — MyRent.",evol_loyer_maison_3ans_pct:"Change in median house rent over 3 years. Source: FPS MyRent, Arcanes.",centimes_additionnels_pri:"Municipal surcharges on property tax (PRI). Vary ~750 to ~4,000. Source: FPS Finance.",cout_fiscal_annuel_estime:"Estimated annual tax cost at median cadastral income. Source: Arcanes on FPS Finance.",taux_additionnel_ipp_pct:"Municipal supplementary personal income tax rate. Source: FPS Finance.",arcanes_investment_score:"Arcanes investment score 0-100. Combines Yield (50%) + Appreciation Potential (50%). Source: Arcanes.",rental_demand_score:"Rental demand score 0-100. Source: Arcanes multi-source.",tension_offre_demande:"Supply/demand tension ratio on local property market. Source: Arcanes.",renovation_potential_index:"Renovation value-add potential score 0-100. Source: Arcanes.",family_attractiveness_score:"Family attractiveness score 0-100 based on schools, childcare, green, safety. Source: Arcanes.",price_forecast_index:"Price forecast index for 2-3 years. Positive = expected increase. Source: Arcanes.",opportunity_score:"Score 0-100 identifying undervalued municipalities. Source: Arcanes."},st={cashflow:"Strategy for investors seeking positive cashflow from day one. Targets high gross yield, strong rental demand and low acquisition prices.",famille:"Strategy for buyers seeking an optimal family environment. Combines family attractiveness, transport, affordable prices and safety.",plusvalue:"Strategy for capital appreciation. Identifies municipalities with bullish forecasts, confirmed trends and supply/demand tension.",securite:"Defensive strategy favouring high Arcanes score, low crime and reasonable affordability. Suited to long-term wealth profiles.",fiscal:"Tax optimisation targeting low PRI surcharges, low supplementary PIT rate and moderate purchase prices.",renov:"Renovation strategy targeting high renovation potential, low prices and predominantly pre-1946 building stock.",urban:"Strategy targeting dynamic urban centres. Combines urbanity, transport, population and household growth.",rural:"Rural quality of life strategy. Low prices, low crime and charming old building stock.",etudiant:"Student rental strategy targeting university cities with high apartment rents, good yield and excellent transport.",premiere:"First-time buyer strategy. Low prices, favourable affordability, positive 5-year trend and good transport.",patrimonial:"Long-term wealth building. High Arcanes score, strong 10-year price evolution, attractive yield and liquid market.",revenu:"High-income area strategy. High median income, affordable prices relative to local purchasing power and family share."};function bt(){const{language:t}=Bn(),d=t!=="nl",o=(n,i,a)=>t==="nl"?i:t==="en"?a:n,k=Nn(),_=Rn();c.useEffect(()=>{!d&&_.pathname==="/exploration"?k("/verkenning",{replace:!0}):d&&_.pathname==="/verkenning"&&k("/exploration",{replace:!0})},[d,_.pathname,k]);const{data:v,loading:y}=Gn(),{isPremium:A}=Mn(),[l,z]=c.useState(!1),[w,F]=c.useState(0);c.useEffect(()=>{(async()=>{const{data:{user:a}}=await we.auth.getUser();if(a){z(!0);const{data:r}=await we.rpc("get_total_credits",{p_user_id:a.id});F(r||0)}})();const{data:{subscription:i}}=we.auth.onAuthStateChange((a,r)=>z(!!(r!=null&&r.user)));return()=>i.unsubscribe()},[]);const[p,C]=c.useState(new Map);c.useEffect(()=>{(async()=>{const{data:n}=await we.from("commune_slugs").select("code_ins,slug_fr,slug_nl");if(n){const i=new Map;
130n.forEach(a=>i.set(a.code_ins,{slug_fr:a.slug_fr,slug_nl:a.slug_nl})),C(i)}})()},[]);const[m,M]=c.useState([]),[f,b]=c.useState("hybrid"),[E,B]=c.useState(""),[j,re]=c.useState(new Set),[S,ae]=c.useState(null),[Ee,ze]=c.useState(!1),[yn,$]=c.useState(!1),[Ue,oe]=c.useState(!1),[Ye,Qe]=c.useState(!1),[kn,jn]=c.useState(new Set),[P,se]=c.useState("prix_maison_median"),[N,J]=c.useState("asc"),[he,Pe]=c.useState(!1),[Y,De]=c.useState(Ae),[Q,be]=c.useState(null),[q,Be]=c.useState("auto"),[Sn,Ne]=c.useState(""),[Ke,X]=c.useState(!1),[ee,ve]=c.useState({}),_e=c.useCallback((n,i,a)=>{ve(r=>({...r,[n]:{...r[n]||{min:"",max:""},[i]:a}}))},[]),Ze=c.useCallback(n=>{ve(i=>{const a={...i};return delete a[n],a})},[]),wn=c.useCallback(()=>ve({}),[]),I=c.useRef(null),L=c.useRef(null),Re=c.useRef(null),Me=c.useRef(null),Ie=c.useRef(null),Le=c.useRef(null),Te=c.useRef(new Map),Oe=c.useRef(!1),[ye,Je]=c.useState(!1);c.useEffect(()=>{const n=i=>{Me.current&&!Me.current.contains(i.target)&&oe(!1),Ie.current&&!Ie.current.contains(i.target)&&Qe(!1),Se.current&&!Se.current.contains(i.target)&&He(null)};return document.addEventListener("mousedown",n),()=>document.removeEventListener("mousedown",n)},[]);const D=c.useMemo(()=>{const n=[];return v.forEach(i=>n.push(i)),n},[v]),Fn=c.useCallback(n=>{const i=U(n);if(i){if(!i.free&&!A){$(!0);return}M(a=>a.includes(n)?a.filter(r=>r!==n):[...a,n])}},[A]),T=c.useMemo(()=>m.map(U).filter(n=>n&&!n.composite),[m]),g=c.useMemo(()=>{const n=m.map(U).filter(Boolean),i=n.find(a=>a.composite);if(!n.length)return{type:"none"};if(q==="composite"&&T.length>=2)return{type:"composite",comp:{id:"_custom",fr:"Score combiné",nl:"Gecombineerde score",en:"Combined score",f
130ield:"_c",gradient:u.rg,format:H,composite:{fields:T.map(r=>r.field),inverts:T.map(r=>!!r.invert),descFr:T.map(r=>r.fr).join(" + "),descNl:T.map(r=>r.nl).join(" + "),descEn:T.map(r=>r.en).join(" + ")}}};if(q!=="auto"&&q!=="composite"){const a=n.find(r=>r.field===q);if(a&&!a.composite)return{type:"single",lyr:a}}return i?{type:"composite",comp:i}:{type:"single",lyr:n[n.length-1]}},[m,q,T]),Xe=c.useMemo(()=>{const n=new Map;return g.type==="composite"?g.comp.composite.fields.forEach(i=>n.set(i,Ce(D,i))):g.type==="single"&&n.set(g.lyr.field,Ce(D,g.lyr.field)),n},[g,D]),K=c.useMemo(()=>{if(g.type!=="composite")return new Map;const n=new Map,{fields:i,inverts:a}=g.comp.composite;return D.forEach(r=>{const s=et(r,i,a,Xe);s!=null&&n.set(r.code_ins,s)}),n},[g,D,Xe]),{minV:le,maxV:ce}=c.useMemo(()=>{if(g.type==="composite"){const n=Array.from(K.values());return n.length?(n.sort((i,a)=>i-a),{minV:n[Math.floor(n.length*.05)],maxV:n[Math.floor(n.length*.95)]}):{minV:0,maxV:100}}if(g.type==="single"){const n=Ce(D,g.lyr.field);return{minV:n.min,maxV:n.max}}return{minV:0,maxV:100}},[g,K,D]),ke=c.useCallback(n=>{for(const[i,{min:a,max:r}]of Object.entries(ee)){const s=n[i];if(s==null)return!1;const x=a?parseFloat(a):null,h=r?parseFloat(r):null;if(x!=null&&!isNaN(x)&&s<x||h!=null&&!isNaN(h)&&s>h)return!1}return!0},[ee]),de=Object.values(ee).some(n=>n.min||n.max),je=c.useCallback(n=>j.size>0&&n.nom_province&&!j.has(n.nom_province)||de&&!ke(n)||g.type==="none"?"#E8E4DE":g.type==="composite"?un(K.get(n.code_ins)??null,le,ce,u.rg,!1):un(n[g.lyr.field],le,ce,g.lyr.gradient,g.lyr.invert),[g,K,le,ce,j,ke,de]),O=c.useMemo(()=>{let n=D;if(j.size>0&&(n=n.filter(i=>i.nom_province&&j.has(i.nom_province))),E.trim().length>=2){const i=E.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"");n=n.filter(a=>{const r=(a.nom_commune||"").toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,""),s=(a.nom_commune_nl||"").toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"");return r.includes(i)||s.includes(i)})}if(de&&(n=n.filter(ke)),Ke){const i=N==="asc"?1:-1;n=[...n].sort((a,r)=>{const s=a[P],x=r[P];return s==null&&x==null?0:s==null?1:x==null?-1:typeof s=="string"?s.localeCompare(x)*i:(s-x)*i})}else if(g.type==="composite")n=[...n].sort((i,a)=>(K.get(a.code_ins)??-1)-(K.get(i.code_ins)??-1));else if(g.type==="single"){const i=g.lyr.field,a=g.lyr.invert;n=[...n].sort((r,s)=>{const x=r[i],h=s[i];return x==null&&h==null?0:x==null?1:h==null?-1:a?x-h:h-x})}else{const i=N==="asc"?1:-1;n=[...n].sort((a,r)=>{const s=a[P],x=r[P];return s==null&&x==null?0:s==null?1:x==null?-1:(s-x)*i})}return n},[D,j,E,g,K,P,N,Ke,ke,de]),en=c.useMemo(()=>O.slice(0,Y),[O,Y]),nn=O.length>Y;c.useEffect(()=>De(Ae),[E,m,P,N,j,ee]),c.useEffect(()=>X(!1),[m]),c.useEffect(()=>{if(q==="auto"||q==="composite")return;T.some(i=>i.field===q)||(Be(T.length>=2?"composite":"auto"),Ne(""))},[m,T,q]),c.useEffect(()=>{ve(n=>{const i=new Set(m.map(U).filter(r=>r&&!r.composite).map(r=>r.field)),a={};for(const[r,s]of Object.entries(n))i.has(r)&&(a[r]=s);return Object.keys(a).length===Object.keys(n).length?n:a})},[m]);const Cn=g.type==="composite"?u.rg:g.type==="single"?g.lyr.gradient:["#E8E4DE"],An=g.type==="composite"?d?"Score composite":"Compositescore":g.type==="single"?d?g.lyr.fr:g.lyr.nl:"",tn=g.type==="single"?g.lyr.format:H;c.useEffect(()=>{if(!Re.current||I.current)return;const n=Fe.map(Re.current,{center:gn,zoom:8,minZoom:7,maxZoom:13,maxBounds:tt,maxBoundsViscosity:.8,scrollWheelZoom:!0,zoomControl:!0});return Fe.tileLayer("https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",{attribution:"© OSM © CARTO",maxZoom:13}).addTo(n),I.current=n,n.on("dragstart",()=>{Oe.current=!0,n.eachLayer(i=>{i.closeTooltip&&i.closeTooltip()})}),n.on("dragend",()=>{Oe.current=!1}),setTimeout(()=>n.invalidateSize(),150),()=>{var i;(i=I.current)==null||i.remove(),I.current=null}},[]),c.useEffect(()=>{setTimeout(()=>{var n;return(n=I.current)==null?void 0:n.invalidateSize()},200)},[f]),c.useEffect(()=>{setTimeout(()=>{var n;return(n=I.current)==null?void 0:n.invalidateSize()},300)},[m.length]),c.useEffect(()=>{if(!I.current||!L.current)return;if(j.size===0){I.current.flyTo(gn,8,{duration:.4});return}const n=Fe.latLngBounds([]);L.current.eachLayer(i=>{var s,x;const a=ge((s=i.feature)==null?void 0:s.properties),r=v.get(a);if(r!=null&&r.nom_province&&j.has(r.nom_province)){const h=(x=i.getBounds)==null?void 0:x.call(i);h&&n.extend(h)}}),n.isValid()&&I.current.flyToBounds(n,{padding:[20,20],maxZoom:10,duration:.4})},[j,v]),c.useEffect(()=>{const n=I.current;if(!n||v.size===0)return;L.current&&n.removeLayer(L.current);const i=new Map,a=Fe.geoJSON(Un,{style:r=>{if(!(r!=null&&r.properties))return{fillColor:"#E8E4DE",weight:.5,opacity:1,color:"#fff",fillOpacity:.7};const s=ge(r.properties),x=v.get(s),h=s===(S==null?void 0:S.code_ins);return{fillColor:x?je(x):"#E8E4DE",weight:h?3:.4,opacity:1,color:h?"#0F4C4C":"#fff",fillOpacity:h?.9:.7}},onEachFeature:(r,s)=>{const x=ge(r.properties),h=v.get(x);if(!h)return;
130i.set(x,s);let me=`<strong>${t==="nl"&&h.nom_commune_nl||h.nom_commune}</strong>`;if(g.type==="composite"){const R=K.get(x);me+=R!=null?`<br/>Score: <b>${Math.round(R)}/100</b>`:""}else if(g.type==="single"){const R=h[g.lyr.field];me+=`<br/><b>${g.lyr.format(R)}</b>`}else me+=`<br/>${fe(h.prix_maison_median)}`;s.bindTooltip(me,{sticky:!1,className:"xp-tip",direction:"auto"}),s.on("click",()=>{s.closeTooltip(),ae(h),ze(!0),Pe(!0)}),s.on("mouseover",()=>{if(Oe.current){s.closeTooltip();return}be(x),s.setStyle({weight:2.5,fillOpacity:.95})}),s.on("mouseout",()=>{var R;be(null),(R=L.current)==null||R.resetStyle(s)})}});a.addTo(n),L.current=a,Te.current=i},[v,m,g,K,le,ce,d,S==null?void 0:S.code_ins,j,je]),c.useEffect(()=>{L.current&&L.current.setStyle(n=>{if(!(n!=null&&n.properties))return{};const i=ge(n.properties),a=v.get(i),r=i===(S==null?void 0:S.code_ins),s=i===Q;return{fillColor:a?je(a):"#E8E4DE",weight:r?3:s?2.5:.4,color:r||s?"#0F4C4C":"#fff",fillOpacity:r?.9:s?.95:.7}})},[S==null?void 0:S.code_ins,Q,je]),c.useEffect(()=>{if(!Q||!Te.current.size)return;const n=Te.current.get(Q);return n&&n.setStyle({weight:2.5,fillOpacity:.95,color:"#0F4C4C"}),()=>{n&&L.current&&L.current.resetStyle(n)}},[Q]),c.useEffect(()=>{if(!Q||!Le.current)return;const n=Le.current.querySelector(`#r-${Q}`);n&&n.scrollIntoView({block:"nearest",behavior:"smooth"})},[Q]),c.useEffect(()=>{!S||!L.current||!I.current||L.current.eachLayer(n=>{var i,a;if(ge((i=n.feature)==null?void 0:i.properties)===S.code_ins){const r=(a=n.getBounds)==null?void 0:a.call(n);r&&I.current.flyToBounds(r,{padding:[30,30],maxZoom:11,duration:.4})}})},[S==null?void 0:S.code_ins]);const En=c.useCallback(n=>{const i=p.get(n.code_ins);i&&k(t==="nl"?`/gemeente/${i.slug_nl}`:`/commune/${i.slug_fr}`)},[p,d,k]),rn=c.useCallback(()=>{ze(!1),ae(null)},[]),an=c.useCallback(n=>{ae(n),ze(!0),Pe(!0)},[]),qe=n=>{X(!0),P===n?J(i=>i==="asc"?"desc":"asc"):(se(n),J("desc"))},zn={prix_maison_median:{fr:"Prix maison",nl:"Prijs won."},prix_appart_median:{fr:"Prix appart.",nl:"Prijs app."},evol_prix_maison_5ans_pct:{fr:"Évol. 5a",nl:"Evol. 5j"},evol_prix_maison_10ans_pct:{fr:"Évol. 10a",nl:"Evol. 10j"},nb_transactions_total:{fr:"Trans.",nl:"Trans."},ecart_prix_region_pct:{fr:"Écart rég.",nl:"Versch. gew."},cout_total_achat_maison:{fr:"Coût achat",nl:"Aankoopkost"},affordability_ratio:{fr:"Accès.",nl:"Betaalb."},population_totale:{fr:"Pop.",nl:"Bev."},nb_menages_total:{fr:"Ménages",nl:"Huish."},evol_menages_5ans_pct:{fr:"Évol. mén.",nl:"Evol. huish."},part_isoles_pct:{fr:"Isolés %",nl:"Alleenst. %"},part_familles_avec_enfants_pct:{fr:"Familles %",nl:"Gezinnen %"},revenu_median:{fr:"Revenu méd.",nl:"Med. ink."},taux_precarite_pct:{fr:"Précarité",nl:"Armoede"},part_bat_avant_1946_pct:{fr:"Bâti <46",nl:"Bouw <46"},part_bat_apres_2011_pct:{fr:"Bâti >11",nl:"Bouw >11"},part_appartements_pct:{fr:"Appart. %",nl:"App. %"},score_urbanite:{fr:"Urbanité",nl:"Urban."},indice_risque_renovation:{fr:"Risq. réno",nl:"Reno risico"},nb_faits_pour_1000_hab:{fr:"Faits/1k",nl:"Feiten/1k"},nb_cambriolages_pour_1000_hab:{fr:"Cambr./1k",nl:"Inbr./1k"},evol_criminalite_5ans_pct:{fr:"Évol. crim.",nl:"Evol. crim."},score_transport:{fr:"Transport",nl:"Transport"},trains_par_jour:{fr:"Trains/j",nl:"Trein/d"},rendement_brut_maison_pct:{fr:"Rend. mais.",nl:"Rend. won."},rendement_brut_appart_pct:{fr:"Rend. app.",nl:"Rend. app."},loyer_median_maison:{fr:"Loyer mais.",nl:"Huur won."},loyer_median_appart:{fr:"Loyer app.",nl:"Huur app."},evol_loyer_maison_3ans_pct:{fr:"Évol. loyer",nl:"Evol. huur"},centimes_additionnels_pri:{fr:"PRI",nl:"OV"},cout_fiscal_annuel_estime:{fr:"Coût fisc.",nl:"Fisc. kost"},taux_additionnel_ipp_pct:{fr:"IPP %",nl:"PB %"},arcanes_investment_score:{fr:"Score inv.",nl:"Inv. score"},rental_demand_score:{fr:"Dem. loc.",nl:"Huurvraag"},tension_offre_demande:{fr:"Tension",nl:"Spanning"},renovation_potential_index:{fr:"Pot. réno",nl:"Reno pot."},family_attractiveness_score:{fr:"Attract. fam.",nl:"Gezinsaantr."},price_forecast_index:{fr:"Prévis. prix",nl:"Prijsvoorsp."},opportunity_score:{fr:"Opportun.",nl:"Kansen"}},V=c.useMemo(()=>{const n=[];return m.forEach(i=>
130{const a=U(i);if(!a||a.composite)return;const r=zn[a.field],s=r?t==="nl"?r.nl:r.fr:t==="nl"?a.nl:t==="en"?a.en:a.fr;n.push({k:a.field,l:s,num:!0,fmt:a.format})}),n.length||n.push({k:"prix_maison_median",l:o("Prix maison","Prijs woning","House price"),num:!0,fmt:fe}),n},[m,d]),Ve=5,W=c.useMemo(()=>{if(f!=="hybrid"||V.length<=Ve)return V;const n=V.filter(a=>D.filter(s=>s[a.k]!=null).length>D.length*.4),i=n.length>0?n:V;return i.length>Ve?i.slice(0,Ve):i},[V,f,D]),[on,He]=c.useState(null),Se=c.useRef(null),Pn=[{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Arcanes",item:"https://arcanes.be"},{"@type":"ListItem",position:2,name:o("Screener immobilier","Vastgoedscreener","Property Screener"),item:o("https://arcanes.be/exploration","https://arcanes.be/verkenning","https://arcanes.be/exploration")}]},{"@context":"https://schema.org","@type":"WebApplication",name:o("Screener immobilier Arcanes","Arcanes Vastgoedscreener","Arcanes Property Screener"),description:d?"Outil interactif gratuit pour explorer et comparer 581 communes belges selon 80+ indicateurs : prix, rendement, sécurité, démographie, fiscalité. Données officielles Statbel.":"Gratis interactieve tool om 581 Belgische gemeenten te verkennen en vergelijken op 80+ indicatoren: prijs, rendement, veiligheid, demografie, fiscaliteit. Officiële Statbel-gegevens.",url:o("https://arcanes.be/exploration","https://arcanes.be/verkenning","https://arcanes.be/exploration"),applicationCategory:"FinanceApplication",operatingSystem:"Web",availableLanguage:["fr","nl"],offers:{"@type":"Offer",price:"0",priceCurrency:"EUR"},creator:{"@type":"Organization",name:"Digital Arcanes SRL",url:"https://arcanes.be"},featureList:d?"Carte interactive, 581 communes, 80+ indicateurs, score composite, export PDF, filtre par province, tri multi-critères, stratégies d'investissement":"Interactieve kaart, 581 gemeenten, 80+ indicatoren, compositescore, PDF-export, filter op provincie, multi-criteria sortering, investeringsstrategieën"},{"@context":"https://schema.org","@type":"FAQPage",mainEntity:[{"@type":"Question",name:o("Comment fonctionne le screener immobilier Arcanes ?","Hoe werkt de Arcanes vastgoedscreener ?","How does the Arcanes property screener work?"),acceptedAnswer:{"@type":"Answer",text:d?"Le screener permet d'explorer 581 communes belges en ajoutant des indicateurs (prix, rendement, sécurité, démographie, fiscalité) qui colorient la carte interactive et trient le classement en temps réel. Combinez plusieurs indicateurs pour un score composite. Exportez en PDF.":"De screener laat u 581 Belgische gemeenten verkennen door indicatoren toe te voegen (prijs, rendement, veiligheid, demografie, fiscaliteit) die de interactieve kaart inkleuren en de ranglijst in realtime sorteren. Combineer meerdere indicatoren voor een compositescore. Exporteer als PDF."}},{"@type":"Question",name:o("Quelles données officielles sont utilisées ?","Welke officiële gegevens worden gebruikt?","What official data sources are used?"),acceptedAnswer:{"@type":"Answer",text:d?"Statbel (prix, transactions, revenus, bâti), SPF Finances (cadastre, fiscalité), Police fédérale (criminalité), SNCB (transport), SPF MyRent (loyers). Mise à jour annuelle.":"Statbel (prijzen, transacties, inkomens, gebouwen), FOD Financiën (kadaster, fiscaliteit), Federale Politie (criminaliteit), NMBS (transport), FOD MyRent (huurprijzen). Jaarlijkse update."}},{"@type":"Question",name:o("Quels indicateurs sont gratuits ?","Welke indicatoren zijn gratis?","Which indicators are free?"),acceptedAnswer:{"@type":"Answer",text:d?"25 indicateurs gratuits sans inscription : prix (8), population (7), bâti (5), sécurité et transport (5). Les rendements, scores Arcanes, prévisions et stratégies sont Premium.":"25 gratis indicatoren zonder registratie: prijs (8), bevolking (7), gebouwen (5), veiligheid en transport (5). Rendementen, Arcanes scores, voorspellingen en strategieën zijn Premium."}},{"@type":"Question",name:o("Comment est calculé le score Arcanes ?","Hoe wordt de Arcanes score berekend?","How is the Arcanes score calculated?"),acceptedA
130nswer:{"@type":"Answer",text:d?"Score 0-100 combinant Rendement (50%) et Potentiel (50%). Le potentiel intègre l'attractivité familles, l'évolution des prix et la dynamique démographique. Score > 70 = potentiel élevé, 50-70 = modéré, < 50 = limité.":"Score 0-100 die Rendement (50%) en Potentieel (50%) combineert. Het potentieel integreert gezinsaantrekkelijkheid, prijsevolutie en demografische dynamiek. Score > 70 = hoog potentieel, 50-70 = matig, < 50 = beperkt."}},{"@type":"Question",name:o("Peut-on exporter les résultats en PDF ?","Kunnen resultaten geëxporteerd worden als PDF?","Can results be exported as PDF?"),acceptedAnswer:{"@type":"Answer",text:d?"Oui. Le PDF inclut les indicateurs sélectionnés, le classement des communes filtrées, et les sources. Document informatif conforme FSMA.":"Ja. De PDF bevat de geselecteerde indicatoren, de ranglijst van gefilterde gemeenten, en de bronnen. Informatief document conform FSMA."}},{"@type":"Question",name:d?"Comment créer sa propre stratégie d'investissement ?":"Hoe maak je je eigen investeringsstrategie?",acceptedAnswer:{"@type":"Answer",text:d?"Sélectionnez 2 à 6 indicateurs, cliquez sur Combiner pour créer un score composite personnalisé de 0 à 100, puis affinez avec les filtres min/max. Votre stratégie reflète exactement vos priorités d'investissement.":"Selecteer 2 tot 6 indicatoren, klik op Combineer om een gepersonaliseerde compositescore van 0 tot 100 te maken, en verfijn met min/max-filters. Uw strategie weerspiegelt precies uw investeringsprioriteiten."}}]}];return e.jsxs("div",{className:"xp",children:[e.jsx("style",{children:rt}),e.jsxs(In,{children:[e.jsx("title",{children:d?"Screener immobilier Belgique — Comparez 581 communes gratuitement | Arcanes":"Vastgoedscreener België — Vergelijk 581 gemeenten gratis | Arcanes"}),e.jsx("meta",{name:"description",content:d?"Screener interactif gratuit : comparez les 581 communes belges par prix, rendement, sécurité, démographie, fiscalité. 80+ indicateurs officiels Statbel, carte interactive, export PDF. Wallonie, Flandre, Bruxelles.":"Gratis interactieve screener: vergelijk 581 Belgische gemeenten op prijs, rendement, veiligheid, demografie, fiscaliteit. 80+ officiële Statbel-indicatoren, interactieve kaart, PDF-export. Wallonië, Vlaanderen, Brussel."}),e.jsx("link",{rel:"canonical",href:o("https://arcanes.be/exploration","https://arcanes.be/verkenning","https://arcanes.be/exploration")}),e.jsx("link",{rel:"alternate",hrefLang:"fr",href:"https://arcanes.be/exploration"}),e.jsx("link",{rel:"alternate",hrefLang:"nl",href:"https://arcanes.be/verkenning"}),e.jsx("link",{rel:"alternate",hrefLang:"x-default",href:"https://arcanes.be/exploration"}),e.jsx("script",{type:"application/ld+json",children:JSON.stringify(Pn)})]}),e.jsx(Ln,{isLoggedIn:l,totalCredits:w}),e.jsx("div",{className:"xp-hero",children:e.jsxs("div",{className:"xp-w",children:[e.jsxs("div",{style:{fontSize:9,color:"#B8B4AE",marginBottom:3},children:[e.jsx(vn,{to:"/",style:{color:"#B8B4AE",textDecoration:"none"},children:o("Accueil","Home","Home")}),e.jsx("span",{style:{margin:"0 3px"},children:"›"}),e.jsx("span",{style:{color:"#7A7670"},children:o("Exploration","Verkenning","Exploration")})]}),e.jsxs("div",{className:"xp-hero-inner",children:[e.jsxs("div",{className:"xp-hero-left",children:[e.jsx("div",{className:"xp-hero-eyebrow",children:o("Screener immobilier","Vastgoedscreener","Property Screener")}),e.jsx("h1",{children:t==="nl"?e.jsxs(e.Fragment,{children:["Vind de gemeente ",e.jsx("span",{children:"die past."})]}):e.jsxs(e.Fragment,{children:["Trouvez la commune ",e.jsx("span",{children:"qui match."})]})}),e.jsx("div",{className:"xp-hero-sub",children:d?"Ajoutez des indicateurs, combinez-les, et laissez la carte révéler les meilleures opportunités parmi 581 communes belges.":"Voeg indicatoren toe, combineer ze, en laat de kaart de beste kansen onthullen onder 581 Belgische gemeenten."})]}),e.jsxs("div",{className:"xp-hero-stats",children:[e.jsxs("div",{className:"xp-hero-stat",children:[e.jsx("div",{className:"xp-hero-stat-n",children:D.length||"581"}),e.jsx("div",{className:"xp-hero-stat-l",children:o("Communes","Gemeenten","Municipalities")})]}),e.jsxs("div",{className:"xp-hero-stat",children:[e.jsx("div",{className:"xp-hero-stat-n",children:ie.length}),e.jsx("div",{className:"xp-hero-stat-l",children:o("Indicateurs","Indicatoren","Indicators")})]}),e.jsxs("div",{className:"xp-hero-stat",children:[e.jsx("div",{className:"xp-hero-stat-n",children:"80+"}),e.jsx("div",{className:"xp-hero-stat-l",children:o("Data points","Datapunten","Data points")})]})]})]})]})}),e.jsx("div",{style:{background:"#F7F5F2",position:"sticky",top:64,zIndex:30,borderBottom:"1px solid #E8E4DE"},children:e.jsx("div",{className:"xp-w",children:e.jsxs("div",{className:"xp-bar",children:[e.jsxs("div",{className:"xp-srch",children:[e.jsx(Tn,{size:10,style:{color:"#B8B4AE",flexShrink:0}}),e.jsx("input",{value:E,onChange:n=>B(n.target.value),placeholder:o("Commune…","Gemeente…","Municipality…")}),E&&e.jsx("button",{style:{background:"none",border:"none",cursor:"pointer",padding:0},onClick:()=>B(""),children:e.jsx($e,{size:7,color:"#7A7670"})})]}),e.jsxs("div",{style:{position:"relative"},ref:Me,children:[e.jsxs("button",{className:`xp-add ${m.length===0?"empty":""}`,onClick:()=>oe(!Ue),children:[e.jsx(Yn,{size:10}),m.length===0?d?"Ajouter des indicateurs":"Indicatoren toevoegen":d?"Indicateurs":"Indicatoren",m.length>0&&e.jsx("span",{className:"xp-ind-cnt",children:m.length})]}),m.length>0&&e.jsx("button",{className:"xp-reset",onClick:()=>M([]),title:"Reset",children:e.jsx(cn,{size:8})}),Ue&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"xp-pk-backdrop",onClick:()=>oe(!1)}),e.jsxs("div",{className:"xp-pk xp-a",children:[e.jsxs("div",{className:"xp-pk-head",children:[e.jsxs("span",{style:{fontSize:11,fontWeight:700,color:"#0D1109"},children:[m.length," ",o("sélectionnés","geselecteerd","selected")]}),m.length>0&&e.jsxs("button",{className:"xp-pk-reset",onClick:()=>M([]),children:[e.jsx(cn,{size:9}),o("Réinitialiser","Reset","Reset")]})]}),e.jsxs("div",{style:{display:"flex",gap:4,padding:"6px 14px 4px"},children:[e.jsxs("button",{className:"xp-pk-act",onClick:()=>Je(n=>!n),style:{border:"1px solid",borderColor:ye?"#0F4C4C":"#E8E4DE",background:ye?"rgba(15,76,76,.04)":"white",color:ye?"#0F4C4C":"#7A7670"},children:[e.jsx(We,{size:9,color:"#D4AF37"}
130),o("Stratégies","Strategieën","Strategies")]}),e.jsxs("button",{className:"xp-pk-act",onClick:()=>{oe(!1),setTimeout(()=>{var n;return(n=document.getElementById("ref-tables"))==null?void 0:n.scrollIntoView({behavior:"smooth"})},150)},style:{border:"1px solid #E8E4DE",background:"white",color:"#7A7670"},children:[e.jsx(On,{size:9}),o("Catalogue","Catalogus","Catalogue")]})]}),ye&&e.jsx("div",{style:{padding:"4px 14px 8px",borderBottom:"1px solid #F0EDE8"},children:e.jsx(lt,{lang:t,active:m,fr:d,isPremium:A,onApply:(n,i)=>{M(n),Be("composite"),Ne(i),Je(!1),oe(!1)},onUpsell:()=>$(!0)})}),xe.map(n=>{const i=kn.has(n.id),a=n.layers.filter(r=>m.includes(r.id)).length;return e.jsxs("div",{children:[e.jsxs("div",{className:"xp-pk-cat",style:{cursor:"pointer",userSelect:"none"},onClick:()=>jn(r=>{const s=new Set(r);return s.has(n.id)?s.delete(n.id):s.add(n.id),s}),children:[e.jsx("span",{style:{flex:1},children:t==="nl"?n.nl:t==="en"?n.en:n.fr}),a>0&&e.jsx("span",{style:{fontSize:7,fontWeight:800,background:"#0F4C4C",color:"white",borderRadius:3,padding:"0 4px",minWidth:12,textAlign:"center"},children:a}),e.jsx(ue,{size:14,style:{color:"#0F4C4C",transition:"transform .15s",transform:i?"rotate(-90deg)":"rotate(0)",flexShrink:0,opacity:.7}})]}),!i&&n.layers.map(r=>{const s=m.includes(r.id),x=!r.free&&!A,h=r.composite?null:Ce(D,r.field);return e.jsxs("div",{className:`xp-pk-item ${s?"on":""}`,onClick:()=>{if(x){$(!0);return}Fn(r.id)},children:[e.jsx("div",{className:`xp-pk-cb ${s?"on":""}`,children:s?m.indexOf(r.id)+1:""}),e.jsx("div",{className:"xp-pk-dot",style:{background:r.gradient[Math.floor(r.gradient.length/2)]}}),e.jsxs("div",{style:{flex:1},children:[e.jsxs("div",{className:"xp-pk-name",children:[t==="nl"?r.nl:t==="en"?r.en:r.fr,r.free&&e.jsx("span",{className:"xp-pk-free",children:o("Gratuit","Gratis","Free")}),x&&e.jsxs("span",{className:"xp-pk-lock",children:[e.jsx(_n,{size:7}),"PRO"]})]}),h&&e.jsxs("div",{className:"xp-pk-range",children:[r.format(h.min)," → ",r.format(h.max)]}),r.composite&&e.jsx("div",{className:"xp-pk-comp",children:t==="nl"?r.composite.descNl:t==="en"?r.composite.descEn:r.composite.descFr})]})]},r.id)})]},n.id)})]})]})]}),e.jsxs("div",{className:"xp-dd",ref:Ie,children:[e.jsxs("button",{className:`xp-btn-s ${j.size?"has":""}`,onClick:()=>Qe(!Ye),children:[o("Province","Provincie","Province"),j.size>0&&e.jsx("span",{style:{background:"#0F4C4C",color:"white",borderRadius:3,padding:"0 3px",fontSize:7,fontWeight:800},children:j.size}),e.jsx(ue,{size:8,style:{color:"#B8B4AE"}})]}),Ye&&e.jsx("div",{className:"xp-dd-list xp-a",children:Jn.map(n=>e.jsxs("div",{className:"xp-dd-item",onClick:()=>{const i=new Set(j);i.has(n)?i.delete(n):i.add(n),re(i)},children:[e.jsx("div",{className:`xp-dd-cb ${j.has(n)?"on":""}`,children:j.has(n)?"✓":""}),e.jsx("span",{children:n})]},n))})]}),e.jsxs("div",{className:"xp-vt",children:[e.jsxs("button",{className:f==="hybrid"?"on":"",onClick:()=>b("hybrid"),title:o("Carte + Tableau","Kaart + Tabel","Map + Table"),children:[e.jsx(qn,{size:9}),e.jsx(pn,{size:9})]}),e.jsx("button",{className:f==="table"?"on":"",onClick:()=>b("table"),title:o("Tableau complet","Volledige tabel","Full table"),children:e.jsx(pn,{size:9})})]}),m.length>0&&e.jsxs("button",{className:"xp-btn-s",onClick:()=>it(O,m.map(U).filter(Boolean),d,j,t),title:"PDF",children:[e.jsx(Vn,{size:9}),"PDF"]}),e.jsxs("span",{className:"xp-cnt",children:[O.length," / ",D.length,de&&e.jsx("button",{className:"xp-fx",onClick:wn,style:{marginLeft:3},title:o("Supprimer les filtres","Filters verwijderen","Clear filters"),children:e.jsx($e,{size:7})})]})]})})}),e.jsx("div",{style:{background:"#F7F5F2",paddingBottom:16},children:e.jsx("div",{className:"xp-w",children:e.jsxs("div",{className:"xp-main",children:[e.jsxs("div",{className:`xp-map m-${f}`,style:{"--map-w":W.length<=1?"65%":W.length<=2?"58%":W.length<=3?"52%":W.length<=5?"45%":"40%"},children:[e.jsx("div",{ref:Re,style:{width:"100%",height:"100%"}}),m.length>0&&e.jsxs("div",{className:"xp-leg",children:[T.length>=2?e.jsxs("select",{value:q==="auto"?g.type==="single"?g.lyr.field:"composite":q,onChange:n=>{Be(n.target.value),n.target.value!=="composite"&&Ne("")},style:{width:"100%",padding:"3px 4px",borderRadius:5,border:"1px solid #E8E4DE",background:"white",fontSize:8,fontWeight:700,color:"#0F4C4C",fontFamily:"'Outfit',sans-serif",curs
130or:"pointer",marginBottom:3,appearance:"auto"},children:[e.jsx("option",{value:"composite",children:Sn||o("Score combiné","Gecombineerde score","Combined score")}),T.map(n=>e.jsx("option",{value:n.field,children:t==="nl"?n.nl:t==="en"?n.en:n.fr},n.id))]}):e.jsx("div",{style:{fontWeight:700,color:"#0D1109",textTransform:"uppercase",letterSpacing:".2px",fontSize:7,marginBottom:1},children:An}),e.jsx("div",{className:"xp-leg-bar",children:Cn.map((n,i)=>e.jsx("div",{style:{flex:1,background:n}},i))}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",color:"#7A7670",fontWeight:600},children:[e.jsx("span",{children:g.type==="composite"?"0":tn(le)}),e.jsx("span",{children:g.type==="composite"?"100":tn(ce)})]})]}),y&&e.jsxs("div",{style:{position:"absolute",inset:0,background:"rgba(255,255,255,.8)",zIndex:6,display:"flex",alignItems:"center",justifyContent:"center"},children:[e.jsx("div",{style:{width:16,height:16,border:"2px solid rgba(15,76,76,.1)",borderTopColor:"#0F4C4C",borderRadius:"50%",animation:"xp-spin .7s linear infinite"}}),e.jsx("style",{children:"@keyframes xp-spin{to{transform:rotate(360deg)}}"})]}),e.jsx("div",{className:`xp-dov ${Ee&&S?"open":""}`,children:S&&e.jsx(bn,{c:S,fr:d,lang:t,isPremium:A,slugMap:p,onClose:rn,onUpsell:()=>$(!0)})}),m.length===0&&!y&&e.jsxs("div",{style:{position:"absolute",bottom:10,left:"50%",transform:"translateX(-50%)",zIndex:5,background:"rgba(255,255,255,.9)",borderRadius:8,padding:"8px 14px",border:"1px solid #E8E4DE",textAlign:"center",maxWidth:200},children:[e.jsx("div",{style:{fontSize:10,fontWeight:700,color:"#0D1109"},children:o("Carte vierge","Lege kaart","Blank map")}),e.jsx("div",{style:{fontSize:9,color:"#7A7670"},children:o("Ajoutez un indicateur","Voeg indicator toe","Add an indicator")})]})]}),e.jsx("div",{className:`xp-right ${f==="table"?"full":""}`,children:m.length===0&&D.length>0?e.jsxs("div",{className:"xp-empty",children:[e.jsx(Qn,{size:38,color:"#C8C4BE",style:{marginBottom:6,opacity:.35}}),e.jsx("div",{style:{fontSize:13,fontWeight:700,color:"#0D1109",marginBottom:2},children:o("Commencez votre analyse","Start uw analyse","Start your analysis")}),e.jsx("div",{style:{fontSize:10,color:"#7A7670",maxWidth:220},children:d?"Ajoutez un indicateur pour explorer les communes.":"Voeg een indicator toe om gemeenten te verkennen."})]}):e.jsxs("div",{className:"xp-list",ref:Le,style:f==="hybrid"?{paddingLeft:10,paddingRight:6}:{paddingLeft:14},children:[f==="hybrid"&&V.length>W.length&&e.jsx("div",{className:"xp-trunc-note",style:{cursor:"pointer"},onClick:()=>b("table"),children:d?`${V.length-W.length} col. masquées — cliquez pour vue complète`:`${V.length-W.length} kol. verborgen — klik voor volledig overzicht`}),e.jsxs("table",{className:`xp-tbl${W.length>=4?" cols-many":""}`,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:28,fontSize:f==="hybrid"?10:11,padding:f==="hybrid"?"6px 4px":"8px 8px"},children:"#"}),e.jsxs("th",{style:{fontSize:f==="hybrid"?11:12,padding:f==="hybrid"?"6px 6px":"8px 8px"},onClick:()=>qe("nom_commune"),children:[o("Commune","Gemeente","Municipality"),P==="nom_commune"&&e.jsx("span",{style:{marginLeft:2},children:N==="asc"?"↑":"↓"})]}),e.jsxs("th",{style:{fontSize:f==="hybrid"?9:12,padding:f==="hybrid"?"6px 4px":"8px 8px",cursor:"pointer",color:"#7A7670"},onClick:()=>qe("nom_province"),children:[f==="hybrid"?o("Prov.","Prov.","Prov."):o("Province","Provincie","Province"),P==="nom_province"&&e.jsx("span",{style:{marginLeft:2},children:N==="asc"?"↑":"↓"})]}),W.map(n=>{const i=ee[n.k],a=i&&(i.min||i.max),r=on===n.k;return e.jsxs("th",{className:"num",style:{position:"relative",fontSize:f==="hybrid"?10:11,padding:f==="hybrid"?"6px 5px":"8px 8px"},ref:r?Se:void 0,children:[e.jsxs("span",{onClick:()=>He(r?null:n.k),style:{cursor:"pointer",display:"inline-flex",alignItems:"center",gap:2},children:[n.l,a&&e.jsx(dn,{size:6,style:{color:"#D4AF37"}}),P===n.k&&e.jsx("span",{children:N==="asc"?"↑":"↓"}),e.jsx(ue,{size:7,style:{color:r?"#0F4C4C":"#C8C4BE",transition:"transform .15s",transform:r?"rotate(180deg)":"rotate(0)"}})]}),r&&e.jsxs("div",{className:"xp-col-pop xp-a",onClick:s=>s.stopPropagation(),children:[e.jsx("div",{className:"xp-col-pop-title",children:n.l}),e.jsxs("div",{className:"xp-col-sort",children:[e.jsx("button",{className:P===n.k&&N==="desc"?"on":"",onClick:()=>{X(!0),se(n.k),J("desc")},children:o("↓ Décroissant","↓ Aflopend","↓ Descending")}),e.jsx("button",{className:P===n.k&&N==="asc"?"on":"",onClick:()=>{X(!0),se(n.k),J("asc")},children:o("↑ Croissant","↑ Oplopend","↑ Ascending")})]}),e.jsxs("div",{className:"xp-col-range",children:[e.jsx("label",{children:o("Filtrer","Filteren","Filter")}),e.jsxs("div",{className:"xp-col-range-row",children:[e.jsx("input",{type:"number",placeholder:"Min",value:(i==null?void 0:i.min)||"",onChange:s=>_e(n.k,"min",s.target.value)}),e.jsx("span",{style:{fontSize:8,color:"#B8B4AE"},children:"—"}),e.jsx("input",{type:"number",placeholder:"Max",value:(i==null?void 0:i.max)||"",onChange:s=>_e(n.k,"max",s.target.value)})]})]}),a&&e.jsx("button",{className:"xp-col-clear",onClick:()=>Ze(n.k),children:o("Supprimer le filtre","Filter verwijderen","Remove filter")})]})]},n.k)})]})}),e.jsx("tbody",{children:en.map((n,i)=>
130{const a=n.code_ins===(S==null?void 0:S.code_ins),r=n.code_ins===Q,s=n;return e.jsxs("tr",{id:`r-${n.code_ins}`,className:`${a?"sel":""} ${r?"hov":""}`,onClick:()=>an(n),onDoubleClick:()=>En(n),onMouseEnter:()=>be(n.code_ins),onMouseLeave:()=>be(null),style:{cursor:"pointer"},children:[e.jsx("td",{style:{fontSize:9,color:"#B8B4AE",fontWeight:700},children:i+1}),e.jsx("td",{style:{fontWeight:700,fontSize:10,whiteSpace:"nowrap"},children:t==="nl"&&n.nom_commune_nl||n.nom_commune}),e.jsx("td",{style:{fontSize:f==="hybrid"?8:9,color:"#7A7670"},children:n.nom_province}),W.map(x=>{const h=s[x.k],pe=m.map(U).find(R=>(R==null?void 0:R.field)===x.k);return pe&&!pe.free&&!A?e.jsx("td",{className:"num lk-cell",onClick:R=>{R.stopPropagation(),$(!0)},children:"🔒"},x.k):e.jsx("td",{className:"num",children:x.fmt(h)},x.k)})]},n.code_ins)})})]}),nn&&e.jsx("button",{onClick:()=>De(n=>n+Ae),className:"xp-more",children:o(`Plus (${O.length-Y})`,`Meer (${O.length-Y})`,`More (${O.length-Y})`)}),!A&&m.length>0&&e.jsxs("div",{style:{background:"linear-gradient(135deg,#0F4C4C,#0A3535)",borderRadius:10,padding:"14px 16px",marginTop:8,textAlign:"center"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:5,marginBottom:6},children:[e.jsx(We,{size:12,color:"#D4AF37"}),e.jsx("span",{style:{fontSize:12,fontWeight:700,color:"white"},children:o("Débloquez les données premium","Ontgrendel premium data","Unlock premium data")})]}),e.jsx("div",{style:{fontSize:10,color:"rgba(255,255,255,.6)",marginBottom:8,lineHeight:1.4},children:d?"Rendements, scores Arcanes, prévisions et stratégies.":"Rendementen, Arcanes scores, voorspellingen en strategieën."}),e.jsxs("button",{onClick:()=>k("/tarifs"),className:"xp-cta-gold",children:[o("Voir les offres","Aanbiedingen","View plans"),e.jsx(sn,{size:10})]})]})]})})]})})}),e.jsx("div",{style:{background:"white",borderTop:"1px solid #E8E4DE"},children:e.jsxs("div",{className:"xp-seo",children:[e.jsx("h2",{children:o("Screener immobilier belge — Guide complet","Belgische vastgoedscreener — Volledige gids","Belgian property screener — Complete guide")}),e.jsx("p",{children:d?"Le screener immobilier Arcanes (arcanes.be/exploration) est un outil interactif gratuit qui permet d'explorer, comparer et analyser les 581 communes belges selon plus de 80 indicateurs issus de sources officielles. Les données couvrent les 3 régions (Wallonie, Flandre, Bruxelles-Capitale) et les 11 provinces. Sources : Statbel (SPF Économie) pour les prix et transactions immobilières, SPF Finances pour le cadastre et la fiscalité, SPF Intérieur (Police fédérale) pour la criminalité, SNCB/NMBS pour le transport ferroviaire, SPF MyRent pour les loyers médians. Les utilisateurs peuvent combiner plusieurs indicateurs pour obtenir un score composite personnalisé et exporter les résultats en PDF.":"De Arcanes vastgoedscreener (arcanes.be/verkenning) is een gratis interactieve tool waarmee u de 581 Belgische gemeenten kunt verkennen, vergelijken en analyseren op basis van meer dan 80 indicatoren uit officiële bronnen. De gegevens bestrijken de 3 gewesten (Wallonië, Vlaanderen, Brussels Hoofdstedelijk Gewest) en de 11 provincies. Bronnen: Statbel (FOD Economie) voor prijzen en transacties, FOD Financiën voor kadaster en fiscaliteit, FOD Binnenlandse Zaken (Federale Politie) voor criminaliteit, NMBS voor spoorvervoer, FOD MyRent voor mediaan huurprijzen."}),e.jsxs("details",{children:[e.jsx("summary",{children:o("Comment fonctionne le screener immobilier Arcanes ?","Hoe werkt de Arcanes vastgoedscreener?","How does the Arcanes property screener work?")}),e.jsx("p",{children:d?"Cliquez sur « Ajouter des indicateurs » pour sélectionner les données qui vous intéressent parmi 8 catégories : Prix & Coûts, Rendement & Loyers, Population & Ménages, Bâti & Logement, Sécurité & Transport, Fiscalité, Scores Arcanes et Stratégies combinées. Chaque indicateur sélectionné colore automatiquement la carte interactive et trie le classement des communes. Sélectionnez plusieurs indicateurs simultanément : la carte affiche alors un score composite normalisé. Filtrez par province pour zoomer sur une zone. Basculez entre vue c
130arte + tableau ou tableau plein écran. Exportez vos résultats en PDF.":"Klik op « Indicatoren toevoegen » om gegevens te selecteren uit 8 categorieën: Prijs & Kosten, Rendement & Huur, Bevolking & Huishoudens, Gebouwen & Woningen, Veiligheid & Transport, Fiscaliteit, Arcanes Scores en Gecombineerde strategieën. Elke geselecteerde indicator kleurt automatisch de interactieve kaart in en sorteert de gemeentelijst. Selecteer meerdere indicatoren tegelijk: de kaart toont dan een genormaliseerde compositescore. Filter op provincie om in te zoomen. Schakel tussen kaart + tabel of volledig tabelweergave. Exporteer resultaten als PDF."})]}),e.jsxs("details",{children:[e.jsx("summary",{children:o("Quelles sont les sources de données utilisées ?","Welke gegevensbronnen worden gebruikt?","What data sources are used?")}),e.jsx("p",{children:d?"Prix médians des maisons et appartements : Statbel (SPF Économie). Transactions immobilières : Statbel. Revenus médians et précarité : Statbel (déclarations fiscales). Criminalité et cambriolages : Police fédérale (SPF Intérieur), données par zone de police. Transport ferroviaire : SNCB/NMBS, fréquences et gares. Loyers médians : SPF MyRent (contrats de bail enregistrés). Cadastre et fiscalité : SPF Finances (revenu cadastral, centimes additionnels communaux et provinciaux). Bâti et logements : Statbel (registre national des bâtiments). Toutes les données sont mises à jour annuellement.":"Mediaanprijzen woningen en appartementen: Statbel (FOD Economie). Vastgoedtransacties: Statbel. Mediaaninkomens en armoede: Statbel (belastingaangiften). Criminaliteit en inbraken: Federale Politie (FOD Binnenlandse Zaken), gegevens per politiezone. Spoorvervoer: NMBS, frequenties en stations. Mediaan huurprijzen: FOD MyRent (geregistreerde huurcontracten). Kadaster en fiscaliteit: FOD Financiën (kadastraal inkomen, gemeentelijke en provinciale opcentiemen). Gebouwen en woningen: Statbel (nationaal gebouwenregister). Alle gegevens worden jaarlijks bijgewerkt."})]}),e.jsxs("details",{children:[e.jsx("summary",{children:o("Quels indicateurs sont gratuits ?","Welke indicatoren zijn gratis ?","Which indicators are free?")}),e.jsx("p",{children:d?"25 indicateurs sont entièrement gratuits et accessibles sans inscription : tous les indicateurs des catégories Prix & Coûts (8 indicateurs incluant prix médians maison et appartement, évolution 5 et 10 ans, transactions, écart régional, coût total d'achat, ratio d'accessibilité), Population & Ménages (7 indicateurs incluant population, ménages, isolés, familles, revenu médian, précarité), Bâti & Logement (5 indicateurs incluant ancienneté du parc, appartements, urbanité, risque rénovation), et Sécurité & Transport (5 indicateurs incluant criminalité, cambriolages, transport, trains). Les indicateurs Premium incluent les rendements locatifs, scores Arcanes, prévisions et stratégies combinées.":"25 indicatoren zijn volledig gratis en toegankelijk zonder registratie: alle indicatoren in de categorieën Prijs & Kosten (8 indicatoren waaronder mediaanprijzen woning en appartement, evolutie 5 en 10 jaar, transacties, regionaal verschil, totale aankoopkosten, betaalbaarheidsratio), Bevolking & Huishoudens (7 indicatoren waaronder bevolking, hu
130ishoudens, alleenstaanden, gezinnen, mediaaninkomen, armoede), Gebouwen & Woningen (5 indicatoren waaronder ouderdom patrimonium, appartementen, urbaniteit, renovatierisico), en Veiligheid & Transport (5 indicatoren waaronder criminaliteit, inbraken, transport, treinen). Premium indicatoren omvatten huurrendementen, Arcanes scores, voorspellingen en gecombineerde strategieën."})]}),e.jsxs("details",{children:[e.jsx("summary",{children:o("Comment fonctionnent les stratégies combinées ?","Hoe werken gecombineerde strategieën?","How do combined strategies work?")}),e.jsx("p",{children:d?"Les stratégies combinées sont des indicateurs composites qui fusionnent automatiquement 3 métriques en un score unique de 0 à 100. Stratégie Cashflow Max : combine rendement brut, demande locative et prix bas. Stratégie Investissement Sûr : combine score Arcanes, sécurité et accessibilité. Stratégie Plus-value : combine prévision de prix, évolution 5 ans et tension de marché. Chaque métrique est normalisée avec inversion automatique pour les indicateurs « lower is better ». La carte affiche un gradient rouge (score bas) à vert (score élevé).":"Gecombineerde strategieën zijn samengestelde indicatoren die automatisch 3 metrics samenvoegen tot een unieke score van 0 tot 100. Cashflow Max strategie: combineert brutorendement, huurvraag en lage prijs. Veilige Investering strategie: combineert Arcanes score, veiligheid en betaalbaarheid. Meerwaarde strategie: combineert prijsvoorspelling, evolutie 5 jaar en marktspanning. Elke metric wordt genormaliseerd met automatische inversie voor « lower is better » indicatoren. De kaart toont een verloop van rood (lage score) naar groen (hoge score)."})]}),e.jsxs("details",{children:[e.jsx("summary",{children:o("Arcanes propose-t-il d'autres outils immobiliers ?","Biedt Arcanes andere vastgoedtools aan?","Does Arcanes offer other property tools?")}),e.jsx("p",{children:d?"Oui. En plus du screener, Arcanes propose : des analyses complètes par commune (581 fiches détaillées), 7 simulateurs immobiliers gratuits (frais d'acte, prêt hypothécaire, capacité d'emprunt, impact PEB, rendement locatif, précompte immobilier, TRI 10 ans), une carte interactive avec 10 thèmes de visualisation, et des rapports PDF d'analyse patrimoniale. Tous les outils sont bilingues français-néerlandais et conformes FSMA.":"Ja. Naast de screener biedt Arcanes: volledige analyses per gemeente (581 gedetailleerde fiches), 7 gratis vastgoedsimulatoren (aankoopkosten, hypothecaire lening, leencapaciteit, EPC-impact, huurrendement, onroerende voorheffing, IRR 10 jaar), een interactieve kaart met 10 visualisatiethema's, en PDF-rapporten voor vermogensanalyse. Alle tools zijn tweetalig Frans-Nederlands en FSMA-conform."})]}),e.jsxs("details",{children:[e.jsx("summary",{children:d?"Comment créer sa propre stratégie d'investissement avec le screener ?":"Hoe maak je je eigen investeringsstrategie met de screener?"}),e.jsx("p",{children:d?"Le screener Arcanes vous permet de construire une stratégie personnalisée en 3 étapes : (1) Sélectionnez 2 à 6 indicateurs qui correspondent à vos critères d'investissement — par exemple, rendement brut, prix bas, bonne sécurité et faible fiscalité. (2) Cliquez sur le bouton « Combiner » dans la barre d'outils pour fusionner automatiquement vos indicateurs en un score composite de 0 à 100. Chaque indicateur est normalisé et pondéré à parts égales, avec inversion automatique pour les métriques « plus bas = mieux » (prix, criminalité, fiscalité). (3) Affinez avec les filtres min/max pour exclure les communes qui ne respectent pas vos seuils absolus. La carte et le classement se mettent à jour en temps réel. Exportez le résultat en PDF pour conserver votre analyse. Contrairement aux stratégies prédéfinies (Cashflow Max, Investissement Sûr, Plus-value), votre stratégie custom reflète exactement vos priorités.":"Met de Arcanes screener kunt u in 3 stappen een gepersonaliseerde strategie opbouwen: (1) Selecteer 2 tot 6 indicatoren die overeenkomen met uw investeringscriteria — bijvoorbeeld brutorendement, lage prijs, goede veiligheid en lage fiscaliteit. (2) Klik op de knop « Combineer » in de werkbalk om uw indicatoren automatisch samen te voegen tot een compositescore van 0 tot 100. Elke indicator wordt genormaliseerd en gelijk gewogen, met automatische inversie voor « lager = beter » metrics (prijs, criminaliteit, fiscaliteit). (3) Verfijn met min/max-filters om gemeenten uit te sluiten die niet aan uw absolute drempels voldoen. De kaart en ranglijst worden in realtime bijgewerkt. Exporteer het resultaat als PDF om uw analyse te bewaren. In tegenstelling tot de vooraf gedefinieerde strategieën (Cashflow Max, Veilige Investering, Meer
130waarde) weerspiegelt uw aangepaste strategie precies uw prioriteiten."})]}),e.jsxs("details",{children:[e.jsx("summary",{children:d?"Comment est calculé le score d'investissement Arcanes ?":"Hoe wordt de Arcanes investeringsscore berekend?"}),e.jsx("p",{children:d?"Le score Arcanes (0-100) évalue le potentiel d'investissement d'une commune en combinant deux piliers : Rendement (50%) basé sur le rendement locatif brut et la demande locative, et Potentiel (50%) basé sur l'évolution des prix, le momentum, la croissance des ménages, l'attractivité familles (écoles, sécurité, transport) et la tension offre/demande.":"De Arcanes score (0-100) evalueert het investeringspotentieel van een gemeente door twee pijlers te combineren: Rendement (50%) gebaseerd op bruto huurrendement en huurvraag, en Potentieel (50%) gebaseerd op prijsevolutie, momentum, huishoudensgroei, gezinsaantrekkelijkheid (scholen, veiligheid, transport) en vraag/aanbod-spanning. Een score boven 70 wijst op hoog potentieel, tussen 50 en 70 matig potentieel, en onder 50 beperkt potentieel."})]}),e.jsxs("div",{id:"ref-tables",style:{marginTop:24},children:[e.jsx("h2",{children:o("Catalogue complet des indicateurs","Volledig indicatorenoverzicht","Complete indicator catalogue")}),e.jsx("p",{children:d?`Le screener Arcanes propose ${ie.filter(n=>!n.composite).length} indicateurs individuels répartis en ${xe.length} catégories, plus ${te.length} stratégies composites prédéfinies. Chaque indicateur est calculé à partir de sources officielles belges et peut être utilisé seul pour colorer la carte, ou combiné avec d'autres pour créer un score composite personnalisé (0-100).`:`De Arcanes screener biedt ${ie.filter(n=>!n.composite).length} individuele indicatoren verdeeld over ${xe.length} categorieën, plus ${te.length} vooraf gedefinieerde composietstrategieën. Elke indicator wordt berekend op basis van officiële Belgische bronnen en kan alleen worden gebruikt om de kaart in te kleuren, of gecombineerd met andere voor een gepersonaliseerde compositescore (0-100).`}),xe.map(n=>{const i=n.layers.filter(a=>!a.composite);return i.length?e.jsxs("details",{style:{marginBottom:4},children:[e.jsxs("summary",{children:[t==="nl"?n.nl:t==="en"?n.en:n.fr," (",i.length," ",o("indicateurs","indicatoren","indicators"),")"]}),e.jsx("div",{style:{padding:"8px 14px"},children:e.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:11},children:[e.jsx("thead",{children:e.jsxs("tr",{style:{borderBottom:"2px solid #0F4C4C",textAlign:"left"},children:[e.jsx("th",{style:{padding:"6px",color:"#0F4C4C",fontWeight:700,width:"22%"},children:o("Indicateur","Indicator","Indicator")}),e.jsx("th",{style:{padding:"6px",color:"#0F4C4C",fontWeight:700},children:o("Définition et source","Definitie en bron","Definition and source")}),e.jsx("th",{style:{padding:"6px",color:"#0F4C4C",fontWeight:700,textAlign:"center",width:60},children:o("Accès","Toegang","Access")})]})}),e.jsx("tbody",{children:i.map(a=>e.jsxs("tr",{style:{borderBottom:"1px solid #F0EDE8",verticalAlign:"top"},children:[e.jsx("td",{style:{padding:"6px",fontWeight:700,color:"#0D1109",fontSize:11},children:t==="nl"?a.nl:t==="en"?a.en:a.fr}),e.jsx("td",{style:{padding:"6px",color:"#7A7670",fontSize:11,lineHeight:1.5},children:t==="nl"?fn[a.field]||"—":t==="en"?hn[a.field]||"—":xn[a.field]||"—"}),e.jsx("td",{style:{padding:"6px",textAlign:"center"},children:a.free?e.jsx("span",{style:{color:"#059669",fontWeight:700,fontSize:9},children:"Gratuit"}):e.jsx("span",{style:{color:"#D4AF37",fontWeight:700,fontSize:9},children:"PRO"})})]},a.id))})]})})]},n.id):null}),e.jsx("h2",{style:{marginTop:24},children:o("Stratégies composites","Composietstrategieën","Composite strategies")}),e.jsx("p",{children:d?`${te.length} stratégies prédéfinies combinent automatiquement les indicateurs les plus pertinents pour chaque objectif d'investissement. Chaque stratégie génère un score composite de 0 à 100 en normalisant chaque indicateur (percentile 5-95) et en pondérant à parts égales, avec inversion automatique pour les métriques « plus bas = mieux ». Vous pouvez aussi créer votre propre combinaison via le sélecteur de couche « Score combiné » dans la légende de la carte.`:`${te.length} vooraf gedefinieerde strategieën combineren automatisch de meest relevante indicatoren voor elk investeringsdoel. Elke strategie genereert een compositescore van 0 tot 100 door elke indicator te normaliseren (5-95 percentiel) en gelijk te wegen, met automatische inversie voor « lager = beter » metrics. U kunt ook uw eigen combinatie maken via de laagkiezer « Gecombineerde score » in de kaartlegenda.`}),te.map(n=>e.jsxs("details",{style:{marginBottom:4},children:[e.jsxs("summary",{children:[t==="nl"?n.nl:t==="en"?n.en:n.fr," — ",n.fields.length," ",o("indicateurs","indicatoren","indicators")]}),e.jsxs("div",{style:{padding:"10px 14px",fontSize:11,color:"#0D1109",lineHeight:1.6},children:[e.jsx("p",{style:{margin:"0 0 8px",fontWeight:600},children:o("Indicateurs composants :","Samenstellende indicatoren:","Component indicators:")}),e.jsx("ul",{style:{margin:"0 0 10px",paddingLeft:18,fontSize:11,color:"#7A7670"},children:n.fields.map((i,a)=>{var s,x,h;
130const r=ie.find(pe=>pe.field===i);return e.jsxs("li",{style:{marginBottom:3},children:[e.jsx("span",{style:{fontWeight:700,color:"#0D1109"},children:r?t==="nl"?r.nl:t==="en"?r.en:r.fr:i}),n.fields.length>0&&` — ${t==="nl"?((s=fn[i])==null?void 0:s.split(".")[0])||"":t==="en"?((x=hn[i])==null?void 0:x.split(".")[0])||"":((h=xn[i])==null?void 0:h.split(".")[0])||""}.`]},i)})}),e.jsx("p",{style:{margin:0,fontSize:11,color:"#0D1109"},children:t==="nl"?ot[n.id]||n.descNl:t==="en"?st[n.id]||n.descFr:at[n.id]||n.descFr})]})]},n.id))]}),e.jsx("p",{style:{fontSize:10,color:"#B8B4AE",marginTop:16},children:d?"Document informatif — ne constitue pas un conseil en investissement. Digital Arcanes SRL — arcanes.be © 2026":"Informatief document — geen beleggingsadvies. Digital Arcanes SRL — arcanes.be © 2026"})]})}),f==="hybrid"&&e.jsxs("div",{className:"xp-bs",style:{transform:he?"translateY(0)":"translateY(calc(100% - 54px))"},children:[e.jsx("div",{className:"xp-bs-handle"}),e.jsxs("div",{className:"xp-bs-head",onClick:()=>Pe(!he),children:[e.jsxs("span",{style:{fontSize:11,fontWeight:700,color:"#0D1109"},children:[O.length," ",o("communes","gemeenten","municipalities")]}),!he&&e.jsx("span",{style:{fontSize:9,color:"#0F4C4C",fontWeight:600},children:o("Voir le classement","Bekijk ranking","View ranking")}),he?e.jsx(ue,{size:14,color:"#0F4C4C"}):e.jsx(Hn,{size:14,color:"#0F4C4C"})]}),e.jsxs("div",{className:"xp-bs-scroll",style:{paddingLeft:6,paddingRight:6},children:[Ee&&S&&e.jsx(bn,{c:S,fr:d,lang:t,isPremium:A,slugMap:p,onClose:rn,onUpsell:()=>$(!0)}),!Ee&&e.jsxs("table",{className:"xp-tbl",style:{fontSize:9},children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{fontSize:9,padding:"5px 4px"},children:"#"}),e.jsxs("th",{style:{fontSize:10,padding:"5px 4px"},onClick:()=>qe("nom_commune"),children:[o("Commune","Gemeente","Municipality"),P==="nom_commune"&&e.jsx("span",{style:{marginLeft:2},children:N==="asc"?"↑":"↓"})]}),V.slice(0,3).map(n=>{const i=ee[n.k],a=i&&(i.min||i.max),r=on===n.k;return e.jsxs("th",{className:"num",style:{position:"relative",fontSize:9,padding:"5px 3px"},ref:r?Se:void 0,children:[e.jsxs("span",{onClick:s=>{s.stopPropagation(),He(r?null:n.k)},style:{cursor:"pointer",display:"inline-flex",alignItems:"center",gap:2},children:[n.l,a&&e.jsx(dn,{size:5,style:{color:"#D4AF37"}}),P===n.k&&e.jsx("span",{children:N==="asc"?"↑":"↓"}),e.jsx(ue,{size:6,style:{color:r?"#0F4C4C":"#C8C4BE",transform:r?"rotate(180deg)":"rotate(0)"}})]}),r&&e.jsxs("div",{className:"xp-col-pop xp-a",style:{right:"auto",left:0,width:160},onClick:s=>s.stopPropagation(),children:[e.jsx("div",{className:"xp-col-pop-title",children:n.l}),e.jsxs("div",{className:"xp-col-sort",children:[e.jsx("button",{className:P===n.k&&N==="desc"?"on":"",onClick:()=>{X(!0),se(n.k),J("desc")},children:o("↓ Décroissant","↓ Aflopend","↓ Descending")}),e.jsx("button",{className:P===n.k&&N==="asc"?"on":"",onClick:()=>{X(!0),se(n.k),J("asc")},children:o("↑ Croissant","↑ Oplopend","↑ Ascending")})]}),e.jsxs("div",{className:"xp-col-range",children:[e.jsx("label",{children:o("Filtrer","Filteren","Filter")}),e.jsxs("div",{className:"xp-col-range-row",children:[e.jsx("input",{type:"number",placeholder:"Min",value:(i==null?void 0:i.min)||"",onChange:s=>_e(n.k,"min",s.target.value)}),e.jsx("span",{style:{fontSize:8,color:"#B8B4AE"},children:"—"}),e.jsx("input",{type:"number",placeholder:"Max",value:(i==null?void 0:i.max)||"",onChange:s=>_e(n.k,"max",s.target.value)})]})]}),a&&e.jsx("button",{className:"xp-col-clear",onClick:()=>Ze(n.k),children:o("Supprimer le filtre","Filter verwijderen","Remove filter")})]})]},n.k)})]})}),e.jsx("tbody",{children:en.map((n,i)=>{const a=n;return e.jsxs("tr",{onClick:()=>an(n),style:{cursor:"pointer"},children:[e.jsx("td",{style:{fontSize:8,color:"#B8B4AE",fontWeight:700},children:i+1}),e.jsxs("td",{style:{fontWeight:700,fontSize:9},children:[t==="nl"&&n.nom_commune_nl||n.nom_commune,e.jsx("br",{}),e.jsx("span",{style:{fontWeight:400,fontSize:7,color:"#B8B4AE"},children:n.nom_province})]}),V.slice(0,3).map(r=>{const s=m.map(U).find(h=>(h==null?void 0:h.field)===r.k);return s&&!s.free&&!A?e.jsx("td",{className:"num",style:{fontSize:8},onClick:h=>{h.stopPropagation(),$(!0)},children:"🔒"},r.k):e.jsx("td",{className:"num",style:{fontSize:8},children:r.fmt(a[r.k])},r.k)})]},n.code_ins)})})]}),nn&&e.jsx("button",{onClick:()=>De(n=>n+Ae),className:"xp-more",children:o(`Plus (${O.length-Y})`,`Meer (${O.length-Y})`,`More (${O.length-Y})`)})]})]}),e.jsx("div",{className:`xp-mo-bg ${yn?"open":""}`,onClick:()=>$(!1),children:e.jsxs("div",{className:"xp-mo",onClick:n=>n.stopPropagation(),children:[e.jsx("button",{className:"xp-mo-x",onClick:()=>$(!1),children:e.jsx($e,{size:9})}
130),e.jsx("div",{style:{width:34,height:34,borderRadius:8,background:"rgba(212,175,55,.1)",display:"flex",alignItems:"center",justifyContent:"center",marginBottom:8},children:e.jsx(We,{size:14,color:"#D4AF37"})}),e.jsx("div",{style:{fontSize:14,fontWeight:800,color:"#0D1109",marginBottom:2},children:o("Données Premium","Premium Data","Premium Data")}),e.jsx("div",{style:{fontSize:10,color:"#7A7670",lineHeight:1.5,marginBottom:12},children:d?"Débloquez les rendements, scores Arcanes, prévisions et stratégies combinées.":"Ontgrendel rendementen, Arcanes scores, voorspellingen en gecombineerde strategieën."}),e.jsxs("button",{onClick:()=>{$(!1),k("/tarifs")},className:"xp-cta-teal",children:[o("Voir les offres","Aanbiedingen","View plans"),e.jsx(sn,{size:10})]})]})}),e.jsx($n,{})]})}const te=[{id:"cashflow",fr:"Cashflow Max",nl:"Max Cashflow",en:"Max Cashflow",emoji:"",fields:["rendement_brut_maison_pct","rental_demand_score","prix_maison_median"],descFr:"Haut rendement + forte demande + prix bas",descNl:"Hoog rendement + sterke vraag + lage prijs",descEn:"High yield + strong demand + low price"},{id:"famille",fr:"Famille idéale",nl:"Ideaal gezin",en:"Ideal family",emoji:"",fields:["family_attractiveness_score","score_transport","prix_maison_median","nb_faits_pour_1000_hab"],descFr:"Attractivité familles + transport + prix + sécurité",descNl:"Gezinsaantrekkelijkheid + transport + prijs + veiligheid",descEn:"Family appeal + transport + price + safety"},{id:"plusvalue",fr:"Plus-value",nl:"Meerwaarde",en:"Capital gain",emoji:"",fields:["price_forecast_index","evol_prix_maison_5ans_pct","tension_offre_demande"],descFr:"Prévision prix + évolution + tension marché",descNl:"Prijsvoorspelling + evolutie + marktspanning",descEn:"Price forecast + trend + market tension"},{id:"securite",fr:"Investissement sûr",nl:"Veilige investering",en:"Safe investment",emoji:"",fields:["arcanes_investment_score","nb_faits_pour_1000_hab","affordability_ratio"],descFr:"Score Arcanes + sécurité + accessibilité",descNl:"Arcanes score + veiligheid + betaalbaarheid",descEn:"Arcanes score + safety + affordability"},{id:"fiscal",fr:"Fiscalité douce",nl:"Lage fiscaliteit",en:"Low taxation",emoji:"",fields:["centimes_additionnels_pri","taux_additionnel_ipp_pct","prix_maison_median"],descFr:"Centimes PRI bas + IPP bas + prix abordable",descNl:"Lage opcentiemen + lage PB + betaalbare prijs",descEn:"Low PRI surcharges + low PIT + affordable price"},{id:"renov",fr:"Rénovation opportuniste",nl:"Renovatie-kans",en:"Renovation play",emoji:"",fields:["renovation_potential_index","prix_maison_median","part_bat_avant_1946_pct"],descFr:"Potentiel réno + prix bas + parc ancien",descNl:"Renovatiepotentieel + lage prijs + oud patrimonium",descEn:"Reno potential + low price + old stock"},{id:"urban",fr:"Ville dynamique",nl:"Dynamische stad",en:"Dynamic city",emoji:"",fields:["score_urbanite","score_transport","population_totale","evol_menages_5ans_pct"],descFr:"Urbanité + transport + population + croissance",descNl:"Urbaniteit + transport + bevolking + groei",descEn:"Urbanity + transport + population + growth"},{id:"rural",fr:"Campagne paisible",nl:"Rustig platteland",en:"Peaceful countryside",emoji:"",fields:["prix_maison_median","nb_faits_pour_1000_hab","part_bat_avant_1946_pct"],descFr:"Prix bas + sécurité + charme ancien",descNl:"Lage prijs + veiligheid + oud karakter",descEn:"Low price + safety + old charm"},{id:"etudiant",fr:"Ville étudiante",nl:"Studentenstad",en:"Student city",emoji:"",fields:["loyer_median_appart","rendement_brut_appart_pct","score_transport","population_totale"],descFr:"Loyer appart + rendement appart + transport + population",descNl:"Huur appart + rendement appart + transport + bevolking",descEn:"Apt. rent + apt. yield + transport + population"},{id:"premiere",fr:"Premier achat",nl:"Eerste aankoop",en:"First purchase",emoji:"",fields:["prix_maison_median","affordability_ratio","evol_prix_maison_5ans_pct","score_transport"],descFr:"Prix bas + accessibilité + hausse + transport",descNl:"Lage prijs + betaalbaarheid + stijging + transport",descEn:"Low price + affordability + growth + transport"},{id:"patrimonial",fr:"Patrimoine long terme",nl:"Langetermijn vermogen",en:"Long-term wealth",emoji:"",fields:["arcanes_investment_score","evol_prix_maison_10ans_pct","rendement_brut_maison_pct","nb_transactions_total"],descFr:"Score Arcanes + évolution 10a + rendement + liquidité",descNl:"Arcanes score 
130+ evolutie 10j + rendement + liquiditeit",descEn:"Arcanes score + 10yr change + yield + liquidity"},{id:"revenu",fr:"Zone à hauts revenus",nl:"Zone hoge inkomens",en:"High-income area",emoji:"",fields:["revenu_median","prix_maison_median","part_familles_avec_enfants_pct"],descFr:"Revenu médian élevé + prix + familles",descNl:"Hoog mediaaninkomen + prijs + gezinnen",descEn:"High median income + price + families"}];function lt({active:t,fr:d,lang:o,isPremium:k,onApply:_,onUpsell:v}){const y=o,A=(p,C,m)=>y==="nl"?C:y==="en"?m:p,l=new Set(t.map(U).filter(p=>p&&!p.composite).map(p=>p.field)),z=t.map(U).filter(p=>p&&!p.composite),w=te.map(p=>{const C=p.fields.map(E=>ie.find(B=>B.field===E)).filter(Boolean),m=C.filter(E=>!l.has(E.field)),M=z.filter(E=>!p.fields.includes(E.field)),f=C.length-m.length,b=m.some(E=>!E.free&&!k);return{...p,need:C,toAdd:m,toRemove:M,match:f,pct:f/C.length,needsPremium:b,targetIds:C.map(E=>E.id)}}).sort((p,C)=>C.pct-p.pct||p.toAdd.length-C.toAdd.length),F=t.length===0?w.slice(0,4):w.filter(p=>p.match>=2).slice(0,4);return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[F.map(p=>{const C=p.toAdd.length===0&&p.toRemove.length===0;return e.jsxs("div",{style:{background:C?"rgba(5,150,105,.04)":"rgba(15,76,76,.02)",border:`1px solid ${C?"rgba(5,150,105,.15)":"rgba(15,76,76,.08)"}`,borderRadius:8,padding:"7px 9px"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:3},children:[e.jsx("div",{style:{fontSize:10,fontWeight:700,color:"#0D1109"},children:y==="nl"?p.nl:y==="en"?p.en:p.fr}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4},children:[e.jsx("span",{style:{fontSize:7,fontWeight:700,color:C?"#059669":"#0F4C4C",background:C?"rgba(5,150,105,.08)":"rgba(15,76,76,.06)",borderRadius:4,padding:"1px 5px"},children:C?"✓":`${p.match}/${p.need.length}`}),!C&&e.jsx("button",{className:"xp-ss-apply",onClick:()=>{if(p.needsPremium){v();return}_(p.targetIds,y==="nl"?p.nl:y==="en"?p.en:p.fr)},children:A("Appliquer","Toepassen","Apply")})]})]}),e.jsx("div",{style:{fontSize:8,color:"#7A7670",lineHeight:1.3,marginBottom:p.toAdd.length+p.toRemove.length>0?4:0},children:y==="nl"?p.descNl:y==="en"&&p.descEn||p.descFr}),(p.toAdd.length>0||p.toRemove.length>0)&&e.jsxs("div",{style:{display:"flex",gap:3,flexWrap:"wrap"},children:[p.toAdd.map(m=>e.jsxs("span",{style:{fontSize:7,padding:"1px 5px",borderRadius:4,background:"rgba(5,150,105,.06)",color:"#059669",fontWeight:600},children:["+ ",y==="nl"?m.nl:y==="en"?m.en:m.fr,!m.free&&!k?" 🔒":""]},m.id)),p.toRemove.map(m=>e.jsxs("span",{style:{fontSize:7,padding:"1px 5px",borderRadius:4,background:"rgba(220,38,38,.05)",color:"#dc2626",fontWeight:600},children:["− ",y==="nl"?m.nl:y==="en"?m.en:m.fr]},m.id))]})]},p.id)}),F.length===0&&e.jsx("div",{style:{fontSize:9,color:"#B8B4AE",textAlign:"center",padding:8},children:A("Ajoutez un indicateur pour voir les suggestions","Voeg een indicator toe voor suggesties","Add an indicator to see suggestions")})]})}function bn({c:t,fr:d,lang:o,isPremium:k,slugMap:_,onClose:v,onUpsell:y}
130){var M;const A=o,l=(f,b,E)=>A==="nl"?b:A==="en"?E:f,z=A==="nl"&&t.nom_commune_nl||t.nom_commune,w=_.get(t.code_ins),F=w?A==="nl"?w.slug_nl:w.slug_fr:"",p=t,C=[{l:l("Prix maison","Prijs woning","House price"),v:mn(t.prix_maison_median)},{l:l("Prix appart.","Prijs appart.","Apt. price"),v:t.prix_appart_median?mn(t.prix_appart_median):"N/A"},{l:"Transactions",v:((M=t.nb_transactions_total)==null?void 0:M.toLocaleString("fr-BE"))??"—"},{l:l("Rendement","Rendement","Yield"),v:p.rendement_brut_maison_pct!=null?`${p.rendement_brut_maison_pct}%`:"—",pro:!0},{l:"Score",v:t.arcanes_investment_score!=null?`${t.arcanes_investment_score}/100`:"—",pro:!0},{l:l("Tension","Spanning","Tension"),v:t.tod_label??"—",pro:!0},{l:l("Sécurité","Veiligheid","Safety"),v:p.score_securite_criminalite!=null?`${p.score_securite_criminalite}/100`:"—",pro:!0},{l:"Transport",v:p.label_transport??"—"},{l:l("Précompte","OV","Property tax"),v:p.cout_fiscal_annuel_estime?`${p.cout_fiscal_annuel_estime} €/an`:"—"},{l:l("Loyer","Huur","Rent"),v:p.loyer_median_maison?`${p.loyer_median_maison} €/m`:"—",pro:!0}],m=f=>!!f&&!k;return e.jsxs("div",{className:"xp-det xp-a",children:[e.jsxs("button",{className:"xp-det-back",onClick:v,children:[e.jsx(Kn,{size:10}),l("Retour","Terug","Back")]}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"xp-det-name",children:z}),e.jsxs("div",{className:"xp-det-sub",children:[t.nom_province," · ",Xn(t.code_region)]})]}),k&&t.arcanes_investment_score!=null&&(()=>{const f=nt(t.arcanes_investment_score);return e.jsx("div",{style:{background:f.bg,borderRadius:6,padding:"2px 7px"},children:e.jsx("div",{style:{fontSize:13,fontWeight:800,color:f.fg},children:t.arcanes_investment_score})})})()]}),e.jsx("div",{className:"xp-det-grid",children:C.map((f,b)=>e.jsxs("div",{className:`xp-dk ${m(f.pro)?"lk":""}`,children:[e.jsx("div",{className:"xp-dkl",children:f.l}),e.jsx("div",{className:"xp-dkv",children:f.v}),m(f.pro)&&e.jsx("div",{className:"xp-lov",onClick:y,children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:2,background:"rgba(212,175,55,.1)",borderRadius:3,padding:"1px 4px"},children:[e.jsx(_n,{size:6,color:"#D4AF37"}),e.jsx("span",{style:{fontSize:7,fontWeight:700,color:"#D4AF37"},children:"Pro"})]})})]},b))}),k&&t.ais_recommendation&&e.jsxs("div",{style:{background:"rgba(15,76,76,.04)",border:"1px solid rgba(15,76,76,.08)",borderRadius:7,padding:7,marginBottom:10,fontSize:9,color:"#0D1109",lineHeight:1.4},children:[e.jsx("strong",{style:{color:"#0F4C4C"},children:"Arcanes :"})," ",t.ais_recommendation]}),e.jsx("div",{style:{display:"flex",gap:5},children:F&&e.jsxs(vn,{to:A==="nl"?`/gemeente/${F}`:`/commune/${F}`,className:"xp-det-link",children:[l("Fiche complète","Profiel","Full profile"),e.jsx(Wn,{size:9})]})})]})}export{bt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.