@astryxdesign/core 0.7.6 → 0.7.7-canary.0d1ddcd

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/AppShell/AppShell.d.ts.map +1 -1
  2. package/dist/AppShell/AppShell.js +23 -3
  3. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheetPanel.js +16 -9
  5. package/dist/Chat/ChatComposerInput.d.ts +9 -0
  6. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  7. package/dist/Chat/ChatComposerInput.js +2 -0
  8. package/dist/Chat/ChatMessage.js +2 -2
  9. package/dist/Chat/chatMessage.vars.stylex.d.ts +8 -8
  10. package/dist/Chat/chatMessage.vars.stylex.js +8 -8
  11. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  12. package/dist/CommandPalette/CommandPaletteInput.js +8 -1
  13. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  14. package/dist/DateInput/MonthScroller.js +72 -2
  15. package/dist/Drawer/Drawer.d.ts.map +1 -1
  16. package/dist/Drawer/Drawer.js +6 -0
  17. package/dist/DropdownMenu/useMenuOverflow.d.ts +13 -3
  18. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  19. package/dist/DropdownMenu/useMenuOverflow.js +31 -8
  20. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  21. package/dist/Field/PanelSearchInput.js +8 -1
  22. package/dist/Field/textEntryTraits.d.ts +6 -6
  23. package/dist/Field/textEntryTraits.js +6 -6
  24. package/dist/Link/Link.d.ts.map +1 -1
  25. package/dist/Link/Link.js +1 -0
  26. package/dist/Selector/Selector.d.ts.map +1 -1
  27. package/dist/Selector/Selector.js +25 -13
  28. package/dist/Slider/Slider.d.ts.map +1 -1
  29. package/dist/Slider/Slider.js +404 -131
  30. package/dist/Slider/sliderTouchController.d.ts +189 -0
  31. package/dist/Slider/sliderTouchController.d.ts.map +1 -0
  32. package/dist/Slider/sliderTouchController.js +1017 -0
  33. package/dist/Slider/useSliderTouch.d.ts +22 -0
  34. package/dist/Slider/useSliderTouch.d.ts.map +1 -0
  35. package/dist/Slider/useSliderTouch.js +56 -0
  36. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  37. package/dist/Typeahead/BaseTypeahead.js +19 -9
  38. package/dist/astryx.css +33 -6
  39. package/dist/gestures/GestureArena.d.ts.map +1 -1
  40. package/dist/gestures/GestureArena.js +4 -1
  41. package/dist/gestures/GestureHost.d.ts +72 -2
  42. package/dist/gestures/GestureHost.d.ts.map +1 -1
  43. package/dist/gestures/GestureHost.js +643 -5
  44. package/dist/gestures/GestureRecognizer.d.ts +15 -1
  45. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  46. package/dist/gestures/GestureRecognizer.js +12 -0
  47. package/dist/gestures/PanGestureRecognizer.d.ts +8 -0
  48. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  49. package/dist/gestures/PinchGestureRecognizer.d.ts +5 -1
  50. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -1
  51. package/dist/gestures/PinchGestureRecognizer.js +10 -0
  52. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +3 -3
  53. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
  54. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +7 -5
  55. package/dist/gestures/nativeScroll.d.ts +16 -2
  56. package/dist/gestures/nativeScroll.d.ts.map +1 -1
  57. package/dist/gestures/nativeScroll.js +39 -8
  58. package/dist/gestures/recognizerInternals.d.ts +4 -2
  59. package/dist/gestures/recognizerInternals.d.ts.map +1 -1
  60. package/dist/gestures/types.d.ts +11 -0
  61. package/dist/gestures/types.d.ts.map +1 -1
  62. package/dist/gestures/types.js +7 -0
  63. package/dist/gestures/wheelSegmenter.d.ts +45 -0
  64. package/dist/gestures/wheelSegmenter.d.ts.map +1 -0
  65. package/dist/gestures/wheelSegmenter.js +98 -0
  66. package/dist/motion/animator.d.ts.map +1 -1
  67. package/dist/motion/animator.js +140 -19
  68. package/dist/motion/paging.d.ts +58 -0
  69. package/dist/motion/paging.d.ts.map +1 -0
  70. package/dist/motion/paging.js +128 -0
  71. package/dist/motion/uikit/index.d.ts +2 -1
  72. package/dist/motion/uikit/index.d.ts.map +1 -1
  73. package/dist/motion/uikit/index.js +2 -1
  74. package/dist/motion/uikit/paging.d.ts +160 -0
  75. package/dist/motion/uikit/paging.d.ts.map +1 -0
  76. package/dist/motion/uikit/paging.js +162 -0
  77. package/dist/motion/uikit/scroll.d.ts +0 -19
  78. package/dist/motion/uikit/scroll.d.ts.map +1 -1
  79. package/dist/motion/uikit/scroll.js +2 -21
  80. package/dist/motion/uikit/slider.d.ts +97 -0
  81. package/dist/motion/uikit/slider.d.ts.map +1 -0
  82. package/dist/motion/uikit/slider.js +111 -0
  83. package/dist/motion/uikit/springs.d.ts +46 -1
  84. package/dist/motion/uikit/springs.d.ts.map +1 -1
  85. package/dist/motion/uikit/springs.js +48 -4
  86. package/package.json +5 -5
  87. package/src/AppShell/AppShell.doc.mjs +10 -0
  88. package/src/AppShell/AppShell.tsx +48 -2
  89. package/src/BottomSheet/BottomSheetPanel.tsx +16 -9
  90. package/src/Chat/Chat.doc.mjs +1 -0
  91. package/src/Chat/ChatComposerInput.doc.mjs +11 -0
  92. package/src/Chat/ChatComposerInput.tsx +11 -0
  93. package/src/Chat/ChatMessage.tsx +2 -2
  94. package/src/Chat/chatMessage.vars.stylex.ts +8 -8
  95. package/src/CommandPalette/CommandPaletteInput.tsx +6 -0
  96. package/src/DateInput/MonthScroller.tsx +63 -5
  97. package/src/Drawer/Drawer.tsx +6 -0
  98. package/src/DropdownMenu/useMenuOverflow.ts +44 -8
  99. package/src/Field/PanelSearchInput.tsx +6 -0
  100. package/src/Field/textEntryTraits.ts +6 -6
  101. package/src/Link/Link.tsx +3 -0
  102. package/src/Selector/Selector.tsx +29 -2
  103. package/src/Slider/Slider.doc.mjs +11 -7
  104. package/src/Slider/Slider.tsx +539 -132
  105. package/src/Slider/sliderTouchController.ts +1209 -0
  106. package/src/Slider/useSliderTouch.ts +78 -0
  107. package/src/Typeahead/BaseTypeahead.tsx +16 -8
  108. package/src/gestures/GestureArena.ts +1 -0
  109. package/src/gestures/GestureHost.ts +765 -5
  110. package/src/gestures/GestureRecognizer.ts +28 -0
  111. package/src/gestures/PanGestureRecognizer.ts +8 -0
  112. package/src/gestures/PinchGestureRecognizer.ts +16 -1
  113. package/src/gestures/README.md +63 -0
  114. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +7 -5
  115. package/src/gestures/nativeScroll.ts +49 -9
  116. package/src/gestures/recognizerInternals.ts +9 -2
  117. package/src/gestures/types.ts +12 -0
  118. package/src/gestures/wheelSegmenter.ts +114 -0
  119. package/src/motion/MEASUREMENTS.md +8 -1
  120. package/src/motion/README.md +3 -2
  121. package/src/motion/animator.ts +193 -25
  122. package/src/motion/paging.ts +138 -0
  123. package/src/motion/uikit/index.ts +2 -1
  124. package/src/motion/uikit/paging.ts +162 -0
  125. package/src/motion/uikit/scroll.ts +2 -18
  126. package/src/motion/uikit/slider.ts +105 -0
  127. package/src/motion/uikit/springs.ts +37 -2
  128. package/dist/motion/selectPage.d.ts +0 -26
  129. package/dist/motion/selectPage.d.ts.map +0 -1
  130. package/dist/motion/selectPage.js +0 -55
  131. package/src/motion/selectPage.ts +0 -55
