}
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
{active+1} / {imgs.length}
{imgs.map((img,i)=>)}
}
function Detail({p,onBack,isFavorite,toggle}){
const imgs=propertyImages(p);
return
{(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}/>