master
exosky12 1 month ago
parent c8ad38f916
commit 1f186eb510

@ -0,0 +1,209 @@
class PortfolioAnimations {
constructor() {
this.init();
}
init() {
this.setupIntersectionObserver();
this.setupMagneticEffects();
this.setupParallaxEffects();
this.addFloatingShapes();
}
setupIntersectionObserver() {
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const element = entry.target;
const animation = element.dataset.animation;
const delay = element.dataset.delay || 0;
setTimeout(() => {
element.classList.add(`animate-${animation}`);
if (element.dataset.counter) {
this.animateCounter(element);
}
}, delay);
observer.unobserve(element);
}
});
}, observerOptions);
document.querySelectorAll('.animate-on-scroll').forEach(el => {
observer.observe(el);
});
}
setupMagneticEffects() {
document.querySelectorAll('.magnetic').forEach(button => {
button.addEventListener('mousemove', (e) => {
const rect = button.getBoundingClientRect();
const x = e.clientX - rect.left - rect.width / 2;
const y = e.clientY - rect.top - rect.height / 2;
button.style.transform = `translate(${x * 0.1}px, ${y * 0.1}px) scale(1.02)`;
});
button.addEventListener('mouseleave', () => {
button.style.transform = 'translate(0px, 0px) scale(1)';
});
});
}
setupParallaxEffects() {
window.addEventListener('scroll', () => {
const scrolled = window.pageYOffset;
const parallaxElements = document.querySelectorAll('.parallax');
parallaxElements.forEach(element => {
const speed = element.dataset.speed || 0.5;
const yPos = -(scrolled * speed);
element.style.transform = `translateY(${yPos}px)`;
});
});
}
animateCounter(element) {
const target = parseInt(element.dataset.counter);
const duration = 2000;
const start = 0;
const increment = target / (duration / 16);
let current = start;
const timer = setInterval(() => {
current += increment;
if (current >= target) {
current = target;
clearInterval(timer);
}
element.textContent = Math.floor(current);
}, 16);
}
addFloatingShapes() {
const hero = document.querySelector('.hero-gradient');
if (!hero) return;
const shapesContainer = document.createElement('div');
shapesContainer.className = 'floating-shapes';
for (let i = 0; i < 3; i++) {
const shape = document.createElement('div');
shape.className = 'floating-shape';
shapesContainer.appendChild(shape);
}
hero.appendChild(shapesContainer);
}
static typeWriter(element, text, speed = 100) {
let i = 0;
element.textContent = '';
function type() {
if (i < text.length) {
element.textContent += text.charAt(i);
i++;
setTimeout(type, speed);
}
}
type();
}
static revealText(element) {
const text = element.textContent;
const words = text.split(' ');
element.innerHTML = '';
words.forEach((word, index) => {
const span = document.createElement('span');
span.textContent = word + ' ';
span.style.opacity = '0';
span.style.transform = 'translateY(20px)';
span.style.transition = `all 0.6s ease ${index * 0.1}s`;
element.appendChild(span);
setTimeout(() => {
span.style.opacity = '1';
span.style.transform = 'translateY(0)';
}, 100);
});
}
static setupSmoothScroll() {
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
}
}
document.addEventListener('DOMContentLoaded', () => {
new PortfolioAnimations();
PortfolioAnimations.setupSmoothScroll();
});
window.PortfolioAnimations = PortfolioAnimations;
function initScrollAnimations() {
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const delay = entry.target.dataset.delay || 0;
setTimeout(() => {
entry.target.classList.add('visible');
}, delay);
}
});
}, observerOptions);
document.querySelectorAll('.animate-on-scroll').forEach(el => {
observer.observe(el);
});
}
function initMagneticEffect() {
const magneticElements = document.querySelectorAll('.magnetic');
magneticElements.forEach(el => {
el.addEventListener('mousemove', (e) => {
const rect = el.getBoundingClientRect();
const x = e.clientX - rect.left - rect.width / 2;
const y = e.clientY - rect.top - rect.height / 2;
el.style.transform = `translate(${x * 0.1}px, ${y * 0.1}px) scale(1.02)`;
});
el.addEventListener('mouseleave', () => {
el.style.transform = 'translate(0px, 0px) scale(1)';
});
});
}
document.addEventListener('DOMContentLoaded', () => {
initScrollAnimations();
initMagneticEffect();
});

@ -0,0 +1,251 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>À propos - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
<script src="navigation.js"></script>
<style>
body {
font-family: 'Inter', sans-serif;
}
</style>
</head>
<body class="bg-white">
<nav id="navbar"></nav>
<main>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20">
<h1 class="text-4xl font-bold text-gray-900 mb-12 text-center">
À propos de moi
</h1>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-32">
<div class="animate-on-scroll" data-animation="fade-up">
<h2 class="text-2xl font-bold mb-6">Qui suis-je ?</h2>
<p class="mb-6">Je m'appelle Jules Merienne, étudiant en première année de BUT informatique à Clermont-Ferrand. Passionné par le développement web et le design, je combine créativité et rigueur technique dans mes projets.</p>
</div>
<div class="relative animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="w-80 h-80 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full mx-auto flex items-center justify-center">
<svg class="w-32 h-32 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path>
</svg>
</div>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-32">
<div class="relative animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="w-80 h-80 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full mx-auto flex items-center justify-center">
<svg class="w-32 h-32 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path>
</svg>
</div>
</div>
<div class="animate-on-scroll" data-animation="fade-up">
<h2 class="text-2xl font-bold mb-6">Mon parcours</h2>
<p class="mb-6">Depuis 2020, j'ai commencé mon apprentissage en autodidacte via Udemy et OpenClassrooms. Après une initiation au Python, je me suis spécialisé dans le développement web et l'UI/UX design, une passion qui m'anime depuis 2022.</p>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-32">
<div class="animate-on-scroll" data-animation="fade-up">
<h2 class="text-2xl font-bold mb-6">Ma vision</h2>
<p class="mb-6">Je m'efforce de créer des applications optimisées pour l'expérience utilisateur, en explorant constamment de nouvelles technologies et approches. Mon objectif est de devenir ingénieur en informatique après mon BUT.</p>
</div>
<div class="relative animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="w-80 h-80 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full mx-auto flex items-center justify-center">
<svg class="w-32 h-32 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>
</svg>
</div>
</div>
</div>
<div class="mb-32">
<h2 class="text-3xl font-bold text-gray-900 text-center mb-12">
Mon Parcours
</h2>
<div class="relative max-w-4xl mx-auto">
<div class="absolute left-1/2 top-0 bottom-0 w-0.5 bg-gradient-to-b from-blue-500 to-purple-500 transform -translate-x-1/2"></div>
<div class="space-y-12">
<div class="relative flex items-center animate-on-scroll" data-animation="slide-right" data-delay="200">
<div class="w-full ml-8 bg-white border border-gray-200 rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
<div class="flex flex-col md:flex-row md:items-center justify-between mb-4">
<h3 class="text-xl font-semibold text-gray-900">Freelance Designer & Développeur</h3>
<span class="text-purple-600 font-medium">2024 - Présent</span>
</div>
<p class="text-purple-600 mb-3 font-medium">Travail Indépendant</p>
<p class="text-gray-600">
Création de solutions numériques complètes pour des clients variés.
Design UX/UI, développement web et mobile, conseil en stratégie digitale.
</p>
<div class="flex flex-wrap gap-2 mt-4">
<span class="px-3 py-1 bg-purple-100 text-purple-800 text-sm rounded-full">React</span>
<span class="px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full">Next.js</span>
<span class="px-3 py-1 bg-green-100 text-green-800 text-sm rounded-full">AdonisJS</span>
<span class="px-3 py-1 bg-yellow-100 text-yellow-800 text-sm rounded-full">Node.js</span>
<span class="px-3 py-1 bg-pink-100 text-pink-800 text-sm rounded-full">Figma</span>
</div>
</div>
</div>
<div class="relative flex items-center animate-on-scroll" data-animation="slide-right" data-delay="400">
<div class="w-full ml-8 bg-white border border-gray-200 rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
<div class="flex flex-col md:flex-row md:items-center justify-between mb-4">
<h3 class="text-xl font-semibold text-gray-900">BUT Informatique</h3>
<span class="text-blue-600 font-medium">2024 - Présent</span>
</div>
<p class="text-blue-600 mb-3 font-medium">Université Clermont Auvergne</p>
<p class="text-gray-600">
Formation complète en développement logiciel, bases de données, réseaux et gestion de projet.
Projets pratiques en équipe et stage en entreprise.
</p>
<div class="flex flex-wrap gap-2 mt-4">
<span class="px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full">Linux</span>
<span class="px-3 py-1 bg-purple-100 text-purple-800 text-sm rounded-full">C#</span>
<span class="px-3 py-1 bg-green-100 text-green-800 text-sm rounded-full">SQL</span>
<span class="px-3 py-1 bg-yellow-100 text-yellow-800 text-sm rounded-full">Gestion de projet</span>
</div>
</div>
</div>
<div class="relative flex items-center animate-on-scroll" data-animation="slide-right" data-delay="600">
<div class="w-full ml-8 bg-white border border-gray-200 rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
<div class="flex flex-col md:flex-row md:items-center justify-between mb-4">
<h3 class="text-xl font-semibold text-gray-900">Baccalauréat Général</h3>
<span class="text-green-600 font-medium">2021 - 2024</span>
</div>
<p class="text-green-600 mb-3 font-medium">Lycée Théodore de Banville</p>
<p class="text-gray-600 mb-3">
Spécialités Mathématiques et Numérique et Sciences Informatiques (NSI).
<span class="font-semibold text-gray-800">Mention Bien</span> - Première approche de la programmation et de l'algorithmique.
</p>
<div class="flex flex-wrap gap-2 mt-4">
<span class="px-3 py-1 bg-green-100 text-green-800 text-sm rounded-full">Python</span>
<span class="px-3 py-1 bg-yellow-100 text-yellow-800 text-sm rounded-full">Algorithmique</span>
<span class="px-3 py-1 bg-purple-100 text-purple-800 text-sm rounded-full">Mathématiques</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mb-40">
<h2 class="text-3xl font-bold text-gray-900 text-center mb-20 animate-on-scroll" data-animation="fade-up">
Stack Technique
</h2>
<div class="mb-32 max-w-6xl mx-auto">
<h3 class="text-2xl font-bold text-gray-900 mb-16 text-center animate-on-scroll" data-animation="fade-up" data-delay="100">Développement Web</h3>
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-8 stagger-container">
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-blue-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1 animate-on-scroll" data-animation="fade-up">
<div class="w-16 h-16 bg-gradient-to-r from-blue-500 to-cyan-500 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<svg class="w-8 h-8 text-white" viewBox="0 0 24 24" fill="currentColor">
<path d="M14.23 12.004a2.236 2.236 0 0 1-2.235 2.236 2.236 2.236 0 0 1-2.236-2.236 2.236 2.236 0 0 1 2.235-2.236 2.236 2.236 0 0 1 2.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38-.318-.184-.688-.277-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44-.96-.236-2.006-.417-3.107-.534-.66-.905-1.345-1.727-2.035-2.447 1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442-1.107.117-2.154.298-3.113.538-.112-.49-.195-.964-.254-1.42-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87-.728.063-1.466.098-2.21.098-.74 0-1.477-.035-2.202-.093-.406-.582-.802-1.204-1.183-1.86-.372-.64-.71-1.29-1.018-1.946.303-.657.646-1.313 1.013-1.954.38-.66.773-1.286 1.18-1.868.728-.064 1.466-.098 2.21-.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.948.645-.16 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933-.2-.39-.41-.783-.64-1.174-.225-.392-.465-.774-.705-1.146zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493-.28-.958-.646-1.956-1.1-2.98.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98-.45 1.017-.812 2.01-1.086 2.964-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.645.16-1.315.283-2.015.386.24-.375.48-.762.705-1.158.225-.39.435-.788.636-1.18zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143-.695-.102-1.365-.23-2.006-.386.18-.63.405-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295-.22-.005-.406-.05-.553-.132-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z"/>
</svg>
</div>
<span class="font-semibold text-gray-900 group-hover:text-blue-600 transition-colors">React</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-black hover:shadow-lg transition-all duration-300 hover:-translate-y-1 animate-on-scroll" data-animation="fade-up">
<div class="w-16 h-16 bg-gradient-to-r from-black to-gray-800 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<svg class="w-8 h-8 text-white" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm0 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm0 2c-4.411 0-8 3.589-8 8s3.589 8 8 8 8-3.589 8-8-3.589-8-8-8zm0 2c3.309 0 6 2.691 6 6s-2.691 6-6 6-6-2.691-6-6 2.691-6 6-6z"/>
</svg>
</div>
<span class="font-semibold text-gray-900 group-hover:text-gray-800 transition-colors">Next.js</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-blue-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1 animate-on-scroll" data-animation="fade-up">
<div class="w-16 h-16 bg-gradient-to-r from-blue-600 to-blue-700 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<span class="text-white font-bold text-xl">TS</span>
</div>
<span class="font-semibold text-gray-900 group-hover:text-blue-600 transition-colors">TypeScript</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-green-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1 animate-on-scroll" data-animation="fade-up">
<div class="w-16 h-16 bg-gradient-to-r from-green-600 to-green-700 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<svg class="w-8 h-8 text-white" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm0 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm0 2c-4.411 0-8 3.589-8 8s3.589 8 8 8 8-3.589 8-8-3.589-8-8-8zm0 2c3.309 0 6 2.691 6 6s-2.691 6-6 6-6-2.691-6-6 2.691-6 6-6z"/>
</svg>
</div>
<span class="font-semibold text-gray-900 group-hover:text-green-600 transition-colors">AdonisJS</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-cyan-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1 animate-on-scroll" data-animation="fade-up">
<div class="w-16 h-16 bg-gradient-to-r from-cyan-500 to-blue-500 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<span class="text-white font-bold text-lg">TW</span>
</div>
<span class="font-semibold text-gray-900 group-hover:text-cyan-600 transition-colors">Tailwind</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-purple-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1 animate-on-scroll" data-animation="fade-up">
<div class="w-16 h-16 bg-gradient-to-r from-purple-500 to-pink-500 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<span class="text-white font-bold text-lg">FM</span>
</div>
<span class="font-semibold text-gray-900 group-hover:text-purple-600 transition-colors">Figma</span>
</div>
</div>
</div>
<div class="mb-32 max-w-6xl mx-auto">
<h3 class="text-2xl font-bold text-gray-900 mb-16 text-center">Langages de Programmation</h3>
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-8">
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-yellow-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
<div class="w-16 h-16 bg-gradient-to-r from-yellow-500 to-orange-500 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<svg class="w-8 h-8 text-white" viewBox="0 0 24 24" fill="currentColor">
<path d="M0,0 C0,0 5.166,1.222 12,1.222 C18.834,1.222 24,0 24,0 L24,24 L0,24 L0,0 Z M12,4.5 C8.418,4.5 5.5,7.418 5.5,11 C5.5,14.582 8.418,17.5 12,17.5 C15.582,17.5 18.5,14.582 18.5,11 C18.5,7.418 15.582,4.5 12,4.5 Z"/>
</svg>
</div>
<span class="font-semibold text-gray-900 group-hover:text-yellow-600 transition-colors">Python</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-blue-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
<div class="w-16 h-16 bg-gradient-to-r from-blue-600 to-blue-800 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<svg class="w-8 h-8 text-white" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm0 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm0 2c-4.411 0-8 3.589-8 8s3.589 8 8 8 8-3.589 8-8-3.589-8-8-8zm0 2c3.309 0 6 2.691 6 6s-2.691 6-6 6-6-2.691-6-6 2.691-6 6-6z"/>
</svg>
</div>
<span class="font-semibold text-gray-900 group-hover:text-blue-600 transition-colors">C</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-blue-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
<div class="w-16 h-16 bg-gradient-to-r from-blue-600 to-blue-800 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<svg class="w-8 h-8 text-white" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm0 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm0 2c-4.411 0-8 3.589-8 8s3.589 8 8 8 8-3.589 8-8-3.589-8-8-8zm0 2c3.309 0 6 2.691 6 6s-2.691 6-6 6-6-2.691-6-6 2.691-6 6-6z"/>
</svg>
</div>
<span class="font-semibold text-gray-900 group-hover:text-blue-600 transition-colors">C++</span>
</div>
<div class="group flex flex-col items-center p-6 bg-white rounded-2xl border border-gray-200 hover:border-purple-300 hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
<div class="w-16 h-16 bg-gradient-to-r from-purple-600 to-purple-800 rounded-xl mb-4 flex items-center justify-center group-hover:scale-105 transition-transform duration-300">
<svg class="w-8 h-8 text-white" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm0 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm0 2c-4.411 0-8 3.589-8 8s3.589 8 8 8 8-3.589 8-8-3.589-8-8-8zm0 2c3.309 0 6 2.691 6 6s-2.691 6-6 6-6-2.691-6-6 2.691-6 6-6z"/>
</svg>
</div>
<span class="font-semibold text-gray-900 group-hover:text-purple-600 transition-colors">C#</span>
</div>
</div>
</div>
</div>
</div>
</main>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation();
});
</script>
<script src="animations.js"></script>
</body>
</html>