@@ -0,0 +1,162 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file paging.ts
5
+ * @input Nothing; data only
6
+ * @output Exports `paging`, the measured constants of a paging UIScrollView
7
+ * @position The paging domain of the UIKit constants table (motion/uikit). Only
8
+ * core reads it, so the `uikit` namespace does not re-export it
9
+ *
10
+ * SYNC: When modified, update:
11
+ * - /packages/core/src/motion/MEASUREMENTS.md (measurement tasks)
12
+ * - /packages/core/src/motion/paging.ts and paging.test.ts
13
+ */
14
+
15
+ export const paging = {
16
+ /**
17
+ * After the lift, one model moves the content: the settle onto the chosen
18
+ * page and the return from an overscroll. Each display frame runs floor(frame
19
+ * interval in ms) steps of 1 ms:
20
+ *
21
+ * v = (v + (target − x) · springPull) · friction; x += v (v: pt per step)
22
+ *
23
+ * A 60 Hz frame runs 16 steps, not 16.67. With these values, the model
24
+ * replays eight captured releases to 0.20 pt RMS. It replays five overscroll
25
+ * returns to 0.16–0.33 pt RMS (402 pt pages, iOS 26.2, 3× screen). Without
26
+ * the floor, the error is 1.0 pt RMS, with a systematic shape.
27
+ */
28
+ integrator: {
29
+ /**
30
+ * Velocity added per 1 ms step, per point of distance to the target page
31
+ * (pt per step²).
32
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026.
33
+ * `_pagingSpringPull` reads the same on a 402 pt paging UIScrollView and
34
+ * on UIPageViewController's scroll view. It replays 8 captured settles to
35
+ * 0.20 pt RMS.
36
+ */
37
+ springPull: 0.000284858,
38
+ /**
39
+ * Velocity kept per step after the pull (`_pagingFriction`, equal to
40
+ * `_defaultPagingFriction`).
41
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. Both read
42
+ * the same on the two scroll views of `springPull`, and they replay with
43
+ * it.
44
+ */
45
+ friction: 0.970815,
46
+ /**
47
+ * Integration steps per second: floor(16.67 ms) = 16 steps per 60 Hz frame,
48
+ * and floor(8.33 ms) = 8 per 120 Hz frame, so 960.
49
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. In a 60 fps
50
+ * log of 8 releases at rest, floored stepping fits to 0.20 pt RMS.
51
+ * Unfloored stepping fits to 1.0 pt RMS.
52
+ */
53
+ stepsPerSecond: 960,
54
+ /**
55
+ * A settle ends exactly on the page once the remaining distance is below
56
+ * this many points and the step velocity is below `restSpeed`.
57
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. The
58
+ * captured settles jump the last 0.33 pt onto the page about 0.35 s after
59
+ * a release at rest.
60
+ */
61
+ restDistance: 0.5,
62
+ /**
63
+ * Step velocity (pt per step) below which a settle may end.
64
+ * @source GUESS — the captured settles end at about 0.04 pt per step;
65
+ * the threshold is not observable more finely at 60 fps
66
+ * @measure M-PG12
67
+ */
68
+ restSpeed: 0.05
69
+ },
70
+ release: {
71
+ /**
72
+ * Released slower than `advanceSpeed`, the scroll view settles on the page
73
+ * nearest the content position: past half a page, the next one.
74
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. In releases
75
+ * at rest from page 1, content at 48.5 % of the page stays, and 57.5 %
76
+ * goes to the next page. On a second 402 pt pager, 45 % stays and 55 %
77
+ * advances.
78
+ */
79
+ commitFraction: 0.5,
80
+ /**
81
+ * Released at least this fast (pt/s), the scroll view pages in the
82
+ * direction of the velocity, from any content position. A flick from 6 % of
83
+ * the page advances. The speed is UIPanGestureRecognizer's velocity at the
84
+ * last movement, and it never decays. The scroll view's
85
+ * `_horizontalVelocity` equals it at every sample. A drag held still for
86
+ * 397 ms before the lift still pages at the speed it had.
87
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. Steady
88
+ * releases at 10, 25 and 40 % of a 402 pt page: 292.7, 295.3 and 298.6
89
+ * pt/s stay; 310.7, 316.4 and 329.9 advance. The result is the same at
90
+ * every position: a threshold, not a projection.
91
+ */
92
+ advanceSpeed: 300,
93
+ /**
94
+ * A settle velocity slower than this (pt/s) is zeroed, so the settle starts
95
+ * at rest. It is paging's own tuning on the one release velocity that every
96
+ * gesture reads.
97
+ * @source GUESS — the middle of the measured (200, 249] bracket. In the
98
+ * UIKit lab (iOS 26.2 simulator, Oct 23 2026),
99
+ * `scrollViewWillEndDragging` reads 0 for steady releases at 175 and 200
100
+ * pt/s. It reads 0.249 pt/ms for a release at 249 pt/s.
101
+ * @measure M-PG13
102
+ */
103
+ velocityFloor: 225,
104
+ /**
105
+ * Pages a release may travel from the page the drag started on, at any
106
+ * speed and drag distance.
107
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. A drag of
108
+ * 1.5 pages from page 1 lands on page 2 at release speeds of 0, 600 and
109
+ * 3000 pt/s.
110
+ */
111
+ maxPagesFromStart: 1
112
+ },
113
+ /**
114
+ * A finger that lands on a settling pager does not stop it at once. The
115
+ * settle runs on for about this long, then the content holds under the
116
+ * finger. Lifted without a move, the content settles again on the nearest
117
+ * page.
118
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. After
119
+ * touch-downs 60 and 160 ms into a settle, the content moved on for 82.6
120
+ * and 87.5 ms (5 frames), then held.
121
+ */
122
+ catchStopMs: 85,
123
+ /**
124
+ * A horizontal pager's pan begins only for a drag within atan(1 ÷ this) of
125
+ * horizontal (26.6° for 2). A steeper drag goes to the vertical scroll around
126
+ * it. Between 26.6° and 45°, neither moves.
127
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. A scroll
128
+ * view's directional lock holds the major axis up to 25° and frees it from
129
+ * 30°. An inline calendar pager in a sheet pages at 20° from horizontal. At
130
+ * 35° and 45°, it moves neither itself nor the sheet, and it leaves 55° to
131
+ * the sheet.
132
+ */
133
+ panAxisRatio: 2,
134
+ animatedScroll: {
135
+ /**
136
+ * `setContentOffset(_:animated:)` duration. It is the same for one page and
137
+ * for five, as for a page control's tap.
138
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026.
139
+ * `_contentOffsetAnimationDuration` reads 0.3, and five animated moves of
140
+ * 1 to 5 pages each last 0.30 s.
141
+ */
142
+ duration: 0.3,
143
+ /**
144
+ * Its curve is a sinusoidal ease-in-out: x = from + (to − from) · (1 − cos
145
+ * πu) ÷ 2, for u = t ÷ duration.
146
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. The five
147
+ * moves fit the sinusoid to 0.14–0.51 pt RMS, and a 2010 pt move fits to
148
+ * 0.20 pt. The curve easeInEaseOut (0.42, 0, 0.58, 1) misses by 7.7 pt.
149
+ */
150
+ curve: 'sineInOut'
151
+ },
152
+ /**
153
+ * Past the first or last page, the content follows the finger through the
154
+ * scroll view's rubber band (scroll.rubberBand.coefficient), with d = the
155
+ * page width. It returns on the integrator above.
156
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. A pan of 90
157
+ * pt past page 0 shows 42.7–45 pt, and 290 pt shows 114.3 pt. The formula
158
+ * gives 44.1 and 114.2, with c 0.55 and d 402. The return replays on the
159
+ * integrator to 0.16–0.33 pt RMS.
160
+ */
161
+ rubberBandDimension: 'pageWidth'
162
+ };
@@ -59,25 +59,6 @@ export declare const scroll: {
59
59
  readonly duration: 0.5;
60
60
  readonly bounce: 0;
61
61
  };
