Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
931 commits
Select commit Hold shift + click to select a range
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
b84bcfc
refactor(core): drop the animator's unused TRAVEL alias
cixzhang Oct 26, 2026
648f355
Merge #8056 (the unused TRAVEL alias goes) into play(curves)
cixzhang Oct 26, 2026
c494681
Merge #8521 (the unused TRAVEL alias goes) into pseudo-element support
cixzhang 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
7847980
test(core): the animator's tests drop an unused import and binding
cixzhang Oct 26, 2026
c4d1994
Merge #8056 (unused test import and binding) into play(curves)
cixzhang Oct 26, 2026
374ab86
Merge #8521 (unused test import and binding) into pseudo-element support
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
b814769
fix(core): under Reduce Motion a move lands only while the element is…
cixzhang Oct 26, 2026
b3f68de
Merge #8056 (a move lands only while transparent) into play(curves)
cixzhang Oct 26, 2026
f866874
Merge #8521 (a move lands only while transparent) into pseudo-element…
cixzhang Oct 26, 2026
3190b1a
docs(core): a pseudo-element's hold lasts while the pseudo-element ex…
cixzhang Oct 26, 2026
d1b07a4
Merge #8045 (e05cdd163a, on #8505 02ff48fafe) into the recorder stand…
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
2f3d6ef
Merge #8056 (a handle's stop freezes its waiting travel) into play(cu…
cixzhang Oct 26, 2026
bb79455
Merge #8521 (handle stop, scale precedence) into pseudo-element support
cixzhang Oct 26, 2026
23e9ead
fix(core): play lets an explicit axis win over scale; the README pres…
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
be661e2
docs(core): a reopened dialog's backdrop is set right after showModal()
cixzhang Oct 26, 2026
7f36229
fix(core): a carried Reduce Motion move keeps its own call
cixzhang Oct 26, 2026
72c25bd
Merge #8056 (a carried move keeps its own call) into play(curves)
cixzhang Oct 26, 2026
3153b09
Merge #8521 (a carried move keeps its own call) into pseudo-element s…
cixzhang 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
1a40c3a
fix(core): a held call still finds its start; a caught dismissal fade…
cixzhang Oct 26, 2026
f4e8812
Merge #8056 (held start, take-over, will-change) into play(curves)
cixzhang Oct 26, 2026
835e4e4
Merge #8521 (held start, take-over, will-change) into pseudo-element …
cixzhang Oct 26, 2026
38ea7d9
fix(interaction): rootless docker runs the WebKit container without -…
cixzhang Oct 26, 2026
215f031
fix(core): a waiting Reduce Motion call whose own opacity a later cal…
cixzhang Oct 26, 2026
da5dcb2
Merge #8056 (a retargeted opacity settles its waiting call interrupte…
cixzhang Oct 26, 2026
47a30b0
Merge #8521 (a retargeted opacity settles its waiting call interrupte…
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
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
ddf0e3a
Merge #8056 (a held call keeps reading until it has a start) into pla…
cixzhang Oct 26, 2026
f33aea7
Merge #8521 (a held call keeps reading until it has a start) into pse…
cixzhang Oct 26, 2026
357a725
feat(gestures): a screen-edge pan takes the axis across its edge only…
cixzhang Oct 26, 2026
92d6477
fix(core): decay takes touchRelease; a take-back fades straight back;…
cixzhang Oct 26, 2026
6c53298
Merge #8056 (decay touchRelease, take-back, entrance mid-exit) into p…
cixzhang Oct 26, 2026
1ca0138
Merge #8521 (decay touchRelease, take-back, entrance mid-exit) into p…
cixzhang Oct 26, 2026
45a454b
docs(core): the animator header and changeset name the touch-release …
cixzhang Oct 26, 2026
c6f0678
Merge #8056 (the touch-release cross-fade in the header and changeset…
cixzhang Oct 26, 2026
ed4a046
Merge #8521 (the touch-release cross-fade in the header and changeset…
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
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
13eceed
Merge #8056 (uikit.test.ts back to main's line) into play(curves)
cixzhang Oct 26, 2026
212dbb1
Merge #8521 (uikit.test.ts back to main's line) into pseudo-element s…
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
66c651f
fix(interaction): a watch taken inside a trace right after a style ch…
cixzhang Oct 26, 2026
5613501
docs(interaction): the README's evidence list and busy recipe match w…
cixzhang Oct 26, 2026
a149b9c
Merge #8045 (README evidence list and FR5 block) into the rendering t…
cixzhang Oct 26, 2026
852d55c
fix(interaction): readLongTasks fails closed, and the README lists ev…
cixzhang Oct 26, 2026
4099d7e
Merge #8548 (readLongTasks fails closed) into the instruments
cixzhang Oct 26, 2026
6ccd5b4
fix(interaction): castStoryboard takes no clip it would ignore
cixzhang Oct 26, 2026
40c6be3
Merge #8549 (castStoryboard's clip, readLongTasks fails closed, READM…
cixzhang Oct 26, 2026
87e516b
docs(interaction): a traced watch restyles its element; take it befor…
cixzhang Oct 26, 2026
572825b
fix(gestures): an off-zone edge pan decides at 10 px; a waiting swipe…
cixzhang Oct 26, 2026
4c3df94
fix(gestures): a pan from several edges claims each axis only in its …
cixzhang Oct 26, 2026
c8d86ff
chore(changeset): the touch foundation's internal changesets stop cou…
vjeux Oct 26, 2026
bce5d90
fix(interaction): the compositor record refuses another open page
cixzhang Oct 26, 2026
7613c98
Merge #8548 (the compositor record refuses another page) into the ins…
cixzhang Oct 26, 2026
f79b8a9
fix(interaction): resolve ASTRYX_WEBKIT_SHADER_CACHE to a host path
cixzhang Oct 26, 2026
a1e7176
Merge #8549 (compositor record refuses another page, shader cache pat…
cixzhang Oct 26, 2026
ff365ff
docs(interaction): a traced waitForRest restyles a running element on…
cixzhang Oct 26, 2026
97436b2
fix(core): a node detached mid-dip lands its move where it was going
cixzhang Oct 26, 2026
c27baac
Merge #8521 (a node detached mid-dip lands its move) into pseudo-elem…
cixzhang Oct 26, 2026
bac4669
fix(interaction): a window that delivered under four frames is judged…
cixzhang Oct 26, 2026
f1c5125
Merge n8045 (the busy verdict judges a thin window against its span) …
cixzhang Oct 26, 2026
bd50829
Merge n8548 (the busy verdict judges a thin window against its span) …
cixzhang Oct 26, 2026
f405e7f
Merge n8549 (the busy verdict judges a thin window against its span) …
cixzhang Oct 26, 2026
702529b
fix(core): the unmount's landing leaves the detached node with nothin…
cixzhang Oct 26, 2026
fda011c
Merge #8521 (the unmount's landing leaves nothing running) into pseud…
cixzhang Oct 26, 2026
8715133
docs(interaction): the busy verdict's docs name the thin-window rule
cixzhang Oct 26, 2026
15e8c24
Merge n8045 (the busy docs name the thin-window rule) into n8548
cixzhang Oct 26, 2026
bc90acb
Merge n8548 (the busy docs name the thin-window rule) into n8549
cixzhang Oct 26, 2026
7aba599
Merge n8549 (the busy docs name the thin-window rule) into n8446b
cixzhang Oct 26, 2026
9f6748f
fix(core): a waiting move lands on the latest node detached, and disp…
cixzhang Oct 26, 2026
a103c43
Merge #8521 (the latest detached node) into pseudo-element support
cixzhang Oct 26, 2026
4012259
fix(interaction): the compositor record refuses a page that opened wh…
cixzhang Oct 26, 2026
2a6b934
Merge n8548 (the compositor record refuses a page opened while it ran…
cixzhang Oct 26, 2026
9f65026
Merge n8549 (the compositor record refuses a page opened while it ran…
cixzhang Oct 26, 2026
2ec969c
fix(core): a Reduce Motion call naming the opacity a waiting dip retu…
vjeux Oct 26, 2026
1ddea08
fix(interaction): a traced wait on a missing element reports it missing
cixzhang Oct 26, 2026
213e86e
docs(motion): the Reduce Motion planner's fade length is no role, the…
vjeux Oct 26, 2026
6ef5186
perf(core): a promotion reads no style in its own task
vjeux Oct 26, 2026
70c70e4
Merge #8061 (4c3df941: a screen-edge pan takes the axis across its ed…
vjeux Oct 26, 2026
76282bc
spec(AST-108): theme motion is three knobs — tempo, character, reduce…
cixzhang Oct 26, 2026
843655e
spec(AST-108): character offsets each role's measured bounce; BottomS…
cixzhang Oct 26, 2026
6f4173c
test(core): the mid-dip unmount test reads the element after the defe…
cixzhang Oct 26, 2026
915f9d9
Merge #8521 (the mid-dip unmount test awaits the microtask) into pseu…
cixzhang Oct 26, 2026
d2c3c78
feat(gestures): an action group keeps working under a fine pointer, w…
cixzhang Oct 26, 2026
266fa0a
Merge #8072 (d2c3c788: the action-group host exception) and #8446 (1d…
cixzhang Oct 27, 2026
ef37748
spec(AST-090): restore FR1's opening, lost to an editing slip
cixzhang Oct 27, 2026
25b468c
Merge main (2c4f1728: #8056 merged) into play-curves
cixzhang Oct 27, 2026
182ef2e
Merge #8521 (main with #8056) into pseudo-element support
cixzhang Oct 27, 2026
793c8db
build(lab): Lab reaches core only through core's exports, with no sec…
cixzhang Oct 27, 2026
b9c3b0b
Merge #8522 (182ef2e9: the animator line carrying main with #8056 lan…
cixzhang Oct 27, 2026
27eeeb8
fix(core): an unmount leaves no will-change read timer on the node it…
cixzhang Oct 27, 2026
bec2283
fix(gestures): a gesture that cancels itself on a finger's move keeps…
vjeux Oct 26, 2026
a3e07d8
fix(core): the gesture host measures a screen-edge pan's view, so an …
cixzhang Oct 27, 2026
9adbe2d
fix(gestures): a strip authored at the edge region is the edge zone a…
cixzhang Oct 27, 2026
cba0ad9
Merge main (a00afee502: #8521 merged) into the experimental touch layer
vjeux Oct 27, 2026
3bfd7c3
fix(core): the animator reads no style for a node out of the document
vjeux Oct 27, 2026
c33cc6a
Merge remote-tracking branch 'origin/main' into spec/theme-motion-knobs
cixzhang Oct 27, 2026
8cbc8e7
spec(AST-108, AST-094, AST-090): exits keep --ease-standard; implied …
cixzhang Oct 27, 2026
e882416
spec(AST-108): a MotionScaleConfig's implied tempo drives CSS duratio…
cixzhang Oct 27, 2026
55ce12d
spec(AST-108 +): fixed timers named; 'always' reaches component style…
cixzhang Oct 27, 2026
0dcda09
spec(AST-108): busy loops read pre-tempo durations; adaptations set t…
cixzhang Oct 27, 2026
1aade8a
test(gestures): an in-band touch on a wider element decides at 15 px …
vjeux Oct 27, 2026
3d85c30
fix(gestures): an in-band touch decides at 15 px whatever the element…
vjeux Oct 27, 2026
9d0f6f2
Merge #8061 (3d85c303e6: an in-band screen-edge touch decides at 15 p…
vjeux Oct 27, 2026
11dbebf
Merge #8641 (bec2283d0f: a gesture that cancels itself on a finger's …
vjeux Oct 27, 2026
1b84c1b
Merge main into spec/theme-motion-knobs
cixzhang Oct 27, 2026
5588985
spec(AST-108): extending themes merge field by field; 'system' adds n…
cixzhang Oct 27, 2026
ec298b6
spec(AST-108): legacy motion fields replace as a unit under extends; …
cixzhang Oct 27, 2026
13c5cfb
spec(AST-108): an extending theme inherits motion field by field, as …
cixzhang Oct 27, 2026
4051017
feat(core): a theme's motion takes tempo, character and reducedMotion
vjeux Oct 27, 2026
94194a9
feat(core): a theme with reducedMotion 'always' marks its root
vjeux Oct 27, 2026
0c4ee0b
docs(theme): the motion knobs in the motion, token and theme-authorin…
vjeux Oct 27, 2026
932be5f
feat(core): Spinner's and Skeleton's loops keep their timing under ev…
vjeux Oct 27, 2026
bae5452
docs(architecture): the theme authoring contract describes the motion…
vjeux Oct 27, 2026
ba07af7
fix(docs): the motion guide's knob list names its style; drop an unne…
vjeux Oct 27, 2026
03aafb1
test(cli): refresh the docs goldens for the motion guide's new section
vjeux Oct 27, 2026
d9a1e1a
fix(gestures): an in-band touch decides at 10 px on an element wider …
vjeux Oct 27, 2026
e6ab0b9
Merge #8061 (d9a1e1ad19: an in-band touch on an element wider than th…
vjeux Oct 27, 2026
50323d9
fix(core): an extending theme inherits motion field by field
vjeux Oct 27, 2026
833e834
refactor(core): the motion knobs' types and defaults live in a module…
vjeux Oct 27, 2026
5149d4d
spec(AST-108): 'always' reaches script readers of the preference; imp…
cixzhang Oct 27, 2026
4ecd72b
Merge #8613 (5149d4de24: 'always' reaches script readers of the prefe…
vjeux Oct 27, 2026
f97e777
Merge main into spec/theme-motion-knobs
cixzhang Oct 27, 2026
e7dc887
Merge #8613 (f97e777f23: main 2f492195 merged) into the theme motion …
vjeux Oct 27, 2026
2c6b6c0
feat(core): a theme that sets tempo or character writes them where th…
vjeux Oct 27, 2026
13f589e
docs(core): Theme's theme prop names the motion knobs' legal values
vjeux Oct 27, 2026
bc1422a
Merge main into spec/theme-motion-knobs
cixzhang Oct 27, 2026
619b3a5
Merge #8613 (bc1422a4f8: main 7526d11c merged) into the theme motion …
vjeux Oct 27, 2026
3fb31dd
Merge main (6aea9bda01: #8663 merged, one release policy) into the ex…
vjeux Oct 27, 2026
0beff2d
Merge remote-tracking branch 'origin/main' into spec/theme-motion-knobs
cixzhang Oct 27, 2026
e969525
spec(AST-108 +): FR4 scoped to tempo and character; 'always' reaches …
cixzhang Oct 27, 2026
73a1079
spec(AST-108): 'always' only adds; an ancestor's reaches nested themes
cixzhang Oct 27, 2026
b2e5e3b
Merge #8613 (73a10795f8: 'always' reaches when.motion rules; the mark…
vjeux Oct 27, 2026
bdfb4ae
feat(core): an adaptation rule keyed on motion honours reducedMotion:…
vjeux Oct 27, 2026
8d3ab3c
Merge remote-tracking branch 'origin/main' into spec/theme-motion-knobs
cixzhang Oct 27, 2026
1b4d396
spec(AST-108 +): theme-application INV1 names the 'always' exception;…
cixzhang Oct 27, 2026
389db4e
fix(core): usePressTracker rebuilds its tracker when its options change
vjeux Oct 27, 2026
d409b49
Merge #8613 (1b4d396dbc: theme-application INV1 names the 'always' ex…
vjeux Oct 27, 2026
c2e41f2
Merge #8661 (d409b49d20: a theme's motion knobs, written where the an…
vjeux Oct 27, 2026
ef632f8
feat(core): the animator's springs follow the theme's tempo and chara…
vjeux Oct 27, 2026
1d6e560
Merge remote-tracking branch 'origin/main' into spec/theme-motion-knobs
cixzhang Oct 27, 2026
7abce21
spec(AST-108 +): Spinner and Skeleton time loops before tempo; weight…
cixzhang Oct 27, 2026
5e235e6
fix(core): the layout glide plays springs.settle at the theme's tempo…
vjeux Oct 27, 2026
a31f1ec
feat(core): a CSS part paired with a spring times itself from the spr…
vjeux Oct 27, 2026
b039876
test(core): the held-dip proofs wait for the dip to finish, not for 2…
vjeux Oct 27, 2026
74bd8ae
Merge main into spec/theme-motion-knobs
cixzhang Oct 27, 2026
2a849e7
Merge #8613 (74bd8aee55: her spec on main with #8646's every-pointer …
vjeux Oct 27, 2026
f2546db
Merge #8661 (2a849e7419: her spec on main with #8646) into the animat…
vjeux Oct 27, 2026
c276005
Merge #8677 (f2546dbdc1: her spec on main with #8646) into the CSS pa…
vjeux Oct 27, 2026
0bae4a3
Merge remote-tracking branch 'origin/main' into spec/theme-motion-knobs
cixzhang Oct 27, 2026
6b94712
Merge main into spec/theme-motion-knobs
cixzhang Oct 27, 2026
91256b3
feat(core): the press release fade follows the theme's tempo
vjeux Oct 27, 2026
ff90323
Merge #8613 (6b9471233f: Button FR15's release fade follows tempo) in…
vjeux Oct 27, 2026
5b7ac47
test(scripts): the built sheet's press release reads at tempo 1
vjeux Oct 27, 2026
7bd2711
Merge main (ab0db1f735: #8613, theme motion's three knobs, merged) in…
vjeux Oct 27, 2026
f5f73ae
test(core): an ancestor's reducedMotion 'always' reaches every nested…
vjeux Oct 27, 2026
c5dad72
Merge #8661 (f5f73aed6a: main with #8613 merged) into the animator's …
vjeux Oct 27, 2026
eeec687
test(core): an ancestor's reducedMotion 'always' reaches nested theme…
vjeux Oct 27, 2026
739a47c
Merge #8677 (eeec68709d: main with #8613 merged) into the CSS part's …
vjeux Oct 27, 2026
f2b3fa3
fix(core): theme motion's knobs hold under nesting, adaptation rules …
vjeux Oct 27, 2026
885cc41
Merge main c86dc620c0 into #8661
vjeux Oct 28, 2026
9cccf6a
fix(core): an inherited slow band and character hold down the lineage…
vjeux Oct 28, 2026
4c80d32
Merge main 84faa0d94b into #8661
vjeux Oct 28, 2026
c678764
Merge main 6906bebed8 into #8661
vjeux Oct 28, 2026
3846b6a
Merge main 70ea85903c into #8073
vjeux Oct 28, 2026
ca2543d
Merge remote-tracking branch 'origin/main' into HEAD
cixzhang Oct 28, 2026
10c62f5
test(core): a mouse press ending early leaves a held row to its owner
vjeux Oct 28, 2026
fdf8766
fix(core): a press ended early clears its paint through the one writer
vjeux Oct 28, 2026
baa5c0e
Merge main 70ea85903c into #8661
vjeux Oct 28, 2026
63128d3
test(core): pressFeedback.test.ts drops its unused durationToMs import
vjeux Oct 28, 2026
f24e872
Merge #8446 ca2543df75 and #8073 63128d3530 into #8076
vjeux Oct 28, 2026
6f994bc
docs(core): the gestures README names both writers of the press attri…
vjeux Oct 28, 2026
a9c4728
fix(core): an extending theme's motion tokens resolve base first, the…
vjeux Oct 28, 2026
7876b63
test(core): under Reduce Motion a tempo never lengthens the press rel…
vjeux Oct 29, 2026
1d04698
fix(core): the press release's tempo stops at the 200 ms Reduce Motio…
vjeux Oct 29, 2026
ed992fa
test(core): a child that sets no easing keeps its base's --ease-stand…
vjeux Oct 29, 2026
d67dccc
fix(core): an inherited easing keeps the base's --ease-standard, as a…
vjeux Oct 29, 2026
9982252
docs(core): the motion knobs' record, docs and changeset say what ships
vjeux Oct 29, 2026
a4a8a38
test(core): the press release's Reduce Motion cap holds under a theme…
vjeux Oct 29, 2026
01cf318
fix(core): the press release's Reduce Motion cap follows a theme's 'a…
vjeux Oct 29, 2026
9f13940
docs(core): the reach of reducedMotion: 'always' is a known gap, and …
vjeux Oct 29, 2026
b784cb4
test(core): the release clock's tempo bound is the tempo's own maximum
vjeux Oct 29, 2026
5d848ed
test(core): the motion knobs name the properties they add beside the …
vjeux Oct 29, 2026
ba3bcaa
fix(core): the busy loops' pre-tempo copies are private: --_astryx-pr…
vjeux Oct 29, 2026
8038d44
refactor(core): the tempo and character attributes move to the pull r…
vjeux Oct 29, 2026
298ac6c
docs(cli): the motion topic keeps main's formatting for lines this pu…
vjeux Oct 29, 2026
89383b4
test(cli): the private-var check reads a defined theme's authored inp…
vjeux Oct 29, 2026
c7bc47d
fix(cli): theme build checks a defined theme's authored tokens and ru…
vjeux Oct 29, 2026
c558a89
docs(core): INV15's verification row fits the table's columns, so the…
vjeux Oct 29, 2026
fcb3249
Merge #8076 6f994bcdfb and #8661 c558a896f9 into #8677
vjeux Oct 29, 2026
bf0beb3
feat(core): Theme writes the tempo and character the animator reads, …
vjeux Oct 29, 2026
f9bd271
docs(core): the motion knobs' docs and record say the springs follow …
vjeux Oct 29, 2026
173120f
test(core): a child or a rule that sets character 'standard' matches …
vjeux Oct 29, 2026
4079610
fix(core): at 'standard', the entrance and move curves follow the res…
vjeux Oct 29, 2026
f6bb5bf
docs(core): the theme authoring contract lists motionKnobs.ts, owner …
vjeux Oct 29, 2026
b08596a
refactor(core): the press release clock's comments and test parsers s…
vjeux Oct 29, 2026
2eb19f2
Merge #8661 b08596af01 into #8677
vjeux Oct 29, 2026
a24decd
test(core): a theme or rule that sets a character writes it for the s…
vjeux Oct 29, 2026
c23d11e
feat(core): a theme or rule that sets a character writes --_astryx-mo…
vjeux Oct 29, 2026
f494462
test(core): the springs read tempo and character from the CSS the dur…
vjeux Oct 29, 2026
881e90e
test(core): the browser spring check compares settle times, less the …
vjeux Oct 29, 2026
aafa0c4
fix(core): the springs read tempo and character from the theme's cust…
vjeux Oct 29, 2026
e810246
docs(core): exits and fades keep their measured bounce at every chara…
vjeux Oct 29, 2026
e217407
test(core): the browser knob check's promise helpers are async, and i…
vjeux Oct 29, 2026
f42fdcd
docs(core): the animator reads the knobs' custom properties, and serv…
vjeux Oct 29, 2026
e5d144e
docs(core): crisp takes some bounce out of springs, and the motion te…
vjeux Oct 29, 2026
91a1bae
docs(core): resolveThemeMotion is server code's read, Theme names eve…
vjeux Oct 29, 2026
6e150ba
docs(core): the readers of reducedMotion: 'always' include the animat…
vjeux Oct 29, 2026
491f6ac
Merge #8677 6e150ba80a and main 90da4a77b6 into #8686
vjeux Oct 29, 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/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/gesture-arena-moving-cancel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@astryxdesign/core': patch
---

[chore] Internal: a gesture that cancels itself on a finger's move (a long press dragged past its tolerance) keeps that finger claimed until it lifts, so the page never takes the drag over midway; a resting finger is still given back when its gesture is cancelled. Not exported from the package entry point.

@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.

@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.

@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.

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

[chore] Internal: tap and long-press gesture recognizers with UIKit's measured thresholds. Not exported from the package entry point; no component uses them yet.
[chore] Internal: tap and long-press gesture recognizers with UIKit's measured thresholds. Not exported from the package entry point.

@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
8 changes: 8 additions & 0 deletions .changeset/theme-motion-knobs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@astryxdesign/core': patch
'@astryxdesign/cli': patch
---

[feat] A theme's `motion` takes three knobs beside the duration scale: `tempo` (0.75–1.5) scales every motion duration, the touch springs' included, `character` (`'crisp'`, `'standard'` or `'expressive'`) sets the new `--ease-entrance` and `--ease-move` tokens and how lively a spring is, and `reducedMotion: 'always'` reduces motion for everyone; so far the theme's motion-keyed adaptation rules, the press release fade and the animator, with its layout glide and Reduce Motion fade, follow it, not yet components' other Reduce Motion styles. A theme without them renders exactly as before; a duration scale and explicit tokens win over the knobs, Spinner's and Skeleton's loops keep their timing under every tempo, and the press release fade follows tempo up to the 200 ms Reduce Motion cap, under the person's setting or the theme's `'always'`. The motion, token and theme-authoring docs and the theme template describe the knobs.

@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.

@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
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 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; 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
47 changes: 41 additions & 6 deletions docs/architecture/theme-authoring-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ applies_to:
packages/core/src/theme/expandTypeScale.ts,
packages/core/src/theme/expandRadiusScale.ts,
packages/core/src/theme/expandMotionScale.ts,
packages/core/src/theme/themeMotion.ts,
packages/core/src/theme/motionKnobs.ts,
packages/core/src/theme/mergeComponents.ts,
packages/core/src/theme/onMediaTokens.ts,
packages/core/src/theme/localTokens.ts,
Expand All @@ -33,6 +35,7 @@ verified_by:
packages/core/src/theme/expandTypeScale.test.ts,
packages/core/src/theme/expandRadiusScale.test.ts,
packages/core/src/theme/expandMotionScale.test.ts,
packages/core/src/theme/themeMotion.test.ts,
packages/core/src/theme/onMediaTokens.test.ts,
scripts/check-theme-template.test.mjs,
]
Expand All @@ -52,6 +55,7 @@ deciding_specs:
spec:AST-087/DEC-7,
spec:AST-087/DEC-9,
spec:AST-087/DEC-10,
spec:AST-108/DEC-1,
]
---

Expand Down Expand Up @@ -192,6 +196,20 @@ it, typed as that theme's listed names.
- **INV14 — The variant list is theme-level.** `iconVariants` lists the variant
names the whole theme supports. It is never per icon and never combined with
another theme's list.
- **INV15 — Motion is three knobs beside the duration scale.** `motion` takes
`tempo` (clamped to 0.75–1.5), `character` (`crisp`, `standard`,
`expressive`), and `reducedMotion` (`system`, `always`) beside the duration
scale. `tempo` scales every duration token and `character` sets
`--ease-entrance` and `--ease-move`; with tempo 1 and `standard` the tokens
are the defaults. A duration scale's durations win over `tempo`, and
explicit tokens win over both. An extending theme inherits motion field by
field: a duration-scale field or knob the child leaves unset keeps its
base's value. Each duration's
value before `tempo` is kept for busy-indicator loops, which never follow
`tempo`. `reducedMotion: 'always'` marks the theme's root, and what keys
reduced motion on `prefers-reduced-motion` keys it on that mark as well
(`spec:AST-108` FR6). An adaptation rule may set `tempo` and `character`,
never `reducedMotion`.

This record does not own:

Expand Down Expand Up @@ -249,6 +267,10 @@ public surface belongs to

## Owning code

- An internal, pure `resolveThemeMotion(theme)` returns a theme's motion
knobs, durations, and easings for server code; it touches no DOM and has no
import-time side effects (`spec:AST-108` FR6). The animator reads the knobs

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This replaces the record's accepted statement that resolveThemeMotion returns role tables "for the animator and for server code" with a new reading: the animator reads the theme's custom properties and the resolver serves server code. An engineering owner needs to approve that, for example by commenting /approve-spec <full head SHA>.

from the custom properties the theme writes (`motion/themeKnobs.ts`).
- `packages/core/src/theme/defineTheme.ts` owns the public input, normalized IR,
orchestration, and extension behavior.
- `themeAdaptations.ts` owns the fixed breakpoint/condition vocabulary,
Expand All @@ -257,6 +279,9 @@ public surface belongs to
adopts their tokens.
- `expandColorScale.ts`, `expandTypeScale.ts`, `expandRadiusScale.ts`, and
`expandMotionScale.ts` own their derived token/component values.
- `motionKnobs.ts` owns the motion knobs' types, defaults and clamping;
`themeMotion.ts` owns the tokens, pre-tempo durations and knob properties
they generate, and `resolveThemeMotion`, the pure read server code uses.
- `mergeComponents.ts` owns the shared deep-merge rule.
- `onMediaTokens.ts` owns normalization of inverted-surface overrides.
- `localTokens.ts` owns opt-in enrollment, valid CSS custom-property names, exact
Expand All @@ -275,7 +300,9 @@ behavior. AST-012 decisions 1–4 establish the fixed width map, named closed co
ordered rule cascade, and source/built adaptation metadata parity. AST-017 decision 1
owns released compatibility classification and migration. AST-087 decisions 2, 7, 9,
and 10 establish function icon entries, node-valued public reads, the theme-level
`iconVariants` list, and the static public view of `componentIcons`.
`iconVariants` list, and the static public view of `componentIcons`. AST-108
decision 1 establishes the three motion knobs and keeps per-role motion values
internal.

## Known conformance and verification gaps

Expand All @@ -285,11 +312,18 @@ classify local references. Until the implementation lands, INV8's prefix-indepen
clauses are current authority but not enforcement. Existing explicit enrollment,
owner, lineage, collision, cycle, and legacy-unenrolled behavior remains shipped.

The motion resolver is accepted but unshipped: an internal, pure
`resolveThemeMotion(theme)` returns a theme's motion knobs, durations, easings,
and role tables for the animator and for server code, touching no DOM and with
no import-time side effects (`spec:AST-108` FR6). Until it lands, FR6's
resolution is current authority but not enforcement.
`resolveThemeMotion`'s role tables are accepted but unshipped (`spec:AST-108`
FR6): the animator's springs follow the knobs through the custom properties a
theme or adaptation rule writes (`motion/themeKnobs.ts`), but server code has
no role values yet. Until they land, that part of FR6 is current authority but
not enforcement.

The reach of `reducedMotion: 'always'` is accepted but partly unshipped
(`spec:AST-108` FR6, INV15). Motion-keyed adaptation rules, the press release
fade, the animator, its layout glide (`motion/animatedLayout.ts`) and
`reducedMotionFade()` key reduced motion on the mark; components' other Reduce
Motion styles and other script readers of `prefers-reduced-motion` do not yet. Until they do, that part of INV15 and FR6 is current authority but not
enforcement.

## Verification

Expand All @@ -304,5 +338,6 @@ resolution is current authority but not enforcement.
| INV11 | `DefineThemeInput`/output diff plus runtime/build fixtures | Validation-only data enters the normalized theme, or productive input loses construction validation |
| INV12 | Core theme export diff, constructed-value evidence, and current-consumer callsite | A theme `define*` helper only checks input and returns that exact input unchanged |
| INV13, INV14 | `defineTheme.test.ts` type and normalization tests for function entries, slot functions, and the list | A public read returns a function, a child merges variant lists, or an entry sees another theme's names |
| INV15 | `themeMotion.test.ts` over tempo bounds, characters, a duration scale, explicit tokens, and extension | A token off its knob, a knob beating a scale or explicit token, a lost inherited knob, or a loop following `tempo` |
| Theme/Core compatibility | Maintained theme source/build against the minimum Core in its currently supported peer/dependency range | A theme update silently requires newer in-range Core or bypasses the `spec:AST-017` path |
| Authoring projection | `scripts/check-theme-template.test.mjs` | A supported authoring concept is missing or misstated in the template |
Loading