@ -0,0 +1,287 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Contact - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
<script src="navigation.js"></script>
<style>
body {
font-family: 'Inter', sans-serif;
}
</style>
</head>
<body class="bg-white">
<nav id="navbar"></nav>
<main>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20">
<div class="text-center mb-16 animate-on-scroll" data-animation="fade-up">
<h1 class="text-4xl font-bold text-gray-900 mb-4">
Contactez-moi
</h1>
<p class="text-xl text-gray-600 max-w-2xl mx-auto">
Une idée de projet ? Une question ? N'hésitez pas à me contacter.
Je vous répondrai dans les plus brefs délais.
</p>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12">
<div class="bg-white rounded-xl shadow-lg p-8 animate-on-scroll" data-animation="fade-up" data-delay="100">
<h2 class="text-2xl font-bold text-gray-900 mb-6">
Envoyez-moi un message
</h2>
<form id="contact-form" class="space-y-6">
<div>
<label for="name" class="block text-sm font-medium text-gray-700 mb-2">
Nom complet *
</label>
<input
type="text"
id="name"
name="name"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
placeholder="Votre nom complet"
>
</div>
<div>
<label for="email" class="block text-sm font-medium text-gray-700 mb-2">
Adresse e-mail *
</label>
<input
type="email"
id="email"
name="email"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
placeholder="votre@email.com"
>
</div>
<div>
<label for="company" class="block text-sm font-medium text-gray-700 mb-2">
Entreprise (optionnel)
</label>
<input
type="text"
id="company"
name="company"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
placeholder="Nom de votre entreprise"
>
</div>
<div>
<label for="subject" class="block text-sm font-medium text-gray-700 mb-2">
Sujet *
</label>
<select
id="subject"
name="subject"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
>
<option value="">Choisissez un sujet</option>
<option value="project">Nouveau projet</option>
<option value="collaboration">Collaboration</option>
<option value="consultation">Consultation</option>
<option value="other">Autre</option>
</select>
</div>
<div>
<label for="budget" class="block text-sm font-medium text-gray-700 mb-2">
Budget estimé (optionnel)
</label>
<select
id="budget"
name="budget"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
>
<option value="">Sélectionnez une fourchette</option>
<option value="5k-10k">5k - 10k €</option>
<option value="10k-25k">10k - 25k €</option>
<option value="25k-50k">25k - 50k €</option>
<option value="50k+">50k+ €</option>
</select>
</div>
<div>
<label for="message" class="block text-sm font-medium text-gray-700 mb-2">
Message *
</label>
<textarea
id="message"
name="message"
rows="6"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors resize-vertical"
placeholder="Décrivez votre projet ou votre demande en détail..."
></textarea>
</div>
<button
type="submit"
class="btn-primary w-full magnetic"
>
Envoyer le message
</button>
</form>
<div id="form-success" class="hidden mt-4 p-4 bg-green-50 border border-green-200 rounded-lg">
<div class="flex">
<svg class="w-5 h-5 text-green-600 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<p class="text-green-800">Message envoyé avec succès ! Je vous répondrai bientôt.</p>
</div>
</div>
<div id="form-error" class="hidden mt-4 p-4 bg-red-50 border border-red-200 rounded-lg">
<div class="flex">
<svg class="w-5 h-5 text-red-600 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<p class="text-red-800">Une erreur s'est produite. Veuillez réessayer ou me contacter directement.</p>
</div>
</div>
</div>
<div class="space-y-8">
<div class="bg-gray-50 rounded-xl p-8 animate-on-scroll" data-animation="fade-up" data-delay="200">
<h2 class="text-2xl font-bold text-gray-900 mb-6">
Informations de contact
</h2>
<div class="space-y-4">
<div class="flex items-center">
<div class="w-10 h-10 bg-blue-600 rounded-lg flex items-center justify-center mr-4">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
</div>
<div>
<p class="text-sm text-gray-600">E-mail</p>
<a href="mailto:julesmerienne06@gmail.com" class="text-gray-900 font-medium hover:text-blue-600">
julesmerienne06@gmail.com
</a>
</div>
</div>
<div class="flex items-center">
<div class="w-10 h-10 bg-purple-600 rounded-lg flex items-center justify-center mr-4">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
</div>
<div>
<p class="text-sm text-gray-600">Localisation</p>
<p class="text-gray-900 font-medium">Clermont-Ferrand, Disponible à distance</p>
</div>
</div>
</div>
</div>
<div class="bg-gray-50 rounded-xl p-8 animate-on-scroll" data-animation="fade-up" data-delay="300">
<h3 class="text-xl font-bold text-gray-900 mb-4">
Retrouvez-moi sur
</h3>
<div class="flex space-x-4">
<a href="https://www.linkedin.com/in/jules-merienne-2101b830b/" target="_blank" class="w-10 h-10 bg-blue-600 rounded-lg flex items-center justify-center text-white hover:bg-blue-700 transition-all duration-300 hover:scale-110">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg>
</a>
<a href="https://github.com/exosky12" target="_blank" class="w-10 h-10 bg-gray-800 rounded-lg flex items-center justify-center text-white hover:bg-gray-900 transition-all duration-300 hover:scale-110">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<a href="https://x.com/exosky12_" target="_blank" class="w-10 h-10 bg-blue-400 rounded-lg flex items-center justify-center text-white hover:bg-blue-500 transition-all duration-300 hover:scale-110">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
<div class="bg-gradient-to-br from-blue-50 to-purple-50 rounded-xl p-8 animate-on-scroll" data-animation="fade-up" data-delay="400">
<h3 class="text-xl font-bold text-gray-900 mb-4">
Disponibilité
</h3>
<div class="flex items-center">
<div class="w-3 h-3 bg-green-500 rounded-full mr-3 animate-pulse"></div>
<span class="text-gray-900 font-medium">Disponible pour de nouveaux projets</span>
</div>
</div>
</div>
</div>
</div>
</main>
<style>
.btn-primary {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
border-radius: 12px;
border: none;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(59, 130, 246, 0.3);
overflow: hidden;
cursor: pointer;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.4);
background: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
}
.btn-primary::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
transition: left 0.6s ease;
}
.btn-primary:hover::before {
left: 100%;
}
.btn-primary:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
</style>
<script src="animations.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation();
});
</script>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

