"use client"; import { useMemo, useState } from "react"; import Link from "next/link"; import Image from "next/image"; import { useTranslations } from "next-intl"; import ProjectThumbnail from "@/app/components/ProjectThumbnail"; import ScrollFadeIn from "@/app/components/ScrollFadeIn"; import { BackArrow, SubpageIntro, card, ghost, monoLabel } from "./subpage"; export type ProjectListItem = { id: number | string; // Allow both for Directus (string) and Prisma (number) compatibility slug: string; title: string; description: string; tags: string[]; category: string; date?: string; createdAt?: string; imageUrl?: string | null; }; function yearOf(project: ProjectListItem): string | null { const raw = project.date || project.createdAt; if (!raw) return null; const year = new Date(raw).getFullYear(); return Number.isNaN(year) ? null : String(year); } const filterPill = (active: boolean) => `rounded-full px-4 py-2 text-sm font-medium transition-[background-color,color,transform] duration-150 ease-out active:scale-[0.97] ${ active ? "bg-ink text-paper" : "shadow-[inset_0_0_0_1.5px_rgb(var(--plakat-ink))] hover:bg-ink hover:text-paper" }`; export default function ProjectsPageClient({ projects, locale, }: { projects: ProjectListItem[]; locale: string; }) { const tCommon = useTranslations("common"); const tList = useTranslations("projects.list"); const [selectedCategory, setSelectedCategory] = useState("all"); const [searchQuery, setSearchQuery] = useState(""); const categories = useMemo(() => { const unique = Array.from(new Set(projects.map((p) => p.category))).filter(Boolean); return ["all", ...unique]; }, [projects]); const filteredProjects = useMemo(() => { let result = projects; if (selectedCategory !== "all") { result = result.filter((project) => project.category === selectedCategory); } if (searchQuery) { const query = searchQuery.toLowerCase(); result = result.filter( (p) => p.title.toLowerCase().includes(query) || p.description.toLowerCase().includes(query) || p.tags.some((t) => t.toLowerCase().includes(query)), ); } return result; }, [projects, selectedCategory, searchQuery]); const resetFilters = () => { setSelectedCategory("all"); setSearchQuery(""); }; return ( <> {tCommon("backToHome")} } kicker={`${String(projects.length).padStart(2, "0")} ${locale === "de" ? "Projekte" : "projects"}`} title={tList("title")} >

{tList("intro")}

{/* Filter: Kategorien als Pillen, Suche als Tinten-Feld */}
{categories.map((cat) => ( ))}
{filteredProjects.length === 0 ? (

{tList("noResults")}

) : ( )} ); }