Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
546 commits
Select commit Hold shift + click to select a range
4a9c510
Merge main (8be99c496c) into #8074: AST-094 r4 is current there, so t…
vjeux Oct 25, 2026
a272650
test(core): the browser proof shows a drag that began as a scroll sta…
vjeux Oct 25, 2026
99991ad
Merge main (c66a4146) into the gesture recognizer core
cixzhang Oct 25, 2026
d4e4c0b
docs(build): the undeclared-variable paragraph uses the build message…
vjeux Oct 25, 2026
c338e93
feat(core): a surface's press paint can be followed without an observer
vjeux Oct 25, 2026
6d0d390
Merge main into the stack (AST-094 is current on main)
cixzhang Oct 25, 2026
68be5aa
Merge main into the stack (AST-094 is current on main)
cixzhang Oct 25, 2026
7c5f71c
Merge main (67dc45f66d3) into #8054
cixzhang Oct 25, 2026
889eea5
Merge main (67dc45f66d3) into #8061
cixzhang Oct 25, 2026
37c5a3b
Merge #8270 (the press controller reads the pointer at the first touc…
vjeux Oct 25, 2026
beb248c
Merge #8309 (with #8270's lazy pointer read and subscribePressPaint) …
vjeux Oct 25, 2026
0253a49
Merge #8315 (with #8270's lazy pointer read and subscribePressPaint) …
vjeux Oct 25, 2026
6f3ed96
fix(core): a watcher's direction restricts no scroll
vjeux Oct 25, 2026
6705708
Merge main (67dc45f66d3) into #8257
cixzhang Oct 25, 2026
03f66c3
fix(core): the UIKit table keeps only what a touch presentation plays…
cixzhang Oct 25, 2026
1133bf9
Merge remote-tracking branch 'origin/main' into m8053
cixzhang Oct 25, 2026
731e59c
fix(core): the host's page hold registers nothing where the pointer i…
vjeux Oct 25, 2026
e8f90e8
fix(core): a two-finger double tap recognizes
cixzhang Oct 25, 2026
431ba77
Merge #8336 (the watcher fix, the host's page-hold gate and scrollend…
vjeux Oct 25, 2026
492f77c
test(core): the page-hold test reads listener types as they are (stri…
vjeux Oct 25, 2026
253e9b3
test(core): this line's uses of the pan's scrollHandoff go (AST-094 F…
vjeux Oct 25, 2026
d53ceef
fix(core): the finger-scroll watch ends a finger's scroll where the b…
vjeux Oct 25, 2026
da2c15e
Merge #8076 (86eb6bfdcd: the press tracker's release calls nothing ba…
vjeux Oct 25, 2026
4c2b722
Merge #8270 (with #8076's 86eb6bfdcd) into #8309
vjeux Oct 25, 2026
c1ebbe4
Merge #8309 (with #8076's 86eb6bfdcd) into #8315
vjeux Oct 25, 2026
74b010f
Merge #8315 (with #8076's 86eb6bfdcd) into #8336
vjeux Oct 25, 2026
f7c724b
Merge #8336 (with #8076's 86eb6bfdcd) into #8320
vjeux Oct 25, 2026
eded944
style(core): MEASUREMENTS.md table widths after the dropped rows
cixzhang Oct 25, 2026
4bec6a0
fix(gestures): a late timer yields to queued input, an idle cancel st…
cixzhang Oct 25, 2026
f9d0900
feat(core): the press release's curve is a press value
vjeux Oct 25, 2026
bbae49a
Merge main (cdd75aec) into the compositor animator
cixzhang Oct 25, 2026
ce0f0d5
fix(core): a same-task write keeps a call from rest on one clock
cixzhang Oct 25, 2026
3f37b97
Merge #8045 (fd1e7e1bca: the interaction jobs report to ci-duration w…
vjeux Oct 25, 2026
34689bb
Merge #8270 (with #8045's interaction-job budgets) into #8309
vjeux Oct 25, 2026
9bc30f7
Merge #8309 (with #8045's interaction-job budgets) into #8315
vjeux Oct 25, 2026
d46a3b3
Merge #8315 (with #8045's interaction-job budgets) into #8336
vjeux Oct 25, 2026
719a49f
Merge #8336 (with #8045's interaction-job budgets) into #8320
vjeux Oct 25, 2026
b6cb3d8
Merge main (#8043 landed) into the curve sampling
cixzhang Oct 25, 2026
9db9315
docs(core): the velocity weight says a rested finger releases at 0
vjeux Oct 25, 2026
7ee8fea
Merge branch 'interaction-harness-2-curves' into uikit/f3-storyboards
vjeux Oct 25, 2026
b9c5d7b
Merge branch 'uikit/f3-storyboards' into interaction-harness-3-frames
vjeux Oct 25, 2026
ee2e55e
Merge branch 'interaction-harness-3-frames' into uikit/f3-recorder-st…
vjeux Oct 25, 2026
2df7bb4
fix(core): a finger's scroll ends where the browser sends no scrollend
cixzhang Oct 25, 2026
946a6d0
fix(motion): the animator follows design:reduced-motion DR2-DR4
cixzhang Oct 25, 2026
4d61107
Merge #8336's public head (2df7bb4ca9: a finger's scroll ends where t…
vjeux Oct 25, 2026
5d3cab6
Merge #8053 (the table keeps only what a touch presentation plays; th…
vjeux Oct 25, 2026
daed39c
Merge #8054 (#8053's table, the press release's curve) into the animator
vjeux Oct 25, 2026
eef0e64
Merge the interaction-harness line (#8045) into the gesture host
cixzhang Oct 25, 2026
3ff17f6
Merge main into the gesture host
cixzhang Oct 25, 2026
37ca9f1
feat(core): a press tracker that reads each event's pointer attaches …
vjeux Oct 25, 2026
9d1c740
fix(gestures, motion): the innermost recognizer wins across fingers, …
cixzhang Oct 25, 2026
0a61a8a
Merge #8336 (2df7bb4ca9's scrollend fallback, perEventPointer for pre…
vjeux Oct 25, 2026
9f13914
Merge #8055 (the animator follows DR2-DR4; #8054's table and math) in…
vjeux Oct 25, 2026
edb1260
fix(core): a change at once ends a running fade at its target
vjeux Oct 25, 2026
e58eb58
docs(core): a touch release's fade is DR2, not DR3
vjeux Oct 25, 2026
7e36bcd
fix(core): the table's notes point at what exists, and the press entr…
cixzhang Oct 25, 2026
7d12170
Merge #8054 (#8053's table and use names; the motion math) into the t…
vjeux Oct 25, 2026
c1fa660
Merge #8053's notes and press pins into the press release's curve and…
vjeux Oct 25, 2026
59a748f
Merge #8053 (the table's notes point at what exists; the press entrie…
vjeux Oct 25, 2026
129eebf
Merge #8054 (#8053's notes and press pins) into the animator
vjeux Oct 25, 2026
e309847
Merge #8055 (#8053's notes and press pins) into the Reduce Motion policy
vjeux Oct 25, 2026
bb48125
Merge #8054 (#8053's notes and press pins) into the theme motion roles
vjeux Oct 25, 2026
b4c3b51
fix(core): the keyboard's motion is not a theme role
vjeux Oct 25, 2026
445a482
docs(core): the motion docs say when a theme value applies, not that …
vjeux Oct 25, 2026
887d1a6
feat(core): every role AST-094 FR4 names is a motion role a theme can…
vjeux Oct 25, 2026
4d912f7
docs(core): the sub-menu springs name their UIKit readings
vjeux Oct 25, 2026
e1ce687
test(cli): the docs golden lists the press release curve's motion role
vjeux Oct 25, 2026
bce6eb6
fix(core): a theme spring that never settles is refused
vjeux Oct 25, 2026
f43b3c5
docs(core): the theme guide says how motion roles inherit, with tests…
vjeux Oct 25, 2026
25d91c6
style(core): the motion-role tests are formatted after the use-name r…
vjeux Oct 25, 2026
f3e0c37
fix(core): a re-based pinch or rotation keeps its release velocity
cixzhang Oct 25, 2026
3cbf9c3
Merge #8056 (#8053's table and use names; the Reduce Motion policy wi…
vjeux Oct 25, 2026
74d8758
Merge #8446 (the harness on main with #8043; the recorder stands down…
vjeux Oct 25, 2026
cd5af89
Merge #8336's public head (3ff17f640d: the interaction-harness line a…
vjeux Oct 25, 2026
01d4e75
Merge #8336 (3ff17f640d's harness line and main) into #8320
vjeux Oct 25, 2026
b9fc673
chore(core): core keeps the interaction harness its browser proofs im…
vjeux Oct 25, 2026
0827440
Merge #8320's public head (f3e0c37406: a re-based pinch or rotation k…
vjeux Oct 25, 2026
53d5ce4
fix(Wheel): a wheel that stops outside the bounds rests on the neares…
vjeux Oct 24, 2026
9e6ddf7
test(Wheel): the rest contract runs on every pull request as a discov…
vjeux Oct 25, 2026
0797a16
fix(Wheel): under reduced motion a key step lands under its cross-fad…
vjeux Oct 25, 2026
deda725
docs(DateInput, DateTimeInput): a wheel resting on a disabled row con…
vjeux Oct 25, 2026
6511da6
Merge #8045 (b9c5d7b2: main and the harness resolution) into the them…
cixzhang Oct 25, 2026
bbe0a2b
chore(core): UIPickerView's values, the wheel's pure math and its com…
vjeux Oct 24, 2026
b1dfa5f
fix(Wheel): a bounce spring that never settles ends at the animator's…
vjeux Oct 25, 2026
bdd57da
Merge #8067 and #8257 (#8053's table and use names; #8055's Reduce Mo…
vjeux Oct 25, 2026
e0d2513
docs(core): a table's values follow the theme once it is registered
vjeux Oct 25, 2026
8dbc144
Merge #8054 (main with #8043's interaction proofs) into the animator
vjeux Oct 25, 2026
6ae3390
Merge main (#8043's interaction proofs) into the UIKit constants table
vjeux Oct 25, 2026
51b3ecb
Merge #8053 (main with #8043's interaction proofs) into the motion math
vjeux Oct 25, 2026
48ddb9a
Merge #8055 (main with #8043's interaction proofs) into the Reduce Mo…
vjeux Oct 25, 2026
7f5ece9
Merge #8054 (main with #8043's interaction proofs) into the theme mot…
vjeux Oct 25, 2026
f5b5ca1
Merge #8056 (main with #8043's interaction proofs) into the animator'…
vjeux Oct 25, 2026
008269f
Merge #8067 (main with #8043's interaction proofs) into the role-read…
vjeux Oct 25, 2026
a3b1150
Merge #8257 (main with #8043's interaction proofs) into the role-read…
vjeux Oct 25, 2026
15b8e71
fix(gestures): the velocity tracker is INV10's one filter, with AST-1…
cixzhang Oct 25, 2026
a7591e0
fix(gestures): no early claim or scroll handoff; swipe, rotation and …
cixzhang Oct 25, 2026
61f575f
perf(core): the animator reads the Reduce Motion fade, not the whole …
vjeux Oct 25, 2026
0a43629
Merge #8055 (the animator reads the Reduce Motion fade alone) into th…
vjeux Oct 25, 2026
f3f3cf3
test(core): reducedMotionFade() ships the Reduce Motion fade alone too
vjeux Oct 25, 2026
32bf991
Merge #8056 (the animator reads the Reduce Motion fade alone) into th…
vjeux Oct 25, 2026
7d95f2c
Merge #8067 (the animator reads the Reduce Motion fade alone) into th…
vjeux Oct 25, 2026
5fb1d6f
Merge #8258 (the motion chain on main with AST-094: use names, every …
vjeux Oct 25, 2026
d1070e7
Merge #8074 (the browser proof's handoff sheet leaves; main with AST-…
vjeux Oct 25, 2026
ed9d6f2
Merge #8060 (the pan recognizer hands a drag over only at its start: …
vjeux Oct 25, 2026
cd3b9ee
Merge #8075 (the build README names the undeclared-variable report as…
vjeux Oct 25, 2026
e936789
Merge main into the touch foundation
vjeux Oct 25, 2026
7379e69
chore(core): internal gesture modules carry no @experimental tag
vjeux Oct 25, 2026
1f751c9
docs(core): M-S2 feeds scroll.decelerationRate, where the coast readi…
cixzhang Oct 25, 2026
96f8240
Merge #8053 (M-S2 feeds scroll.decelerationRate) into the press relea…
vjeux Oct 25, 2026
1ae9200
Merge #8053 (M-S2 feeds scroll.decelerationRate) into the motion math
vjeux Oct 25, 2026
4eb0385
Merge #8054 (M-S2 feeds scroll.decelerationRate) into the theme motio…
vjeux Oct 25, 2026
eeb4b16
Merge #8055 (M-S2 feeds scroll.decelerationRate) into the Reduce Moti…
vjeux Oct 25, 2026
615cf0a
Merge #8054 (M-S2 feeds scroll.decelerationRate) into the animator
vjeux Oct 25, 2026
22b9dee
Merge #8067 (M-S2 feeds scroll.decelerationRate) into the role-readin…
vjeux Oct 25, 2026
3cb80f3
Merge #8056 (M-S2 feeds scroll.decelerationRate) into the animator's …
vjeux Oct 25, 2026
0cd863d
Merge #8257 (M-S2 feeds scroll.decelerationRate) into the role-readin…
vjeux Oct 25, 2026
ad07ac7
Merge #8258 (M-S2 feeds scroll.decelerationRate) into the touch found…
vjeux Oct 25, 2026
860e37b
fix(core): every same-task call from rest shares the browser's start
cixzhang Oct 25, 2026
ef7e8b5
Merge main (design:reduced-motion DR2 momentum, #8384)
cixzhang Oct 25, 2026
4b740d7
Merge #8045 (b9c5d7b253: the interaction-harness line as resolved aga…
vjeux Oct 25, 2026
8897ed5
Merge main (e36bd2e15d) into #8270
vjeux Oct 25, 2026
b2c6a10
Merge #8270 (main e36bd2e15d and the harness as resolved against it) …
vjeux Oct 25, 2026
f1ea936
Merge #8309 (main e36bd2e15d and the harness as resolved against it) …
vjeux Oct 25, 2026
611248c
Merge #8056's same-task start fix and main (design:reduced-motion DEC…
vjeux Oct 25, 2026
e43824f
fix(gestures): a code cancel keeps the event clock, simultaneity need…
cixzhang Oct 25, 2026
16b597f
fix(motion): no call skips the touch cross-fade, and a mouse move lea…
cixzhang Oct 25, 2026
b2d79c2
fix(motion): roles are named for their use, keyboard motion is no rol…
cixzhang Oct 25, 2026
96bc965
Merge #8055's fix (no call skips the touch cross-fade; a mouse move l…
vjeux Oct 25, 2026
aacd04f
Merge #8055 (no call skips the touch cross-fade; a mouse move leaves …
vjeux Oct 25, 2026
7e66e5f
Merge #8257 (b2d79c22: roles named for their use) into the theme moti…
cixzhang Oct 25, 2026
8070156
fix(core): a fine pointer's change leaves a running fade to finish
vjeux Oct 25, 2026
e03f3c9
Merge #8076 (ad07ac7872: #8074 and #8060's FR14 removal, #8258, #8075…
vjeux Oct 25, 2026
bc8b763
Merge #8270 (#8076 ad07ac7872: FR14, #8258, #8075, main caa1f04f) int…
vjeux Oct 25, 2026
c34d020
Merge #8309 (#8076 ad07ac7872) into #8315
vjeux Oct 25, 2026
d08bfbc
Merge #8315 (#8076 ad07ac7872, main e36bd2e15d and the landed harness…
vjeux Oct 25, 2026
0036a25
Merge #8336 (#8076 ad07ac7872: FR14, #8258, #8075, main) into #8320
vjeux Oct 25, 2026
0032cb6
Merge main (#8043, #7308 landed) into the UIKit constants table
cixzhang Oct 25, 2026
b92062f
fix(core): a held finger suppresses selection only where the hold doe…
cixzhang Oct 25, 2026
a95d2ea
Merge vjeux's #8270 head (8897ed593d) under the FR41 narrowing
cixzhang Oct 25, 2026
feebf83
fix(motion): the docs name roles for their use, and core keeps the in…
cixzhang Oct 25, 2026
056f026
Merge #8270 (FR41: the selection lock only where a hold acts) into th…
cixzhang Oct 25, 2026
e6d3ae3
Merge #8054 (the motion math, the table's use names and the press rel…
vjeux Oct 25, 2026
72b2649
feat(core): every role AST-094 FR4 names is a motion role a theme can…
vjeux Oct 25, 2026
9991180
docs(core): the sub-menu springs name their UIKit readings
vjeux Oct 25, 2026
e74ff9f
docs(core): the motion docs say when a theme value applies, not that …
vjeux Oct 25, 2026
e3cd975
docs(core): the theme guide says how motion roles inherit, with tests…
vjeux Oct 25, 2026
4bbd83e
test(cli): the docs golden lists the motion roles under their use names
vjeux Oct 25, 2026
a5ff4d0
Merge #8076 (ad07ac7872: #8074 and #8060's FR14 removal, #8258, #8075…
vjeux Oct 25, 2026
cc8997b
Merge #8270 (cixzhang's FR41 narrowing b92062f0b7) into #8309
vjeux Oct 25, 2026
0f6a28d
test(core): real touch proves a scroll the page makes under a still f…
vjeux Oct 25, 2026
57b293c
Merge #8309 (cixzhang's FR41 narrowing, the scroll rule's real-touch …
vjeux Oct 25, 2026
d69d80c
Merge #8315 (cixzhang's FR41 narrowing, the scroll rule's real-touch …
vjeux Oct 25, 2026
a59b398
Merge #8336 (cixzhang's FR41 narrowing, the scroll rule's real-touch …
vjeux Oct 25, 2026
927e70d
fix(gestures): pinch and rotation velocity settles; the swipe reads t…
cixzhang Oct 25, 2026
eb27e2b
fix(gestures): a lift settles the waiting recognitions it decides bef…
cixzhang Oct 25, 2026
55c0820
fix(core): a page hold reads the primary pointer at its first touch o…
vjeux Oct 25, 2026
61830bb
docs(core): useAnimator's example plays the theme's motion role, not …
cixzhang Oct 25, 2026
19ef35c
fix(interaction): the busy-main-thread verdict judges the frames the …
vjeux Oct 25, 2026
fabf814
Merge branch 'interaction-harness-3-frames' into uikit/f3-recorder-st…
vjeux Oct 25, 2026
5dba859
docs(core): a motion.durations value takes precedence for its role; t…
vjeux Oct 25, 2026
c5cb76a
Merge #8315's public head (cixzhang's 056f02644f: #8270's FR41 narrow…
vjeux Oct 25, 2026
a7f657e
Merge #8315 (cixzhang's 056f02644f) into #8336
vjeux Oct 25, 2026
a4b005d
Merge #8336 (cixzhang's 056f02644f on #8315) into #8320
vjeux Oct 25, 2026
e067db3
fix(gestures): a screen-edge pan from one edge leaves the browser eve…
cixzhang Oct 25, 2026
ce07485
Merge #8053 (0032cb6a7f: the UIKit table in its sourced, dated form) …
vjeux Oct 25, 2026
8f65477
fix(core): the pan's early-claim distance is a dated entry of the UIK…
vjeux Oct 25, 2026
a850429
fix(core): decay moves only the translate axes; the Reduce Motion not…
cixzhang Oct 26, 2026
e039480
test(core): the scroll release reproduces UIKit's on four recorded UI…
vjeux Oct 26, 2026
0c28aa6
test(core): the scroll rule's native-drag half runs where injected to…
vjeux Oct 26, 2026
98c5338
test(core): the switch's drag in the gesture fixture carries a blocki…
vjeux Oct 26, 2026
425922b
refactor(core): the gesture host never imports the selection lock; a …
cixzhang Oct 26, 2026
7c5e8af
Merge #8309 (the scroll rule's proofs per engine; the switch's blocki…
vjeux Oct 26, 2026
2833d5f
Merge #8315 (#8309's browser-proof fixes) into #8336
vjeux Oct 26, 2026
952b7de
Merge #8336 (#8309's browser-proof fixes) into #8320
vjeux Oct 26, 2026
7234d44
Merge main (99ad3f6d906) into the motion math
cixzhang Oct 26, 2026
afe98cb
Merge #8054 (main with #8053's table) into the theme motion roles
vjeux Oct 26, 2026
1ca9754
Merge main (99ad3f6d, the constants table landed) into the gesture re…
cixzhang Oct 26, 2026
20f13d8
Merge #8270 (425922b7: R2, recognizers bring their own selection lock…
cixzhang Oct 26, 2026
41f4ec2
Merge #8056 (decay moves only the translate axes; the Reduce Motion n…
vjeux Oct 26, 2026
7b5b7ee
Merge #8446 (the harness judges the frames the screencast delivered) …
vjeux Oct 26, 2026
e43ee04
Merge main (#8053's table, #8392, the harness curve oracles) into the…
vjeux Oct 26, 2026
55eff17
fix(core): a detached animator ends its callers' waits
vjeux Oct 25, 2026
789b028
Merge #8058 (main with the #8053 tables resolved) into the tap and lo…
cixzhang Oct 26, 2026
e0a7bef
Merge #8257 (the table's use names, every FR4 role, main with #8053) …
vjeux Oct 26, 2026
2e51220
Merge #8270's public head (cixzhang's 425922b7cd: the host calls a re…
vjeux Oct 26, 2026
38965ff
Merge #8067 (the maintainer's #8056 and #8055 fixes, #8446, main, a d…
vjeux Oct 26, 2026
371908b
Merge #8270 (cixzhang's 425922b7cd: a recognizer brings its own selec…
vjeux Oct 26, 2026
6a64573
docs(core): a table's values follow the theme once it is registered
vjeux Oct 25, 2026
d0bf15e
Merge #8309 (cixzhang's 425922b7cd on #8270) into #8315
vjeux Oct 26, 2026
da4fda3
Merge #8315 (cixzhang's 425922b7cd on #8270) into #8336
vjeux Oct 26, 2026
a3553d0
Merge #8258 (the maintainer's role naming and docs, #8067 with main, …
vjeux Oct 26, 2026
5de987c
Merge #8336 (cixzhang's 425922b7cd on #8270) into #8320
vjeux Oct 26, 2026
c5909e4
Merge #8059 (main with the #8053 tables resolved) into the pan recogn…
cixzhang Oct 26, 2026
b4400b8
Merge #8060 (the pan's early-claim distance as a dated table entry, U…
vjeux Oct 26, 2026
325cd1d
Merge #8315 (cixzhang's 20f13d8caa) into #8336
vjeux Oct 26, 2026
6543385
Merge #8315's public head (cixzhang's 20f13d8caa: 425922b7cd merged i…
vjeux Oct 26, 2026
855013b
Merge #8336 (cixzhang's 20f13d8caa on #8315) into #8320
vjeux Oct 26, 2026
f81f5d9
chore(core): core declares the interaction harness once
vjeux Oct 26, 2026
746871a
Merge #8258 (core declares the interaction harness once) into the tou…
vjeux Oct 26, 2026
8b65264
fix(core): where the pointer is fine, a per-event press tracker gives…
vjeux Oct 26, 2026
a131411
chore(core): the gesture host's changeset says it is internal and use…
vjeux Oct 26, 2026
a1523ee
test(core): real touch proves the second-finger rule, the page hold a…
vjeux Oct 26, 2026
684f8c1
Merge #8336 (press feedback only for a per-event tracker; three real-…
vjeux Oct 26, 2026
2567700
Merge main (99ad3f6d906) into the gesture recognizers
cixzhang Oct 26, 2026
d3d10e8
refactor(core): the finger-scroll reader is internal to the touch module
vjeux Oct 26, 2026
509ba70
docs(core): the per-event press tracker cites its pending FR19 exception
cixzhang Oct 26, 2026
ec396ae
docs(core): the finger-scroll reader is internal
cixzhang Oct 26, 2026
2fec3c6
Merge #8076 (746871a779: main 99ad3f6d with #8053 squashed, #8060 e03…
vjeux Oct 26, 2026
2452988
Merge #8270 (#8076 746871a779) into #8309
vjeux Oct 26, 2026
6c4470c
Merge #8309 (#8076 746871a779) into #8315
vjeux Oct 26, 2026
aecbd15
Merge #8315 (#8076 746871a779) into #8336
vjeux Oct 26, 2026
1295e13
Merge #8336 (#8076 746871a779) into #8320
vjeux Oct 26, 2026
c6fb9a3
docs(core): the per-event carve-out names press feedback only
cixzhang Oct 26, 2026
bf3c90f
docs(core): the carve-out sentence reads as a list of two
cixzhang Oct 26, 2026
257ec5a
Merge #8058 (1ca97544: the gesture core on main) into the experimenta…
cixzhang Oct 26, 2026
4e8fbcf
Merge #8060 (c5909e4e: pan on main's table) into the experimental tou…
cixzhang Oct 26, 2026
ff417c9
Merge #8061 (25677005: the velocity tracker on main's table) into the…
cixzhang Oct 26, 2026
89e76a5
fix(gestures): keep #8060's committed claim across the #8061 merge, a…
cixzhang Oct 26, 2026
671025d
revert(build): astryxStylex keeps no undeclared-variable warning
cixzhang Oct 26, 2026
45581ac
Merge #8336's public head (cixzhang's bf3c90f218: the per-event carve…
vjeux Oct 26, 2026
fdff3a3
Merge #8320's public head (cixzhang's ec396aec39: the finger-scroll r…
vjeux Oct 26, 2026
26262e3
test(core): the unmount test's component is defined at the top level
vjeux Oct 26, 2026
f64cc30
Merge #8336 (cixzhang's carve-out docs) into #8320
vjeux Oct 26, 2026
87796fb
Merge vjeux's #8076 head (26262e34) into the lower PRs' resolved heads
cixzhang Oct 26, 2026
daf71ae
Merge 87796fb10d (#8076 resolved against main) as a dependency
cixzhang Oct 26, 2026
a44569c
Merge 253fe637a0 (main) as a dependency
cixzhang Oct 26, 2026
5a53561
test(core): usePressTracker takes an option changed after mount from …
vjeux Oct 26, 2026
205c45c
Merge #8315 (usePressTracker's option-change test restored) into #8336
vjeux Oct 26, 2026
da5c24b
Merge #8336 (#8315's restored option-change test) into #8320
vjeux Oct 26, 2026
6c40fd2
Merge #8270 (cixzhang's a44569c753: the fold 87796fb10d with #8076's …
vjeux Oct 26, 2026
c54e17b
Merge #8309 (cixzhang's a44569c753 on #8270) into #8315
vjeux Oct 26, 2026
dca27e4
Merge #8315 (cixzhang's a44569c753 on #8270) into #8336
vjeux Oct 26, 2026
c1c8324
Merge #8270 (a44569c7: FR41 with the lock injected, #8076 resolved, m…
cixzhang Oct 26, 2026
f3ff16e
Merge #8336 (cixzhang's a44569c753 on #8270) into #8320
vjeux Oct 26, 2026
12a57a6
Merge remote-tracking branch 'origin/main' into s8315
cixzhang Oct 26, 2026
f09b506
Merge #8315's line (#8309 6c40fd2e9c with cixzhang's a44569c753; useP…
vjeux Oct 26, 2026
af532ad
Merge #8315 (cixzhang's 12a57a68d2: her #8270 merge and main) into #8336
vjeux Oct 26, 2026
f0b0002
Merge #8336 (cixzhang's #8315 head with main) into #8320
vjeux Oct 26, 2026
bb216e4
docs(Wheel): the rest's release note says when reduced motion cross-f…
vjeux Oct 25, 2026
9e15b09
Merge #8320 f0b0002c35 (the gesture line on #8076 87796fb10d) into ui…
vjeux Oct 26, 2026
3169259
docs(core): the picker values' release note leads with the theme role…
vjeux Oct 25, 2026
660a11e
Merge #8320 f0b0002c35 (the gesture line on #8076 87796fb10d) into ui…
vjeux Oct 26, 2026
9e1bbf3
fix(Wheel): the tap spin's curve is the base's renamed role, timing.c…
vjeux Oct 26, 2026
229ec9f
chore(cli): the motion topic's golden carries the picker's role on th…
vjeux Oct 26, 2026
a474f72
Merge #8131 into uikit/c21-wheel
vjeux Oct 26, 2026
ff5510c
feat(Wheel): UIPickerView's wheel under a finger, on the gesture reco…
vjeux Oct 24, 2026
05904af
test(Wheel): the touch column's cases run where the primary pointer i…
vjeux Oct 25, 2026
3842414
fix(Wheel): the touch column's tap spin reads timing.curves.move
vjeux Oct 26, 2026
2f5a9ba
fix(Wheel): the wheel's pan holds the selection lock through selectio…
vjeux Oct 26, 2026
9a40046
feat(DateInput, TimeInput, DateTimeInput): the sheets' wheels draw as…
vjeux Oct 24, 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-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 applies option changes from the next touch; the recognizer's arena plumbing is `protected`; `attachTapHaptic` gives focus straight back. Not exported from the package entry point; no component uses it yet.

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

@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: the finger count, touch gates, and a kept press for continuous-tracking controls. A scroll lock's page hold and the finger-scroll watch keep their own listeners and ask the host only about the touches it owns. 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 gets press feedback only. Internal, used by the touch components; 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; no component uses it yet.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/gesture-pan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@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.

@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, the shared press paint, delegated press tracking and the gesture hooks. 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
7 changes: 7 additions & 0 deletions .changeset/gesture-recognizer-core.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@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.

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

[chore] Internal: gesture recognizer and arena fixes from review; the early claim is opt-in, and a numeric `claimDistance` applies to any direction; one velocity tracker for every gesture (`spec:AST-100`: UIKit's measured blend, a scrolling surface's release through the pan's `scrollVelocity()`, and FR2's release rules). Not exported from the package entry point; no component uses it yet.

@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-tap-long-press.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@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.

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

@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/touch-motion-theme-roles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@astryxdesign/core': patch
'@astryxdesign/cli': patch
---

[feat] Themes can retune touch motion roles. `defineTheme({motion})` takes `springs`, `durations` and `curves` keyed by motion role, the table path of a measured touch motion value (`springs.sheetPresent`, `navigation.transitionMs`), at the root or in an adaptation rule, and writes one `--motion-*` variable per role it sets. A role the theme leaves out keeps its measured default, an unknown role id is refused, and the duration scale (`fast`, `medium`, `ratio`) is optional when a theme sets only roles. `astryx docs motion` lists every motion role with its CSS variable and default, and the theme authoring guide and template describe the new fields.

@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 takes the press feedback's selection lock for a press-tracked control's contact and for a recognizer created with `preventsTextSelection`, a non-text input under the finger included, and restores selection when the contact ends. Not exported from the package entry point; no component uses it yet.

@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] Under a finger or pen, holding a control whose hold does something (a slider's thumb, a switch's or a segmented control's drag) no longer starts text selection or the iOS callout; they come back when the finger lifts. A control or row whose hold does nothing keeps the browser's long-press selection. Text fields keep their selection, a link keeps its native menu and preview, and where the primary pointer is fine (a mouse, a trackpad, a touchscreen laptop, a desktop pen tablet) every contact keeps desktop selection. There, the press controller also registers no touch listener.

@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), drives a pseudo-element such as a dialog's ::backdrop, 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), and starts a call from rest when the browser commits it, as Core Animation does. Not exported from the package entry point.

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

[chore] Internal: a compositor animator for touch presentations. It plays UIKit's springs, scroll coasts (built by a separate coast module, so a surface that never coasts does not carry them) and any closed-form curve 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.

@vjeux
7 changes: 7 additions & 0 deletions .changeset/uikit-motion-math.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@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.

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

[chore] Internal: `useFingerScroll(scroller)` tells a finger's scroll from the program's, and the gestures README gains a guide to migrating a raw-touch drag onto the recognizers. Internal to the touch components: not exported from the package entry point or the gestures barrel.

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

[feat] Under a finger, on every touch device, the wheels in the TimeInput, DateTimeInput and DateInput bottom sheets now draw as one picker, as UIPickerView does. One selection band spans every column, and each column's dimmed rows lean toward the picker's centre instead of their own. With a mouse the sheets are unchanged.

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

[fix] A picker wheel that stops on a value outside the bounds now settles on the nearest value inside them. Before, it bounced back to the value it started from. This applies to the wheels in the TimeInput, DateTimeInput and DateInput bottom sheets. For example, with `min="09:00"`, dragging the hour wheel from 10 to 7 settles on 9, as the iOS time picker does. A stop on a value inside the bounds is unchanged. Opening a sheet on a value outside the bounds commits nothing. Under reduced motion, the wheel's own scrolls (this travel, and the step from an arrow key or a click on a row) no longer glide: on a touch screen, or after a touch drag, they cross-fade, the rows landing while they are faded out; otherwise they land at once.

@vjeux
8 changes: 8 additions & 0 deletions .changeset/wheel-uikit-picker-values.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@astryxdesign/core': patch
'@astryxdesign/cli': patch
---

[feat] A theme can retune how long a picker wheel takes to turn a tapped row onto its band: `picker.tapSpin.durationMs` is a new motion role (0.3 s, UIPickerView's), listed in the motion roles table of `astryx docs motion`. With it, UIPickerView's values measured on iOS 26.2 join the UIKit constants table. They cover the wheel's geometry (row pitch, cylinder radius, perspective, the selection band, the band row's magnification), the coast's stop speed and velocity floor, the snap at rest, the tap spin and the selection tick. The pure math a wheel moves and draws with comes with them. It projects the row a release rests on as UIScrollView sums its deceleration, coasts with the rate re-solved to stop on that row, snaps, bounces at an end on the bounce spring a theme resolved, rubber-bands, spins to a tapped row, and turns each row onto the cylinder. It is checked against UIKit's recorded frames. A player bakes a wheel's motion into per-row Web Animations that run on the compositor, and lands a wheel without travel for reduced motion (an opacity-only cross-fade). Not exported from the package entry point.

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

[feat] Under a finger, on every touch device, the picker wheels in the TimeInput, DateTimeInput and DateInput bottom sheets now look and move like UIPickerView. The rows sit on a cylinder seen in perspective, and the row in the capsule band is magnified. A flick coasts at UIKit's deceleration onto the row UIKit's projection picks. A finger landing on a moving wheel stops it. A tap on a row turns it onto the band. Past the first or last row, a drag rubber-bands and the wheel bounces back. As on iOS, the value commits when the wheel comes to rest, and the coast keeps running while the page's main thread is busy. Arrow keys and clicks on a row still commit at once. Under reduced motion, a fling, a tap, a key or a programmatic turn cross-fades onto its row instead of turning; the drag itself still follows the finger. A theme can retune the tap spin's duration (`picker.tapSpin.durationMs`) and curve (`timing.curves.move`) and the bounce at an end (`scroll.bounce`). With a mouse the wheels are unchanged.

@vjeux
5 changes: 4 additions & 1 deletion .github/scripts/ci-interaction.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ describe('interaction proof routing', () => {
}
});

it('keeps the harness, components, Storybook and its own setup in scope', () => {
it('keeps the harness, components, themes, Storybook and its own setup in scope', () => {
const pattern = new RegExp(
decide().run.match(/bash "\$helper" "\$BASE_SHA" '([^']+)'/)[1],
);
Expand All @@ -242,6 +242,8 @@ describe('interaction proof routing', () => {
'internal/a11y-spec/src/storybook.ts',
'playwright.interaction.config.ts',
'packages/core/src/BottomSheet/BottomSheet.tsx',
// Themes set the motion durations components animate with.
'packages/themes/neutral/src/neutralTheme.ts',
'apps/storybook/.storybook/preview.tsx',
'.github/workflows/ci.yml',
'package.json',
Expand All @@ -253,6 +255,7 @@ describe('interaction proof routing', () => {
'docs/specs/AST-030/spec.md',
'apps/docsite/src/app/page.tsx',
'packages/core/package.json',
'packages/themes/neutral/package.json',
'.github/scripts/native-swift.sh',
]) {
expect(pattern.test(untouched), untouched).toBe(false);
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1766,7 +1766,7 @@ jobs:
&& git fetch --quiet --no-tags --depth=1 origin "$BASE_SHA" \
&& git show "$BASE_SHA:.github/scripts/pr-scope-touches.sh" > "$helper"; then
scope=0
bash "$helper" "$BASE_SHA" '^(internal/interaction-harness/|internal/a11y-spec/|playwright\.interaction\.config\.ts$|packages/[^/]+/src/|apps/storybook/|\.github/workflows/ci\.yml$|package\.json$|pnpm-lock\.yaml$)' || scope=$?
bash "$helper" "$BASE_SHA" '^(internal/interaction-harness/|internal/a11y-spec/|playwright\.interaction\.config\.ts$|packages/[^/]+/src/|packages/themes/[^/]+/src/|apps/storybook/|\.github/workflows/ci\.yml$|package\.json$|pnpm-lock\.yaml$)' || scope=$?
fi
if [ "$scope" = 1 ]; then
echo 'No harness, component, Storybook or proof-setup change; skipping the interaction proofs.'
Expand Down
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
21 changes: 21 additions & 0 deletions apps/storybook/stories/TimeInput.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,27 @@ export const WithMinMax: Story = {
},
};

/**
* The bottom-sheet wheels with bounds: hours outside 9 AM - 5 PM stay on the
* wheel, greyed out, and a wheel that stops on one goes on to the nearest
* hour inside the bounds.
*/
export const BottomSheetWithMinMax: Story = {
render: args => {
const [value, setValue] = useState<ISOTimeString | undefined>(
'10:00' as ISOTimeString,
);
return <TimeInput {...args} value={value} onChange={setValue} />;
},
args: {
label: 'Appointment time',
presentation: 'bottom-sheet',
min: '09:00' as ISOTimeString,
max: '17:00' as ISOTimeString,
description: 'Business hours: 9 AM - 5 PM',
},
};

export const WithIncrement: Story = {
render: args => {
const [value, setValue] = useState<ISOTimeString | undefined>(
Expand Down
Loading
Loading