Skip to content

spec(AST-094): a scroll-edge pan may hold the rubber band from the first move (FR19, D28) - #8628

Merged
cixzhang merged 3 commits into
mainfrom
spec/ast094-scroll-edge-pan
Oct 27, 2026
Merged

cixzhang merged 3 commits into
mainfrom
spec/ast094-scroll-edge-pan

Conversation

@cixzhang

Copy link
Copy Markdown
Contributor

Decided (Cindy, 2026-10-26, D28 = a).

User impact

On a phone, pulling a sheet down from a list that's already at its top moves the sheet at once, as iOS's sheet pull does, instead of the page rubber-banding first. A real scroll is never blocked.

The trade-off, recorded in DEC-18: a list inside a sheet can't pull to refresh from its top.

Change: spec:AST-094 FR19

Writing rubric results

  • R1 present tense: pass. R2 research: none. R3 verification: row extended.
  • R4 rejected alternatives: one line in DEC-18. R5 change references: none in the record. R6 open questions: none.

@vercel

vercel Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
astryx Ready Ready Preview Oct 27, 2026 4:44am UTC

Request Review

@astracat-bot

astracat-bot Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

AI review status for this pull request.

Review status Updated
🟢 Reviewed (for maintainers only) Oct 27, 2026, 5:10 AM UTC

@cixzhang

Copy link
Copy Markdown
Contributor Author

/approve-spec df7d9fa

@github-actions github-actions Bot added the spec-auto-merge Auto-merge was enabled by the spec owner gate label Oct 27, 2026
@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

PR Analysis Report

Previews ready: Storybook and Sandbox were built with this PR's docsite. CI evidence will be added when available.

View Storybook for this PR · View Sandbox for this PR

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Oct 27, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One small change is needed: the FR19 amendment and DEC-18 have an engineering owner's approval for this head, but the FR18–FR22 verification row (docs/specs/AST-094-touch-presentations/spec.md, line 549) still fails "a cancelled unowned touchmove outside FR19's two exceptions" while FR19 now lists three, so the row fails the scroll-edge cancel the new exception allows. Change "two" to "three" there; a new commit invalidates the current approval, so an engineering owner (the author is one) then re-approves with /approve-spec <full head SHA>.

  • Optional: FR14 describes the same pull as "the drag moves toward that edge" while the new FR19 text says "the finger moves away from that edge", and using FR14's wording would prevent a misread.
  • Optional: DEC-18 says the browser rubber-bands before 10 pt but names no browser or measurement, while FR2's Mobile Safari measurement keeps touchmove cancelable through 10 px, so naming the source or marking it a guess would close that gap.

[Automated review]

| FR13 | Resolver unit tests and a server-render test | coarse and fine pointer; narrow, wide and short; server render; hydrating render | a component that answers the conditions differently, or a touch presentation in the server or hydrating render, fails |
| FR14 | Browser tests of a sheet over a scrolled list | scrolled and at its top | a midway handoff fails |
| FR15–FR17 | Recognizer unit tests on synthetic streams with explicit timestamps | exclusive, simultaneous, require-to-fail, nested; a watcher beside a claiming winner; a blocked main thread; a pan at 10 pt per axis | a wrong winner, a late deadline, or a translation that keeps the hysteresis, or a watcher failed or cancelled by a claiming winner fails |
| FR18–FR22 | Browser tests with real touch input (`spec:AST-013` FR10) | per-axis pans beside native scrolling, page zoom, cancelled touches, clicks after taps, keyboard activation, a modal scroll lock, a control that keeps its press through a drag; a still finger with sub-pixel jitter over a scroll view; a finger moved 9 px and 10 px straight, and (7, 7) and (8, 8) diagonally; a recognizer on an element whose author `touch-action` is narrower, including one without `pinch-zoom`; a screen-edge pan landing at 40 px and at 41 px from the edge, at 14 px and 15 px of travel, and a horizontal scroll that starts outside the band; a sheet's pull from a list at its top, and from a list scrolled away from its top | a ghost click, a scroll or zoom blocked other than by the author's `touch-action`, or a cancelled unowned touchmove outside FR19's two exceptions, a tap cancelled by sub-pixel movement or by under 10 px of travel, a scroll that does not take the touch at 10 px, or a derived `touch-action` wider than the author's, a screen-edge pan that claims outside its band or before 15 px, or has not claimed at 15 px, or an author scroll outside the band that is blocked, or a scroll-edge pan that cancels a move a scroller could scroll, or begins before 10 pt, fails |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This row's failure text still reads "a cancelled unowned touchmove outside FR19's two exceptions", but FR19 now lists three (line 269). Read literally, the row fails the scroll-edge cancel that the third exception allows. "FR19's three exceptions" (or "FR19's exceptions") keeps the row in step with FR19.

