/** * About page — Bauhaus / Leica minimalist layout. * Reads content from content/about.md (frontmatter + markdown body). */ import { readFileSync } from 'fs'; import { join } from 'path'; import matter from 'gray-matter'; import Image from 'next/image'; import { imageUrl, assetPlaceholder } from '@/lib/urls'; import { immich } from '@/lib/immich'; import './about.css'; interface AboutFrontmatter { portrait?: string; name?: string; location?: string; gear?: string[]; } function getAboutContent() { const raw = readFileSync(join(process.cwd(), 'content', 'about.md'), 'utf-8'); const { data, content } = matter(raw); return { meta: data as AboutFrontmatter, body: content.trim() }; } export default async function AboutPage() { const { meta, body } = getAboutContent(); // Fetch ThumbHash for portrait placeholder const portraitAsset = meta.portrait ? await immich.getAssetInfo(meta.portrait) : null; const portraitPlaceholder = portraitAsset ? assetPlaceholder(portraitAsset) : null; return (
{/* ── Portrait ─────────────────────────────────── */}
{meta.portrait ? ( {meta.name ) : (
)}
{/* ── Text ─────────────────────────────────────── */}
{meta.name &&

{meta.name}

} {meta.location &&

{meta.location}

}
{body && (
{body .split('\n') .filter(Boolean) .map((line, i) => (

{line}

))}
)} {meta.gear && meta.gear.length > 0 && ( <>

Gear

    {meta.gear.map((item) => (
  • {item}
  • ))}
)}
); }