2026-01-07 11:15:15 +01:00
|
|
|
import { defineCollection, z } from "astro:content";
|
2026-02-18 18:11:29 +01:00
|
|
|
import { glob } from "astro/loaders";
|
|
|
|
|
|
|
|
|
|
/** Préserve les points dans les IDs (ex: "portraits.en.json" → "portraits.en") */
|
|
|
|
|
const stripExtension = (ext: string) =>
|
|
|
|
|
({ generateId: ({ entry }: { entry: string }) => entry.replace(new RegExp(`\\.${ext}$`), '') });
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
|
2026-01-07 03:03:42 +01:00
|
|
|
const formatDate = (date: Date, lang: string = 'fr') => {
|
|
|
|
|
const locales: Record<string, string> = { fr: 'fr-FR', en: 'en-US', ar: 'ar-SA' };
|
|
|
|
|
return date.toLocaleDateString(locales[lang] || 'fr-FR', {
|
|
|
|
|
year: 'numeric',
|
|
|
|
|
month: 'long',
|
|
|
|
|
day: 'numeric',
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
const blogCollection = defineCollection({
|
2026-02-18 18:11:29 +01:00
|
|
|
loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
schema: z.object({
|
|
|
|
|
title: z.string(),
|
|
|
|
|
description: z.string(),
|
|
|
|
|
date: z.date(),
|
|
|
|
|
category: z.enum(['pro', 'comedy', 'photo']),
|
|
|
|
|
tags: z.array(z.string()).optional(),
|
|
|
|
|
image: z.string().optional(),
|
|
|
|
|
imageAlt: z.string().optional(),
|
|
|
|
|
draft: z.boolean().default(false),
|
|
|
|
|
lang: z.enum(['fr', 'en', 'ar']).default('fr'),
|
2026-01-07 03:03:42 +01:00
|
|
|
}).transform((data) => ({
|
|
|
|
|
...data,
|
|
|
|
|
dateFormatted: formatDate(data.date, data.lang),
|
|
|
|
|
})),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const projectsCollection = defineCollection({
|
2026-02-22 01:30:06 +01:00
|
|
|
loader: glob({ pattern: "**/*.md", base: "./src/content/projects", ...stripExtension('md') }),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
schema: z.object({
|
|
|
|
|
title: z.string(),
|
|
|
|
|
description: z.string(),
|
|
|
|
|
date: z.date(),
|
|
|
|
|
category: z.enum(['dev', 'comedy', 'photo']),
|
|
|
|
|
technologies: z.array(z.string()).optional(),
|
|
|
|
|
url: z.string().url().optional(),
|
|
|
|
|
github: z.string().url().optional(),
|
|
|
|
|
image: z.string().optional(),
|
|
|
|
|
imageAlt: z.string().optional(),
|
|
|
|
|
featured: z.boolean().default(false),
|
|
|
|
|
draft: z.boolean().default(false),
|
|
|
|
|
lang: z.enum(['fr', 'en', 'ar']).default('fr'),
|
2026-02-22 01:30:06 +01:00
|
|
|
}).transform((data) => ({
|
|
|
|
|
...data,
|
|
|
|
|
dateFormatted: formatDate(data.date, data.lang),
|
|
|
|
|
})),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const experiencesCollection = defineCollection({
|
|
|
|
|
loader: glob({ pattern: "**/*.md", base: "./src/content/experiences", ...stripExtension('md') }),
|
|
|
|
|
schema: z.object({
|
|
|
|
|
role: z.string(),
|
|
|
|
|
company: z.string(),
|
|
|
|
|
companyUrl: z.string().url().optional(),
|
|
|
|
|
location: z.string().optional(),
|
|
|
|
|
startDate: z.string(),
|
|
|
|
|
endDate: z.string().optional(),
|
|
|
|
|
technologies: z.array(z.string()).optional(),
|
|
|
|
|
type: z.enum(['employment', 'freelance', 'teaching', 'community', 'entrepreneurship']),
|
|
|
|
|
featured: z.boolean().default(false),
|
|
|
|
|
draft: z.boolean().default(false),
|
|
|
|
|
lang: z.enum(['fr', 'en', 'ar']).default('fr'),
|
|
|
|
|
}),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const recommendationsCollection = defineCollection({
|
|
|
|
|
loader: glob({ pattern: "**/*.md", base: "./src/content/recommendations" }),
|
2026-02-22 14:07:09 +01:00
|
|
|
schema: z.object({
|
2026-02-22 01:30:06 +01:00
|
|
|
author: z.string(),
|
|
|
|
|
authorRole: z.string(),
|
|
|
|
|
company: z.string(),
|
2026-02-22 14:07:09 +01:00
|
|
|
avatar: z.string().optional(),
|
|
|
|
|
url: z.string().url().optional(),
|
2026-02-22 01:30:06 +01:00
|
|
|
date: z.date(),
|
|
|
|
|
relationship: z.string().optional(),
|
|
|
|
|
lang: z.enum(['fr', 'en']).default('fr'),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
}),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const talksCollection = defineCollection({
|
2026-02-18 18:11:29 +01:00
|
|
|
loader: glob({ pattern: "**/*.md", base: "./src/content/talks" }),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
schema: z.object({
|
|
|
|
|
title: z.string(),
|
|
|
|
|
description: z.string(),
|
|
|
|
|
date: z.date(),
|
|
|
|
|
dateFormatted: z.string(),
|
|
|
|
|
event: z.string(),
|
|
|
|
|
location: z.string(),
|
|
|
|
|
slides: z.string().url().optional(),
|
|
|
|
|
video: z.string().url().optional(),
|
|
|
|
|
image: z.string().optional(),
|
|
|
|
|
imageAlt: z.string().optional(),
|
|
|
|
|
tags: z.array(z.string()).optional(),
|
|
|
|
|
draft: z.boolean().default(false),
|
|
|
|
|
lang: z.enum(['fr', 'en', 'ar']).default('fr'),
|
|
|
|
|
}),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const photoBlogPostsCollection = defineCollection({
|
2026-02-18 18:11:29 +01:00
|
|
|
loader: glob({ pattern: "**/*.md", base: "./src/content/photoBlogPosts", ...stripExtension('md') }),
|
2026-02-18 00:55:13 +01:00
|
|
|
schema: z.object({
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
title: z.string(),
|
|
|
|
|
description: z.string(),
|
|
|
|
|
date: z.date(),
|
2026-02-18 00:55:13 +01:00
|
|
|
coverImage: z.string(),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
tags: z.array(z.string()).optional(),
|
|
|
|
|
featured: z.boolean().default(false),
|
|
|
|
|
draft: z.boolean().default(false),
|
2026-02-17 08:57:07 +01:00
|
|
|
lang: z.enum(['fr', 'en', 'ar']).default('fr'),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
}),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const photoCategoriesCollection = defineCollection({
|
2026-02-18 18:11:29 +01:00
|
|
|
loader: glob({ pattern: "**/*.json", base: "./src/content/photoCategories", ...stripExtension('json') }),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
schema: z.object({
|
|
|
|
|
title: z.string(),
|
|
|
|
|
subtitle: z.string(),
|
|
|
|
|
order: z.number().optional(),
|
Internationalisation complète et ajout des pages code, théâtre, acting (FR, EN, AR)
Ajout des pages code et théâtre/acting en FR, EN et AR.
Création de vraies routes localisées /en/photo et /ar/تصوير au lieu du hack ?lang=. Extraction de composants partagés (PhotoHomeContent, PhotoBlogIndexContent, PhotoBlogPostContent, PhotoAlbumContent) pour éviter la duplication entre langues. Traduction des catégories photo (16 fichiers JSON), de la navigation, du footer et des aria-labels.
Routes AR avec slugs arabes (/ar/تصوير/مدونة, /ar/تصوير/ألبومات).
2026-02-18 14:14:00 +01:00
|
|
|
lang: z.enum(['fr', 'en', 'ar']).default('fr'),
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
}),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const collections = {
|
|
|
|
|
blog: blogCollection,
|
|
|
|
|
projects: projectsCollection,
|
2026-02-22 01:30:06 +01:00
|
|
|
experiences: experiencesCollection,
|
|
|
|
|
recommendations: recommendationsCollection,
|
Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery
Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)
Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts
UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00
|
|
|
talks: talksCollection,
|
|
|
|
|
photoBlogPosts: photoBlogPostsCollection,
|
|
|
|
|
photoCategories: photoCategoriesCollection,
|
2026-02-18 18:11:29 +01:00
|
|
|
};
|