@ -1,34 +1,250 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<!DOCTYPE html>
<html lang="fr">
<head>
<title>portfoliojules - One incredible styled html page</title>
<link rel="stylesheet" href="mycoolstyle.css">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Portfolio - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
<script src="navigation.js"></script>
</head>
<body class="bg-white">
<nav id="navbar"></nav>
<main>
<section class="relative flex items-center justify-center min-h-screen bg-gradient-to-br from-blue-50 via-white to-purple-50">
<div class="absolute inset-0 bg-[url('data:image/svg+xml,%3Csvg width="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg fill="%239C92AC" fill-opacity="0.05"%3E%3Ccircle cx="30" cy="30" r="2"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E')] opacity-40"></div>
<div class="relative z-10 px-4 mx-auto max-w-7xl sm:px-6 lg:px-8">
<div class="grid items-center grid-cols-1 gap-12 lg:grid-cols-2">
<div class="text-center lg:text-left">
<div class="mb-6 animate-on-scroll" data-animation="fade-up">
<span class="inline-flex items-center px-4 py-2 mb-4 text-sm font-medium text-blue-800 bg-blue-100 rounded-full">
<span class="w-2 h-2 mr-2 bg-green-500 rounded-full animate-pulse"></span>
Disponible pour de nouveaux projets
</span>
</div>
<h1 class="mb-6 text-4xl font-bold leading-tight text-gray-900 md:text-6xl animate-on-scroll" data-animation="fade-up" data-delay="50">
Bonjour, je suis
<span class="text-transparent bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text">
Jules Merienne
</span>
</h1>
<p class="mb-8 text-xl leading-relaxed text-gray-600 animate-on-scroll" data-animation="fade-up" data-delay="100">
Étudiant et freelance <strong>dev web + design</strong>, je transforme vos idées en
<span class="font-semibold text-blue-600">solutions numériques innovantes</span>
et performantes.
</p>
<div class="flex flex-col justify-center gap-4 sm:flex-row lg:justify-start animate-on-scroll" data-animation="fade-up" data-delay="150">
<button onclick="window.location.href='contact.html'" class="btn-primary magnetic">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path>
</svg>
Discutons ensemble
</button>
<button onclick="window.location.href='projets.html'" class="btn-secondary magnetic">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path>
</svg>
Voir mes projets
</button>
</div>
<div class="flex justify-center mt-8 space-x-6 lg:justify-start animate-on-scroll" data-animation="fade-up" data-delay="200">
<a href="https://www.linkedin.com/in/jules-merienne-2101b830b/" target="_blank" class="text-gray-400 transition-all duration-300 hover:text-blue-600 hover:scale-110">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg>
</a>
<a href="https://github.com/exosky12" target="_blank" class="text-gray-400 transition-all duration-300 hover:text-gray-800 hover:scale-110">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<a href="https://x.com/exosky12_" target="_blank" class="text-gray-400 transition-all duration-300 hover:text-blue-400 hover:scale-110">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
<div class="flex justify-center lg:justify-end animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="relative">
<div class="absolute inset-0 rounded-full bg-gradient-to-r from-blue-600 to-purple-600 blur-2xl opacity-20 animate-pulse"></div>
<div class="relative">
<img
src="images/My_face.png"
alt="Jules Merienne - Étudiant et freelance dev web + design"
class="object-cover transition-transform duration-500 border-8 border-white rounded-full shadow-2xl w-80 h-80 md:w-96 md:h-96 hover:scale-105"
>
<div class="absolute flex items-center justify-center w-24 h-24 transition-transform duration-300 rounded-full shadow-lg -bottom-4 -right-4 bg-gradient-to-r from-blue-600 to-purple-600 hover:scale-110">
<svg class="w-12 h-12 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
</svg>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<body>
<section class="py-20 bg-white">
<div class="px-4 mx-auto max-w-7xl sm:px-6 lg:px-8">
<div class="mb-16 text-center animate-on-scroll" data-animation="fade-up">
<h2 class="mb-4 text-3xl font-bold text-gray-900 md:text-4xl">
Ce que je peux faire pour vous
</h2>
<p class="max-w-2xl mx-auto text-xl text-gray-600">
Des solutions complètes pour donner vie à vos projets numériques
</p>
</div>
<div class="grid grid-cols-1 gap-8 md:grid-cols-3">
<div class="p-8 text-center transition-all duration-300 bg-white border border-gray-100 shadow-lg group rounded-2xl hover:shadow-xl hover:border-blue-200 animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="flex items-center justify-center w-16 h-16 mx-auto mb-6 transition-transform duration-300 bg-gradient-to-r from-blue-500 to-blue-600 rounded-2xl group-hover:scale-110">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
</svg>
</div>
<h3 class="mb-3 text-xl font-bold text-gray-900">Développement Fullstack</h3>
<p class="leading-relaxed text-gray-600">Applications web modernes avec TypeScript, Adonis.js, React et Next.js pour des solutions robustes et performantes</p>
</div>
<div class="p-8 text-center transition-all duration-300 bg-white border border-gray-100 shadow-lg group rounded-2xl hover:shadow-xl hover:border-purple-200 animate-on-scroll" data-animation="fade-up" data-delay="200">
<div class="flex items-center justify-center w-16 h-16 mx-auto mb-6 transition-transform duration-300 bg-gradient-to-r from-purple-500 to-purple-600 rounded-2xl group-hover:scale-110">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"></path>
</svg>
</div>
<h3 class="mb-3 text-xl font-bold text-gray-900">Applications C#</h3>
<p class="leading-relaxed text-gray-600">Développement d'applications desktop et web avec C# pour des solutions enterprise robustes et évolutives</p>
</div>
<div class="p-8 text-center transition-all duration-300 bg-white border border-gray-100 shadow-lg group rounded-2xl hover:shadow-xl hover:border-green-200 animate-on-scroll" data-animation="fade-up" data-delay="300">
<div class="flex items-center justify-center w-16 h-16 mx-auto mb-6 transition-transform duration-300 bg-gradient-to-r from-green-500 to-green-600 rounded-2xl group-hover:scale-110">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01"></path>
</svg>
</div>
<h3 class="mb-3 text-xl font-bold text-gray-900">Design UI/UX</h3>
<p class="leading-relaxed text-gray-600">Création d'interfaces modernes et intuitives avec une attention particulière à l'expérience utilisateur</p>
</div>
</div>
</div>
</section>
<!-- Navigation menu -->
<ul class="navbar">
<li><a href="https://codefirst.iut.uca.fr/home">Code#0</a>
<li><a href="http://iut.uca.fr">IUT</a>
<li><a href="https://neilyoungarchives.com/">Very good music</a>
<li><a href="https://www.youtube.com/watch?v=CY5dTBhRxOA">Very good music too!</a>
</ul>
<section class="py-20 bg-gradient-to-r from-blue-600 to-purple-600">
<div class="max-w-4xl px-4 mx-auto text-center sm:px-6 lg:px-8">
<h2 class="mb-6 text-3xl font-bold text-white md:text-4xl animate-on-scroll" data-animation="fade-up">
Prêt à concrétiser votre projet ?
</h2>
<p class="mb-8 text-xl leading-relaxed text-blue-100 animate-on-scroll" data-animation="fade-up" data-delay="100">
Discutons ensemble de vos besoins et transformons vos idées en réalité numérique.
</p>
<button onclick="window.location.href='contact.html'" class="btn-white magnetic animate-on-scroll" data-animation="fade-up" data-delay="200">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
Commençons maintenant
</button>
</div>
</section>
</main>
<!-- Main Content -->
<h1>portfoliojules is my first page, and it has got style!</h1>
<style>
.btn-primary {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
border-radius: 12px;
border: none;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(59, 130, 246, 0.3);
overflow: hidden;
cursor: pointer;
}
<p>Welcome on this template html/css project
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.4);
background: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
}
<p>Very simple, some links, some menu... make it your own
&hellip;
.btn-secondary {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: #374151;
background: white;
border-radius: 12px;
border: 2px solid #e5e7eb;
transition: all 0.3s ease;
cursor: pointer;
}
<p>I have nothing more to say
.btn-secondary:hover {
transform: translateY(-2px);
border-color: #3b82f6;
color: #3b82f6;
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
}
<!-- my footer -->
<address>Template made in 2022<br>
with Code#0 <a href="https://codefirst.iut.uca.fr/home"><img src="images/CodeFirstLogo.png" alt="Code#0" align="middle" border="0" height="40px"/>
</a></address>
.btn-white {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: #1d4ed8;
background: white;
border-radius: 12px;
border: none;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
cursor: pointer;
}
.btn-white:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
background: #f8fafc;
}
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-10px); }
}
.animate-float {
animation: float 6s ease-in-out infinite;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation();
});
</script>
<script src="animations.js"></script>
</body>
</html>
</html>

@ -0,0 +1,267 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Centres d'intérêt - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
<script src="navigation.js"></script>
<style>
body {
font-family: 'Inter', sans-serif;
}
</style>
</head>
<body class="bg-white">
<nav id="navbar"></nav>
<main>
<section class="py-20 bg-gradient-to-br from-purple-50 via-blue-50 to-cyan-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16 animate-on-scroll" data-animation="fade-up">
<h1 class="text-4xl md:text-5xl font-bold text-gray-900 mb-6">
Mes <span class="bg-gradient-to-r from-purple-600 to-blue-600 bg-clip-text text-transparent">Passions</span>
</h1>
<p class="text-xl text-gray-600 max-w-3xl mx-auto leading-relaxed">
Découvrez mes passions qui enrichissent mon quotidien et ma créativité.
</p>
</div>
</div>
</section>
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-20">
<div class="order-2 lg:order-1 animate-on-scroll" data-animation="fade-up" data-delay="200">
<div class="bg-gradient-to-br from-green-50 to-emerald-50 rounded-3xl p-8 relative overflow-hidden hover:scale-105 transition-transform duration-300">
<div class="w-full h-64 bg-gradient-to-br from-green-400 to-green-600 rounded-2xl relative overflow-hidden">
<div class="absolute inset-4">
<div class="absolute inset-0 border-4 border-white/80 rounded-lg"></div>
<div class="absolute top-[15%] left-[15%] right-[15%] bottom-1/2 border-b-2 border-white/80"></div>
<div class="absolute top-1/2 left-[15%] right-[15%] bottom-[15%] border-t-2 border-white/80"></div>
<div class="absolute top-[15%] bottom-[15%] left-1/2 w-0.5 bg-white/80 transform -translate-x-1/2"></div>
<div class="absolute top-1/2 left-0 right-0 h-1 bg-white/80 transform -translate-y-1/2"></div>
<div class="absolute top-1/2 left-0 w-2 h-8 bg-white/80 transform -translate-y-1/2"></div>
<div class="absolute top-1/2 right-0 w-2 h-8 bg-white/80 transform -translate-y-1/2"></div>
<div class="absolute top-1/2 left-[10%] right-[10%] h-4 bg-white/40 transform -translate-y-1/2">
<div class="absolute inset-0 flex flex-col justify-between">
<div class="h-px w-full bg-white/60"></div>
<div class="h-px w-full bg-white/60"></div>
<div class="h-px w-full bg-white/60"></div>
</div>
</div>
<div class="absolute top-1/3 right-1/3 w-8 h-8">
<div class="absolute w-full h-full bg-yellow-400 rounded-full shadow-lg animate-bounce">
<div class="absolute inset-1 bg-yellow-300 rounded-full"></div>
<div class="absolute inset-2 border border-yellow-500/30 rounded-full"></div>
</div>
<div class="absolute top-0 left-0 w-full h-full">
<div class="absolute top-1/2 left-1/2 w-1 h-1 bg-yellow-400/30 rounded-full animate-ping"></div>
</div>
</div>
<div class="absolute bottom-1/3 left-1/3 w-16 h-20 transform -rotate-12">
<div class="absolute w-full h-3/4 bg-white rounded-full">
<div class="absolute inset-0.5 bg-gray-100 rounded-full"></div>
<div class="absolute inset-1">
<div class="absolute inset-0 flex justify-between">
<div class="w-px h-full bg-gray-300"></div>
<div class="w-px h-full bg-gray-300"></div>
<div class="w-px h-full bg-gray-300"></div>
<div class="w-px h-full bg-gray-300"></div>
<div class="w-px h-full bg-gray-300"></div>
</div>
<div class="absolute inset-0 flex flex-col justify-between">
<div class="h-px w-full bg-gray-300"></div>
<div class="h-px w-full bg-gray-300"></div>
<div class="h-px w-full bg-gray-300"></div>
<div class="h-px w-full bg-gray-300"></div>
<div class="h-px w-full bg-gray-300"></div>
</div>
</div>
</div>
<div class="absolute bottom-0 left-1/2 w-2 h-1/4 bg-gray-800 transform -translate-x-1/2">
<div class="absolute inset-0.5 bg-gray-700"></div>
</div>
<div class="absolute bottom-0 left-1/2 w-3 h-1/4 bg-gray-600 transform -translate-x-1/2">
<div class="absolute inset-0.5 bg-gray-500"></div>
</div>
</div>
<div class="absolute top-4 right-4 w-3 h-3 bg-white/30 rounded-full animate-pulse"></div>
<div class="absolute bottom-4 left-4 w-2 h-2 bg-white/30 rounded-full animate-pulse" style="animation-delay: 0.5s"></div>
</div>
</div>
</div>
</div>
<div class="order-1 lg:order-2 animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="flex items-center mb-6">
<div class="w-16 h-16 bg-gradient-to-r from-green-500 to-emerald-500 rounded-2xl flex items-center justify-center mr-4">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"></path>
</svg>
</div>
<h2 class="text-3xl font-bold text-gray-900">Tennis</h2>
</div>
<p class="text-gray-600 mb-6 leading-relaxed">
Je pratique le tennis depuis 2 ans. Ce sport m'apporte équilibre et concentration dans mon quotidien.
</p>
<div class="space-y-4">
<div class="flex items-center">
<svg class="w-5 h-5 text-green-500 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-700">Classement : 15/4</span>
</div>
</div>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-20">
<div class="animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="flex items-center mb-6">
<div class="w-16 h-16 bg-gradient-to-r from-purple-500 to-pink-500 rounded-2xl flex items-center justify-center mr-4">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3"></path>
</svg>
</div>
<h2 class="text-3xl font-bold text-gray-900">Piano</h2>
</div>
<p class="text-gray-600 mb-6 leading-relaxed">
Je débute le piano depuis 6 mois. C'est un moment de détente et d'expression personnelle.
</p>
<div class="space-y-4">
<div class="flex items-center">
<svg class="w-5 h-5 text-purple-500 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-700">Pratique régulière</span>
</div>
</div>
</div>
<div class="animate-on-scroll" data-animation="fade-up" data-delay="200">
<div class="bg-gradient-to-br from-purple-50 to-pink-50 rounded-3xl p-8 relative overflow-hidden hover:scale-105 transition-transform duration-300">
<div class="w-full h-64 bg-gradient-to-b from-gray-800 to-gray-900 rounded-2xl relative overflow-hidden">
<div class="absolute bottom-0 left-0 right-0 h-20 flex">
<div class="flex-1 bg-white border-r border-gray-300 rounded-b-sm"></div>
<div class="flex-1 bg-white border-r border-gray-300 rounded-b-sm"></div>
<div class="flex-1 bg-white border-r border-gray-300 rounded-b-sm"></div>
<div class="flex-1 bg-white border-r border-gray-300 rounded-b-sm"></div>
<div class="flex-1 bg-white border-r border-gray-300 rounded-b-sm"></div>
<div class="flex-1 bg-white border-r border-gray-300 rounded-b-sm"></div>
<div class="flex-1 bg-white rounded-b-sm"></div>
</div>
<div class="absolute bottom-8 left-0 right-0 h-12 flex justify-between px-4">
<div class="w-6 bg-gray-900 rounded-b-sm"></div>
<div class="w-6 bg-gray-900 rounded-b-sm"></div>
<div class="w-0"></div>
<div class="w-6 bg-gray-900 rounded-b-sm"></div>
<div class="w-6 bg-gray-900 rounded-b-sm"></div>
<div class="w-6 bg-gray-900 rounded-b-sm"></div>
</div>
<div class="absolute top-8 left-8 text-purple-400 text-2xl animate-pulse"></div>
<div class="absolute top-16 right-12 text-pink-400 text-xl animate-bounce"></div>
<div class="absolute top-12 right-6 text-purple-500 text-lg animate-ping"></div>
</div>
</div>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div class="order-2 lg:order-1 animate-on-scroll" data-animation="fade-up" data-delay="200">
<div class="bg-gradient-to-br from-blue-50 to-cyan-50 rounded-3xl p-8 relative overflow-hidden hover:scale-105 transition-transform duration-300">
<div class="w-full h-64 bg-gradient-to-br from-gray-900 to-blue-900 rounded-2xl relative overflow-hidden">
<div class="absolute inset-4 space-y-3">
<div class="flex items-center space-x-2">
<div class="w-3 h-3 bg-red-500 rounded-full"></div>
<div class="w-3 h-3 bg-yellow-500 rounded-full"></div>
<div class="w-3 h-3 bg-green-500 rounded-full"></div>
</div>
<div class="space-y-2 mt-4">
<div class="h-2 bg-blue-400 rounded w-3/4 animate-pulse"></div>
<div class="h-2 bg-green-400 rounded w-1/2 animate-pulse" style="animation-delay: 0.5s"></div>
<div class="h-2 bg-purple-400 rounded w-5/6 animate-pulse" style="animation-delay: 1s"></div>
<div class="h-2 bg-yellow-400 rounded w-2/3 animate-pulse" style="animation-delay: 1.5s"></div>
</div>
</div>
<div class="absolute top-6 right-6 w-8 h-8 bg-blue-500 rounded-lg animate-bounce"></div>
<div class="absolute bottom-8 left-6 w-6 h-6 bg-green-500 rounded-full animate-pulse"></div>
<div class="absolute top-12 left-12 w-4 h-4 bg-purple-500 rounded animate-ping"></div>
</div>
</div>
</div>
<div class="order-1 lg:order-2 animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="flex items-center mb-6">
<div class="w-16 h-16 bg-gradient-to-r from-blue-500 to-cyan-500 rounded-2xl flex items-center justify-center mr-4">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
</div>
<h2 class="text-3xl font-bold text-gray-900">Technologie</h2>
</div>
<p class="text-gray-600 mb-6 leading-relaxed">
Passionné par la technologie, je m'intéresse aux innovations et à leur impact sur notre quotidien.
</p>
<div class="space-y-4">
<div class="flex items-center">
<svg class="w-5 h-5 text-blue-500 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-700">Veille technologique</span>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="py-20 bg-gray-50">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center animate-on-scroll" data-animation="fade-up">
<h2 class="text-3xl md:text-4xl font-bold text-gray-900 mb-6">
Parlons de nos passions
</h2>
<p class="text-xl text-gray-600 mb-8">
Vous partagez ces centres d'intérêt ? Contactez-moi !
</p>
<button onclick="window.location.href='contact.html'" class="btn-premium magnetic">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path>
</svg>
Entamons la conversation
</button>
</div>
</section>
</main>
<script src="navigation.js"></script>
<script src="animations.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation('interests');
initScrollAnimations();
initMagneticEffect();
});
</script>
<a id="cv-download-btn" href="../assets/cv.pdf" class="cv-download-btn" download title="Télécharger mon CV">
Télécharger CV
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" style="margin-left:4px;width:18px;height:18px;"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>
</a>
</body>
</html>

