Repository navigation
core: scroll-notches - #971
Conversation
…one passes) A notch is a place of interest in a scroll area. At a touch release, a slow coast is aimed to end exactly on the notch it was headed for, and a lift with no coast seats the content on a notch within its capture. A fast flick passes, and a finger, the wheel and scrollTo never see them. Part of fizzyedit/work#634 Agent-Team: linux Worker: claude Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
PM note: how this PR will be handledWhat it is for: core: scroll-notches Rules that apply: none special. Things to watch (checked by rule):
What happens next:
A living status comment below is kept current. Nothing here is a merge decision. |
Where this PR standsStage: Done: approved What the PM needs before approving (ticks as it is met; the full CI runs only at the end, after the reviews are clean):
Reviews at the current commit (
Updated 2026-10-28 18:22 UTC by the PM. This comment is edited in place. |
|
TRIAGE @77ccd6aa auto: mechanical rules met (fizzy-* app author, names work#634, 333 non-test lines <= 400, no risky path). Labelled |
Part of fizzyedit/work#634
Goal
Notches in the core
ScrollArea(touch only), per the N1 spec on fizzyedit/work#634: a slow flick comes to rest on a notch, a fast one passes, a finger on the content is never affected. Decided once, at the release. Level L3; noScrollAreasets notches by default, so nothing changes until one does.What changed and why
core/Fling.zig:Notch,Aim,landing,aim,nearest(pure).core/widgets/ScrollArea.zig:notches(); at a release inside the range,aimOrSeatsets a per-axiscoast_decaythat ends the coast exactly on the notch, or, when no coast started, seats the content on a notch within its capture with a critically damped spring (seat).coastPositiontakes the decay. A press stops a seat where it is drawn, and the pixel settle runs when a seat ends.tuning,spring_back, bounce, wheel orscrollTochange). A release looks at the first 32 notches inside the range.How it was verified
New pure tests in
Fling.zigand frame tests inScrollArea.zig(slow flick rests on the notch and never passes it, fast flick passes, finger on a notch unmoved, slow lift seats monotonically, lift outside a window stays, wheel never notches, a press stops an aimed coast or a seat with no jump, aimed coast is a function of time). Gates run: check-fmt, build, test, test-integration (100/100 steps), check-web, test-sdk-version, lint, check-tests-reached.No phone screen recording: this is a headless Linux worker; the frame tests drive real touch events through the widget.
Not done / follow-ups
shiftandPullare P2; the console wiring of the fold is in the PM's repo.Changes (2 files, +318/-15)
Gates: 6 of 6 passed
scripts/check-fmt.sh(exit 0)scripts/zb build --summary all(exit 0)scripts/zb build test --summary all(exit 0)scripts/zb build test-integration --summary all(exit 0)scripts/zb build check-web --summary all(exit 0)scripts/zb build test-sdk-version --summary all(exit 0)