aboutsummaryrefslogtreecommitdiffstats
path: root/src/features/messages.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-10-17 05:23:16 -0700
committerAdam Soltys <[email protected]>2026-10-17 05:23:16 -0700
commitc2005c74750d549f8983359fbed34df5c12360b3 (patch)
tree5260c7c9289df948952cb86dc99bdf05167ff9f4 /src/features/messages.js
parentd44a61a2b4e6b59ed6bebfe64d6b2f3a1dbb303d (diff)
downloadcoinosv3-c2005c74750d549f8983359fbed34df5c12360b3.tar.gz
coinosv3-c2005c74750d549f8983359fbed34df5c12360b3.zip
The pager's counter runs through the posts as a flight passes them, instead of jumping on landing.
Adam, 2026-10-17: "the counter should animate as we fly, right now the current position only updates when we land". While a flight is under way (a flung finger or a spin of the wheel), each scroll counts the post under the middle of the screen (a binary search over the posts' tops); the landing sets the post landed on, as before. tools/pager-swipe-fly-test.js: a flick from post 2 shows 2, 3, 4 … 9 on the way. pager-wheel, pager-ready-gate, profile-pager and thread-pager pass. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
Diffstat (limited to 'src/features/messages.js')
-rw-r--r--src/features/messages.js17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/features/messages.js b/src/features/messages.js
index 76330a4..cf6e2c7 100644
--- a/src/features/messages.js
+++ b/src/features/messages.js
@@ -13172,7 +13172,7 @@ export function messagesFeature(ctx) {
if (land) slideFrame(land, -1);
pagerGlide(pager.scroller, 'y', dest, vel, {
ms: screens > 1.05 ? Math.min(most, 100 + pace * screens) : 0,
- onDone: () => { if (!pager) return; pager.flying = false; const s = pagerHere(); if (s && s !== pager.cur) pagerArrive(s); },
+ onDone: () => { if (!pager) return; pager.flying = false; const s = pagerHere(); if (s && s !== pager.cur) pagerArrive(s); pagerPosition(); },
});
}
const pagerArrive = (slide) => { if (pager && pager.arrive) pager.arrive(slide); };
@@ -13201,13 +13201,24 @@ export function messagesFeature(ctx) {
if (!pager) return;
const groups = pagerGroups();
const slide = pager.cur || pager.anchor;
- const index = groups.indexOf(slide && slide.closest('.mp-group'));
- pager.el.querySelector('.mp-position').textContent = (index < 0 ? 0 : index + 1) + ' / ' + groups.length;
+ let index = groups.indexOf(slide && slide.closest('.mp-group'));
+ // in a flight, the post passing under the reader: the count runs with
+ // the slides rather than jumping on landing (Adam, 2026-10-17: "the
+ // counter should animate as we fly")
+ if (pager.flying && groups.length) {
+ const y = pager.scroller.scrollTop + pager.scroller.clientHeight / 2;
+ let lo = 0, hi = groups.length - 1; // the last post whose top is above the middle of the screen
+ while (lo < hi) { const m = (lo + hi + 1) >> 1; if (groups[m].offsetTop <= y) lo = m; else hi = m - 1; }
+ index = lo;
+ }
+ const text = (index < 0 ? 0 : index + 1) + ' / ' + groups.length, el = pager.el.querySelector('.mp-position');
+ if (el.textContent !== text) el.textContent = text;
}
function buildPager(want) {
const video = want.kind === 'videos';
const scroller = h('div', { class: 'mp-scroll' });
+ scroller.addEventListener('scroll', () => { if (pager && pager.flying) pagerPosition(); }, { passive: true });
const el = h('div', { class: 'media-pager' + (video ? ' videos' : '') + (pagerLoud ? '' : ' quiet'), role: 'dialog', 'aria-modal': 'true' },
scroller,
h('div', { class: 'mp-position', role: 'status' }, '0 / 0'),