@ -1,32 +0,0 @@
body {
padding-left: 11em;
font-family: Georgia, 'Georgia', "Times New Roman",
Times, serif;
color: darksalmon;
background-color: rgb(39, 39, 84) }
ul.navbar {
list-style-type: none;
padding: 0;
margin: 0;
position: absolute;
top: 2em;
left: 1em;
width: 9em }
h1 {
font-family: Helvetica, Geneva, Arial,
SunSans-Regular, sans-serif }
ul.navbar li {
background: white;
margin: 0.5em 0;
padding: 0.3em;
border-right: 1em solid darksalmon }
ul.navbar a {
text-decoration: none }
a:link {
color: blue }
a:visited {
color: darkblue }
address {
margin-top: 1em;
padding-top: 1em;
border-top: thin dotted }

@ -0,0 +1,371 @@
function createNavigation(activePage = 'home') {
const nav = document.getElementById('navbar');
if (!nav) return;
const currentPath = window.location.pathname;
const isInSubdir = currentPath.includes('/projets/') || currentPath.includes('/projects/');
const prefix = isInSubdir ? '../' : '';
nav.innerHTML = `
<div class="bg-white shadow-sm border-b border-gray-100">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between items-center h-20">
<div class="md:hidden">
<button
id="mobile-menu-button"
class="text-gray-600 hover:text-gray-900 focus:outline-none focus:text-gray-900 transition-colors duration-200"
aria-label="Toggle menu"
>
<svg id="menu-icon" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
<svg id="close-icon" class="h-6 w-6 hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
<div class="flex-shrink-0">
<a href="${prefix}index.html">
<div class="text-gray-900 font-semibold text-lg">Jules Merienne</div>
</a>
</div>
<div class="hidden md:block">
<ul class="flex gap-8 items-center">
<li>
<a
href="${prefix}index.html"
class="nav-link ${activePage === 'home' ? 'nav-link-active' : ''}"
>
<span class="nav-link-text">Accueil</span>
</a>
</li>
<li>
<a
href="${prefix}projets.html"
class="nav-link ${activePage === 'projects' ? 'nav-link-active' : ''}"
>
<span class="nav-link-text">Projets</span>
</a>
</li>
<li>
<a
href="${prefix}apropos.html"
class="nav-link ${activePage === 'about' ? 'nav-link-active' : ''}"
>
<span class="nav-link-text">À propos</span>
</a>
</li>
<li>
<a
href="${prefix}interets.html"
class="nav-link ${activePage === 'interests' ? 'nav-link-active' : ''}"
>
<span class="nav-link-text">Centres d'intérêt</span>
</a>
</li>
<li>
<a
href="${prefix}contact.html"
class="nav-link"
>
<span class="nav-link-text">Contact</span>
</a>
</li>
</ul>
</div>
<a class="flex items-center" href="${prefix}contact.html">
<button class="btn-primary-nav">Discutons ensemble</button>
</a>
</div>
</div>
<!-- Mobile Navigation -->
<div id="mobile-menu" class="md:hidden overflow-hidden transition-all duration-300 ease-in-out max-h-0 opacity-0">
<div class="px-2 pt-2 pb-3 space-y-1 sm:px-3 bg-white border-t border-gray-100">
<ul class="space-y-1">
<li>
<a
href="${prefix}index.html"
class="mobile-nav-link ${activePage === 'home' ? 'text-blue-600 bg-blue-50' : 'text-gray-600 hover:text-gray-900 hover:bg-gray-50'}"
>
<span class="mobile-nav-text">Accueil</span>
</a>
</li>
<li>
<a
href="${prefix}projets.html"
class="mobile-nav-link ${activePage === 'projects' ? 'text-blue-600 bg-blue-50' : 'text-gray-600 hover:text-gray-900 hover:bg-gray-50'}"
>
<span class="mobile-nav-text">Projets</span>
</a>
</li>
<li>
<a
href="${prefix}apropos.html"
class="mobile-nav-link ${activePage === 'about' ? 'text-blue-600 bg-blue-50' : 'text-gray-600 hover:text-gray-900 hover:bg-gray-50'}"
>
<span class="mobile-nav-text">À propos</span>
</a>
</li>
<li>
<a
href="${prefix}interets.html"
class="mobile-nav-link ${activePage === 'interests' ? 'text-blue-600 bg-blue-50' : 'text-gray-600 hover:text-gray-900 hover:bg-gray-50'}"
>
<span class="mobile-nav-text">Intérêts</span>
</a>
</li>
<li>
<a
href="${prefix}contact.html"
class="mobile-nav-link ${activePage === 'contact' ? 'text-blue-600 bg-blue-50' : 'text-gray-600 hover:text-gray-900 hover:bg-gray-50'}"
>
<span class="mobile-nav-text">Contact</span>
</a>
</li>
</ul>
</div>
</div>
</div>
`;
if (!document.getElementById('nav-styles')) {
const styles = document.createElement('style');
styles.id = 'nav-styles';
styles.textContent = `
.nav-link {
position: relative;
font-weight: 500;
padding: 12px 20px;
border-radius: 8px;
color: rgb(75 85 99);
text-decoration: none;
transition: all 0.3s ease;
}
.nav-link-text {
display: inline-block;
}
.nav-link-text .letter {
display: inline-block;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transform-origin: center bottom;
}
.nav-link:hover .nav-link-text .letter {
color: #3b82f6;
transform: translateY(-2px) scale(1.05);
}
.nav-link:hover .nav-link-text .letter:nth-child(1) { transition-delay: 0ms; }
.nav-link:hover .nav-link-text .letter:nth-child(2) { transition-delay: 50ms; }
.nav-link:hover .nav-link-text .letter:nth-child(3) { transition-delay: 100ms; }
.nav-link:hover .nav-link-text .letter:nth-child(4) { transition-delay: 150ms; }
.nav-link:hover .nav-link-text .letter:nth-child(5) { transition-delay: 200ms; }
.nav-link:hover .nav-link-text .letter:nth-child(6) { transition-delay: 250ms; }
.nav-link:hover .nav-link-text .letter:nth-child(7) { transition-delay: 300ms; }
.nav-link:hover .nav-link-text .letter:nth-child(8) { transition-delay: 350ms; }
.nav-link:hover .nav-link-text .letter:nth-child(9) { transition-delay: 400ms; }
.nav-link:hover .nav-link-text .letter:nth-child(10) { transition-delay: 450ms; }
.nav-link:hover .nav-link-text .letter:nth-child(11) { transition-delay: 500ms; }
.nav-link:hover .nav-link-text .letter:nth-child(12) { transition-delay: 550ms; }
.nav-link:hover .nav-link-text .letter:nth-child(13) { transition-delay: 600ms; }
.nav-link:hover .nav-link-text .letter:nth-child(14) { transition-delay: 650ms; }
.nav-link:hover .nav-link-text .letter:nth-child(15) { transition-delay: 700ms; }
.nav-link:hover .nav-link-text .letter:nth-child(16) { transition-delay: 750ms; }
.nav-link:hover .nav-link-text .letter:nth-child(17) { transition-delay: 800ms; }
.nav-link:hover .nav-link-text .letter:nth-child(18) { transition-delay: 850ms; }
.nav-link::after {
content: '';
position: absolute;
bottom: 8px;
left: 50%;
width: 0;
height: 1px;
background: linear-gradient(90deg, #3b82f6, #8b5cf6);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateX(-50%);
}
.nav-link:hover::after {
width: 80%;
}
.nav-link-active {
color: rgb(37 99 235);
font-weight: 600;
}
.nav-link-active::after {
width: 80%;
}
.nav-link-active .nav-link-text .letter {
color: #3b82f6;
}
.mobile-nav-link {
display: block;
padding: 8px 12px;
font-weight: 500;
border-radius: 6px;
transition: all 0.2s;
overflow: hidden;
position: relative;
}
.mobile-nav-text {
display: inline-block;
}
.mobile-nav-text .letter {
display: inline-block;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transform-origin: center bottom;
}
.mobile-nav-link:hover .mobile-nav-text .letter {
color: #3b82f6;
transform: translateY(-2px) scale(1.05);
}
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(1) { transition-delay: 0ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(2) { transition-delay: 50ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(3) { transition-delay: 100ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(4) { transition-delay: 150ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(5) { transition-delay: 200ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(6) { transition-delay: 250ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(7) { transition-delay: 300ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(8) { transition-delay: 350ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(9) { transition-delay: 400ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(10) { transition-delay: 450ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(11) { transition-delay: 500ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(12) { transition-delay: 550ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(13) { transition-delay: 600ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(14) { transition-delay: 650ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(15) { transition-delay: 700ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(16) { transition-delay: 750ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(17) { transition-delay: 800ms; }
.mobile-nav-link:hover .mobile-nav-text .letter:nth-child(18) { transition-delay: 850ms; }
.mobile-nav-link::after {
content: '';
position: absolute;
bottom: 4px;
left: 50%;
width: 0;
height: 1px;
background: linear-gradient(90deg, #3b82f6, #8b5cf6);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateX(-50%);
}
.mobile-nav-link:hover::after {
width: 80%;
}
.btn-primary-nav {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 10px 24px;
font-size: 14px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
border-radius: 12px;
border: none;
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
overflow: hidden;
cursor: pointer;
}
.btn-primary-nav:hover {
transform: translateY(-3px) scale(1.02);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.4);
background: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
}
.btn-primary-nav::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
transition: left 0.6s ease;
}
.btn-primary-nav:hover::before {
left: 100%;
}
.btn-primary-nav:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
`;
document.head.appendChild(styles);
}
if (!document.getElementById('cv-download-btn')) {
const cvButton = document.createElement('a');
cvButton.id = 'cv-download-btn';
cvButton.href = '../assets/cv.pdf';
cvButton.className = 'cv-download-btn';
cvButton.download = true;
cvButton.title = 'Télécharger mon CV';
cvButton.innerHTML = `Télécharger CV <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>`;
document.body.appendChild(cvButton);
}
function splitTextIntoLetters() {
const navLinks = document.querySelectorAll('.nav-link-text, .mobile-nav-text');
navLinks.forEach(link => {
const text = link.textContent;
link.innerHTML = text.split('').map(letter =>
letter === ' ' ? '<span class="letter">&nbsp;</span>' : `<span class="letter">${letter}</span>`
).join('');
});
}
const mobileMenuButton = document.getElementById('mobile-menu-button');
const mobileMenu = document.getElementById('mobile-menu');
const menuIcon = document.getElementById('menu-icon');
const closeIcon = document.getElementById('close-icon');
let isMobileMenuOpen = false;
mobileMenuButton.addEventListener('click', () => {
isMobileMenuOpen = !isMobileMenuOpen;
if (isMobileMenuOpen) {
mobileMenu.style.maxHeight = '384px';
mobileMenu.style.opacity = '1';
menuIcon.classList.add('hidden');
closeIcon.classList.remove('hidden');
} else {
mobileMenu.style.maxHeight = '0';
mobileMenu.style.opacity = '0';
menuIcon.classList.remove('hidden');
closeIcon.classList.add('hidden');
}
});
splitTextIntoLetters();
}
function initNavigation(activePage) {
createNavigation(activePage);
}
if (typeof module !== 'undefined' && module.exports) {
module.exports = { initNavigation };
}

