diff --git a/public/cv.pdf b/public/cv.pdf index e69de29..ba827e5 100644 Binary files a/public/cv.pdf and b/public/cv.pdf differ diff --git a/public/images/icons/42_icon.png b/public/images/icons/42_icon.png new file mode 100644 index 0000000..c0705a5 Binary files /dev/null and b/public/images/icons/42_icon.png differ diff --git a/public/images/icons/favicon-omv.ico b/public/images/icons/favicon-omv.ico new file mode 100644 index 0000000..e0ef031 Binary files /dev/null and b/public/images/icons/favicon-omv.ico differ diff --git a/public/images/icons/favicon-traefik.ico b/public/images/icons/favicon-traefik.ico new file mode 100644 index 0000000..a45bfd1 Binary files /dev/null and b/public/images/icons/favicon-traefik.ico differ diff --git a/public/images/icons/websocket-svgrepo-com.svg b/public/images/icons/websocket-svgrepo-com.svg new file mode 100644 index 0000000..e49b7f0 --- /dev/null +++ b/public/images/icons/websocket-svgrepo-com.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index a5f7b0d..529fb22 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -11,7 +11,6 @@ export const Footer = () => { const { t } = useLanguage(); const { showBanner } = useCookieBanner(); const [showLegalNotice, setShowLegalNotice] = useState(false); - const [showCVPopup, setShowCVPopup] = useState(false); const reopenCookiePreferences = () => { // Simplement rouvrir la bannière sans recharger @@ -20,11 +19,20 @@ export const Footer = () => { const currentYear = new Date().getFullYear(); + const downloadCV = () => { + const link = document.createElement('a'); + link.href = '/cv.pdf'; + link.download = 'Alexandre_Pommier_CV.pdf'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const footerLinks = [ { icon: , label: t("footer.downloadCV"), - onClick: () => setShowCVPopup(true) + onClick: downloadCV }, { icon: , @@ -185,21 +193,6 @@ export const Footer = () => { isOpen={showLegalNotice} onClose={() => setShowLegalNotice(false)} /> - - {/* Popup CV en travaux */} - {showCVPopup && ( -
setShowCVPopup(false)}> -
e.stopPropagation()}> -

{t("footer.cvWorkInProgressTitle")}

-

- {t("footer.cvWorkInProgress")} -

