@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.
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +23 -3
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +16 -9
- package/dist/Chat/ChatComposerInput.d.ts +9 -0
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -0
- package/dist/Chat/ChatMessage.js +2 -2
- package/dist/Chat/chatMessage.vars.stylex.d.ts +8 -8
- package/dist/Chat/chatMessage.vars.stylex.js +8 -8
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +8 -1
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +72 -2
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +6 -0
- package/dist/DropdownMenu/useMenuOverflow.d.ts +13 -3
- package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
- package/dist/DropdownMenu/useMenuOverflow.js +31 -8
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +8 -1
- package/dist/Field/textEntryTraits.d.ts +6 -6
- package/dist/Field/textEntryTraits.js +6 -6
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +1 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +25 -13
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +404 -131
- package/dist/Slider/sliderTouchController.d.ts +189 -0
- package/dist/Slider/sliderTouchController.d.ts.map +1 -0
- package/dist/Slider/sliderTouchController.js +1017 -0
- package/dist/Slider/useSliderTouch.d.ts +22 -0
- package/dist/Slider/useSliderTouch.d.ts.map +1 -0
- package/dist/Slider/useSliderTouch.js +56 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +19 -9
- package/dist/astryx.css +33 -6
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +4 -1
- package/dist/gestures/GestureHost.d.ts +72 -2
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +643 -5
- package/dist/gestures/GestureRecognizer.d.ts +15 -1
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +12 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +8 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PinchGestureRecognizer.d.ts +5 -1
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PinchGestureRecognizer.js +10 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +3 -3
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +7 -5
- package/dist/gestures/nativeScroll.d.ts +16 -2
- package/dist/gestures/nativeScroll.d.ts.map +1 -1
- package/dist/gestures/nativeScroll.js +39 -8
- package/dist/gestures/recognizerInternals.d.ts +4 -2
- package/dist/gestures/recognizerInternals.d.ts.map +1 -1
- package/dist/gestures/types.d.ts +11 -0
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +7 -0
- package/dist/gestures/wheelSegmenter.d.ts +45 -0
- package/dist/gestures/wheelSegmenter.d.ts.map +1 -0
- package/dist/gestures/wheelSegmenter.js +98 -0
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +140 -19
- package/dist/motion/paging.d.ts +58 -0
- package/dist/motion/paging.d.ts.map +1 -0
- package/dist/motion/paging.js +128 -0
- package/dist/motion/uikit/index.d.ts +2 -1
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +2 -1
- package/dist/motion/uikit/paging.d.ts +160 -0
- package/dist/motion/uikit/paging.d.ts.map +1 -0
- package/dist/motion/uikit/paging.js +162 -0
- package/dist/motion/uikit/scroll.d.ts +0 -19
- package/dist/motion/uikit/scroll.d.ts.map +1 -1
- package/dist/motion/uikit/scroll.js +2 -21
- package/dist/motion/uikit/slider.d.ts +97 -0
- package/dist/motion/uikit/slider.d.ts.map +1 -0
- package/dist/motion/uikit/slider.js +111 -0
- package/dist/motion/uikit/springs.d.ts +46 -1
- package/dist/motion/uikit/springs.d.ts.map +1 -1
- package/dist/motion/uikit/springs.js +48 -4
- package/package.json +5 -5
- package/src/AppShell/AppShell.doc.mjs +10 -0
- package/src/AppShell/AppShell.tsx +48 -2
- package/src/BottomSheet/BottomSheetPanel.tsx +16 -9
- package/src/Chat/Chat.doc.mjs +1 -0
- package/src/Chat/ChatComposerInput.doc.mjs +11 -0
- package/src/Chat/ChatComposerInput.tsx +11 -0
- package/src/Chat/ChatMessage.tsx +2 -2
- package/src/Chat/chatMessage.vars.stylex.ts +8 -8
- package/src/CommandPalette/CommandPaletteInput.tsx +6 -0
- package/src/DateInput/MonthScroller.tsx +63 -5
- package/src/Drawer/Drawer.tsx +6 -0
- package/src/DropdownMenu/useMenuOverflow.ts +44 -8
- package/src/Field/PanelSearchInput.tsx +6 -0
- package/src/Field/textEntryTraits.ts +6 -6
- package/src/Link/Link.tsx +3 -0
- package/src/Selector/Selector.tsx +29 -2
- package/src/Slider/Slider.doc.mjs +11 -7
- package/src/Slider/Slider.tsx +539 -132
- package/src/Slider/sliderTouchController.ts +1209 -0
- package/src/Slider/useSliderTouch.ts +78 -0
- package/src/Typeahead/BaseTypeahead.tsx +16 -8
- package/src/gestures/GestureArena.ts +1 -0
- package/src/gestures/GestureHost.ts +765 -5
- package/src/gestures/GestureRecognizer.ts +28 -0
- package/src/gestures/PanGestureRecognizer.ts +8 -0
- package/src/gestures/PinchGestureRecognizer.ts +16 -1
- package/src/gestures/README.md +63 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +7 -5
- package/src/gestures/nativeScroll.ts +49 -9
- package/src/gestures/recognizerInternals.ts +9 -2
- package/src/gestures/types.ts +12 -0
- package/src/gestures/wheelSegmenter.ts +114 -0
- package/src/motion/MEASUREMENTS.md +8 -1
- package/src/motion/README.md +3 -2
- package/src/motion/animator.ts +193 -25
- package/src/motion/paging.ts +138 -0
- package/src/motion/uikit/index.ts +2 -1
- package/src/motion/uikit/paging.ts +162 -0
- package/src/motion/uikit/scroll.ts +2 -18
- package/src/motion/uikit/slider.ts +105 -0
- package/src/motion/uikit/springs.ts +37 -2
- package/dist/motion/selectPage.d.ts +0 -26
- package/dist/motion/selectPage.d.ts.map +0 -1
- package/dist/motion/selectPage.js +0 -55
- 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
|
|
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
|
|
8
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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:
|