+ // Render the MDX descriptions on the server so they exist at first paint.
+ // The client tree (which runs the GSAP entrance via useTimeLine) only places
+ // these already-rendered nodes — it never invokes the MDX renderer itself, so
+ // the 'use client' boundary stays intact and the animations no longer play
+ // against an un-rendered fallback.
+ const descriptions: Record = {};
+ for (const project of projects ?? []) {
+ if (!project.description?.trim()) continue;
+ descriptions[project.id] = (
+
);
}
return (
-
- Projects I've Been Working on
-
- {projects.map((project, i) => (
-