62
- readonly paging: {
63
- /**
64
- * Deceleration rate a paging release is projected with to pick the next
65
- * page.
66
- * @source GUESS — UIScrollView paging behaves like a fast scroll view;
67
- * the rate it uses internally is not documented
68
- * @measure M-PG1
69
- */
70
- readonly projectionRate: 0.99;
71
- /**
72
- * The spring that carries a paging scroll view onto its page.
73
- * @source GUESS — SwiftUI `.smooth` default until measured
74
- * @measure M-PG1
75
- */
76
- readonly snap: {
77
- readonly duration: 0.5;
78
- readonly bounce: 0;
79
- };
80
- };
81
62
  /**
82
63
  * `delaysContentTouches`: how long a scroll view holds a touch-down from
83
64
  * its content while it decides whether the touch is a scroll (no highlight
@@ -1 +1 @@
1
- {"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/scroll.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,eAAO,MAAM,MAAM;;QAEf;;;;;;;;;;;;;;;;WAgBG;;QAEH;;;;;;;WAOG;;;;QAIH;;;;;;;;;;;WAWG;;;IAGL;;;;;;;;;;OAUG;;;;;;QAGD;;;;;;WAMG;;QAEH;;;;WAIG;;;;;;IAGL;;;;;;;;;;OAUG;;IAEH;;;;;;;;;;;;;;OAcG;;CAEK,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
1
+ {"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/scroll.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,eAAO,MAAM,MAAM;;QAEf;;;;;;;;;;;;;;;;WAgBG;;QAEH;;;;;;;WAOG;;;;QAIH;;;;;;;;;;;WAWG;;;IAGL;;;;;;;;;;OAUG;;;;;IAEH;;;;;;;;;;OAUG;;IAEH;;;;;;;;;;;;;;OAcG;;CAEK,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
@@ -4,8 +4,8 @@
4
4
  * @file scroll.ts
5
5
  * @input Nothing; data only
6
6
  * @output Exports `scroll`, the UIScrollView constants: deceleration rates,
7
- * the rubber-band coefficient, the bounce-back spring, paging and the
8
- * content-touch delay
7
+ * the rubber-band coefficient, the bounce-back spring and the content-touch
8
+ * delay
9
9
  * @position The scroll domain of the UIKit constants table (motion/uikit);
10
10
  * read by the motion math and components
11
11
  *
@@ -84,25 +84,6 @@ export const scroll = {
84
84
  duration: 0.5,
85
85
  bounce: 0
86
86
  },
87
- paging: {
88
- /**
89
- * Deceleration rate a paging release is projected with to pick the next
90
- * page.
91
- * @source GUESS — UIScrollView paging behaves like a fast scroll view;
92
- * the rate it uses internally is not documented
93
- * @measure M-PG1
94
- */
95
- projectionRate: 0.99,
96
- /**
97
- * The spring that carries a paging scroll view onto its page.
98
- * @source GUESS — SwiftUI `.smooth` default until measured
99
- * @measure M-PG1
100
- */
101
- snap: {
102
- duration: 0.5,
103
- bounce: 0
104
- }
105
- },
106
87
  /**
107
88
  * `delaysContentTouches`: how long a scroll view holds a touch-down from
108
89
  * its content while it decides whether the touch is a scroll (no highlight
@@ -0,0 +1,97 @@
1
+ /**
2
+ * UISlider's touch values: hit target, tracking, release coast, lift, drop
3
+ * and the end-of-track haptic.
4
+ */
5
+ export declare const slider: {
6
+ /**
7
+ * The thumb's touch target, a square in pt centered on the thumb. It is
8
+ * the 37 × 24 pt thumb grown by its hit edge insets: 12 pt above and
9
+ * below, 5.5 pt left and right. UIKit hit-tests inside the control's frame
10
+ * first, so the lab's 40 pt frame clipped it to 48 × 40.
11
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro.
12
+ * `_thumbHitEdgeInsets` reads {−12, −5.5, −12, −5.5}. Touch-downs on a
13
+ * 4 pt grid take the thumb from −24 to +20 pt in x. A track tap away
14
+ * from the thumb moves nothing. Oct 23 2026
15
+ */
16
+ readonly thumbHitTarget: 48;
17
+ /**
18
+ * Value range per track length of finger travel. The value moves by
19
+ * (max − min) × translation ÷ the track's full length. The translation
20
+ * counts from the pan's threshold: the touch-down point plus 10 pt along
21
+ * the track. 1 means one full range per track length.
22
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. In
23
+ * drags at 120 to 2000 pt/s, each event's value is v0 plus the
24
+ * translation past 10 pt ÷ 300. Past the max end, the value leaves 1
25
+ * only once the finger comes back past where it reached 1. Oct 23 2026
26
+ */
27
+ readonly trackingGain: 1;
28
+ /**
29
+ * The coast after the lift. The thumb and the value spring from where the
30
+ * finger left them to the projected target, with the release velocity.
31
+ * Critically damped, it never overshoots a target ahead of it.
32
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
33
+ * `UIViewSpringAnimationBehavior` at the lift reads response 0.4 and
34
+ * damping ratio 1. Four releases fit it per frame, at rms 0.11 pt or
35
+ * less. Oct 23 2026
36
+ */
37
+ readonly releaseSpring: {
38
+ readonly response: 0.4;
39
+ readonly dampingRatio: 1;
40
+ };
41
+ /**
42
+ * The deceleration rate of the coast's momentum projection, per ms
43
+ * (WWDC18's `project`). It is not UIScrollView's normal rate (0.998), so
44
+ * pass it to the projection explicitly.
45
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
46
+ * release behavior's projection deceleration reads 0.996. Oct 23 2026
47
+ */
48
+ readonly releaseProjectionRate: 0.996;
49
+ /**
50
+ * How much of the projection the coast travels. The target is the lift
51
+ * value plus this share of the projected distance. A finger lifted outside
52
+ * the control's tracking bounds coasts back to the lift value instead.
53
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
54
+ * release behavior's target smoothing reads 0.4. A 126.9 pt/s release
55
+ * travels 12.56 pt, against 12.64 predicted. Oct 23 2026
56
+ */
57
+ readonly releaseProjectionShare: 0.4;
58
+ /**
59
+ * The thumb's growth under a finger, uniform about its center (37 × 24 to
60
+ * 57.35 × 37.2 pt).
61
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The lens
62
+ * frame settled during an 800 ms hold. Oct 23 2026
63
+ */
64
+ readonly liftScale: 1.55;
65
+ /**
66
+ * The lift: the thumb grows to `liftScale` when the finger lands.
67
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The lens
68
+ * width per frame in an 800 ms hold fits one spring at rms 0.31 pt.
69
+ * Oct 23 2026
70
+ */
71
+ readonly liftSpring: {
72
+ readonly response: 0.215;
73
+ readonly dampingRatio: 0.6;
74
+ };
75
+ /**
76
+ * The drop: the thumb shrinks back to its rest size when the finger lifts,
77
+ * while the coast runs.
78
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
79
+ * lens's spring at the lift of an 800 ms hold reads response 0.5 s and
80
+ * damping ratio 0.7. The width per frame fits it at rms 0.10 pt.
81
+ * Oct 23 2026
82
+ */
83
+ readonly dropSpring: {
84
+ readonly response: 0.5;
85
+ readonly dampingRatio: 0.7;
86
+ };
87
+ /**
88
+ * The feedback each time the value reaches an end, once per entry. It
89
+ * re-arms when the value leaves the end, in the drag and the coast. UIKit
90
+ * plays "Micro Tap Medium", and the web stand-in is the closest kind.
91
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
92
+ * haptics log of drags into both ends shows the fluid slider generator's
93
+ * "Micro Tap Medium" once per entry. Oct 23 2026
94
+ */
95
+ readonly endHaptic: "impactMedium";
96
+ };
97
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/slider.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,eAAO,MAAM,MAAM;IACjB;;;;;;;;;OASG;;IAEH;;;;;;;;;OASG;;IAEH;;;;;;;;OAQG;;;;;IAEH;;;;;;OAMG;;IAEH;;;;;;;OAOG;;IAEH;;;;;OAKG;;IAEH;;;;;OAKG;;;;;IAEH;;;;;;;OAOG;;;;;IAEH;;;;;;;OAOG;;CAEK,CAAC"}
@@ -0,0 +1,111 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file slider.ts
5
+ * @input Nothing: data only
6
+ * @output Exports `slider`: UISlider's hit target, tracking rule, release
7
+ * coast, lift, drop and end haptic, measured on the iOS 26.2 simulator
8
+ * @position The slider domain of the UIKit constants table (motion/uikit).
9
+ * Lengths are in pt (CSS px). Tests check each leaf's `@source`.
10
+ *
11
+ * SYNC: When modified, update:
12
+ * - /packages/core/src/Slider/sliderTouchController.ts
13
+ * - /packages/core/src/Slider/Slider.tsx
14
+ * - /packages/core/src/motion/uikit/slider.test.ts
15
+ */
16
+
17
+ import { SLIDER_RELEASE_SPRING } from "./springs.js";
18
+
19
+ /**
20
+ * UISlider's touch values: hit target, tracking, release coast, lift, drop
21
+ * and the end-of-track haptic.
22
+ */
23
+ export const slider = {
24
+ /**
25
+ * The thumb's touch target, a square in pt centered on the thumb. It is
26
+ * the 37 × 24 pt thumb grown by its hit edge insets: 12 pt above and
27
+ * below, 5.5 pt left and right. UIKit hit-tests inside the control's frame
28
+ * first, so the lab's 40 pt frame clipped it to 48 × 40.
29
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro.
30
+ * `_thumbHitEdgeInsets` reads {−12, −5.5, −12, −5.5}. Touch-downs on a
31
+ * 4 pt grid take the thumb from −24 to +20 pt in x. A track tap away
32
+ * from the thumb moves nothing. Oct 23 2026
33
+ */
34
+ thumbHitTarget: 48,
35
+ /**
36
+ * Value range per track length of finger travel. The value moves by
37
+ * (max − min) × translation ÷ the track's full length. The translation
38
+ * counts from the pan's threshold: the touch-down point plus 10 pt along
39
+ * the track. 1 means one full range per track length.
40
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. In
41
+ * drags at 120 to 2000 pt/s, each event's value is v0 plus the
42
+ * translation past 10 pt ÷ 300. Past the max end, the value leaves 1
43
+ * only once the finger comes back past where it reached 1. Oct 23 2026
44
+ */
45
+ trackingGain: 1,
46
+ /**
47
+ * The coast after the lift. The thumb and the value spring from where the
48
+ * finger left them to the projected target, with the release velocity.
49
+ * Critically damped, it never overshoots a target ahead of it.
50
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
51
+ * `UIViewSpringAnimationBehavior` at the lift reads response 0.4 and
52
+ * damping ratio 1. Four releases fit it per frame, at rms 0.11 pt or
53
+ * less. Oct 23 2026
54
+ */
55
+ releaseSpring: SLIDER_RELEASE_SPRING,
56
+ /**
57
+ * The deceleration rate of the coast's momentum projection, per ms
58
+ * (WWDC18's `project`). It is not UIScrollView's normal rate (0.998), so
59
+ * pass it to the projection explicitly.
60
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
61
+ * release behavior's projection deceleration reads 0.996. Oct 23 2026
62
+ */
63
+ releaseProjectionRate: 0.996,
64
+ /**
65
+ * How much of the projection the coast travels. The target is the lift
66
+ * value plus this share of the projected distance. A finger lifted outside
67
+ * the control's tracking bounds coasts back to the lift value instead.
68
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
69
+ * release behavior's target smoothing reads 0.4. A 126.9 pt/s release
70
+ * travels 12.56 pt, against 12.64 predicted. Oct 23 2026
71
+ */
72
+ releaseProjectionShare: 0.4,
73
+ /**
74
+ * The thumb's growth under a finger, uniform about its center (37 × 24 to
75
+ * 57.35 × 37.2 pt).
76
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The lens
77
+ * frame settled during an 800 ms hold. Oct 23 2026
78
+ */
79
+ liftScale: 1.55,
80
+ /**
81
+ * The lift: the thumb grows to `liftScale` when the finger lands.
82
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The lens
83
+ * width per frame in an 800 ms hold fits one spring at rms 0.31 pt.
84
+ * Oct 23 2026
85
+ */
86
+ liftSpring: {
87
+ response: 0.215,
88
+ dampingRatio: 0.6
89
+ },
90
+ /**
91
+ * The drop: the thumb shrinks back to its rest size when the finger lifts,
92
+ * while the coast runs.
93
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
94
+ * lens's spring at the lift of an 800 ms hold reads response 0.5 s and
95
+ * damping ratio 0.7. The width per frame fits it at rms 0.10 pt.
96
+ * Oct 23 2026
97
+ */
98
+ dropSpring: {
99
+ response: 0.5,
100
+ dampingRatio: 0.7
101
+ },
102
+ /**
103
+ * The feedback each time the value reaches an end, once per entry. It
104
+ * re-arms when the value leaves the end, in the drag and the coast. UIKit
105
+ * plays "Micro Tap Medium", and the web stand-in is the closest kind.
106
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
107
+ * haptics log of drags into both ends shows the fluid slider generator's
108
+ * "Micro Tap Medium" once per entry. Oct 23 2026
109
+ */
110
+ endHaptic: 'impactMedium'
111
+ };
@@ -399,6 +399,39 @@ export declare const BANNER_SPRING: {
399
399
  readonly stiffness: 1000;
400
400
  readonly damping: 500;
401
401
  };
