{T("SCROLL · INTO THE VISOR", "SCROLL · DOOR HET VIZIER", lang)}
);
};
// ───── Driver Profile ──────────────────────────────────────────────────────
window.Profile = function Profile({ lang }) {
const [animated, setAnimated] = React.useState(false);
const ref = React.useRef(null);
React.useEffect(() => {
const obs = new IntersectionObserver(
(entries) => entries.forEach((e) => { if (e.isIntersecting) setAnimated(true); }),
{ threshold: 0.3 }
);
if (ref.current) obs.observe(ref.current);
return () => obs.disconnect();
}, []);
// Skill labels can be either a plain string (legacy) or { en, nl }. Resolve
// here so EN/NL switching reaches the radar dots and the skill-bar text.
const resolveLabel = (s) =>
typeof s.label === "object" ? (s.label[lang] || s.label.en) : s.label;
const cx = 130, cy = 130, R = 96;
const N = D.skills.length;
const points = D.skills.map((s, i) => {
const a = (Math.PI * 2 * i) / N - Math.PI / 2;
const r = R * (animated ? s.value : 0);
return { x: cx + r * Math.cos(a), y: cy + r * Math.sin(a), label: resolveLabel(s), val: s.value, ang: a };
});
const polyPts = points.map((p) => `${p.x},${p.y}`).join(" ");
return (
{T("Driver Profile", "Coureur profiel", lang)}
Martijn Van Baelen
{T(
"A student wiring motorsport and data into one craft. Here are the numbers behind the profile.",
"Een student die motorsport en data combineert. Hier de cijfers achter het profiel.",
lang
)}
{D.identity.name}
{T("22 years · Student", "22 jaar · Student", lang)}
);
};
// ───── AI / Data Lab ───────────────────────────────────────────────────────
window.Lab = function Lab({ lang }) {
return (
{T("Motorsport AI & Data Lab", "Motorsport AI & Data Lab", lang)}
{T("The lab - AI & data in motorsport", "Het lab - AI & data in motorsport", lang)}
{T(
"How I think about AI and data analysis in motorsport - especially pitstops, where hundredths decide who exits ahead.",
"Hoe ik kijk naar AI en data-analyse in motorsport - vooral in pitstops, waar honderdsten beslissen wie er voor staat.",
lang
)}
{T(
"Live, in your browser. Pick a pit crew and watch the median pitstop play out.",
"Live, in je browser. Kies een pitcrew en bekijk de mediane stop.",
lang
)}
★ {T("RACE OF THE SEASON", "RACE VAN HET SEIZOEN", lang)}
{T("Internship USA · Asphalt Analytics", "Stage USA · Asphalt Analytics", lang)}
{T(
"HUNTERSVILLE · NORTH CAROLINA · 12 WEEKS · 09 MAR – 29 MAY 2026",
"HUNTERSVILLE · NORTH CAROLINA · 12 WEKEN · 09 MRT – 29 MEI 2026",
lang
)}
{TR(stage.description, lang)}
{T("DARLINGTON · TRACKSIDE", "DARLINGTON · LANGS DE BAAN", lang)}
{T(
"With the trophy after Tyler Reddick (#45 · 23XI Racing) took the Goodyear 400 at Darlington Raceway.",
"Met de trofee na de overwinning van Tyler Reddick (#45 · 23XI Racing) in de Goodyear 400 op Darlington Raceway.",
lang
)}
{T(
"Trackside in the team garage, right after the win - one of the moments the internship turned from a study placement into something I'll carry with me.",
"Langs de baan in de garage, vlak na de overwinning - één van die momenten waarop de stage van schoolopdracht naar iets blijvends omsloeg.",
lang
)}
{T("The season calendar", "De seizoenskalender", lang)}
{T(
"Two consecutive seasons - 2TIN (year 2) and 3TIN (year 3, starting at the Innovation Route). Every round a milestone.",
"Twee seizoenen achter elkaar - 2TIN (jaar 2) en 3TIN (jaar 3, vanaf de Innovation Route). Elke ronde een mijlpaal.",
lang
)}
);
}
// ───── Final reflection ────────────────────────────────────────────────────
window.Final = function Final({ lang }) {
const r = D.finalReflection;
return (
{T("Finish Line", "Eindstreep", lang)}
{T("The post-race debrief", "De post-race debrief", lang)}
{T(
"Goals reached? Who have I become? Next steps?",
"Doelen behaald? Wie ben ik geworden? Volgende stappen?",
lang
)}
{T("Goals reached", "Doelen behaald", lang)}
{TR(r.goalsReached, lang)}
{T("Who I am now", "Wie ik nu ben", lang)}
{TR(r.whoIAm, lang)}
{T("What I learned", "Wat ik geleerd heb", lang)}
{TR(r.learned, lang)}
{T("Strengths", "Sterktes", lang)}
{TR(r.strengths, lang)}
{T("Growth points", "Groeipunten", lang)}
{TR(r.growth, lang)}
{T("Next steps", "Volgende stappen", lang)}
{TR(r.nextSteps, lang)}
{T("THE FUTURE", "DE TOEKOMST", lang)}
{TR(r.future, lang)}
);
};
// ───── Contact ─────────────────────────────────────────────────────────────
window.Contact = function Contact({ lang }) {
return (
{T("Next race", "Volgende race", lang)}
{T("Ready for the next round.", "Klaar voor de volgende ronde.", lang)}
{T(
"Looking for data / AI roles in motorsport, race engineering or pitstop analytics. Open to junior roles and conversations.",
"Op zoek naar een data- of AI-rol in motorsport, race-engineering of pitstop-analytics. Open voor junior rollen en gesprekken.",
lang
)}