Two types of bottom:
1. Historical bottom (hasMoreAfter=true):
- Button ALWAYS visible (even at scroll bottom)
- Click → loads latest 50 messages to present time
- Renders and scrolls to bottom
2. Present bottom (hasMoreAfter=false):
- Button hidden when isNearBottom()
- Click → smart scroll (to unread or bottom)
Changes:
- _setupSmartButtonVisibility() monitors hasMoreAfter
- _handleScrollButtonClick() loads history if hasMoreAfter
- Added public loadLatest() method
- Emits 'chat:messagesLoaded' event for UI updates
Result:
- Historical view: button always shows, loads to present
- Present view: button hides at bottom, smart unread scroll
- No more stuck in history without way to present