@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
@@ -3,7 +3,8 @@
3
3
  /**
4
4
  * @file paging.ts
5
5
  * @input Nothing; data only
6
- * @output Exports `paging`, the measured constants of a paging UIScrollView
6
+ * @output Exports `paging`, the measured constants of a paging UIScrollView,
7
+ * and `registerPagingTable`, which registers them with the motion registry
7
8
  * @position The paging domain of the UIKit constants table (motion/uikit). Only
8
9
  * core reads it, so the `uikit` namespace does not re-export it
9
10
  *
@@ -12,6 +13,8 @@
12
13
  * - /packages/core/src/motion/paging.ts and paging.test.ts
13
14
  */
14
15
 
16
+ import {registerMotionTable} from '../roles';
17
+
15
18
  export const paging = {
16
19
  /**
17
20
  * After the lift, one model moves the content: the settle onto the chosen
@@ -70,7 +73,8 @@ export const paging = {
70
73
  release: {
71
74
  /**
72
75
  * Released slower than `advanceSpeed`, the scroll view settles on the page
73
- * nearest the content position: past half a page, the next one.
76
+ * nearest the content position: past half a page, the next one. The pager
77
+ * keeps the start page instead for a release that moves back toward it.
74
78
  * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. In releases
75
79
  * at rest from page 1, content at 48.5 % of the page stays, and 57.5 %
76
80
  * goes to the next page. On a second 402 pt pager, 45 % stays and 55 %
@@ -121,9 +125,9 @@ export const paging = {
121
125
  */
122
126
  catchStopMs: 85,
123
127
  /**
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.
128
+ * In a sheet, a horizontal pager's pan begins only for a drag within atan(1 ÷
129
+ * this) of horizontal (26.6° for 2). A steeper drag goes to the sheet.
130
+ * Between 26.6° and 45°, neither moves.
127
131
  * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. A scroll
128
132
  * view's directional lock holds the major axis up to 25° and frees it from
129
133
  * 30°. An inline calendar pager in a sheet pages at 20° from horizontal. At
@@ -131,23 +135,36 @@ export const paging = {
131
135
  * the sheet.
132
136
  */
133
137
  panAxisRatio: 2,
138
+ /**
139
+ * Inside a vertical scroll view, exactly one of the pager and the scroll view
140
+ * takes a drag, decided once by its dominant axis. The pager takes it when
141
+ * |dx| ≥ this × |dy|, 45° and the tie included. The scroll view takes any
142
+ * other drag.
143
+ * @source measured: UIKit lab, iOS 26.2 simulator, Oct 24 2026. A 402 × 300
144
+ * paging view sits in a full-screen vertical scroll view, with 150 pt drags
145
+ * at 0–90°. The pager takes 0–45°, and the page takes 50–90°. At 35°, the
146
+ * outer view stays at 0 through 86 pt of vertical travel. The choice
147
+ * happens at 10–15 pt of travel.
148
+ */
149
+ nestedPanAxisRatio: 1,
134
150
  animatedScroll: {
135
151
  /**
136
- * `setContentOffset(_:animated:)` duration. It is the same for one page and
137
- * for five, as for a page control's tap.
152
+ * `setContentOffset(_:animated:)` duration in milliseconds. It is the same
153
+ * for one page and for five, as for a page control's tap.
138
154
  * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026.
139
155
  * `_contentOffsetAnimationDuration` reads 0.3, and five animated moves of
140
156
  * 1 to 5 pages each last 0.30 s.
141
157
  */
142
- duration: 0.3,
158
+ durationMs: 300,
143
159
  /**
144
160
  * Its curve is a sinusoidal ease-in-out: x = from + (to − from) · (1 − cos
145
- * πu) ÷ 2, for u = t ÷ duration.
161
+ * πu) ÷ 2, for u = t ÷ duration. This cubic bézier matches it to 0.02 % of
162
+ * the distance (0.09 pt over a 402 pt page).
146
163
  * @source measured: UIKit lab, iOS 26.2 simulator, Oct 23 2026. The five
147
164
  * moves fit the sinusoid to 0.14–0.51 pt RMS, and a 2010 pt move fits to
148
165
  * 0.20 pt. The curve easeInEaseOut (0.42, 0, 0.58, 1) misses by 7.7 pt.
149
166
  */
150
- curve: 'sineInOut',
167
+ curve: [0.364212, 0, 0.635788, 1],
151
168
  },
152
169
  /**
153
170
  * Past the first or last page, the content follows the finger through the
@@ -160,3 +177,17 @@ export const paging = {
160
177
  */
161
178
  rubberBandDimension: 'pageWidth',
162
179
  } as const;
