/* ======================================== 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; } }