const { useEffect, useMemo, useState } = React; const money = new Intl.NumberFormat("nl-NL",{style:"currency",currency:"EUR",maximumFractionDigits:0}); const labels={apartment:"Appartement",detached:"Vrijstaande villa","ground-floor":"Benedenwoning",penthouse:"Penthouse",terraced:"Geschakelde woning",villa:"Villa","semi-detached":"Halfvrijstaande villa"}; const title=p=>`${labels[p.type]||"Woning"} in ${p.town}`; const icon=(name)=>({bed:"▱",bath:"◫",area:"□",plot:"◇",heart:"♡",heartOn:"♥",pin:"⌖",search:"⌕",map:"⌖",grid:"▦",close:"×",back:"‹",next:"›"}[name]); async function sendLead(property=""){const fields=[...document.querySelectorAll("input,textarea")].slice(-4);const [name,email,phone,message]=fields.map(x=>x?.value||"");const r=await fetch("/contact.php",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name,email,phone,message,property})});const d=await r.json();alert(d.message||"Bedankt voor uw aanvraag.")} function useFavorites(){ const [ids,setIds]=useState(()=>JSON.parse(localStorage.getItem("helder-favorites")||"[]")); const toggle=id=>setIds(old=>{const next=old.includes(id)?old.filter(x=>x!==id):[...old,id];localStorage.setItem("helder-favorites",JSON.stringify(next));return next}); return [ids,toggle]; } function Header({page,setPage,favorites}){ return <>
Nederlandse begeleiding in Spanje +34 600 000 000 · info@helderrealestate.nl
} function FilterBar({filters,setFilters,onSearch,wide=false}){ const change=k=>e=>setFilters({...filters,[k]:e.target.value}); return
} function Card({p,isFavorite,toggle,onOpen}){ return
onOpen(p)}>{title(p)}/{p.newBuild?"Nieuwbouw":"Herverkoop"}â–§ {p.images?.length||1}
onOpen(p)}>

{icon("pin")} {p.town}, {p.province}

{title(p)}

