// Over ons — story + team + certificaten + apparatuur
function Over({ onNav }) {
const diplomas = [
"MBO Technisch Specialist Personenauto's",
"MBO Technisch Leidinggevende",
];
const certPersonenauto = [
"Onderhoudsbeurt uitvoeren",
"Reparaties uitvoeren",
"Diagnose stellen",
"Diagnose mechanisch",
"Diagnose elektronisch",
"Complexe reparaties (BVE 1)",
];
const certEV = [
"NEN 9140 — Werkverantwoordelijke",
"NEN 9140 — Vakbekwaam Persoon",
"EV-adviseur Basis",
];
const certAirco = ["F-gassen voor personenauto's"];
const certToekomst = ["Waterstof in mobiliteit"];
const apparatuur = [
"Autel", "Jaltest", "Bosch KTS", "Texa",
"Hella Gutmann (mega macs)", "Launch X431",
"Delphi", "Snap-on", "WOW! / Würth Snooper",
"VCDS (Ross-Tech)",
];
const oem = [
{ merk: "VW / Audi / Seat / Skoda", soft: "VCDS" },
{ merk: "BMW", soft: "ISTA" },
{ merk: "Mercedes-Benz", soft: "XENTRY" },
{ merk: "Ford", soft: "IDS" },
{ merk: "Volvo", soft: "VIDA" },
{ merk: "Renault", soft: "CLIP" },
];
return (
{/* Hero */}
Over Garage DéDé
Een werkplaats waar vakkennis nog telt.
In Vijfhuizen — eerlijk advies, transparante prijzen, en monteurs die hun
vak verstaan. Of het nu een APK is, complexe motormanagement-storing of
NEN 9140 werk aan een EV.
{/* Foto-galerij — echt werk */}
{/* Numbers */}
{[
{ n: "18", l: "Jaar ervaring" },
{ n: "1.200+", l: "Vaste klanten" },
{ n: "5+", l: "Monteurs" },
{ n: "4.9", l: "Google rating" },
].map((s, i) => (
))}
{/* Certificaten section */}
Diploma's, certificaten & apparatuur
Bewezen vakkennis — zwart op wit.
Van standaard onderhoud tot werk aan hoogspanningssystemen.
Onze monteurs blijven bijscholen — u rijdt veilig weg.
{/* Certificaat-slider */}
{/* Apparatuur — ribbon met foto */}
{/* Hero foto bovenin */}
Uitleesapparatuur in actie
Diagnose op dealer-niveau.
Universeel
Alle merken.
Tien tools van de top-leveranciers. Wat de ene niet leest,
leest de andere wel.
{apparatuur.map((a, i) => (
{a}
))}
OEM software
Fabrikant-spec.
Originele dealer-software voor accuraat coderen, programmeren en
service-resets.
{/* RDW + locatie */}
Vind ons
Achterasweg · Vijfhuizen.
);
}
// Slider voor certificaat-foto's. Bestanden in photos/certificaten/ (gesymlinkt naar Certificaten/)
const CERTIFICATEN = [
{ src: "photos/certificaten/NEN%209140%20Voor%20Werkverantwoordelijke.jpg", title: "NEN 9140 Werkverantwoordelijke", year: "2023" },
{ src: "photos/certificaten/NEN%209140%20Vakbekwaam%20Persoon.jpg", title: "NEN 9140 Vakbekwaam Persoon", year: "2022" },
{ src: "photos/certificaten/NEN%209140%20Professional%20Person.jpg", title: "NEN 9140 Professional Person", year: "2023" },
{ src: "photos/certificaten/EV-adviseur%20Basis.jpg", title: "EV-adviseur Basis", year: "2022" },
{ src: "photos/certificaten/F-gassen%20voor%20personenauto%60s.jpg", title: "F-gassen personenauto's", year: "2022" },
{ src: "photos/certificaten/Mbo%20Technisch%20Specialist%20Personenauto%27s.pdf.png", title: "MBO Technisch Specialist Personenauto's" },
{ src: "photos/certificaten/Mbo%20Technisch%20Leidinggevende.pdf.png", title: "MBO Technisch Leidinggevende" },
{ src: "photos/certificaten/Technische%20Specialist%20Personenauto%20BVE1%20Complexe%20reparaties%20aan%20mechanische%20componenten-systemen.jpg", title: "Complexe reparaties (BVE 1)", year: "2025" },
{ src: "photos/certificaten/Technische%20Specialist%20PA%20Diagnose%20stellen%20aan%20personenauto%60s.jpg", title: "Diagnose stellen", year: "2025" },
{ src: "photos/certificaten/Technische%20Specialist%20PA%20Diagnose%20stellen%20aan%20personenauto%60s%20mechanisch.jpg", title: "Diagnose mechanisch", year: "2022" },
{ src: "photos/certificaten/Technische%20Specialist%20PA%20Diagnose%20stellen%20aan%20personenauto%60s%20elektronisch.jpg", title: "Diagnose elektronisch", year: "2022" },
{ src: "photos/certificaten/Technische%20Specialist%20PA%20Reparaties%20uitvoeren%20aan%20personenauto%60s.jpg", title: "Reparaties uitvoeren", year: "2021" },
{ src: "photos/certificaten/Technische%20Specialist%20PA%20Onderhoudsbeurt%20uitvoeren%20aan%20personenauto%60s.jpg", title: "Onderhoudsbeurt uitvoeren", year: "2022" },
{ src: "photos/certificaten/BREMBO%20EXPERT%20PRO.jpg", title: "Brembo Expert Pro", year: "2026" },
{ src: "photos/certificaten/Veilig%20werken%20aan%20e-bedrijfsvoertuigen%20basis%20%28VOP%20NEN-9140%29.jpg", title: "VOP — Veilig werken aan EV", year: "2021" },
{ src: "photos/certificaten/Toelatingstoets%20LPK%20Keurmeester.jpg", title: "LPK Keurmeester", year: "2026" },
{ src: "photos/certificaten/Leermeester%20Basis.jpg", title: "Leermeester Basis", year: "2022" },
];
function CertificaatSlider() {
const [idx, setIdx] = React.useState(0);
const [dragOffset, setDragOffset] = React.useState(0);
const [isDragging, setIsDragging] = React.useState(false);
const startX = React.useRef(0);
const itemWidthPx = React.useRef(0);
const containerRef = React.useRef(null);
const dragMovedRef = React.useRef(false);
const items = CERTIFICATEN.length > 0 ? CERTIFICATEN : Array.from({ length: 6 }).map((_, i) => ({
placeholder: true,
title: ["NEN 9140", "F-gassen", "EV-adviseur", "Waterstof", "Diagnose elektronisch", "BVE 1"][i],
year: ["2024", "2023", "2024", "2025", "2022", "2022"][i],
}));
const visible = 3;
const max = Math.max(0, items.length - visible);
const go = (delta) => setIdx(i => Math.max(0, Math.min(max, i + delta)));
const measureItemWidth = () => {
if (!containerRef.current) return 0;
const cw = containerRef.current.clientWidth;
return (cw - (visible - 1) * 16) / visible + 16; // breedte + gap
};
const startDrag = (clientX) => {
setIsDragging(true);
startX.current = clientX;
itemWidthPx.current = measureItemWidth();
dragMovedRef.current = false;
};
const moveDrag = (clientX) => {
if (!isDragging) return;
const dx = clientX - startX.current;
if (Math.abs(dx) > 4) dragMovedRef.current = true;
// resistance op begin/eind
let bounded = dx;
if (idx === 0 && dx > 0) bounded = dx * 0.35;
if (idx >= max && dx < 0) bounded = dx * 0.35;
setDragOffset(bounded);
};
const endDrag = () => {
if (!isDragging) return;
const w = itemWidthPx.current || measureItemWidth();
const threshold = w * 0.25;
let next = idx;
if (dragOffset < -threshold) next = Math.min(max, idx + Math.max(1, Math.round(-dragOffset / w)));
else if (dragOffset > threshold) next = Math.max(0, idx - Math.max(1, Math.round(dragOffset / w)));
setIdx(next);
setDragOffset(0);
setIsDragging(false);
};
// Keyboard support
const onKeyDown = (e) => {
if (e.key === "ArrowLeft") go(-1);
if (e.key === "ArrowRight") go(1);
};
const baseTranslate = `calc(-${idx} * (100% / ${visible} + ${16 / visible}px))`;
const transform = `translateX(calc(${baseTranslate} + ${dragOffset}px))`;
return (
Certificaten in beeld
Bewijs is welkom om te bekijken.
Sleep met je muis of gebruik de pijlen.
go(-1)} disabled={idx === 0}
style={{ opacity: idx === 0 ? 0.4 : 1 }} aria-label="Vorige">
go(1)} disabled={idx >= max}
style={{ opacity: idx >= max ? 0.4 : 1 }} aria-label="Volgende">
{ e.preventDefault(); startDrag(e.clientX); }}
onMouseMove={(e) => moveDrag(e.clientX)}
onMouseUp={endDrag}
onMouseLeave={endDrag}
onTouchStart={(e) => startDrag(e.touches[0].clientX)}
onTouchMove={(e) => moveDrag(e.touches[0].clientX)}
onTouchEnd={endDrag}
style={{
overflow: "hidden",
borderRadius: 14,
cursor: isDragging ? "grabbing" : "grab",
userSelect: "none",
WebkitUserSelect: "none",
outline: "none",
}}
>
{items.map((c, i) => (
{c.placeholder && (
PLAATS HIER
{c.title}
{c.year}
)}
{!c.placeholder && (
{c.title}
{c.year &&
{c.year}
}
)}
))}
{/* Pagination dots */}
{Array.from({ length: max + 1 }).map((_, i) => (
setIdx(i)}
aria-label={`Pagina ${i + 1}`}
style={{
width: i === idx ? 22 : 6, height: 6, borderRadius: 999,
background: i === idx ? "var(--accent)" : "var(--border)",
border: 0, padding: 0, transition: "all .25s ease", cursor: "pointer",
}}
/>
))}
);
}
function PhotoTile({ src, h, caption }) {
return (
{caption && (
{caption}
)}
);
}
function CertBlock({ Icon, title, items, note, extra }) {
return (
{items.map((it, i) => (
{it}
))}
{note &&
{note}
}
{extra && extra.map((e, i) => (
{e.items.map((x, j) => (
{x}
))}
))}
);
}
function LocCard({ name, address, hours, tel, mobile, email }) {
return (
{name}
{address}
{hours}
{tel}
{mobile && (
{mobile}
)}
{email && (
{email}
)}
);
}
window.Over = Over;