Skip to content

spec(AST-094): a thumb that sets a value takes no wheel or trackpad scroll (FR43) - #8905

Merged
cixzhang merged 5 commits into
meta:mainfrom
vjeux:spec/ast-094-control-thumb-no-wheel
Oct 31, 2026
Merged

cixzhang merged 5 commits into
meta:mainfrom
vjeux:spec/ast-094-control-thumb-no-wheel

Conversation

@vjeux

@vjeux vjeux commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Exact decision needed

This comes from Astryx's UIKit-parity work (spec:AST-094), which brings iOS's touch behavior to the web components. FR43 said a pan takes wheel and trackpad scrolling alike. Read literally, a few quick mouse-wheel notches would move or close a sheet, and a page scroll that passes over a slider would change its value. Two answers are needed: which scroll input drives a pan, given that the web reports no trackpad contact or phase, and whether a thumb that sets a value takes any. Slider's every-pointer change, #8669, needs the second.

Existing authority searched

FR3, FR19, FR36, FR37, FR41, FR43, DEC-1 and DEC-21 in spec:AST-094; spec:AST-017 FR59; spec:AST-057 DEC-7; component:Slider; component:BottomSheet; and the gesture host's per-recognizer scroll types. Touch work keeps released mouse behavior (AST-017 FR59, AST-094 FR41), and native parity (DEC-1) matches a range input, which ignores the wheel. No record told a trackpad from a mouse wheel or said where a trackpad gesture starts and ends. All 51 other open pull requests that edit AST-094 were checked at this head, and none changes FR43, DEC-23 or DEC-24.

