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

-
- - - - +
+
+

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