cancel that finger's moves. A scroll-edge pan, such as a sheet's pull
from a scroll area at its edge (FR14), MAY cancel its touch's moves from the
first move, only while every scroller under the finger sits at its edge and
the finger moves away from that edge, and only the moves the browser would

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional: FR14 (line 224) describes this same pull as "the drag moves toward that edge", while this line says "the finger moves away from that edge". The clause that follows pins down the behavior, but FR14's wording would keep the two claims from reading as opposite cases.

vjeux added a commit to vjeux/astryx that referenced this pull request Oct 27, 2026
… scroller under it is at the edge

spec:AST-094 FR19 and DEC-18 (proposed in meta#8628): a scrollEdge pan may
cancel its touch's moves from the first one, only while every scroller
under the finger sits at its edge and the finger moves away from it, and
only the moves the browser would rubber-band; it still begins at FR17's
10 px. The first case reads the first 2 px move cancelled at the edge and
fails on this head; the others keep what must not change: room to scroll
leaves every move to the browser, a first move toward the content too, a
pan without scrollEdge cancels nothing before it begins, and a touch the
browser took for a scroll stays the browser's when the list reaches its
edge.
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 27, 2026
… cancelled at the edge

spec:AST-094 FR19 and DEC-18 (proposed in meta#8628). The sheet's scroll-edge
pan at the top of its content: every touchmove the page sees is cancelled,
the first one included. WebKit sends that first move at 2 px, before the
sheet's 10 px begin, and it reaches the page uncancelled on this head;
Chromium sends none inside its own 15 px slop, so there it proves only
that nothing scrolls.
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 27, 2026
…e away from an edge

spec:AST-094 FR19 and DEC-18 (proposed in meta#8628). GestureRecognizer gains
keepsTouch(touchId), false by default and reached by the host through
recognizerInternals: whether it holds that finger before it begins. A
scrollEdge pan does while it is possible, the touch is a finger the browser
has not taken, its travel so far goes the pan's own way, and no scroller
under the finger can scroll for it (the probe its begin already reads), so
only moves the browser would rubber-band are held, never a real scroll.
The host's blocking touchmove check cancels a move a participant holds, as
it does a claimed one; the arena already holds that move when the check
runs, since the host feeds it from its window-capture subscriber first.
The pan still begins at 10 px; a mouse or a pen is never held. The README
says so.
@cixzhang

Copy link
Copy Markdown
Contributor Author

/approve-spec e42ad37

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks ready to merge: FR19's scroll-edge exception, the extended FR18–FR22 verification row and DEC-18 have an engineering owner's approval for this exact head, and the row's count and FR19's wording now match FR19 and FR14. Two optional follow-ups would help whoever implements it: DEC-18 labels its premise that Mobile Safari rubber-bands before the pan's 10 pt start as unmeasured, so naming the simulator measurement that would settle it (as DEC-14 does) would close that gap, and the row could list a tap with sub-pixel jitter on a list at its top, where the new permission meets the existing "tap cancelled by sub-pixel movement" failure. Whichever of this and the pull requests adding DEC-15 to DEC-17 lands second will need a rebase of the decision log.

[Automated review]

@cixzhang
cixzhang merged commit fd0345c into main Oct 27, 2026
54 checks passed
cixzhang added a commit that referenced this pull request Oct 27, 2026
@github-actions
github-actions Bot deleted the spec/ast094-scroll-edge-pan branch October 27, 2026 06:22
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 27, 2026
…s from its first move

spec:AST-094 FR19 and DEC-18, as proposed in meta#8628: at a scroll edge, a pull
away from it may hold its touch's moves from the first one, only while every
scroller under the finger is at that edge, and never a real scroll; the pan
still begins at 10 px. The body's pans are scroll-edge pans, so F2's meta#8336
(the recognizer's keepsTouch, carried by meta#8320) gives the sheet that with no
code of its own.

The body's pull test now holds its first moves (it fails when the
scroll-edge pan keeps no touch: the first move at 3 px reaches the browser)
and still begins the pan at 10 px; two guards pass either way: a list that
can still scroll keeps every move, and a first move toward the content is
the browser's even at the top.

This branch was successfully deployed

1 active deployment
Preview — e42ad377 Deployed Oct 27, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Meta Open Source bot. spec-auto-merge Auto-merge was enabled by the spec owner gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant