diff --git a/components/sections/ArticleList.tsx b/components/sections/ArticleList.tsx
index f4be11a..ccb8e83 100644
--- a/components/sections/ArticleList.tsx
+++ b/components/sections/ArticleList.tsx
@@ -1,7 +1,8 @@
'use client';
-import { useRef, useEffect } from 'react';
+import { useRef, useEffect, useState } from 'react';
import Link from 'next/link';
+import Image from 'next/image';
import { useTranslations } from 'next-intl';
import { Article } from '@/lib/blog/types';
@@ -10,6 +11,46 @@ type props = {
articles: Article[];
};
+function FeaturedCover({ cover, title, category }: { cover?: string; title: string; category: string }) {
+ const [hidden, setHidden] = useState(false);
+ if (!cover || hidden) return null;
+ return (
+
+
setHidden(true)} />
+
+
+ {category}
+
+
+
+ );
+}
+
+function MediumCover({ cover, title, category }: { cover?: string; title: string; category: string }) {
+ const [hidden, setHidden] = useState(false);
+ if (!cover || hidden) return null;
+ return (
+
+
setHidden(true)} />
+
+
+ {category}
+
+
+
+ );
+}
+
+function ThumbnailCover({ cover, title }: { cover?: string; title: string }) {
+ const [hidden, setHidden] = useState(false);
+ if (!cover || hidden) return null;
+ return (
+
+ setHidden(true)} />
+
+ );
+}
+
export function ArticleList({ locale, articles }: props) {
const ref = useRef(null);
const t = useTranslations('blogPage');
@@ -40,62 +81,156 @@ export function ArticleList({ locale, articles }: props) {
);
}
+ const formatDate = (dateStr: string) =>
+ new Date(dateStr).toLocaleDateString(locale === 'fr' ? 'fr-FR' : 'en-US', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ });
+
+ const [featured, ...rest] = articles;
+ const secondRow = rest.slice(0, 2);
+ const remaining = rest.slice(2);
+
return (
-
-
- {articles.map((article, i) => {
- const formatted = new Date(article.date).toLocaleDateString(
- locale === 'fr' ? 'fr-FR' : 'en-US',
- { year: 'numeric', month: 'long', day: 'numeric' }
- );
+
+
- return (
-
-
-
-
- {article.category}
-
- {article.readTime && (
- <>
-
-
- {article.readTime}
-
- >
- )}
-
-
- {article.title}
-
-
- {article.description}
-
-
- {formatted}
+ {/* Featured — most recent article, full width */}
+
+
+
+
+
+
+
+ {formatDate(featured.date)}
+ {featured.readTime && (
+ <>
+
+
+ {featured.readTime}
+
+ >
+ )}
+
+ {featured.title}
+
+
+ {featured.description}
+
+
+
+
+ {t('readArticle')}
+
+
+
+
+
+ {/* Second row — 2 medium cards */}
+ {secondRow.length > 0 && (
+
+ {secondRow.map((article, i) => (
+
+
+
+
+
+
+
+ {formatDate(article.date)}
+
+ {article.readTime && (
+ <>
+
+
+ {article.readTime}
+
+ >
+ )}
+
+
+ {article.title}
+
+
+ {article.description}
+
+
+
+
+ {t('readArticle')}
+
+
+
+
+ ))}
+
+ )}
+
+ {/* Remaining — compact horizontal list */}
+ {remaining.length > 0 && (
+
+ {remaining.map((article, i) => (
+
+
+
+
+
+
+ {article.category}
+
+
+
+ {formatDate(article.date)}
+
+ {article.readTime && (
+ <>
+
+
+ {article.readTime}
+
+ >
+ )}
+
+
+ {article.title}
+
+
+ {article.description}
+
+
+
+
+ {t('readArticle')}
+
+
+
+ ))}
+
+ )}
-
- {t('readArticle')}
-
-
-
- );
- })}
);
diff --git a/content/blog/en/02-Claude-Design-vs-Figma-Make.mdx b/content/blog/en/02-Claude-Design-vs-Figma-Make.mdx
index 5857fa2..cdc443f 100644
--- a/content/blog/en/02-Claude-Design-vs-Figma-Make.mdx
+++ b/content/blog/en/02-Claude-Design-vs-Figma-Make.mdx
@@ -18,6 +18,7 @@ summary:
- "The Alternative: Figma Make"
- "The Ideal Workflow: Making Claude and Figma Talk"
- "Epilogue"
+cover: "/images/blog/claude-design-vs-figma-make.png"
---
## The Arrival of Claude Design
diff --git a/content/blog/fr/02-Claude-Design-vs-Figma-Make.mdx b/content/blog/fr/02-Claude-Design-vs-Figma-Make.mdx
index f5b3944..d72ca72 100644
--- a/content/blog/fr/02-Claude-Design-vs-Figma-Make.mdx
+++ b/content/blog/fr/02-Claude-Design-vs-Figma-Make.mdx
@@ -18,6 +18,7 @@ summary:
- "L'alternative : Figma Make"
- "Le workflow idéal : faire dialoguer Claude et Figma"
- "Épilogue"
+cover: "/images/blog/claude-design-vs-figma-make.png"
---
## L'arrivée de Claude Design
diff --git a/public/images/blog/claude-design-vs-figma-make.png b/public/images/blog/claude-design-vs-figma-make.png
new file mode 100644
index 0000000..78b6c09
Binary files /dev/null and b/public/images/blog/claude-design-vs-figma-make.png differ