Replace motion.js entry animations with CSS to eliminate hydration delay

Motion's initial="hidden" rendered opacity:0 in server HTML, making content
invisible until JS hydrated — causing a multi-second blank gap after skeleton
disappearance. Replaced with CSS @keyframes stagger animation that plays
immediately from SSR. Also made color extraction fire-and-forget, merged
duplicate stats queries, and removed redundant dashboard loading.tsx.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-05 16:26:02 -05:00
co-authored by Claude Opus 4.6
parent 9c6da8db53
commit 13d616a456
14 changed files with 184 additions and 331 deletions
@@ -1,23 +1,7 @@
"use client";
import { motion } from "motion/react";
import { TitleCard } from "@/components/title-card";
const staggerContainer = {
hidden: {},
visible: { transition: { staggerChildren: 0.05 } },
};
const staggerItem = {
hidden: { opacity: 0, y: 12, scale: 0.98 },
visible: {
opacity: 1,
y: 0,
scale: 1,
transition: { type: "spring" as const, stiffness: 300, damping: 24 },
},
};
interface TitleGridItem {
id: string;
tmdbId: number;
@@ -30,14 +14,13 @@ interface TitleGridItem {
export function TitleGrid({ items }: { items: TitleGridItem[] }) {
return (
<motion.div
className="grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5"
variants={staggerContainer}
initial="hidden"
animate="visible"
>
{items.map((t) => (
<motion.div key={t.id} variants={staggerItem}>
<div className="grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5">
{items.map((t, i) => (
<div
key={t.id}
className="animate-stagger-item"
style={{ "--stagger-index": i } as React.CSSProperties}
>
<TitleCard
id={t.id}
tmdbId={t.tmdbId}
@@ -47,8 +30,8 @@ export function TitleGrid({ items }: { items: TitleGridItem[] }) {
releaseDate={t.releaseDate}
voteAverage={t.voteAverage}
/>
</motion.div>
</div>
))}
</motion.div>
</div>
);
}