- -
-
- )} ); }; \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 67df977..1a1dab4 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -100,9 +100,10 @@ export const Header = () => { animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.1 * i }} onClick={() => handleNavigation(item)} - className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors" + className="relative text-sm font-medium text-muted-foreground hover:text-foreground transition-colors group" > {t(`nav.${item}`)} + ))} @@ -179,9 +180,10 @@ export const Header = () => { exit={{ opacity: 0, x: -20 }} transition={{ delay: 0.1 * i }} onClick={() => handleNavigation(item)} - className="text-left text-base font-medium text-muted-foreground hover:text-foreground transition-colors py-2" + className="relative text-left text-base font-medium text-muted-foreground hover:text-foreground transition-colors py-2 group" > {t(`nav.${item}`)} + ))} diff --git a/src/components/ProjectCard.tsx b/src/components/ProjectCard.tsx index f770baa..b98adb3 100644 --- a/src/components/ProjectCard.tsx +++ b/src/components/ProjectCard.tsx @@ -71,7 +71,7 @@ export const ProjectCard = ({ title, description, icon, image, technologies, del {tech.name} ) : ( ? diff --git a/src/components/SkillBadge.tsx b/src/components/SkillBadge.tsx index a69a0b1..64b8805 100644 --- a/src/components/SkillBadge.tsx +++ b/src/components/SkillBadge.tsx @@ -23,7 +23,11 @@ export const SkillBadge = ({ name, icon, iconUrl, color = "default", delay = 0 } className="text-base py-2 px-4 font-medium hover:bg-primary hover:text-primary-foreground transition-colors" > {iconUrl ? ( - {`${name} + {`${name} ) : icon ? ( {icon} ) : null} diff --git a/src/data/projects.ts b/src/data/projects.ts index 2ea2d19..19b6963 100644 --- a/src/data/projects.ts +++ b/src/data/projects.ts @@ -62,12 +62,12 @@ export const projectsData: Record = { mainImage: "/images/projects/homemade_nas.webp", images: ["/images/projects/homemade_nas.webp"], technologies: [ - { name: "OpenMediaVault", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/debian/debian-original.svg" }, + { name: "OpenMediaVault", iconUrl: "/images/icons/favicon-omv.ico" }, { name: "Docker", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/docker/docker-original.svg" }, - { name: "Traefik", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/kubernetes/kubernetes-plain.svg" }, + { name: "Traefik", iconUrl: "/images/icons/favicon-traefik.ico" }, { name: "Linux", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/linux/linux-original.svg" }, - { name: "Home Assistant", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/python/python-original.svg" }, - { name: "Portainer", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/docker/docker-original.svg" }, + { name: "Home Assistant", iconUrl: "https://brands.home-assistant.io/homeassistant/icon.png" }, + { name: "Portainer", iconUrl: "https://avatars.githubusercontent.com/u/22225832" }, ], }, transcendence: { @@ -120,7 +120,7 @@ export const projectsData: Record = { { name: "TypeScript", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/typescript/typescript-original.svg" }, { name: "NestJS", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/nestjs/nestjs-original.svg" }, { name: "PostgreSQL", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/postgresql/postgresql-original.svg" }, - { name: "WebSocket", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/javascript/javascript-original.svg" }, + { name: "WebSocket", iconUrl: "/images/icons/websocket-svgrepo-com.svg" }, { name: "Docker", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/docker/docker-original.svg" }, ], }, @@ -276,7 +276,7 @@ export const projectsData: Record = { images: ["/images/projects/cub3d.webp"], technologies: [ { name: "C", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/c/c-original.svg" }, - { name: "MiniLibX", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/c/c-original.svg" }, + { name: "MiniLibX", iconUrl: "/images/icons/42_icon.png" }, { name: "Raycasting", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/cplusplus/cplusplus-original.svg" }, { name: "Make", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/cmake/cmake-original.svg" }, ], @@ -401,7 +401,7 @@ export const projectsData: Record = { { name: "React", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/react/react-original.svg" }, { name: "Node.js", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/nodejs/nodejs-original.svg" }, { name: "MongoDB", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/mongodb/mongodb-original.svg" }, - { name: "OpenAI", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/python/python-original.svg" }, + { name: "OpenAI", iconUrl: "https://avatars.githubusercontent.com/u/14957082" }, { name: "TypeScript", iconUrl: "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/typescript/typescript-original.svg" }, ], demoUrl: "https://avopieces.fr", diff --git a/src/utils/translations.ts b/src/utils/translations.ts index ad9cc70..cb3fe5b 100644 --- a/src/utils/translations.ts +++ b/src/utils/translations.ts @@ -8,7 +8,7 @@ export const translations = { }, hero: { title: "Alexandre Pommier", - subtitle: "Étudiant en informatique à l'école 42, je développe mes compétences techniques à travers des projets innovants et challengeants. Passionné par les technologies modernes, je m'intéresse particulièrement au développement web, aux systèmes et à l'infrastructure.", + subtitle: "Étudiant en informatique à l'école 42 et développeur freelance, je développe mes compétences techniques à travers des projets innovants et challengeants. Passionné par les technologies modernes, je m'intéresse particulièrement au développement web, aux systèmes et à l'infrastructure.", cta1: "Voir mes projets", cta2: "Me contacter", }, @@ -74,9 +74,6 @@ export const translations = { legalNotice: "Mentions légales", cookieManagement: "Gestion des cookies", downloadCV: "Télécharger mon CV", - cvWorkInProgressTitle: "CV en travaux", - cvWorkInProgress: "Mon CV est actuellement en cours de préparation. Il sera bientôt disponible !", - understood: "Compris", github: "GitHub", email: "Email", copyright: "Tous droits réservés.", @@ -113,7 +110,7 @@ export const translations = { }, hero: { title: "Alexandre Pommier", - subtitle: "Computer science student at 42 school, I develop my technical skills through innovative and challenging projects. Passionate about modern technologies, I am particularly interested in web development, systems and infrastructure.", + subtitle: "Computer science student at 42 school and freelance developer, I develop my technical skills through innovative and challenging projects. Passionate about modern technologies, I am particularly interested in web development, systems and infrastructure.", cta1: "View my projects", cta2: "Contact me", }, @@ -179,9 +176,6 @@ export const translations = { legalNotice: "Legal Notice", cookieManagement: "Cookie Management", downloadCV: "Download my CV", - cvWorkInProgressTitle: "CV Work in Progress", - cvWorkInProgress: "My CV is currently being prepared. It will be available soon!", - understood: "Understood", github: "GitHub", email: "Email", copyright: "All rights reserved.",