When moving down a topic using J , it gets to a point where you can’t navigate any further using the key. Even if I try to move up (K ) and move down, I still cannot move below that specific reply.
I believe this reply is the last of the loaded replies and the keyboard shortcuts doesn’t trigger the loading of the next batch of replies?
Also, scrolling up/down when encountering this does not work . Oddly enough, you can’t load the next batch even if you try and scroll down - no loading spinner, nothing, even the bottom reply isn’t the last one.
1 Like
tgxworld
(Alan Tan)
October 16, 2025, 4:33am
2
I can reproduce this consistently on an internal site and it seems to happen when the height of the last topic fits nicely within the screen.
Going to put a pri-medium on this for the team to look at.
3 Likes
This issue seems to be fixed now @tgxworld ?
tgxworld
(Alan Tan)
October 30, 2025, 6:37am
4
I don’t think anything was done here. I can still reproduce it but not in a reliable way.
1 Like
Moin
October 30, 2025, 7:32am
5
I sometimes got stuck in a topic too. But it was not because of using a keyboard shortcut. I don’t use keyboard shortcuts to navigate on my tablet.
But I also have no reliable repro, so I’m not sure if this adds anything helpful.
saquetim
(Sérgio Saquetim)
February 13, 2026, 2:02am
8
main ← dev/smoother-post-stream-scroll
merged 05:58PM - 18 Feb 26 UTC
## Summary
- Improves scroll position stability when loading posts above the vi… ewport by using `scrollBy`-based compensation instead of `scrollTo` + `offsetCalculator`
- Dynamically hides banners, notices, and footer content when the user is in the middle of a long topic via a new `scrollState` service and `{{hideScrollableContent}}` helper
- Triggers loading more posts when navigating to boundary posts via keyboard (`j`/`k` keys)
- Prevents load-more sentinel from re-triggering during scroll compensation with a `suppressLoadAbove` flag
## Details
### Scroll compensation
When new posts are prepended above the viewport, the component captures the anchor post's position via `getBoundingClientRect()` before DOM insertion (using a `beforePrepend` callback in `prependMore()`), then compensates with `window.scrollBy()` after insertion. This keeps the reading position visually stable.
### Content hiding
A `scrollState` service tracks ref-counted hide requests. The `{{hideScrollableContent}}` class-based helper registers with the service and automatically cleans up via `registerDestructor`. The `application.gjs` and `topic.gjs` templates wrap scrollable content in `{{#unless shouldHideScrollableContentAbove/Below}}` blocks.
The helper invocations live in `topic.gjs` outside the `{{#unless loadingFilter}}` guard so content stays hidden during timeline jumps that temporarily unmount `<PostStream>`.
### Keyboard navigation
`updateKeyboardSelectedPostNumber` now checks if the selected post is at a loaded boundary (`firstAvailablePost` / `lastAvailablePost`) and triggers `loadMoreAbove` / `loadMoreBelow`. Double-loading is prevented by existing `canPrependMore` / `canAppendMore` guards.
The PR above addresses this issue.
2 Likes
sam
(Sam Saffron)
Closed
February 20, 2026, 9:00pm
9
This topic was automatically closed after 4 days. New replies are no longer allowed.