import Link from "next/link";
import Image from "next/image";
import { getBlogPosts } from "../lib/payload";
import { Reveal, RevealGroup, RevealItem } from "./Reveal";
import { ArrowRightIcon } from "./ArrowRightIcon";
export async function Blog() {
const posts = await getBlogPosts(3);
if (posts.length === 0) return null;
const featured = { ...posts[0], href: `/blog/${posts[0].slug}` };
const secondary = posts
.slice(1, 3)
.map((post) => ({ ...post, href: `/blog/${post.slug}` }));
return (
{/* Section header */}
Neue Impulse
Gedanken, Methoden & Impulse
{/* Posts grid */}
{/* Featured post — image on top through lg (1024px), side-by-side
only from lg+ (was sm+, but that squeezed the text column too
hard on tablet widths — same reasoning as the secondary posts'
grid below, which already used this lg breakpoint).
lg:min-h stretches the row taller on large screens (the image's
lg:h-full and the text column's justify-between both follow) —
without it the card's height was purely driven by the text
column's content, which stays short regardless of viewport
width. */}
{/* Whole card is the click target now (image + title + excerpt),
not just the "Zum Beitrag" line — the hover-lift below already
implied the whole card was clickable, so only the small arrow
actually working was a mismatch. `group` drives the arrow
row's hover color from anywhere on the card, not just when
hovering that row itself. */}
{featured.thumbnail && (
)}
{featured.categories.join(", ")}•{featured.readTime} Min
{featured.title}
{featured.excerpt}
{/* flex + arrow as its own span — see Tools.tsx's comment on
this same fix (→'s glyph baseline sits low next to text).
Plain span now, not its own nested Link (the whole card
is one Link already) — group-hover keeps the color
change working from anywhere on the card. */}
Zum Beitrag
{/* Secondary posts — image on top through lg (1024px), side-by-side
only from lg+. These sit 2-up (sm:grid-cols-2 below) well
before lg, so each card's own available width through the
640-1023px tablet range is too narrow for image+text side by
side — was sm:grid-cols-5, squeezing the text column. */}
{secondary.map((post) => (
{post.thumbnail && (
)}
{post.categories.join(", ")}•{post.readTime} Min
{post.title}
{post.excerpt}
{/* Plain span, not its own nested Link — see the featured
post's own comment above. */}
Zum Beitrag