onToggle(idx)}
+ onKeyDown={(e) => handleKeyDown(e, idx)}
+ style={{
+ position: "relative",
+ border: img.isSelected ? "2px solid #1890ff" : "1px solid #ccc",
+ outline: "none",
+ borderRadius: 4,
+ cursor: "pointer",
+ background: "#fafafa",
+ width: thumbSize,
+ height: thumbSize,
+ overflow: "hidden",
+ boxSizing: "border-box"
+ }}
+ >
+ {(() => {
+ const key = img.filename || idx;
+ const loaded = loadedMap.get(key) === true;
+ return (
+ <>
+ {!loaded && (
+
+ {/* simple skeleton; no shimmer to reduce cost */}…
+
+ )}
+

handleImageLoad(key)}
+ style={{
+ width: thumbSize,
+ height: thumbSize,
+ objectFit: "cover",
+ display: "block",
+ borderRadius: 4,
+ opacity: loaded ? 1 : 0,
+ transition: "opacity .25s ease"
+ }}
+ />
+ >
+ );
+ })()}
+ {img.isSelected && (
+
+ )}
+
+ ))}
+ {/* No placeholders needed; layout uses auto-fit for non-chat or fixed columns for chat */}
+