diff --git a/src/pages/ar/برمجة/index.astro b/src/pages/ar/برمجة/index.astro index 12ec4ee..dc22f4e 100644 --- a/src/pages/ar/برمجة/index.astro +++ b/src/pages/ar/برمجة/index.astro @@ -5,10 +5,14 @@ import Layout from "../../../layouts/main.astro"; import Link from "../../../components/Link.astro"; import FeaturedRecommendation from "../../../components/code/FeaturedRecommendation.astro"; import ProjectCard from "../../../components/code/ProjectCard.astro"; -import SkillBadge from "../../../components/code/SkillBadge.astro"; +import ValueItem from "../../../components/code/ValueItem.astro"; +import LinkedInIcon from "../../../components/icons/LinkedInIcon.astro"; +import MaltIcon from "../../../components/icons/MaltIcon.astro"; +import StackOverflowIcon from "../../../components/icons/StackOverflowIcon.astro"; +import GitHubIcon from "../../../components/icons/GitHubIcon.astro"; +import ForgejoIcon from "../../../components/icons/ForgejoIcon.astro"; import { getProjectBaseSlug, getProjectsBasePath } from "../../../utils/i18n"; import logoTiqa from "../../../assets/images/logo-tiqa-blanc.png"; -import skillsData from "../../../data/skills.json"; const locale = "ar"; const projectsBasePath = getProjectsBasePath(locale); @@ -17,7 +21,7 @@ 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 recentExperiences = experiences.slice(0, 4); +const recentExperiences = experiences.filter((e) => e.data.featured).slice(0, 4); const projects = (await getCollection("projects")) .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev" && p.data.featured) @@ -32,8 +36,6 @@ const recommendationTexts = recommendations.map((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) @@ -42,14 +44,16 @@ function formatMonth(dateStr: string) { --- -
-
-

حِرَفيّ البرمجيات

-
+
+
+ مطوّر مستقل · ألبي +

حِرَفيّ البرمجيات

+
+

TDD، Clean Code، Domain-Driven Design: هذه طريقتي في بناء البرمجيات. أرافق الفرق كمطوّر أول، أو قائد تقني، أو مدرب تقني. أدواتي: TypeScript/JavaScript، وكذلك PHP وElixir.

@@ -62,44 +66,56 @@ function formatMonth(dateStr: string) {
-
-
-

المسار

+
+
+

المسار

← عرض الكل
-
+
+
{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} - -
+
+
+ {isOngoing && ( +
+ )} + + {start} — {end} + +

{exp.data.role}

+

+ {exp.data.companyUrl ? ( + {exp.data.company} + ) : exp.data.company} + {exp.data.location && ` · ${exp.data.location}`} +

); })} +
-
-
-

المشاريع

+
+
+

المشاريع

