MCPcopy
hub / github.com/shiyi-0x7f/o-lib / SearchGridView

Function SearchGridView

src/pages/SearchPage/SearchGridView.tsx:20–197  ·  view source on GitHub ↗
({
    books, hoveredId, setHoveredId, downloadingIds, favoriteIds, downloadedIds,
    getCoverUrl, handleCoverError, onBookClick, onDownload, onToggleFavorite,
}: SearchGridViewProps)

Source from the content-addressed store, hash-verified

18}
19
20export default function SearchGridView({
21 books, hoveredId, setHoveredId, downloadingIds, favoriteIds, downloadedIds,
22 getCoverUrl, handleCoverError, onBookClick, onDownload, onToggleFavorite,
23}: SearchGridViewProps) {
24 return (
25 <div style={{
26 display: "grid",
27 gridTemplateColumns: "repeat(auto-fill, minmax(140px, 1fr))",
28 gap: "14px",
29 marginBottom: "24px",
30 }}>
31 {books.map((book, i) => {
32 const isHovered = hoveredId === i;
33 const isDownloading = downloadingIds.has(book.id);
34 const coverUrl = getCoverUrl(String(book.id), book.cover);
35 return (
36 <div
37 onClick={() => onBookClick(book)}
38 key={i}
39 className="card"
40 style={{
41 padding: 0,
42 overflow: "hidden",
43 cursor: "pointer",
44 transition: "all var(--transition-normal)",
45 transform: isHovered ? "translateY(-6px)" : "none",
46 boxShadow: isHovered ? "var(--shadow-lg), 0 0 24px var(--accent-glow)" : "none",
47 borderColor: isHovered ? "var(--accent)" : "var(--border)",
48 }}
49 onMouseEnter={() => setHoveredId(i)}
50 onMouseLeave={() => setHoveredId(null)}
51 >
52 {/* Cover */}
53 <div style={{
54 position: "relative",
55 width: "100%",
56 aspectRatio: "3/3.6",
57 background: "var(--bg-tertiary)",
58 overflow: "hidden",
59 }}>
60 {coverUrl ? (
61 <img
62 src={coverUrl}
63 alt={book.title}
64 loading="lazy"
65 style={{
66 width: "100%",
67 height: "100%",
68 objectFit: "cover",
69 transition: "transform var(--transition-slow)",
70 transform: isHovered ? "scale(1.06)" : "scale(1)",
71 }}
72 onError={() => handleCoverError(String(book.id))}
73 />
74 ) : (
75 <div style={{
76 width: "100%", height: "100%",
77 display: "flex", alignItems: "center", justifyContent: "center",

Callers

nothing calls this directly

Calls 2

formatSizeFunction · 0.90
getCoverUrlFunction · 0.85

Tested by

no test coverage detected