@astryxdesign/core 0.7.5 → 0.7.6-canary.0d71e8d

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 (912) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +5 -5
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +183 -5
  6. package/dist/AppShell/observeMainOverflow.d.ts +9 -0
  7. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
  8. package/dist/AppShell/observeMainOverflow.js +125 -0
  9. package/dist/Avatar/Avatar.d.ts.map +1 -1
  10. package/dist/Avatar/Avatar.js +12 -3
  11. package/dist/Badge/Badge.d.ts.map +1 -1
  12. package/dist/Badge/Badge.js +7 -1
  13. package/dist/BottomSheet/BottomSheet.js +1 -1
  14. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  15. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  16. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  17. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  18. package/dist/BottomSheet/useSheetGestures.js +30 -3
  19. package/dist/Button/Button.js +4 -4
  20. package/dist/Carousel/Carousel.d.ts +3 -1
  21. package/dist/Carousel/Carousel.d.ts.map +1 -1
  22. package/dist/Carousel/Carousel.js +12 -3
  23. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  25. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  26. package/dist/ClickableCard/ClickableCard.js +37 -4
  27. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  28. package/dist/ComplexSelector/ComplexSelector.js +41 -4
  29. package/dist/DateInput/DateInput.d.ts.map +1 -1
  30. package/dist/DateInput/DateInput.js +12 -4
  31. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  32. package/dist/DateInput/MonthScroller.js +101 -15
  33. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  34. package/dist/DateInput/TouchDateField.js +8 -3
  35. package/dist/DateInput/Wheel.d.ts.map +1 -1
  36. package/dist/DateInput/Wheel.js +11 -7
  37. package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
  38. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  39. package/dist/DateInput/usePointerDragScroll.js +25 -9
  40. package/dist/DateInput/useScrollSettle.d.ts +3 -1
  41. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  42. package/dist/DateInput/useScrollSettle.js +37 -8
  43. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  44. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  45. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  46. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  47. package/dist/DateTimeInput/DateTimeInput.js +23 -12
  48. package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
  49. package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
  50. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  51. package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
  52. package/dist/Dialog/Dialog.d.ts.map +1 -1
  53. package/dist/Dialog/Dialog.js +34 -9
  54. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  55. package/dist/Dialog/DialogHeader.js +5 -4
  56. package/dist/Divider/Divider.d.ts.map +1 -1
  57. package/dist/Divider/Divider.js +2 -1
  58. package/dist/Drawer/Drawer.d.ts +1 -0
  59. package/dist/Drawer/Drawer.d.ts.map +1 -1
  60. package/dist/Drawer/Drawer.js +7 -2
  61. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  62. package/dist/DropdownMenu/DropdownMenu.js +35 -22
  63. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  64. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  65. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
  66. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  67. package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
  68. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  69. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  70. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  71. package/dist/EmptyState/EmptyState.js +2 -1
  72. package/dist/Field/FieldLabel.d.ts +1 -1
  73. package/dist/Field/FieldLabel.d.ts.map +1 -1
  74. package/dist/Field/FieldLabel.js +4 -4
  75. package/dist/Field/InputClearButton.js +3 -3
  76. package/dist/Field/PanelSearchInput.js +2 -2
  77. package/dist/FieldStatus/FieldStatus.d.ts +3 -0
  78. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  79. package/dist/FieldStatus/FieldStatus.js +3 -2
  80. package/dist/FileInput/FileInput.d.ts +3 -0
  81. package/dist/FileInput/FileInput.d.ts.map +1 -1
  82. package/dist/FileInput/FileInput.js +34 -13
  83. package/dist/Heading/Heading.js +1 -1
  84. package/dist/Icon/Icon.js +1 -1
  85. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  86. package/dist/Indicator/CheckIndicator.js +2 -1
  87. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  88. package/dist/Indicator/CheckboxIndicator.js +3 -1
  89. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  90. package/dist/Indicator/RadioIndicator.js +3 -1
  91. package/dist/Item/Item.d.ts.map +1 -1
  92. package/dist/Item/Item.js +21 -7
  93. package/dist/Item/ItemSwipeLayer.js +1 -1
  94. package/dist/Layer/popoverOperations.d.ts +27 -0
  95. package/dist/Layer/popoverOperations.d.ts.map +1 -0
  96. package/dist/Layer/popoverOperations.js +159 -0
  97. package/dist/Layer/useLayer.d.ts +1 -1
  98. package/dist/Layer/useLayer.d.ts.map +1 -1
  99. package/dist/Layer/useLayer.js +120 -65
  100. package/dist/Layout/Layout.js +1 -1
  101. package/dist/Layout/LayoutContent.js +1 -1
  102. package/dist/Layout/LayoutFooter.js +1 -1
  103. package/dist/Layout/LayoutHeader.js +1 -1
  104. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  105. package/dist/Lightbox/Lightbox.js +5 -0
  106. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  107. package/dist/Link/Link.d.ts.map +1 -1
  108. package/dist/Link/Link.js +8 -3
  109. package/dist/List/List.js +1 -1
  110. package/dist/List/ListItem.js +3 -3
  111. package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
  112. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  113. package/dist/MobileNav/MobileNav.js +7 -2
  114. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
  115. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  116. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  117. package/dist/MultiSelector/MultiSelector.js +26 -10
  118. package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
  119. package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
  120. package/dist/NumberInput/NumberInput.d.ts +3 -1
  121. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  122. package/dist/NumberInput/NumberInput.js +26 -5
  123. package/dist/NumberInput/numberParser.d.ts +3 -0
  124. package/dist/NumberInput/numberParser.d.ts.map +1 -1
  125. package/dist/NumberInput/numberParser.js +7 -44
  126. package/dist/Outline/Outline.d.ts.map +1 -1
  127. package/dist/Outline/Outline.js +27 -0
  128. package/dist/Popover/Popover.d.ts.map +1 -1
  129. package/dist/Popover/Popover.js +32 -12
  130. package/dist/Popover/usePopover.d.ts.map +1 -1
  131. package/dist/Popover/usePopover.js +10 -3
  132. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  133. package/dist/PowerSearch/PowerSearch.js +37 -30
  134. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  135. package/dist/ProgressBar/ProgressBar.js +16 -12
  136. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  137. package/dist/RadioList/RadioListItem.js +11 -3
  138. package/dist/Resizable/useResizable.d.ts.map +1 -1
  139. package/dist/Resizable/useResizable.js +28 -2
  140. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  141. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  142. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  143. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  144. package/dist/Selector/useSelectorPresentation.js +20 -4
  145. package/dist/SideNav/SideNavItem.d.ts +2 -2
  146. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  147. package/dist/SideNav/SideNavItem.js +18 -7
  148. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  149. package/dist/Skeleton/Skeleton.js +1 -1
  150. package/dist/Slider/Slider.d.ts.map +1 -1
  151. package/dist/Slider/Slider.js +10 -2
  152. package/dist/Spinner/Spinner.d.ts.map +1 -1
  153. package/dist/Spinner/Spinner.js +3 -3
  154. package/dist/Stack/Stack.js +1 -1
  155. package/dist/Stack/StackItem.js +1 -1
  156. package/dist/Stepper/Step.d.ts.map +1 -1
  157. package/dist/Stepper/Step.js +26 -6
  158. package/dist/Switch/Switch.d.ts.map +1 -1
  159. package/dist/Switch/Switch.js +10 -3
  160. package/dist/TabList/TabList.d.ts.map +1 -1
  161. package/dist/TabList/TabList.js +16 -1
  162. package/dist/Table/Table.d.ts.map +1 -1
  163. package/dist/Table/Table.js +36 -10
  164. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  165. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  166. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  167. package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
  168. package/dist/Text/Text.js +1 -1
  169. package/dist/Text/useTruncation.d.ts.map +1 -1
  170. package/dist/Text/useTruncation.js +23 -5
  171. package/dist/TextArea/TextArea.d.ts +1 -1
  172. package/dist/TextArea/TextArea.d.ts.map +1 -1
  173. package/dist/TextArea/TextArea.js +13 -2
  174. package/dist/TextInput/TextInput.d.ts.map +1 -1
  175. package/dist/TextInput/TextInput.js +3 -3
  176. package/dist/TimeInput/TimeInput.d.ts +6 -2
  177. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  178. package/dist/TimeInput/TimeInput.js +21 -14
  179. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  180. package/dist/TimeInput/TouchTimeField.js +5 -4
  181. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  182. package/dist/Timestamp/Timestamp.js +2 -2
  183. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  184. package/dist/Toast/Toast.d.ts.map +1 -1
  185. package/dist/Toast/Toast.js +60 -20
  186. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  187. package/dist/Toast/ToastViewport.js +101 -54
  188. package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
  189. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  190. package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
  191. package/dist/Token/Token.d.ts +1 -1
  192. package/dist/Token/Token.d.ts.map +1 -1
  193. package/dist/Token/Token.js +52 -5
  194. package/dist/Token/TokenLink.d.ts.map +1 -1
  195. package/dist/Token/TokenLink.js +14 -2
  196. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  197. package/dist/Tokenizer/Tokenizer.js +44 -7
  198. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  199. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
  200. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
  201. package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
  202. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  203. package/dist/Toolbar/Toolbar.js +2 -1
  204. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  205. package/dist/TopNav/TopNavMegaMenu.js +3 -0
  206. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  207. package/dist/TopNav/TopNavMenu.js +1 -0
  208. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  209. package/dist/TreeList/TreeListItem.js +27 -4
  210. package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
  211. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  212. package/dist/Typeahead/BaseTypeahead.js +43 -7
  213. package/dist/Typeahead/Typeahead.d.ts +1 -1
  214. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  215. package/dist/Typeahead/Typeahead.js +43 -9
  216. package/dist/astryx.css +25 -4
  217. package/dist/gestures/GestureArena.d.ts +32 -1
  218. package/dist/gestures/GestureArena.d.ts.map +1 -1
  219. package/dist/gestures/GestureArena.js +110 -9
  220. package/dist/gestures/GestureHost.d.ts +351 -0
  221. package/dist/gestures/GestureHost.d.ts.map +1 -0
  222. package/dist/gestures/GestureHost.js +1773 -0
  223. package/dist/gestures/GestureRecognizer.d.ts +13 -1
  224. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  225. package/dist/gestures/GestureRecognizer.js +19 -1
  226. package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
  227. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
  228. package/dist/gestures/LongPressGestureRecognizer.js +3 -0
  229. package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
  230. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  231. package/dist/gestures/PanGestureRecognizer.js +3 -0
  232. package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
  233. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  234. package/dist/gestures/PinchGestureRecognizer.js +128 -0
  235. package/dist/gestures/PressTracker.d.ts +112 -0
  236. package/dist/gestures/PressTracker.d.ts.map +1 -0
  237. package/dist/gestures/PressTracker.js +267 -0
  238. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
  239. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  240. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
  241. package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
  242. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  243. package/dist/gestures/SwipeGestureRecognizer.js +148 -0
  244. package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
  245. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
  246. package/dist/gestures/TapGestureRecognizer.js +3 -0
  247. package/dist/gestures/VelocityTracker.d.ts +6 -2
  248. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  249. package/dist/gestures/VelocityTracker.js +7 -3
  250. package/dist/gestures/haptics.d.ts +65 -0
  251. package/dist/gestures/haptics.d.ts.map +1 -0
  252. package/dist/gestures/haptics.js +182 -0
  253. package/dist/gestures/index.d.ts +37 -0
  254. package/dist/gestures/index.d.ts.map +1 -0
  255. package/dist/gestures/index.js +25 -0
  256. package/dist/gestures/nativeScroll.d.ts +42 -0
  257. package/dist/gestures/nativeScroll.d.ts.map +1 -0
  258. package/dist/gestures/nativeScroll.js +228 -0
  259. package/dist/gestures/touchAction.d.ts +60 -0
  260. package/dist/gestures/touchAction.d.ts.map +1 -0
  261. package/dist/gestures/touchAction.js +157 -0
  262. package/dist/gestures/touchActionRule.d.ts +34 -0
  263. package/dist/gestures/touchActionRule.d.ts.map +1 -0
  264. package/dist/gestures/touchActionRule.js +140 -0
  265. package/dist/gestures/types.d.ts +18 -7
  266. package/dist/gestures/types.d.ts.map +1 -1
  267. package/dist/gestures/types.js +22 -2
  268. package/dist/gestures/useGestureRecognizer.d.ts +56 -0
  269. package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
  270. package/dist/gestures/useGestureRecognizer.js +226 -0
  271. package/dist/hooks/index.d.ts +1 -1
  272. package/dist/hooks/index.d.ts.map +1 -1
  273. package/dist/hooks/modalAnnounce.d.ts.map +1 -1
  274. package/dist/hooks/modalAnnounce.js +107 -61
  275. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
  276. package/dist/hooks/scrollKeyboardDelegation.js +7 -3
  277. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  278. package/dist/hooks/useAdaptivePresentation.js +4 -1
  279. package/dist/hooks/useAnnounce.d.ts +101 -42
  280. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  281. package/dist/hooks/useAnnounce.js +161 -75
  282. package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
  283. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  284. package/dist/hooks/useAnnounceRenderedText.js +5 -3
  285. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  286. package/dist/hooks/useBusyAnnouncement.js +6 -12
  287. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  288. package/dist/hooks/useMenuHover.js +12 -1
  289. package/dist/hooks/useScrollOverflow.d.ts +2 -1
  290. package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
  291. package/dist/hooks/useScrollOverflow.js +56 -10
  292. package/dist/i18n/generated-locales/af-ZA.generated.d.ts.map +1 -1
  293. package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
  294. package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
  295. package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
  296. package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
  297. package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
  298. package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
  299. package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
  300. package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
  301. package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
  302. package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
  304. package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
  305. package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
  306. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  307. package/dist/i18n/generated-locales/en.generated.js +8 -5
  308. package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
  309. package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
  310. package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
  311. package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
  312. package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
  313. package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
  314. package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
  315. package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
  316. package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
  317. package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
  318. package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
  319. package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
  320. package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
  321. package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
  322. package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
  323. package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
  324. package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
  325. package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
  326. package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
  327. package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
  328. package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
  329. package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
  330. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  331. package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
  332. package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
  333. package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
  334. package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
  335. package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
  336. package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
  337. package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
  338. package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
  339. package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
  340. package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
  341. package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
  342. package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
  343. package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
  344. package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
  345. package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
  346. package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
  347. package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
  348. package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
  349. package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
  350. package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
  351. package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
  352. package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
  353. package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
  354. package/dist/i18n/useListFormatter.d.ts +9 -0
  355. package/dist/i18n/useListFormatter.d.ts.map +1 -0
  356. package/dist/i18n/useListFormatter.js +41 -0
  357. package/dist/motion/animator.d.ts +83 -8
  358. package/dist/motion/animator.d.ts.map +1 -1
  359. package/dist/motion/animator.js +701 -119
  360. package/dist/motion/coast.d.ts +4 -1
  361. package/dist/motion/coast.d.ts.map +1 -1
  362. package/dist/motion/coast.js +4 -2
  363. package/dist/motion/reducedMotion.d.ts.map +1 -1
  364. package/dist/motion/reducedMotion.js +6 -2
  365. package/dist/motion/reducedMotionPlan.d.ts +7 -0
  366. package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
  367. package/dist/motion/reducedMotionPlan.js +14 -1
  368. package/dist/motion/resolveMotion.d.ts +42 -0
  369. package/dist/motion/resolveMotion.d.ts.map +1 -0
  370. package/dist/motion/resolveMotion.js +43 -0
  371. package/dist/motion/roleValue.d.ts +2 -1
  372. package/dist/motion/roleValue.d.ts.map +1 -1
  373. package/dist/motion/roleValue.js +2 -1
  374. package/dist/motion/uikit/timing.d.ts +7 -1
  375. package/dist/motion/uikit/timing.d.ts.map +1 -1
  376. package/dist/motion/uikit/timing.js +19 -1
  377. package/dist/theme/defineTheme.d.ts +19 -5
  378. package/dist/theme/defineTheme.d.ts.map +1 -1
  379. package/dist/theme/defineTheme.js +64 -4
  380. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  381. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  382. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  383. package/dist/theme/domainTokens/index.d.ts +5 -4
  384. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  385. package/dist/theme/domainTokens/index.js +5 -9
  386. package/dist/theme/index.d.ts +1 -0
  387. package/dist/theme/index.d.ts.map +1 -1
  388. package/dist/theme/motionKnobs.d.ts +56 -0
  389. package/dist/theme/motionKnobs.d.ts.map +1 -0
  390. package/dist/theme/motionKnobs.js +48 -0
  391. package/dist/theme/resolveThemeValues.d.ts +11 -4
  392. package/dist/theme/resolveThemeValues.d.ts.map +1 -1
  393. package/dist/theme/resolveThemeValues.js +40 -4
  394. package/dist/theme/themeAdaptations.d.ts +7 -3
  395. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  396. package/dist/theme/themeAdaptations.js +36 -7
  397. package/dist/theme/themeMotion.d.ts +96 -0
  398. package/dist/theme/themeMotion.d.ts.map +1 -0
  399. package/dist/theme/themeMotion.js +177 -0
  400. package/dist/theme/tokenReferences.d.ts +31 -0
  401. package/dist/theme/tokenReferences.d.ts.map +1 -0
  402. package/dist/theme/tokenReferences.js +132 -0
  403. package/dist/theme/tokens.d.ts +1 -0
  404. package/dist/theme/tokens.d.ts.map +1 -1
  405. package/dist/theme/tokens.js +9 -129
  406. package/dist/theme/tokens.stylex.d.ts +12 -0
  407. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  408. package/dist/theme/tokens.stylex.js +12 -0
  409. package/dist/utils/focusOutline.stylex.d.ts +6 -0
  410. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  411. package/dist/utils/focusOutline.stylex.js +7 -0
  412. package/dist/utils/focusReturn.d.ts +17 -1
  413. package/dist/utils/focusReturn.d.ts.map +1 -1
  414. package/dist/utils/focusReturn.js +11 -4
  415. package/dist/utils/getNodeText.d.ts +8 -0
  416. package/dist/utils/getNodeText.d.ts.map +1 -0
  417. package/dist/utils/getNodeText.js +37 -0
  418. package/dist/utils/interactionModality.d.ts +11 -2
  419. package/dist/utils/interactionModality.d.ts.map +1 -1
  420. package/dist/utils/interactionModality.js +58 -5
  421. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  422. package/dist/utils/interactionOverlay.stylex.js +17 -8
  423. package/dist/utils/plainDate.d.ts +2 -0
  424. package/dist/utils/plainDate.d.ts.map +1 -1
  425. package/dist/utils/plainDate.js +46 -3
  426. package/dist/utils/presentation.d.ts +50 -0
  427. package/dist/utils/presentation.d.ts.map +1 -0
  428. package/dist/utils/presentation.js +125 -0
  429. package/dist/utils/pressFeedback.d.ts.map +1 -1
  430. package/dist/utils/pressFeedback.js +20 -1
  431. package/dist/utils/primaryClick.d.ts +11 -0
  432. package/dist/utils/primaryClick.d.ts.map +1 -0
  433. package/dist/utils/primaryClick.js +25 -0
  434. package/dist/utils/sharedMutationObserver.d.ts +19 -11
  435. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  436. package/dist/utils/sharedMutationObserver.js +66 -26
  437. package/dist/utils/timeFormat.d.ts +47 -0
  438. package/dist/utils/timeFormat.d.ts.map +1 -0
  439. package/dist/utils/timeFormat.js +240 -0
  440. package/dist/utils/touchPresentation.d.ts +2 -2
  441. package/dist/utils/touchPresentation.d.ts.map +1 -1
  442. package/dist/utils/touchPresentation.js +13 -8
  443. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  444. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  445. package/dist/utils/touchPresentation.stylex.js +33 -0
  446. package/dist/utils/touchQueries.d.ts +13 -0
  447. package/dist/utils/touchQueries.d.ts.map +1 -0
  448. package/dist/utils/touchQueries.js +15 -0
  449. package/dist/utils/unicodeDigits.d.ts +20 -0
  450. package/dist/utils/unicodeDigits.d.ts.map +1 -0
  451. package/dist/utils/unicodeDigits.js +70 -0
  452. package/dist/utils/useFocusAcrossSwap.d.ts +19 -0
  453. package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
  454. package/dist/utils/useFocusAcrossSwap.js +41 -0
  455. package/locales/af-ZA.json +0 -21
  456. package/locales/ar-SA.json +0 -21
  457. package/locales/ca-ES.json +0 -21
  458. package/locales/cs-CZ.json +0 -21
  459. package/locales/da-DK.json +0 -21
  460. package/locales/de-DE.json +0 -21
  461. package/locales/el-GR.json +0 -21
  462. package/locales/en.json +35 -23
  463. package/locales/es-ES.json +0 -21
  464. package/locales/fi-FI.json +0 -21
  465. package/locales/fr-FR.json +0 -21
  466. package/locales/he-IL.json +0 -21
  467. package/locales/hu-HU.json +0 -21
  468. package/locales/it-IT.json +0 -21
  469. package/locales/ja-JP.json +0 -21
  470. package/locales/ko-KR.json +0 -21
  471. package/locales/nl-NL.json +0 -21
  472. package/locales/no-NO.json +0 -21
  473. package/locales/pl-PL.json +0 -21
  474. package/locales/pseudo.json +23 -14
  475. package/locales/pt-BR.json +0 -21
  476. package/locales/pt-PT.json +0 -21
  477. package/locales/ro-RO.json +0 -21
  478. package/locales/ru-RU.json +0 -21
  479. package/locales/sr-SP.json +0 -21
  480. package/locales/sv-SE.json +0 -21
  481. package/locales/tr-TR.json +0 -21
  482. package/locales/uk-UA.json +0 -21
  483. package/locales/vi-VN.json +0 -21
  484. package/locales/zh-CN.json +0 -21
  485. package/locales/zh-TW.json +0 -21
  486. package/package.json +5 -4
  487. package/src/AlertDialog/AlertDialog.tsx +6 -5
  488. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  489. package/src/AppShell/AppShell.doc.mjs +1 -1
  490. package/src/AppShell/AppShell.spec.md +9 -12
  491. package/src/AppShell/AppShell.test.tsx +164 -2
  492. package/src/AppShell/AppShell.tsx +225 -5
  493. package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
  494. package/src/AppShell/observeMainOverflow.test.ts +173 -0
  495. package/src/AppShell/observeMainOverflow.ts +143 -0
  496. package/src/Avatar/Avatar.spec.md +22 -22
  497. package/src/Avatar/Avatar.tsx +18 -1
  498. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  499. package/src/Badge/Badge.doc.mjs +1 -1
  500. package/src/Badge/Badge.tsx +19 -2
  501. package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
  502. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  503. package/src/BottomSheet/BottomSheet.tsx +1 -1
  504. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  505. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  506. package/src/BottomSheet/useSheetGestures.ts +37 -6
  507. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  508. package/src/Button/Button.tsx +4 -4
  509. package/src/Calendar/Calendar.spec.md +87 -48
  510. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  511. package/src/Carousel/Carousel.doc.mjs +1 -1
  512. package/src/Carousel/Carousel.spec.md +9 -9
  513. package/src/Carousel/Carousel.test.tsx +124 -3
  514. package/src/Carousel/Carousel.tsx +10 -2
  515. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  516. package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
  517. package/src/Chat/ChatComposer.spec.md +75 -59
  518. package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
  519. package/src/Chat/ChatDictationButton.spec.md +126 -81
  520. package/src/Chat/ChatLayout.spec.md +41 -36
  521. package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
  522. package/src/Chat/ChatMessage.spec.md +64 -65
  523. package/src/Chat/ChatSendButton.spec.md +78 -67
  524. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  525. package/src/Citation/Citation.spec.md +60 -47
  526. package/src/ClickableCard/ClickableCard.test.tsx +96 -0
  527. package/src/ClickableCard/ClickableCard.tsx +48 -4
  528. package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
  529. package/src/Collapsible/Collapsible.spec.md +2 -0
  530. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  531. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  532. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  533. package/src/ComplexSelector/ComplexSelector.test.tsx +148 -0
  534. package/src/ComplexSelector/ComplexSelector.tsx +41 -4
  535. package/src/ContextMenu/ContextMenu.spec.md +84 -56
  536. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  537. package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
  538. package/src/DateInput/DateInput.spec.md +74 -57
  539. package/src/DateInput/DateInput.test.tsx +115 -3
  540. package/src/DateInput/DateInput.tsx +29 -14
  541. package/src/DateInput/DateInputTouch.test.tsx +120 -0
  542. package/src/DateInput/MonthScroller.tsx +106 -20
  543. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  544. package/src/DateInput/TouchDateField.tsx +14 -3
  545. package/src/DateInput/Wheel.tsx +9 -6
  546. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  547. package/src/DateInput/usePointerDragScroll.ts +34 -10
  548. package/src/DateInput/useScrollSettle.ts +38 -7
  549. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  550. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  551. package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
  552. package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
  553. package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
  554. package/src/DateTimeInput/DateTimeInput.tsx +46 -24
  555. package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
  556. package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
  557. package/src/Dialog/Dialog.test.tsx +216 -2
  558. package/src/Dialog/Dialog.tsx +42 -9
  559. package/src/Dialog/DialogHeader.tsx +5 -4
  560. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  561. package/src/Divider/Divider.tsx +2 -1
  562. package/src/Drawer/Drawer.spec.md +111 -80
  563. package/src/Drawer/Drawer.test.tsx +35 -0
  564. package/src/Drawer/Drawer.tsx +13 -2
  565. package/src/Drawer/DrawerHeader.spec.md +181 -0
  566. package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
  567. package/src/DropdownMenu/DropdownMenu.spec.md +198 -218
  568. package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
  569. package/src/DropdownMenu/DropdownMenu.tsx +43 -21
  570. package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
  571. package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
  572. package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
  573. package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
  574. package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
  575. package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
  576. package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
  577. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  578. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  579. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  580. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  581. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
  582. package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
  583. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  584. package/src/EmptyState/EmptyState.spec.md +35 -29
  585. package/src/EmptyState/EmptyState.tsx +2 -1
  586. package/src/Field/FieldLabel.tsx +5 -4
  587. package/src/Field/InputClearButton.tsx +3 -3
  588. package/src/Field/PanelSearchInput.tsx +2 -2
  589. package/src/FieldStatus/FieldStatus.tsx +9 -2
  590. package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
  591. package/src/FileInput/FileInput.test.tsx +159 -0
  592. package/src/FileInput/FileInput.tsx +34 -6
  593. package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
  594. package/src/FormLayout/FormLayout.spec.md +11 -20
  595. package/src/Heading/Heading.tsx +1 -1
  596. package/src/Icon/Icon.tsx +1 -1
  597. package/src/Indicator/CheckIndicator.spec.md +47 -42
  598. package/src/Indicator/CheckIndicator.tsx +2 -1
  599. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  600. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  601. package/src/Indicator/Indicator.spec.md +188 -0
  602. package/src/Indicator/RadioIndicator.tsx +3 -1
  603. package/src/Item/Item.test.tsx +60 -0
  604. package/src/Item/Item.tsx +16 -8
  605. package/src/Item/ItemSwipeLayer.tsx +1 -1
  606. package/src/Kbd/Kbd.spec.md +81 -38
  607. package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
  608. package/src/Layer/popoverOperations.test.ts +205 -0
  609. package/src/Layer/popoverOperations.ts +172 -0
  610. package/src/Layer/useLayer.test.tsx +426 -4
  611. package/src/Layer/useLayer.tsx +145 -77
  612. package/src/Layout/Layout.spec.md +127 -131
  613. package/src/Layout/Layout.tsx +1 -1
  614. package/src/Layout/LayoutContent.spec.md +205 -0
  615. package/src/Layout/LayoutContent.tsx +1 -1
  616. package/src/Layout/LayoutFooter.spec.md +190 -0
  617. package/src/Layout/LayoutFooter.tsx +1 -1
  618. package/src/Layout/LayoutHeader.spec.md +193 -0
  619. package/src/Layout/LayoutHeader.tsx +1 -1
  620. package/src/Layout/LayoutPanel.spec.md +194 -0
  621. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  622. package/src/Lightbox/Lightbox.test.tsx +18 -0
  623. package/src/Lightbox/Lightbox.tsx +5 -0
  624. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  625. package/src/Link/Link.spec.md +3 -2
  626. package/src/Link/Link.tsx +11 -0
  627. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  628. package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
  629. package/src/List/List.tsx +1 -1
  630. package/src/List/ListItem.spec.md +205 -0
  631. package/src/List/ListItem.tsx +3 -3
  632. package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
  633. package/src/MetadataList/MetadataList.spec.md +187 -0
  634. package/src/MetadataList/MetadataListItem.spec.md +165 -0
  635. package/src/MobileNav/MobileNav.test.tsx +15 -0
  636. package/src/MobileNav/MobileNav.tsx +9 -1
  637. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  638. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  639. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
  640. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  641. package/src/MultiSelector/MultiSelector.test.tsx +270 -1
  642. package/src/MultiSelector/MultiSelector.tsx +25 -10
  643. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  644. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  645. package/src/NavMenu/NavHeadingMenuItem.tsx +5 -39
  646. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  647. package/src/NumberInput/NumberInput.spec.md +59 -37
  648. package/src/NumberInput/NumberInput.test.tsx +68 -7
  649. package/src/NumberInput/NumberInput.tsx +44 -4
  650. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  651. package/src/NumberInput/numberParser.ts +7 -45
  652. package/src/Outline/Outline.spec.md +165 -69
  653. package/src/Outline/Outline.test.tsx +67 -2
  654. package/src/Outline/Outline.tsx +23 -0
  655. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
  656. package/src/OverflowList/OverflowList.spec.md +102 -55
  657. package/src/Pagination/Pagination.spec.md +158 -84
  658. package/src/Popover/Popover.test.tsx +84 -0
  659. package/src/Popover/Popover.tsx +34 -14
  660. package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
  661. package/src/Popover/usePopover.tsx +10 -3
  662. package/src/PowerSearch/PowerSearch.test.tsx +24 -0
  663. package/src/PowerSearch/PowerSearch.tsx +42 -31
  664. package/src/ProgressBar/ProgressBar.spec.md +143 -119
  665. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  666. package/src/ProgressBar/ProgressBar.tsx +58 -10
  667. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  668. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  669. package/src/RadioList/RadioList.spec.md +1 -1
  670. package/src/RadioList/RadioList.test.tsx +84 -0
  671. package/src/RadioList/RadioListItem.tsx +11 -2
  672. package/src/Resizable/Resizable.spec.md +144 -124
  673. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  674. package/src/Resizable/useResizable.test.ts +43 -0
  675. package/src/Resizable/useResizable.ts +32 -9
  676. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  677. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  678. package/src/Selector/Selector.test.tsx +90 -1
  679. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  680. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  681. package/src/Selector/useSelectorPresentation.ts +31 -3
  682. package/src/SideNav/SideNav.test.tsx +151 -4
  683. package/src/SideNav/SideNavItem.spec.md +14 -24
  684. package/src/SideNav/SideNavItem.tsx +27 -10
  685. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
  686. package/src/Skeleton/Skeleton.tsx +3 -1
  687. package/src/Slider/Slider.test.tsx +31 -0
  688. package/src/Slider/Slider.tsx +8 -3
  689. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  690. package/src/Spinner/Spinner.tsx +5 -3
  691. package/src/Stack/Stack.tsx +1 -1
  692. package/src/Stack/StackItem.tsx +1 -1
  693. package/src/Stepper/Step.spec.md +36 -42
  694. package/src/Stepper/Step.tsx +33 -6
  695. package/src/Stepper/Stepper.doc.mjs +1 -1
  696. package/src/Stepper/Stepper.test.tsx +69 -7
  697. package/src/Switch/Switch.spec.md +1 -1
  698. package/src/Switch/Switch.test.tsx +66 -1
  699. package/src/Switch/Switch.tsx +11 -3
  700. package/src/TabList/TabList.test.tsx +58 -4
  701. package/src/TabList/TabList.tsx +16 -1
  702. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  703. package/src/Table/Table.spec.md +1 -1
  704. package/src/Table/Table.test.tsx +32 -0
  705. package/src/Table/Table.tsx +43 -11
  706. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  707. package/src/Table/__tests__/Table.a11y.states.ts +1 -5
  708. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  709. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  710. package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
  711. package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
  712. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
  713. package/src/Text/Text.tsx +1 -1
  714. package/src/Text/useTruncation.test.tsx +128 -1
  715. package/src/Text/useTruncation.ts +23 -5
  716. package/src/TextArea/TextArea.spec.md +10 -13
  717. package/src/TextArea/TextArea.test.tsx +60 -0
  718. package/src/TextArea/TextArea.tsx +15 -1
  719. package/src/TextInput/TextInput.test.tsx +21 -0
  720. package/src/TextInput/TextInput.tsx +3 -1
  721. package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
  722. package/src/TimeInput/Presentation.test.tsx +21 -0
  723. package/src/TimeInput/TimeInput.doc.mjs +8 -8
  724. package/src/TimeInput/TimeInput.spec.md +58 -61
  725. package/src/TimeInput/TimeInput.test.tsx +76 -0
  726. package/src/TimeInput/TimeInput.tsx +36 -18
  727. package/src/TimeInput/TouchTimeField.tsx +4 -6
  728. package/src/Timestamp/Timestamp.spec.md +6 -12
  729. package/src/Timestamp/Timestamp.test.tsx +30 -5
  730. package/src/Timestamp/Timestamp.tsx +6 -2
  731. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  732. package/src/Toast/Toast.spec.md +15 -24
  733. package/src/Toast/Toast.tsx +104 -36
  734. package/src/Toast/ToastViewport.test.tsx +798 -1
  735. package/src/Toast/ToastViewport.tsx +121 -53
  736. package/src/ToggleButton/ToggleButton.test.tsx +27 -0
  737. package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
  738. package/src/Token/Token.doc.mjs +2 -2
  739. package/src/Token/Token.spec.md +52 -61
  740. package/src/Token/Token.test.tsx +104 -0
  741. package/src/Token/Token.tsx +75 -5
  742. package/src/Token/TokenLink.tsx +21 -7
  743. package/src/Tokenizer/Tokenizer.spec.md +18 -4
  744. package/src/Tokenizer/Tokenizer.test.tsx +176 -0
  745. package/src/Tokenizer/Tokenizer.tsx +48 -12
  746. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
  747. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  748. package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
  749. package/src/Toolbar/Toolbar.spec.md +5 -6
  750. package/src/Toolbar/Toolbar.test.tsx +30 -0
  751. package/src/Toolbar/Toolbar.tsx +2 -1
  752. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  753. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  754. package/src/TopNav/TopNav.test.tsx +27 -0
  755. package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
  756. package/src/TopNav/TopNavMegaMenu.tsx +4 -1
  757. package/src/TopNav/TopNavMenu.test.tsx +17 -0
  758. package/src/TopNav/TopNavMenu.tsx +1 -0
  759. package/src/TreeList/TreeList.test.tsx +26 -0
  760. package/src/TreeList/TreeListItem.tsx +26 -4
  761. package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
  762. package/src/Typeahead/BaseTypeahead.spec.md +45 -45
  763. package/src/Typeahead/BaseTypeahead.tsx +48 -9
  764. package/src/Typeahead/Typeahead.test.tsx +294 -11
  765. package/src/Typeahead/Typeahead.tsx +51 -9
  766. package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
  767. package/src/__tests__/pressState.ts +8 -4
  768. package/src/gestures/GestureArena.ts +111 -11
  769. package/src/gestures/GestureHost.ts +2064 -0
  770. package/src/gestures/GestureRecognizer.ts +21 -1
  771. package/src/gestures/LongPressGestureRecognizer.ts +4 -0
  772. package/src/gestures/PanGestureRecognizer.ts +4 -0
  773. package/src/gestures/PinchGestureRecognizer.ts +148 -0
  774. package/src/gestures/PressTracker.ts +386 -0
  775. package/src/gestures/README.md +420 -0
  776. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
  777. package/src/gestures/SwipeGestureRecognizer.ts +197 -0
  778. package/src/gestures/TapGestureRecognizer.ts +4 -0
  779. package/src/gestures/VelocityTracker.ts +10 -3
  780. package/src/gestures/__tests__/GestureHost.test.ts +2136 -0
  781. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  782. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  783. package/src/gestures/__tests__/PressTracker.test.ts +275 -0
  784. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  785. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  786. package/src/gestures/__tests__/arena.test.ts +40 -0
  787. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
  788. package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
  789. package/src/gestures/__tests__/browser/fixture.ts +307 -0
  790. package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
  791. package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
  792. package/src/gestures/__tests__/haptics.test.ts +187 -0
  793. package/src/gestures/__tests__/harness.ts +52 -4
  794. package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
  795. package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
  796. package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
  797. package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
  798. package/src/gestures/haptics.ts +203 -0
  799. package/src/gestures/index.ts +79 -0
  800. package/src/gestures/nativeScroll.ts +277 -0
  801. package/src/gestures/touchAction.ts +191 -0
  802. package/src/gestures/touchActionRule.ts +157 -0
  803. package/src/gestures/types.ts +30 -9
  804. package/src/gestures/useGestureRecognizer.ts +305 -0
  805. package/src/hooks/index.ts +5 -1
  806. package/src/hooks/modalAnnounce.ts +129 -72
  807. package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
  808. package/src/hooks/scrollKeyboardDelegation.ts +9 -3
  809. package/src/hooks/useAdaptivePresentation.ts +4 -1
  810. package/src/hooks/useAnnounce.doc.mjs +35 -3
  811. package/src/hooks/useAnnounce.replace.test.tsx +516 -0
  812. package/src/hooks/useAnnounce.ts +209 -102
  813. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
  814. package/src/hooks/useAnnounceRenderedText.ts +17 -3
  815. package/src/hooks/useBusyAnnouncement.ts +7 -10
  816. package/src/hooks/useMenuHover.ts +15 -1
  817. package/src/hooks/useScrollOverflow.doc.mjs +1 -1
  818. package/src/hooks/useScrollOverflow.test.tsx +102 -1
  819. package/src/hooks/useScrollOverflow.ts +59 -10
  820. package/src/i18n/__tests__/useListFormatter.test.tsx +58 -0
  821. package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
  822. package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
  823. package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
  824. package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
  825. package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
  826. package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
  827. package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
  828. package/src/i18n/generated-locales/en.generated.ts +9 -6
  829. package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
  830. package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
  831. package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
  832. package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
  833. package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
  834. package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
  835. package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
  836. package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
  837. package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
  838. package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
  839. package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
  840. package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
  841. package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
  842. package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
  843. package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
  844. package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
  845. package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
  846. package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
  847. package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
  848. package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
  849. package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
  850. package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
  851. package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
  852. package/src/i18n/useListFormatter.ts +42 -0
  853. package/src/motion/MEASUREMENTS.md +2 -1
  854. package/src/motion/README.md +113 -33
  855. package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
  856. package/src/motion/__tests__/motionBundle.ts +14 -0
  857. package/src/motion/animator.test.ts +1125 -32
  858. package/src/motion/animator.ts +932 -130
  859. package/src/motion/coast.ts +10 -3
  860. package/src/motion/reducedMotion.ts +12 -2
  861. package/src/motion/reducedMotionPlan.test.ts +26 -0
  862. package/src/motion/reducedMotionPlan.ts +20 -1
  863. package/src/motion/resolveMotion.test.ts +123 -0
  864. package/src/motion/resolveMotion.ts +68 -0
  865. package/src/motion/roleValue.ts +2 -1
  866. package/src/motion/roles.test.ts +21 -4
  867. package/src/motion/uikit/tableImports.test.ts +293 -0
  868. package/src/motion/uikit/timing.ts +15 -1
  869. package/src/motion/uikit/values.test.ts +23 -12
  870. package/src/theme/Theme.doc.mjs +1 -1
  871. package/src/theme/defineTheme.ts +117 -8
  872. package/src/theme/derivedVarRegistry.test.ts +4 -0
  873. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  874. package/src/theme/domainTokens/index.ts +6 -10
  875. package/src/theme/expandMotionScale.test.ts +1 -1
  876. package/src/theme/index.ts +5 -0
  877. package/src/theme/motionKnobs.ts +82 -0
  878. package/src/theme/resolveThemeValues.ts +68 -6
  879. package/src/theme/themeAdaptations.ts +52 -12
  880. package/src/theme/themeMotion.test.ts +620 -0
  881. package/src/theme/themeMotion.ts +221 -0
  882. package/src/theme/tokenReferences.ts +149 -0
  883. package/src/theme/tokens.stylex.ts +10 -0
  884. package/src/theme/tokens.ts +15 -158
  885. package/src/utils/focusOutline.stylex.ts +28 -0
  886. package/src/utils/focusReturn.ts +17 -6
  887. package/src/utils/getNodeText.test.ts +24 -0
  888. package/src/utils/getNodeText.ts +37 -0
  889. package/src/utils/interactionModality.test.ts +45 -1
  890. package/src/utils/interactionModality.ts +64 -5
  891. package/src/utils/interactionOverlay.stylex.ts +12 -3
  892. package/src/utils/plainDate.test.ts +90 -0
  893. package/src/utils/plainDate.ts +58 -3
  894. package/src/utils/presentation.test.ts +380 -0
  895. package/src/utils/presentation.ts +180 -0
  896. package/src/utils/pressFeedback.test.ts +138 -0
  897. package/src/utils/pressFeedback.ts +34 -11
  898. package/src/utils/pressGesture.test.ts +9 -0
  899. package/src/utils/pressPaintPriority.test.ts +80 -0
  900. package/src/utils/primaryClick.test.ts +38 -0
  901. package/src/utils/primaryClick.ts +28 -0
  902. package/src/utils/sharedMutationObserver.test.ts +54 -1
  903. package/src/utils/sharedMutationObserver.ts +87 -29
  904. package/src/utils/timeFormat.test.ts +204 -0
  905. package/src/utils/timeFormat.ts +314 -0
  906. package/src/utils/touchPresentation.stylex.ts +43 -0
  907. package/src/utils/touchPresentation.test.ts +140 -1
  908. package/src/utils/touchPresentation.ts +13 -8
  909. package/src/utils/touchQueries.ts +15 -0
  910. package/src/utils/unicodeDigits.test.ts +44 -0
  911. package/src/utils/unicodeDigits.ts +71 -0
  912. package/src/utils/useFocusAcrossSwap.ts +55 -0
