diff --git a/src/assets/images/recommendations/matthieu-diouron.jpg b/src/assets/images/recommendations/matthieu-diouron.jpg
index f55fcef..b934cc6 100644
Binary files a/src/assets/images/recommendations/matthieu-diouron.jpg and b/src/assets/images/recommendations/matthieu-diouron.jpg differ
diff --git a/src/components/code/NavigationCard.astro b/src/components/code/NavigationCard.astro
deleted file mode 100644
index 2108cee..0000000
--- a/src/components/code/NavigationCard.astro
+++ /dev/null
@@ -1,23 +0,0 @@
----
-interface Props {
- title: string;
- description: string;
- href: string;
- icon: string;
-}
-
-const { title, description, href, icon } = Astro.props;
----
-
-
- {icon}
-
- {title}
-
-
- {description}
-
-
diff --git a/src/content/recommendations/antoine-wolff.md b/src/content/recommendations/antoine-wolff.md
index dbd2487..6a0dcf1 100644
--- a/src/content/recommendations/antoine-wolff.md
+++ b/src/content/recommendations/antoine-wolff.md
@@ -2,6 +2,7 @@
author: "Antoine Wolff"
authorRole: "Développeur, graphiste et chef de projet"
company: "LeCollectif"
+avatar: antoine-wolff.png
url: https://www.linkedin.com/in/wolffantoine
date: 2020-12-07
lang: "fr"
diff --git a/src/content/recommendations/benoit-sarda.md b/src/content/recommendations/benoit-sarda.md
index 73d9f00..15deee6 100644
--- a/src/content/recommendations/benoit-sarda.md
+++ b/src/content/recommendations/benoit-sarda.md
@@ -1,6 +1,6 @@
---
author: "Benoit Sarda"
-authorRole: "Sr Solution Architect, Manuf"
+authorRole: "Sr Solution Architect"
company: "Amazon Web Services (AWS)"
avatar: benoit-sarda.jpg
url: https://www.linkedin.com/in/benoitsarda
diff --git a/src/pages/ar/برمجة/index.astro b/src/pages/ar/برمجة/index.astro
index 0966fde..7672ca3 100644
--- a/src/pages/ar/برمجة/index.astro
+++ b/src/pages/ar/برمجة/index.astro
@@ -3,9 +3,11 @@ import { getCollection } from "astro:content";
import { Image } from "astro:assets";
import Layout from "../../../layouts/main.astro";
import Link from "../../../components/Link.astro";
-import NavigationCard from "../../../components/code/NavigationCard.astro";
import FeaturedRecommendation from "../../../components/code/FeaturedRecommendation.astro";
+import ProjectCard from "../../../components/code/ProjectCard.astro";
+import SkillBadge from "../../../components/code/SkillBadge.astro";
import logoTiqa from "../../../assets/images/logo-tiqa-blanc.png";
+import skillsData from "../../../data/skills.json";
const locale = "ar";
@@ -13,7 +15,15 @@ const experiences = (await getCollection("experiences"))
.filter((e) => e.data.lang === locale && !e.data.draft)
.sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1));
-const currentPosition = experiences.find((e) => !e.data.endDate);
+const recentExperiences = experiences.slice(0, 4);
+
+const projects = (await getCollection("projects"))
+ .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev")
+ .sort((a, b) => {
+ if (a.data.featured !== b.data.featured) return a.data.featured ? -1 : 1;
+ return b.data.date.getTime() - a.data.date.getTime();
+ })
+ .slice(0, 3);
const recommendations = (await getCollection("recommendations"))
.sort((a, b) => b.data.date.getTime() - a.data.date.getTime())
@@ -23,6 +33,14 @@ const recommendationTexts = recommendations.map((rec) => ({
...rec,
text: rec.body || '',
}));
+
+const topSkills = skillsData.categories.slice(0, 3);
+
+function formatMonth(dateStr: string) {
+ const [year, month] = dateStr.split('-');
+ return new Date(parseInt(year), parseInt(month) - 1)
+ .toLocaleDateString('ar-SA', { year: 'numeric', month: 'short' });
+}
---
({
-
-
-
-
-
+
+
+
+ {recentExperiences.map((exp) => {
+ const isOngoing = !exp.data.endDate;
+ const start = formatMonth(exp.data.startDate);
+ const end = exp.data.endDate ? formatMonth(exp.data.endDate) : 'الحالي';
+ return (
+
+
+
+
{exp.data.role}
+
+ {exp.data.companyUrl ? (
+ {exp.data.company}
+ ) : exp.data.company}
+ {exp.data.location && ` · ${exp.data.location}`}
+
+
+
+ {start} — {end}
+
+
+
+ );
+ })}
+
- {currentPosition && (
-
-
المنصب الحالي
-
{currentPosition.data.role}
-
- {currentPosition.data.companyUrl ? (
- {currentPosition.data.company}
- ) : (
- currentPosition.data.company
- )}
- {currentPosition.data.location && ` · ${currentPosition.data.location}`}
-
+
+
- )}
+
+ {projects.map((project) => (
+
+ ))}
+
+
{recommendationTexts.length > 0 && (
@@ -107,6 +134,25 @@ const recommendationTexts = recommendations.map((rec) => ({
)}
+
+
+
+ {topSkills.map((category) => (
+
+
{category.name[locale as keyof typeof category.name]}
+
+ {category.skills.map((skill) => (
+
+ ))}
+
+
+ ))}
+
+
+
القيم والمنهج
diff --git a/src/pages/code/index.astro b/src/pages/code/index.astro
index 389eebb..1f20374 100644
--- a/src/pages/code/index.astro
+++ b/src/pages/code/index.astro
@@ -3,9 +3,11 @@ import { getCollection } from "astro:content";
import { Image } from "astro:assets";
import Layout from "../../layouts/main.astro";
import Link from "../../components/Link.astro";
-import NavigationCard from "../../components/code/NavigationCard.astro";
import FeaturedRecommendation from "../../components/code/FeaturedRecommendation.astro";
+import ProjectCard from "../../components/code/ProjectCard.astro";
+import SkillBadge from "../../components/code/SkillBadge.astro";
import logoTiqa from "../../assets/images/logo-tiqa-blanc.png";
+import skillsData from "../../data/skills.json";
const locale = "fr";
@@ -13,7 +15,15 @@ const experiences = (await getCollection("experiences"))
.filter((e) => e.data.lang === locale && !e.data.draft)
.sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1));
-const currentPosition = experiences.find((e) => !e.data.endDate);
+const recentExperiences = experiences.slice(0, 4);
+
+const projects = (await getCollection("projects"))
+ .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev")
+ .sort((a, b) => {
+ if (a.data.featured !== b.data.featured) return a.data.featured ? -1 : 1;
+ return b.data.date.getTime() - a.data.date.getTime();
+ })
+ .slice(0, 3);
const recommendations = (await getCollection("recommendations"))
.sort((a, b) => b.data.date.getTime() - a.data.date.getTime())
@@ -23,6 +33,14 @@ const recommendationTexts = recommendations.map((rec) => ({
...rec,
text: rec.body || '',
}));
+
+const topSkills = skillsData.categories.slice(0, 3);
+
+function formatMonth(dateStr: string) {
+ const [year, month] = dateStr.split('-');
+ return new Date(parseInt(year), parseInt(month) - 1)
+ .toLocaleDateString('fr-FR', { year: 'numeric', month: 'short' });
+}
---
({
-
-
-
-
-
+
+
+
+ {recentExperiences.map((exp) => {
+ const isOngoing = !exp.data.endDate;
+ const start = formatMonth(exp.data.startDate);
+ const end = exp.data.endDate ? formatMonth(exp.data.endDate) : 'Présent';
+ return (
+
+
+
+
{exp.data.role}
+
+ {exp.data.companyUrl ? (
+ {exp.data.company}
+ ) : exp.data.company}
+ {exp.data.location && ` · ${exp.data.location}`}
+
+
+
+ {start} — {end}
+
+
+
+ );
+ })}
+
- {currentPosition && (
-
-
Poste actuel
-
{currentPosition.data.role}
-
- {currentPosition.data.companyUrl ? (
- {currentPosition.data.company}
- ) : (
- currentPosition.data.company
- )}
- {currentPosition.data.location && ` · ${currentPosition.data.location}`}
-
+
+
- )}
+
+ {projects.map((project) => (
+
+ ))}
+
+
{recommendationTexts.length > 0 && (
@@ -107,6 +134,25 @@ const recommendationTexts = recommendations.map((rec) => ({
)}
+
+
+
+ {topSkills.map((category) => (
+
+
{category.name[locale as keyof typeof category.name]}
+
+ {category.skills.map((skill) => (
+
+ ))}
+
+
+ ))}
+
+
+
Valeurs & Approche
diff --git a/src/pages/en/code/index.astro b/src/pages/en/code/index.astro
index a361626..d7198bf 100644
--- a/src/pages/en/code/index.astro
+++ b/src/pages/en/code/index.astro
@@ -3,9 +3,11 @@ import { getCollection } from "astro:content";
import { Image } from "astro:assets";
import Layout from "../../../layouts/main.astro";
import Link from "../../../components/Link.astro";
-import NavigationCard from "../../../components/code/NavigationCard.astro";
import FeaturedRecommendation from "../../../components/code/FeaturedRecommendation.astro";
+import ProjectCard from "../../../components/code/ProjectCard.astro";
+import SkillBadge from "../../../components/code/SkillBadge.astro";
import logoTiqa from "../../../assets/images/logo-tiqa-blanc.png";
+import skillsData from "../../../data/skills.json";
const locale = "en";
@@ -13,7 +15,15 @@ const experiences = (await getCollection("experiences"))
.filter((e) => e.data.lang === locale && !e.data.draft)
.sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1));
-const currentPosition = experiences.find((e) => !e.data.endDate);
+const recentExperiences = experiences.slice(0, 4);
+
+const projects = (await getCollection("projects"))
+ .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev")
+ .sort((a, b) => {
+ if (a.data.featured !== b.data.featured) return a.data.featured ? -1 : 1;
+ return b.data.date.getTime() - a.data.date.getTime();
+ })
+ .slice(0, 3);
const recommendations = (await getCollection("recommendations"))
.sort((a, b) => b.data.date.getTime() - a.data.date.getTime())
@@ -23,6 +33,14 @@ const recommendationTexts = recommendations.map((rec) => ({
...rec,
text: rec.body || '',
}));
+
+const topSkills = skillsData.categories.slice(0, 3);
+
+function formatMonth(dateStr: string) {
+ const [year, month] = dateStr.split('-');
+ return new Date(parseInt(year), parseInt(month) - 1)
+ .toLocaleDateString('en-US', { year: 'numeric', month: 'short' });
+}
---
({
-
-
-
-
-
+
+
+
+ {recentExperiences.map((exp) => {
+ const isOngoing = !exp.data.endDate;
+ const start = formatMonth(exp.data.startDate);
+ const end = exp.data.endDate ? formatMonth(exp.data.endDate) : 'Present';
+ return (
+
+
+
+
{exp.data.role}
+
+ {exp.data.companyUrl ? (
+ {exp.data.company}
+ ) : exp.data.company}
+ {exp.data.location && ` · ${exp.data.location}`}
+
+
+
+ {start} — {end}
+
+
+
+ );
+ })}
+
- {currentPosition && (
-
-
Current position
-
{currentPosition.data.role}
-
- {currentPosition.data.companyUrl ? (
- {currentPosition.data.company}
- ) : (
- currentPosition.data.company
- )}
- {currentPosition.data.location && ` · ${currentPosition.data.location}`}
-
+
+
- )}
+
+ {projects.map((project) => (
+
+ ))}
+
+
{recommendationTexts.length > 0 && (
@@ -107,6 +134,25 @@ const recommendationTexts = recommendations.map((rec) => ({
)}
+
+
+
+ {topSkills.map((category) => (
+
+
{category.name[locale as keyof typeof category.name]}
+
+ {category.skills.map((skill) => (
+
+ ))}
+
+
+ ))}
+
+
+
Values & Approach