@astryxdesign/core 0.7.7-canary.550ff21 → 0.7.7-canary.58c5b8a

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 (504) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +4 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +36 -6
  4. package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts +13 -0
  5. package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts.map +1 -0
  6. package/dist/AppShell/useCloseMobileDrawerOnActivate.js +45 -0
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +1 -1
  9. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  10. package/dist/BottomSheet/BottomSheet.js +79 -9
  11. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  12. package/dist/BottomSheet/BottomSheetPanel.js +23 -4
  13. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
  14. package/dist/BottomSheet/bottomSheetStack.js +5 -4
  15. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  16. package/dist/BottomSheet/useSheetGestures.js +3 -1
  17. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +2 -1
  18. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +9 -4
  20. package/dist/Button/Button.d.ts.map +1 -1
  21. package/dist/Button/Button.js +50 -5
  22. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  23. package/dist/CheckboxList/CheckboxList.js +7 -1
  24. package/dist/CheckboxList/CheckboxListContext.d.ts +6 -0
  25. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  26. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  27. package/dist/CheckboxList/CheckboxListItem.js +10 -2
  28. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  29. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  30. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  31. package/dist/DateInput/DateInput.d.ts.map +1 -1
  32. package/dist/DateInput/DateInput.js +5 -2
  33. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  34. package/dist/DateInput/MonthScroller.js +13 -27
  35. package/dist/DateInput/Wheel.d.ts +17 -1
  36. package/dist/DateInput/Wheel.d.ts.map +1 -1
  37. package/dist/DateInput/Wheel.js +161 -20
  38. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  39. package/dist/DateRangeInput/DateRangeInput.js +63 -49
  40. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  41. package/dist/DateTimeInput/DateTimeInput.js +5 -2
  42. package/dist/Dialog/Dialog.d.ts.map +1 -1
  43. package/dist/Dialog/Dialog.js +53 -15
  44. package/dist/Drawer/Drawer.d.ts.map +1 -1
  45. package/dist/Drawer/Drawer.js +15 -11
  46. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  47. package/dist/Drawer/useDrawerDialogPresence.js +9 -1
  48. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  49. package/dist/DropdownMenu/DropdownMenu.js +20 -4
  50. package/dist/Field/Field.js +2 -2
  51. package/dist/Field/PanelSearchInput.d.ts +9 -1
  52. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  53. package/dist/Field/PanelSearchInput.js +3 -1
  54. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  55. package/dist/HoverCard/HoverCard.js +27 -2
  56. package/dist/Icon/Icon.d.ts +5 -1
  57. package/dist/Icon/Icon.d.ts.map +1 -1
  58. package/dist/Icon/Icon.js +5 -2
  59. package/dist/InfoTip/InfoTip.d.ts +63 -0
  60. package/dist/InfoTip/InfoTip.d.ts.map +1 -0
  61. package/dist/InfoTip/InfoTip.js +126 -0
  62. package/dist/InfoTip/index.d.ts +10 -0
  63. package/dist/InfoTip/index.d.ts.map +1 -0
  64. package/dist/InfoTip/index.js +12 -0
  65. package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
  66. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  67. package/dist/Layer/layerAnimations.stylex.js +25 -20
  68. package/dist/Layer/layerClickBoundary.d.ts +7 -1
  69. package/dist/Layer/layerClickBoundary.d.ts.map +1 -1
  70. package/dist/Layer/layerClickBoundary.js +2 -2
  71. package/dist/Layer/useBackdropPress.d.ts +27 -0
  72. package/dist/Layer/useBackdropPress.d.ts.map +1 -0
  73. package/dist/Layer/useBackdropPress.js +53 -0
  74. package/dist/Layer/usePressPin.d.ts +105 -0
  75. package/dist/Layer/usePressPin.d.ts.map +1 -0
  76. package/dist/Layer/usePressPin.js +413 -0
  77. package/dist/Layer/useTouchTrigger.d.ts +23 -1
  78. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  79. package/dist/Layer/useTouchTrigger.js +45 -7
  80. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  81. package/dist/Lightbox/Lightbox.js +2 -1
  82. package/dist/MobileNav/MobileNav.js +0 -1
  83. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  84. package/dist/MultiSelector/hooks.js +2 -4
  85. package/dist/Outline/Outline.d.ts +2 -4
  86. package/dist/Outline/Outline.d.ts.map +1 -1
  87. package/dist/Outline/Outline.js +4 -52
  88. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  89. package/dist/Outline/useOutlineFromMarkdown.js +1 -0
  90. package/dist/Outline/useScrollSpy.js +3 -3
  91. package/dist/Popover/usePopover.d.ts.map +1 -1
  92. package/dist/Popover/usePopover.js +56 -7
  93. package/dist/PowerSearch/PowerSearch.d.ts +36 -3
  94. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  95. package/dist/PowerSearch/PowerSearch.js +571 -302
  96. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +100 -0
  97. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  98. package/dist/PowerSearch/PowerSearchBottomSheet.js +1913 -0
  99. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +32 -1
  100. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  101. package/dist/PowerSearch/PowerSearchEditPopover.js +17 -6
  102. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  103. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  104. package/dist/PowerSearch/PowerSearchValueEditor.js +170 -61
  105. package/dist/PowerSearch/formatFilterValue.d.ts +7 -0
  106. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  107. package/dist/PowerSearch/formatFilterValue.js +11 -1
  108. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  109. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  110. package/dist/PowerSearch/formatTokenValue.js +160 -0
  111. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  112. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  113. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  114. package/dist/ProgressBar/ProgressBar.d.ts +1 -1
  115. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  116. package/dist/ProgressBar/ProgressBar.js +33 -6
  117. package/dist/RadioList/RadioList.d.ts.map +1 -1
  118. package/dist/RadioList/RadioList.js +8 -2
  119. package/dist/RadioList/RadioListItem.d.ts +1 -1
  120. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  121. package/dist/RadioList/RadioListItem.js +5 -3
  122. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  123. package/dist/Resizable/ResizeHandle.js +118 -260
  124. package/dist/Resizable/resizeGesture.d.ts +91 -0
  125. package/dist/Resizable/resizeGesture.d.ts.map +1 -0
  126. package/dist/Resizable/resizeGesture.js +251 -0
  127. package/dist/SegmentedControl/SegmentedControl.d.ts +3 -1
  128. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  129. package/dist/SegmentedControl/SegmentedControl.js +115 -8
  130. package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
  131. package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  132. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -0
  133. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  134. package/dist/SegmentedControl/SegmentedControlItem.js +10 -2
  135. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts +357 -0
  136. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -0
  137. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +1349 -0
  138. package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts +70 -0
  139. package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts.map +1 -0
  140. package/dist/SegmentedControl/useSegmentedTouchTracking.js +264 -0
  141. package/dist/Selector/Selector.d.ts.map +1 -1
  142. package/dist/Selector/Selector.js +96 -67
  143. package/dist/Selector/optionShape.d.ts +24 -0
  144. package/dist/Selector/optionShape.d.ts.map +1 -0
  145. package/dist/Selector/optionShape.js +48 -0
  146. package/dist/Selector/selectableOptionEntries.d.ts +20 -0
  147. package/dist/Selector/selectableOptionEntries.d.ts.map +1 -0
  148. package/dist/Selector/selectableOptionEntries.js +38 -0
  149. package/dist/Selector/utils.d.ts +2 -17
  150. package/dist/Selector/utils.d.ts.map +1 -1
  151. package/dist/Selector/utils.js +3 -51
  152. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  153. package/dist/SideNav/SideNavItem.js +3 -9
  154. package/dist/Slider/sliderTouchController.js +2 -2
  155. package/dist/Switch/Switch.d.ts +1 -1
  156. package/dist/Switch/Switch.d.ts.map +1 -1
  157. package/dist/Switch/Switch.js +200 -46
  158. package/dist/Switch/switchFill.d.ts +31 -0
  159. package/dist/Switch/switchFill.d.ts.map +1 -0
  160. package/dist/Switch/switchFill.js +88 -0
  161. package/dist/Switch/switchTouch.d.ts +74 -0
  162. package/dist/Switch/switchTouch.d.ts.map +1 -0
  163. package/dist/Switch/switchTouch.js +125 -0
  164. package/dist/Switch/useSwitchTouch.d.ts +276 -0
  165. package/dist/Switch/useSwitchTouch.d.ts.map +1 -0
  166. package/dist/Switch/useSwitchTouch.js +939 -0
  167. package/dist/TabList/Tab.d.ts.map +1 -1
  168. package/dist/TabList/Tab.js +4 -3
  169. package/dist/Table/BaseTable.d.ts.map +1 -1
  170. package/dist/Table/BaseTable.js +29 -8
  171. package/dist/TextInput/TextInput.d.ts +2 -2
  172. package/dist/TextInput/TextInput.d.ts.map +1 -1
  173. package/dist/TextInput/TextInput.js +10 -7
  174. package/dist/Toast/Toast.d.ts.map +1 -1
  175. package/dist/Toast/Toast.js +5 -0
  176. package/dist/Token/Token.d.ts +2 -2
  177. package/dist/Token/Token.d.ts.map +1 -1
  178. package/dist/Token/Token.js +13 -4
  179. package/dist/Token/TokenNamingContext.d.ts +14 -0
  180. package/dist/Token/TokenNamingContext.d.ts.map +1 -0
  181. package/dist/Token/TokenNamingContext.js +23 -0
  182. package/dist/Tokenizer/Tokenizer.d.ts +46 -59
  183. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  184. package/dist/Tokenizer/Tokenizer.js +44 -60
  185. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +25 -28
  186. package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
  187. package/dist/Tokenizer/TokenizerBottomSheet.js +157 -54
  188. package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts +3 -0
  189. package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -0
  190. package/dist/Tokenizer/TokenizerItemRemovableContext.js +19 -0
  191. package/dist/Tooltip/Tooltip.d.ts +24 -5
  192. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  193. package/dist/Tooltip/Tooltip.js +29 -5
  194. package/dist/Tooltip/useTooltip.d.ts +48 -5
  195. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  196. package/dist/Tooltip/useTooltip.js +90 -20
  197. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  198. package/dist/TopNav/TopNavItem.js +4 -7
  199. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  200. package/dist/TopNav/TopNavMegaMenuItem.js +4 -7
  201. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  202. package/dist/TopNav/TopNavMenu.js +4 -7
  203. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  204. package/dist/Typeahead/Typeahead.js +26 -15
  205. package/dist/animator/createAnimator.d.ts +98 -0
  206. package/dist/animator/createAnimator.d.ts.map +1 -0
  207. package/dist/animator/createAnimator.js +259 -0
  208. package/dist/astryx.css +142 -7
  209. package/dist/gestures/GestureHost.d.ts +27 -1
  210. package/dist/gestures/GestureHost.d.ts.map +1 -1
  211. package/dist/gestures/GestureHost.js +161 -22
  212. package/dist/gestures/PressTracker.d.ts +6 -0
  213. package/dist/gestures/PressTracker.d.ts.map +1 -1
  214. package/dist/gestures/PressTracker.js +3 -0
  215. package/dist/gestures/types.d.ts +6 -0
  216. package/dist/gestures/types.d.ts.map +1 -1
  217. package/dist/gestures/usePressTracker.d.ts.map +1 -1
  218. package/dist/gestures/usePressTracker.js +1 -0
  219. package/dist/gestures/wheelSegmenter.d.ts +14 -3
  220. package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
  221. package/dist/gestures/wheelSegmenter.js +32 -8
  222. package/dist/hooks/actionGroupTracker.d.ts +7 -4
  223. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  224. package/dist/hooks/actionGroupTracker.js +19 -56
  225. package/dist/hooks/index.d.ts +1 -0
  226. package/dist/hooks/index.d.ts.map +1 -1
  227. package/dist/hooks/index.js +1 -0
  228. package/dist/hooks/pressGroupContext.d.ts +6 -0
  229. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  230. package/dist/hooks/pressGroupContext.js +20 -0
  231. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  232. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  233. package/dist/hooks/useActionGroupTracking.js +174 -0
  234. package/dist/hooks/useAnimator.d.ts +41 -0
  235. package/dist/hooks/useAnimator.d.ts.map +1 -0
  236. package/dist/hooks/useAnimator.js +70 -0
  237. package/dist/hooks/useAttachment.d.ts +16 -8
  238. package/dist/hooks/useAttachment.d.ts.map +1 -1
  239. package/dist/hooks/useAttachment.js +35 -15
  240. package/dist/hooks/useFocusTrap.d.ts +15 -0
  241. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  242. package/dist/hooks/useFocusTrap.js +13 -2
  243. package/dist/hooks/useHighlightedOptionScroll.d.ts +11 -1
  244. package/dist/hooks/useHighlightedOptionScroll.d.ts.map +1 -1
  245. package/dist/hooks/useHighlightedOptionScroll.js +112 -11
  246. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  247. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  248. package/dist/hooks/useInputStatusIcon.js +2 -2
  249. package/dist/hooks/useMediaQuery.d.ts +2 -1
  250. package/dist/hooks/useMediaQuery.d.ts.map +1 -1
  251. package/dist/hooks/useMediaQuery.js +7 -4
  252. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  253. package/dist/hooks/useMenuPress.js +4 -2
  254. package/dist/hooks/usePager.d.ts +261 -0
  255. package/dist/hooks/usePager.d.ts.map +1 -0
  256. package/dist/hooks/usePager.js +1169 -0
  257. package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts +8 -0
  258. package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts.map +1 -0
  259. package/dist/i18n/generated-english/InfoTip/InfoTip.generated.js +12 -0
  260. package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.d.ts.map +1 -1
  261. package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.js +1 -0
  262. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  263. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  264. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  265. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  266. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  267. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  268. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  269. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  270. package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.d.ts.map +1 -1
  271. package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.js +7 -1
  272. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  273. package/dist/i18n/generated-locales/en.generated.js +33 -1
  274. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  275. package/dist/i18n/generated-locales/pseudo.generated.js +33 -1
  276. package/dist/index.d.ts +2 -0
  277. package/dist/index.d.ts.map +1 -1
  278. package/dist/index.js +5 -0
  279. package/dist/internal/SheetConfirmation.d.ts +11 -0
  280. package/dist/internal/SheetConfirmation.d.ts.map +1 -0
  281. package/dist/internal/SheetConfirmation.js +92 -0
  282. package/dist/internal/sheetDraft.d.ts +35 -0
  283. package/dist/internal/sheetDraft.d.ts.map +1 -0
  284. package/dist/internal/sheetDraft.js +65 -0
  285. package/dist/internal/touch-sheet.d.ts +21 -0
  286. package/dist/internal/touch-sheet.d.ts.map +1 -0
  287. package/dist/internal/touch-sheet.js +19 -0
  288. package/dist/internal/useDismissSearchOnTouchDrag.d.ts +24 -0
  289. package/dist/internal/useDismissSearchOnTouchDrag.d.ts.map +1 -0
  290. package/dist/internal/useDismissSearchOnTouchDrag.js +56 -0
  291. package/dist/motion/animator.d.ts +14 -14
  292. package/dist/motion/animator.d.ts.map +1 -1
  293. package/dist/motion/animator.js +41 -18
  294. package/dist/motion/paging.d.ts +16 -5
  295. package/dist/motion/paging.d.ts.map +1 -1
  296. package/dist/motion/paging.js +34 -14
  297. package/dist/motion/reducedMotion.d.ts +24 -0
  298. package/dist/motion/reducedMotion.d.ts.map +1 -1
  299. package/dist/motion/reducedMotion.js +78 -1
  300. package/dist/motion/roles.d.ts +7 -1
  301. package/dist/motion/roles.d.ts.map +1 -1
  302. package/dist/motion/roles.js +20 -1
  303. package/dist/motion/uikit/alert.d.ts +41 -0
  304. package/dist/motion/uikit/alert.d.ts.map +1 -0
  305. package/dist/motion/uikit/alert.js +43 -0
  306. package/dist/motion/uikit/index.d.ts +7 -4
  307. package/dist/motion/uikit/index.d.ts.map +1 -1
  308. package/dist/motion/uikit/index.js +7 -4
  309. package/dist/motion/uikit/paging.d.ts +31 -20
  310. package/dist/motion/uikit/paging.d.ts.map +1 -1
  311. package/dist/motion/uikit/paging.js +41 -11
  312. package/dist/motion/uikit/progressBar.d.ts +27 -7
  313. package/dist/motion/uikit/progressBar.d.ts.map +1 -1
  314. package/dist/motion/uikit/progressBar.js +31 -11
  315. package/dist/motion/uikit/segmented.d.ts +55 -0
  316. package/dist/motion/uikit/segmented.d.ts.map +1 -0
  317. package/dist/motion/uikit/segmented.js +77 -0
  318. package/dist/motion/uikit/springs.d.ts +8 -42
  319. package/dist/motion/uikit/springs.d.ts.map +1 -1
  320. package/dist/motion/uikit/springs.js +12 -42
  321. package/dist/motion/uikit/switch.d.ts +166 -0
  322. package/dist/motion/uikit/switch.d.ts.map +1 -0
  323. package/dist/motion/uikit/switch.js +186 -0
  324. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +15 -0
  325. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  326. package/dist/privateAttributes/pressGroupItem.stylex.js +23 -0
  327. package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts +18 -0
  328. package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts.map +1 -0
  329. package/dist/privateAttributes/pressHoldsDrag.stylex.js +28 -0
  330. package/dist/privateAttributes/segmentTitle.stylex.d.ts +5 -0
  331. package/dist/privateAttributes/segmentTitle.stylex.d.ts.map +1 -0
  332. package/dist/privateAttributes/segmentTitle.stylex.js +22 -0
  333. package/dist/utils/browserClickWait.d.ts +35 -0
  334. package/dist/utils/browserClickWait.d.ts.map +1 -0
  335. package/dist/utils/browserClickWait.js +123 -0
  336. package/dist/utils/clickGuard.d.ts +14 -1
  337. package/dist/utils/clickGuard.d.ts.map +1 -1
  338. package/dist/utils/clickGuard.js +46 -1
  339. package/dist/utils/dateParser.d.ts.map +1 -1
  340. package/dist/utils/dateParser.js +12 -0
  341. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  342. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  343. package/dist/utils/interactionOverlay.stylex.js +3 -2
  344. package/dist/utils/pressFeedback.d.ts.map +1 -1
  345. package/dist/utils/pressFeedback.js +24 -6
  346. package/locales/en.json +128 -0
  347. package/locales/pseudo.json +96 -0
  348. package/package.json +13 -8
  349. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  350. package/src/AlertDialog/AlertDialog.tsx +37 -5
  351. package/src/AppShell/useCloseMobileDrawerOnActivate.ts +52 -0
  352. package/src/Avatar/Avatar.tsx +3 -1
  353. package/src/BottomSheet/BottomSheet.tsx +95 -10
  354. package/src/BottomSheet/BottomSheetPanel.tsx +40 -5
  355. package/src/BottomSheet/bottomSheetStack.ts +8 -4
  356. package/src/BottomSheet/useSheetGestures.ts +3 -1
  357. package/src/Breadcrumbs/BreadcrumbItem.tsx +17 -4
  358. package/src/Button/Button.tsx +66 -7
  359. package/src/CheckboxList/CheckboxList.doc.mjs +4 -2
  360. package/src/CheckboxList/CheckboxList.tsx +6 -0
  361. package/src/CheckboxList/CheckboxListContext.tsx +6 -0
  362. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  363. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  364. package/src/DateInput/DateInput.tsx +8 -2
  365. package/src/DateInput/MonthScroller.tsx +18 -22
  366. package/src/DateInput/Wheel.tsx +172 -14
  367. package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -2
  368. package/src/DateRangeInput/DateRangeInput.tsx +117 -71
  369. package/src/DateTimeInput/DateTimeInput.tsx +8 -2
  370. package/src/Dialog/Dialog.tsx +81 -15
  371. package/src/Drawer/Drawer.tsx +28 -11
  372. package/src/Drawer/useDrawerDialogPresence.ts +9 -1
  373. package/src/DropdownMenu/DropdownMenu.tsx +28 -6
  374. package/src/Field/Field.tsx +2 -2
  375. package/src/Field/PanelSearchInput.tsx +11 -0
  376. package/src/HoverCard/HoverCard.tsx +31 -1
  377. package/src/Icon/Icon.doc.mjs +49 -8
  378. package/src/Icon/Icon.tsx +15 -7
  379. package/src/InfoTip/InfoTip.doc.mjs +192 -0
  380. package/src/InfoTip/InfoTip.tsx +186 -0
  381. package/src/InfoTip/index.ts +14 -0
  382. package/src/Layer/layerAnimations.stylex.ts +24 -16
  383. package/src/Layer/layerClickBoundary.ts +2 -2
  384. package/src/Layer/useBackdropPress.ts +81 -0
  385. package/src/Layer/usePressPin.ts +576 -0
  386. package/src/Layer/useTouchTrigger.ts +56 -6
  387. package/src/Lightbox/Lightbox.tsx +2 -1
  388. package/src/MobileNav/MobileNav.tsx +1 -1
  389. package/src/MultiSelector/hooks.ts +2 -4
  390. package/src/Outline/Outline.doc.mjs +177 -51
  391. package/src/Outline/Outline.tsx +5 -57
  392. package/src/Outline/useOutlineFromMarkdown.doc.mjs +157 -0
  393. package/src/Outline/useOutlineFromMarkdown.ts +1 -0
  394. package/src/Outline/useScrollSpy.ts +3 -3
  395. package/src/Popover/usePopover.tsx +71 -9
  396. package/src/PowerSearch/PowerSearch.doc.mjs +55 -6
  397. package/src/PowerSearch/PowerSearch.tsx +798 -324
  398. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2515 -0
  399. package/src/PowerSearch/PowerSearchEditPopover.tsx +28 -6
  400. package/src/PowerSearch/PowerSearchValueEditor.tsx +203 -38
  401. package/src/PowerSearch/formatFilterValue.ts +18 -1
  402. package/src/PowerSearch/formatTokenValue.ts +215 -0
  403. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  404. package/src/ProgressBar/ProgressBar.doc.mjs +4 -2
  405. package/src/ProgressBar/ProgressBar.tsx +67 -7
  406. package/src/RadioList/RadioList.doc.mjs +4 -2
  407. package/src/RadioList/RadioList.tsx +7 -2
  408. package/src/RadioList/RadioListItem.tsx +5 -3
  409. package/src/Resizable/ResizeHandle.tsx +133 -328
  410. package/src/Resizable/resizeGesture.ts +368 -0
  411. package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
  412. package/src/SegmentedControl/SegmentedControl.tsx +179 -5
  413. package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
  414. package/src/SegmentedControl/SegmentedControlItem.tsx +14 -2
  415. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +1640 -0
  416. package/src/SegmentedControl/useSegmentedTouchTracking.ts +308 -0
  417. package/src/Selector/Selector.tsx +136 -89
  418. package/src/Selector/optionShape.ts +64 -0
  419. package/src/Selector/selectableOptionEntries.ts +39 -0
  420. package/src/Selector/utils.ts +9 -68
  421. package/src/SideNav/SideNavItem.tsx +3 -7
  422. package/src/Slider/sliderTouchController.ts +2 -2
  423. package/src/Switch/Switch.doc.mjs +3 -3
  424. package/src/Switch/Switch.tsx +412 -86
  425. package/src/Switch/switchFill.ts +106 -0
  426. package/src/Switch/switchTouch.ts +186 -0
  427. package/src/Switch/useSwitchTouch.ts +1051 -0
  428. package/src/TabList/Tab.tsx +5 -3
  429. package/src/Table/BaseTable.tsx +46 -12
  430. package/src/TextInput/TextInput.tsx +11 -10
  431. package/src/Toast/Toast.tsx +5 -0
  432. package/src/Token/Token.tsx +15 -4
  433. package/src/Token/TokenNamingContext.ts +28 -0
  434. package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
  435. package/src/Tokenizer/Tokenizer.tsx +93 -88
  436. package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
  437. package/src/Tokenizer/TokenizerItemRemovableContext.ts +24 -0
  438. package/src/Tooltip/Tooltip.doc.mjs +123 -39
  439. package/src/Tooltip/Tooltip.tsx +43 -9
  440. package/src/Tooltip/useTooltip.doc.mjs +171 -31
  441. package/src/Tooltip/useTooltip.tsx +137 -22
  442. package/src/TopNav/TopNavItem.tsx +6 -5
  443. package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
  444. package/src/TopNav/TopNavMenu.tsx +6 -5
  445. package/src/Typeahead/Typeahead.tsx +29 -15
  446. package/src/animator/createAnimator.doc.mjs +153 -0
  447. package/src/animator/createAnimator.ts +324 -0
  448. package/src/gestures/GestureHost.ts +205 -21
  449. package/src/gestures/PressTracker.ts +10 -0
  450. package/src/gestures/types.ts +6 -0
  451. package/src/gestures/usePressTracker.ts +2 -0
  452. package/src/gestures/wheelSegmenter.ts +36 -7
  453. package/src/hooks/actionGroupTracker.ts +32 -61
  454. package/src/hooks/index.ts +2 -0
  455. package/src/hooks/pressGroupContext.ts +21 -0
  456. package/src/hooks/useActionGroupTracking.ts +224 -0
  457. package/src/hooks/useAnimator.doc.mjs +109 -0
  458. package/src/hooks/useAnimator.ts +67 -0
  459. package/src/hooks/useAttachment.ts +56 -14
  460. package/src/hooks/useFocusTrap.ts +26 -2
  461. package/src/hooks/useHighlightedOptionScroll.ts +123 -15
  462. package/src/hooks/useInputStatusIcon.tsx +3 -2
  463. package/src/hooks/useMediaQuery.doc.mjs +2 -2
  464. package/src/hooks/useMediaQuery.ts +13 -4
  465. package/src/hooks/useMenuPress.ts +8 -2
  466. package/src/hooks/usePager.ts +1446 -0
  467. package/src/i18n/generated-english/InfoTip/InfoTip.generated.ts +13 -0
  468. package/src/i18n/generated-english/PowerSearch/PowerSearch.generated.ts +1 -0
  469. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  470. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  471. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  472. package/src/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.ts +7 -1
  473. package/src/i18n/generated-locales/en.generated.ts +43 -0
  474. package/src/i18n/generated-locales/pseudo.generated.ts +44 -0
  475. package/src/index.ts +14 -0
  476. package/src/internal/SheetConfirmation.tsx +101 -0
  477. package/src/internal/sheetDraft.ts +80 -0
  478. package/src/internal/touch-sheet.ts +21 -0
  479. package/src/internal/useDismissSearchOnTouchDrag.ts +69 -0
  480. package/src/motion/MEASUREMENTS.md +36 -27
  481. package/src/motion/README.md +11 -6
  482. package/src/motion/animator.ts +61 -29
  483. package/src/motion/paging.ts +37 -14
  484. package/src/motion/reducedMotion.ts +79 -1
  485. package/src/motion/roles.ts +20 -1
  486. package/src/motion/uikit/alert.ts +43 -0
  487. package/src/motion/uikit/index.ts +6 -5
  488. package/src/motion/uikit/paging.ts +41 -10
  489. package/src/motion/uikit/progressBar.ts +31 -11
  490. package/src/motion/uikit/segmented.ts +74 -0
  491. package/src/motion/uikit/springs.ts +12 -42
  492. package/src/motion/uikit/switch.ts +174 -0
  493. package/src/privateAttributes/pressGroupItem.stylex.ts +23 -0
  494. package/src/privateAttributes/pressHoldsDrag.stylex.ts +28 -0
  495. package/src/privateAttributes/segmentTitle.stylex.ts +22 -0
  496. package/src/utils/browserClickWait.ts +133 -0
  497. package/src/utils/clickGuard.ts +64 -1
  498. package/src/utils/dateParser.ts +16 -0
  499. package/src/utils/interactionOverlay.stylex.ts +3 -2
  500. package/src/utils/pressFeedback.ts +24 -6
  501. package/dist/internal/tokenizer-presentation.d.ts +0 -21
  502. package/dist/internal/tokenizer-presentation.d.ts.map +0 -1
  503. package/dist/internal/tokenizer-presentation.js +0 -21
  504. package/src/internal/tokenizer-presentation.ts +0 -25
