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 ( +
+ {title} 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 ( +
+ {title} setHidden(true)} /> +
+ + {category} + +
+
+ ); +} + +function ThumbnailCover({ cover, title }: { cover?: string; title: string }) { + const [hidden, setHidden] = useState(false); + if (!cover || hidden) return null; + return ( +
+ {title} 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