@ -0,0 +1,192 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Projets - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
<script src="navigation.js"></script>
<style>
body {
font-family: 'Inter', sans-serif;
}
</style>
</head>
<body class="bg-white">
<nav id="navbar"></nav>
<main>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20">
<div class="text-center mb-16 animate-on-scroll" data-animation="fade-up">
<h1 class="text-4xl font-bold text-gray-900 mb-4">
Mes Projets
</h1>
<p class="text-xl text-gray-600 max-w-2xl mx-auto">
Découvrez une sélection de mes réalisations, alliant créativité et expertise technique.
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="bg-white rounded-xl shadow-lg overflow-hidden hover:shadow-xl transition-all duration-300 hover:scale-105 animate-on-scroll" data-animation="fade-up" data-delay="100">
<div class="h-48 bg-gradient-to-br from-blue-500 to-indigo-600 relative">
<img src="images/atelier_merienne.png" alt="Atelier Merienne" class="w-full h-full object-cover">
</div>
<div class="p-6">
<h3 class="text-xl font-semibold text-gray-900 mb-2">Atelier Merienne</h3>
<p class="text-gray-600 mb-4">
Site e-commerce pour un atelier de maroquinerie, proposant des produits en cuir, des réparations et des créations sur mesure.
</p>
<div class="flex flex-wrap gap-2 mb-4">
<span class="px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full">AdonisJS</span>
<span class="px-3 py-1 bg-purple-100 text-purple-800 text-sm rounded-full">TypeScript</span>
<span class="px-3 py-1 bg-green-100 text-green-800 text-sm rounded-full">React</span>
</div>
<div class="flex gap-3">
<a href="projets/ateliermerienne.html" class="text-blue-600 hover:text-blue-800 font-medium transition-colors">Voir le projet</a>
<a href="https://github.com/exosky12/ateliermerienne" target="_blank" class="text-gray-600 hover:text-gray-800 font-medium transition-colors">Code source</a>
</div>
</div>
</div>
<div class="bg-white rounded-xl shadow-lg overflow-hidden hover:shadow-xl transition-all duration-300 hover:scale-105 animate-on-scroll" data-animation="fade-up" data-delay="200">
<div class="h-48 bg-gradient-to-br from-blue-500 to-indigo-600 relative">
<img src="images/duckandcover.png" alt="Duck and cover" class="w-full h-full object-cover">
</div>
<div class="p-6">
<h3 class="text-xl font-semibold text-gray-900 mb-2">DuckAndCover - Jeu de Société Numérique</h3>
<p class="text-gray-600 mb-4">
Réalisation technique de l'année : transformation d'un jeu de plateau en jeu numérique multijoueur avec gestion de projet complète.
</p>
<div class="flex flex-wrap gap-2 mb-4">
<span class="px-3 py-1 bg-purple-100 text-purple-800 text-sm rounded-full">C# .NET MAUI</span>
<span class="px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full">XAML</span>
<span class="px-3 py-1 bg-green-100 text-green-800 text-sm rounded-full">Gestion de projet</span>
</div>
<div class="flex gap-3">
<a href="projets/duckandcover.html" class="text-blue-600 hover:text-blue-800 font-medium transition-colors">Voir le projet</a>
<a target="_blank" href="https://github.com/exosky12/DuckAndCover" class="text-gray-600 hover:text-gray-800 font-medium transition-colors">Code source</a>
</div>
</div>
</div>
<div class="bg-white rounded-xl shadow-lg overflow-hidden hover:shadow-xl transition-all duration-300 hover:scale-105 animate-on-scroll" data-animation="fade-up" data-delay="300">
<div class="h-48 bg-gradient-to-br from-green-500 to-emerald-600 relative">
<img src="images/skillupnow.png" alt="SkillUpNow" class="w-full h-full object-cover">
</div>
<div class="p-6">
<h3 class="text-xl font-semibold text-gray-900 mb-2">SkillUpNow - Marketplace de Coaching Gaming</h3>
<p class="text-gray-600 mb-4">
Design d'interface pour une marketplace de coaching gaming, connectant joueurs et coachs professionnels.
</p>
<div class="flex flex-wrap gap-2 mb-4">
<span class="px-3 py-1 bg-green-100 text-green-800 text-sm rounded-full">Figma</span>
<span class="px-3 py-1 bg-emerald-100 text-emerald-800 text-sm rounded-full">UI/UX Design</span>
<span class="px-3 py-1 bg-teal-100 text-teal-800 text-sm rounded-full">Prototypage</span>
</div>
<div class="flex gap-3">
<a href="projets/skillupnow.html" class="text-blue-600 hover:text-blue-800 font-medium transition-colors">Voir le projet</a>
<a href="https://skillupnow.xyz/" target="_blank" class="text-gray-600 hover:text-gray-800 font-medium transition-colors">Visiter le site</a>
</div>
</div>
</div>
</div>
<div class="text-center mt-40 animate-on-scroll" data-animation="fade-up">
<h2 class="text-2xl font-bold text-gray-900 mb-4">
Vous avez un projet en tête ?
</h2>
<p class="text-gray-600 mb-8">
Discutons ensemble de votre vision et donnons vie à vos idées.
</p>
<button onclick="window.location.href='contact.html'" class="btn-premium magnetic">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path>
</svg>
Contactez-moi
</button>
</div>
</div>
</main>
<style>
.btn-premium {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
border-radius: 12px;
border: none;
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
overflow: hidden;
cursor: pointer;
}
.btn-premium:hover {
transform: translateY(-3px) scale(1.02);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.4);
background: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
}
.btn-premium::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
transition: left 0.6s ease;
}
.btn-premium:hover::before {
left: 100%;
}
.btn-premium:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
</style>
<style>
.animate-on-scroll {
opacity: 0;
transform: translateY(30px);
transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}
.animate-fade-up {
opacity: 1;
transform: translateY(0);
}
.magnetic {
transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
}
</style>
<script src="animations.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation('projects');
initScrollAnimations();
initMagneticEffect();
});
</script>
<a id="cv-download-btn" href="images/cv.pdf" class="cv-download-btn" download title="Télécharger mon CV">
Télécharger CV
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" style="margin-left:4px;width:18px;height:18px;"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>
</a>
</body>
</html>

