From e48a551dcbe2b30f73b6f5f42d4c0b59075ab9f1 Mon Sep 17 00:00:00 2001 From: Jalil Arfaoui Date: Sun, 22 Feb 2026 14:39:47 +0100 Subject: [PATCH] =?UTF-8?q?Refonte=20des=20pages=20hub=20/code=20en=20aper?= =?UTF-8?q?=C3=A7us=20de=20contenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remplace les NavigationCards génériques par des aperçus réels : 4 expériences récentes, 3 projets featured, 3 catégories de compétences et 3 recommandations, chacun avec lien "Voir tout". Supprime le composant NavigationCard devenu inutile. --- .../recommendations/matthieu-diouron.jpg | Bin 10432 -> 6196 bytes src/components/code/NavigationCard.astro | 23 ---- src/content/recommendations/antoine-wolff.md | 1 + src/content/recommendations/benoit-sarda.md | 2 +- src/pages/ar/برمجة/index.astro | 126 ++++++++++++------ src/pages/code/index.astro | 126 ++++++++++++------ src/pages/en/code/index.astro | 126 ++++++++++++------ 7 files changed, 260 insertions(+), 144 deletions(-) delete mode 100644 src/components/code/NavigationCard.astro diff --git a/src/assets/images/recommendations/matthieu-diouron.jpg b/src/assets/images/recommendations/matthieu-diouron.jpg index f55fcefc475e554debc51cfeebf4b2488efeca92..b934cc626a20cf33a05651b8de79b2fa550ce93a 100644 GIT binary patch literal 6196 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 literal 10432 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 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' }); +} --- ({

-
- - - - +
+
+

Parcours

+ Voir tout → +
+
+ {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}`} -

+
+
+

Projets

+ Voir tous →
- )} +
+ {projects.map((project) => ( + + ))} +
+
{recommendationTexts.length > 0 && (
@@ -107,6 +134,25 @@ const recommendationTexts = recommendations.map((rec) => ({
)} +
+
+

Compétences

+ Voir toutes → +
+
+ {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' }); +} --- ({

-
- - - - +
+
+

Career

+ See all → +
+
+ {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

+ See all →
- )} +
+ {projects.map((project) => ( + + ))} +
+
{recommendationTexts.length > 0 && (
@@ -107,6 +134,25 @@ const recommendationTexts = recommendations.map((rec) => ({
)} +
+
+

Skills

+ See all → +
+
+ {topSkills.map((category) => ( +
+

{category.name[locale as keyof typeof category.name]}

+
+ {category.skills.map((skill) => ( + + ))} +
+
+ ))} +
+
+

Values & Approach