402
+ /**
403
+ * UISlider's release: after a finger lifts, the thumb settles on this spring
404
+ * toward 0.4 of the release's momentum projection. It is critically damped,
405
+ * so it never overshoots a target ahead of it.
406
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
407
+ * `UIViewSpringAnimationBehavior` at the lift reads response 0.4 and
408
+ * damping ratio 1. Four releases fit it per frame (the UIKit slider
409
+ * table). Oct 23 2026
410
+ */
411
+ export declare const SLIDER_RELEASE_SPRING: {
412
+ readonly response: 0.4;
413
+ readonly dampingRatio: 1;
414
+ };
415
+ /**
416
+ * UISlider's lift: a finger's touch-down scales the thumb up on this spring.
417
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
418
+ * thumb's scale per frame after touch-down (the UIKit slider table).
419
+ * Oct 23 2026
420
+ */
421
+ export declare const SLIDER_LIFT_SPRING: {
422
+ readonly response: 0.215;
423
+ readonly dampingRatio: 0.6;
424
+ };
425
+ /**
426
+ * UISlider's drop: the lift's end scales the thumb back down on this spring.
427
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
428
+ * thumb's scale per frame after the lift (the UIKit slider table).
429
+ * Oct 23 2026
430
+ */
431
+ export declare const SLIDER_DROP_SPRING: {
432
+ readonly response: 0.5;
433
+ readonly dampingRatio: 0.7;
434
+ };
402
435
  /**
403
436
  * Every spring above, by row name: the table the existing readers use. A
404
437
  * component imports only the rows it plays (`architecture:component-style-authoring`
@@ -550,9 +583,21 @@ export declare const springs: {
550
583
  readonly stiffness: 1000;
551
584
  readonly damping: 500;
552
585
  };
586
+ readonly sliderRelease: {
587
+ readonly response: 0.4;
588
+ readonly dampingRatio: 1;
589
+ };
590
+ readonly sliderLift: {
591
+ readonly response: 0.215;
592
+ readonly dampingRatio: 0.6;
593
+ };
594
+ readonly sliderDrop: {
595
+ readonly response: 0.5;
596
+ readonly dampingRatio: 0.7;
597
+ };
553
598
  };
554
599
  /**
555
- * Registers the springs spec:AST-094 FR4 names as internal motion roles
600
+ * Registers the role springs (`SPRING_ROLES`) as internal motion roles
556
601
  * (motion/roles.ts), by their row names (`springs.settle`). Every other
557
602
  * spring, UIKit's menu spring under Reduce Motion and the keyboard's
558
603
  * included, is not a role. Nothing registers on import: the touch code that
@@ -1 +1 @@
1
- {"version":3,"file":"springs.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/springs.ts"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;CAAsC,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;CAAyC,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,eAAe;;;CAAwC,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;CAGzB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;CAA6C,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;CAAsC,CAAC;AAEvE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAMX;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB;;;CAA4C,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;CAA4C,CAAC;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,wCAAwC;;;CAG3C,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;;;CAGjC,CAAC;AAMX;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB;;;CAGtB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB;;;CAG5B,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;CAG7B,CAAC;AAMX;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;CAI9B,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,2BAA2B;;;;CAI9B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;CAA+C,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;CAAgD,CAAC;AAE/E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAEX;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB;;;CAA4C,CAAC;AAE9E;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;CAG3B,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,2BAA2B;;;CAG9B,CAAC;AAEX;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB;;;CAG5B,CAAC;AAEX;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B;;;CAG7B,CAAC;AAMX;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB;;;CAG3B,CAAC;AAEX;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B;;;CAG9B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;CAGzB,CAAC;AAMX;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;;CAAoD,CAAC;AAE/E;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCV,CAAC;AAwBX;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
1
+ {"version":3,"file":"springs.d.ts","sourceRoot":"","sources":["../../../src/motion/uikit/springs.ts"],"names":[],"mappings":"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"}
@@ -488,6 +488,42 @@ export const BANNER_SPRING = {
488
488
  damping: 500
489
489
  };
490
490
 
491
+ /**
492
+ * UISlider's release: after a finger lifts, the thumb settles on this spring
493
+ * toward 0.4 of the release's momentum projection. It is critically damped,
494
+ * so it never overshoots a target ahead of it.
495
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
496
+ * `UIViewSpringAnimationBehavior` at the lift reads response 0.4 and
497
+ * damping ratio 1. Four releases fit it per frame (the UIKit slider
498
+ * table). Oct 23 2026
499
+ */
500
+ export const SLIDER_RELEASE_SPRING = {
501
+ response: 0.4,
502
+ dampingRatio: 1
503
+ };
504
+
505
+ /**
506
+ * UISlider's lift: a finger's touch-down scales the thumb up on this spring.
507
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
508
+ * thumb's scale per frame after touch-down (the UIKit slider table).
509
+ * Oct 23 2026
510
+ */
511
+ export const SLIDER_LIFT_SPRING = {
512
+ response: 0.215,
513
+ dampingRatio: 0.6
514
+ };
515
+
516
+ /**
517
+ * UISlider's drop: the lift's end scales the thumb back down on this spring.
518
+ * @source measured: UIKit lab, iOS 26.2 simulator, iPhone 17 Pro. The
519
+ * thumb's scale per frame after the lift (the UIKit slider table).
520
+ * Oct 23 2026
521
+ */
522
+ export const SLIDER_DROP_SPRING = {
523
+ response: 0.5,
524
+ dampingRatio: 0.7
525
+ };
526
+
491
527
  /**
492
528
  * Every spring above, by row name: the table the existing readers use. A
493
529
  * component imports only the rows it plays (`architecture:component-style-authoring`
@@ -527,11 +563,16 @@ export const springs = {
527
563
  switchThumbStretch: SWITCH_THUMB_STRETCH_SPRING,
528
564
  segmentedThumb: SEGMENTED_THUMB_SPRING,
529
565
  keyboard: KEYBOARD_SPRING,
530
- banner: BANNER_SPRING
566
+ banner: BANNER_SPRING,
567
+ sliderRelease: SLIDER_RELEASE_SPRING,
568
+ sliderLift: SLIDER_LIFT_SPRING,
569
+ sliderDrop: SLIDER_DROP_SPRING
531
570
  };
532
571
 
533
572
  /**
534
- * The springs spec:AST-094 FR4 names: the only ones that are motion roles.
573
+ * The only springs that are motion roles. The touch presentations' record
574
+ * names some, and a component's own record names others, such as Slider's
575
+ * three. The generated motion role table lists each with its record.
535
576
  * The registry takes these rows alone, so registering ships no other spring.
536
577
  */
