Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
1193 commits
Select commit Hold shift + click to select a range
02bda5a
test(gestures): attaching reads no computed style
vjeux Oct 26, 2026
1ba08fd
perf(gestures): attaching reads no computed style
vjeux Oct 26, 2026
3a8ee21
Merge #8309 (#8076 4adaf8b77e; the lock after admission; no style rea…
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
c1c522b
docs(core): each gesture hook Effect names what it syncs
vjeux 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
2ed832f
perf(keyboard): one layout read per keyboard change, shared by every …
vjeux Oct 26, 2026
7c8672b
fix(ChatLayout): a text control composer tapped with nothing focused …
vjeux Oct 26, 2026
3b3fc77
docs(ChatLayout): the composer rides in step in Safari; in Firefox an…
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
af953bd
Merge #8076 (bd9246df: main 2af4d305 with #8257) into the keyboard mo…
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
94cc596
Merge #8176 (af953bdb: #8076 and main 2af4d305) into the Popover's gr…
cixzhang Oct 26, 2026
370c4d9
Merge #8067 (7b26ef27: #8056 5d9e4ec2, #8055 89614c7f) into the motio…
cixzhang Oct 26, 2026
e0a88c4
Merge the maintainer's #8176 head (af953bdb9f) into the keyboard module
vjeux Oct 26, 2026
e084460
Merge bd9246df2e (#8076 with main) as a dependency
cixzhang Oct 26, 2026
f0235bd
Merge #8176 (e0a88c4f08) into the Chrome-on-Android ride
vjeux Oct 26, 2026
3ccbd7a
test(core): drop the delegated-pressable selection case; the host no …
cixzhang Oct 26, 2026
2a0d065
Merge #8309 (3ccbd7a2: #8076 bd9246df, main, the host's injected lock…
cixzhang Oct 26, 2026
7d09c3c
docs(ChatLayout): in Chrome on Android the composer rides Gboard's sl…
vjeux Oct 26, 2026
999ef1b
Merge #8076 bd9246df2e (main 2af4d305a6)
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
38a06d4
Merge #8309 (#8076 bd9246df2e; her restack; the host's per-group impo…
vjeux Oct 26, 2026
31576f6
Merge cixzhang's #8315 head (2a0d0650e3: her #8309 restack)
vjeux Oct 26, 2026
993a4ca
Merge #8315 (2a0d0650: #8309, #8076 bd9246df, main 2af4d305) into the…
cixzhang Oct 26, 2026
04ff5dc
Merge 993a4ca926 (#8336 resolved against main through #8315 and #8309…
cixzhang 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
83c36b4
Merge #8309 (7f48c369: the haptic switch marker in its own module) in…
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
7f84cbf
Merge #8315 (83c36b4b: #8309's haptic switch marker in its own module…
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
907abe9
Merge #8309 (her haptic switch marker module folded) into #8315
vjeux Oct 26, 2026
d10bbf0
Merge cixzhang's #8315 head (83c36b4b06: her #8309 merge)
vjeux 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
7d946d2
Merge #8045 (main with #8044 and #8505's waits) into the recorder sta…
cixzhang Oct 26, 2026
e028c36
fix(Popover): a touch that lands while the popover grows takes no inp…
cixzhang Oct 26, 2026
ee34b25
Merge #8446 (7d946d25: the harness line on main with #8505's waits) i…
cixzhang Oct 26, 2026
b5f71bd
test(Popover): FR35 in a real engine: a tap or drag during the grow r…
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
ac3a7bc
Merge #8309 (#8076 ee34b25079: main 4444d70bd7) into #8315
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
2a44226
Merge #8309 into #8315
vjeux Oct 26, 2026
b9c536f
Merge #8309 (dd8e9462: #8076 ee34b250 with the harness line, main) in…
cixzhang Oct 26, 2026
c22ce07
fix(gestures): a keepsTouch press tracker keeps only the touch whose …
cixzhang Oct 26, 2026
24ce396
Merge #8315 (b9c536ff: #8309 dd8e9462, #8076 ee34b250, the resolved h…
cixzhang Oct 26, 2026
9320644
fix(interaction): a wait keeps waiting while the action's animation i…
cixzhang Oct 26, 2026
ad52891
docs(gestures): the host header drops the delegated-consumer paragraph
cixzhang 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
e84b0ad
Merge #8309 (her third pass folded: #8076 ee34b25079, main 5b691cda71…
vjeux Oct 26, 2026
f8faec3
Merge cixzhang's #8315 head (b9c536ffab: her #8309 merge)
vjeux Oct 26, 2026
9d5c20a
fix(interaction): a traced waitForRest skips scroll- and view-timelin…
cixzhang Oct 26, 2026
747d441
fix(Popover): the input hold typechecks; FR35's browser test taps 47 …
cixzhang Oct 26, 2026
b4234d7
Merge #8505 (9320644717: a wait keeps waiting while the action's anim…
vjeux Oct 26, 2026
6c30869
docs(layer-runtime): Current gaps takes main's INV14/INV15 paragraph
cixzhang Oct 26, 2026
20d2b93
Merge #8076 (ee34b250: the harness line from #8446) into the keyboard…
cixzhang Oct 26, 2026
f995023
Merge main (79a7a902) into the keyboard module
cixzhang 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
626bceb
test(interaction): the trace verdict's fixture carries devtoolsTasks,…
cixzhang Oct 26, 2026
58d5392
Merge #8176 (626bceb6: #8076 ee34b250's harness line and main 79a7a90…
cixzhang Oct 26, 2026
cf97fc4
Merge #8176 (626bceb6b0) into the Chrome-on-Android ride
vjeux Oct 26, 2026
07423cb
fix(gestures): a kept press keeps only the touch it tracks
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
2fed42c
Merge #8076 0d1a829741 (main 4444d70bd7 with #8446, #8073, #8258)
vjeux Oct 26, 2026
a94a00f
revert(Popover): the grow-time input hold leaves this pull request
cixzhang 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
dbac844
Merge #8076 (0d1a829741) into the Chrome-on-Android ride
vjeux 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
d62bc30
perf(utils): the scrollbar thickness is measured once per document an…
vjeux Oct 26, 2026
1aaeddc
docs(changeset): in Chrome the composer moves once reported, and a Ta…
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
6efc091
fix(Popover): a fine-pointer open releases the touch presentation's l…
cixzhang Oct 26, 2026
97a16c5
Merge #8287 (dbac8444ff) into the keyboard module: Chrome on Android …
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
041b4dc
fix(gestures): a watcher cancels no press under it; a page hold keeps…
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
b84bcfc
refactor(core): drop the animator's unused TRAVEL alias
cixzhang Oct 26, 2026
4a62aad
fix(keyboard): one reveal-pan watch puts a browser's own pan back, fo…
vjeux 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
df04ef9
Merge #8076 2267ee5154 (main through #8055)
vjeux Oct 26, 2026
5fcd00f
Merge #8076 (2267ee5154) into the keyboard module
vjeux 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
1d7254a
Merge #8309 (a9208c41: #8076 2267ee51, main through #8055) into the g…
cixzhang Oct 26, 2026
7847980
test(core): the animator's tests drop an unused import and binding
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
e1dfdff
fix(gestures): the arena reaches deliverBeganElsewhere through intern…
cixzhang Oct 26, 2026
2ce2286
docs(Popover): the dismissal cites the shared exit copy as main's lay…
cixzhang Oct 26, 2026
154fa40
Merge #8315 (e1dfdff9: #8309 a9208c41, #8076 2267ee51, main through #…
cixzhang Oct 26, 2026
4693f5e
docs(keyboard): rewrap two file headers the fold left uneven
vjeux Oct 26, 2026
b814769
fix(core): under Reduce Motion a move lands only while the element is…
cixzhang Oct 26, 2026
97d0182
docs(Popover): the touch layer cites component-style-authoring INV6 a…
cixzhang Oct 26, 2026
2a5fd52
Merge #8186 (df04ef94: the layer runtime's exit copy and its INV13 re…
cixzhang Oct 26, 2026
5a59ef2
fix(gestures): a page hold judges a new touch afresh when it reuses a…
cixzhang Oct 26, 2026
92f1ef6
docs(layer-runtime): Current gaps notes Popover's latched anchored pr…
cixzhang Oct 26, 2026
d1b07a4
Merge #8045 (e05cdd163a, on #8505 02ff48fafe) into the recorder stand…
vjeux Oct 26, 2026
d68ab87
Merge #8336 (5a59ef2e17) into #8342
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
363a213
Merge #8309 (#8270 09aa3f1883, #8076 1346af4990) into #8315
vjeux Oct 26, 2026
3044718
Merge #8315 (#8270 09aa3f1883, #8076 1346af4990) into #8336
vjeux Oct 26, 2026
51688cd
fix(interaction): waitForAnimation and a watch's started() stand down…
vjeux Oct 26, 2026
274ee1b
fix(core): a handle's stop freezes its waiting Reduce Motion travel w…
cixzhang 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
0c7ff0c
docs(Popover): its changeset says Popover is the exit copy's first user
cixzhang Oct 26, 2026
6c68865
Merge 0400cb2e4d (#8076 with main through #8055's landing) as a depen…
cixzhang Oct 26, 2026
0ba0b6b
fix(Layer): embedded content stands in the exit copy as an empty box …
cixzhang Oct 26, 2026
5695479
Merge #8186 (0ba0b6b9: the exit copy leaves embedded content as empty…
cixzhang Oct 26, 2026
a865057
Merge 6c688655c6 (#8270 with #8076 0400cb2e and main 42a30b47) as a d…
cixzhang Oct 26, 2026
d6a5845
Merge #8309 (a8650574: #8076 0400cb2e with the harness line on main) …
cixzhang Oct 26, 2026
7f36229
fix(core): a carried Reduce Motion move keeps its own call
cixzhang Oct 26, 2026
e14f901
Merge #8076 (0400cb2e: the harness line on main 42a30b47 with #8505) …
cixzhang 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
dfcb2b4
test(gestures): a press tracker disabled under the finger reports not…
vjeux Oct 26, 2026
fbf8258
fix(gestures): a press tracker disabled under the finger ends its pre…
vjeux Oct 26, 2026
8aa1d23
Merge #8309 (the next-frame author read; the press tracker's per-grou…
vjeux Oct 26, 2026
2c2397b
Merge #8315 (d6a58453: #8309 a8650574, #8076 0400cb2e with #8446, mai…
cixzhang Oct 26, 2026
0616e1f
Merge #8176 (e14f901e: #8076 0400cb2e with #8446's harness line, main…
cixzhang Oct 26, 2026
500f3ca
docs(gestures): the haptic switch's label rule says what the code does
vjeux Oct 26, 2026
38aa181
Merge #8315 (#8309's next-frame author read; a tracker disabled under…
vjeux Oct 26, 2026
8588156
test(gestures): the host-line cases take the frame the host writes to…
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
c32c2ba
Merge 2c2397b981 (#8336 on #8315 d6a58453) as a dependency
cixzhang Oct 26, 2026
66cef6e
Merge #8336 (8588156218) into #8342
vjeux Oct 26, 2026
1a40c3a
fix(core): a held call still finds its start; a caught dismissal fade…
cixzhang 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
fd4d2c4
perf(gestures): the host marks a recognizer's touch-action under a ru…
vjeux Oct 26, 2026
19797f8
Merge #8309 (the touch-action mark under a rule an author rule outran…
vjeux Oct 26, 2026
57db055
Merge #8315 (#8309's touch-action mark under a rule an author rule ou…
vjeux Oct 26, 2026
b9a08c5
test(gestures): the host-line cases read the host's touch-action mark
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
215f031
fix(core): a waiting Reduce Motion call whose own opacity a later cal…
cixzhang 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
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
4574489
Merge #8270 (the selection lock's engine split; a link's callout supp…
vjeux Oct 26, 2026
6d5eaf1
Merge #8309 (#8270's selection-lock split) into #8315
vjeux Oct 26, 2026
eae13d0
Merge #8315 (#8270's selection-lock split) into #8336
vjeux Oct 26, 2026
61de06c
Merge #8549 (d12ed280: the frame evidence split into #8045, #8548 and…
cixzhang Oct 26, 2026
c1c46dc
fix(core): a held call keeps reading until it has a start
cixzhang Oct 26, 2026
8e0d69f
test(gestures): usePressTracker's lock case reads a refused selectstart
vjeux Oct 26, 2026
d3275e1
docs(gestures): the README says a press tracker disabled under a fing…
vjeux Oct 26, 2026
f8fbbd6
Merge #8315 (the README on a press tracker disabled under a finger) i…
vjeux Oct 26, 2026
daf723b
Merge 61de06c700 (#8446: the split harness line with #8348's containe…
cixzhang Oct 26, 2026
a2cf054
Merge #8309 (daf723b8: the harness line split, #8446 61de06c7) into t…
cixzhang Oct 26, 2026
bae8ff7
Merge #8309's window (#8270's selection-lock split, the touch-action …
vjeux Oct 26, 2026
57f866d
Merge #8315's window (the disabled-under-finger README note, #8309's …
vjeux Oct 26, 2026
fd8bf33
Merge #8309 (cixzhang's daf723b835 with the window) into #8315
vjeux Oct 26, 2026
6d10c7d
Merge #8315 (cixzhang's harness merge; the window) into #8336
vjeux Oct 26, 2026
4715604
fix(gestures): an idle per-event press tracker leaves no page listener
cixzhang Oct 26, 2026
ce5e84e
Merge 4715604b4f (#8336: per-press listener lifetime for perEventPoin…
cixzhang Oct 26, 2026
92d6477
fix(core): decay takes touchRelease; a take-back fades straight back;…
cixzhang Oct 26, 2026
5d7e96a
docs(gestures): the host header, AttachOptions and the README state a…
cixzhang Oct 26, 2026
ae03ad7
Merge 5d7e96a9e8 (#8336: docs for the per-event tracker's listener li…
cixzhang Oct 26, 2026
45a454b
docs(core): the animator header and changeset name the touch-release …
cixzhang Oct 26, 2026
ac656ef
refactor(Layer): the presentation hold is an input hold (`Layer/input…
vjeux 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
27fb158
fix(gestures): a finger-scroll watch installs no page listener where …
cixzhang Oct 26, 2026
1286a82
Merge 2931530b12 (#8446: the harness line on main with #8348 landed) …
cixzhang Oct 26, 2026
1910a64
Merge #8309 (1286a827: the harness line on main, #8348 landed) into t…
cixzhang Oct 26, 2026
b4e0adb
Merge #8446 (2931530b: the harness line on main with #8348) into the …
cixzhang Oct 26, 2026
2b264d3
test(core): uikit.test.ts matches bindings in the file text again
cixzhang Oct 26, 2026
ecb9f20
Merge #8056 (2b264d3d: the held call's start, the Reduce Motion landi…
vjeux Oct 26, 2026
62ecda1
test(core): browser proofs that a Reduce Motion dip held before its f…
vjeux Oct 26, 2026
53c11ea
Merge #8315 (1910a646: #8309 1286a827, the harness line on main with …
cixzhang Oct 26, 2026
2ebecf5
Merge 53c11ea923 (#8336 on #8315 1910a646: main with #8348) as a depe…
cixzhang Oct 26, 2026
f9f9a52
Merge #8076 (62ecda1c34: main with the storyboards harness and #8056'…
vjeux Oct 26, 2026
b795951
Merge #8342 (2ebecf51: the input hold) into the Popover presentation …
cixzhang Oct 26, 2026
d9e51fe
refactor(Layer): one presentation hold keeps a layer's chosen present…
cixzhang Oct 26, 2026
99b0ba8
fix(Popover): the surface motion's present callback lists touchHold; …
cixzhang Oct 26, 2026
5ba8d14
refactor(MobileNav): keep the closing dialog rendered through the lay…
cixzhang Oct 26, 2026
b6f4a72
Merge main into the MobileNav presentation-hold adoption
cixzhang Nov 9, 2026
aee5cb6
Merge branch 'main' into feat/presentation-hold-mobilenav
cixzhang Nov 9, 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/browser-support-on-screen-keyboard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/cli': patch
---

[docs] The browser-support guide has a section on the on-screen keyboard: a fully expanded Tall BottomSheet and ChatLayout's composer measure it as the layout viewport's height minus the visual viewport's, and keep the focused field above it in Safari on iOS, Firefox for Android and Chrome on Android. In Chrome, by default (`interactive-widget=resizes-visual`), ChatLayout's composer rides the keyboard as Gboard slides it and a Tall BottomSheet adds its scroll room once Chrome reports the keyboard; with `interactive-widget=resizes-content` Chrome shrinks the page for the keyboard itself and neither changes. Your app owns its viewport `<meta>` element; Astryx never sets it.

@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/chat-layout-rides-the-keyboard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[feat] ChatLayout keeps its composer on top of the software keyboard where the visual viewport shrinks for it, instead of leaving it underneath until the browser scrolls the whole page: in Safari on iOS (in the browser and as a home-screen app) and in Chrome on Android (on Gboard's measured slides) the dock rises and falls with the keyboard, in step with it, and in Firefox for Android it moves above the keyboard once Firefox reports it. Where a page sets `interactive-widget=resizes-content`, Chrome shrinks the page for the keyboard itself and the composer stays above it without moving. A conversation at its newest message stays there, and the rest of the transcript can still be scrolled above the composer. On a touch screen every way into the composer's text (a tap, the keyboard's previous and next buttons, Tab, the input's `focus()`) reaches it without the page scrolling; under a mouse the browser's own focus applies. The composer's dock is a group named "Message composer"; when the keyboard's Done ends typing, focus rests there (it is no tab stop), so the next tap or Tab starts from the composer. Under Reduce Motion the composer never travels: it cross-fades to its place above the keyboard on a touch screen. Nothing changes where no software keyboard appears.

@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; no component uses them yet.

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

[chore] Internal: the gesture hooks call nothing back after unmount; `usePressTracker` brakes with the host by default and keeps one tracker, so an option change or a new ref never drops a press in progress; the recognizer's arena plumbing is `protected`. Not exported from the package entry point.

@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-owner.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the gesture host becomes the one document-level touch owner: a scroll lock's page hold, finger scrolls, the finger count, touch gates, and a kept press for continuous-tracking controls, whose element gets `touch-action: manipulation` where the pointer is coarse. A second finger fails a one-finger pan that has not claimed, so the page can pinch. Where the primary pointer is fine, the host attaches nothing and registers no listener, following the pointer when it changes; a recognizer that reads each event's pointer itself opts out with `perEventPointer`, and a press tracker with it paints a finger's press feedback only, with no control event and no mouse or pen press. A press tracker whose hold acts (a stepper's hold-repeat) can bring a selection lock for its presses, as a recognizer can. Internal, for the touch components that adopt them; 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/gesture-watcher.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: a recognizer created with `claimsTouches: false` is a watcher: passive listeners only, simultaneous with every recognizer, and it follows a touch the browser takes for a scroll to the lift. Not exported from the package entry point.

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

[fix] BottomSheet reads the on-screen keyboard from core's shared keyboard module. It now detects the keyboard from the browser's capabilities (a top-level document with a visual viewport, Chrome on Android included) instead of the user agent, measures the keyboard so that a page pan or a pinch zoom never reads as one and a pinch-zoomed page still reads the keyboard's full height, and lays a Tall sheet's keyboard room out through its own style rather than a CSS custom property. The browser-support guide documents Chrome on Android's `interactive-widget` viewport setting.

@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. Nothing uses it yet; no change in behavior.

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

[chore] Internal: one input hold for every layer (`Layer/inputHold`). While a layer presents, a touch, a press or a click anywhere reaches nothing (keys and assistive technology still act, and a pinch still zooms the page); while it dismisses, the same, and the layer's content is inert. The gesture host holds the layer's touches through its touch gates, and `isInputShield` lets a hit test see past a hold's shield. Not exported from the package entry point; no component uses it yet.

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

[chore] Internal: MobileNav keeps its dialog rendered from the open until its delayed close has run through the layer runtime's presentation hold (Layer/presentationHold.ts). No behavior change.

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

[chore] Internal: Popover keeps its chosen presentation (the sheet or the anchored layer, the touch grow or the pointer entrance) from the open until its close settles through the layer runtime's one presentation hold (Layer/presentationHold.ts). No behavior change.

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

[feature] Under a finger (a coarse primary pointer, on any touch device), Popover is presented like a native popover: it grows out of its trigger on UIKit's present spring, wide before tall, with its edge held on the trigger, and shrinks back into the trigger on the dismiss spring when it closes, on the compositor and interruptible both ways. With reduced motion it cross-fades in and out, opacity only, in 200 ms or less. A fine primary pointer (a mouse) keeps its entrance and the theme's motion. The shrink plays on the layer runtime's exit copy, of which Popover is the first user.

@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
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: the gesture host applies a recognizer's own `selectionLock` to that recognizer's contact and imports no lock itself; a long press brings one only when it has a hold (a `minimumPressDuration` above 0), and `selectionLock: null` opts out. 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
7 changes: 7 additions & 0 deletions .changeset/uikit-keyboard-notification.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: the keyboard notifications' duration has its own export in the UIKit timing table, so code that reads only it bundles no other timing value. Not exported from the package entry point.

@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 or after a touch release, 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.

@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
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
20 changes: 17 additions & 3 deletions apps/storybook/stories/ChatLayout.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,14 @@ export const FullAIChat: StoryObj = {
);

return (
<div style={{height: '100vh', display: 'flex', flexDirection: 'column'}}>
<div
style={{
// The visible height, less the 16px the preview pads every story
// with on each side, so the composer rests on screen.
height: 'calc(100dvh - 32px)',
display: 'flex',
flexDirection: 'column',
}}>
<ChatLayout composer={composerEl}>
<ChatMessageList>
{messages.map(msg => {
Expand Down Expand Up @@ -827,7 +834,13 @@ export const PanelView: StoryObj = {
export const WithEmptyState: StoryObj = {
name: 'Empty State',
render: () => (
<div style={{height: '100vh', display: 'flex', flexDirection: 'column'}}>
<div
style={{
// The visible height, less the preview's 16px padding on each side.
height: 'calc(100dvh - 32px)',
display: 'flex',
flexDirection: 'column',
}}>
<ChatLayout
composer={
<ChatComposer
Expand Down Expand Up @@ -861,7 +874,8 @@ export const Densities: StoryObj = {
style={{
display: 'flex',
gap: 16,
height: '100vh',
// The visible height, less the preview's 16px padding on each side.
height: 'calc(100dvh - 32px)',
padding: 16,
boxSizing: 'border-box',
}}>
Expand Down
Loading
Loading