@@ -37,27 +37,28 @@ installed); rows marked † also on iOS 18 for the pre-glass delta. iPhone
37
37
 
38
38
  ## Shared (foundation)
39
39
 
40
- | ID | What | App and gesture | Extract | Method | Feeds |
41
- | ----- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
42
- | M-S1 | Deceleration rates | none | `UIScrollView.DecelerationRate.normal.rawValue`, `.fast.rawValue` | D | `scroll.decelerationRate` |
43
- | M-S2 | Momentum coast | A long list (Contacts, or a probe table of 500 rows): flicks released at 1000, 2500, 5000 pt/s | contentOffset(t) from release to rest; decay constant; per-millisecond vs per-frame model; the speed at which it stops | C | `scroll.decelerationRate` |
44
- | M-S3 | Bounce-back spring | Same list: drag 120 pt past the top, hold still, release; a flick into the top edge at 3000 pt/s | contentOffset(t) after release and after edge contact; spring response and damping ratio; velocity hand-off | C | `scroll.bounce` |
45
- | M-S5 | Rubber band | Same list on an 852 pt view: drag 100, 300, 600 pt past the top; a horizontal pager | displayed overflow against finger overflow; confirm c = 0.55 and d = the view's size on the axis | C | `scroll.rubberBand` |
46
- | M-PG1 | Paging | Photos full-screen swipes; a probe paging scroll view | page chosen per release position × velocity (thresholds; at most one page?); contentOffset(t) onto the page | B, C | `paging` |
47
- | M-ST1 | Scroll to top | Settings scrolled down 500, 2000, 8000 pt; tap the status bar | contentOffset(t); duration against distance; curve or spring fit | B, C | `scroll.scrollToTopRate` |
48
- | M-N1 | Navigation push | Settings: tap General | incoming leading edge x(t), outgoing x(t) (parallax fraction), dimming alpha(t); animation parameters | A, B | `springs.navigationPush` |
49
- | M-N2 | Navigation pop | General: back button | same as M-N1 | A, B | `springs.navigationPop` |
50
- | M-N3 | Interactive pop | Settings ▸ General: edge swipe released at 40 % of the width at 600 pt/s (finishes) and at 30 % at rest (cancels) | x(t) after release; spring parameters; the finish / cancel rule (position, velocity) | A, B | `springs.navigationInteractivePopFinish` |
51
- | M-A1 | Alert | Probe app: `UIAlertController(.alert)` presented and dismissed | scale(t), alpha(t) of the alert and the dimming view; animation parameters | A | `springs.alertPresent`, `.alertDismiss` |
52
- | M-AS1 | Action sheet and menu | Probe app: `.actionSheet`; a button with a `UIMenu` as its primary action; Files: the … menu | scale, alpha, position (t) on open and close; animation parameters | A, B | `springs.actionSheet*`, `.menu*` |
53
- | M-CM1 | Context menu | Files: long-press an item; dismiss by tapping outside | preview scale(t) on lift, backdrop blur and dim (t), menu scale(t); the preview's return on dismiss | A, B | `springs.contextMenu*` |
54
- | M-K1 | UIKit legacy spring | Probe app: `UIView.animate(withDuration:usingSpringWithDamping:initialSpringVelocity:)`, durations 0.3, 0.5, 1 × ratios 0.5, 0.8, 1 × velocities 0, 2 | the `CASpringAnimation` UIKit attaches: mass, stiffness, damping, initialVelocity, duration, settlingDuration | A | `springs.ts` (UIKit's legacy springs) |
55
- | M-K2 | Default spring, keyboard | Probe app: an animator with `UISpringTimingParameters()`; focus and blur a text field | both springs' parameters and allowsOverdamping; the keyboard notification's duration and curve | A, D | `springs.viewChange`, `.keyboard`, `timing.keyboard*` |
56
- | M-CA1 | Settling duration | none: `CASpringAnimation` mass 1, stiffness 100, damping 5, 10, 15, 20, 40 × initialVelocity 0, 5, −5 × allowsOverdamping on, off | `settlingDuration` of each (checks the critically damped and overdamped branches) | D | `springs.ts` (settling) |
57
- | M-T1 | Banner | A notification pushed to the simulator while an app is in the foreground | banner y(t) in and out; time on screen | B | `springs.banner` |
58
- | M-RM1 | Reduced Motion | Reduce Motion on, Prefer Cross-Fade Transitions on and off: Settings push and pop, an alert (sheets: M-SH13; controls: M-SW11, M-SL12, M-SG15) | which transitions become cross-fades; alpha(t), duration and curve; what still moves | B | `timing.reducedMotionCrossFadeMs` (played at 200 ms: `design:reduced-motion` DR2 caps it, DEC-1 of 2026-10-24, departing from the measured 0.5 s) |
59
- | M-PR1 | Press release curve | Settings and Contacts: a row tapped and released (the deselect cross-fade) | the timing function Core Animation attaches to the deselect fade (control points) | A | `timing.press.highlightOutCurve` |
60
- | M-NB1 | Navigation bar hide / show | none | `UINavigationController.hideShowBarDuration` | D | `timing.navigationBarHideShowMs` |
40
+ | ID | What | App and gesture | Extract | Method | Feeds |
41
+ | ----- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
42
+ | M-S1 | Deceleration rates | none | `UIScrollView.DecelerationRate.normal.rawValue`, `.fast.rawValue` | D | `scroll.decelerationRate` |
43
+ | M-S2 | Momentum coast | A long list (Contacts, or a probe table of 500 rows): flicks released at 1000, 2500, 5000 pt/s | contentOffset(t) from release to rest; decay constant; per-millisecond vs per-frame model; the speed at which it stops | C | `scroll.decelerationRate` |
44
+ | M-S3 | Bounce-back spring | Same list: drag 120 pt past the top, hold still, release; a flick into the top edge at 3000 pt/s | contentOffset(t) after release and after edge contact; spring response and damping ratio; velocity hand-off | C | `scroll.bounce` |
45
+ | M-S5 | Rubber band | Same list on an 852 pt view: drag 100, 300, 600 pt past the top; a horizontal pager | displayed overflow against finger overflow; confirm c = 0.55 and d = the view's size on the axis | C | `scroll.rubberBand` |
46
+ | M-PG1 | Paging | Photos full-screen swipes; a probe paging scroll view | page chosen per release position × velocity (thresholds; at most one page?); contentOffset(t) onto the page | B, C | `paging` |
47
+ | M-ST1 | Scroll to top | Settings scrolled down 500, 2000, 8000 pt; tap the status bar | contentOffset(t); duration against distance; curve or spring fit | B, C | `scroll.scrollToTopRate` |
48
+ | M-N1 | Navigation push | Settings: tap General | incoming leading edge x(t), outgoing x(t) (parallax fraction), dimming alpha(t); animation parameters | A, B | `springs.navigationPush` |
49
+ | M-N2 | Navigation pop | General: back button | same as M-N1 | A, B | `springs.navigationPop` |
50
+ | M-N3 | Interactive pop | Settings ▸ General: edge swipe released at 40 % of the width at 600 pt/s (finishes) and at 30 % at rest (cancels) | x(t) after release; spring parameters; the finish / cancel rule (position, velocity) | A, B | `springs.navigationInteractivePopFinish` |
51
+ | M-A1 | Alert | Probe app: `UIAlertController(.alert)` presented and dismissed | scale(t), alpha(t) of the alert and the dimming view; animation parameters | A | `springs.alertPresent`, `.alertDismiss` |
52
+ | M-AS1 | Action sheet and menu | Probe app: `.actionSheet`; a button with a `UIMenu` as its primary action; Files: the … menu | scale, alpha, position (t) on open and close; animation parameters | A, B | `springs.actionSheet*`, `.menu*` |
53
+ | M-CM1 | Context menu | Files: long-press an item; dismiss by tapping outside | preview scale(t) on lift, backdrop blur and dim (t), menu scale(t); the preview's return on dismiss | A, B | `springs.contextMenu*` |
54
+ | M-K1 | UIKit legacy spring | Probe app: `UIView.animate(withDuration:usingSpringWithDamping:initialSpringVelocity:)`, durations 0.3, 0.5, 1 × ratios 0.5, 0.8, 1 × velocities 0, 2 | the `CASpringAnimation` UIKit attaches: mass, stiffness, damping, initialVelocity, duration, settlingDuration | A | `springs.ts` (UIKit's legacy springs) |
55
+ | M-K2 | Default spring, keyboard | Probe app: an animator with `UISpringTimingParameters()`; focus and blur a text field | both springs' parameters and allowsOverdamping; the keyboard notification's duration and curve | A, D | `springs.viewChange`, `.keyboard`, `timing.keyboard*` |
56
+ | M-CA1 | Settling duration | none: `CASpringAnimation` mass 1, stiffness 100, damping 5, 10, 15, 20, 40 × initialVelocity 0, 5, −5 × allowsOverdamping on, off | `settlingDuration` of each (checks the critically damped and overdamped branches) | D | `springs.ts` (settling) |
57
+ | M-T1 | Banner | A notification pushed to the simulator while an app is in the foreground | banner y(t) in and out; time on screen | B | `springs.banner` |
58
+ | M-RM1 | Reduced Motion | Reduce Motion on, Prefer Cross-Fade Transitions on and off: Settings push and pop, an alert (sheets: M-SH13; controls: M-SW11, M-SL12, M-SG15) | which transitions become cross-fades; alpha(t), duration and curve; what still moves | B | `timing.reducedMotionCrossFadeMs` (played at 200 ms: `design:reduced-motion` DR2 caps it, DEC-1 of 2026-10-24, departing from the measured 0.5 s) |
59
+ | M-PR1 | Press release curve | Settings and Contacts: a row tapped and released (the deselect cross-fade) | the timing function Core Animation attaches to the deselect fade (control points) | A | `timing.press.highlightOutCurve` |
60
+ | M-NB1 | Navigation bar hide / show | none | `UINavigationController.hideShowBarDuration` | D | `timing.navigationBarHideShowMs` |
61
+ | M-PB1 | Indeterminate pulse | Reduce Motion on: Safari loading a page (its indeterminate bar) beside ProgressBar's reduced-motion pulse | Not a parity value: an owner value (`component:ProgressBar` DEC-2); confirm the 2000 ms pulse reads as calm and the 0.84 floor keeps 3:1 (AR4) | B | `progressBar.reducedMotionPulseMs`, `progressBar.reducedMotionPulseFloor` |
61
62
 
62
63
  Done (UIKit lab, iOS 26.2 simulator, Oct 23 2026; values in `uikit/` tagged
63
64
  `measured:`): M-S1, M-NB1, M-K2, M-CA1 (underdamped grid matched to the last
@@ -128,12 +129,13 @@ Subject "switch S": the first switch in Settings ▸ Accessibility ▸ Display &
128
129
  Text Size (Bold Text row); a minimal host app holds a UISwitch on a plain view
129
130
  where a switch outside any scroll view is needed.
130
131
 
131
- Captured (iOS 26.2 simulator, Oct 23 2026), with their values landing in the
132
- switch's own table: M-SW02, M-SW03, M-SW04, M-SW05, M-SW06, M-SW09 (UISwitch
133
- makes no haptic call), M-SW11 (Reduce Motion: the lift stays, the stretch
134
- goes), M-SW16 (iOS 26.2). Until that table lands they stay open here, and
135
- `springs.switchThumbMove` and `switchThumbStretch` keep WebKit's values.
136
- Partly: M-SW07 (a single tap only). Still open: M-SW17, and M-SW11's On/Off
132
+ Captured (iOS 26.2 simulator, Oct 23 2026), with their values in the
133
+ switch's own table (`uikit/switch.ts`): M-SW02, M-SW03, M-SW04, M-SW05,
134
+ M-SW06, M-SW09 (UISwitch makes no haptic call), M-SW11 (Reduce Motion: the
135
+ lift stays, the stretch goes), M-SW16 (iOS 26.2). `springs.switchThumbMove`
136
+ holds the measured travel the switch's table reads; WebKit's
137
+ `switchThumbStretch` is retired for the table's `lift`. Partly: M-SW07 (a single
138
+ tap only). Still open: M-SW17, and M-SW11's On/Off
137
139
  labels, Reduce Transparency and Bold Text.
138
140
 
139
141
  | ID | Scene | Gesture | Extract | Method |
@@ -217,6 +219,13 @@ Bookmarks sheet.
217
219
  | M-SG18 | iPad S1 (touch; pointer if available) | tap, hold, drag; hover | differences from iPhone | B |
218
220
  | M-SG19 | Safari showing the segmented stories vs S1 | the segmented storyboards side by side | synced recordings (parity proof) | B |
219
221
 
222
+ Done (UIKit lab, iOS 26.2 simulator, Oct 23–24 2026; in the segmented control's
223
+ own table, `uikit/segmented.ts`, tagged `measured:`): M-SG02 (the selection
224
+ spring and the drag clamp; the tracking spring is the shared
225
+ `springs.fingerTracking`; the lift was measured too and is not in the table,
226
+ since a pressed thumb's lift is a theme's) and M-SG03 (the tap's frames,
227
+ fitted per frame).
228
+
220
229
  ## Sheets (UISheetPresentationController)
221
230
 
222
231
  Probe app "SheetProbe" on an iPhone 16 Pro (iPad Pro 11" for M-SH11 / M-SH20 /
@@ -19,9 +19,12 @@ roles through `resolveMotion`.
19
19
  | `uikit/scroll.ts` | UIScrollView: deceleration rates, rubber band, bounce-back spring, `delaysContentTouches`, scroll to top. |
20
20
  | `uikit/timing.ts` | Non-spring clocks and curves: press highlight, Core Animation's named curves, keyboard, Reduced Motion cross-fade. |
21
21
  | `uikit/paging.ts` | A paging UIScrollView: the integrator that settles a release on its page, the page rule, the catch, `setContentOffset(animated:)`. |
22
+ | `uikit/alert.ts` | UIAlertController: how a finger is tracked across the actions (highlight onset and bounds). |
22
23
  | `uikit/navigation.ts` | UINavigationController: push velocity, parallax, dimming, transition clock, interactive pop finish rule. |
23
- | `uikit/progressBar.ts` | UIProgressView's fill: the whole-track duration and curve (two roles), its minimum length and empty alpha. |
24
+ | `uikit/progressBar.ts` | UIProgressView's fill: the whole-track duration and curve, its minimum length and empty alpha; the reduced-motion pulse (three roles). |
24
25
  | `uikit/gestures.ts` | Gesture recognizer thresholds, the velocity filter and haptic stand-ins, as `{value, unit}` entries (sources in JSDoc). |
26
+ | `uikit/segmented.ts` | UISegmentedControl: the selection indicator's spring; under Reduce Motion the animator's cross-fade replaces it. |
27
+ | `uikit/switch.ts` | UISwitch on iOS 26.2: geometry, the lift, settle, travel and tracking springs, the flip distance, the track colour. |
25
28
  | `roles.ts` | The internal motion roles: the springs, durations and curves `spec:AST-094` FR4 names, registered by the shared tables, and a role's CSS form read back. |
26
29
  | `roleValue.ts` | A role's CSS form, written: a spring's duration and bounce, a duration in ms, a curve's `cubic-bezier()`. |
27
30
  | `resolveMotion.ts` | A role's value: its table value, as the per-role tables stay internal (`spec:AST-094` DEC-15). |
@@ -62,7 +65,7 @@ the timings that decide who gets a touch are not roles.
62
65
  ## Animator
63
66
 
64
67
  ```
65
- import {createAnimator} from '../motion/animator';
68
+ import {createMotionAnimator} from '../motion/animator';
66
69
  import {coast} from '../motion/coast';
67
70
  import {solveSpringTowardRamp, toSpring} from '../motion/spring';
68
71
  import {resolveMotion} from '../motion/resolveMotion';
@@ -71,7 +74,7 @@ import {registerSpringsTable, springs} from '../motion/uikit';
71
74
  // Once, so the springs are registered as their roles:
72
75
  registerSpringsTable();
73
76
 
74
- const animator = createAnimator(sheet);
77
+ const animator = createMotionAnimator(sheet);
75
78
  // The animator plays a motion role (spec:AST-094 FR4), its table value, as the
76
79
  // per-role tables stay internal (DEC-15); math on a spring reads the role with
77
80
  // resolveMotion.
@@ -136,8 +139,10 @@ await handle.finished; // true if it ran to the end, false if interrupted
136
139
  presented call's second frame) runs on over two frames, the start moves to
137
140
  the call's first read after it, with every call of that task. Everything
138
141
  the call starts shares that start
139
- (`handle.started`); a retarget keeps an explicit one, and `{at}` puts
140
- several animators on one clock. `{start: 'commit'}` lets the browser date
142
+ (`handle.started`); a retarget of a curve that still moves keeps an
143
+ explicit one, while one on a tail that already shows as at rest (within two
144
+ sample tolerances of its target, and slower than one a frame) counts as a
145
+ call from rest. `{at}` puts several animators on one clock. `{start: 'commit'}` lets the browser date
141
146
  a retarget too; `{start: 'presented'}` waits two frames, until the
142
147
  element at rest has been presented. `handle.curve(property)` is the curve
143
148
  a call plays, for a companion to follow. `{additive: true}` retargets the
@@ -166,7 +171,7 @@ await handle.finished; // true if it ran to the end, false if interrupted
166
171
  - `animatorFor(element)` returns the one animator for an element, so code
167
172
  that animates it from several places (a swipe on x, a removal on y)
168
173
  composes in one `translate` track.
169
- - `createAnimator(dialog, {pseudoElement: '::backdrop'})` drives a
174
+ - `createMotionAnimator(dialog, {pseudoElement: '::backdrop'})` drives a
170
175
  pseudo-element; with no inline style to hold it, a static filling animation
171
176
  holds its end value until the next animation replaces it, while the
172
177
  pseudo-element exists. A dialog's `::backdrop` is made again each time the
@@ -4,11 +4,12 @@
4
4
  * @file animator.ts
5
5
  * @input An element, target values, and a spring, momentum curves (coast.ts)
6
6
  * or any closed-form curve
7
- * @output Exports `createAnimator`: a compositor animator for translate,
8
- * rotate, scale and opacity, with presentation values and velocities read
9
- * from the analytic curves, velocity-preserving retargeting, freeze-in-place
10
- * `stop`, completion promises, a shared clock, and UIKit's Reduced Motion
11
- * substitution; plus its option, handle and transition types
7
+ * @output Exports `createMotionAnimator`, a compositor animator for
8
+ * translate, rotate, scale and opacity, and its option, handle and
9
+ * transition types. It reads presentation values and velocities from the
10
+ * analytic curves. It retargets with the velocity kept, freezes in place on
11
+ * `stop`, and gives completion promises, a shared clock, and UIKit's
12
+ * Reduced Motion substitution.
12
13
  * @position Motion foundation (DOM). Internal to core: components use it for
13
14
  * every touch-presentation animation; not exported from the package entry
14
15
  *
@@ -244,18 +245,18 @@ export interface AnimateOptions {
244
245
  crossfadeAs?: 'entrance' | 'exit';
245
246
  /**
246
247
  * When the call's animations start. By default a call from rest starts
247
- * when the browser commits it, and a call that continues motion on screen
248
- * (a retarget) starts now, from the value on screen. Ignored with `at`.
248
+ * when the browser commits it. A call that continues motion on screen (a
249
+ * retarget) starts now, from the value on screen. A curve whose tail
250
+ * already shows as at rest counts as rest. Ignored with `at`.
249
251
  * - `'commit'`: a call that continues motion also starts when the browser
250
- * commits it, dated by the browser rather than by the main thread, as a
251
- * call from rest is.
252
- * - `'presented'`: a call from rest leaves its element at rest and creates
253
- * its animations two frames later, once the frame that carries the
254
- * element at rest has been presented; they then start at their commit. A
255
- * busy UI process delays the motion instead of skipping into it, for two
256
- * frames more before an idle start. Any other change to the animator
257
- * before then creates the animations first, in call order. A call that
258
- * continues motion on screen (a retarget) starts now, as by default.
252
+ * commits it. The browser dates it, as it dates a call from rest.
253
+ * - `'presented'`: a call from rest leaves its element at rest. Its
254
+ * animations are created two frames later, once the frame with the
255
+ * element at rest has been presented. They then start at their commit,
256
+ * so a busy UI process delays the motion instead of skipping into it.
257
+ * Any other change to the animator before then creates the animations
258
+ * first, in call order. A call that continues motion on screen starts
259
+ * now, as by default.
259
260
  */
260
261
  start?: 'commit' | 'presented';
261
262
  /**
@@ -297,7 +298,7 @@ export interface MotionCurve {
297
298
  }
298
299
 
299
300
  /**
300
- * Options of `createAnimator`.
301
+ * Options of `createMotionAnimator`.
301
302
  */
302
303
  /** How `set` puts values in place. */
303
304
  export interface SetOptions {
@@ -652,6 +653,18 @@ const SAMPLE_TOLERANCE: Record<MotionProperty, number> = {
652
653
  /** Keyframes start on this grid (ms) and are split where the curve needs it. */
653
654
  const SAMPLE_GRID_MS = 1000 / 30;
654
655
 
656
+ /**
657
+ * A curve within this many sample tolerances of its target can show as at
658
+ * rest. A call on it then starts as one from rest does, at the browser's start.
659
+ */
660
+ const REST_DISTANCE_TOLERANCES = 2;
661
+
662
+ /**
663
+ * A curve shows as at rest only while it moves at most one `SAMPLE_TOLERANCE`
664
+ * a frame at this rate.
665
+ */
666
+ const REST_FRAMES_PER_SECOND = 60;
667
+
655
668
  /** A curve that has not settled by then (an undamped spring) snaps. */
656
669
  const MAX_DURATION_MS = 30_000;
657
670
 
@@ -803,7 +816,7 @@ export function animatorFor(
803
816
  const key = options.pseudoElement ?? '';
804
817
  let animator = byPseudo.get(key);
805
818
  if (animator == null) {
806
- animator = createAnimator(element, options);
819
+ animator = createMotionAnimator(element, options);
807
820
  byPseudo.set(key, animator);
808
821
  }
809
822
  return animator;
@@ -920,7 +933,7 @@ const REDUCED_TRANSITION: SpringTransition = {
920
933
  *
921
934
  * @example
922
935
  * ```
923
- * const animator = createAnimator(sheet);
936
+ * const animator = createMotionAnimator(sheet);
924
937
  * // finger lifts at 1200 px/s heading for the detent at 0 (a component
925
938
  * // passes the spring of its motion role):
926
939
  * animator.animate({y: 0}, {spring: {response: 0.45, dampingRatio: 0.9}, velocity: {y: 1200}});
@@ -929,7 +942,7 @@ const REDUCED_TRANSITION: SpringTransition = {
929
942
  * animator.stop(['y']);
930
943
  * ```
931
944
  */
932
- export function createAnimator(
945
+ export function createMotionAnimator(
933
946
  element: HTMLElement | null,
934
947
  options: AnimatorOptions = {},
935
948
  ): Animator {
@@ -1165,6 +1178,22 @@ export function createAnimator(
1165
1178
  return curveAt(property, time);
1166
1179
  };
1167
1180
 
1181
+ /**
1182
+ * Whether a curve's tail already shows as at rest at `time`. Under a
1183
+ * starved main thread the browser commits a call late. A call that starts
1184
+ * at its own time then skips that far into its curve. One that starts at
1185
+ * the commit holds an element that hardly moves.
1186
+ */
1187
+ const showsAtRest = (
1188
+ property: MotionProperty,
1189
+ segment: Segment,
1190
+ time: number,
1191
+ ): boolean =>
1192
+ Math.abs(valueAt(property, time) - segment.target) <=
1193
+ REST_DISTANCE_TOLERANCES * SAMPLE_TOLERANCE[property] &&
1194
+ Math.abs(velocityAt(property, time)) <=
1195
+ SAMPLE_TOLERANCE[property] * REST_FRAMES_PER_SECOND;
1196
+
1168
1197
  const velocityAt = (property: MotionProperty, time: number): number => {
1169
1198
  const held = segments.get(property);
1170
1199
  if (held != null && isHeld(held)) {
@@ -2033,10 +2062,10 @@ export function createAnimator(
2033
2062
  // -- starting from rest ---------------------------------------------------
2034
2063
 
2035
2064
  /**
2036
- * A call starts from rest when nothing on the channels it drives is moving
2037
- * (a curve still waiting for its first frame counts as rest) and nothing
2038
- * pins its clock (`at`). Returns its start group, or null for an explicit
2039
- * start.
2065
+ * A call starts from rest when nothing on the channels it drives moves on
2066
+ * screen and nothing pins its clock (`at`). A curve still waiting for its
2067
+ * first frame counts as rest, as does one whose tail already shows as at
2068
+ * rest. Returns its start group, or null for an explicit start.
2040
2069
  */
2041
2070
  const beginGroup = (
2042
2071
  time: number,
@@ -2070,10 +2099,12 @@ export function createAnimator(
2070
2099
  }
2071
2100
  return null;
2072
2101
  }
2073
- // A call that continues motion starts now unless it asks for the
2074
- // browser's start (`commit`). `presented` asks only for a call from rest:
2075
- // an element still moving is not at rest, so a retarget starts now, from
2076
- // the value and velocity on screen (spec:AST-094 FR6).
2102
+ // A call that continues motion starts now, unless it asks for the
2103
+ // browser's start (`commit`). `presented` asks only for a call from rest.
2104
+ // A curve that still moves is not at rest, so a call on it starts now,
2105
+ // from the value and velocity on screen. A tail that shows as at rest
2106
+ // counts as rest, so a call on it waits, under `presented` for its two
2107
+ // frames.
2077
2108
  for (const channel of start === 'commit' ? [] : channels) {
2078
2109
  for (const property of CHANNELS[channel]) {
2079
2110
  const segment = segments.get(property);
@@ -2084,7 +2115,8 @@ export function createAnimator(
2084
2115
  time < endOf(property, segment) &&
2085
2116
  (segment.group == null ||
2086
2117
  segment.group.resolved ||
2087
- shownSince(property, segment) != null)
2118
+ shownSince(property, segment) != null) &&
2119
+ !showsAtRest(property, segment, time)
2088
2120
  ) {
2089
2121
  return null;
2090
2122
  }
@@ -6,7 +6,7 @@
6
6
  * paging constants
7
7
  * @output Exports `pagingSettleVelocity`, `solvePaging` (UIKit's paging settle
8
8
  * as a curve the animator plays) and `solveAnimatedPageScroll`
9
- * @position Pure math, with no DOM and no React
9
+ * @position Pure math, with no DOM and no React; hooks/usePager.ts reads it
10
10
  *
11
11
  * SYNC: When modified, update:
12
12
  * - /packages/core/src/motion/paging.test.ts
@@ -14,6 +14,7 @@
14
14
  */
15
15
 
16
16
  import type {MotionCurve} from './animator';
17
+ import {cubicBezier, type BezierPoints} from './bezier';
17
18
  import {paging} from './uikit/paging';
18
19
 
19
20
  /**
@@ -106,33 +107,55 @@ export function solvePaging({
106
107
  }
107
108
 
108
109
  /**
109
- * `setContentOffset(_:animated:)`: `paging.animatedScroll.duration` on a
110
- * sinusoidal ease-in-out, whatever the distance. UIKit starts it from the
111
- * current offset and drops any velocity, as here.
110
+ * `setContentOffset(_:animated:)`: `paging.animatedScroll.durationMs` on its
111
+ * curve, from the current offset, at any distance. The pager passes the
112
+ * duration and curve that `resolveMotion` gives, which are the measured values
113
+ * of the table.
114
+ *
115
+ * `velocity` (px/s) is the velocity of a move that this one retargets. The new
116
+ * curve starts at it and still ends on `to`, at rest and on time. A new target
117
+ * keeps the current velocity, where UIKit drops it. The carry is a Hermite
118
+ * term, v × duration × u(1 − u)², less the curve's own starting slope. So a
119
+ * move from rest is the curve itself.
112
120
  */
113
121
  export function solveAnimatedPageScroll({
114
122
  from,
115
123
  to,
124
+ durationMs = paging.animatedScroll.durationMs,
125
+ curve = paging.animatedScroll.curve,
126
+ velocity,
116
127
  }: {
117
128
  from: number;
118
129
  to: number;
130
+ durationMs?: number;
131
+ curve?: BezierPoints;
132
+ velocity?: number;
119
133
  }): MotionCurve {
120
- const {duration} = paging.animatedScroll;
134
+ const duration = durationMs / 1000;
121
135
  const distance = to - from;
136
+ const ease = cubicBezier(curve);
137
+ const progress = (u: number) => ease(Math.min(1, Math.max(0, u)));
138
+ // The carry, in px: the retargeted velocity over the whole duration, less
139
+ // what the curve's own starting slope already gives.
140
+ const startSlope = progress(1e-4) / 1e-4;
141
+ const carry =
142
+ velocity == null ? 0 : velocity * duration - distance * startSlope;
143
+ const at = (t: number) => {
144
+ const u = Math.min(1, Math.max(0, t / duration));
145
+ return from + distance * progress(u) + carry * u * (1 - u) * (1 - u);
146
+ };
122
147
  return {
123
148
  duration,
124
- at: t => {
125
- const u = Math.min(1, Math.max(0, t / duration));
126
- return from + (distance * (1 - Math.cos(Math.PI * u))) / 2;
127
- },
149
+ at,
128
150
  velocity: t => {
129
- if (t <= 0 || t >= duration) {
151
+ if (t <= 0) {
152
+ return velocity ?? 0;
153
+ }
154
+ if (t >= duration) {
130
155
  return 0;
131
156
  }
132
- return (
133
- ((distance * Math.PI) / (2 * duration)) *
134
- Math.sin((Math.PI * t) / duration)
135
- );
157
+ const h = Math.min(1e-4, t / 2, (duration - t) / 2);
158
+ return (at(t + h) - at(t - h)) / (2 * h);
136
159
  },
137
160
  };
138
161
  }
@@ -4,7 +4,7 @@
4
4
  * @file reducedMotion.ts
5
5
  * @input The Reduced Motion preference, the primary pointer, the motion tables
6
6
  * @output reducedMotionFade (the fade the animator would play, for motion it
7
- * does not drive) and the two media queries a StyleX transition spells
7
+ * does not drive), playReducedMotionDip, and the queries a transition spells
8
8
  * @position The one Reduced Motion policy (design:reduced-motion) for code
9
9
  * beside the animator: a raw Web Animations fade, a CSS transition
10
10
  *
@@ -102,3 +102,81 @@ export function reducedMotionFade(
102
102
  easing: `cubic-bezier(${curve.join(', ')})`,
103
103
  };
104
104
  }
105
+
106
+ /** A running Reduced Motion dip. */
107
+ export interface ReducedMotionDip {
108
+ /** Stops the dip. A change that has not landed yet never lands. */
109
+ cancel(): void;
110
+ }
111
+
112
+ /**
113
+ * Plays `fade` on `element` as a dip, and runs `land` at its middle: the
114
+ * fade-out, the change, then the fade-in. The fade-out holds at 0 until `land`
115
+ * has run, and the fade-in starts only after it. So the change never shows at
116
+ * full opacity, however late the main thread runs. A timer at the middle can
117
+ * fire after the fade-in has begun.
118
+ *
119
+ * `land` must apply the change before it returns: the fade-in starts right
120
+ * after it. `from` is the opacity the fade-out starts at: a leaving element
121
+ * fades out from where it is.
122
+ *
123
+ * @example
124
+ * ```
125
+ * const dip = playReducedMotionDip(scroller, fade, () => scroller.scrollTo({top}));
126
+ * // A newer change replaces it:
127
+ * dip.cancel();
128
+ * ```
129
+ */
130
+ export function playReducedMotionDip(
131
+ element: Element,
132
+ fade: ReducedMotionFade,
133
+ land: () => void,
134
+ from = 1,
135
+ ): ReducedMotionDip {
136
+ const half = fade.duration / 2;
137
+ let isCancelled = false;
138
+ let fadeIn: Animation | null = null;
139
+ const fadeOut = element.animate(
140
+ [{opacity: from, easing: fade.easing}, {opacity: 0}],
141
+ {duration: half, fill: 'forwards'},
142
+ );
143
+ fadeOut.finished.then(
144
+ () => {
145
+ if (isCancelled) {
146
+ return;
147
+ }
148
+ land();
149
+ // The fade-in holds 0 until it starts: after a long stall, its start can
150
+ // come after the frame that runs this.
151
+ fadeIn = element.animate(
152
+ [{opacity: 0, easing: fade.easing}, {opacity: 1}],
153
+ {duration: half, fill: 'backwards'},
154
+ );
155
+ // The fade-in keeps the dip's own schedule: it starts where the fade-out
156
+ // ended, so the dip keeps its length. The clock is read after the
157
+ // landing, because a frame's timestamp does not count the landing's own
158
+ // work. After a long stall, half of the fade-in still plays.
159
+ const fadeOutEnd = endTime(fadeOut, half);
160
+ if (fadeOutEnd != null) {
161
+ fadeIn.startTime = Math.max(fadeOutEnd, performance.now() - half / 2);
162
+ }
163
+ // The fade-in now holds the opacity, so the held 0 can go.
164
+ fadeOut.cancel();
165
+ },
166
+ // A cancelled fade-out rejects `finished`: nothing lands.
167
+ () => {},
168
+ );
169
+ return {
170
+ cancel() {
171
+ isCancelled = true;
172
+ fadeOut.cancel();
173
+ fadeIn?.cancel();
174
+ },
175
+ };
176
+ }
177
+
178
+ /** When `animation` was due to end, on its timeline (ms), if it has started. */
179
+ function endTime(animation: Animation, duration: number): number | null {
180
+ const start = animation.startTime;
181
+ return typeof start === 'number' ? start + duration : null;
182
+ }
@@ -5,7 +5,8 @@
5
5
  * @input The motion tables (motion/uikit and each component's own table)
6
6
  * @output registerMotionTable, motionRoleOf, motionRoleIn, listMotionRoles,
7
7
  * motionRoleVariable, and the CSS form of a role's value
8
- * (formatMotionRoleValue, parseMotionRoleValue)
8
+ * (formatMotionRoleValue, parseMotionRoleValue), and parseCssEasing for a
9
+ * CSS transition's easing
9
10
  * @position Motion foundation, internal to core: read by the code that
10
11
  * resolves a role when a motion starts. No public API writes a role: touch
11
12
  * motion stays internal until the public motion-token set is decided.
@@ -260,3 +261,21 @@ export function parseMotionRoleValue(
260
261
  ? points
261
262
  : null;
262
263
  }
264
+
265
+ /** The CSS easing keywords, as the control points CSS gives them. */
266
+ const EASING_KEYWORDS: Readonly<Record<string, MotionCurvePoints>> = {
267
+ linear: [0, 0, 1, 1],
268
+ ease: [0.25, 0.1, 0.25, 1],
269
+ 'ease-in': [0.42, 0, 1, 1],
270
+ 'ease-out': [0, 0, 0.58, 1],
271
+ 'ease-in-out': [0.42, 0, 0.58, 1],
272
+ };
273
+
274
+ /**
275
+ * Reads a CSS easing, a keyword or a `cubic-bezier()`, as a curve role's value
276
+ * is read. Returns null for any other easing, such as `steps()`.
277
+ */
278
+ export function parseCssEasing(text: string): MotionCurvePoints | null {
279
+ const value = text.trim();
280
+ return EASING_KEYWORDS[value] ?? parseMotionRoleValue('curve', value);
281
+ }
@@ -0,0 +1,43 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file alert.ts
5
+ * @input Nothing; data only
6
+ * @output Exports `alertController`: how UIAlertController (`.alert`) tracks
7
+ * a finger across its actions
8
+ * @position The alert domain of the UIKit constants table (motion/uikit);
9
+ * its springs are `springs.alertPresent` and `springs.alertDismiss`
10
+ *
11
+ * Every value was read from UIKit on the iOS 26.2 simulator. A host app
12
+ * presented `UIAlertController(.alert)` with two and with three actions.
13
+ * Real HID touches drove it, and the action views' highlight was sampled
14
+ * every frame. Lengths are in pt (CSS px), durations in ms.
15
+ *
16
+ * Every leaf carries one or more `@source`; GUESS values also carry the
17
+ * `@measure` task that will confirm or replace them. uikit.test.ts enforces
18
+ * both.
19
+ *
20
+ * SYNC: When modified, update /packages/core/src/motion/MEASUREMENTS.md
21
+ */
22
+
23
+ export const alertController = {
24
+ actions: {
25
+ /**
26
+ * How long after touch-down the touched action highlights: none, it is
27
+ * highlighted in the touch-down frame (a tap and a 300 ms hold alike).
28
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
29
+ * iPhone 17 Pro, per-frame highlight of the action views under real HID
30
+ * touches, Oct 23 2026
31
+ */
32
+ highlightOnsetMs: 0,
33
+ /**
34
+ * How far outside an action the finger may go and keep it highlighted:
35
+ * none. The highlight cleared 1 pt below the action, and a lift there ran
36
+ * nothing. UIButton keeps 70 pt; an alert action does not.
37
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
38
+ * iPhone 17 Pro, per-frame highlight of the action views under real HID
39
+ * touches, Oct 23 2026
40
+ */
41
+ highlightExpansion: 0,
42
+ },
43
+ } as const;
@@ -4,9 +4,10 @@
4
4
  * @file index.ts
5
5
  * @input The domain files of the UIKit constants table
6
6
  * @output Re-exports `springs` and one constant per spring (`SHEET_PRESENT_SPRING`,
7
- * …), `scroll`, `timing`, `navigation`, `progressBar`, the `slider` domain
8
- * and the gesture thresholds (one `UIKIT_*` group per recognizer, their
9
- * union `UIKIT_GESTURES`, and the haptic tables)
7
+ * …), `scroll`, `timing`, `navigation`, `progressBar`, `segmentedControl`,
8
+ * the `slider` and switch (`switchControl`) domains, and the gesture
9
+ * thresholds (one `UIKIT_*` group per recognizer, their union
10
+ * `UIKIT_GESTURES`, and the haptic tables)
10
11
  * @position Entry of the UIKit constants table (motion/uikit). Internal to
11
12
  * core: not exported from the package entry point
12
13
  *
@@ -41,6 +42,7 @@ export {
41
42
  export {navigation, registerNavigationTable} from './navigation';
42
43
  export {progressBar, registerProgressBarTable} from './progressBar';
43
44
  export {registerScrollTable, scroll} from './scroll';
45
+ export {segmentedControl} from './segmented';
44
46
  export {slider} from './slider';
45
47
  export {
46
48
  ACTION_SHEET_DISMISS_SPRING,
@@ -63,7 +65,6 @@ export {
63
65
  NAVIGATION_POP_SPRING,
64
66
  NAVIGATION_PUSH_SPRING,
65
67
  QUICK_CHANGE_SPRING,
66
- SEGMENTED_THUMB_SPRING,
67
68
  SETTLE_SPRING,
68
69
  SHEET_DETENT_SPRING,
69
70
  SHEET_DISMISS_SPRING,
@@ -74,10 +75,10 @@ export {
74
75
  SUB_MENU_BACK_SPRING,
75
76
  SUB_MENU_OPEN_SPRING,
76
77
  SWITCH_THUMB_MOVE_SPRING,
77
- SWITCH_THUMB_STRETCH_SPRING,
78
78
  TIMED_CHANGE_SPRING,
79
79
  VIEW_CHANGE_SPRING,
80
80
  registerSpringsTable,
81
81
  springs,
82
82
  } from './springs';
83
+ export {switchControl} from './switch';
83
84
  export {registerTimingTable, timing} from './timing';