@ -0,0 +1,373 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Site E-commerce - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../../../src/css/styles.css">
<style>
body {
font-family: 'Inter', sans-serif;
}
.btn-outline-white {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: white;
background: transparent;
border-radius: 12px;
border: 2px solid white;
transition: all 0.3s ease;
cursor: pointer;
text-decoration: none;
}
.btn-outline-white:hover {
transform: translateY(-2px);
background: white;
color: #ea580c;
}
</style>
</head>
<body class="bg-white">
<!-- Navigation will be injected here -->
<nav id="navbar"></nav>
<!-- Main Content -->
<main>
<!-- Hero Section -->
<section class="py-20 bg-gradient-to-br from-blue-50 to-indigo-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div>
<div class="mb-6">
<a href="../projets.html" class="inline-flex items-center text-blue-600 hover:text-blue-800 font-medium">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
</svg>
Retour aux projets
</a>
</div>
<h1 class="text-4xl md:text-5xl font-bold text-gray-900 mb-6">
Atelier Merienne 🛍️
</h1>
<div class="bg-gradient-to-r from-blue-100 to-indigo-100 border-l-4 border-blue-500 p-4 mb-8 rounded-r-lg">
<h2 class="text-lg font-semibold text-gray-900 mb-2">Projet personnel complet</h2>
<p class="text-gray-700 leading-relaxed">
<strong>Résumé :</strong> Développement complet d'un site e-commerce pour un atelier de maroquinerie,
proposant des produits en cuir, des réparations et des créations sur mesure. Le site inclut un back office
intégré pour la gestion des produits, des stocks et des commandes. Ce projet m'a permis de développer
mes compétences en <strong>développement d'application (C1)</strong>, <strong>optimisation d'applications (C2)</strong>,
et <strong>gestion de projet (C5)</strong>.
</p>
</div>
<div class="flex flex-wrap gap-3 mb-8">
<span class="px-4 py-2 bg-blue-100 text-blue-800 rounded-full font-medium">AdonisJS</span>
<span class="px-4 py-2 bg-purple-100 text-purple-800 rounded-full font-medium">TypeScript</span>
<span class="px-4 py-2 bg-green-100 text-green-800 rounded-full font-medium">React</span>
<span class="px-4 py-2 bg-yellow-100 text-yellow-800 rounded-full font-medium">Tailwind CSS</span>
<span class="px-4 py-2 bg-pink-100 text-pink-800 rounded-full font-medium">Figma</span>
</div>
<div class="flex flex-col sm:flex-row gap-4">
<a href="https://github.com/exosky12/ateliermerienne" target="_blank" class="btn-primary">
<svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"></path>
</svg>
Voir le code source
</a>
<a href="../contact.html" class="btn-secondary">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path>
</svg>
Me contacter
</a>
</div>
</div>
<div>
<div class="relative flex justify-center">
<!-- Image Slider -->
<div class="bg-gradient-to-br from-blue-400 to-indigo-500 rounded-3xl p-6 shadow-2xl">
<div class="bg-white rounded-2xl p-4 overflow-hidden">
<div class="relative">
<div class="slider-container overflow-hidden">
<div class="slider-wrapper flex transition-transform duration-500 ease-in-out">
<div class="slider-slide min-w-full">
<img src="../../../public/assets/atelier_merienne.png" alt="Site E-commerce - Aperçu 1" class="w-full h-auto rounded-xl shadow-lg">
</div>
<div class="slider-slide min-w-full">
<img src="../../../public/assets/atelier_merienne2.png" alt="Site E-commerce - Aperçu 2" class="w-full h-auto rounded-xl shadow-lg">
</div>
</div>
</div>
<!-- Navigation Buttons -->
<button class="slider-nav prev absolute left-2 top-1/2 -translate-y-1/2 bg-white/80 hover:bg-white p-2 rounded-full shadow-lg transition-all">
<svg class="w-6 h-6 text-gray-800" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
</svg>
</button>
<button class="slider-nav next absolute right-2 top-1/2 -translate-y-1/2 bg-white/80 hover:bg-white p-2 rounded-full shadow-lg transition-all">
<svg class="w-6 h-6 text-gray-800" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Project Details -->
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-12">
<!-- Project Info -->
<div class="lg:col-span-2">
<h2 class="text-3xl font-bold text-gray-900 mb-8">À propos du projet</h2>
<div class="prose prose-lg max-w-none">
<p class="text-gray-600 mb-6">
Ce projet est un site e-commerce complet développé pour un atelier de maroquinerie, proposant
une gamme de produits en cuir, des services de réparation et des créations sur mesure. L'objectif
était de créer une plateforme moderne et intuitive permettant aux clients de découvrir les produits
et services, tout en offrant une gestion efficace des commandes et du stock.
</p>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Fonctionnalités développées</h3>
<ul class="space-y-3 mb-8">
<li class="flex items-start">
<svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Catalogue de produits en maroquinerie</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Réservation de services de réparation</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Demandes de créations sur mesure</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Gestion des stocks en temps réel</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Suivi des commandes et réparations</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Interface d'administration intuitive</span>
</li>
</ul>
</div>
</div>
<!-- Project Stats -->
<div>
<div class="bg-gray-50 rounded-2xl p-6 mb-8">
<h3 class="text-xl font-bold text-gray-900 mb-6">Informations du projet</h3>
<div class="space-y-4">
<div>
<div class="text-sm text-gray-600 mb-1">Durée</div>
<div class="font-semibold text-gray-900">3 mois</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Équipe</div>
<div class="font-semibold text-gray-900">Projet seul</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Mon rôle</div>
<div class="font-semibold text-gray-900">Développeur Full Stack</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Technologies</div>
<div class="font-semibold text-gray-900">AdonisJS, TypeScript, React</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Statut</div>
<div class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-yellow-100 text-yellow-800">
<div class="w-2 h-2 bg-yellow-500 rounded-full mr-2"></div>
En cours
</div>
</div>
</div>
</div>
<!-- Competencies -->
<div class="bg-gradient-to-br from-blue-50 to-indigo-50 border border-blue-200 rounded-2xl p-6">
<h3 class="text-xl font-bold text-gray-900 mb-6">Compétences développées</h3>
<div class="space-y-4">
<div class="flex items-start">
<div class="w-10 h-10 bg-blue-100 rounded-lg flex items-center justify-center mr-3">
<span class="text-blue-600 font-bold text-sm">C1</span>
</div>
<div>
<div class="font-semibold text-gray-900">Développement d'application</div>
<div class="text-sm text-gray-600">Full Stack, TypeScript, React, Inertia.js</div>
</div>
</div>
<div class="flex items-start">
<div class="w-10 h-10 bg-green-100 rounded-lg flex items-center justify-center mr-3">
<span class="text-green-600 font-bold text-sm">C2</span>
</div>
<div>
<div class="font-semibold text-gray-900">Optimisation d'applications</div>
<div class="text-sm text-gray-600">Performance, SEO, Expérience utilisateur</div>
</div>
</div>
<div class="flex items-start">
<div class="w-10 h-10 bg-purple-100 rounded-lg flex items-center justify-center mr-3">
<span class="text-purple-600 font-bold text-sm">C5</span>
</div>
<div>
<div class="font-semibold text-gray-900">Gestion de projet</div>
<div class="text-sm text-gray-600">Planning, Organisation, Méthodologie</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Technical Architecture Section -->
<section class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-gray-900 mb-12 text-center">Architecture technique</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="bg-white rounded-xl p-6 shadow-lg">
<div class="w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center mb-4">
<svg class="w-6 h-6 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
</svg>
</div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Frontend (React + Inertia.js)</h3>
<p class="text-gray-600 text-sm">Interface utilisateur moderne avec Tailwind CSS, animations fluides et design responsive, intégrée avec Inertia.js pour une expérience SPA.</p>
</div>
<div class="bg-white rounded-xl p-6 shadow-lg">
<div class="w-12 h-12 bg-purple-100 rounded-lg flex items-center justify-center mb-4">
<svg class="w-6 h-6 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"></path>
</svg>
</div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Backend (AdonisJS)</h3>
<p class="text-gray-600 text-sm">Application full-stack avec AdonisJS et Inertia.js, permettant une intégration transparente entre le frontend et le backend.</p>
</div>
<div class="bg-white rounded-xl p-6 shadow-lg">
<div class="w-12 h-12 bg-green-100 rounded-lg flex items-center justify-center mb-4">
<svg class="w-6 h-6 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>
</svg>
</div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Base de données</h3>
<p class="text-gray-600 text-sm">Modèle de données optimisé pour les performances et la scalabilité, avec gestion efficace des relations et des transactions.</p>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-20 bg-gradient-to-r from-blue-600 to-indigo-600">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h2 class="text-3xl md:text-4xl font-bold text-white mb-6">
Vous avez un projet e-commerce ?
</h2>
<p class="text-xl text-blue-100 mb-8">
De la conception à la réalisation, je peux vous accompagner dans votre projet avec une approche complète alliant design et développement.
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="../contact.html" class="btn-white">
Discuter de mon projet
</a>
<a href="../projets.html" class="btn-outline-white hover:text-orange-500">
Voir d'autres projets
</a>
</div>
</div>
</section>
</main>
<!-- Navigation Script -->
<script src="../../js/navigation.js"></script>
<script src="../../js/animations.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation('projects');
initScrollAnimations();
// Image Slider
const sliderWrapper = document.querySelector('.slider-wrapper');
const slides = document.querySelectorAll('.slider-slide');
const prevBtn = document.querySelector('.slider-nav.prev');
const nextBtn = document.querySelector('.slider-nav.next');
let currentSlide = 0;
function updateSlider() {
sliderWrapper.style.transform = `translateX(-${currentSlide * 100}%)`;
}
prevBtn.addEventListener('click', () => {
currentSlide = (currentSlide - 1 + slides.length) % slides.length;
updateSlider();
});
nextBtn.addEventListener('click', () => {
currentSlide = (currentSlide + 1) % slides.length;
updateSlider();
});
// Auto-advance slides every 5 seconds
setInterval(() => {
currentSlide = (currentSlide + 1) % slides.length;
updateSlider();
}, 5000);
});
</script>
<a id="cv-download-btn" href="../assets/cv.pdf" class="cv-download-btn" download title="Télécharger mon CV">
Télécharger CV
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" style="margin-left:4px;width:18px;height:18px;"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>
</a>
</body>
</html>