537
578
  const SPRING_ROLES = {
@@ -549,11 +590,14 @@ const SPRING_ROLES = {
549
590
  subMenuBack: SUB_MENU_BACK_SPRING,
550
591
  contextMenuLift: CONTEXT_MENU_LIFT_SPRING,
551
592
  contextMenuDismiss: CONTEXT_MENU_DISMISS_SPRING,
552
- contextMenuMorph: CONTEXT_MENU_MORPH_SPRING
593
+ contextMenuMorph: CONTEXT_MENU_MORPH_SPRING,
594
+ sliderRelease: SLIDER_RELEASE_SPRING,
595
+ sliderLift: SLIDER_LIFT_SPRING,
596
+ sliderDrop: SLIDER_DROP_SPRING
553
597
  };
554
598
 
555
599
  /**
556
- * Registers the springs spec:AST-094 FR4 names as internal motion roles
600
+ * Registers the role springs (`SPRING_ROLES`) as internal motion roles
557
601
  * (motion/roles.ts), by their row names (`springs.settle`). Every other
558
602
  * spring, UIKit's menu spring under Reduce Motion and the keyboard's
559
603
  * included, is not a role. Nothing registers on import: the touch code that
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/core",
3
- "version": "0.7.6",
3
+ "version": "0.7.7-canary.0d1ddcd",
4
4
  "displayName": "Astryx Core",
5
5
  "description": "The component library. Accessible, themeable React components with built-in spacing, dark mode, and StyleX styling.",
6
6
  "author": "Meta Open Source",
@@ -860,6 +860,9 @@
860
860
  "react-dom": ">=19.0.0"
861
861
  },
862
862
  "devDependencies": {
863
+ "@astryxdesign/a11y-spec": "0.7.7-canary.0d1ddcd",
864
+ "@astryxdesign/cli": "0.7.7-canary.0d1ddcd",
865
+ "@astryxdesign/interaction-harness": "0.7.7-canary.0d1ddcd",
863
866
  "@babel/cli": "^7.29.7",
864
867
  "@babel/core": "^7.29.7",
865
868
  "@babel/preset-react": "^7.29.7",
@@ -870,10 +873,7 @@
870
873
  "@testing-library/jest-dom": "^6.6.0",
871
874
  "@testing-library/react": "^16.3.2",
872
875
  "@types/babel__core": "^7.20.5",
873
- "tailwindcss": "^4.3.2",
874
- "@astryxdesign/cli": "0.7.6",
875
- "@astryxdesign/a11y-spec": "0.0.0",
876
- "@astryxdesign/interaction-harness": "0.0.0"
876
+ "tailwindcss": "^4.3.2"
877
877
  },
878
878
  "dependencies": {
879
879
  "intl-messageformat": "^11.2.9"
@@ -45,6 +45,11 @@ export const docs = {
45
45
  description:
46
46
  'Start the page heading inside `children`. AppShell owns the skip link, the banner landmark and the main landmark, but it renders no heading, so the first heading in the content area is the page h1.',
47
47
  },
48
+ {
49
+ guidance: true,
50
+ description:
51
+ 'On phones, opt the page into the full screen with `viewport-fit=cover` in the viewport meta tag (`width=device-width, initial-scale=1, viewport-fit=cover`). AppShell then extends its header under the status bar and out to the screen sides, and keeps the header\'s items and the end of the content inside the device\'s safe area. An installed web app can also draw under the status bar with `<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">`. In landscape only the header is inset: an inline SideNav and the content\'s sides still reach under a notch, so keep content padding there. A shell with no header region or phone top bar keeps no top inset; keep top padding there.',
52
+ },
48
53
  {
49
54
  guidance: false,
50
55
  description:
@@ -343,6 +348,11 @@ export const docsDense = {
343
348
  description:
344
349
  'Give every nav slot an accessible name: TopNav and SideNav are separate navigation landmarks, so pass `label` to each.',
345
350
  },
351
+ {
352
+ guidance: true,
353
+ description:
354
+ 'Phones: add `viewport-fit=cover` to the viewport meta; the header then reaches under the status bar while its items and the content end stay in the safe area. Landscape: only the header is inset (not an inline SideNav or the content sides). No header region or phone top bar: no top inset, so keep top padding. Installed web apps: `apple-mobile-web-app-status-bar-style` `black-translucent`.',
355
+ },
346
356
  {
347
357
  guidance: true,
348
358
  description: