Skip to content

Commit

Permalink
feat: website done
Browse files Browse the repository at this point in the history
  • Loading branch information
DonLulu committed Jan 19, 2025
1 parent 782559a commit 5f4e6f1
Show file tree
Hide file tree
Showing 32 changed files with 1,161 additions and 75 deletions.
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Personal Portfolio 2025

Welcome to my personal portfolio website! This project showcases my skills, projects, and experiences as a web developer.

## Table of Contents

- [About](#about)
- [Technologies](#technologies)
- [Contact](#contact)

## About

This portfolio is designed to highlight my work and provide potential employers or clients with an overview of my capabilities. It includes sections for my bio, projects, and contact information.

## Technologies

This project is built using the following technologies and libraries:

- HTML5
- CSS3
- JavaScript
- Lenis (https://github.com/darkroomengineering/lenis)

## Contact

Feel free to reach out to me via email at [[email protected]](mailto:[email protected]) or connect with me on [LinkedIn](https://www.linkedin.com/in/cizeron-lucas/').

Thank you for visiting my portfolio!
Binary file removed public/fonts/CSCalebMono-Regular.otf
Binary file not shown.
Binary file removed public/fonts/CSMaisy-Regular.otf
Binary file not shown.
Binary file removed public/fonts/What-a-bloat_Bold.otf
Binary file not shown.
Binary file added public/media/BPCE-IT.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/media/GENEVA.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/media/US.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/media/barcode_sticker.png
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/media/diagrams/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/media/diagrams/22.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/media/diagrams/40.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/media/diagrams/43.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/media/diagrams/60.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/media/scanned_paper_texture.png
Binary file not shown.
Empty file removed src/404.html
Empty file.
369 changes: 355 additions & 14 deletions src/index.html

Large diffs are not rendered by default.

129 changes: 105 additions & 24 deletions src/js/javascript_i18n.js
Original file line number Diff line number Diff line change
@@ -1,34 +1,115 @@
function switchLanguage(lang) {
console.log('Switching to language:', lang);
document.documentElement.lang = lang;
const elements = document.querySelectorAll('[data-i18n]');
elements.forEach(element => {
element.textContent = translations[lang][element.getAttribute('data-i18n')];
});
}

const translations = {
en: {
welcome: "Welcome to my portfolio",
about: "About Me",
contact: "Contact",
languageSwitch: "FR",
epitaStudent: "Epita student",
},
fr: {
welcome: "Bienvenue sur mon portfolio",
about: "À propos de moi",
contact: "Contact",
languageSwitch: "EN",
epitaStudent: "Etudiant à epita",
}
};
const translations = {
en: {
welcome: "Welcome to my portfolio",
contact: "Contact",
languageSwitch: "FR",
epitaStudent: "Epita student",
about_me_title_1: "About Me",
about_me_1: "Currently a 4th-year student at EPITA, specializing in the SIGL major (Système d’Information et Génie Logiciel). Passionate about technology and problem-solving, I am acquiring the tools to transform innovative ideas into reliable and scalable IT solutions.",
about_me_title_2: "What Is SIGL?",
about_me_2: "SIGL is a major at EPITA that <i>prepares to assist businesses in transitioning to a new, scalable IT framework aligned with business needs. The topics covered include leadership and management, cloud and architecture, mobility and applications, as well as digitalization and transformation.</i>",
about_me_title_3: "Why This Portfolio?",
about_me_3: "I spend my time working on various personal projects, hence this portfolio. I have always had a keen interest in designing and developing websites since I started studying computer science, and this portfolio reflects my journey in honing that skill.",
status: "Status:",
status_done: "Done",
status_wip: "In progress",
_42sh: "42SH is a shell project that I made during my third year at EPITA. It is a reproduction of a UNIX shell that can execute commands, manage environment variables, and handle signals all while conforming to the POSIX standard.",
gymrat: "Development of a fitness mobile application in Flutter and Dart, it allows to keep track of fitness objectives and performances. Chatgpt 4.0 queries also allow the detection of macros by taking a picture of the dish for macros monitoring. The backend part is integrated in SQL and hosted with Firebase. I plan to deploy it on App and Play store once finished.",
ping: "Reproduction of the front-end & back-end of an IDE including client constraints to emulate client collaboration. Supports multiple languages auto-completion and syntax highlighting as well as all maven & git functionnalities. Deployed using electron.",
ocr: "Optical character recognition software capable of detecting a sudoku grid as well as the numbers it contains to automatically solve it. The project was programmed from scratch in C without using any library.",
tiger: "Implementation of a C++ compiler for the Tiger language, using tools such as Bison and Flex.",
portfolio: "This portfolio was created using HTML, CSS, and JavaScript. It is hosted on GitHub Pages and the source code is available on my GitHub repository. It has been redone many times as my skills improved, until its latest iteration that you see now.",
bpce: "6-month internship at BPCE-IT's FabLab, an innovation team responsible for studying the feasibility of innovative projects, developing them, and deploying them. The work is done following the Agile methodology and DevOps culture. During these 6 months, I was able to participate in the development and deployment of 4 internal projects.",
csumb: "I had the opportunity to study abroad at the California State University - Monterey Bay. It was during this semester that I started web development. Besides the academic aspect, I was able to discover the American culture and travel throughout the country.",
footer_text: "Sincerely,",
footer_text_2: "Lucas."
},
fr: {
welcome: "Bienvenue sur mon portfolio",
contact: "Contact",
languageSwitch: "EN",
epitaStudent: "Etudiant à epita",
about_me_title_1: "Présentation",
about_me_1: "Actuellement étudiant en 4ème année à l'EPITA, me spécialisant dans la majeure SIGL (Système d’Information et Génie Logiciel). Passionné par la technologie et la résolution de problèmes, je construis une carrière à l'intersection des Systèmes d'Information et du Génie Logiciel. Grâce à ce programme, j'acquiers les outils pour transformer des idées innovantes en solutions informatiques fiables et évolutives.",
about_me_title_2: "Qu'est-ce que SIGL?",
about_me_2: "SIGL est une majeure à l'EPITA qui \"<i>prépare à aider les entreprises à passer à un nouveau cadre informatique évolutif aligné sur les besoins de l'entreprise. Les sujets abordés incluent le leadership et la gestion, le cloud et l'architecture, la mobilité et les applications, ainsi que la numérisation et la transformation</i>\".",
about_me_title_3: "Pourquoi ce portfolio?",
about_me_3: "Lorsque je ne suis pas en train d'étudier à l'EPITA, je consacre mon temps à travailler sur divers projets personnels, d'où ce portfolio. J'ai toujours eu un certain intérêt pour la conception et le développement de sites web depuis que j'ai commencé à programmer, ce portfolio reflète mon parcours concernant cette compétence.",
status: "Statut:",
status_done: "Terminé",
status_wip: "En cours",
_42sh: "42SH est un projet de shell que j'ai réalisé lors de ma troisième année à l'EPITA. C'est une reproduction d'un shell UNIX qui peut exécuter des commandes, gérer des variables d'environnement et gérer des signaux tout en respectant la norme POSIX.",
gymrat: "Développement d'une application mobile de fitness en Flutter et Dart, elle permet de suivre les objectifs et performances de fitness. Les requêtes Chatgpt 4.0 permettent également la détection des macros en prenant une photo du plat pour le suivi des macros. La partie backend est intégrée en SQL et hébergée avec Firebase. Je prévois de le déployer sur App et Play store une fois terminé.",
ping: "Reproduction du front-end & back-end d'un IDE incluant des contraintes pour émuler la collaboration client. Permet la complétion automatique en plusieurs langages et la coloration syntaxique ainsi que les fonctionnalités maven & git. Déployé avec electron.",
ocr: "Logiciel de reconnaissance optique de caractères capable de détecter une grille de sudoku ainsi que les chiffres qu'elle contient pour la résoudre automatiquement. Codé à partir de zéro en C sans utiliser de librairies.",
tiger: "Implémentation d'un compilateur C++ pour le langage Tiger, en utilisant des outils tels que Bison et Flex.",
portfolio: "Ce portfolio a été créé en utilisant HTML, CSS, et JavaScript. Il est hébergé sur GitHub Pages et le code source est disponible sur mon dépôt. Il a été refait de nombreuses fois au fur et à mesure que mes compétences s'amélioraient, jusqu'à sa dernière itération que vous voyez maintenant.",
bpce: "Stage de 6 mois au sein du FabLab de BPCE-IT, une équipe d'innovation chargée d'étudier la faisabilité de projets innovants, de les développer puis de les déployer. Le travail s'effectue en suivant la méthodologie Agile et la culture DevOps. Durant ces 6 mois, j'ai pu participer au dévelopement et déploiement de 4 projets internes.",
csumb:"J'ai eu la chance d'effectuer un semestre à l'international au sein de la California State University - Monterey Bay. C'est lors de ce semestre que j'ai commencé le développement web. Hormis l'aspect académique, j'ai surtout pu découvrir la culture américaine et voyager à travers le pays.",
geneva: "GENÈVE",
geneva_description: "J'ai développé durant 3 mois un jeu vidéo à but éducatif pour le compte d'un cabinet orthophonique genevois. Le dévelopement s'est fait en C# et se basait sur Unity pour le rendu. Le jeu permettait aux enfants de travailler leur orthographe en explorant un environnement 2D.",
footer_text: "Cordialement,",
footer_text_2: "Lucas."
}
};

// -------- Variables and constants --------
const fadeInElements = document.querySelectorAll('.fade-in');

// --------Screen update wave animation--------
const wave1 = document.createElement('div');
wave1.classList.add('wave', 'wave1');
const wave2 = document.createElement('div');
wave2.classList.add('wave', 'wave2');
const wave3 = document.createElement('div');
wave3.classList.add('wave', 'wave3');

document.body.appendChild(wave1);
document.body.appendChild(wave2);
document.body.appendChild(wave3);

setTimeout(() => {
wave1.remove();
wave2.remove();
wave3.remove();
}, 1000);

// --------Language switch while waves play--------
setTimeout(() => {
document.documentElement.lang = lang;
const elements = document.querySelectorAll('[data-i18n]');
elements.forEach(element => {
element.innerHTML = translations[lang][element.getAttribute('data-i18n')];
});
// --------Fade in animation--------
fadeInElements.forEach(element => {
element.classList.add('fade-in-up');
});
}, 200);

// --------Fade-in element stays visible after animation is done--------
setTimeout(() => {
fadeInElements.forEach(element => {
element.style.opacity = 1;
});
}, 1200);

}

// --------Main function--------
document.addEventListener('DOMContentLoaded', () => {
switchLanguage('fr'); // Default language
switchLanguage('fr');
let currentLanguage = 'FR';
const languageSwitch = document.getElementById('language-switch');
languageSwitch.addEventListener('click', () => {
const fadeInElements = document.querySelectorAll('.fade-in');
setTimeout(() => {
fadeInElements.forEach(element => {
element.style.opacity = 1;
});
}, 1200);
if (currentLanguage === 'FR') {
currentLanguage = 'EN';
switchLanguage('en');
Expand Down
49 changes: 45 additions & 4 deletions src/js/javascript_main.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
document.addEventListener('DOMContentLoaded', () => {

// Create the blob element
const blob = document.createElement('div');
blob.classList.add('blob');
document.body.appendChild(blob);

let mouseX = 0, mouseY = 0;
let blobX = 0, blobY = 0;
const speed = 0.78; // Adjust the speed for latency effect
const speed = 0.78;
let isHovering = false;

// Update the mouse position on mouse move
Expand All @@ -32,7 +33,7 @@ document.addEventListener('DOMContentLoaded', () => {

animateBlob();

// Handle size transition on hover over clickable elements
// Handle size transition of blob on hover over clickable elements
const clickableElements = document.querySelectorAll('a, button, .clickable');
clickableElements.forEach(element => {
element.addEventListener('mouseenter', () => {
Expand All @@ -47,9 +48,49 @@ document.addEventListener('DOMContentLoaded', () => {
});
element.addEventListener('mouseleave', () => {
isHovering = false;
blob.style.width = '30px'; // Revert to initial small size
blob.style.height = '30px'; // Revert to initial small size
blob.style.width = '30px';
blob.style.height = '30px';
blob.classList.remove('transition');
});
});

// Scroll fade-in functionality
const scrollFadeInElements = document.querySelectorAll('.scroll-fade-in');

const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
observer.unobserve(entry.target);
}
});
}, { threshold: 0.1 });

scrollFadeInElements.forEach(element => {
observer.observe(element);
});

// NAVBAR change on scroll
const containerFluid = document.querySelector('.container-fluid');
window.addEventListener('scroll', () => {
if (window.scrollY > 500) {
containerFluid.classList.add('scrolled');
} else {
containerFluid.classList.remove('scrolled');
}
});
});

document.addEventListener("scroll", function () {
var pageTop = window.scrollY;
var pageBottom = pageTop + window.innerHeight;
var tags = document.querySelectorAll(".scroll-fade-in");

tags.forEach(function (tag) {
if (tag.getBoundingClientRect().top + pageTop < pageBottom) {
tag.classList.add("visible");
} else {
tag.classList.remove("visible");
}
});
});
4 changes: 2 additions & 2 deletions src/js/javascript_mouse_effect.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ document.addEventListener('DOMContentLoaded', () => {
});
element.addEventListener('mouseleave', () => {
isHovering = false;
blob.style.width = '30px'; // Revert to initial small size
blob.style.height = '30px'; // Revert to initial small size
blob.style.width = '30px';
blob.style.height = '30px';
blob.classList.remove('transition');
});
});
Expand Down
42 changes: 42 additions & 0 deletions src/js/javascript_smooth_scroll.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const lenis = new Lenis({
duration: 1.2,
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t))
});

function raf(time) {
lenis.raf(time);
ScrollTrigger.update();
requestAnimationFrame(raf);
}

requestAnimationFrame(raf);

const section_1 = document.getElementById("vertical");
const col_left = document.querySelector(".col_left");
const timeln = gsap.timeline({ paused: true });

timeln.fromTo(col_left, {y: 0}, {y: '40vh', duration: 1, ease: 'none'}, 0);

const scroll_1 = ScrollTrigger.create({
animation: timeln,
trigger: section_1,
start: 'top top',
end: 'bottom center',
scrub: 1
});

const section_2 = document.getElementById("horizontal");
const horizontalstop = document.getElementById("horizontalstop");
let box_items = gsap.utils.toArray(".horizontal__item");

gsap.to(box_items, {
xPercent: -100 * (box_items.length - 1),
ease: "sine.out",
scrollTrigger: {
trigger: horizontalstop,
pin: true,
scrub: 3,
snap: 1 / (box_items.length - 1),
end: "+=" + section_2.offsetWidth
}
});
4 changes: 2 additions & 2 deletions src/js/javascript_text_effect.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ document.addEventListener('DOMContentLoaded', () => {
letters.forEach((letter) => {
const span = document.createElement('span');
span.textContent = letter;
span.style.transition = 'color 0.5s ease'; // Add transition for smooth color change
span.style.transition = 'color 0.5s ease';
element.appendChild(span);
});

Expand All @@ -22,7 +22,7 @@ document.addEventListener('DOMContentLoaded', () => {
span.style.color = color;

// Schedule the next color change
const randomDelay = Math.random() * (1000 - 200) + 200; // Random delay between 0.2s and 1s
const randomDelay = Math.random() * (1000 - 200) + 200;
setTimeout(() => changeColor(span), randomDelay);
}

Expand Down
Loading

0 comments on commit 5f4e6f1

Please sign in to comment.