Repository navigation
Conversation
startCompositorTrace keeps every Display::FrameDisplayed in the browser, and those events carry no page identity: with a second page animating, a stall inside the block passed busyWindowProof with presented, crediting the other page's frames. It now throws when another page is open as it starts or stops, and says the record is browser-wide (JSDoc and README). Negative control: another animating page makes it refuse to start, and a page opened mid-trace makes stop() refuse.
A bare relative ASTRYX_WEBKIT_SHADER_CACHE was mounted as a named volume instead of a host directory, and an empty one made mkdirSync throw. The script now resolves a set value with path.resolve and falls back to the default cache directory on an empty one.
… path) into the recorder stand-down # Conflicts: # internal/interaction-harness/src/harness.interaction.browser.spec.ts
…ce; await it before the counted window The README, waitForRest's JSDoc and traceRendering's JSDoc said a traced waitForRest reads no style. Its one read of the element's animations, as it is called, restyles the element when an animation is already running there (2 Layouts and 2 style recalculations in the anchored fixture, 200 ms into its animation). They now say so and tell a proof to await it right after the action that starts the motion, before the window it counts.
Under Reduce Motion, detaching mid-dip landed the waiting move in the model at the end of the task, but with no element attached the landing wrote nothing, so a call that owns its opacity left its dip's low opacity inline on that node: attaching the same node again in a later task (a Suspense or Activity reveal) showed it at opacity 0. The unmount's landing now writes to the node just detached, as dispose() does to its element. The test fails on the previous head. (Found on meta#8067; fixed here because meta#8056, which carries the planner, is approved at its exact head.)
…element support
… against its span In WebKit the rAF negative control could read "1/1 moved": one frame from before the block arrived 45 ms into it, and the moved criterion divided by the delivered frames. A part that delivered fewer than minJudgedFrames frames is now judged against its span, as one that delivered none was (busy.test.ts case; it fails on the previous rule). The README and the self-test header now say only the busy-main-thread proof carries a negative control beside its positive check.
…into n8548 # Conflicts: # internal/interaction-harness/README.md
The lock moved to utils/selectionLock.ts with the shared input stream, and stacks based below that move import it from gestures/selectionLock.ts; a tree carrying both failed to typecheck. The case imports the old path and expects the utils module's functions. Fails on this head.
…rom utils
A one-line transition re-export at gestures/selectionLock.ts keeps
`import {lockSelection} from '../gestures/selectionLock'` working for the
stacks based below the move to utils, so a tree that carries both
typechecks. Remove it once they have moved up.
…line) as a dependency
A watcher already adds nothing to the derived touch-action, and manageStyle is per element, so attaching one with manageStyle: false beside a claiming recognizer switched off that recognizer's touch-action (spec:AST-094 FR18). The README now says a watcher adds nothing instead. Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
…l, straight or diagonal, and not before spec:AST-094 FR20's verification names a finger moved 9 px and 10 px straight, and (7, 7) and (8, 8) diagonally: a scroll above the touch takes it only once the finger has travelled 10 px from where it landed. The host already measures that distance; these cases pin the boundary.
…g running Landing a waiting Reduce Motion move on the node just detached rebuilt every channel the landing touched there, so an axis still moving (a coast on y while x waited in a dip) was baked onto the detached node again and promoted it, leaving an animation, timers and will-change behind. After the landing, the unmount now cancels what runs, clears the retire timers and demotes, before the target goes back to none. The test fails on the previous head.
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
…'s tracked actions to its tracker) onto F2's line (meta#8360 777ff9a) Conflicts, doc text only, in utils/pressFeedback.ts and its test: the header keeps the line's selection-lock and touchcancel paragraphs, then the group-item paragraph, and lists the group-item exports; the test imports both sides' names.
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
…77ff9a) into the AlertDialog tracking base
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
The document press controller painted AlertDialog's actions on its own clock beside the group's tracker, so AlertDialog took them off the controller by overriding Button's pressable marker, which also took them off the scroll brake. Each tracked action now renders the shared group item marker (`pressGroupItemProps`, meta#8637) from its first render: the controller leaves a pointer's press there to the tracker, the one painter, and still records the touch. The marker is also the tracker's item selector, so the actions are named once. The inline preview is not tracked and keeps the controller's press. The selection lock is imported from utils/selectionLock, its home since meta#8356; the gestures path is a transition re-export. The unit case checks both markers on the open alert (fails on the previous head: no group item marker) and neither group marker in the inline preview.
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
…'s tracked actions to its tracker) onto F2's line (meta#8360 df700c4) Conflicts, doc text only, in utils/pressFeedback.ts and its test: the header keeps the line's selection-lock and touchcancel paragraphs, then the group-item paragraph, and lists the group-item exports; the test imports both sides' names.
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
…'s tracked actions to its tracker) onto F2's fZ (meta#8360 23ade34) Conflicts, doc text only, in utils/pressFeedback.ts and its test: the header keeps the line's selection-lock and touchcancel paragraphs, then the group-item paragraph, and lists the group-item exports; the test imports both sides' names.
vjeux
force-pushed
the
uikit/c01-press-group-skip
branch
from
November 3, 2026 22:59
ed3d750 to
071ae26
Compare
Contributor
There was a problem hiding this comment.
Changes requested: the press-group marker this pull request adds is already on main, so the branch needs a rebase that will most likely leave nothing to land.
mainalready owns the marker inprivateAttributes/pressGroupItem.stylex.ts(from #8083 and #9771), and this branch's copy inutils/pressFeedback.tsconflicts withmainin all three of its own files.- The mouse skip in
buttonSurfaceAt(pressFeedback.ts:480-482, pinned bypressFeedback.test.ts:600-608) leaves a mouse press on a marked action unpainted where the primary pointer is coarse, againstfamily:action-groupsFR1 and FR5, which keep the group's tracker to a finger and a pen. - The diff carries 26,918 authored lines, 26,783 of them the #8360/#8076 stack, with no size exemption, and that stack has since landed on
main. - The carried stack contradicts current spec in places
mainhas already fixed:GestureHostattaches only under a coarse primary pointer (AST-094 FR19/FR43, react-component-runtime INV13),PressTrackeris a class (INV13), a DropdownMenu trigger keeps 10 px of drift on a fine primary pointer (useMenuPress FR9), anduseFingerScrollcopiesuseAttachmentinstead of calling it.
Rebase onto main, keep only what main lacks, and close the pull request if nothing remains.
[Automated review]
| @@ -344,6 +475,11 @@ function buttonSurfaceAt( | |||
| if (pointerId == null && element !== target) { | |||
| return null; | |||
| } | |||
| // A group's tracker paints a pointer's press on its actions, a mouse's too; | |||
| // a key's press is the action's own. | |||
| if (pointerId != null && trackedByGroup(element)) { | |||
Contributor
There was a problem hiding this comment.
On a phone or tablet this leaves a mouse press on a marked action unpainted: :active is dropped there, and under family:action-groups FR1 and FR5 no group tracker follows a mouse. main has the mark name the pointers its tracker follows (pressGroupItemProps(['touch', 'pen'])) and skips only those.
| * it, and the controller paints none there. The owner renders it on each | ||
| * action its tracker follows, so it is in place before the first press. | ||
| */ | ||
| export const PRESS_GROUP_ITEM_ATTRIBUTE = 'data-astryx-press-group-item'; |
Contributor
Contributor
Author
vjeux
added a commit
to vjeux/astryx
that referenced
this pull request
Nov 3, 2026
… the meta#8637 helper on fZ)
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Review this PR alone: vjeux/astryx@uikit/f2-click-guard...uikit/c01-press-group-skip
Maintainer impact
Part of the UIKit-parity work: in a group of sibling actions (an alert's buttons, a button group, a toggle group) you can press one and slide to another, as on iOS (
family:action-groups, from #8622). The group's own tracker paints the press on the action under the pointer. The page-wide press controller paints the same buttons, so the two erase each other: the controller's release fade wipes the group's highlight, and the button you started on stays lit beside the one you slid to.Intended invariant
One painter per press. The controller already calls itself the one writer of the press attribute; a group takes that role only for the actions it tracks.
Change
What led to it: building the group tracking for AlertDialog and ButtonGroup showed the double paint.
data-astryx-press-group-item), and the controller paints nothing on a marked action. The mark is there before the first press, and the group can use the same attribute to find its actions.The controller still records the touch on a marked action, so a scroll it starts still brakes the next touch. Where the primary pointer is coarse the controller also paints a mouse press itself (#8046); on a marked action it leaves that to the group too, while a Space press, which the group doesn't track, still paints. No component renders the marker yet: nothing changes until each group adopts it (#8083, #8657, #8660).
Evidence
packages/core/src/utils/pressFeedback.test.ts, six new cases (below).Scope
utils/pressFeedback.tsis internal: it is not on a published entry point.Testing
Nothing to check by hand yet: no component carries the marker.
What was run: six new unit tests. The controller paints nothing on a marked action and leaves the group's paint alone, for a finger and for a mouse on a touch-first device; those fail without this change. It still paints an unmarked member, which fails if the skip checks group membership instead of the mark, and a Space press on a marked action. It still records the touch for the scroll brake, which fails if the skip comes first. Typecheck, lint, the core unit suite and the press accessibility tests pass locally; GitHub Actions isn't running on this repository right now.
Stack: on #8360, which carries #8076. The adoptions (#8083, #8657, #8660) stack on this pull request.