@ -0,0 +1,374 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DuckAndCover - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../../css/styles.css">
<link rel="stylesheet" href="../../css/slider.css">
<style>
body {
font-family: 'Inter', sans-serif;
}
/* Style manquant pour btn-outline-white */
.btn-outline-white {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: white;
background: transparent;
border-radius: 12px;
border: 2px solid white;
transition: all 0.3s ease;
cursor: pointer;
text-decoration: none;
}
.btn-outline-white:hover {
transform: translateY(-2px);
background: white;
color: #ea580c;
}
</style>
</head>
<body class="bg-white">
<!-- Navigation will be injected here -->
<nav id="navbar"></nav>
<!-- Main Content -->
<main>
<!-- Hero Section -->
<section class="py-20 bg-gradient-to-br from-yellow-50 to-orange-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div>
<div class="mb-6">
<a href="../projets.html" class="inline-flex items-center text-yellow-600 hover:text-yellow-800 font-medium">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
</svg>
Retour aux projets
</a>
</div>
<h1 class="text-4xl md:text-5xl font-bold text-gray-900 mb-6">
DuckAndCover 🦆
</h1>
<div class="bg-gradient-to-r from-yellow-100 to-orange-100 border-l-4 border-yellow-500 p-4 mb-8 rounded-r-lg">
<h2 class="text-lg font-semibold text-gray-900 mb-2">Réalisation technique de l'année en cours</h2>
<p class="text-gray-700 leading-relaxed">
<strong>Résumé :</strong> J'ai réalisé, en équipe de 4, la transformation du jeu de plateau DuckAndCover en jeu numérique.
Mon rôle a combiné développement et gestion de projet. Développé en C# .NET MAUI avec XAML, j'ai porté une attention
particulière à l'architecture évolutive et aux performances. J'ai mis en place un système de branches Git pour le travail
collaboratif et utilisé ClickUp pour la gestion de projet (planning, temps, attribution des tâches). Ce projet m'a permis
de développer mes compétences en <strong>développement d'applications (C1)</strong>, <strong>optimisation (C2)</strong> et
<strong>gestion de projet (C5)</strong>, tout en contribuant à la <strong>collaboration d'équipe (C6)</strong>.
</p>
</div>
<div class="flex flex-wrap gap-3 mb-8">
<span class="px-4 py-2 bg-purple-100 text-purple-800 rounded-full font-medium">C# .NET MAUI</span>
<span class="px-4 py-2 bg-blue-100 text-blue-800 rounded-full font-medium">XAML</span>
<span class="px-4 py-2 bg-green-100 text-green-800 rounded-full font-medium">Git/Branches</span>
<span class="px-4 py-2 bg-orange-100 text-orange-800 rounded-full font-medium">ClickUp</span>
<span class="px-4 py-2 bg-yellow-100 text-yellow-800 rounded-full font-medium">Multijoueur Local</span>
</div>
<div class="flex flex-col sm:flex-row gap-4">
<a href="https://github.com/exosky12/DuckAndCover" target="_blank" class="btn-primary">
<svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"></path>
</svg>
Voir le code source
</a>
<a href="../contact.html" class="btn-secondary">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path>
</svg>
Me contacter
</a>
</div>
</div>
<div>
<div class="relative flex justify-center">
<!-- Image Slider -->
<div class="bg-gradient-to-br from-yellow-400 to-orange-500 rounded-3xl p-6 shadow-2xl">
<div class="bg-white rounded-2xl p-4 overflow-hidden">
<div class="relative">
<div class="slider-container overflow-hidden">
<div class="slider-wrapper flex transition-transform duration-500 ease-in-out">
<div class="slider-slide min-w-full">
<img src="../../../public/assets/duckandcover.png" alt="DuckAndCover - Aperçu 1" class="w-full h-auto rounded-xl shadow-lg">
</div>
<div class="slider-slide min-w-full">
<img src="../../../public/assets/duckandcover2.png" alt="DuckAndCover - Aperçu 2" class="w-full h-auto rounded-xl shadow-lg">
</div>
<div class="slider-slide min-w-full">
<img src="../../../public/assets/duckandcover3.png" alt="DuckAndCover - Aperçu 3" class="w-full h-auto rounded-xl shadow-lg">
</div>
<div class="slider-slide min-w-full">
<img src="../../../public/assets/duckandcover4.png" alt="DuckAndCover - Aperçu 4" class="w-full h-auto rounded-xl shadow-lg">
</div>
</div>
</div>
<!-- Navigation Buttons -->
<button class="slider-nav prev absolute left-2 top-1/2 -translate-y-1/2 bg-white/80 hover:bg-white p-2 rounded-full shadow-lg transition-all">
<svg class="w-6 h-6 text-gray-800" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
</svg>
</button>
<button class="slider-nav next absolute right-2 top-1/2 -translate-y-1/2 bg-white/80 hover:bg-white p-2 rounded-full shadow-lg transition-all">
<svg class="w-6 h-6 text-gray-800" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Project Details -->
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-12">
<!-- Project Info -->
<div class="lg:col-span-2">
<h2 class="text-3xl font-bold text-gray-900 mb-8">À propos du projet</h2>
<div class="prose prose-lg max-w-none">
<p class="text-gray-600 mb-6">
DuckAndCover est un projet de transformation numérique d'un jeu de plateau existant.
L'objectif était de créer une version digitale fidèle tout en apportant des améliorations
comme l'intelligence artificielle et une interface moderne.
</p>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Le jeu original</h3>
<p class="text-gray-600 mb-6">
DuckAndCover est un jeu multijoueur local (2-7 joueurs) où les participants incarnent des canards
dans un univers coloré. L'objectif est de finir avec le moins de points possible après 3 manches.
Une manche se termine quand il ne reste qu'une pile à un joueur ou quand le nombre de joueurs +
cartes en défausse égale 11.
</p>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Fonctionnalités développées</h3>
<ul class="space-y-3 mb-8">
<li class="flex items-start">
<svg class="w-6 h-6 text-yellow-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Interface utilisateur intuitive en XAML</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-yellow-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Multijoueur local jusqu'à 7 joueurs</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-yellow-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Intelligence artificielle pour compléter les parties</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-yellow-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Architecture évolutive et maintenable</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-yellow-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Animations et effets visuels engageants</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-yellow-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Compatibilité cross-platform (Windows, Android, iOS)</span>
</li>
</ul>
</div>
</div>
<!-- Project Stats -->
<div>
<div class="bg-gray-50 rounded-2xl p-6 mb-8">
<h3 class="text-xl font-bold text-gray-900 mb-6">Informations du projet</h3>
<div class="space-y-4">
<div>
<div class="text-sm text-gray-600 mb-1">Durée</div>
<div class="font-semibold text-gray-900">4 mois</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Équipe</div>
<div class="font-semibold text-gray-900">2 développeurs</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Mon rôle</div>
<div class="font-semibold text-gray-900">Développeur</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Plateformes</div>
<div class="font-semibold text-gray-900">Windows, Android, iOS</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Statut</div>
<div class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-green-100 text-green-800">
<div class="w-2 h-2 bg-green-500 rounded-full mr-2"></div>
Terminé
</div>
</div>
</div>
</div>
<!-- Competencies -->
<div class="bg-gradient-to-br from-yellow-50 to-orange-50 border border-yellow-200 rounded-2xl p-6">
<h3 class="text-xl font-bold text-gray-900 mb-6">Compétences développées</h3>
<div class="space-y-4">
<div class="flex items-start">
<div class="w-10 h-10 bg-blue-100 rounded-lg flex items-center justify-center mr-3">
<span class="text-blue-600 font-bold text-sm">C1</span>
</div>
<div>
<div class="font-semibold text-gray-900">Développement d'application</div>
<div class="text-sm text-gray-600">Architecture MVVM, C# .NET MAUI</div>
</div>
</div>
<div class="flex items-start">
<div class="w-10 h-10 bg-green-100 rounded-lg flex items-center justify-center mr-3">
<span class="text-green-600 font-bold text-sm">C2</span>
</div>
<div>
<div class="font-semibold text-gray-900">Optimisation d'applications</div>
<div class="text-sm text-gray-600">Performance, mémoire, animations</div>
</div>
</div>
<div class="flex items-start">
<div class="w-10 h-10 bg-purple-100 rounded-lg flex items-center justify-center mr-3">
<span class="text-purple-600 font-bold text-sm">C5</span>
</div>
<div>
<div class="font-semibold text-gray-900">Gestion de projet</div>
<div class="text-sm text-gray-600">ClickUp, planning, coordination équipe</div>
</div>
</div>
<div class="flex items-start">
<div class="w-10 h-10 bg-orange-100 rounded-lg flex items-center justify-center mr-3">
<span class="text-orange-600 font-bold text-sm">C6</span>
</div>
<div>
<div class="font-semibold text-gray-900">Collaboration d'équipe</div>
<div class="text-sm text-gray-600">Git, branches, travail collaboratif</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Technical Architecture Section -->
<section class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-gray-900 mb-12 text-center">Architecture technique</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="bg-white rounded-xl p-6 shadow-lg">
<div class="w-12 h-12 bg-purple-100 rounded-lg flex items-center justify-center mb-4">
<svg class="w-6 h-6 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
</svg>
</div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Frontend (XAML)</h3>
<p class="text-gray-600 text-sm">Interface utilisateur responsive avec animations fluides et design moderne adapté au multijoueur local.</p>
</div>
<div class="bg-white rounded-xl p-6 shadow-lg">
<div class="w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center mb-4">
<svg class="w-6 h-6 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"></path>
</svg>
</div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Backend (C#)</h3>
<p class="text-gray-600 text-sm">Logique métier robuste avec gestion d'état, intelligence artificielle et mécaniques de jeu optimisées.</p>
</div>
<div class="bg-white rounded-xl p-6 shadow-lg">
<div class="w-12 h-12 bg-green-100 rounded-lg flex items-center justify-center mb-4">
<svg class="w-6 h-6 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>
</svg>
</div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Architecture MVVM</h3>
<p class="text-gray-600 text-sm">Séparation claire des responsabilités pour une maintenance facilitée et une évolutivité optimale.</p>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-20 bg-gradient-to-r from-yellow-600 to-orange-600">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h2 class="text-3xl md:text-4xl font-bold text-white mb-6">
Vous avez un projet de jeu ou d'application ?
</h2>
<p class="text-xl text-yellow-100 mb-8">
De l'idée à la réalisation, je peux vous accompagner dans votre projet avec une approche complète alliant développement et gestion.
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="../contact.html" class="btn-white">
Discuter de mon projet
</a>
<a href="../projets.html" class="btn-outline-white">
Voir d'autres projets
</a>
</div>
</div>
</section>
</main>
<!-- Navigation Script -->
<script src="../../js/navigation.js"></script>
<script src="../../js/animations.js"></script>
<script src="../../js/slider.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation('projects');
initScrollAnimations();
initSlider();
});
</script>
<a id="cv-download-btn" href="../assets/cv.pdf" class="cv-download-btn" download title="Télécharger mon CV">
Télécharger CV
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" style="margin-left:4px;width:18px;height:18px;"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>
</a>
</body>
</html>

@ -0,0 +1,282 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SkillUpNow - Jules Merienne</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../../css/styles.css">
<link rel="stylesheet" href="../../css/slider.css">
<style>
body {
font-family: 'Inter', sans-serif;
}
.btn-outline-white {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: white;
background: transparent;
border-radius: 12px;
border: 2px solid white;
transition: all 0.3s ease;
cursor: pointer;
text-decoration: none;
}
.btn-outline-white:hover {
transform: translateY(-2px);
background: white;
color: #ea580c;
}
</style>
</head>
<body class="bg-white">
<!-- Navigation will be injected here -->
<nav id="navbar"></nav>
<!-- Main Content -->
<main>
<!-- Hero Section -->
<section class="py-20 bg-gradient-to-br from-green-50 to-emerald-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div>
<div class="mb-6">
<a href="../projets.html" class="inline-flex items-center text-green-600 hover:text-green-800 font-medium">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
</svg>
Retour aux projets
</a>
</div>
<h1 class="text-4xl md:text-5xl font-bold text-gray-900 mb-6">
SkillUpNow 🎮
</h1>
<div class="bg-gradient-to-r from-green-100 to-emerald-100 border-l-4 border-green-500 p-4 mb-8 rounded-r-lg">
<h2 class="text-lg font-semibold text-gray-900 mb-2">Design d'interface pour une marketplace de coaching gaming</h2>
<p class="text-gray-700 leading-relaxed">
<strong>Résumé :</strong> Design d'interface pour une marketplace de coaching gaming, connectant joueurs et coachs professionnels.
J'ai créé une expérience utilisateur intuitive et moderne, facilitant la découverte et la réservation de séances de coaching.
</p>
</div>
<div class="flex flex-wrap gap-3 mb-8">
<span class="px-4 py-2 bg-green-100 text-green-800 rounded-full font-medium">Figma</span>
<span class="px-4 py-2 bg-emerald-100 text-emerald-800 rounded-full font-medium">UI/UX Design</span>
<span class="px-4 py-2 bg-teal-100 text-teal-800 rounded-full font-medium">Prototypage</span>
</div>
<div class="flex flex-col sm:flex-row gap-4">
<a href="https://skillupnow.xyz/" target="_blank" class="btn-primary">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path>
</svg>
Visiter le site
</a>
<a href="../contact.html" class="btn-secondary">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path>
</svg>
Me contacter
</a>
</div>
</div>
<div>
<div class="relative flex justify-center">
<!-- Image Slider -->
<div class="bg-gradient-to-br from-green-400 to-emerald-500 rounded-3xl p-6 shadow-2xl">
<div class="bg-white rounded-2xl p-4 overflow-hidden">
<div class="relative">
<div class="slider-container overflow-hidden">
<div class="slider-wrapper flex transition-transform duration-500 ease-in-out">
<div class="slider-slide min-w-full">
<img src="../../../public/assets/skillupnow.png" alt="SkillUpNow - Aperçu 1" class="w-full h-auto rounded-xl shadow-lg">
</div>
<div class="slider-slide min-w-full">
<img src="../../../public/assets/skillupnow2.png" alt="SkillUpNow - Aperçu 2" class="w-full h-auto rounded-xl shadow-lg">
</div>
<div class="slider-slide min-w-full">
<img src="../../../public/assets/skillupnow3.png" alt="SkillUpNow - Aperçu 3" class="w-full h-auto rounded-xl shadow-lg">
</div>
</div>
</div>
<!-- Navigation Buttons -->
<button class="slider-nav prev absolute left-2 top-1/2 -translate-y-1/2 bg-white/80 hover:bg-white p-2 rounded-full shadow-lg transition-all">
<svg class="w-6 h-6 text-gray-800" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
</svg>
</button>
<button class="slider-nav next absolute right-2 top-1/2 -translate-y-1/2 bg-white/80 hover:bg-white p-2 rounded-full shadow-lg transition-all">
<svg class="w-6 h-6 text-gray-800" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Project Details -->
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-12">
<!-- Project Info -->
<div class="lg:col-span-2">
<h2 class="text-3xl font-bold text-gray-900 mb-8">À propos du projet</h2>
<div class="prose prose-lg max-w-none">
<p class="text-gray-600 mb-6">
SkillUpNow est une marketplace innovante dédiée au coaching gaming, permettant aux joueurs de
trouver et réserver des séances avec des coachs professionnels. Mon rôle était de concevoir
une interface intuitive et moderne qui facilite la découverte et la réservation de séances.
</p>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Contexte</h3>
<p class="text-gray-600 mb-6">
Le projet visait à créer une plateforme qui connecte les joueurs souhaitant améliorer leurs
compétences avec des coachs professionnels. L'enjeu principal était de concevoir une interface
qui rende le processus de recherche et de réservation de coaching simple et agréable.
</p>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Mon Rôle</h3>
<p class="text-gray-600 mb-6">
En tant que designer d'interface, j'ai été responsable de la conception de l'expérience utilisateur
complète, de la recherche initiale jusqu'au prototypage final. J'ai travaillé en étroite collaboration
avec l'équipe de développement pour assurer une implémentation fidèle des designs.
</p>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Processus de Design</h3>
<p class="text-gray-600 mb-6">
Le processus de design a commencé par une analyse approfondie des besoins des utilisateurs et des
coachs. J'ai ensuite créé des wireframes et des prototypes interactifs pour tester différentes
approches de l'interface. Les retours des utilisateurs ont guidé les itérations successives jusqu'à
l'obtention d'une expérience optimale.
</p>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Fonctionnalités Clés</h3>
<ul class="space-y-3 mb-8">
<li class="flex items-start">
<svg class="w-6 h-6 text-green-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Interface de recherche intuitive avec filtres avancés</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-green-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Profils de coachs détaillés avec système de notation</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-green-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Processus de réservation simplifié en quelques clics</span>
</li>
<li class="flex items-start">
<svg class="w-6 h-6 text-green-500 mr-3 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="text-gray-600">Système de messagerie intégré pour la communication</span>
</li>
</ul>
<h3 class="text-2xl font-bold text-gray-900 mb-4">Résultats</h3>
<p class="text-gray-600 mb-6">
Le design final a été très bien accueilli par les utilisateurs, avec une augmentation significative
des réservations et une réduction du temps nécessaire pour trouver et réserver un coach. L'interface
intuitive a contribué à une meilleure rétention des utilisateurs et à une expérience globale positive.
</p>
</div>
</div>
<!-- Project Stats -->
<div>
<div class="bg-gray-50 rounded-2xl p-6 mb-8">
<h3 class="text-xl font-bold text-gray-900 mb-6">Informations du projet</h3>
<div class="space-y-4">
<div>
<div class="text-sm text-gray-600 mb-1">Durée</div>
<div class="font-semibold text-gray-900">3 mois</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Équipe</div>
<div class="font-semibold text-gray-900">Projet</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Mon rôle</div>
<div class="font-semibold text-gray-900">Designer d'interface</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Outils</div>
<div class="font-semibold text-gray-900">Figma</div>
</div>
<div>
<div class="text-sm text-gray-600 mb-1">Statut</div>
<div class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-green-100 text-green-800">
<div class="w-2 h-2 bg-green-500 rounded-full mr-2"></div>
Terminé
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Next Project Section -->
<section class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<h2 class="text-3xl font-bold text-gray-900 mb-8">Projet suivant</h2>
<a href="duckandcover.html" class="inline-flex items-center text-green-600 hover:text-green-800 font-medium text-lg">
DuckAndCover - Jeu de Société Numérique
<svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
</section>
</main>
<!-- Navigation Script -->
<script src="../../js/navigation.js"></script>
<script src="../../js/animations.js"></script>
<script src="../../js/slider.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initNavigation('projects');
initScrollAnimations();
initSlider();
});
</script>
<a id="cv-download-btn" href="../assets/cv.pdf" class="cv-download-btn" download title="Télécharger mon CV">
Télécharger CV
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" style="margin-left:4px;width:18px;height:18px;"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>
</a>
</body>
</html>