@@ -0,0 +1,420 @@
1
+ # Gestures
2
+
3
+ A gesture recognizer system with UIKit's semantics, for the touch
4
+ presentations of Astryx core components. Components import it from
5
+ `../gestures`; nothing here is exported from the package.
6
+
7
+ UIKit is the reference throughout: the same recognizer states, the same
8
+ conflict rules, the same thresholds (from `../motion/uikit/gestures.ts`, each
9
+ one sourced or marked as a guess awaiting measurement), and touch handling
10
+ that behaves like `UIControl` and `UIScrollView`. The rest of this page says
11
+ where the web forces a difference.
12
+
13
+ ## Using it from a component
14
+
15
+ ```tsx
16
+ import {useRef} from 'react';
17
+ import {PanGestureRecognizer, useGestureRecognizer} from '../gestures';
18
+
19
+ function Sheet() {
20
+ const ref = useRef<HTMLDivElement>(null);
21
+ useGestureRecognizer(
22
+ ref,
23
+ () => new PanGestureRecognizer({direction: 'down'}),
24
+ pan => {
25
+ // Runs inside the input event: write the transform, render nothing.
26
+ const element = ref.current;
27
+ if (element == null) return;
28
+ if (pan.state === 'ended') {
29
+ settle(element, pan.translation().y, pan.velocity().y);
30
+ } else {
31
+ element.style.transform = `translateY(${pan.translation().y}px)`;
32
+ }
33
+ },
34
+ );
35
+ return <div ref={ref}>…</div>;
36
+ }
37
+ ```
38
+
39
+ - The recognizer is created once per component and keeps its identity, so
40
+ relationships set up when it is created (`requireToFail`,
41
+ `recognizeSimultaneouslyWith`) keep working.
42
+ - The listener is read through a ref. Passing a new function on each render
43
+ attaches nothing new, and a gesture never causes a React render.
44
+ - The recognizer attaches in a layout effect, so the element's `touch-action`
45
+ is set before the browser can see a finger.
46
+ - The `isEnabled` option follows the prop. Turning it off mid-gesture ends
47
+ the gesture without calling the listener, since the handler that turned
48
+ it off owns that end (no consumer callback from an Effect). A recognizer
49
+ that required it to fail recognizes a microtask later, outside the Effect,
50
+ and its listener reports as usual. A handler that wants UIKit's
51
+ `.cancelled` calls `recognizer.setEnabled(false)` itself, which reports it
52
+ at once.
53
+ - `usePressTracker` rebuilds its tracker when `trackingExpansion`,
54
+ `highlightDelay`, `cancelTravel` or `quickTapFlash` change, from the next
55
+ touch, and reads its callbacks (`isBraking` included) on every touch.
56
+ - `usePressTracker(ref, options)` gives an element `UIControl` touch tracking
57
+ (see below).
58
+
59
+ Outside React, `getGestureHost(document).attach(element, recognizer)` does
60
+ the same and returns a detach function.
61
+
62
+ ## Recognizers
63
+
64
+ | Recognizer | UIKit | Kind | Notes |
65
+ | -------------------------------- | ---------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
66
+ | `TapGestureRecognizer` | `UITapGestureRecognizer` | discrete | `numberOfTapsRequired`, `numberOfTouchesRequired`; fails past 45 px of travel, on extra fingers, a hold over 1.5 s, a late or far next tap |
67
+ | `LongPressGestureRecognizer` | `UILongPressGestureRecognizer` | continuous | `minimumPressDuration` 500 ms, `allowableMovement` 10 px (a distance, not per axis), `numberOfTapsRequired`; a zero duration begins on the touch itself (a selection tracker over a group of actions) |
68
+ | `PanGestureRecognizer` | `UIPanGestureRecognizer` | continuous | min/max touches, `direction` (axis or one-way) with `axisRatio`, `lockAxis`, `scrollEdge`; `translation()`, `totalTranslation()`, `velocity()` |
69
+ | `SwipeGestureRecognizer` | `UISwipeGestureRecognizer` | discrete | recognized during the motion; one or more directions, `numberOfTouchesRequired`; 50 px along, at most 50 px across, 500 ms |
70
+ | `PinchGestureRecognizer` | `UIPinchGestureRecognizer` | continuous | `scale` (settable, to re-base it), `velocity` in scale per second, `focalPoint()` |
71
+ | `ScreenEdgePanGestureRecognizer` | `UIScreenEdgePanGestureRecognizer` | continuous | `edges`: `leading` / `trailing`, resolved against the view's writing direction; attached to an edge zone the view lies within; fails as soon as the touch lands outside every requested edge band; a finger's only |
72
+
73
+ Every recognizer also has UIKit's switches: `isEnabled` (use `setEnabled`;
74
+ turning it off mid-gesture cancels), `cancelsTouchesInView` (default true),
75
+ `delaysTouchesBegan` (default false), `delaysTouchesEnded` (default true),
76
+ `allowedPointerTypes`, and `requiresExclusiveTouchType`.
77
+
78
+ ### What the pan reports
79
+
80
+ The pan reads its numbers the way `UIPanGestureRecognizer` does, as measured
81
+ in the UIKit lab:
82
+
83
+ - It begins once the centroid has moved `hysteresis` (10 px) along either
84
+ axis, not as a distance.
85
+ - `translation()` leaves out the travel the threshold took: a slow drag reads
86
+ zero when the pan begins, and a step that overshoots keeps only the
87
+ overshoot. A dragged surface does not jump. `totalTranslation()` is the
88
+ movement since the fingers landed, for a surface that wants it.
89
+ - `axisRatio` (for a pan limited to an axis): the movement along the axis
90
+ must exceed `axisRatio` times the movement across it to begin; movement
91
+ across that exceeds the movement along it fails the pan; in between it
92
+ waits.
93
+ - `velocity()` is UIKit's own filter (see Velocity). The lift updates
94
+ neither number; a finger that rested past the stillness interval releases
95
+ at 0.
96
+
97
+ ### States
98
+
99
+ ```
100
+ possible ─► began ─► changed* ─► ended | cancelled continuous
101
+ possible ─► ended discrete ("recognized")
102
+ possible ─► failed
103
+ ```
104
+
105
+ Listeners (UIKit's target-action) run for `began`, `changed`, `ended` and
106
+ `cancelled`. `addTransitionListener` also reports `failed` and the return to
107
+ `possible`. A recognizer in a terminal state ignores the touches it still
108
+ holds and returns to `possible` when all of them have ended.
109
+
110
+ ## Conflicts: the arena
111
+
112
+ A new touch goes to every recognizer on its hit path, innermost first, and
113
+ each one that accepts it tracks it until it ends. Then:
114
+
115
+ - **Exclusivity.** Two recognizers that share a touch are never active
116
+ together unless one allows it (`recognizeSimultaneouslyWith`, or the
117
+ `shouldRecognizeSimultaneously` delegate). The first to recognize fails
118
+ the other possible ones. A recognizer that tries to begin while a
119
+ conflicting one is active fails instead. When two qualify on the same
120
+ input, the innermost one wins.
121
+ - **Failure requirements.** `a.requireToFail(b)` keeps `a` in `possible`
122
+ until `b` fails, then lets `a` recognize. If `b` recognizes, `a` fails. A
123
+ recognizer that is not involved in the current touches holds nothing up.
124
+ The delegates `shouldRequireFailureOf` and `shouldBeRequiredToFailBy`
125
+ express the same thing dynamically.
126
+ - **Delegates.** `shouldBegin`, `shouldReceiveTouch`, and `canPrevent` /
127
+ `canBePrevented` on subclasses.
128
+
129
+ ```ts
130
+ // Single tap waits for the double tap to fail, as in UIKit.
131
+ single.requireToFail(double);
132
+
133
+ // Inner horizontal scroller yields to the back-swipe in the edge band only:
134
+ // the edge pan fails at touch-down anywhere else, so nothing waits.
135
+ innerPan.requireToFail(edgePan);
136
+ ```
137
+
138
+ ## Touches in the view: `createPressTracker`
139
+
140
+ A pressable control's view-level touch handling, with `UIControl`
141
+ semantics:
142
+
143
+ - `touchDown`, `touchDragInside` / `touchDragOutside`, `touchDragEnter` /
144
+ `touchDragExit`, `touchUpInside` / `touchUpOutside`, `touchCancel`.
145
+ - "Inside" is the control's bounds expanded by `trackingExpansion`, so a
146
+ fingertip that slides a little off a button is still on it.
147
+ - The highlight comes on in the same frame. Inside a scroller it waits
148
+ `contentTouchDelay` (`UIScrollView.delaysContentTouches`), so a flick
149
+ paints nothing. A tap quicker than that delay shows the highlight at the
150
+ lift for `quickTapFlash`.
151
+ - A recognizer that takes the touch (`cancelsTouchesInView`), or the browser
152
+ taking it to scroll, cancels the press with no release.
153
+ - `UIControl`'s iOS 6 rule applies: an ancestor's single-finger single tap
154
+ does not beat the control's own action for a touch on it.
155
+ `vetoesAncestorRecognizer` replaces that rule (a slider vetoes a pan along
156
+ its track).
157
+
158
+ The browser's click stays the control's activation, so keyboard and
159
+ assistive-technology activation keep working.
160
+
161
+ ### Press profiles
162
+
163
+ `PRESS_PROFILES` holds the two ways UIKit tracks a press:
164
+
165
+ - `control` (a button, a switch): the highlight comes on in the same frame
166
+ outside a scroller, the finger is tracked 70 pt beyond the bounds, and
167
+ the release takes the list's deselect clock, as every surface's does
168
+ until a control runs its own (UIButton's 0.25 s);
169
+ - `cell` (a table or collection row): the highlight waits the content-touch
170
+ delay inside a scroll view and comes on at once outside one
171
+ (`spec:AST-094` FR11), travel past the pan hysteresis cancels the press for
172
+ good, a quicker tap highlights at the lift straight into the release, and
173
+ the release takes the list's deselect clock.
174
+
175
+ The document press controller (`utils/pressFeedback.ts`) writes
176
+ `data-astryx-press` for the presses it tracks, and the action-group tracker
177
+ (`hooks/actionGroupTracker.ts`) writes its groups' presses itself.
178
+
179
+ ### Rows and cards
180
+
181
+ A list of a thousand rows cannot pay for a hook and four listeners per row.
182
+ The document press controller (`utils/pressFeedback.ts`) presses the
183
+ innermost enabled `[data-astryx-pressable]` under each touch and paints it,
184
+ with no listener per row; a touch that brakes a scroll the finger set moving
185
+ presses nothing.
186
+
187
+ ## What the browser is told
188
+
189
+ - **Every pointer.** Gestures attach for a mouse, a pen and a finger
190
+ (`spec:AST-094` FR43). Under a fine primary pointer an element whose
191
+ gesture or press consumer is enabled listens with one passive
192
+ `pointerdown`; a press (the primary button, a pen's contact or a finger)
193
+ adds the page's listeners for that press alone, and they go once none of
194
+ its contacts is down, except the `click` listener, which stays up to 1 s
195
+ when a claimed lift owes a swallowed click (FR24). An element whose
196
+ recognizer claims a moving finger also keeps its blocking `touchmove`
197
+ (FR19). A right click, a pen's barrel button or a ctrl-click on macOS
198
+ starts no press.
199
+ - **`touch-action`.** Each element gets the intersection of what its
200
+ recognizers leave the browser, never wider than the element's own
201
+ `touch-action` (`spec:AST-094` FR18). Over an inline value the host writes
202
+ what both allow, inline. Otherwise it marks the element
203
+ (`data-astryx-touch-action`) under a rule in the first cascade layer, which
204
+ any author rule outranks, and in the next frame writes inline what both
205
+ allow where that is narrower than the author's rule. Detaching gives the
206
+ element its own value back (opt out with `manageStyle: false`):
207
+
208
+ | Recognizers on the element | `touch-action` |
209
+ | -------------------------------------------- | ------------------- |
210
+ | tap, long press | `manipulation` |
211
+ | horizontal pan or swipe, horizontal edge pan | `pan-y pinch-zoom` |
212
+ | vertical pan or swipe | `pan-x pinch-zoom` |
213
+ | one-way pan, pan with `scrollEdge` | left as is (`auto`) |
214
+ | free pan | `pinch-zoom` |
215
+ | pinch | `pan-x pan-y` |
216
+ | pinch together with a free pan | `none` |
217
+
218
+ A one-way pan leaves the browser its own axis too: a toast dragged away
219
+ from its edge scrolls the page. It claims its direction by cancelling
220
+ `touchmove` when it begins.
221
+
222
+ `pinch-zoom` stays in the value unless a pinch recognizer is
223
+ attached, so the page stays zoomable (WCAG 1.4.4). A long press also turns
224
+ off the iOS callout and text selection on its element.
225
+
226
+ - **Claiming.** When a recognizer recognizes, it owns its touches. Each
227
+ element with a recognizer that can claim a moving touch (a pan, a swipe, a
228
+ long press that then drags, a pinch) has a non-passive
229
+ `touchmove` listener that cancels the event only while one of its touches
230
+ is owned. A touch nobody owns scrolls exactly as it would without the
231
+ system. Taps claim only at the lift, so an element with only taps, or only
232
+ a press consumer, gets no such listener (see the known limit below).
233
+ - **Claim at the begin.** A pan claims its touch only as it begins, at
234
+ UIKit's 10 pt (`spec:AST-094` FR19), before WebKit commits a slow drag to
235
+ a scroll at 10–11 px; a drag the browser took first stays the browser's
236
+ (FR14).
237
+ - **The browser's claim.** `pointercancel` on a finger, or a scroll above
238
+ the touch, means the browser took the finger; so does its first `touchmove`
239
+ that can no longer be cancelled, when the browser could pan along the
240
+ finger's main axis. (Chromium also stops asking after one unconsumed
241
+ `touchmove` when `touch-action` keeps it from panning that way, as for a
242
+ horizontal drag under `pan-y`; that is not a claim.) Possible recognizers that share it fail, active ones are
243
+ cancelled, and the view's press is cancelled.
244
+ - **Clicks.** When a touch's gesture cancelled the view's touches, its
245
+ `touchend` is cancelled (no click and no compatibility mouse events) and a
246
+ one-shot guard swallows the next trusted click. A click held back for a
247
+ recognizer that may still recognize (a double tap between taps) is
248
+ swallowed at once and replayed on the original target if the recognizer
249
+ fails. Clicks with `detail === 0` (keyboard, assistive technology, code)
250
+ always pass.
251
+ - **Context menus.** A `contextmenu` while a recognizer owns a touch is
252
+ cancelled, so a long press never also opens the browser's menu.
253
+ - **Focus.** Losing window focus or hiding the page cancels every touch in
254
+ flight, as UIKit does when the app resigns active.
255
+
256
+ ### Native scrolling
257
+
258
+ `scrollEdge` makes a pan share its axis with the native scrollers under the
259
+ finger. This is the sheet over its own list: the pan begins only if nothing
260
+ under the touch could scroll for that movement, the finger landed at the
261
+ edge and pulls away from it. The browser has not committed yet, so beginning
262
+ claims the touch and the content never moves.
263
+
264
+ Who gets a drag is decided once, when it begins, as in UIKit: a drag that
265
+ began as a scroll stays the scroll view's for its whole length (it scrolls
266
+ to the top, then rubber-bands), and never changes hands midway
267
+ (`spec:AST-094` FR14).
268
+
269
+ "Could scroll" follows the browser's own rules: `touch-action` between the
270
+ touch and each scroller, scroll chaining stopped by `overscroll-behavior`,
271
+ and RTL `scrollLeft` ranges.
272
+
273
+ ### Multiple fingers
274
+
275
+ A second finger never breaks a one-finger pan that is already moving: the
276
+ pan ignores it, and the claim keeps the browser from zooming with it. A
277
+ second finger that lands before any recognizer has claimed fails the
278
+ one-finger recognizers, so the two fingers zoom the page.
279
+
280
+ ## Time
281
+
282
+ Every input carries its own timestamp (`event.timeStamp`), and timers are
283
+ deadlines on that same clock. Before an input is processed, every timer due
284
+ by its timestamp runs first, at its own deadline. A long press therefore
285
+ begins at exactly touch-down + 500 ms even when the main thread was blocked
286
+ and the timer callback ran late. Tests drive the whole system with explicit
287
+ timestamps and no real time.
288
+
289
+ ## Velocity
290
+
291
+ `VelocityTracker` reports px per second, UIKit's unit, and is the one
292
+ velocity tracker every continuous recognizer uses
293
+ (`architecture:interaction-modality` INV10, `spec:AST-100` FR1, FR2; no
294
+ alternative estimators). One filter, iOS's measured blend, updated on each
295
+ moved sample (a sample at the newest position is not motion):
296
+
297
+ - A pan's velocity is 0.2 times the newest interval's velocity plus 0.8 times
298
+ the previous interval's (an interval runs from one moved sample to the
299
+ next; the touch-down counts as the first). With one interval so far it is
300
+ that interval, as UIKit reports it. It reproduces every value UIKit
301
+ reported on six recorded touch streams, and like UIKit's it reacts a frame
302
+ late to an acceleration.
303
+ - A scrolling surface's release (paging, a wheel) is 0.25 times the newest
304
+ pan value plus 0.75 times the previous one: a pan's `scrollVelocity()`.
305
+ Everything else reads `velocity()`.
306
+
307
+ A release reads 0 when the finger stayed still for longer than the stillness
308
+ interval (`UIKIT_GESTURES.velocity.stillness`) before lifting, the one
309
+ difference from iOS, whose filter never decays and so flings after a rest;
310
+ and 0 with fewer than two moved samples. The pan passes its lift's event time
311
+ to the tracker.
312
+
313
+ ## Haptics
314
+
315
+ `playHaptic(kind)` vibrates where `navigator.vibrate` exists, with one
316
+ pattern per UIKit feedback kind. iOS Safari has no vibration API. It plays a
317
+ light impact only when a real tap toggles an `<input type="checkbox"
318
+ switch>`, and WebKit requires a trusted event for it. `attachTapHaptic(label)`
319
+ puts a hidden switch inside a label the control renders as its tap target,
320
+ so every real tap on it plays that impact. Nothing can play a haptic later
321
+ from script, so mid-drag haptics (detent snaps, picker ticks) are not
322
+ possible in iOS Safari.
323
+
324
+ ## Thresholds
325
+
326
+ All numbers live in `../motion/uikit/gestures.ts`. Each one carries either
327
+ its source (Apple documentation, or a measurement: the recognizers' own
328
+ values read in a UIKit app on the iOS 26.2 simulator and confirmed with
329
+ touches, or Mobile Safari measured on the same simulator) or a guess
330
+ together with the measurement that will replace it. A unit test fails if an
331
+ entry has neither.
332
+
333
+ ## Touch presentation
334
+
335
+ Whether a component presents itself the touch (UIKit) way is answered once,
336
+ in `../utils/touchPresentation.ts`:
337
+
338
+ - touch behaviours (UIKit springs and timings, the press model's touch
339
+ profiles) key on a coarse PRIMARY pointer (`TOUCH_QUERY`);
340
+ - layout behaviours key on a compact viewport, below the theme's `md`
341
+ width point (`spec:AST-012` FR9): `COMPACT_QUERY` spells the default
342
+ points for a style, and behaviour reads the active theme's definition, so
343
+ a theme that moves `md` moves compact with it;
344
+ - a presentation that needs both, a sheet in place of a popover, asks for
345
+ both (`COMPACT_TOUCH_QUERY`).
346
+
347
+ Styles switch on the same conditions by writing the same query as a StyleX
348
+ media key (`'@media (pointer: coarse)'`, and the compact-touch query spelled
349
+ exactly as `COMPACT_TOUCH_QUERY`, which a test enforces), so the first paint
350
+ is right. Behaviour reads
351
+ `useTouchPresentation()` (SSR-safe), a component with no interaction to
352
+ infer from included (UIKit timings under a finger, its own motion under a
353
+ mouse), and a decision taken once reads `readTouchPresentation()`.
354
+
355
+ ## Known limits
356
+
357
+ - **A scroll that begins on a recognizer waits for a busy main thread.** In
358
+ Mobile Safari (iOS 26.2, measured), a vertical scroll that starts on an
359
+ element with a non-passive `touchmove` listener waits until the current
360
+ JavaScript task ends; on a plain row, a pressable row or a tap-only
361
+ element it starts at once (within 50 ms) even during a 500 ms task.
362
+ Chromium documents the same rule for non-passive listeners. The listener
363
+ stays because nothing else keeps UIKit's arbitration: with a passive
364
+ listener, or one added during `touchstart` (which Safari ignores for that
365
+ touch), Safari hands every diagonal drag on a swipe row to the list's
366
+ scroll, 3:1 included. It is never worse than UIKit, where a busy main
367
+ thread stalls every scroll.
368
+ - **Lists where every row has a horizontal recognizer** (swipe actions on
369
+ every row of a mail list): every scroll start waits on the current task in
370
+ Safari. Keep list screens' tasks short. A native horizontal `scroll-snap`
371
+ reveal inside the row would never wait, but it tracks with scroll physics
372
+ rather than UIKit's measured tracking spring; it is a possible opt-in, not
373
+ the default.
374
+ - **Follow-up:** Chromium keeps 3:1 to 1.5:1 drags as swipes even with a
375
+ passive listener (its `touch-action` filter drops a `pan-y` scroll that
376
+ starts sideways), so a passive listener there would cost no parity. It
377
+ waits on a measured run on Android before any engine-specific choice.
378
+
379
+ ## Where the web differs from UIKit
380
+
381
+ - Once a recognizer owns a touch, the browser cannot take the scroll back
382
+ later in the same gesture. UIKit does not either: it decides between a
383
+ sheet and its list when the drag begins.
384
+ - In Chromium a finger's first `touchmove` arrives only after about 16 px.
385
+ Movement below that comes from the finger's pointer events, but the
386
+ browser's own decision to scroll happens at that first `touchmove`.
387
+ Mobile Safari delivers `touchmove` from the first pixel.
388
+ - A tap that holds a plain `<button>` for a second or more gets no click in
389
+ Mobile Safari, while UIKit's tap allows 1.5 s. A tap recognizer on the
390
+ element follows UIKit.
391
+ - iOS Safari's own back swipe from the screen edge cannot be cancelled by
392
+ the page. A leading-edge pan works where that swipe has no history to go
393
+ back to.
394
+ - `translation()` is in client CSS px. It is not converted into a rotated or
395
+ scaled ancestor's coordinate space.
396
+ - A replayed click is untrusted. Anything that needs real user activation
397
+ inside the replay window (opening a file picker, for example) should not
398
+ sit under a multi-tap recognizer.
399
+
400
+ ## Tests
401
+
402
+ - `__tests__/<Recognizer>.test.ts`: each recognizer's state machine on
403
+ synthetic touches with explicit timestamps.
404
+ - `__tests__/arena*.test.ts`: the conflict matrix, delivery to the view,
405
+ click dispositions, cancellation, and multiple fingers.
406
+ - `__tests__/GestureHost.test.ts`: the DOM integration through real
407
+ listeners in jsdom.
408
+ - `__tests__/VelocityTracker.test.ts`: UIKit's filter against the velocities
409
+ UIKit reported on recorded touch streams, a steady speed and a hard
410
+ acceleration.
411
+ - `__tests__/haptics.test.ts`: vibration patterns and the hidden switch.
412
+ - `__tests__/browser/`: the browser proof on a phone-sized touch screen, in
413
+ Chromium (CDP touches with timestamps) and WebKit (its own touch input),
414
+ with mouse and pen input in a fine-pointer context, run by
415
+ `pnpm test:interaction gestures.interaction.browser.spec.ts` and in CI's
416
+ interaction proofs; where WebKit cannot launch on the host,
417
+ `internal/interaction-harness/scripts/webkit-container.mjs` runs its
418
+ project in the official Playwright image. The same fixture passed in
419
+ Mobile Safari on the iOS 26.2 simulator: claims, click suppression, the
420
+ scroll edge, pinch, and a long press at exactly 500 ms.
@@ -0,0 +1,256 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file ScreenEdgePanGestureRecognizer.ts
5
+ * @input Touches from a GestureArena; the viewport size and writing
6
+ * direction from its environment
7
+ * @output Exports ScreenEdgePanGestureRecognizer
8
+ * (UIScreenEdgePanGestureRecognizer), its options and edge type
9
+ * @position Continuous recognizer of packages/core/src/gestures, a pan that
10
+ * only starts from a band at the edge of the viewport
11
+ *
12
+ * A touch that lands outside every requested band fails at once, so a
13
+ * recognizer that requires this one to fail is not held up by a touch in the
14
+ * middle of the screen. Inside a band, the pan begins on movement away from
15
+ * that edge. `leading` and `trailing` resolve against the view's writing
16
+ * direction: under RTL the leading edge is the right one, as the
17
+ * interactive pop gesture's is.
18
+ *
19
+ * Attach it to the edge zone: an element that lies within the band at its
20
+ * edge. There the pan takes the horizontal axis from the browser, which has
21
+ * nothing to scroll in so thin a band, so a touch in the band decides at
22
+ * UIKit's 15 px screen-edge hysteresis. On any other view, whose
23
+ * `touch-action` cannot claim per touch, it leaves the browser every touch
24
+ * behavior, so the author's scrolling there is untouched, and a touch in the
25
+ * band decides at FR19's 10 px like every other claim (spec:AST-094 FR18,
26
+ * DEC-22). The edges' physical sides and the edge zone are measured once,
27
+ * together, and serve both the element's `touch-action` and the touch-down
28
+ * decision; the host reports a layout change (layoutChanged), and a changed
29
+ * answer is announced (onTouchBehaviorChange) so `touch-action` follows it
30
+ * (FR19). The writing direction is read again at each touch-down: a view
31
+ * switched to RTL in place, with no resize, is measured again there and the
32
+ * change announced, so a `leading` back swipe follows the new leading edge
33
+ * (`design:bidirectionality` DR13). That touch landed under the touch-action
34
+ * from before, so it decides at FR19's 10 px unless that one claimed the
35
+ * axis.
36
+ */
37
+
38
+ import {UIKIT_PAN, UIKIT_SCREEN_EDGE_PAN} from '../motion/uikit/gestures';
39
+ import {ALL_NATIVE_TOUCH, type NativeTouchBehavior} from './GestureRecognizer';
40
+ import {
41
+ PanGestureRecognizer,
42
+ type PanGestureRecognizerOptions,
43
+ } from './PanGestureRecognizer';
44
+ import type {GestureEventContext, GestureTouch} from './types';
45
+
46
+ /**
47
+ * How far past `edgeRegion` a view still counts as the edge zone, px: layout
48
+ * snaps sizes to 1/64 px, so a strip authored at the region measures a hair
49
+ * wider; half a pixel takes that and nothing a pixel wider.
50
+ */
51
+ const EDGE_ZONE_TOLERANCE = 0.5;
52
+
53
+ /**
54
+ * An edge by writing direction: under RTL the leading edge is the right one.
55
+ * Top and bottom edges land with their first user.
56
+ */
57
+ export type ScreenEdge = 'leading' | 'trailing';
58
+
59
+ /** A physical horizontal edge of the viewport. */
60
+ type PhysicalEdge = 'left' | 'right';
61
+
62
+ /**
63
+ * What the pan measures of its view, once until a layout change: the
64
+ * writing direction it read, the physical sides its edges resolve to under
65
+ * that direction, and the sides whose band the view lies within.
66
+ */
67
+ interface EdgeLayout {
68
+ readonly isRtl: boolean;
69
+ readonly watched: ReadonlyArray<PhysicalEdge>;
70
+ readonly zone: ReadonlySet<PhysicalEdge>;
71
+ }
72
+
73
+ /**
74
+ * A screen-edge pan is a finger's: it takes no `allowedPointerTypes`
75
+ * (`spec:AST-094` FR43).
76
+ */
77
+ export interface ScreenEdgePanGestureRecognizerOptions extends Omit<
78
+ PanGestureRecognizerOptions,
79
+ 'direction' | 'allowedPointerTypes'
80
+ > {
81
+ /** The edges a touch may start from. @default ['leading'] */
82
+ edges?: ReadonlyArray<ScreenEdge>;
83
+ /** Width of the band at each edge, px. */
84
+ edgeRegion?: number;
85
+ }
86
+
87
+ export class ScreenEdgePanGestureRecognizer extends PanGestureRecognizer {
88
+ override get kind(): PanGestureRecognizer['kind'] {
89
+ return 'screenEdgePan';
90
+ }
91
+
92
+ edges: ReadonlyArray<ScreenEdge>;
93
+ edgeRegion: number;
94
+ /** The physical edge the current gesture started from. */
95
+ activeEdge: PhysicalEdge | null = null;
96
+ /**
97
+ * @internal Set by the host while attached: called when the edge-zone
98
+ * answer changes, so the element's `touch-action` follows it
99
+ * (spec:AST-094 FR19, DEC-22).
100
+ */
101
+ onTouchBehaviorChange: (() => void) | null = null;
102
+ /** The hysteresis where the pan takes its axis (UIKit's 15 px). */
103
+ private readonly edgeHysteresis: number;
104
+ /** What the pan measured of its view (see EdgeLayout), until a layout change. */
105
+ private layout: EdgeLayout | null = null;
106
+
107
+ constructor(options: ScreenEdgePanGestureRecognizerOptions = {}) {
108
+ super({
109
+ maximumNumberOfTouches: 1,
110
+ hysteresis: UIKIT_SCREEN_EDGE_PAN.hysteresis.value,
111
+ ...options,
112
+ // A finger's only: under a mouse, a trackpad or a pen the screen-edge
113
+ // pan stays off (`spec:AST-094` FR43), whatever a caller passes.
114
+ allowedPointerTypes: ['touch'],
115
+ });
116
+ this.edges = options.edges ?? ['leading'];
117
+ this.edgeRegion =
118
+ options.edgeRegion ?? UIKIT_SCREEN_EDGE_PAN.edgeRegion.value;
119
+ this.edgeHysteresis = this.hysteresis;
120
+ }
121
+
122
+ /**
123
+ * The pan takes the horizontal axis only in its edge zone, a view within
124
+ * the band of an edge it watches; elsewhere it leaves the browser every
125
+ * touch behavior, so the author's scrolling is untouched (spec:AST-094
126
+ * FR18), never claiming across a whole wider element.
127
+ */
128
+ override get nativeTouchBehavior(): NativeTouchBehavior {
129
+ const {watched, zone} = this.measured();
130
+ if (!watched.some(edge => zone.has(edge))) {
131
+ return ALL_NATIVE_TOUCH;
132
+ }
133
+ return {
134
+ panX: false,
135
+ panY: true,
136
+ pinchZoom: true,
137
+ doubleTapZoom: false,
138
+ };
139
+ }
140
+
141
+ /**
142
+ * @internal Whether the edge zone depends on the viewport's width: the pan
143
+ * watches the right side, whose band moves with the viewport, so the host
144
+ * reports a viewport resize to it as well as its own box's (FR19, FR24).
145
+ */
146
+ get watchesViewport(): boolean {
147
+ return this.measured().watched.includes('right');
148
+ }
149
+
150
+ /**
151
+ * @internal The view's box may have changed (a resize): its edges' sides
152
+ * and the edge zone are measured again, and a changed answer calls
153
+ * onTouchBehaviorChange.
154
+ */
155
+ layoutChanged(): void {
156
+ const before = this.layout;
157
+ this.layout = null;
158
+ const after = this.measured();
159
+ if (
160
+ before == null ||
161
+ before.watched.join() !== after.watched.join() ||
162
+ before.zone.size !== after.zone.size ||
163
+ [...after.zone].some(edge => !before.zone.has(edge))
164
+ ) {
165
+ this.onTouchBehaviorChange?.();
166
+ }
167
+ }
168
+
169
+ protected override touchesBegan(
170
+ touches: ReadonlyArray<GestureTouch>,
171
+ event: GestureEventContext,
172
+ ): void {
173
+ if (this.numberOfTouches === touches.length) {
174
+ // The touch-action the browser applies to this touch was derived from
175
+ // the layout in force as it landed: whether that claimed the axis.
176
+ const inForce = this.measured();
177
+ const claimedAxis = inForce.watched.some(side => inForce.zone.has(side));
178
+ // A direction switched in place (no resize) moves the leading edge:
179
+ // measure again, and announce it so touch-action follows for the next
180
+ // touch (DR13).
181
+ if (inForce.isRtl !== this.environment.isRtl(this.view)) {
182
+ this.layoutChanged();
183
+ }
184
+ const edge = this.edgeAt(touches[0]);
185
+ if (edge == null) {
186
+ this.setState('failed');
187
+ return;
188
+ }
189
+ this.activeEdge = edge;
190
+ // On an element within the band, which takes the axis across the edge,
191
+ // a touch decides at UIKit's 15 px; on any other, which leaves the
192
+ // browser that axis, at FR19's 10 px, before the browser commits to a
193
+ // scroll (spec:AST-094 FR18, DEC-22). The answer is the one this
194
+ // touch's touch-action was derived from: a touch that measured again
195
+ // decides at 10 px unless the layout in force claimed the axis.
196
+ const offZone = !claimedAxis || !this.measured().zone.has(edge);
197
+ this.hysteresis = offZone
198
+ ? Math.min(this.edgeHysteresis, UIKIT_PAN.hysteresis.value)
199
+ : this.edgeHysteresis;
200
+ this.direction = edge === 'left' ? 'right' : 'left';
201
+ }
202
+ super.touchesBegan(touches, event);
203
+ }
204
+
205
+ /**
206
+ * The physical sides the pan's edges resolve to under the view's writing
207
+ * direction, and the sides whose band the view lies within, measured
208
+ * together once until a layout change: the view starts at that side and
209
+ * reaches no farther than `edgeRegion` from it, within layout's rounding
210
+ * (a strip authored at the 40.2 px region lays out at 40.203 px, on
211
+ * 1/64 px). A view that cannot be measured lies within none.
212
+ */
213
+ private measured(): EdgeLayout {
214
+ if (this.layout != null) {
215
+ return this.layout;
216
+ }
217
+ const isRtl = this.environment.isRtl(this.view);
218
+ const watched = this.edges.map(edge =>
219
+ (edge === 'leading') !== isRtl ? 'left' : 'right',
220
+ );
221
+ const zone = new Set<PhysicalEdge>();
222
+ const rect = this.environment.viewRect?.(this.view);
223
+ if (rect != null && rect.width > 0) {
224
+ const {width} = this.environment.viewportSize();
225
+ const right = rect.left + rect.width;
226
+ const band = this.edgeRegion + EDGE_ZONE_TOLERANCE;
227
+ if (rect.left >= -EDGE_ZONE_TOLERANCE && right <= band) {
228
+ zone.add('left');
229
+ }
230
+ if (rect.left >= width - band && right <= width + EDGE_ZONE_TOLERANCE) {
231
+ zone.add('right');
232
+ }
233
+ }
234
+ this.layout = {isRtl, watched, zone};
235
+ return this.layout;
236
+ }
237
+
238
+ protected override reset(): void {
239
+ super.reset();
240
+ this.activeEdge = null;
241
+ }
242
+
243
+ private edgeAt(touch: GestureTouch): PhysicalEdge | null {
244
+ const {width} = this.environment.viewportSize();
245
+ for (const physical of this.measured().watched) {
246
+ const inBand =
247
+ physical === 'left'
248
+ ? touch.startX <= this.edgeRegion
249
+ : touch.startX >= width - this.edgeRegion;
250
+ if (inBand) {
251
+ return physical;
252
+ }
253
+ }
254
+ return null;
255
+ }
256
+ }