// ProjectsExpedition — alternate "découvre les projets" view // Each project is an "étape d'expédition" — a topographic map vignette + guidebook entry, // alternating left/right, with usage IA rating, cordée, durée, and a CTA "Explorer l'étape". // Règle du dénivelé : 100 M = 1 techno/outil appris sur le projet. // { // id: "axione", n: "ÉTAPE 02", coord: "48.86°N · 2.35°E", // title: "Motion Axione", subtitle: "Animation 2D · janv. 2025", // img: "assets/paysage.jpg", // video: "assets/AXIONE.mp4", // url: "https://drive.google.com/file/d/193h2szD7_nkJZOqT32-fgdfNaVgyjC06/view?usp=sharing", // ia: 0, cordée: "SOLO", durée: "4 SEM.", alt: "+200 M", // biome: "MOTION", // desc: "Pour varier de mon rôle de développeur, j'ai eu l'occasion de réaliser une animation en motion design pour l'entreprise Axione lors de mon passage à l'agence Zebra. Ce projet m'a permis de découvrir et d'approfondir l'utilisation d'Adobe After Effects et Illustrator, des outils que je maîtrisais moins.", // tags: ["After Effects","Illustrator"], // }, // { // id: "autisme", n: "ÉTAPE 05", coord: "47.59°N · 1.33°E", // title: "Sensibilisation Autisme", subtitle: "Front-end accessible · juin 2025", // img: "assets/proj-autisme.gif", // ia: 1, cordée: "4 EQUIPIERS", durée: "5 SEM.", alt: "+100 M", // biome: "UNIVERSITE", // desc: "Sentier balisé pour tous. Site informatif et accessible : navigation clavier, contraste AA, lecture confortable, illustrations animées. Le terrain doit pouvoir être parcouru par chacun.", // tags: ["A11y","HTML","CSS"], // }, const EXPEDITION = [ { id: "villas", n: "ÉTAPE 01", coord: "47.59°N · 1.33°E", title: "ECOLOGIA", subtitle: "Site d'un projet de cours· janviers. 2025", img: "assets/saeEco.png", url:"https://ecologia.vincent-morin.fr/", ia: 2, cordée: "4 EQUIPIERS", durée: "6 SEM.", alt: "+600 M", biome: "UNIVERSITE", desc: "Projet universitaire réalisé en équipe : développement d'un CMS complet pour la gestion d'un blog sur l'écologie. Conception de l'API, de la base de données, du back-end en Symfony/PHP et du front-end en React et Tailwind CSS, avec l'intégration d'une expérience 3D interactive grâce à Three.js. Ce projet m'a permis d'intervenir sur l'ensemble du cycle de développement d'une application web full-stack.", tags: ["REACT","SYMFONY","THREE.JS","GSAP","TYPESCRIPT","TAILWIND"], }, { id: "arvalis", n: "ÉTAPE 02", coord: "48.33°N · 2.38°E", title: "Commandes Semences ARVALIS", subtitle: "Application web · 2025–2026", img: "assets/arvalis.jpg", url: "https://www.arvalis.fr/", ia: 2, cordée: "ENTREPRISE", durée: "12 MOIS", alt: "+800 M", biome: "ENTREPRISE", desc: "Dans le cadre de mon alternance chez ARVALIS – Institut du végétal, j'ai développé une application de gestion des commandes de semences. De la modélisation des données jusqu'à l'interface, j'ai conçu l'application de bout en bout : gestion des commandes, système d'autorisations, et intégration au SI interne.", tags: ["C#",".NET","Blazor Server","EF Core","SQL Server"], }, { id: "zebra", n: "ÉTAPE 03", coord: "45.76°N · 4.83°E", title: "Villas-daumesnil", subtitle: "Design + dev · avril 2025", img: "assets/proj-villas-daumesnil.jpg", url: "https://ikoryproperties.com/properties/villas-daumesnil-2/", ia: 2, cordée: "AGENCE", durée: "8 SEM.", alt: "+100 M", biome: "AGENCE", desc: "Lors de mon passage à l'agence Zebra, j'ai développé une landing page pour un promoteur immobilier parisien. J'ai construit un thème WordPress sur mesure, entièrement de zéro, en HTML, SCSS, PHP et JavaScript, puis je l'ai connecté au plugin ACF pour que le client puisse modifier lui-même ses contenus directement depuis WordPress. Un projet mené au sein d'une équipe.", tags: ["WordPress","ACF","PHP","SCSS","JavaScript"], }, { id: "midjourney", n: "ÉTAPE 04", coord: "44.83°N · 0.58°W", title: "Kiwigen.ai", subtitle: "Direction artistique · mars 2025", img: "assets/proj-midjourney.png", url: "https://www.instagram.com/kiwigen.ia/?hl=fr", ia: 5, cordée: "SOLO", durée: "2 ANS", alt: "+100 M", biome: "PERSO", desc: "Passionné par IA, j'ai créé il y a deux ans, en parallèle de mes cours, un compte Instagram (@kiwigen.ia) pour partager mes créations générées par IA. J'y transforme mes idées en images et en vidéos, je donne vie à mes pensées. Un vrai terrain de jeu où je me suis beaucoup amusé et énormément appris, sur comment manier ces outils graphiques.", tags: ["Midjourney","Photoshop"], }, { id: "claude-gsap", n: "ÉTAPE 05", coord: "48.86°N · 2.35°E", title: "IA × DESIGN", subtitle: "Page web animée · juillet 2026", img: "assets/proj-claude-gsap.png", url: "https://guide-animation.vincent-morin.fr/", ia: 5, cordée: "SOLO + IA", durée: "1 SOIRÉE", alt: "+400 M", biome: "PERSO", desc: "Un site que je nourris régulièrement, où j'explique les derniers outils et frameworks pour créer des designs et des animations front-end avec l'IA. Un nouveau projet qui me pousse à faire beaucoup de veille sur l'actualité du développement et les dernières sorties, pour proposer des tutos et de la doc à mes proches devs.", tags: ["GSAP","ScrollTrigger","SplitText","Claude Code"], }, { id: "carnet", n: "ÉTAPE 06", coord: "47.59°N · 1.33°E", title: "Ce carnet de voyage", subtitle: "Design + dev · avril 2026", img: "assets/nature1.jpg", ia: 4, cordée: "SOLO", durée: "12 SEM.", alt: "+300 M", biome: "PERSO", desc: "J'ai créé ce portfolio pour rassembler mon parcours et mes projets, mais surtout pour me présenter à ma façon : j'ai pris beaucoup de plaisir à concevoir cette page, pour vous montrer mon style et mes goûts. Côté technique, un portfolio React, une identité « carnet de voyage » et des animations au scroll signées GSAP. La carte que vous tenez actuellement entre les mains.", tags: ["React","SCSS","GSAP"], }, ]; // little topo-rings vignette behind each photo function TopoRings({ seed }) { const rings = []; const n = 6; const cx = 50 + (seed % 3) * 6; const cy = 50 + (seed % 5) * 4; for (let i = 0; i < n; i++) { const r = 12 + i * 9; rings.push(); } return ( ); } function AiUsage({ level }) { return (
USAGE IA {[1,2,3,4,5].map(i => ( ))}
); } function ExpeditionCard({ e, i, onOpen }) { const side = i % 2 === 0 ? "left" : "right"; // Ouverture de la fiche — partagée entre la photo et le bouton "Explorer" const open = () => onOpen({ id: e.id, title: e.title, img: e.img, video: e.video, date: e.subtitle.split(' · ')[1] || '', stamp: e.n, role: e.subtitle, desc: e.desc, tags: e.tags, url: e.url || '#', }); return (
{/* Connector dot anchored to the central trail */}
{ if (ev.key === "Enter" || ev.key === " ") { ev.preventDefault(); open(); } }} > {e.video ?
{e.n} {e.subtitle}

{e.title}

CORDÉE
{e.cordée}
DURÉE
{e.durée}
DÉNIVELÉ
{e.alt}

{e.desc}

    {e.tags.map(t =>
  • {t}
  • )}
); } function ProjectsExpedition({ onOpen }) { return (
03KM 03 · ÉTAPE 3 / 04
EXPÉDITION 2024 — 2026 6 ÉTAPES BALISÉES BOUCLE COMPLÈTE

Decouvre mes aventures.

Trois ans de projets menés en entreprise, en cours et en autonomie.

Chaque fiche présente le projet, la technique et le contexte.

Ouvrez une étape pour découvrir le projet en détail.

DÉPART
ÉTAPE
SOMMET
{/* central dashed trail spine */} {EXPEDITION.map((e, i) => ( ))} {/* "Sommet atteint" badge at the bottom of the trail */}
); } function ProjectModal({ project, onClose }) { React.useEffect(() => { const onKey = (e) => e.key === "Escape" && onClose(); window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onClose]); // Pas d'animation JS sur le contenu : la carte a déjà son entrée en CSS // (vm-pop). Un gsap.from + autoAlpha laissait le dernier élément — le // bouton "VOIR LE PROJET" — bloqué à visibility:hidden si le tween ne // se terminait pas. On garantit ici que tout le contenu reste visible. return (
e.stopPropagation()}>
{project.video ?

{project.title}

{project.role}

{project.desc}

{project.tags.map(t => {t})}
VOIR LE PROJET
); } window.ProjectsExpedition = ProjectsExpedition; window.ProjectModal = ProjectModal; window.EXPEDITION = EXPEDITION;