Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1008 commits
Select commit Hold shift + click to select a range
e71ad6a
Merge c4bc6f8f70 (#8071: the FR23 disabled-control haptic fix) as a d…
cixzhang Oct 26, 2026
acbf411
Merge 51a0d3cca9 (main) as a dependency
cixzhang Oct 26, 2026
a4974f3
Merge e8383d0ab8 (#8089 and #8110) as a dependency
vjeux Oct 26, 2026
a1813b9
Merge #8072 (acbf411a: #8071 c4bc6f8f, the FR23 haptic fix, and main)…
cixzhang Oct 26, 2026
61e891d
fix(core): the gesture host watches the pointer kind only while somet…
cixzhang Oct 26, 2026
1b0840d
fix(core): attach leaves nothing behind on the element it leaves
cixzhang Oct 26, 2026
ff2816f
Merge 1b0840de8d (#8056: two attach fixes) as a dependency
cixzhang Oct 26, 2026
c635439
Merge 822e364237 (main) as a dependency
cixzhang Oct 26, 2026
ab26ff4
build(core): Lab reaches no core-private hook path
vjeux Oct 26, 2026
5f88ff5
test(DropdownMenu): a fine primary pointer joins no gesture system, a…
vjeux Oct 26, 2026
24375fd
Merge 5f88ff5407 (#8195) as a dependency
vjeux Oct 26, 2026
c34bf73
fix(gestures): the hooks follow a replaced node, name what each Effec…
cixzhang Oct 26, 2026
1c0162b
test(core): the @experimental guard leaves the public utils entry alone
vjeux Oct 26, 2026
92bc9c2
fix(interaction): a finish read before its event goes through the rat…
cixzhang Oct 26, 2026
8a8ac32
Merge #8072 (61e891d7: the pointer-kind listener only while something…
cixzhang Oct 26, 2026
5e41033
fix(motion): a running dip survives every attach, and an opacity the …
cixzhang Oct 26, 2026
7ee6305
Merge #8055 (5e410334: a running borrowed dip survives any attach; an…
cixzhang Oct 26, 2026
66d1919
fix(interaction): a traced waitForRest waits for a run going backward…
vjeux Oct 26, 2026
225e202
Merge main (#8494: the scroll-to-top Reduce Motion note; #8488: AST-0…
cixzhang Oct 26, 2026
63c3eb8
Merge main (3ab7f32d: the scroll-to-top note's Reduce Motion wording)…
vjeux Oct 26, 2026
8c0dbf1
Merge main (3ab7f32d: the scroll-to-top note's Reduce Motion wording)…
vjeux Oct 26, 2026
bfcb164
Merge 225e202f0b (#8056 on #8055's 5e410334 with main through #8494) …
cixzhang Oct 26, 2026
d5ae22d
test(core): the press release pin compares the curve the overlay ships
vjeux Oct 26, 2026
475b34e
docs(core): the gestures README names the presentation hook that exists
vjeux Oct 26, 2026
66edc03
Merge #8073 (95daacd3: touch-action only on a coarse pointer through …
vjeux Oct 26, 2026
a2ac6f9
fix(interaction): waitForRest waits out a backward run's end delay an…
cixzhang Oct 26, 2026
d019124
Merge main (3ab7f32d: #8494's scroll-to-top note, #8488) into the ani…
cixzhang Oct 26, 2026
f05cb57
fix(core): an unmount lands a waiting Reduce Motion move where it was…
cixzhang Oct 26, 2026
0e62702
Merge f05cb5782e (#8056: an unmount mid-dip keeps the landing's trave…
cixzhang Oct 26, 2026
9cf13e1
test(gestures): a recognizer locks selection only for a touch it takes
vjeux Oct 26, 2026
eba1f64
fix(gestures): the host locks selection once the arena has admitted t…
vjeux Oct 26, 2026
60a00f8
Merge #8076 (66edc03ec9: main through 3ab7f32dbe, #8073 95daacd382) i…
vjeux Oct 26, 2026
b61f1ff
Merge main (61480b5c: #8257, the motion roles internal, DEC-11) into …
cixzhang Oct 26, 2026
e5fc2af
refactor(core): the press paint registry leaves this PR for its first…
vjeux Oct 26, 2026
1e242be
fix(interaction): a rendering trace reports DevTools-run tasks apart …
vjeux Oct 26, 2026
9d39d7d
fix(motion): a motion role plays its table value while touch motion s…
cixzhang Oct 26, 2026
ab1afb2
Merge commit '1e242bed3ff02263f58be1488898c799b8cd6957' into uikit/f3…
vjeux Oct 26, 2026
4adaf8b
Merge #8258 (9d39d7d9: main 61480b5c with #8257; a motion role plays …
vjeux Oct 26, 2026
60a3ceb
test(gestures): real-touch proofs that the host attaches only what a …
vjeux Oct 26, 2026
72fc655
Merge #8270 (#8076 66edc03ec9; the lock after admission; the real-tou…
vjeux Oct 26, 2026
1d3b474
Merge 4adaf8b77e (#8076) as a dependency
vjeux Oct 26, 2026
d98da28
Merge ab1afb24d9 (#8446) as a dependency
vjeux Oct 26, 2026
7e46c17
Merge #8076 (4adaf8b77e: main through 21cab0e6fc with the #8257 squas…
vjeux Oct 26, 2026
7556a07
refactor(useMenuPress): the continuation of a pointer that went down …
vjeux Oct 26, 2026
8c95cf7
refactor(DropdownMenu): a cancelled finger's row clear moves to its o…
vjeux Oct 26, 2026
a864b1d
Merge 8c95cf7f26 (#8078) as a dependency
vjeux Oct 26, 2026
c80a867
chore(DropdownMenu): the menu table's values are read directly; nothi…
vjeux Oct 26, 2026
3f2e312
Merge c80a8672ba (#8080) as a dependency
vjeux Oct 26, 2026
de79db3
Merge #8270 (#8076 4adaf8b77e) into #8309
vjeux Oct 26, 2026
ab02b27
fix(core): a pseudo-element's Reduce Motion dip borrows and hands bac…
cixzhang Oct 26, 2026
4874db4
docs(motion): the scroll-to-top note keeps main's wording: a tap-star…
cixzhang Oct 26, 2026
8c8d6f5
Merge ab02b27689 (#8056: the pseudo-element Reduce Motion fix) as a d…
cixzhang Oct 26, 2026
d6ec454
feat(DropdownMenu): a resting finger near a scrolling menu's edge aut…
cixzhang Oct 26, 2026
02bda5a
test(gestures): attaching reads no computed style
vjeux Oct 26, 2026
1ba08fd
perf(gestures): attaching reads no computed style
vjeux Oct 26, 2026
3d201a0
Merge main (#8257: the touch motion roles are internal) into the moti…
cixzhang Oct 26, 2026
f581948
Merge 3d201a04ee (#8056 with main through #8257's landing) as a depen…
cixzhang Oct 26, 2026
8cd46df
docs(motion): the animator, README, reducedMotionFade and the browser…
cixzhang Oct 26, 2026
54561a1
Merge #8067 (f581948d) into the motion-role animator
cixzhang Oct 26, 2026
58cd32c
fix(DropdownMenu): a cancelled touch clears the row a finger lit, in …
vjeux Oct 26, 2026
1e1b7bd
fix(motion): a hidden element lends no borrow, and a stop that finish…
cixzhang Oct 26, 2026
efdffbe
refactor(interaction): the animation-state waits move to their own pu…
cixzhang Oct 26, 2026
c833823
feat(interaction): animation-state waits for interaction proofs
cixzhang Oct 26, 2026
89614c7
Merge main (2af4d305: #8257, the motion roles internal) into the anim…
cixzhang Oct 26, 2026
bd9246d
Merge main (2af4d305) into the experimental touch layer
cixzhang Oct 26, 2026
5d9e4ec
Merge #8055 (89614c7f: a hidden element lends no borrow; a stop that …
cixzhang Oct 26, 2026
7b26ef2
Merge 5d9e4ec203 (#8056 on #8055's 89614c7f with a pseudo-element fix…
cixzhang Oct 26, 2026
b61b264
docs(motion): coast's edge spring plays its table value; scroll.bounc…
cixzhang Oct 26, 2026
4051fac
Merge #8073 (8a8ac32170: the hooks follow a replaced node and name th…
vjeux Oct 26, 2026
370c4d9
Merge #8067 (7b26ef27: #8056 5d9e4ec2, #8055 89614c7f) into the motio…
cixzhang Oct 26, 2026
df83bad
fix(core): the action-group tracker lets an activation with detail 0 …
vjeux Oct 26, 2026
e084460
Merge bd9246df2e (#8076 with main) as a dependency
cixzhang Oct 26, 2026
3ccbd7a
test(core): drop the delegated-pressable selection case; the host no …
cixzhang Oct 26, 2026
29ae0da
refactor(AlertDialog): the action group reads the press row, not the …
vjeux Oct 26, 2026
b2fe2a3
Merge #8076 (bd9246df2e: main 2af4d305a6) into #8270
vjeux Oct 26, 2026
25bf6c7
Merge #8270 (#8076 bd9246df2e) into #8309
vjeux Oct 26, 2026
0b38f82
Merge cixzhang's #8309 head (3ccbd7a2ab: #8076 bd9246df2e merged in, …
vjeux Oct 26, 2026
0325b2e
test(gestures): the gesture host bundles only the UIKit groups it reads
vjeux Oct 26, 2026
7798802
perf(gestures): the gesture host imports only the press and click groups
vjeux Oct 26, 2026
7f48c36
perf(core): the gesture host reads the haptic switch's marker from a …
cixzhang Oct 26, 2026
15c71e1
fix(motion): a release past an edge springs back as a Reduce Motion c…
cixzhang Oct 26, 2026
2bcd5b2
docs(interaction): the waits read a run reversed before it starts; a …
cixzhang Oct 26, 2026
3c0d8a0
Merge #8055 (15c71e1f: under Reduce Motion a coast's spring back is a…
cixzhang Oct 26, 2026
e8b0bb6
Merge main (#8044 landed) into the animation-state waits
cixzhang Oct 26, 2026
2c57208
Merge #8258 (370c4d9e: the roles' table values in the docs; #8067 thr…
vjeux Oct 26, 2026
b5931a5
Merge cixzhang's #8309 head (7f48c369b5: the haptic switch marker in …
vjeux Oct 26, 2026
1e5d0f4
refactor(core): the plan's stop needs no step-segment landing; the st…
cixzhang Oct 26, 2026
16d3f24
Merge 1e5d0f4f98 (#8056: the dead stop() step-segment block removed) …
cixzhang Oct 26, 2026
4eac57c
Merge #8505 (e8b0bb62: main with #8044, plus the animation-state wait…
cixzhang Oct 26, 2026
347f0ac
fix(core): a finger on page content reaches tracking recognizers as b…
cixzhang Oct 26, 2026
b600a78
Merge #8072 (347f0aca: FR28 began-elsewhere for untracked fingers, FR…
cixzhang Oct 26, 2026
772a4b5
Merge #8348 (main with #8044 and #8505's waits) into the frame evidence
cixzhang Oct 26, 2026
297f938
docs(DropdownMenu): drop the proposed FR21 rows from this pull request
cixzhang Oct 26, 2026
7d946d2
Merge #8045 (main with #8044 and #8505's waits) into the recorder sta…
cixzhang Oct 26, 2026
ee34b25
Merge #8446 (7d946d25: the harness line on main with #8505's waits) i…
cixzhang Oct 26, 2026
355a456
Merge 7d946d259b (#8446 resolved against main, #8044 landed) as a dep…
cixzhang Oct 26, 2026
c4412ab
Merge 5b691cda71 (main) as a dependency
cixzhang Oct 26, 2026
effe685
docs(motion): decay's docs and the changeset say a transition curve c…
cixzhang Oct 26, 2026
6da19c0
Merge ee34b25079 (#8076 with the resolved harness line, #8446 7d946d2…
cixzhang Oct 26, 2026
dd8e946
Merge 5b691cda71 (main) as a dependency
cixzhang Oct 26, 2026
75f0d8b
Merge #8270 (#8076 ee34b25079: main 4444d70bd7) into #8309
vjeux Oct 26, 2026
c0215ae
Merge #8076 (ee34b25079: main 4444d70bd7 with #8505's waits, through …
vjeux Oct 26, 2026
66232e6
Merge #8073 and #8258 (2c572082: #8073's hooks follow a replaced node…
vjeux Oct 26, 2026
0d1a829
Merge #8073 (b600a78a: began-elsewhere for untracked fingers and a re…
vjeux Oct 26, 2026
571f088
fix(interaction): openStory turns Storybook's highlight module off
vjeux Oct 26, 2026
4c41132
fix(interaction): a trace sets apart only the harness's own reads, ne…
vjeux Oct 26, 2026
2665e5a
Merge #8270 (the host header and changeset without delegated consumer…
vjeux Oct 26, 2026
dc7a77c
docs(core): the host header and the press changeset describe no deleg…
vjeux Oct 26, 2026
9320644
fix(interaction): a wait keeps waiting while the action's animation i…
cixzhang Oct 26, 2026
6d4977d
Merge main (5b691cda71) into the one-tracker branch
vjeux Oct 26, 2026
7ad0455
fix(motion): a held identity follows a node replacement, a mixed rele…
cixzhang Oct 26, 2026
156e4b3
test(interaction): openStory's highlight self-test runs in both engines
vjeux Oct 26, 2026
f60e87d
Merge #8055 (7ad0455a: held identities follow a node replacement; one…
cixzhang Oct 26, 2026
6eb2193
Merge f60e87d2cd (#8056 on #8055's 7ad0455a: held identities across a…
cixzhang Oct 26, 2026
86ac77d
Merge 79a7a902b8 (main) as a dependency
cixzhang Oct 26, 2026
a2ea848
Merge #8270 (main 5b691cda71) into #8309
vjeux Oct 26, 2026
50f39fb
Merge cixzhang's #8309 head (dd8e9462f5: #8076 ee34b25079 and main 5b…
vjeux Oct 26, 2026
d0200c3
Merge main (5b691cda71) into #8270, as cixzhang's #8309 does
vjeux Oct 26, 2026
9d5c20a
fix(interaction): a traced waitForRest skips scroll- and view-timelin…
cixzhang Oct 26, 2026
b4234d7
Merge #8505 (9320644717: a wait keeps waiting while the action's anim…
vjeux Oct 26, 2026
cb907b7
fix(interaction): the busy verdict judges a sparse cast from its firs…
vjeux Oct 26, 2026
462d82c
fix(interaction): a scroll- or view-timeline animation does not hold …
cixzhang Oct 26, 2026
8fc7f2e
docs(motion): the animator's SYNC list and test header name only file…
cixzhang Oct 26, 2026
0543b78
Merge #8446 (9d5c20a8: the harness line on #8505's waits) into useAni…
vjeux Oct 26, 2026
79dc151
Merge #8055 (8fc7f2ef: coast says a transition lands at once on a fin…
cixzhang Oct 26, 2026
1fde85a
docs(core): the gestures README says a cell's highlight waits only in…
vjeux Oct 26, 2026
a4b10f9
Merge 79dc151e53 (#8056 on #8055's 8fc7f2ef: the Reduce Motion change…
cixzhang Oct 26, 2026
1fe597d
refactor(core): the animator's Reduce Motion planner is its own module
cixzhang Oct 26, 2026
b33685a
refactor(core): play(curves) and pseudo-element support move to stack…
cixzhang Oct 26, 2026
fa62e29
feat(core): the animator plays any closed-form curve
cixzhang Oct 26, 2026
2cb04fe
feat(core): the animator drives a pseudo-element
cixzhang Oct 26, 2026
803e6d6
test(interaction): the long-task self-test judges the harness read, n…
vjeux Oct 26, 2026
fa8c8e2
Merge #8505 (462d82caaf: a scroll- or view-timeline animation does no…
vjeux Oct 26, 2026
1ffb20e
Merge branch 'interaction-harness-3-frames' into uikit/f3-recorder-st…
vjeux Oct 26, 2026
a9be409
fix(interaction): a scroll-driven animation at its end is not a finis…
cixzhang Oct 26, 2026
c2bc85e
Merge 2cb04fe6f6 (#8522, the top of #8056's split: core, play(curves)…
cixzhang Oct 26, 2026
c97ab3d
Merge f1b4c05434 (main) as a dependency
cixzhang Oct 26, 2026
c84803b
Merge #8505 (a9be409b35: a scroll-driven animation at its end is not …
vjeux Oct 26, 2026
84ea877
Merge main (30a4a2b3: #8055 landed) into the animator's Reduce Motion…
cixzhang Oct 26, 2026
3cb158a
Merge #8056 (main with #8055 landed) into play(curves)
cixzhang Oct 26, 2026
f0819b9
Merge #8521 (main with #8055 landed) into pseudo-element support
cixzhang Oct 26, 2026
f9f1162
Merge f0819b956e (#8522 with main through #8055's landing) as a depen…
cixzhang Oct 26, 2026
dcfecc9
Merge #8067 (f9f1162c: #8522, main through #8055) into the motion-rol…
cixzhang Oct 26, 2026
2267ee5
Merge #8258 (dcfecc93: #8067 f9f1162c, main through #8055) into the e…
cixzhang Oct 26, 2026
24336ad
Merge 2267ee5154 (#8076 with main through #8055's landing, via #8067 …
cixzhang Oct 26, 2026
739aa81
Merge dbcfc30f7a (main) as a dependency
cixzhang Oct 26, 2026
09aa3f1
Merge #8076 (2267ee5154: #8073's fold with her b600a78a, main through…
vjeux Oct 26, 2026
1346af4
docs(core): the gestures README gives a control's release the shared …
vjeux Oct 26, 2026
02ff48f
fix(interaction): a watch stamps after the newest entry, and an exit …
cixzhang Oct 26, 2026
a9208c4
test(core): the FR30 own-scroll case moves its finger past the press …
cixzhang Oct 26, 2026
528dd2d
fix(interaction): after an on-screen start, the busy verdict judges t…
vjeux Oct 26, 2026
e05cdd1
Merge #8505 (02ff48fafe: a watch stamps after the newest entry, and a…
vjeux Oct 26, 2026
b693ff2
Merge 2267ee5154 (#8076) as a dependency
vjeux Oct 26, 2026
50697cc
Merge c84803b440 (#8446) as a dependency
vjeux Oct 26, 2026
005b6b5
refactor(useMenuPress): the public hook's FR29 default moves to its o…
vjeux Oct 26, 2026
58f0205
docs(useMenuPress): the measurement rows and comments name only what …
vjeux Oct 26, 2026
4a2ec3c
Merge 58f0205757 (#8078) as a dependency
vjeux Oct 26, 2026
36fd673
test(DropdownMenu): a second finger, like a cancelled touch, clears t…
vjeux Oct 26, 2026
736f9d5
Merge 58f0205757 (#8078) as a dependency
vjeux Oct 26, 2026
ece296b
Merge 736f9d58e7 (#8080) as a dependency
vjeux Oct 26, 2026
56f94c8
Merge 36fd6734e7 (#8508) into ece296b957 (#8089)
vjeux Oct 26, 2026
80104ff
Merge #8270 (09aa3f1883) into #8083
vjeux Oct 26, 2026
dd24577
Merge #8083 (80104ffe93: UIKIT_PRESS and #8270 09aa3f1883) into #8084
vjeux Oct 26, 2026
20224d1
refactor(AlertDialog): import the alert's two spring rows, not the wh…
vjeux Oct 26, 2026
d1b07a4
Merge #8045 (e05cdd163a, on #8505 02ff48fafe) into the recorder stand…
vjeux Oct 26, 2026
595b5c3
Merge #8076 (1346af4990: the README's control release and test list, …
vjeux Oct 26, 2026
14e78e0
Merge #8270 (09aa3f1883 with #8076 1346af4990: the README's control r…
vjeux Oct 26, 2026
51688cd
fix(interaction): waitForAnimation and a watch's started() stand down…
vjeux Oct 26, 2026
3ebfa58
Merge 20224d1b80 (#8084) as a dependency
vjeux Oct 26, 2026
356c276
Merge 6d4977daba (#8346) as a dependency
vjeux Oct 26, 2026
88468d0
Merge 356c2766a1 (#8110) as a dependency
vjeux Oct 26, 2026
93c611d
Merge main (#8505 landed) into the storyboards
cixzhang Oct 26, 2026
79aa498
Merge #8348 (main with #8505 landed) into the frame evidence
cixzhang Oct 26, 2026
63218c8
Merge #8045 (main with #8505 landed) into the recorder stand-down
cixzhang Oct 26, 2026
0400cb2
Merge #8446 (63218c8a: the harness line on main 42a30b47 with #8505) …
cixzhang Oct 26, 2026
6c68865
Merge 0400cb2e4d (#8076 with main through #8055's landing) as a depen…
cixzhang Oct 26, 2026
a865057
Merge 6c688655c6 (#8270 with #8076 0400cb2e and main 42a30b47) as a d…
cixzhang Oct 26, 2026
dc5b898
refactor(DropdownMenu): the module FR10 sub-menu cases move to the su…
vjeux Oct 26, 2026
6639af6
Merge 56f94c8e6b (#8089 with #8508) as a dependency
vjeux Oct 26, 2026
ec3283b
Merge #8270 (6c688655c6) into #8083
vjeux Oct 26, 2026
4550708
Merge #8083 (ec3283b229: #8270 6c688655c6) into #8084
vjeux Oct 26, 2026
5d526f8
Merge 6639af61d1 (#8195) as a dependency
vjeux Oct 26, 2026
67fc000
test(gestures): the host never writes a touch-action wider than the a…
vjeux Oct 26, 2026
0648297
fix(gestures): the host reads an author's touch-action in the next fr…
vjeux Oct 26, 2026
610b9c1
test(gestures): the press tracker bundle carries only the UIKit group…
vjeux Oct 26, 2026
672ed7d
perf(gestures): the press tracker imports only the UIKit groups it reads
vjeux Oct 26, 2026
5ad1170
fix(interaction): the WebKit container runs as the invoking user unde…
cixzhang Oct 26, 2026
49460a6
docs(interaction): a traced waitForAnimation on a CSS @keyframes anim…
cixzhang Oct 26, 2026
c1c5eb2
test(DropdownMenu): in real browsers a finger opens the menu once and…
vjeux Oct 26, 2026
0237942
Merge c1c5eb27a1 (#8078) as a dependency
vjeux Oct 26, 2026
8d4088d
test(DropdownMenu): in real Chromium a cancelled touch and the window…
vjeux Oct 26, 2026
60e37d8
fix(useMenuPress): a gesture the window's blur ended swallows its fin…
vjeux Oct 26, 2026
e176778
Merge c1c5eb27a1 (#8078) as a dependency
vjeux Oct 26, 2026
65749b4
Merge e176778dd3 (#8080) as a dependency
vjeux Oct 26, 2026
eef7532
test(gestures): the host marks a recognizer's touch-action under a ru…
vjeux Oct 26, 2026
38ea7d9
fix(interaction): rootless docker runs the WebKit container without -…
cixzhang Oct 26, 2026
7c8aea9
test(gestures): in a browser, the host's touch-action is in force fro…
vjeux Oct 26, 2026
4d67565
Merge 0400cb2e4d (#8076) as a dependency
vjeux Oct 26, 2026
f5ef17e
Merge 49460a6601 (#8446) as a dependency
vjeux Oct 26, 2026
6ce4c57
Merge f5ef17e9a5 (#8078) as a dependency
vjeux Oct 26, 2026
6a5dbce
Merge f5ef17e9a5 (#8078) as a dependency
vjeux Oct 26, 2026
6ddfe86
Merge 6a5dbceda0 (#8080) as a dependency
vjeux Oct 26, 2026
fd4d2c4
perf(gestures): the host marks a recognizer's touch-action under a ru…
vjeux Oct 26, 2026
d77ea18
test(AlertDialog): let the gesture host's attach frame run before cou…
vjeux Oct 26, 2026
041eb3d
Merge #8083 (d77ea18195: the action-group test runs the host's attach…
vjeux Oct 26, 2026
9bf354f
test(gestures): a hold's selection lock suppresses a link's callout, …
vjeux Oct 26, 2026
730b103
fix(gestures): a hold's selection lock suppresses a link's callout, a…
vjeux Oct 26, 2026
7f0f5c4
docs(interaction): waitForAnimation's JSDoc names the CSS @keyframes …
vjeux Oct 26, 2026
5712c49
Merge #8348 (38ea7d9c: rootless docker, WebKit container user) into t…
cixzhang Oct 26, 2026
ca36472
Merge 041eb3de9c (#8084) as a dependency
vjeux Oct 26, 2026
4660b4b
Merge 6ce4c57b37 (#8508) into 6ddfe86f84 (#8089)
vjeux Oct 26, 2026
467a0bf
Merge ca364726ea (#8110) as a dependency
vjeux Oct 26, 2026
4045092
chore(interaction): move four instruments out of the frame evidence
cixzhang Oct 26, 2026
6762cc5
chore(interaction): move rendering traces and the long-task log out o…
cixzhang Oct 26, 2026
03058f6
chore(interaction): move the compositor presentation record out of th…
cixzhang Oct 26, 2026
bf5950f
feat(interaction): Chromium rendering traces, the compositor presenta…
cixzhang Oct 26, 2026
d12ed28
feat(interaction): cast filmstrips, rect sampling, a Storybook highli…
cixzhang Oct 26, 2026
08a9bc9
Merge 4660b4b121 (#8089 with #8508) into ca364726ea (#8110)
vjeux Oct 26, 2026
4574489
Merge #8270 (the selection lock's engine split; a link's callout supp…
vjeux Oct 26, 2026
61de06c
Merge #8549 (d12ed280: the frame evidence split into #8045, #8548 and…
cixzhang Oct 26, 2026
ab5489d
Merge 4660b4b121 (#8089 with #8508) as a dependency
vjeux Oct 26, 2026
eb42283
Merge 08a9bc9e13 (#8110, #8089 with #8508) as a dependency
vjeux Oct 26, 2026
5955618
Merge eb422833b3 (#8195) as a dependency
vjeux Oct 26, 2026
daf723b
Merge 61de06c700 (#8446: the split harness line with #8348's containe…
cixzhang Oct 26, 2026
bae8ff7
Merge #8309's window (#8270's selection-lock split, the touch-action …
vjeux Oct 26, 2026
7b20ce0
feat(DropdownMenu): a finger lights a row at once in a menu that fits…
cixzhang Oct 26, 2026
9d9bf59
fix(DropdownMenu): a fitting menu lights the row at once without clai…
cixzhang Oct 26, 2026
696d405
test(DropdownMenu): fix the scrolling-menu and edge-autoscroll Chromi…
cixzhang Oct 26, 2026
3e3c4e7
Merge main (#8348 landed) into the frame evidence
cixzhang Oct 26, 2026
a7ffe6e
Merge #8045 (main with #8348 landed) into the rendering traces
cixzhang Oct 26, 2026
36abaa1
Merge #8548 (main with #8348 landed) into the instruments
cixzhang Oct 26, 2026
2931530
Merge #8549 (main with #8348 landed) into the recorder stand-down
cixzhang Oct 26, 2026
5f625ff
Merge #8446 (2931530b12: the split harness line, with main's #8348) i…
vjeux Oct 26, 2026
1286a82
Merge 2931530b12 (#8446: the harness line on main with #8348 landed) …
cixzhang Oct 26, 2026
8bc79c0
Merge #8270 (#8446 2931530b12, the same dependency) into #8309
vjeux Oct 26, 2026
e134fff
test(gestures): a finger the window blur cancelled lifts on nothing
vjeux Oct 26, 2026
b6869cf
fix(gestures): a finger the window blur cancelled lifts on nothing
vjeux Oct 26, 2026
ab343f5
test(gestures): a recognizer's own-scroll exemption lasts until the n…
vjeux Oct 26, 2026
ff306bc
fix(gestures): a recognizer's own-scroll exemption lasts until the ne…
vjeux Oct 26, 2026
ed0b174
test(gestures): a detach that leaves only disabled recognizers stops …
vjeux Oct 26, 2026
1be6b6c
fix(gestures): a detach that leaves only disabled recognizers stops t…
vjeux Oct 26, 2026
7f0bced
fix(DropdownMenu): a covering menu's room caps the box that scrolls, …
cixzhang Oct 26, 2026
df1747c
Merge 7f0bced96f (#8089, a covering menu stays on a short compact scr…
cixzhang Oct 26, 2026
d74c108
fix(DropdownMenu): the covering cap clears only what it wrote, giving…
cixzhang Oct 26, 2026
bd8f81d
Merge d74c108cc2 (#8089, the cap clears only what it wrote) as a depe…
cixzhang Oct 26, 2026
8cc99e9
docs(DropdownMenu): keep FR21 as the pull request below this one wrot…
cixzhang Oct 26, 2026
05e3faf
Merge 1be6b6c5cd (#8309, the gesture host's blur fix) as a dependency
vjeux Oct 26, 2026
afb7667
test(DropdownMenu): a finger's window blur runs in real Chromium agai…
vjeux Oct 26, 2026
b30de7f
test(DropdownMenu): the edge-autoscroll proof lifts over the last row…
vjeux Oct 26, 2026
d5ec70f
Merge b30de7fe76 (#8195) as a dependency
vjeux Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/action-group-tracker-core.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[internal] AlertDialog's touch tracking runs on the shared action-group tracker, the one any gesture recognizer can drive (a menu tracking the finger that opened it from its trigger, a segmented control, a page control). AlertDialog's behavior is unchanged.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/action-group-tracker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[internal] One tracker for a held finger across a group of targets (an alert's or an action sheet's actions, a menu's rows, a segmented control's segments, a page control's dots): it reads the targets' rects once, resolves the finger against them (or by the owner's rule), paints or reports the highlight, and runs the target through its own click at the lift. Nothing a consumer sees changes.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/alertdialog-touch-action-tracking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[fix] AlertDialog: on a touch screen, under a finger or a pen, the two actions are tracked as one group, the way iOS tracks an alert's actions. A finger that lands on one action and slides to the other now runs the action it lifts on. Before, iOS Safari ran the action the finger first touched (Delete, when the finger slid to Cancel), and other browsers ran nothing and left the alert open. The touched action highlights as soon as it is touched instead of 150 ms later, the highlight follows the finger between the actions, and lifting off both still runs nothing. A mouse, the keyboard and assistive technology keep each button's own click, and text stays selectable with a mouse. To keep the previous behavior under a finger, pass the new `presentation="dialog"`, which keeps the dialog a mouse gets on every device; the default is `presentation="adaptive"`.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/alertdialog-touch-motion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[feat] AlertDialog: under a finger the alert appears and leaves the way an iOS alert does. It scales down into place from 1.2 while it and the dimming fade in, and it fades out with the dimming when it closes, on the alert's measured spring; the animation keeps running when the page is busy. While it appears a touch does nothing (keys and assistive technology still act), and while it leaves nothing reaches it: a touch, a click, a key or an assistive-technology activation does nothing. With reduced motion it only cross-fades. With a mouse nothing changes, and `presentation="dialog"` keeps the previous motion and width under a finger too.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/build-stylex-cross-file-consts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/build': patch
---

[fix] `astryxStylex` resolves `defineConsts` values read from another file. With the `{stylexOptions}` form (the one Storybook uses), a file that read only constants from a `.stylex.ts` module lost that import once StyleX compiled it, so the constants never reached the CSS: a constant used as a media-query key failed the build ("Invalid empty selector") and one used as a value shipped as a custom property nothing declares. In either form, a constant defined on the other side of the layer split, or in an Astryx package (compiled with the library class-name prefix) and read from an app file (compiled with its own), stayed unresolved.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/dropdownmenu-touch-selection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[feature] Under a finger, on every touch device, DropdownMenu tracks a finger that lands in its open menu as the list of an iOS menu does: the row under a resting finger lights at once in a menu that fits and, in a menu that scrolls, after UIKit's content-touch delay (150 ms), a tap picks at the lift, and a quick drag scrolls a menu that scrolls and slides the highlight in one that fits. A mouse, and `presentation="popover"`, keep the pointer model. It runs on the gesture system and the shared action-group tracker; `useMenuPress` itself is unchanged.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/dropdownmenu-uimenu-placement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[feature] On a compact touch screen (a phone, iOS or Android), the popover DropdownMenu and MoreMenu sit where UIMenu does: over their trigger, centered on it and top-aligned with it, or bottom-aligned when the trigger is in the lower half of the viewport, 8 px from the viewport's sides (or the safe area), and no taller than the room left, so they stay on screen and scroll. The finger that opened the menu rests on its first row and picks only once it moves, as on iOS. Larger screens, a mouse, and `presentation="popover"` keep the menu below its trigger.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/dropdownmenu-uimenu-touch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[feature] Under a finger, on every touch device, DropdownMenu and MoreMenu grow out of their trigger on UIKit's open spring and collapse back into it on the close spring, as UIMenu does. Both run on the compositor and can be interrupted either way. Under Reduce Motion the menu fades in place (the animator's policy). A pan that starts outside the open menu dismisses it as the page scrolls, and focus that was in the menu returns to the trigger. Under a mouse, or with `presentation="popover"`, the menu keeps the layer's entrance and the theme's motion.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/gesture-browser-negotiation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: touch-action derivation, the native scroll probe and haptics for the gesture system. Not exported from the package entry point; DropdownMenu's press hook uses them.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/gesture-host-fixes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: gesture host fixes from review. A page scroll under a still finger keeps the press and its click; watchers and touches nothing can claim get passive listeners only; a claimed pen holds only its own stylus touches; an element's own `touch-action` is never widened; slotted content scrolls with its shadow-tree scroller. Not exported from the package entry point.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/gesture-host.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the gesture system's DOM host (claims, click suppression, the browser's takeover, the pointer behind a contact). Not exported from the package entry point.

@vjeux
2 changes: 1 addition & 1 deletion .changeset/gesture-pan.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
'@astryxdesign/core': patch
---

[chore] Internal: the pan gesture recognizer, with UIKit's measured hysteresis and velocity filter. Not exported from the package entry point; no component uses it yet.
[chore] Internal: the pan gesture recognizer, with UIKit's measured hysteresis and velocity filter. Not exported from the package entry point.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/gesture-press-tracking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: UIControl press tracking with control and cell profiles and the gesture hooks, with every press painter writing `data-astryx-press` through one internal writer in `utils/pressFeedback.ts`. Not exported from the package entry point; no component uses them yet.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/gesture-readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the gesture system's README for component authors, with its browser proof in Chromium and WebKit.

@vjeux
2 changes: 1 addition & 1 deletion .changeset/gesture-recognizer-core.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
'@astryxdesign/core': patch
---

[chore] Internal: the gesture recognizer core for touch presentations: UIKit's recognizer state machine and the arena that settles which recognizer owns a touch. Not exported from the package entry point; no component uses it yet.
[chore] Internal: the gesture recognizer core for touch presentations: UIKit's recognizer state machine and the arena that settles which recognizer owns a touch. Not exported from the package entry point.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/gesture-swipe-pinch-rotation-edge-hover.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: swipe, pinch, rotation, screen-edge pan and hover gesture recognizers. Not exported from the package entry point; no component uses them yet.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/layer-exit-copy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the layer runtime gains one exit copy for touch presentations that animate a popover out: a static, inert copy of the closing popover, shown only in the top layer where the popover was drawn, for the close to play on. DropdownMenu's touch close plays on it.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/menu-handoff-shared-tracker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[internal] Under DropdownMenu's touch modes, the finger that opened the menu resolves the menu's rows through the shared action-group tracker, as a finger that lands in the menu already does: rects read once instead of a hit test per move. Nothing a consumer sees changes.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/menu-press-uimenu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[feature] Under a finger, a DropdownMenu or MoreMenu trigger now opens its menu as the finger presses, instead of after a 500 ms hold (`spec:AST-094` FR29). Inside a scroll view it opens once the 150 ms content-touch delay has passed with no scroll, so a scroll that starts on it still scrolls. The finger that opened the menu picks a row only after it has moved 10 px, so a menu that appears under a resting finger never picks the row beneath it. To keep the previous behavior, a tap that opens at the lift, a 500 ms hold and the settle rule, pass `presentation="popover"`. A mouse is unchanged.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/presentation-resolver.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] An internal `usePresentation` / `readPresentation` resolves a component's `presentation` prop into the surface to render and whether its touch input modes apply, keeping an omitted value distinct from an explicit `'popover'` so a caller's choice always wins over a touch default. DropdownMenu (and MoreMenu, through it) reads it for its touch presentation.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/reduced-motion-record.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: Reduce Motion for the touch presentations follows design:reduced-motion beyond the animator too. `reducedMotionFade()` gives code beside the animator the animator's own fade (an opacity-only 200 ms cross-fade on a coarse pointer or after a touch release, at once on any other pointer), `animator.reducedMotion()` reports which form a change takes for feedback that plays no fade of its own, and `reducedMotion.stylex.ts` holds the fade's constants for StyleX transitions. The fade's length is not a theme motion role. Not exported from the package entry point.

@vjeux
2 changes: 1 addition & 1 deletion .changeset/touch-motion-theme-roles.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
'@astryxdesign/core': patch
---

[chore] Internal: the touch motion tables register their springs, durations and curves as internal motion roles, each read once when a motion starts, so every component keeps its measured value. Nothing public changes: themes do not set motion roles, and no shipped component reads the roles yet.
[chore] Internal: the touch motion tables register their springs, durations and curves as internal motion roles, each read once when a motion starts, so every component keeps its measured value. Nothing public changes: themes do not set motion roles. DropdownMenu's touch grow and collapse read `springs.menuOpen` and `springs.menuClose`.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/touch-selection-lock-gestures.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: under a finger or pen on a coarse primary pointer, the gesture host turns text selection and the touch callout off for one held contact only on elements whose hold does something (`spec:AST-094` FR41, DEC-9). A long press with a hold brings that lock by default (one at 0 ms, a touch-down detector, brings none, and `selectionLock: null` opts out), and another recognizer opts in with the internal `selectionLock` option (a slider's thumb, a switch's drag); the host calls the locks and never imports one. Everything else keeps the browser's long-press selection. Not exported from the package entry point.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/touch-selection-lock.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[fix] Where the primary pointer is fine (a mouse, a trackpad, a touchscreen laptop, a desktop pen tablet), the press feedback controller no longer registers a touch listener: it reads the primary pointer at the first finger or pen press and keeps its `touchcancel` listener only while that pointer is coarse.

@vjeux
2 changes: 1 addition & 1 deletion .changeset/uikit-constants-table.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
'@astryxdesign/core': patch
---

[chore] Internal: the UIKit constants table for touch presentations (springs, scroll physics, timing curves and navigation values), each value with its source and a checked list of the simulator measurements still owed. Not exported from the package entry point; no component reads it yet.
[chore] Internal: the UIKit constants table for touch presentations (springs, scroll physics, timing curves and navigation values), each value with its source and a checked list of the simulator measurements still owed. Not exported from the package entry point; DropdownMenu's touch presentation reads it.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/uikit-motion-animator-curves.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the touch presentations' animator plays any closed-form curve (such as a spring chasing a moving target) through `play`, with the same presentation values, velocities, stop and shared clock as a spring, and the Reduce Motion policy. Not exported from the package entry point.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/uikit-motion-animator-pseudo-element.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the touch presentations' animator drives a pseudo-element such as a dialog's ::backdrop: a static filling animation holds its value after a curve ends and after `set`, a custom property on its host promotes it, and a Reduce Motion dip borrows and hands back the pseudo-element's own opacity. Not exported from the package entry point.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/uikit-motion-animator-reduced-motion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the touch presentations' animator follows design:reduced-motion (under Reduce Motion, an opacity-only cross-fade of 200 ms on a coarse pointer or after a touch release and an immediate change on any other pointer, with no option or theme value that keeps travel or lengthens the fade; an entrance or exit role orients a slide that changes no opacity), decided by its own planner module, and starts a call from rest when the browser commits it, as Core Animation does. Not exported from the package entry point.

@vjeux
2 changes: 1 addition & 1 deletion .changeset/uikit-motion-animator.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
'@astryxdesign/core': patch
---

[chore] Internal: a compositor animator for touch presentations. It plays UIKit's springs, and scroll coasts (built by a separate coast module, so a surface that never coasts does not carry them; `decay` plays a release's momentum, and under Reduce Motion cross-fades a spring back from past an edge) as Web Animations on translate, rotate, scale and opacity, so they keep running while JavaScript is busy, and reads values and velocities back from the curves for interruption, retargeting and Reduce Motion cross-fades. Not exported from the package entry point; no component uses it yet.
[chore] Internal: a compositor animator for touch presentations. It plays UIKit's springs, and scroll coasts (built by a separate coast module, so a surface that never coasts does not carry them; `decay` plays momentum, and sends a spring back from past an edge through the Reduce Motion policy: a cross-fade on a coarse pointer, at once elsewhere) as Web Animations on translate, rotate, scale and opacity, so they keep running while JavaScript is busy, and reads values and velocities back from the curves for interruption, retargeting and Reduce Motion cross-fades. Not exported from the package entry point.

@vjeux
2 changes: 1 addition & 1 deletion .changeset/uikit-motion-math.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
'@astryxdesign/core': patch
---

[chore] Internal: the spring, decay, rubber-band and projection math of UIKit for touch presentations, as pure functions checked against an independent integration and against values read from UIKit. Not exported from the package entry point; no component uses it yet.
[chore] Internal: the spring, decay, rubber-band and projection math of UIKit for touch presentations, as pure functions checked against an independent integration and against values read from UIKit. Not exported from the package entry point; DropdownMenu's touch presentation uses it.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/uikit-motion-use-animator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: useAnimator, a React wrapper around the touch presentations' animator that never re-renders per frame, and browser proofs on the interaction harness that the animator's motion keeps running through a blocked main thread in Chromium and WebKit. Not exported from the package entry point.

@vjeux
29 changes: 28 additions & 1 deletion apps/docsite/next.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,14 @@
* @position Next.js configuration for the existing Vercel docsite deployment.
*/

import {existsSync, readFileSync, readdirSync} from 'node:fs';
import {existsSync, readFileSync, readdirSync, realpathSync} from 'node:fs';
import {createRequire} from 'node:module';
import {resolve} from 'node:path';

const coreInternalModules = createRequire(import.meta.url)(
'../../scripts/core-internal-modules.cjs',
);

const playgroundCookieCompatibility = readFileSync(
resolve(
import.meta.dirname,
Expand Down Expand Up @@ -156,6 +161,28 @@ const nextConfig = {
{'@astryxdesign/cli/api': 'module @astryxdesign/cli/api'},
];
}
// Lab's build imports core's internal motion and gesture modules by their
// module paths, which core's "exports" do not list. Resolve each to the
// file core's own built components import, so a page keeps one gesture
// host and one animator per element.
const coreDir = realpathSync(
resolve(import.meta.dirname, 'node_modules/@astryxdesign/core'),
);
config.plugins.push(
new webpack.NormalModuleReplacementPlugin(
coreInternalModules.CORE_INTERNAL_SPECIFIER,
resource => {
const file = coreInternalModules.resolveCoreInternal(
resource.request,
{coreDir},
);
if (file != null) {
resource.request = file;
}
},
),
);

// Webpack's CSS @import resolver doesn't follow package.json "exports".
// Map each theme's /theme.css subpath to the actual dist file.
const themesDir = resolve(import.meta.dirname, '../../packages/themes');
Expand Down
5 changes: 4 additions & 1 deletion apps/docsite/src/__tests__/data-extraction.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1428,7 +1428,10 @@ describe('DropdownMenu adaptive-presentation example', () => {
);

expect(presentation?.type).toBe("'popover' | 'bottom-sheet' | 'adaptive'");
expect(presentation?.default).toBe("'popover'");
// Unset by default: the menu is anchored, with the touch modes under a
// finger (spec:AST-094 FR29); 'popover' pins the pointer behavior.
expect(presentation?.default).toBeUndefined();
expect(presentation?.description).toContain("Pass 'popover'");

const defaults = dropdownMenu?.playground?.defaults as
Record<string, unknown> | undefined;
Expand Down
25 changes: 25 additions & 0 deletions apps/sandbox/vite.config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import path from 'node:path';
import {fileURLToPath} from 'node:url';
import {createRequire} from 'node:module';
import stylexResolution from '../../scripts/stylex-module-resolution.cjs';
import coreInternalModules from '../../scripts/core-internal-modules.cjs';
import {categories} from './src/app/sandboxPages';
import {
discoverRoutes,
Expand All @@ -33,6 +34,29 @@ let routes = discoverRoutes(
categories.map(category => category.slug),
);

/**
* Lab's build imports core's internal motion and gesture modules by their
* module paths, which core's `exports` do not list. Resolve each to the file
* core's own built components import (its source under ASTRYX_SOURCE), so the
* page keeps one gesture host and one animator per element.
*/
function coreInternalModulePaths(): Plugin {
const coreDir = fs.realpathSync(
path.join(appDir, 'node_modules/@astryxdesign/core'),
);
const source = process.env.ASTRYX_SOURCE === '1';
return {
name: 'sandbox-core-internal-modules',
enforce: 'pre',
resolveId(specifier) {
return coreInternalModules.resolveCoreInternal(specifier, {
coreDir,
source,
});
},
};
}

function staticRoutes(): Plugin {
const id = '\0virtual:sandbox-routes';
let failed = false;
Expand Down Expand Up @@ -212,6 +236,7 @@ export default defineConfig({
],
},
}),
coreInternalModulePaths(),
staticRoutes(),
],
resolve: {
Expand Down
Loading
Loading