@ -0,0 +1,36 @@
.slider-container {
position: relative;
overflow: hidden;
}
.slider-wrapper {
display: flex;
transition: transform 0.5s ease-in-out;
}
.slider-slide {
min-width: 100%;
}
.slider-nav {
position: absolute;
top: 50%;
transform: translateY(-50%);
background-color: rgba(255, 255, 255, 0.8);
padding: 0.5rem;
border-radius: 9999px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
}
.slider-nav:hover {
background-color: white;
}
.slider-nav.prev {
left: 0.5rem;
}
.slider-nav.next {
right: 0.5rem;
}

@ -0,0 +1,26 @@
function initSlider() {
const sliderWrapper = document.querySelector('.slider-wrapper');
const slides = document.querySelectorAll('.slider-slide');
const prevBtn = document.querySelector('.slider-nav.prev');
const nextBtn = document.querySelector('.slider-nav.next');
let currentSlide = 0;
function updateSlider() {
sliderWrapper.style.transform = `translateX(-${currentSlide * 100}%)`;
}
prevBtn.addEventListener('click', () => {
currentSlide = (currentSlide - 1 + slides.length) % slides.length;
updateSlider();
});
nextBtn.addEventListener('click', () => {
currentSlide = (currentSlide + 1) % slides.length;
updateSlider();
});
setInterval(() => {
currentSlide = (currentSlide + 1) % slides.length;
updateSlider();
}, 5000);
}

@ -0,0 +1,595 @@
/* ========================================
PORTFOLIO - JULES MERIENNE
Styles principaux
======================================== */
/* Variables CSS */
:root {
--primary-blue: #3b82f6;
--primary-dark: #1d4ed8;
--secondary-blue: #2563eb;
--secondary-dark: #1e40af;
--purple-600: #9333ea;
--purple-500: #a855f7;
--green-500: #10b981;
--gray-900: #111827;
--gray-800: #1f2937;
--gray-700: #374151;
--gray-600: #4b5563;
--gray-50: #f9fafb;
--white: #ffffff;
--gradient-primary: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
--gradient-secondary: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
--shadow-primary: 0 4px 15px rgba(59, 130, 246, 0.3);
--shadow-primary-hover: 0 8px 25px rgba(59, 130, 246, 0.4);
--timing: cubic-bezier(0.4, 0, 0.2, 1);
--timing-magnetic: cubic-bezier(0.23, 1, 0.32, 1);
}
/* Base styles */
body {
font-family: 'Inter', sans-serif;
}
/* ========================================
ANIMATIONS
======================================== */
/* Animation base styles */
.animate-on-scroll {
opacity: 0;
transform: translateY(30px);
transition: all 0.8s var(--timing);
}
.animate-on-scroll.visible {
opacity: 1;
transform: translateY(0);
}
.animate-fade-up {
opacity: 1;
transform: translateY(0);
}
.animate-slide-right {
opacity: 1;
transform: translateX(0);
}
.animate-scale-up {
opacity: 1;
transform: scale(1);
}
.magnetic {
transition: all 0.2s var(--timing);
}
/* Form focus animations */
input:focus,
select:focus,
textarea:focus {
transform: translateY(-1px);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.15);
}
/* ========================================
BUTTONS
======================================== */
.btn-primary {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: var(--white);
background: var(--gradient-primary);
border-radius: 12px;
border: none;
transition: all 0.3s var(--timing-magnetic);
box-shadow: var(--shadow-primary);
overflow: hidden;
cursor: pointer;
}
.btn-primary-orange {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: var(--white);
background: linear-gradient(135deg, #f97316 0%, #ea580c 100%);
border-radius: 12px;
border: none;
transition: all 0.3s var(--timing-magnetic);
box-shadow: 0 4px 15px rgba(249, 115, 22, 0.3);
overflow: hidden;
cursor: pointer;
}
.btn-primary-orange:hover {
transform: translateY(-2px);
background: linear-gradient(135deg, #ea580c 0%, #c2410c 100%);
box-shadow: 0 8px 25px rgba(249, 115, 22, 0.4);
}
.btn-primary-orange::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
transition: left 0.6s ease;
}
.btn-primary-orange:hover::before {
left: 100%;
}
.btn-primary-orange:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-primary-hover);
background: var(--gradient-secondary);
}
.btn-primary::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
transition: left 0.6s ease;
}
.btn-primary:hover::before {
left: 100%;
}
.btn-primary:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
.btn-secondary {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: #374151;
background: var(--white);
border-radius: 12px;
border: 2px solid #e5e7eb;
transition: all 0.3s ease;
cursor: pointer;
}
.btn-secondary:hover {
transform: translateY(-2px);
border-color: var(--primary-blue);
color: var(--primary-blue);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
}
.btn-white {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: var(--primary-dark);
background: var(--white);
border-radius: 12px;
border: none;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
cursor: pointer;
}
.btn-white:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
background: #f8fafc;
}
.btn-premium {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: var(--white);
background: var(--gradient-primary);
border-radius: 12px;
border: none;
transition: all 0.3s var(--timing-magnetic);
box-shadow: var(--shadow-primary);
overflow: hidden;
cursor: pointer;
}
.btn-premium:hover {
transform: translateY(-3px) scale(1.02);
box-shadow: var(--shadow-primary-hover);
background: var(--gradient-secondary);
}
.btn-premium::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
transition: left 0.6s ease;
}
.btn-premium:hover::before {
left: 100%;
}
.btn-premium:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
.btn-outline {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: var(--primary-blue);
background: transparent;
border-radius: 12px;
border: 2px solid var(--primary-blue);
transition: all 0.3s var(--timing-magnetic);
cursor: pointer;
}
.btn-outline:hover {
transform: translateY(-2px);
background: var(--primary-blue);
color: var(--white);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.2);
}
.btn-outline:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
.btn-outline-orange {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
font-size: 16px;
font-weight: 600;
color: #f97316;
background: transparent;
border-radius: 12px;
border: 2px solid #f97316;
transition: all 0.3s var(--timing-magnetic);
cursor: pointer;
}
.btn-outline-orange:hover {
transform: translateY(-2px);
background: #f97316;
color: var(--white);
box-shadow: 0 8px 25px rgba(249, 115, 22, 0.2);
}
.btn-outline-orange:active {
transform: translateY(-1px) scale(0.98);
transition: all 0.1s ease;
}
/* ========================================
CARDS & COMPONENTS
======================================== */
.stats-card {
background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
border-radius: 16px;
padding: 24px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
transition: all 0.3s var(--timing);
border: 1px solid #e5e7eb;
}
.stats-card:hover {
transform: translateY(-4px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
border-color: var(--primary-blue);
}
.feature-card {
background: var(--white);
border-radius: 20px;
padding: 32px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
transition: all 0.3s var(--timing);
border: 1px solid #f3f4f6;
}
.feature-card:hover {
transform: translateY(-6px);
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);
border-color: var(--primary-blue);
}
.tech-stack-item {
display: flex;
align-items: center;
padding: 12px 20px;
background: linear-gradient(135deg, #f8fafc 0%, #ffffff 100%);
border-radius: 12px;
border: 1px solid #e5e7eb;
transition: all 0.3s var(--timing);
cursor: pointer;
}
.tech-stack-item:hover {
transform: translateY(-2px) scale(1.02);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.15);
border-color: var(--primary-blue);
background: linear-gradient(135deg, #eff6ff 0%, #ffffff 100%);
}
/* ========================================
NAVIGATION ENHANCEMENTS
======================================== */
.nav-link {
position: relative;
overflow: hidden;
}
.nav-link::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background: var(--gradient-primary);
transition: width 0.3s var(--timing);
}
.nav-link:hover::after {
width: 100%;
}
/* ========================================
HERO SECTION
======================================== */
.hero-gradient {
background: linear-gradient(135deg, #eff6ff 0%, #ffffff 50%, #f3e8ff 100%);
position: relative;
overflow: hidden;
}
.hero-gradient::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image:
radial-gradient(circle at 25% 25%, rgba(59, 130, 246, 0.1) 0%, transparent 50%),
radial-gradient(circle at 75% 75%, rgba(147, 51, 234, 0.1) 0%, transparent 50%);
pointer-events: none;
}
.floating-shapes {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
pointer-events: none;
}
.floating-shape {
position: absolute;
border-radius: 50%;
opacity: 0.6;
animation: float 6s ease-in-out infinite;
}
.floating-shape:nth-child(1) {
width: 80px;
height: 80px;
background: linear-gradient(45deg, #3b82f6, #8b5cf6);
top: 20%;
left: 10%;
}
.floating-shape:nth-child(2) {
width: 60px;
height: 60px;
background: linear-gradient(45deg, #10b981, #3b82f6);
top: 60%;
right: 15%;
animation-delay: 2s;
}
.floating-shape:nth-child(3) {
width: 100px;
height: 100px;
background: linear-gradient(45deg, #8b5cf6, #ec4899);
bottom: 20%;
left: 20%;
animation-delay: 4s;
}
/* ========================================
KEYFRAMES
======================================== */
@keyframes float {
0%, 100% {
transform: translateY(0px) rotate(0deg);
}
50% {
transform: translateY(-20px) rotate(180deg);
}
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideInRight {
from {
opacity: 0;
transform: translateX(30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0.8);
}
to {
opacity: 1;
transform: scale(1);
}
}
/* ========================================
RESPONSIVE DESIGN
======================================== */
@media (max-width: 768px) {
.floating-shape {
display: none;
}
.stats-card {
padding: 20px;
}
.feature-card {
padding: 24px;
}
.btn-primary,
.btn-secondary,
.btn-white,
.btn-premium {
padding: 12px 24px;
font-size: 14px;
}
}
/* ========================================
UTILITY CLASSES
======================================== */
.gradient-text {
background: linear-gradient(135deg, var(--primary-blue) 0%, var(--purple-600) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.glassmorphism {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.text-shadow {
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.hover-lift {
transition: transform 0.3s var(--timing);
}
.hover-lift:hover {
transform: translateY(-4px);
}
.cv-download-btn {
position: fixed;
bottom: 24px;
right: 24px;
display: flex;
align-items: center;
gap: 0.5em;
padding: 10px 18px;
background: #2563eb;
color: #fff;
border-radius: 8px;
font-size: 1rem;
font-weight: 500;
box-shadow: 0 2px 8px rgba(37,99,235,0.15);
border: none;
z-index: 1000;
cursor: pointer;
text-decoration: none;
transition: background 0.2s, transform 0.2s;
}
.cv-download-btn:hover {
background: #1d4ed8;
transform: translateY(-2px) scale(1.04);
}
.cv-download-btn svg {
width: 18px;
height: 18px;
margin-left: 4px;
}
@media (max-width: 600px) {
.cv-download-btn {
bottom: 12px;
right: 12px;
padding: 8px 12px;
font-size: 0.95rem;
}
}
Loading…
Cancel
Save