180
+
181
+ /**
182
+ * Registers this table with the motion registry (motion/roles.ts). The pager
183
+ * then reads `setContentOffset(_:animated:)`'s duration and curve through
184
+ * `resolveMotion`, as it reads every touch motion. The table lists no role,
185
+ * because no motion role names any of its values, so each plays as measured.
186
+ * Nothing registers on import, and a second call does nothing.
187
+ */
188
+ export function registerPagingTable(): void {
189
+ registerMotionTable('paging', paging, {
190
+ // Who gets the touch, not how anything moves.
191
+ exclude: ['catchStopMs'],
192
+ });
193
+ }
@@ -4,11 +4,11 @@
4
4
  * @file progressBar.ts
5
5
  * @input Nothing: data only
6
6
  * @output Exports `progressBar` (UIProgressView's fill: the whole-track
7
- * duration and curve, its minimum length and its empty alpha) and
8
- * `registerProgressBarTable`
7
+ * duration and curve, its minimum length and its empty alpha; and the
8
+ * reduced-motion pulse) and `registerProgressBarTable`
9
9
  * @position ProgressBar's rows of the UIKit constants table (motion/uikit).
10
10
  * Lengths are in pt (CSS px), durations in ms, alphas in 0..1. Tests check
11
- * each leaf's `@source`.
11
+ * each leaf's `@source`, and each GUESS's `@measure`.
12
12
  *
13
13
  * SYNC: When modified, update
14
14
  * /packages/core/src/ProgressBar/ProgressBarTouch.ts and
@@ -18,10 +18,11 @@
18
18
  import {registerMotionTable} from '../roles';
19
19
 
20
20
  /**
21
- * UIProgressView's values, for ProgressBar. Two values are motion roles in the
22
- * generated motion role table: the whole-track duration,
23
- * `progress.fillTrackMs`, and its curve, `progress.curves.fill`. Every other
24
- * value is an internal constant.
21
+ * UIProgressView's values, for ProgressBar. Three values are motion roles in
22
+ * the generated motion role table: the whole-track duration,
23
+ * `progress.fillTrackMs`, its curve, `progress.curves.fill`, and the
24
+ * reduced-motion pulse, `progress.reducedMotionPulseMs`. Every other value is
25
+ * an internal constant.
25
26
  */
26
27
  export const progressBar = {
27
28
  /**
@@ -43,6 +44,24 @@ export const progressBar = {
43
44
  */
44
45
  fill: [0, 0, 1, 1],
45
46
  },