← عرض الكل
-
+
{projects.map((project) => ( {recommendationTexts.length > 0 && ( -
-
-

التوصيات

+
+
+

التوصيات

← عرض الكل
-
+
{recommendationTexts.map((rec) => ( )} -
-
-

المهارات

- ← عرض الكل -
-
- {topSkills.map((category) => ( -
-

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

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

القيم والمنهج

-
-
    -
  • - - حركة Software Craftsmanship -
  • -
  • - - الفائدة الاجتماعية للمطوّر -
  • -
  • - - الفخر بالعمل، دون غرور -
  • -
  • - - منهج Domain Driven Design -
  • -
  • - - تنظيم أجايل: التكرار والتحسين المستمر -
  • +
    +

    القيم والمنهج

    +
      + حركة Software Craftsmanship + الفائدة الاجتماعية للمطوّر + الفخر بالعمل، دون غرور + منهج Domain Driven Design + تنظيم أجايل: التكرار والتحسين المستمر
    -

    المجتمع والتدريس

    -
    -

    +

    +

    المجتمع والتدريس

    +

    أنشّط مجتمع Software Crafters Albi منذ 2018. أستاذ هندسة البرمجيات في جامعة شامبوليون في ألبي منذ 2019.

    -

    على الإنترنت

    -
    - {[ - { label: 'LinkedIn', href: 'https://www.linkedin.com/in/jalil' }, - { label: 'Malt', href: 'https://www.malt.fr/profile/jalilarfaoui' }, - { label: 'Stack Overflow', href: 'https://stackexchange.com/users/54164/jalil' }, - { label: 'GitHub', href: 'https://github.com/JalilArfaoui' }, - { label: 'Framagit', href: 'https://framagit.org/jalil' }, - { label: 'Forge شخصية', href: 'https://forge.tiqa.fr' }, - ].map((link) => ( - - {link.label} - - - + -
    +
    شعار Tiqa -

    - SAS Tiqa
    +

    + SAS Tiqa
    12, rue Fabre d'Églantine — 81 000 Albi, France
    811 917 871 RCS Albi

    diff --git a/src/pages/code/index.astro b/src/pages/code/index.astro index 1ec75c6..ac46098 100644 --- a/src/pages/code/index.astro +++ b/src/pages/code/index.astro @@ -44,7 +44,7 @@ function formatMonth(dateStr: string) { --- diff --git a/src/pages/en/code/index.astro b/src/pages/en/code/index.astro index 4a8cc9d..eb8f1e7 100644 --- a/src/pages/en/code/index.astro +++ b/src/pages/en/code/index.astro @@ -5,10 +5,14 @@ import Layout from "../../../layouts/main.astro"; import Link from "../../../components/Link.astro"; import FeaturedRecommendation from "../../../components/code/FeaturedRecommendation.astro"; import ProjectCard from "../../../components/code/ProjectCard.astro"; -import SkillBadge from "../../../components/code/SkillBadge.astro"; +import ValueItem from "../../../components/code/ValueItem.astro"; +import LinkedInIcon from "../../../components/icons/LinkedInIcon.astro"; +import MaltIcon from "../../../components/icons/MaltIcon.astro"; +import StackOverflowIcon from "../../../components/icons/StackOverflowIcon.astro"; +import GitHubIcon from "../../../components/icons/GitHubIcon.astro"; +import ForgejoIcon from "../../../components/icons/ForgejoIcon.astro"; import { getProjectBaseSlug, getProjectsBasePath } from "../../../utils/i18n"; import logoTiqa from "../../../assets/images/logo-tiqa-blanc.png"; -import skillsData from "../../../data/skills.json"; const locale = "en"; const projectsBasePath = getProjectsBasePath(locale); @@ -17,7 +21,7 @@ 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 recentExperiences = experiences.slice(0, 4); +const recentExperiences = experiences.filter((e) => e.data.featured).slice(0, 4); const projects = (await getCollection("projects")) .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev" && p.data.featured) @@ -32,8 +36,6 @@ const recommendationTexts = recommendations.map((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) @@ -42,14 +44,16 @@ function formatMonth(dateStr: string) { --- -
    -
    -

    Software Craftsman

    -
    +
    +
    + Freelance developer · Albi +

    Software Craftsman

    +
    +

    TDD, Clean Code, Domain-Driven Design: that's how I build software. I work with teams as a senior developer, tech lead or technical coach. My stack: TypeScript/JavaScript, but also PHP and Elixir.

    @@ -62,44 +66,56 @@ function formatMonth(dateStr: string) {
    -
    -
    -

    Career

    +
    +
    +

    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} - -
    +
    +
    + {isOngoing && ( +
    + )} + + {start} — {end} + +

    {exp.data.role}

    +

    + {exp.data.companyUrl ? ( + {exp.data.company} + ) : exp.data.company} + {exp.data.location && ` · ${exp.data.location}`} +

    ); })} +
    -
    -
    -

    Projects

    +
    +
    +

    Projects

    See all →
    -
    +
    {projects.map((project) => ( {recommendationTexts.length > 0 && ( -
    -
    -

    Recommendations

    +
    +
    +

    Recommendations

    See all →
    -
    +
    {recommendationTexts.map((rec) => ( )} -
    -
    -

    Skills

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

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

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

    Values & Approach

    -
    -
      -
    • - - The Software Craftsmanship movement -
    • -
    • - - The social usefulness of the developer -
    • -
    • - - Taking pride in your work, without ego -
    • -
    • - - Domain Driven Design approach -
    • -
    • - - Agile organization: iteration and continuous improvement -
    • +
      +

      Values & Approach

      +
        + The Software Craftsmanship movement + The social usefulness of the developer + Taking pride in your work, without ego + Domain Driven Design approach + Agile organization: iteration and continuous improvement
      -

      Community & Teaching

      -
      -

      +

      +

      Community & Teaching

      +

      I've been running the Software Crafters Albi meetup since 2018. Software engineering professor at Université Champollion in Albi since 2019.

      -

      Online

      -
      - {[ - { label: 'LinkedIn', href: 'https://www.linkedin.com/in/jalil' }, - { label: 'Malt', href: 'https://www.malt.fr/profile/jalilarfaoui' }, - { label: 'Stack Overflow', href: 'https://stackexchange.com/users/54164/jalil' }, - { label: 'GitHub', href: 'https://github.com/JalilArfaoui' }, - { label: 'Framagit', href: 'https://framagit.org/jalil' }, - { label: 'Personal forge', href: 'https://forge.tiqa.fr' }, - ].map((link) => ( - - {link.label} - - - + -
      +
      Tiqa logo -

      - SAS Tiqa
      +

      + SAS Tiqa
      12, rue Fabre d'Églantine — 81 000 Albi, France
      811 917 871 RCS Albi