Category: Uncategorized

  • import { useState, useEffect, useRef } from “react”; const PROJECTS = [ { name: “Meditaties voor Kinderen”, slug: “mvk”, role: “Founder · Product Builder”, year: “2018”, desc: “Digitaal platform voor audio-content gericht op kinderen en ouders — van concept tot membership platform met eigen app.”, tags: [“Audio contentbibliotheek”, “Membership”, “Content player”, “App”], url: “https://meditaties-voor-kinderen.nl”, og: “https://meditaties-voor-kinderen.nl/wp-content/uploads/2024/10/MvK-Logo-def-2024_MvK-rechthoekig-300×100.png”, color: “#E8F4F0”, accent: “#2a7d6f”, emoji: “🧘” }, { name: “Excel voor Financials”, slug: “evf”, role: “Platform Builder”, year: “2025”, desc: “Online cursusplatform voor finance professionals om Excel-vaardigheden te verbeteren.”, tags: [“Online cursus”, “Leeromgeving”, “Finance”, “WordPress”], url: “https://excelvoorfinancials.nl”, og: “https://excelvoorfinancials.nl/wp-content/uploads/2024/09/SA-Finance-Logo-def.png”, color: “#E8EEF8”, accent: “#1a4a8a”, emoji: “📊” }, { name: “Stapel van Stenen”, slug: “svs”, role: “Product Builder”, year: “2021”, desc: “Online cursus- en communityplatform in het Nederlands en Engels.”, tags: [“Online cursussen”, “Community”, “Membership”, “NL & EN”], url: “https://stapelvanstenen.nl”, og: null, color: “#EAF0E8”, accent: “#3a6b2a”, emoji: “🪨” }, { name: “Samen Sterke Relaties Bouwen”, slug: “ssrb”, role: “Co-creator · Platform Developer”, year: “2024”, desc: “Content- en communityplatform met podcast, artikelen en geautomatiseerde contentdistributie.”, tags: [“Community”, “Podcast”, “Membership”, “Automatisering”], url: “https://samensterkerelatiesbouwen.nl”, og: null, color: “#F4EEE8”, accent: “#7d5a2a”, emoji: “💬” }, { name: “RelatieHerstelAcademie”, slug: “rha”, role: “Product Builder”, year: “2016”, desc: “Online platform voor coaching en begeleiding, met audio- en videomodules en volledige leeromgeving.”, tags: [“Online platform”, “Video & audio”, “Membershiptoegang”], url: “https://relatieherstelacademie.nl”, og: null, color: “#EEE8F4”, accent: “#5a2a7d”, emoji: “🌿” }, { name: “Online Content Wizard”, slug: “ocw”, role: “Digital Platform Builder”, year: “2024”, desc: “Systemen voor het structureren, publiceren en hergebruiken van content met workflowautomatisering.”, tags: [“Contentarchitectuur”, “Automatisering”, “Integraties”], url: “https://onlinecontentwizard.com”, og: null, color: “#E8EEF4”, accent: “#2a4f7d”, emoji: “⚡” }, ]; const SKILLS = [ { cat: “Productontwikkeling”, icon: “◈”, items: [“Idee → Concept → Werkend Product”, “Platformarchitectuur”, “Membership & community”, “Content structurering”] }, { cat: “Platform & Systemen”, icon: “◎”, items: [“Systeemintegratie”, “Schaalbare structuren”, “Complexe processen vertalen”, “Content + community + auto.”] }, { cat: “Technologie”, icon: “◇”, items: [“WordPress & Plugin Dev”, “REST API & Integraties”, “React Native”, “GitHub · AWS · Make · AI”] }, ]; const TECH = [“WordPress”, “PHP”, “JavaScript”, “React Native”, “REST API”, “GitHub”, “AWS”, “Make”, “AI Tools”]; function useScrollY() { const [y, setY] = useState(0); useEffect(() => { const h = () => setY(window.scrollY); window.addEventListener(“scroll”, h, { passive: true }); return () => window.removeEventListener(“scroll”, h); }, []); return y; } function useWindowWidth() { const [w, setW] = useState(window.innerWidth); useEffect(() => { const h = () => setW(window.innerWidth); window.addEventListener(“resize”, h); return () => window.removeEventListener(“resize”, h); }, []); return w; } function useInView(ref, threshold = 0.12) { const [inView, setInView] = useState(false); useEffect(() => { const obs = new IntersectionObserver(([e]) => { if (e.isIntersecting) setInView(true); }, { threshold }); if (ref.current) obs.observe(ref.current); return () => obs.disconnect(); }, []); return inView; } function FadeUp({ children, delay = 0, style = {} }) { const ref = useRef(null); const inView = useInView(ref); return (
    {children}
    ); } function ScaleIn({ children, delay = 0 }) { const ref = useRef(null); const inView = useInView(ref); return (
    {children}
    ); } function ProjectCard({ p, i }) { const [hovered, setHovered] = useState(false); const ref = useRef(null); const inView = useInView(ref); return (
    setHovered(true)} onMouseLeave={() => setHovered(false)} style={{ borderRadius: 20, overflow: “hidden”, border: `1px solid ${hovered ? p.accent + “55” : “#e4e4e0”}`, background: “#fff”, transition: “all 0.4s cubic-bezier(.16,1,.3,1)”, transform: hovered ? “translateY(-6px) scale(1.01)” : “none”, boxShadow: hovered ? `0 20px 50px ${p.accent}20` : “0 2px 10px rgba(0,0,0,0.05)”, cursor: “pointer” }}>
    ); } export default function Portfolio() { const scrollY = useScrollY(); const vw = useWindowWidth(); const [mousePos, setMousePos] = useState({ x: 0.5, y: 0.5 }); const [menuOpen, setMenuOpen] = useState(false); const mob = vw < 768; const tab = vw < 1024; useEffect(() => { const h = e => setMousePos({ x: e.clientX / window.innerWidth, y: e.clientY / window.innerHeight }); window.addEventListener(“mousemove”, h); return () => window.removeEventListener(“mousemove”, h); }, []); useEffect(() => { if (menuOpen) document.body.style.overflow = “hidden”; else document.body.style.overflow = “”; }, [menuOpen]); const scrollTo = id => { document.getElementById(id)?.scrollIntoView({ behavior: “smooth” }); setMenuOpen(false); }; const navBg = scrollY > 60; const px = mob ? “20px” : “32px”; const sectionPy = mob ? “80px” : “120px”; return (
    {/* MOBILE MENU OVERLAY */} {menuOpen && (
    {[“profiel”,”projecten”,”skills”,”contact”].map(s => ( ))}
    )} {/* NAV */} {/* HERO */}
    Beschikbaar · Remote of Hybride

    Onne
    Kierkels

    Digital Product Builder · Platform Developer

    Ik bouw digitale platforms — systemen waarin content, community, automatisering en integraties samenkomen.

    e.target.style.background=”rgba(255,255,255,0.14)”} onMouseLeave={e => e.target.style.background=”rgba(255,255,255,0.08)”}> LinkedIn ↗
    Scroll
    {/* STAT STRIP */}
    {[{num:”10+”,label:”Jaar ervaring”},{num:”6″,label:”Live platforms”},{num:”2014″,label:”Gestart”},{num:”∞”,label:”Ideeën → Producten”}].map((s,i) => (
    {s.num}
    {s.label}
    ))}
    {/* PROFIEL */}
    Profiel

    Ik bouw platforms,{” “} geen losse websites.

    {[ “Sinds 2014 ontwikkel ik als zelfstandig productbouwer platforms voor organisaties en ondernemers. Mijn werk begint bij een idee of probleem en eindigt bij een werkend digitaal product.”, “Ik werk op het snijvlak van productdenken, platformarchitectuur en implementatie — met WordPress, automatisering en API-integraties als kern.”, “Mijn achtergrond in Grafisch Vormgeving én Sociaal Pedagogische Hulpverlening zorgt ervoor dat systemen niet alleen werken, maar ook logisch en mooi aanvoelen.”, “Ik werk graag in kleine productteams waar ideeën snel worden getest en gebouwd. Binnen organisaties die werken met SaaS, digitale platforms en creator tools.”, ].map((t,i) => (

    {t}

    ))}
    {/* PROJECTEN */}
    Projecten

    Selectie van werk

    {PROJECTS.map((p,i) => )}
    {/* SKILLS */}
    Skills

    Kernvaardigheden

    {SKILLS.map((s,i) => (
    {s.icon}

    {s.cat}

    {s.items.map((item,j) => (
    {item}
    ))}
    ))}
    {TECH.map((t,i) => {t})}
    {/* CONTACT */}
    Contact

    Laten we
    kennismaken.

    Op zoek naar een Product Builder of Platform Developer? Neem contact op via LinkedIn of e-mail.

    {[ { label: “LinkedIn”, sub: “linkedin.com/in/onnekierkels”, href: “https://www.linkedin.com/in/onnekierkels”, icon: “in”, bg: “#0077b5” }, { label: “E-mail”, sub: “onne@onlinecursuswebsites.nl”, href: “mailto:onne@onlinecursuswebsites.nl”, icon: “✉”, bg: “#1e1e1e” }, ].map((c,i) => ( { e.currentTarget.style.background=”rgba(255,255,255,0.08)”; e.currentTarget.style.transform=”translateY(-3px)”; }} onMouseLeave={e => { e.currentTarget.style.background=”rgba(255,255,255,0.04)”; e.currentTarget.style.transform=”none”; }}>
    {c.icon}
    {c.label}
    {c.sub}
    ))}
    {/* FOOTER */}
    OK. © 2026 Onne Kierkels · Digital Product Builder
    ); }