Never write code like:
new IntersectionObserver((entries) => { const entry = entries[0];
… even if you only care about a single node. Why? Because, it turned out, sometimes browsers queue multiple events (for the same DOM node) and invoke the callback with multiple entries. Only the last item has a non-stale data inside. So the correct approach is:
new IntersectionObserver((entries) => { const entry = entries.at(-1);