Virtual — ten thousand tiles, DOM-recycled
Windowing a grid of non-uniform-height tiles is the chicken-and-egg: you need heights to position items, but heights come from loading them. The left panel is the naive attempt — drop N <img> tags into a CSS column layout and let the browser fetch, decode, and reflow all at once. The right panel uses prepare() with dimsOnly to measure every URL for just the header bytes (~4KB each), packs the full layout from the returned aspect ratios, then recycles a pool of ~40 DOM nodes as you scroll. Crank the slider; the scrollbar length is honest from the first frame, no matter the count.
Heads up: the naive side at 5k+ tiles can make your tab unresponsive for a few seconds while the browser builds the CSS column layout and opens 10k parallel fetches. That's the point.