Decision

  • FR43: a pan takes a trackpad's two-finger scroll where its record allows it, and never a mouse wheel's notches. A scroll counts as a trackpad's only when it carries the trackpad signature Chromium and WebKit report. Any other scroll, Shift+wheel and a tilt wheel included, is a mouse wheel's, and scrolls what is under it.
  • DEC-24 (decided by the record's owner): one splitter reads every trackpad stream, since the web reports no trackpad contact, phase or momentum. It ends a gesture on a pause and reads the fingers' lift from a shrinking run of deltas. Momentum never moves a surface. A reversal, a rising delta or a gap starts a new gesture. While the splitter has not yet decided between a lift and fingers still moving, the surface keeps moving at the fingers' last speed, never farther than that speed carries it over the held deltas, so a lift continues without a stop. A pan released at the lift keeps the fingers' velocity (FR36).
  • Surfaces that follow a trackpad:
    • A BottomSheet follows a trackpad as it follows a finger. A form or required sheet stretches on FR3's rubber band and springs back; an info sheet closes on a flick or past its close distance; a mouse wheel never moves a sheet.
    • A pager moves at most one page per swipe.
    • A swipe row follows the fingers, settles to the nearest detent, and only closes within one gesture.
  • DEC-23 keeps its exception: a thumb that sets a value, a slider's or a switch's where it pans, takes neither, so a scroll over it goes to the scroll under it.
  • Engines: a trackpad drives a pan only in a browser that reports wheelDelta (Chromium and WebKit). Elsewhere every scroll counts as a mouse wheel's.
  • Verification: FR43 gains a trackpad verification row.

Rejected alternatives

  • DEC-24: a mouse wheel driving a pan; a discrete step per trackpad swipe for rows and paging; a longer end timeout instead of the splitter.
  • DEC-23: the thumb taking scroll input like other pans.

Claim scope and non-goals

In scope: which scroll input a pan takes and where a trackpad gesture starts and ends; the surfaces that follow it (BottomSheet, the shared pager, swipe rows); and a thumb that sets a value. Touch input, a pinch's ctrl-wheel, and keyboard and focus behavior stay outside this decision.

Evidence and implementation relationship

Writing rubric results

  • R1 narration: none. The rules are stated in the present tense, and the component:BottomSheet line under affected records names the finger's one-for-one drag below rest as an implementation gap.
  • R2 research in the record: none. DEC-24 keeps its reasons as two sentences inside the decision.
  • R3 evidence naming a change: none. FR43's verification rows name the behaviors and engines tested.
  • R4 rejected alternatives over one line or outside a decision: two, each one line inside its decision (DEC-24, DEC-23).
  • R5 pull request or issue references remaining: none in the record.
  • R6 ruled open questions still listing options: none touched.

Scope

  • This PR contains specification records only.
  • It records observable behavior and preserves equivalent internal implementations.
  • Any named internal mechanism is intentionally public, names its dependent caller/system, and explains why an equivalent implementation would not satisfy the contract.
  • Verification states the evidence layer and failure signal without prescribing CI job/workflow topology.
  • It records one intentional durable decision, not a rescue for a separable tagalong.
  • The canonical knowledge owner, affected current claims, and overlapping open work are named; any ownership collision is resolved or called out for human decision.
  • Adjacent API, visual, accessibility, composition, and implementation facts remain outside scope unless this exact decision depends on them.
  • Public text and artifacts contain no internal Meta context.

Validation

Local gates at a0bf771: pnpm check:knowledge (records aligned), Prettier, git diff --check, and pnpm check:repo.

@vercel

vercel Bot commented Oct 29, 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 31, 2026 10:37pm UTC

Request Review

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

astracat-bot Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI review status for this pull request.

Review status Updated
🔄 In progress (for maintainers only) Oct 31, 2026, 10:30 PM UTC

@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 pull request changes normative text in the current spec:AST-094 record (FR43's thumb exception, DEC-23 and the new FR43 verification state), so approval waits on an engineering owner deciding whether a control's thumb, such as Slider's, takes no wheel or trackpad scroll. Any engineering owner, including the author, records that decision by commenting /approve-spec 9c7dc36a12edce1529dfcc7ef82580a93522b839 on this pull request. Two small fixes in the same record are also needed:

  • FR43's verification row adds the slider-thumb state but names no failure for it, such as a wheel or trackpad scroll over a control's thumb that changes its value or does not reach the scroll under it.
  • DEC-23 should say it narrows DEC-21's wheel and trackpad mapping for a pan, and "stays the page's" would read more precisely as the native scroll under the thumb.

[Automated review]

| FR41 | Browser tests with real touch input (`spec:AST-013` FR10) | a tap; a long press on a ContextMenu trigger, a DropdownMenu trigger the caller renders, a row with a context menu, and a slider thumb; a long press on a checkbox row's label and on plain text; a cancelled press; mouse and keyboard selection; a pen long press; a mouse long press, which makes no context request | a tap that selects, a hold with an action that starts a selection or callout, a label or plain text whose long press does not select natively, a suppression that outlives the press, or a change to native selection elsewhere or to mouse, keyboard, or assistive-technology selection fails |
| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing between adjacent targets | every component at phone width with a finger and with a mouse; a dense toolbar; a chip and its remove button; a Switch beside a label link | a default-theme box that grows under touch or at phone width other than with its text, or, where no component or module record sets the hit area, a touch target under 44 px where neighbors allow it or a hit area that overlaps a neighbor's target, fails |
| FR43 | Browser tests with a mouse, a trackpad, a pen, a finger, and the keyboard, and resource counts | a pan by drag and by wheel; a ctrl-wheel pinch; a long press, a right click, and Shift+F10; a mouse press; a handle drag; a row swipe with a mouse and a trackpad; a component with no gesture | a gesture missing under a mouse or pen, a mouse-drag swipe action, a pen pinch, an edge pan under a mouse, a trackpad, or a pen, a press delay under a fine pointer, an idle listener in a component with no gesture, or added stylesheet bytes, fails |
| FR43 | Browser tests with a mouse, a trackpad, a pen, a finger, and the keyboard, and resource counts | a pan by drag and by wheel; a slider's thumb under a wheel and a trackpad scroll; a ctrl-wheel pinch; a long press, a right click, and Shift+F10; a mouse press; a handle drag; a row swipe with a mouse and a trackpad; a component with no gesture | a gesture missing under a mouse or pen, a mouse-drag swipe action, a pen pinch, an edge pan under a mouse, a trackpad, or a pen, a press delay under a fine pointer, an idle listener in a component with no gesture, or added stylesheet bytes, 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.

The new state has no failure entry. The row names a failure for each of FR43's other gesture exceptions, but none for a thumb whose value moves under a scroll, and "a gesture missing under a mouse or pen" can be read as failing the intended no-wheel thumb. Consider adding "a wheel or trackpad scroll over a control's thumb that changes its value, or that does not reach the scroll under it" to the failure column.

neighbor's target. On the web, a pan also
takes wheel and trackpad scrolling; a pinch takes a ctrl-wheel; one shared
takes wheel and trackpad scrolling, except a control's thumb, such as a
slider's, which takes none, so a scroll over it stays the page's (DEC-23);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

"stays the page's" reads loosely for a slider inside a scrolling sheet, which hands its wheel to that sheet first (AST-025 FR14). "Goes to the scroll under it" would say what is meant.

retuning, which a theme does through the knobs; DEC-11's rejected alternative, public
per-component roles, stays rejected.

### DEC-23 — A control's thumb takes no wheel

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

DEC-21 still maps "wheel and trackpad scrolling for a pan" with no exception. One sentence here, such as "This narrows DEC-21's wheel and trackpad mapping for a pan", keeps the two decisions consistent, the way DEC-15 names DEC-11.

@cixzhang

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf.

Current records already decide this, so it can be approved once DEC-23 cites its basis. As written, FR43 would let a page scroll passing over a slider change its value. That would be a fine-pointer behavior change nobody decided: spec:AST-017 FR59 and AST-094 FR41 keep released mouse behavior, and native parity points the same way (AST-094 DEC-1; a native range input ignores the wheel). Please:

  • have DEC-23 cite AST-017 FR59 and AST-094 DEC-1 as its basis, and record it as a consistency decision;
  • keep "a control's thumb" scoped to thumbs that set a value (Slider, and the Switch thumb if it pans), as the non-goals say.

@vjeux

vjeux commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Done in ddadeef: DEC-23 now records itself as a consistency decision on spec:AST-017 FR59 (with FR41) and DEC-1, and FR43's exception covers only a thumb that sets a value: a slider's, or a switch's where it pans. The same push takes the review bot's three points: FR43's verification row names the failure, DEC-23 says it narrows DEC-21, and a scroll over the thumb goes to the scroll under it.

@vjeux vjeux changed the title spec(AST-094): a control's thumb takes no wheel or trackpad scroll (FR43) spec(AST-094): a thumb that sets a value takes no wheel or trackpad scroll (FR43) Oct 29, 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.

Approval of this pull request waits on an engineering owner: it changes normative text in the current spec:AST-094 record (FR43's exception for a thumb that sets a value, DEC-23 and the new FR43 verification state), and no exact-head spec-owner approval exists yet. Any engineering owner, including the author, records that decision by commenting /approve-spec <full head SHA> with the full SHA of the head they approve, and a new commit needs a new approval. One fix in the same record is still needed, so making it first saves an approval round:

  • DEC-23's "(spec:AST-017 FR59, FR41)" reads, in this record's citation style, as AST-017's FR41 (release artifacts); "(spec:AST-017 FR59; FR41)" cites AST-094 FR41 as intended.

[Automated review]

A consistency decision: a thumb that sets a value, a slider's or a switch's
where it pans, takes no wheel or trackpad scroll, so a scroll over it goes to
the scroll under it and never changes the value (FR43). Touch work keeps
released mouse behavior (`spec:AST-017` FR59, FR41), and a native range input

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In this record a claim list after another record's id belongs to that record (FR43's spec:AST-057 AR2, DEC-7; FR25's spec:AST-017 DEC-23 and FR3), so this cites AST-017's FR41, "Release artifacts use closed schemas and invent no fields", rather than AST-094 FR41. FR41 itself switches back with a semicolon, as in its own spec:AST-017 FR59; DEC-9:

Suggested change
released mouse behavior (`spec:AST-017` FR59, FR41), and a native range input
released mouse behavior (`spec:AST-017` FR59; FR41), and a native range input

@vjeux
vjeux marked this pull request as draft October 29, 2026 22:40
@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Oct 31, 2026
…R43, DEC-23)

FR43 gives every pan wheel and trackpad scrolling, with no exception, so a
slider's thumb, which tracks a drag through a pan, would read a page scroll
passing over it as a change of value. FR43 now excepts a control's thumb:
a scroll over it stays the page's. DEC-23 records why, and FR43's
verification row names the case. meta#8669 is the implementation.
vjeux and others added 4 commits October 31, 2026 15:27
…nd a scroll goes to the scroll under the thumb

FR43's verification row names the failure for its new state: a scroll over
a control's thumb that changes its value or does not reach the scroll under
it. DEC-23 says it narrows DEC-21's wheel and trackpad mapping for a pan.
A scroll over the thumb goes to the scroll under it, which inside a
scrolling sheet is the sheet, not the page.
…EC-1, scoped to a thumb that sets a value

DEC-23 cites its basis: touch work keeps released mouse behavior
(spec:AST-017 FR59, FR41), and a native range input ignores the wheel
(DEC-1). FR43's exception and DEC-23 cover only a thumb that sets a value,
a slider's or a switch's where it pans.
…itter reads the trackpad's phases (FR43, DEC-24)

Sheets share touch's rubber band on form and required sheets, the pager
moves at most one page per swipe, and a row follows the fingers and only
closes within one gesture.
@vjeux
vjeux force-pushed the spec/ast-094-control-thumb-no-wheel branch from 519bc3e to a0bf771 Compare October 31, 2026 22:30
@cixzhang

Copy link
Copy Markdown
Contributor

/approve-spec a0bf771

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Oct 31, 2026
@cixzhang cixzhang added the ci:run A maintainer lets this outside contributor's pull request run CI (AST-030 FR17) label Oct 31, 2026
@cixzhang
cixzhang marked this pull request as ready for review October 31, 2026 22:34
@cixzhang
cixzhang merged commit bea4846 into meta:main Oct 31, 2026
86 checks passed
@vjeux
vjeux deleted the spec/ast-094-control-thumb-no-wheel branch October 31, 2026 22:55

This branch was successfully deployed

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

Labels

ci:run A maintainer lets this outside contributor's pull request run CI (AST-030 FR17) CLA Signed This label is managed by the Meta Open Source bot.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants