import { useEffect, useState } from "react"; import { FakeTile, ReplayButton } from "./fakes"; const REVEAL_MS = 280; // Two rows (cols-4) keeps the explainer text visible without scrolling. const TILE_PROPS: { favorite?: boolean; rating?: number; duration?: string }[] = [ {}, { favorite: true }, {}, { duration: "1:24" }, { rating: 5 }, { favorite: true, rating: 3 }, { duration: "0:09" }, {}, ]; const TILE_COUNT = TILE_PROPS.length; /// Placeholder tiles "loading in" once (skeleton → image), then stopping fully /// revealed with a replay control. export function StepGalleryPreview() { const [revealed, setRevealed] = useState(0); useEffect(() => { if (revealed >= TILE_COUNT) return; const timer = setTimeout(() => setRevealed((n) => n + 1), REVEAL_MS); return () => clearTimeout(timer); }, [revealed]); const finished = revealed >= TILE_COUNT; return (

The gallery is a virtualized grid — it stays fast with hundreds of thousands of items. Tiles carry your favorites, star ratings, and video durations; hover for filename and quick actions.

{TILE_PROPS.map((props, i) => ( ))}

Click any tile to open the lightbox — keyboard navigation, zoom, inline tag editing, ratings, and a full video player.

The toolbar filters by type, favorites, or rating, sorts by date/name/size, and switches grid density.

{finished ? setRevealed(0)} /> : null}
); }