scrollToItem(last) top-aligns the last row, so a final message taller than the viewport stayed cut off at the bottom. New scrollToBottom() brings the last row into view, then aligns its bottom edge with the viewport bottom. The isAtBottom check now also treats 'can't scroll forward' as at-bottom, so auto-scroll and the back-to-bottom button behave correctly when the newest message is taller than the viewport.