47
+ /**
48
+ * Under reduced motion the indeterminate fill stops travelling and pulses
49
+ * its opacity in place. Each way takes this long, on the `timing.curves.move`
50
+ * curve. A busy loop, so tempo does not scale it.
51
+ * @source GUESS — An owner value, not a UIKit number. iOS Safari pulses its
52
+ * indeterminate bar for 1 s between 0.30 and 0.60 opacity. ProgressBar
53
+ * pulses slower, at a floor that keeps the bar visible.
54
+ * @measure M-PB1
55
+ */
56
+ reducedMotionPulseMs: 2000,
57
+ /**
58
+ * That pulse's lowest opacity. It is the lowest at which every tone that
59
+ * reaches 3:1 against the track at full opacity still does. That holds in
60
+ * the light and dark default themes.
61
+ * @source GUESS — An owner value, not a UIKit number.
62
+ * @measure M-PB1
63
+ */
64
+ reducedMotionPulseFloor: 0.84,
46
65
  progressView: {
47
66
  /**
48
67
  * The track's height in the `.default` style; the fill is as tall.
@@ -71,12 +90,13 @@ export const progressBar = {
71
90
  } as const;
72
91
 
73
92
  /**
74
- * Registers the table's two roles, for the generated motion role table and its
75
- * test, which call it. Nothing at runtime reads the registry: `resolveMotion`
76
- * returns the table value. Idempotent, and nothing runs on import.
93
+ * Registers the table's three roles, for the generated motion role table and
94
+ * its test, which call it. Nothing at runtime reads the registry:
95
+ * `resolveMotion` returns the table value. Idempotent, and nothing runs on
96
+ * import.
77
97
  */
78
98
  export function registerProgressBarTable(): void {
79
99
  registerMotionTable('progress', progressBar, {
80
- roles: ['fillTrackMs', 'curves.fill'],
100
+ roles: ['fillTrackMs', 'curves.fill', 'reducedMotionPulseMs'],
81
101
  });
82
102
  }
@@ -0,0 +1,74 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file segmented.ts
5
+ * @input Nothing; data only
6
+ * @output Exports `segmentedControl`, UISegmentedControl's selection slide
7
+ * spring and its drag overshoot; and `registerSegmentedTable`, which
8
+ * registers the spring as an internal motion role
9
+ * @position The segmented-control domain of the UIKit constants table
10
+ * (motion/uikit); read by SegmentedControl's touch presentation
11
+ *
12
+ * SYNC: When modified, update:
13
+ * - /packages/core/src/SegmentedControl/useSegmentedSelectionMotion.ts
14
+ * - /packages/core/src/motion/README.md (domain list)
15
+ */
16
+
17
+ import {registerMotionTable} from '../roles';
18
+
19
+ /**
20
+ * UIKit's own UISegmentedControl, measured with three text segments in a
21
+ * 300 × 31 pt control. A tap and a programmatic change follow the same
22
+ * spring. Every leaf carries a `@source`, and uikit.test.ts checks it.
23
+ *
24
+ * Some UIKit motion is left out on purpose. UIKit cross-fades the two titles
25
+ * that change, over 0.2 s. Astryx switches them at once, because a
26
+ * cross-fade needs a second copy of each title. Under Reduce Motion, UIKit's
27
+ * lens fades in at the new segment and scales from 0.88. Astryx allows no
28
+ * scaling there, so the animator's Reduce Motion cross-fade replaces it.
29
+ * UIKit's lens also lifts and stretches under a finger. A theme role owns
30
+ * the lift, and the stretch is not modeled. The lens chases a dragging
31
+ * finger on the shared `springs.fingerTracking` role, which matches the
32
+ * values UIKit reports for this control.
33
+ */
34
+ export const segmentedControl = {
35
+ /**
36
+ * The selection indicator's slide from the old segment to the new one,
37
+ * after a tap or a programmatic change. Its response is 0.40 s and its
38
+ * damping ratio 0.85. That gives about 1.25 pt of overshoot on a 200 pt
39
+ * move, settled by about 0.6 s. The width follows the same spring when the
40
+ * segments differ in width.
41
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
42
+ * iPhone 17 Pro, UIViewSpringAnimationBehavior read on the lens position
43
+ * for a tap and a programmatic set (dampingRatio 0.85, response 0.40,
44
+ * tracking off), Oct 23 2026
45
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
46
+ * iPhone 17 Pro, per-frame log of the lens's presentation position and
47
+ * velocity (method C) for a tap, a programmatic set and an animated set,
48
+ * least-squares spring fit (response 0.395 / 0.405 / 0.400 s, damping
49
+ * ratio 0.855 / 0.845 / 0.850, rms at most 0.65 pt over 200 pt),
50
+ * Oct 23 2026
51
+ */
52
+ selectionSpring: {response: 0.4, dampingRatio: 0.85},
53
+ /**
54
+ * How far past the first or last segment's center the lens follows a
55
+ * dragging finger, in pt. Beyond that, the lens stays put while the finger
56
+ * goes on.
57
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
58
+ * iPhone 17 Pro, a drag 60 pt past the last segment: the lens stops about
59
+ * 11 pt past its center (312 vs 301), Oct 23 2026
60
+ */
61
+ dragOvershoot: 11,
62
+ } as const;
63
+
64
+ /**
65
+ * Registers this table with the motion registry (motion/roles.ts). The
66
+ * slide's spring becomes an internal motion role. The drag overshoot is not
67
+ * motion, so it stays an internal constant. Nothing registers on import, and
68
+ * a second call does nothing.
69
+ */
70
+ export function registerSegmentedTable(): void {
71
+ registerMotionTable('segmented', segmentedControl, {
72
+ roles: ['selectionSpring'],
73
+ });
74
+ }
@@ -15,11 +15,11 @@
15
15
  * that will confirm or replace them (MEASUREMENTS.md lists them all).
16
16
  * uikit.test.ts enforces both.
17
17
  *
18
- * Most springs are measured on iOS 26.2 or documented by Apple; two are still
19
- * GUESSES (`segmentedThumb`, `banner`) and two come from WebKit
20
- * (`switchThumbMove`, `switchThumbStretch`). A guess starts from the
21
- * nearest sourced spring and names it, so a component built on the table
22
- * gets the right value the moment its measurement lands, without changing.
18
+ * Most springs are measured on iOS 26.2 or documented by Apple; one is still
19
+ * a GUESS (`banner`). `switchThumbMove` is the switch's measured travel,
20
+ * which uikit/switch.ts reads. A guess starts from the nearest sourced
21
+ * spring and names it. A component built on the table gets the measured
22
+ * value the moment it lands, without changing.
23
23
  *
24
24
  * Press highlight in/out are fades, not springs: see timing.ts.
25
25
  *
@@ -388,44 +388,16 @@ export const MENU_REDUCED_MOTION_SPRING = {
388
388
  // ---------------------------------------------------------------------
389
389
 
390
390
  /**
391
- * UISwitch thumb travelling between off and on.
392
- * @source webkit Source/WebCore/rendering/cocoa/RenderThemeCocoa.mm
393
- * `thumbMoveSpring = SpringSolver(1.0, 438.649…, 31.4159…)`, "Values
394
- * chosen for consistency with UIKit" (= response 0.30 s, ratio 0.75);
395
- * its settling duration is WebKit's iOS switch duration 0.48801 s
396
- * (RenderThemeIOS.h). These are WebKit's iOS 18 values: UIKit's own
397
- * switch frames differ, and a switch reads its measured table instead.
398
- * @measure M-SW02
391
+ * UISwitch thumb travelling between off and on, measured: the switch table's
392
+ * `travel` reads this row, so the value has one home.
393
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
394
+ * iPhone 17 Pro, the lens's position behavior read on a tap (damping 1,
395
+ * response 0.3); the lens center after a 50 ms tap and after a 1 s hold
396
+ * fits one spring at 0.31 / 1 (rms 0.11 pt), Oct 23 2026
399
397
  */
400
398
  export const SWITCH_THUMB_MOVE_SPRING = {
401
399
  response: 0.3,
402
- dampingRatio: 0.75,
403
- } as const;
404
-
405
- /**
406
- * UISwitch thumb stretching while pressed and relaxing on release.
407
- * @source webkit Source/WebCore/rendering/cocoa/RenderThemeCocoa.mm
408
- * `thumbPressSpring = SpringSolver(1.0, 322.272…, 31.2364…)`, "Values
409
- * chosen for consistency with UIKit" (= response 0.35 s, ratio 0.87);
410
- * settles in WebKit's held duration 0.50740 s (RenderThemeIOS.h). As
411
- * for `switchThumbMove`, UIKit's own frames differ.
412
- * @measure M-SW03
413
- */
414
- export const SWITCH_THUMB_STRETCH_SPRING = {
415
- response: 0.35,
416
- dampingRatio: 0.87,
417
- } as const;
418
-
419
- /**
420
- * UISegmentedControl selection thumb sliding to a new segment.
421
- * @source GUESS — WebKit's UIKit-matched switch thumb spring, the nearest
422
- * sourced control thumb
423
- * @measure M-SG02
424
- * @measure M-SG03
425
- */
426
- export const SEGMENTED_THUMB_SPRING = {
427
- response: 0.3,
428
- dampingRatio: 0.75,
400
+ dampingRatio: 1,
429
401
  } as const;
430
402
 
431
403
  // ---------------------------------------------------------------------
@@ -517,8 +489,6 @@ export const springs = {
517
489
  contextMenuMorph: CONTEXT_MENU_MORPH_SPRING,
518
490
  menuReducedMotion: MENU_REDUCED_MOTION_SPRING,
519
491
  switchThumbMove: SWITCH_THUMB_MOVE_SPRING,
520
- switchThumbStretch: SWITCH_THUMB_STRETCH_SPRING,
521
- segmentedThumb: SEGMENTED_THUMB_SPRING,
522
492
  keyboard: KEYBOARD_SPRING,
523
493
  banner: BANNER_SPRING,
524
494
  sliderRelease: SLIDER_RELEASE_SPRING,
@@ -0,0 +1,174 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file switch.ts
5
+ * @input The springs table's measured switch travel (springs.ts)
6
+ * @output Exports `switchControl`: UISwitch's geometry, the springs of its
7
+ * Liquid Glass thumb and of its track color, the drag's rubber band and
8
+ * flip distance, and the release timing
9
+ * @position The switch domain of the UIKit constants table (motion/uikit)
10
+ *
11
+ * The values are UISwitch's on iOS 26.2, read in a UIKit host app on the
12
+ * simulator. Lengths are in pt (CSS px). uikit.test.ts checks each `@source`.
13
+ *
14
+ * SYNC: When modified, update /packages/core/src/motion/MEASUREMENTS.md.
15
+ */
16
+
17
+ import {registerMotionTable} from '../roles';
18
+ import {SWITCH_THUMB_MOVE_SPRING} from './springs';
19
+
20
+ /**
21
+ * UISwitch on iOS 26.2. Under a finger its white thumb lifts into a clear
22
+ * glass lens, and a drag moves it with a rubber band. The track colour slides
23
+ * on a spring of its own. UISwitch plays no haptic.
24
+ */
25
+ export const switchControl = {
26
+ /**
27
+ * The control's size (width × height): the track.
28
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
29
+ * iPhone 17 Pro, `UISwitch` frame 63 × 28 (intrinsic 61 × 28), track view
30
+ * 63 × 28 with corner radius 14, Oct 23 2026
31
+ */
32
+ trackSize: [63, 28],
33
+ /**
34
+ * The thumb at rest (width × height), inset equally from the track's top,
35
+ * bottom and nearer end; it never changes size between off and on.
36
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
37
+ * iPhone 17 Pro, `_UILiquidLensView` frame 37 × 24 at x 2 (off) and
38
+ * x 24 (on) inside the 63 × 28 track, Oct 23 2026
39
+ */
40
+ thumbSize: [37, 24],
41
+ /**
42
+ * The thumb lifted under a finger (width × height). The lens grows about
43
+ * its own center, past the track, and holds this size while the finger
44
+ * stays down.
45
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
46
+ * iPhone 17 Pro, lens bounds settled at 58 × 38.33 during a 1 s hold
47
+ * (center unmoved), Oct 23 2026
48
+ */
49
+ liftedThumbSize: [58, 38.333],
50
+ /**
51
+ * The lift: the thumb growing to `liftedThumbSize` while its white fill
52
+ * fades out and the clear glass fades in (one spring drives all three).
53
+ * Starts with the touch outside a scroll view, after its content delay
54
+ * inside one. UISwitch keeps it under Reduce Motion; core's Switch does not
55
+ * lift then.
56
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
57
+ * iPhone 17 Pro, per-frame lens bounds during a 1 s hold fitted with one
58
+ * spring for width and height (rms 0.29 pt; the fill's and the glass's
59
+ * opacity overshoot by the same 13 %; the lens's settings read on a tap
60
+ * say damping 0.625, response 0.27, whose 8 % overshoot is short of the
61
+ * frames' 12 %), Oct 23 2026
62
+ */
63
+ lift: {response: 0.23, dampingRatio: 0.55},
64
+ /**
65
+ * The settle after the finger lifts: the lens shrinking back to
66
+ * `thumbSize` while the white fill returns over the glass.
67
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
68
+ * iPhone 17 Pro, the lens's spring settings read on a tap (damping 0.7,
69
+ * response 0.5); per-frame lens bounds after the lift of a 1 s hold fit
70
+ * one spring at 0.49 / 0.70 (rms 0.065 pt; the opacities undershoot by
71
+ * the same 4.5 %), Oct 23 2026
72
+ */
73
+ settle: {response: 0.5, dampingRatio: 0.7},
74
+ /**
75
+ * The settle never starts sooner than this after the lift began, so a
76
+ * quick tap still shows the lifted lens, in ms.
77
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
78
+ * iPhone 17 Pro, a 50 ms tap: the lift→settle hand-off fitted at 235 ms
79
+ * after the lift began (rms 0.33 pt), Oct 23 2026
80
+ * @measure M-SW07
81
+ */
82
+ minimumLiftMs: 235,
83
+ /**
84
+ * The thumb travelling to the committed end after a release or a
85
+ * programmatic change. It starts from the thumb's own velocity.
86
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
87
+ * iPhone 17 Pro, the lens's position behavior read on a tap (damping 1,
88
+ * response 0.3); the lens center after a 50 ms tap and after a 1 s hold
89
+ * fits one spring at 0.31 / 1 (rms 0.11 pt), Oct 23 2026; the springs
90
+ * table's `SWITCH_THUMB_MOVE_SPRING` holds the one value
91
+ */
92
+ travel: SWITCH_THUMB_MOVE_SPRING,
93
+ /**
94
+ * During a drag the thumb chases the finger: each move retargets this
95
+ * spring at the finger's position, rubber-banded past either end.
96
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
97
+ * iPhone 17 Pro, a 4 s drag off → on → past both ends: the lens center
98
+ * simulated as this spring chasing the rubber-banded finger fits every
99
+ * frame (rms 0.21 pt), Oct 23 2026
100
+ */
101
+ tracking: {response: 0.36, dampingRatio: 1},
102
+ /**
103
+ * The drag's rubber band past either end: UIScrollView's
104
+ * `(1 − 1 ÷ (x·c ÷ d + 1))·d`. The coefficient c and the dimension d are in
105
+ * pt for the 28 pt control. Scale d with the track height.
106
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
107
+ * iPhone 17 Pro, the same drag fit: c 0.55, d 11.75–12 pt, the
108
+ * translation measured from where the finger landed, Oct 23 2026
109
+ */
110
+ rubberBand: {coefficient: 0.55, dimension: 12},
111
+ /**
112
+ * A drag flips the switch by the finger, not the thumb. Once the finger is
113
+ * this far from where it landed, toward the other end, the switch shows
114
+ * the other side. The distance is the track width minus the thumb width
115
+ * (63 − 37 pt). Back past where it landed, the starting side shows again.
116
+ * Flips happen on touch events only, so a fast swipe flips on the lift.
117
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
118
+ * iPhone 17 Pro, `UISwitchModernVisualElement` ivars per frame and the
119
+ * "SwitchWellPosition" springs during 1 pt-step drags: the same 26 pt for
120
+ * presses at x 8, 20.5 and 45, with and without a 400 ms hold, mirrored
121
+ * on an on switch; flipping back at the press point, Oct 23 2026
122
+ */
123
+ flipDistance: 26,
124
+ /**
125
+ * The track color turning on: the well image sliding in on a critically
126
+ * damped spring, starting when the switch flips (the lift of a tap).
127
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
128
+ * iPhone 17 Pro, `CASpringAnimation` "SwitchWellPosition" read: mass 1,
129
+ * stiffness 85.377, damping 18.480 (response 0.68 s), Oct 23 2026
130
+ */
131
+ wellOn: {mass: 1, stiffness: 85.37720070146501, damping: 18.47995678582231},
132
+ /**
133
+ * The track color turning off: the same well sliding back, faster.
134
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
135
+ * iPhone 17 Pro, `CASpringAnimation` "SwitchWellPosition" read: mass 1,
136
+ * stiffness 246.740, damping 31.416 (response 0.40 s), Oct 23 2026
137
+ */
138
+ wellOff: {mass: 1, stiffness: 246.74011002723395, damping: 31.41592653589793},
139
+ /**
140
+ * The lifted lens's drop shadow: y offset and radius in pt, then black
141
+ * alpha; none at rest.
142
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
143
+ * iPhone 17 Pro, the lens layer's presented `shadowOffset` (0, 7),
144
+ * `shadowRadius` 3, `shadowOpacity` 0.12 once lifted, 0 at rest,
145
+ * Oct 23 2026
146
+ */
147
+ liftedShadow: [7, 3, 0.12],
148
+ /**
149
+ * UISwitch plays no haptic on a tap, a hold or a drag.
150
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
151
+ * iPhone 17 Pro, every `UIFeedbackGenerator` entry point hooked: no call
152
+ * on tap, hold, drag or flip, Oct 23 2026
153
+ */
154
+ haptic: 'none',
155
+ } as const;
156
+
157
+ /**
158
+ * Registers the switch table's motion roles as internal roles. Nothing
159
+ * registers on import: Switch's touch presentation calls it once before its
160
+ * first animation, and a second call does nothing.
161
+ */
162
+ export function registerSwitchTable(): void {
163
+ registerMotionTable('switchControl', switchControl, {
164
+ roles: [
165
+ 'lift',
166
+ 'settle',
167
+ 'travel',
168
+ 'tracking',
169
+ 'wellOn',
170
+ 'wellOff',
171
+ 'minimumLiftMs',
172
+ ],
173
+ });
174
+ }
@@ -0,0 +1,23 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ /**
3
+ * @file privateAttributes/pressGroupItem.stylex.ts
4
+ * @input Nothing: the private press-group-item attribute
5
+ * @output pressGroupItemProps, which marks an action a group's tracker
6
+ * follows, and isTrackedByGroup, which reads the mark
7
+ * @position Owner module of the private press-group-item attribute: the only
8
+ * file that writes its name. AlertDialog marks its actions, and the press
9
+ * controller (utils/pressFeedback.ts) leaves their press to the group's
10
+ * tracker. No package entry exports it.
11
+ */
12
+
13
+ const PRESS_GROUP_ITEM = 'data-astryx-press-group-item';
14
+
15
+ /** Spread on each action that a group's tracker follows. */
16
+ export const pressGroupItemProps: Readonly<Record<string, string>> = {
17
+ [PRESS_GROUP_ITEM]: '',
18
+ };
19
+
20
+ /** Whether a group's tracker paints the press on `element` or an ancestor. */
21
+ export function isTrackedByGroup(element: Element): boolean {
22
+ return element.closest(`[${PRESS_GROUP_ITEM}]`) != null;
23
+ }
@@ -0,0 +1,28 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ /**
3
+ * @file privateAttributes/pressHoldsDrag.stylex.ts
4
+ * @input Whether a pressable's own drag moves under the finger
5
+ * @output pressHoldsDragProps, which marks such a pressable, and
6
+ * holdsPressThroughDrag, which reads the mark
7
+ * @position Owner module of the private press-holds-drag attribute: the only
8
+ * file that writes its name. Switch marks its row; the press controller
9
+ * (utils/pressFeedback.ts) keeps the press painted through that row's
10
+ * drag. No package entry exports it.
11
+ */
12
+
13
+ const PRESS_HOLDS_DRAG = 'data-astryx-press-holds-drag';
14
+
15
+ /**
16
+ * Spread on a pressable whose own drag the finger moves, such as a Switch's
17
+ * thumb. The drag is not a scroll, so the press stays painted.
18
+ */
19
+ export function pressHoldsDragProps(
20
+ holdsDrag: boolean,
21
+ ): Readonly<Record<string, string>> {
22
+ return holdsDrag ? {[PRESS_HOLDS_DRAG]: ''} : {};
23
+ }
24
+
25
+ /** Whether the press on `element` stays painted through its drag. */
26
+ export function holdsPressThroughDrag(element: Element): boolean {
27
+ return element.hasAttribute(PRESS_HOLDS_DRAG);
28
+ }
@@ -0,0 +1,22 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file privateAttributes/segmentTitle.stylex.ts
5
+ * @input Nothing
6
+ * @output segmentTitleProps, which marks a SegmentedControl segment's title,
7
+ * and titleOfSegment, which finds that title in a segment
8
+ * @position Owner module of the private segment-title attribute: the only
9
+ * file that writes its name. No package entry exports it.
10
+ */
11
+
12
+ const SEGMENT_TITLE = 'data-astryx-segment-title';
13
+
14
+ /** Spread on a segment's title: marks it for the touch layer. */
15
+ export const segmentTitleProps: Readonly<Record<string, string>> = {
16
+ [SEGMENT_TITLE]: '',
17
+ };
18
+
19
+ /** The title inside `segment`, or null when the label is hidden. */
20
+ export function titleOfSegment(segment: Element): HTMLElement | null {
21
+ return segment.querySelector<HTMLElement>(`[${SEGMENT_TITLE}]`);
22
+ }