{icon("bed")} {p.beds}{icon("bath")} {p.baths}{icon("area")} {p.built} m²{p.plot>0&&{icon("plot")} {p.plot} m²}
{money.format(p.price)}Ref. {p.ref}
} function PropertyGrid({items,favorites,toggle,onOpen,limit=24}){ const [count,setCount]=useState(limit); useEffect(()=>setCount(limit),[items,limit]); return <>
{items.slice(0,count).map(p=>)}
{count} } function Home({properties,favorites,toggle,setPage,onOpen,filters,setFilters,runSearch}){ const featured=properties.filter(p=>p.images?.length>8).slice(0,8); return <>

Luxury real estate · Costa Blanca & Costa Cálida

Vind uw plek
onder de Spaanse zon.

Een zorgvuldig geselecteerd woningaanbod en persoonlijke Nederlandse begeleiding, van oriëntatie tot sleuteloverdracht.

896+Actuele woningen
98Spaanse plaatsen
100%Persoonlijke begeleiding
HelderVan zoeken tot kopen

Nieuw in ons aanbod

Woningen om verliefd op te worden

Aankopen zonder zorgen

Lokale expertise.
Nederlandse helderheid.

Een woning kopen in Spanje vraagt om goede begeleiding. Wij selecteren, vergelijken, organiseren bezichtigingen en begeleiden het volledige aankoopproces.

  • Onafhankelijke woningselectie
  • Persoonlijk aankoopplan
  • Juridische en financiële begeleiding
  • Nazorg na de sleuteloverdracht

Ontdek de regio

Waar wilt u thuiskomen?

Persoonlijk zoekprofiel

Vertel ons wat u zoekt.
Wij vinden wat bij u past.

} function Properties({items,filters,setFilters,runSearch,favorites,toggle,onOpen,setPage}){ return <>

Woningaanbod Spanje

Vind uw droomwoning

Ontdek {items.length} actuele woningen aan de Spaanse kust.

{items.length} woningen gevondenActueel aanbod uit onze HabiHub-koppeling
} function propertyImages(p){ return [p.image,...(p.images||[])].filter(Boolean).filter((img,i,all)=>all.indexOf(img)===i); } function GalleryDisabled({p,index,setIndex,onClose}){ const imgs=propertyImages(p), active=Math.min(index,imgs.length-1); const previous=()=>setIndex((active-1+imgs.length)%imgs.length), next=()=>setIndex((active+1)%imgs.length); useEffect(()=>{const onKey=e=>{if(e.key==="Escape")onClose();if(e.key==="ArrowLeft")previous();if(e.key==="ArrowRight")next()};window.addEventListener("keydown",onKey);return()=>window.removeEventListener("keydown",onKey)},[active,imgs.length]); return
{`${title(p)}
{active+1} / {imgs.length}
{imgs.map((img,i)=>)}
} function Detail({p,onBack,isFavorite,toggle}){ const imgs=propertyImages(p); return
{title(p)}/

{p.newBuild?"Nieuwbouw":"Herverkoop"} - Ref. {p.ref}

{title(p)}

{icon("pin")} {p.town}, {p.province}

{money.format(p.price)}
{icon("bed")} {p.beds} slaapkamers{icon("bath")} {p.baths} badkamers{icon("area")} {p.built} m2 wonen{p.plot>0&&{icon("plot")} {p.plot} m2 perceel}

Over deze woning

{(p.description||"Neem contact met ons op voor alle informatie over deze woning.").split(/\n\n+/).slice(0,8).map((x,i)=>

{x}

)}

Kenmerken

{(p.features||[]).map(x=>✓ {x})}
{icon("pin")}

{p.town}, {p.province}

Exacte locatie en bezichtiging op aanvraag

} function MapView({items,onOpen}){return
{items.slice(0,35).map((p,i)=>)}
} function ContentPage({type,setPage}){ const content={favorites:["Uw favorieten","Bewaar woningen met het hartje en vergelijk ze op uw gemak."],regions:["Regio's aan de Spaanse kust","Van bruisende kustplaatsen tot rustige golfresorts: ontdek welke omgeving bij u past."],about:["Helder kopen in Spanje","Wij combineren lokale marktkennis met Nederlandse duidelijkheid en begeleiden u bij iedere stap."],contact:["Laten we kennismaken","Vertel ons uw woonwensen. Wij nemen persoonlijk contact met u op."]}[type]; return <>

Helder Real Estate

{content[0]}

{content[1]}

{type==="contact"&&

Vertel ons wat u zoekt

Van eerste oriëntatie tot sleuteloverdracht: wij helpen u persoonlijk verder.

info@helderrealestate.nl+34 600 000 000
}{type==="about"&&

Van droom naar sleutel

Helder Real Estate helpt Nederlandstalige kopers bij het vinden en aankopen van een woning in Spanje. Wij beginnen met luisteren, zoeken gericht en zorgen dat u bij iedere stap precies weet waar u aan toe bent.

01

Kennismaken

Uw wensen, budget en planning helder in beeld.

02

Selecteren

Een persoonlijke selectie uit het actuele aanbod.

03

Bezichtigen

Een efficiënt programma met deskundige begeleiding.

04

Aankopen

Onderhandeling, controle en sleuteloverdracht.

} } function Footer({setPage}){return } function App(){ const [properties,setProperties]=useState([]),[settings,setSettings]=useState({}),[page,setPage]=useState("home"),[selected,setSelected]=useState(null),[favorites,toggle]=useFavorites(),[filters,setFilters]=useState({q:"",type:"",min:"",max:"",beds:""}); useEffect(()=>{fetch("/data/properties.json").then(r=>r.json()).then(setProperties)},[]); useEffect(()=>{fetch("/api.php?path=settings").then(r=>r.json()).then(setSettings)},[]); useEffect(()=>{setTimeout(()=>{const top=document.querySelector(".topbar span"),h=document.querySelector(".hero-content h1"),p=document.querySelector(".hero-content>p:last-child");if(top)top.textContent=`${settings.phone||"+34 600 000 000"} · ${settings.email||"info@helderrealestate.nl"}`;if(h&&settings.hero_title)h.textContent=settings.hero_title;if(p&&settings.hero_text)p.textContent=settings.hero_text},0)},[settings,page]); useEffect(()=>window.scrollTo(0,0),[page,selected]); useEffect(()=>{const submit=async e=>{const text=e.target?.textContent?.trim();if(!["Informatie aanvragen","Verstuur aanvraag"].includes(text))return;const box=e.target.closest(".contact-card,form");const values=[...box.querySelectorAll("input,textarea")].map(x=>x.value);const [name,email,phone,message]=values;try{const r=await fetch("/contact.php",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name,email,phone,message,property:selected?`${title(selected)} · ${selected.ref}`:"Algemene aanvraag"})});const d=await r.json();alert(d.message)}catch{alert("De aanvraag kon niet worden verzonden. Mail ons via info@helderrealestate.nl.")}};document.addEventListener("click",submit);return()=>document.removeEventListener("click",submit)},[page,selected]); const filtered=useMemo(()=>properties.filter(p=>{const q=filters.q.toLowerCase();return(!q||`${p.town} ${p.province} ${p.ref} ${p.type}`.toLowerCase().includes(q))&&(!filters.type||p.type===filters.type)&&(!filters.min||p.price>=+filters.min)&&(!filters.max||p.price<=+filters.max)&&(!filters.beds||p.beds>=+filters.beds)}),[properties,filters]); const runSearch=q=>{if(typeof q==="string")setFilters(f=>({...f,q}));setPage("properties")}, open=p=>setSelected(p); if(selected)return <>
{setSelected(null);setPage(p)}} favorites={favorites}/>setSelected(null)} isFavorite={favorites.includes(selected.id)} toggle={toggle}/>