40 Commits

Author SHA1 Message Date
Giovanni 2ab10c7803 update fetch url to match new api prefix 2026-06-15 13:17:09 +02:00
Giovanni f5441f038c update fetch url to match new api prefix 2026-06-15 13:14:11 +02:00
Giovanni e92c4227d8 update fetch url to match new api prefix 2026-06-15 13:07:08 +02:00
Giovanni 6640136fd9 update fetch url to match new api prefix 2026-06-15 12:47:46 +02:00
Giovanni 285daa7d54 update fetch url to match new api prefix 2026-06-15 11:54:50 +02:00
Giovanni 56f475839d update fetch url to match new api prefix 2026-06-15 11:47:58 +02:00
Giovanni cc8d3c78cd update fetch url to match new api prefix 2026-06-15 11:46:00 +02:00
Giovanni 1b675fdd3e update fetch url to match new api prefix 2026-06-15 11:41:16 +02:00
Giovanni 37a113fbf6 update fetch url to match new api prefix 2026-06-15 11:39:30 +02:00
Giovanni 5401774e0e update fetch url to match new api prefix 2026-06-15 11:34:46 +02:00
Giovanni b142112ce0 update fetch url to match new api prefix 2026-06-15 11:28:56 +02:00
Giovanni 75d4f5d166 update fetch url to match new api prefix 2026-06-15 11:24:42 +02:00
Giovanni dfbe3123d5 Merge branch 'dev' 2026-04-23 15:53:05 +02:00
Giovanni a875e1dfb7 Merge branch 'refactor/componentsAndPages' into dev 2026-04-23 15:51:22 +02:00
Giovanni 83390d802a move all components that are exclusive to one page 2026-04-23 15:44:19 +02:00
Giovanni cab338c2b3 move all components that are exclusive to one page 2026-04-23 15:39:00 +02:00
Giovanni d34eb5714f move all components that are exclusive to one page 2026-04-23 15:37:39 +02:00
Giovanni-Josserand 41dc079844 Merge pull request 'dev' (#47) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#47
2025-11-06 19:56:58 +00:00
Giovanni-Josserand 6847f7d2c6 Merge pull request 'Remove of the old cv pdf' (#46) from review/cv into dev
Reviewed-on: Giovanni-Josserand/Portfolio#46
2025-11-06 19:56:43 +00:00
Giovanni d415d1ca38 Remove of the old cv pdf 2025-11-06 20:56:13 +01:00
Giovanni-Josserand 65060c6875 Merge pull request 'dev' (#45) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#45
2025-11-06 19:54:39 +00:00
Giovanni-Josserand 34869f0611 Merge pull request 'Update of the cv pdf' (#44) from review/cv into dev
Reviewed-on: Giovanni-Josserand/Portfolio#44
2025-11-06 19:54:24 +00:00
Giovanni a08689086c Update of the cv pdf 2025-11-06 20:54:02 +01:00
Giovanni-Josserand 1127a608bd Merge pull request 'Test to fix Qt image that doesn't display' (#43) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#43
2025-11-06 18:48:13 +00:00
Giovanni 45e78dd11c Test to fix Qt image that doesn't display 2025-11-06 19:47:53 +01:00
Giovanni-Josserand 1a26e0d2d8 Merge pull request 'dev' (#42) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#42
2025-11-06 18:45:06 +00:00
Giovanni 59538b6f17 Fix of overflow issue with because of the padding in .experience-card 2025-11-06 19:32:21 +01:00
Giovanni-Josserand fdc39d3928 Merge pull request 'Add of Qt image, remove of .png images and fix attribute not allowed on svg' (#41) from review/skillsSection into dev
Reviewed-on: Giovanni-Josserand/Portfolio#41
2025-11-06 18:22:21 +00:00
Giovanni 9f7592ace2 Add of Qt image, remove of .png images and fix attribute not allowed on svg 2025-11-06 19:21:25 +01:00
Giovanni-Josserand 743160af3c Merge pull request 'dev' (#40) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#40
2025-09-28 17:24:53 +00:00
Giovanni-Josserand 23233d4be6 Merge pull request 'feature/responsive' (#38) from feature/responsive into dev
Reviewed-on: Giovanni-Josserand/Portfolio#38
2025-09-28 17:24:22 +00:00
Giovanni-Josserand 9b17d23901 Merge pull request 'dev' (#35) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#35
2025-09-28 17:01:02 +00:00
Giovanni-Josserand c41760c313 Merge pull request 'dev' (#29) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#29
2025-09-14 16:20:37 +00:00
Giovanni-Josserand 540bf7efec Merge pull request 'add of the new images' (#27) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#27
2025-09-06 09:55:17 +00:00
Giovanni-Josserand fe2abff5e5 Merge pull request 'dev' (#26) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#26
2025-09-06 09:48:46 +00:00
Giovanni-Josserand 40d8c49908 Merge pull request 'test debug error 404' (#21) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#21
2025-08-31 19:36:31 +00:00
Giovanni-Josserand 3728385ebc Merge pull request 'dev' (#20) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#20
2025-08-31 16:29:50 +00:00
Giovanni-Josserand cc7c586d4a Merge pull request 'repair CV link' (#16) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#16
2025-08-28 19:34:59 +00:00
Giovanni-Josserand 1ec3121bc1 Merge pull request 'update of single project images URL' (#15) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#15
2025-08-28 13:58:25 +00:00
Giovanni-Josserand 9700ae889e Merge pull request 'dev' (#14) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#14
2025-08-28 13:35:44 +00:00
32 changed files with 63 additions and 161 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/public/assets/images/logo.svg" />
<link rel="icon" type="image/svg+xml" href="/assets/images/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com">
Binary file not shown.
Binary file not shown.
-14
View File
@@ -7,26 +7,12 @@
width="1822"
height="2051"
viewBox="0 0 1822 2051"
sodipodi:docname="C++.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="1822"

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 157 KiB

-14
View File
@@ -7,26 +7,12 @@
width="1200"
height="1200"
viewBox="0 0 1200 1200"
sodipodi:docname="CSS.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="1200"

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

-14
View File
@@ -7,26 +7,12 @@
width="2048"
height="2048"
viewBox="0 0 2048 2048"
sodipodi:docname="Git.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="2048"

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

-14
View File
@@ -7,26 +7,12 @@
width="169"
height="169"
viewBox="0 0 169 169"
sodipodi:docname="image-removebg-preview.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="169"

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

@@ -7,26 +7,12 @@
width="973"
height="973"
viewBox="0 0 973 973"
sodipodi:docname="JavaScript.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="973"

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

-14
View File
@@ -7,26 +7,12 @@
width="2560"
height="1381"
viewBox="0 0 2560 1381"
sodipodi:docname="PHP.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="2560"

Before

Width:  |  Height:  |  Size: 247 KiB

After

Width:  |  Height:  |  Size: 246 KiB

-14
View File
@@ -7,26 +7,12 @@
width="110"
height="110"
viewBox="0 0 110 110"
sodipodi:docname="Pyhton.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="110"

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 109 KiB

-14
View File
@@ -7,26 +7,12 @@
width="301"
height="299"
viewBox="0 0 301 299"
sodipodi:docname="SQL.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<image
width="301"

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 56 KiB

+4 -4
View File
@@ -1,8 +1,8 @@
import './App.css'
import { Routes, Route, Link } from 'react-router-dom';
import HomePage from './pages/HomePage.jsx';
import ProjectsPage from './pages/ProjectsPage';
import ProjectDetailsPage from "./pages/ProjectDetailsPage.jsx";
import { Routes, Route } from 'react-router-dom';
import HomePage from './pages/Home/HomePage.jsx';
import ProjectsPage from './pages/Projects/ProjectsPage.jsx';
import ProjectDetailsPage from "./pages/ProjectDetails/ProjectDetailsPage.jsx";
function App() {
+4 -4
View File
@@ -3,7 +3,7 @@ import "./Projects.css"
import React, {useEffect, useState} from "react";
import {Link, useLocation} from "react-router-dom";
import NavBar from "../NavBar/NavBar.jsx";
import Filter from "../Filter/Filter.jsx";
import Filter from "../../pages/Projects/components/Filter/Filter.jsx";
function Projects() {
const [projects, setProjects] = useState([]);
@@ -20,12 +20,12 @@ function Projects() {
useEffect(() => {
const fetchProjects = async () => {
try {
const response = await fetch('/api/shortProjects/');
const response = await fetch('/api/projects/');
if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
const data = await response.json();
setProjects(data.data);
setProjects(data);
} catch (err) {
setError(err.message);
}
@@ -88,7 +88,7 @@ function Projects() {
}
if (filters.technology.length > 0) {
const isSkill = filters.technology.every(tech => project.skills.includes(tech));
const isSkill = filters.technology.every(tech => project.skills.some(skill => skill.name === tech));
if(!isSkill){
return false
}
@@ -45,8 +45,8 @@ function SingleProject({ image, title, description, skills, id, school, beginnin
<ul className="single-project-skills-list">
{skills.map((skill) => (
<li key={skill}>
<SkillCard text={skill} />
<li key={skill.id}>
<SkillCard text={skill.name} />
</li>
))}
</ul>
@@ -1,10 +1,10 @@
import {useEffect, useState} from 'react'; // 1. Import useEffect
import { useLocation } from 'react-router-dom'; // 2. Import useLocation
import Home from '../components/Home/Home.jsx';
import Experiences from '../components/Experiences/Experiences.jsx';
import Projects from '../components/Projects/Projects.jsx';
import Skills from '../components/Skills/Skills.jsx';
import Footer from '../components/Footer/Footer.jsx';
import {useEffect} from 'react';
import { useLocation } from 'react-router-dom';
import Home from './components/Home/Home.jsx';
import Experiences from './components/Experiences/Experiences.jsx';
import Projects from '../../components/Projects/Projects.jsx';
import Skills from './components/Skills/Skills.jsx';
import Footer from '../../components/Footer/Footer.jsx';
function HomePage() {
const location = useLocation();
@@ -4,30 +4,22 @@ import React, {useEffect, useState} from "react";
function Experiences() {
const [experiences, setExperiences] = useState([]);
const [experienceTasks, setExperienceTasks] = useState([]);
const [error, setError] = useState(null);
useEffect(() => {
const fetchExperiencesAndTasks = async () => {
const fetchExperiences = async () => {
try {
let response = await fetch('/api/experiences/');
if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
let data = await response.json();
setExperiences(data.data);
response = await fetch('/api/experienceTasks/');
if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
data = await response.json();
setExperienceTasks(data.data);
setExperiences(data);
} catch (err) {
setError(err.message);
}
};
fetchExperiencesAndTasks();
fetchExperiences();
}, []);
if (error) {
@@ -39,7 +31,7 @@ function Experiences() {
<h1 className="section-title">Experiences</h1>
<div className="experiences-container">
{experiences.map((exp) => (
<SingleExperience experience={exp} tasks={experienceTasks.filter(task => task.experience_id === exp.id)}/>
<SingleExperience experience={exp}/>
))}
</div>
</section>
@@ -1,6 +1,6 @@
import './Home.css';
import Background from "../thirdParty/Background/Background.jsx";
import NavBar from "../NavBar/NavBar.jsx";
import Background from "../../../../components/thirdParty/Background/Background.jsx";
import NavBar from "../../../../components/NavBar/NavBar.jsx";
function Home() {
return (
@@ -13,7 +13,7 @@ function Home() {
Passionate about development, I am currently looking
for an opportunity to put my skills into practice and continue learning.
</p>
<a href="/assets/documents/CV.pdf" target="_blank" className="btn">Download my CV</a>
<a href="/assets/documents/josserand_giovanni_cv.pdf" target="_blank" className="btn">See my CV</a>
</section>
);
@@ -1,8 +1,8 @@
.experience-card {
position: relative;
width: 100%;
width: 90%;
margin-bottom: 3rem;
padding: 1.5rem;
padding: 1.5em;
display: flex;
gap: 6rem;
justify-content: center;
@@ -1,6 +1,6 @@
import './SingleExperience.css';
function SingleExperience({ experience, tasks }) {
function SingleExperience({ experience }) {
return (
<div className="experience-card">
<div className="experience-card-left">
@@ -11,7 +11,7 @@ function SingleExperience({ experience, tasks }) {
<div className="experience-card-right">
<h3 className="experience-role">{experience.role}</h3>
<ul className="experience-tasks">
{tasks.map((task) => (
{experience.tasks.map((task) => (
<li>{task.description}</li>
))}
</ul>
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import SkillCard from "../SkillCard/SkillCard.jsx";
import SkillCard from "../../../../components/SkillCard/SkillCard.jsx";
import "./Skills.css";
function Skills() {
@@ -14,7 +14,7 @@ function Skills() {
throw new Error(`Erreur HTTP: ${response.status}`);
}
const data = await response.json();
setSkills(data.data);
setSkills(data);
} catch (err) {
setError(err.message);
}
@@ -1,8 +1,7 @@
import { useParams } from "react-router-dom";
import React, { useEffect, useState } from "react";
import NavBar from "../components/NavBar/NavBar.jsx";
import ProjectDetails from "../components/ProjectDetails/ProjectDetails.jsx";
import Footer from "../components/Footer/Footer.jsx";
import ProjectDetails from "./components/ProjectDetails/ProjectDetails.jsx";
import Footer from "../../components/Footer/Footer.jsx";
function ProjectDetailsPage() {
const { id } = useParams();
@@ -12,7 +11,7 @@ function ProjectDetailsPage() {
useEffect(() => {
const fetchProject = async () => {
try {
const response = await fetch(`/api/longProjects/${id}`);
const response = await fetch(`/api/projects/${id}`);
if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
@@ -1,7 +1,7 @@
import "./ProjectDetails.css"
import SkillCard from "../SkillCard/SkillCard.jsx";
import SkillCard from "../../../../components/SkillCard/SkillCard.jsx";
import React, {useEffect, useState} from "react";
import NavBar from "../NavBar/NavBar.jsx";
import NavBar from "../../../../components/NavBar/NavBar.jsx";
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import {useNavigate} from "react-router-dom";
@@ -73,7 +73,7 @@ function ProjectDetails({project}) {
<ul>
{project.skills && project.skills.map((skill) => (
<li>
<SkillCard text={skill} />
<SkillCard text={skill.name} />
</li>
))}
</ul>
@@ -1,5 +1,5 @@
import Projects from "../components/Projects/Projects.jsx";
import Footer from "../components/Footer/Footer.jsx";
import Projects from "../../components/Projects/Projects.jsx";
import Footer from "../../components/Footer/Footer.jsx";
function ProjectsPage() {
return (
@@ -73,7 +73,7 @@ function Filter({ filters, setFilters }) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
const data = await response.json();
setSkills(data.data);
setSkills(data);
} catch (err) {
setError(err.message);
}