@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,78 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file recognizerKind.test.ts
5
+ * @input Each recognizer of the family, and the sources of Core and Lab
6
+ * @output A recognizer is told apart by its `kind`, never by `instanceof`
7
+ * (architecture:react-component-runtime INV13): each one reports its kind,
8
+ * a screen-edge pan its own; and no source checks a recognizer's class
9
+ * @position Unit and source boundary test of packages/core/src/gestures
10
+ */
11
+
12
+ import fs from 'node:fs';
13
+ import path from 'node:path';
14
+ import {describe, expect, it} from 'vitest';
15
+ import {LongPressGestureRecognizer} from '../LongPressGestureRecognizer';
16
+ import {PanGestureRecognizer} from '../PanGestureRecognizer';
17
+ import {PinchGestureRecognizer} from '../PinchGestureRecognizer';
18
+ import {ScreenEdgePanGestureRecognizer} from '../ScreenEdgePanGestureRecognizer';
19
+ import {SwipeGestureRecognizer} from '../SwipeGestureRecognizer';
20
+ import {TapGestureRecognizer} from '../TapGestureRecognizer';
21
+
22
+ const ROOT = path.resolve(__dirname, '../../../../..');
23
+
24
+ function sourcesUnder(directory: string): string[] {
25
+ const files: string[] = [];
26
+ const visit = (current: string) => {
27
+ for (const entry of fs.readdirSync(current, {withFileTypes: true})) {
28
+ if (entry.name === 'node_modules' || entry.name.startsWith('.')) {
29
+ continue;
30
+ }
31
+ const full = path.join(current, entry.name);
32
+ if (entry.isDirectory()) {
33
+ visit(full);
34
+ } else if (/\.(m?[jt]sx?)$/.test(entry.name)) {
35
+ files.push(full);
36
+ }
37
+ }
38
+ };
39
+ if (fs.existsSync(directory)) {
40
+ visit(directory);
41
+ }
42
+ return files;
43
+ }
44
+
45
+ describe('recognizer kinds', () => {
46
+ it('each recognizer reports its kind, a screen-edge pan its own (architecture:react-component-runtime INV13)', () => {
47
+ const kinds = [
48
+ new TapGestureRecognizer(),
49
+ new LongPressGestureRecognizer(),
50
+ new PanGestureRecognizer(),
51
+ new ScreenEdgePanGestureRecognizer({edges: ['leading']}),
52
+ new SwipeGestureRecognizer(),
53
+ new PinchGestureRecognizer(),
54
+ ].map(recognizer => (recognizer as {kind?: string}).kind);
55
+ expect(kinds).toEqual([
56
+ 'tap',
57
+ 'longPress',
58
+ 'pan',
59
+ 'screenEdgePan',
60
+ 'swipe',
61
+ 'pinch',
62
+ ]);
63
+ });
64
+
65
+ it('is never told apart by instanceof in Core or Lab (architecture:react-component-runtime INV13)', () => {
66
+ // Built from parts, so this file does not match itself.
67
+ const check = new RegExp(
68
+ ['\\binstanceof\\s+', '[A-Za-z]*', 'GestureRecognizer\\b'].join(''),
69
+ );
70
+ const offenders = [
71
+ ...sourcesUnder(path.join(ROOT, 'packages/core/src')),
72
+ ...sourcesUnder(path.join(ROOT, 'packages/lab/src')),
73
+ ]
74
+ .filter(file => check.test(fs.readFileSync(file, 'utf8')))
75
+ .map(file => path.relative(ROOT, file));
76
+ expect(offenders).toEqual([]);
77
+ });
78
+ });
@@ -0,0 +1,54 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file touchActionRule.test.ts
5
+ * @input markTouchAction and unmarkTouchAction on a document
6
+ * @output Where the rule lives: an adopted constructable sheet where the
7
+ * engine has one, a style element where it has none, and an error from a
8
+ * constructable sheet that exists is not taken for a missing one
9
+ * @position Unit test of packages/core/src/gestures/touchActionRule.ts
10
+ */
11
+
12
+ import {afterEach, describe, expect, it, vi} from 'vitest';
13
+ import {markTouchAction, unmarkTouchAction} from '../touchActionRule';
14
+
15
+ afterEach(() => {
16
+ vi.unstubAllGlobals();
17
+ document.body.innerHTML = '';
18
+ document.head.innerHTML = '';
19
+ });
20
+
21
+ describe('touchActionRule', () => {
22
+ it('writes the rule into a style element where the engine has no constructable sheets', () => {
23
+ expect('adoptedStyleSheets' in document).toBe(false);
24
+ const element = document.createElement('div');
25
+ document.body.append(element);
26
+ expect(markTouchAction(element, 'pan-y')).toBe(true);
27
+ expect(document.head.querySelector('style')?.textContent).toContain(
28
+ 'pan-y',
29
+ );
30
+ unmarkTouchAction(element);
31
+ });
32
+
33
+ it('lets an error from a constructable sheet that exists through, instead of taking it for a missing one', () => {
34
+ class BrokenSheet {
35
+ constructor() {
36
+ throw new Error('broken sheet');
37
+ }
38
+ replaceSync(): void {}
39
+ }
40
+ vi.stubGlobal('CSSStyleSheet', BrokenSheet);
41
+ Object.defineProperty(document, 'adoptedStyleSheets', {
42
+ configurable: true,
43
+ writable: true,
44
+ value: [],
45
+ });
46
+ try {
47
+ const element = document.createElement('div');
48
+ document.body.append(element);
49
+ expect(() => markTouchAction(element, 'pan-x')).toThrow('broken sheet');
50
+ } finally {
51
+ delete (document as {adoptedStyleSheets?: unknown}).adoptedStyleSheets;
52
+ }
53
+ });
54
+ });
@@ -0,0 +1,570 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file useGestureRecognizer.test.tsx
5
+ * @input React components using useGestureRecognizer / usePressTracker, and
6
+ * touch events dispatched on their elements
7
+ * @output The hooks keep one recognizer per component, attach before the
8
+ * first touch, run the latest listener without rendering per move, and
9
+ * detach on unmount
10
+ * @position jsdom tests of packages/core/src/gestures/useGestureRecognizer.ts
11
+ */
12
+
13
+ import {act, render} from '@testing-library/react';
14
+ import {useRef} from 'react';
15
+ import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
16
+ import {getGestureHost} from '../GestureHost';
17
+ import {PanGestureRecognizer} from '../PanGestureRecognizer';
18
+ import {TapGestureRecognizer} from '../TapGestureRecognizer';
19
+ import {TOUCH_ACTION_ATTRIBUTE} from '../touchActionRule';
20
+ import type {ControlEvent} from '../PressTracker';
21
+ import {useGestureRecognizer, usePressTracker} from '../useGestureRecognizer';
22
+ import {coarsePrimaryPointer} from './harness';
23
+
24
+ function touch(
25
+ type: string,
26
+ target: EventTarget,
27
+ contact: {id: number; x: number; y: number},
28
+ time: number,
29
+ isLift = false,
30
+ ): void {
31
+ const event = new Event(type, {bubbles: true, cancelable: true});
32
+ const entry = {
33
+ identifier: contact.id,
34
+ clientX: contact.x,
35
+ clientY: contact.y,
36
+ target,
37
+ };
38
+ Object.defineProperty(event, 'changedTouches', {value: [entry]});
39
+ Object.defineProperty(event, 'touches', {value: isLift ? [] : [entry]});
40
+ Object.defineProperty(event, 'timeStamp', {value: time});
41
+ target.dispatchEvent(event);
42
+ }
43
+
44
+ let renders = 0;
45
+
46
+ function Draggable({
47
+ onPan,
48
+ onRecognizer,
49
+ isEnabled = true,
50
+ }: {
51
+ onPan: (recognizer: PanGestureRecognizer) => void;
52
+ onRecognizer?: (recognizer: PanGestureRecognizer) => void;
53
+ isEnabled?: boolean;
54
+ }) {
55
+ renders += 1;
56
+ const ref = useRef<HTMLDivElement>(null);
57
+ const pan = useGestureRecognizer(
58
+ ref,
59
+ () => new PanGestureRecognizer({direction: 'horizontal'}),
60
+ onPan,
61
+ {isEnabled},
62
+ );
63
+ onRecognizer?.(pan);
64
+ return <div data-testid="surface" ref={ref} />;
65
+ }
66
+
67
+ // A phone: the document's host listens only where the pointer is coarse.
68
+ let restorePointer: () => void = () => {};
69
+ beforeEach(() => {
70
+ restorePointer = coarsePrimaryPointer();
71
+ });
72
+ afterEach(() => {
73
+ restorePointer();
74
+ });
75
+
76
+ describe('useGestureRecognizer', () => {
77
+ afterEach(() => {
78
+ renders = 0;
79
+ });
80
+
81
+ it('drives the latest listener with no render per move', () => {
82
+ const seen: string[] = [];
83
+ const {getByTestId} = render(
84
+ <Draggable
85
+ onPan={recognizer => {
86
+ seen.push(`${recognizer.state}:${recognizer.translation().x}`);
87
+ }}
88
+ />,
89
+ );
90
+ const surface = getByTestId('surface');
91
+ expect(renders).toBe(1);
92
+ touch('touchstart', surface, {id: 1, x: 0, y: 0}, 0);
93
+ for (let x = 6; x <= 36; x += 6) {
94
+ touch('touchmove', surface, {id: 1, x, y: 0}, x * 2);
95
+ }
96
+ touch('touchend', surface, {id: 1, x: 36, y: 0}, 80, true);
97
+ // The 10 px hysteresis is left out of the translation, as in UIKit.
98
+ expect(seen).toEqual([
99
+ 'began:2',
100
+ 'changed:8',
101
+ 'changed:14',
102
+ 'changed:20',
103
+ 'changed:26',
104
+ 'ended:26',
105
+ ]);
106
+ expect(renders).toBe(1);
107
+ });
108
+
109
+ it('keeps one recognizer across renders and reads the newest listener', () => {
110
+ const identities = new Set<PanGestureRecognizer>();
111
+ const first = vi.fn();
112
+ const second = vi.fn();
113
+ const {getByTestId, rerender} = render(
114
+ <Draggable onPan={first} onRecognizer={r => identities.add(r)} />,
115
+ );
116
+ rerender(
117
+ <Draggable onPan={second} onRecognizer={r => identities.add(r)} />,
118
+ );
119
+ expect(identities.size).toBe(1);
120
+ const surface = getByTestId('surface');
121
+ touch('touchstart', surface, {id: 2, x: 0, y: 0}, 0);
122
+ touch('touchmove', surface, {id: 2, x: 30, y: 0}, 16);
123
+ expect(first).not.toHaveBeenCalled();
124
+ expect(second).toHaveBeenCalledTimes(1);
125
+ touch('touchend', surface, {id: 2, x: 30, y: 0}, 32, true);
126
+ });
127
+
128
+ it('cancels a gesture in flight when it is disabled, without calling the listener from the effect', () => {
129
+ const states: string[] = [];
130
+ // A listener of the recognizer's own, outside the hook, hears the cancel.
131
+ const heard: string[] = [];
132
+ let pan: PanGestureRecognizer | null = null;
133
+ const {getByTestId, rerender} = render(
134
+ <Draggable
135
+ onPan={r => states.push(r.state)}
136
+ onRecognizer={r => {
137
+ if (pan == null) {
138
+ pan = r;
139
+ r.addListener(current => heard.push(current.state));
140
+ }
141
+ }}
142
+ />,
143
+ );
144
+ const surface = getByTestId('surface');
145
+ touch('touchstart', surface, {id: 3, x: 0, y: 0}, 0);
146
+ touch('touchmove', surface, {id: 3, x: 30, y: 0}, 16);
147
+ act(() => {
148
+ rerender(
149
+ <Draggable onPan={r => states.push(r.state)} isEnabled={false} />,
150
+ );
151
+ });
152
+ // Disabling cancels the gesture; its attachment then goes (FR24), which
153
+ // leaves the recognizer at rest. The hook reports nothing from the effect.
154
+ expect(heard).toContain('cancelled');
155
+ expect(pan!.state).not.toBe('changed');
156
+ expect(states).toEqual(['began']);
157
+ touch('touchend', surface, {id: 3, x: 30, y: 0}, 32, true);
158
+ expect(states).toEqual(['began']);
159
+ });
160
+
161
+ it('follows the element when the node behind the ref is replaced', () => {
162
+ const onPan = vi.fn();
163
+ function Swappable({tag}: {tag: 'div' | 'section'}) {
164
+ const ref = useRef<HTMLElement>(null);
165
+ useGestureRecognizer(
166
+ ref,
167
+ () => new PanGestureRecognizer({direction: 'horizontal'}),
168
+ onPan,
169
+ );
170
+ const Tag = tag;
171
+ return <Tag data-testid="surface" ref={ref as never} />;
172
+ }
173
+ const {getByTestId, rerender} = render(<Swappable tag="div" />);
174
+ const first = getByTestId('surface');
175
+ rerender(<Swappable tag="section" />);
176
+ const second = getByTestId('surface');
177
+ expect(second).not.toBe(first);
178
+ touch('touchstart', first, {id: 6, x: 0, y: 0}, 0);
179
+ touch('touchmove', first, {id: 6, x: 30, y: 0}, 16);
180
+ touch('touchend', first, {id: 6, x: 30, y: 0}, 32, true);
181
+ expect(onPan).not.toHaveBeenCalled();
182
+ touch('touchstart', second, {id: 7, x: 0, y: 0}, 100);
183
+ touch('touchmove', second, {id: 7, x: 30, y: 0}, 116);
184
+ expect(onPan).toHaveBeenCalled();
185
+ touch('touchend', second, {id: 7, x: 30, y: 0}, 132, true);
186
+ });
187
+
188
+ it('reports cancelled to a handler that disables the recognizer itself, from that handler', () => {
189
+ const states: string[] = [];
190
+ let pan: PanGestureRecognizer | null = null;
191
+ const {getByTestId} = render(
192
+ <Draggable
193
+ onPan={r => states.push(r.state)}
194
+ onRecognizer={r => {
195
+ pan = r;
196
+ }}
197
+ />,
198
+ );
199
+ const surface = getByTestId('surface');
200
+ touch('touchstart', surface, {id: 6, x: 0, y: 0}, 0);
201
+ touch('touchmove', surface, {id: 6, x: 30, y: 0}, 16);
202
+ // A handler (here, the test) turns it off: UIKit's .cancelled, at once.
203
+ (pan as PanGestureRecognizer | null)?.setEnabled(false);
204
+ expect(states).toEqual(['began', 'cancelled']);
205
+ touch('touchend', surface, {id: 6, x: 30, y: 0}, 32, true);
206
+ });
207
+
208
+ it('attaches nothing while disabled: no touch-action, no gesture (FR24)', () => {
209
+ const states: string[] = [];
210
+ const {getByTestId, rerender} = render(
211
+ <Draggable onPan={r => states.push(r.state)} />,
212
+ );
213
+ const surface = getByTestId('surface');
214
+ expect(surface.hasAttribute(TOUCH_ACTION_ATTRIBUTE)).toBe(true);
215
+ act(() => {
216
+ rerender(
217
+ <Draggable onPan={r => states.push(r.state)} isEnabled={false} />,
218
+ );
219
+ });
220
+ // Disabling detaches: the host takes its touch-action off the element.
221
+ expect(surface.hasAttribute(TOUCH_ACTION_ATTRIBUTE)).toBe(false);
222
+ touch('touchstart', surface, {id: 6, x: 0, y: 0}, 0);
223
+ touch('touchmove', surface, {id: 6, x: 30, y: 0}, 16);
224
+ touch('touchend', surface, {id: 6, x: 30, y: 0}, 32, true);
225
+ expect(states).toEqual([]);
226
+ act(() => {
227
+ rerender(<Draggable onPan={r => states.push(r.state)} />);
228
+ });
229
+ touch('touchstart', surface, {id: 8, x: 0, y: 0}, 100);
230
+ touch('touchmove', surface, {id: 8, x: 30, y: 0}, 116);
231
+ expect(states).toContain('began');
232
+ touch('touchend', surface, {id: 8, x: 30, y: 0}, 132, true);
233
+ });
234
+
235
+ it('follows the element behind the ref when it is replaced (INV6)', () => {
236
+ const states: string[] = [];
237
+ function Swapped({id}: {id: string}) {
238
+ const ref = useRef<HTMLDivElement>(null);
239
+ useGestureRecognizer(
240
+ ref,
241
+ () => new PanGestureRecognizer({direction: 'horizontal'}),
242
+ r => states.push(r.state),
243
+ );
244
+ return <div key={id} data-testid={id} ref={ref} />;
245
+ }
246
+ const {getByTestId, rerender} = render(<Swapped id="first" />);
247
+ act(() => {
248
+ rerender(<Swapped id="second" />);
249
+ });
250
+ const second = getByTestId('second');
251
+ touch('touchstart', second, {id: 9, x: 0, y: 0}, 0);
252
+ touch('touchmove', second, {id: 9, x: 30, y: 0}, 16);
253
+ expect(states).toContain('began');
254
+ touch('touchend', second, {id: 9, x: 30, y: 0}, 32, true);
255
+ });
256
+
257
+ it('ends a gesture in flight on unmount without calling the listener from the cleanup (INV2)', () => {
258
+ const states: string[] = [];
259
+ // A listener of the recognizer's own, outside the hook, hears the cancel.
260
+ const heard: string[] = [];
261
+ let pan: PanGestureRecognizer | null = null;
262
+ const {getByTestId, unmount} = render(
263
+ <Draggable
264
+ onPan={r => states.push(r.state)}
265
+ onRecognizer={r => {
266
+ if (pan == null) {
267
+ pan = r;
268
+ r.addListener(current => heard.push(current.state));
269
+ }
270
+ }}
271
+ />,
272
+ );
273
+ const surface = getByTestId('surface');
274
+ touch('touchstart', surface, {id: 5, x: 0, y: 0}, 0);
275
+ touch('touchmove', surface, {id: 5, x: 30, y: 0}, 16);
276
+ expect(states).toEqual(['began']);
277
+ unmount();
278
+ expect(heard).toContain('cancelled');
279
+ expect(states).toEqual(['began']);
280
+ });
281
+
282
+ it('ends a gesture in flight when the node is replaced without calling the listener from the effect (INV2)', () => {
283
+ const states: string[] = [];
284
+ function Swapped({id}: {id: string}) {
285
+ const ref = useRef<HTMLDivElement>(null);
286
+ useGestureRecognizer(
287
+ ref,
288
+ () => new PanGestureRecognizer({direction: 'horizontal'}),
289
+ r => states.push(r.state),
290
+ );
291
+ return <div key={id} data-testid={id} ref={ref} />;
292
+ }
293
+ const {getByTestId, rerender} = render(<Swapped id="first" />);
294
+ const first = getByTestId('first');
295
+ touch('touchstart', first, {id: 10, x: 0, y: 0}, 0);
296
+ touch('touchmove', first, {id: 10, x: 30, y: 0}, 16);
297
+ expect(states).toEqual(['began']);
298
+ act(() => {
299
+ rerender(<Swapped id="second" />);
300
+ });
301
+ expect(states).toEqual(['began']);
302
+ });
303
+
304
+ it('keeps a recognizer that waits on one being disabled from calling its listener from the effect, and reports it after (INV2)', async () => {
305
+ const heard: string[] = [];
306
+ let inCommit = false;
307
+ function Pair({isDoubleTapEnabled}: {isDoubleTapEnabled: boolean}) {
308
+ const ref = useRef<HTMLDivElement>(null);
309
+ const doubleTap = useGestureRecognizer(
310
+ ref,
311
+ () => new TapGestureRecognizer({numberOfTapsRequired: 2}),
312
+ () => {},
313
+ {isEnabled: isDoubleTapEnabled},
314
+ );
315
+ useGestureRecognizer(
316
+ ref,
317
+ () => new TapGestureRecognizer().requireToFail(doubleTap),
318
+ tap => heard.push(`${inCommit ? 'effect' : 'handler'}:${tap.state}`),
319
+ );
320
+ return <div data-testid="surface" ref={ref} />;
321
+ }
322
+ const {getByTestId, rerender} = render(<Pair isDoubleTapEnabled />);
323
+ const surface = getByTestId('surface');
324
+ touch('touchstart', surface, {id: 5, x: 10, y: 10}, 0);
325
+ touch('touchend', surface, {id: 5, x: 10, y: 10}, 40, true);
326
+ // The single tap waits for the double tap to fail.
327
+ expect(heard).toEqual([]);
328
+ inCommit = true;
329
+ act(() => {
330
+ rerender(<Pair isDoubleTapEnabled={false} />);
331
+ });
332
+ inCommit = false;
333
+ // Disabling the double tap fails it inside that Effect, and nothing
334
+ // reports there: the single tap it held back is not lost, it recognizes
335
+ // after React's update, where its listener reports as usual.
336
+ expect(heard.filter(entry => entry.startsWith('effect:'))).toEqual([]);
337
+ await act(async () => {
338
+ await Promise.resolve();
339
+ });
340
+ expect(heard).toEqual(['handler:ended']);
341
+ });
342
+
343
+ it('detaches on unmount', () => {
344
+ const onPan = vi.fn();
345
+ const {getByTestId, unmount} = render(<Draggable onPan={onPan} />);
346
+ const surface = getByTestId('surface');
347
+ expect(surface.hasAttribute(TOUCH_ACTION_ATTRIBUTE)).toBe(true);
348
+ unmount();
349
+ expect(surface.hasAttribute(TOUCH_ACTION_ATTRIBUTE)).toBe(false);
350
+ touch('touchstart', surface, {id: 4, x: 0, y: 0}, 0);
351
+ touch('touchmove', surface, {id: 4, x: 30, y: 0}, 16);
352
+ expect(onPan).not.toHaveBeenCalled();
353
+ });
354
+ });
355
+
356
+ function Button({
357
+ onEvent,
358
+ cancelTravel,
359
+ isBraking,
360
+ isDisabled = false,
361
+ }: {
362
+ onEvent: (event: ControlEvent) => void;
363
+ cancelTravel?: number;
364
+ isBraking?: () => boolean;
365
+ isDisabled?: boolean;
366
+ }) {
367
+ const ref = useRef<HTMLButtonElement>(null);
368
+ usePressTracker(ref, {
369
+ onControlEvent: event => onEvent(event),
370
+ cancelTravel,
371
+ isBraking,
372
+ isEnabled: () => !isDisabled,
373
+ });
374
+ return (
375
+ <button data-testid="button" ref={ref} type="button">
376
+ Go
377
+ </button>
378
+ );
379
+ }
380
+
381
+ describe('usePressTracker', () => {
382
+ it('gives the host no listener while the control is disabled (FR24)', () => {
383
+ const add = vi.spyOn(document, 'addEventListener');
384
+ const remove = vi.spyOn(document, 'removeEventListener');
385
+ const {rerender, unmount} = render(
386
+ <Button onEvent={() => {}} isDisabled />,
387
+ );
388
+ const added = () =>
389
+ add.mock.calls.filter(([type]) => type === 'touchstart').length;
390
+ expect(added()).toBe(0);
391
+ rerender(<Button onEvent={() => {}} />);
392
+ expect(added()).toBe(1);
393
+ rerender(<Button onEvent={() => {}} isDisabled />);
394
+ expect(
395
+ remove.mock.calls.filter(([type]) => type === 'touchstart').length,
396
+ ).toBe(1);
397
+ unmount();
398
+ add.mockRestore();
399
+ remove.mockRestore();
400
+ });
401
+
402
+ it("keeps the tracker's own ancestor veto when the caller gives none: a single tap by its kind, nothing else with the same counts (architecture:react-component-runtime INV13)", () => {
403
+ let tracker: ReturnType<typeof usePressTracker> | null = null;
404
+ function Tracked() {
405
+ const ref = useRef<HTMLButtonElement>(null);
406
+ tracker = usePressTracker(ref);
407
+ return (
408
+ <button ref={ref} type="button">
409
+ Go
410
+ </button>
411
+ );
412
+ }
413
+ render(<Tracked />);
414
+ const tap = new TapGestureRecognizer({});
415
+ expect(tracker!.allowsAncestorRecognizer(tap)).toBe(false);
416
+ // A discrete recognizer that is not a tap, carrying the same counts.
417
+ const notATap = {
418
+ kind: 'swipe',
419
+ isDiscrete: true,
420
+ numberOfTapsRequired: 1,
421
+ numberOfTouchesRequired: 1,
422
+ view: null,
423
+ };
424
+ expect(tracker!.allowsAncestorRecognizer(notATap)).toBe(true);
425
+ });
426
+
427
+ it('rebuilds its tracker when trackingExpansion, highlightDelay, cancelTravel or quickTapFlash change', () => {
428
+ const trackers: unknown[] = [];
429
+ function Tracked(props: {
430
+ trackingExpansion?: number;
431
+ highlightDelay?: 'inScrollers' | 'always' | 'never';
432
+ cancelTravel?: number;
433
+ quickTapFlash?: number;
434
+ label?: string;
435
+ }) {
436
+ const ref = useRef<HTMLButtonElement>(null);
437
+ trackers.push(usePressTracker(ref, props));
438
+ return (
439
+ <button ref={ref} type="button">
440
+ {props.label ?? 'Go'}
441
+ </button>
442
+ );
443
+ }
444
+ const {rerender} = render(<Tracked cancelTravel={70} />);
445
+ rerender(<Tracked cancelTravel={70} label="Same options" />);
446
+ expect(trackers[1]).toBe(trackers[0]);
447
+ rerender(<Tracked cancelTravel={20} />);
448
+ expect(trackers[2]).not.toBe(trackers[1]);
449
+ rerender(<Tracked cancelTravel={20} trackingExpansion={30} />);
450
+ expect(trackers[3]).not.toBe(trackers[2]);
451
+ rerender(
452
+ <Tracked
453
+ cancelTravel={20}
454
+ trackingExpansion={30}
455
+ highlightDelay="never"
456
+ />,
457
+ );
458
+ expect(trackers[4]).not.toBe(trackers[3]);
459
+ rerender(
460
+ <Tracked
461
+ cancelTravel={20}
462
+ trackingExpansion={30}
463
+ highlightDelay="never"
464
+ quickTapFlash={0}
465
+ />,
466
+ );
467
+ expect(trackers[5]).not.toBe(trackers[4]);
468
+ });
469
+
470
+ it('reports UIControl events for a tap', () => {
471
+ const events: ControlEvent[] = [];
472
+ const {getByTestId} = render(
473
+ <Button onEvent={event => events.push(event)} />,
474
+ );
475
+ const button = getByTestId('button');
476
+ touch('touchstart', button, {id: 5, x: 1, y: 1}, 0);
477
+ touch('touchend', button, {id: 5, x: 1, y: 1}, 50, true);
478
+ expect(events).toEqual(['touchDown', 'touchUpInside']);
479
+ });
480
+
481
+ it('ends a held press on unmount without calling back from the effect', () => {
482
+ const highlights: boolean[] = [];
483
+ const events: ControlEvent[] = [];
484
+ function HeldButton() {
485
+ const ref = useRef<HTMLButtonElement>(null);
486
+ usePressTracker(ref, {
487
+ onControlEvent: event => events.push(event),
488
+ onHighlightChange: isHighlighted => highlights.push(isHighlighted),
489
+ });
490
+ return (
491
+ <button data-testid="held" ref={ref} type="button">
492
+ Go
493
+ </button>
494
+ );
495
+ }
496
+ const {getByTestId, unmount} = render(<HeldButton />);
497
+ touch('touchstart', getByTestId('held'), {id: 9, x: 1, y: 1}, 0);
498
+ const seenHighlights = [...highlights];
499
+ const seenEvents = [...events];
500
+ unmount();
501
+ expect(highlights).toEqual(seenHighlights);
502
+ expect(events).toEqual(seenEvents);
503
+ });
504
+
505
+ it('passes isBraking through to the tracker', () => {
506
+ const events: ControlEvent[] = [];
507
+ const isBraking = vi.fn(() => true);
508
+ function BrakingButton() {
509
+ const ref = useRef<HTMLButtonElement>(null);
510
+ usePressTracker(ref, {
511
+ onControlEvent: event => events.push(event),
512
+ isBraking,
513
+ });
514
+ return (
515
+ <button data-testid="braking" ref={ref} type="button">
516
+ Go
517
+ </button>
518
+ );
519
+ }
520
+ const {getByTestId} = render(<BrakingButton />);
521
+ const button = getByTestId('braking');
522
+ touch('touchstart', button, {id: 8, x: 1, y: 1}, 0);
523
+ touch('touchend', button, {id: 8, x: 1, y: 1}, 50, true);
524
+ expect(isBraking).toHaveBeenCalled();
525
+ expect(events).not.toContain('touchDown');
526
+ });
527
+
528
+ it("uses the caller's scroll brake", () => {
529
+ const events: ControlEvent[] = [];
530
+ const {getByTestId} = render(
531
+ <Button onEvent={event => events.push(event)} isBraking={() => true} />,
532
+ );
533
+ const button = getByTestId('button');
534
+ touch('touchstart', button, {id: 8, x: 1, y: 1}, 0);
535
+ touch('touchend', button, {id: 8, x: 1, y: 1}, 50, true);
536
+ expect(events).toEqual([]);
537
+ });
538
+
539
+ it('tracks the element behind the ref when it is replaced (INV6)', () => {
540
+ const events: ControlEvent[] = [];
541
+ function Swapped({id}: {id: string}) {
542
+ const ref = useRef<HTMLButtonElement>(null);
543
+ usePressTracker(ref, {onControlEvent: event => events.push(event)});
544
+ return <button key={id} data-testid={id} ref={ref} type="button" />;
545
+ }
546
+ const {getByTestId, rerender} = render(<Swapped id="first" />);
547
+ act(() => {
548
+ rerender(<Swapped id="second" />);
549
+ });
550
+ const second = getByTestId('second');
551
+ touch('touchstart', second, {id: 10, x: 1, y: 1}, 0);
552
+ touch('touchend', second, {id: 10, x: 1, y: 1}, 50, true);
553
+ expect(events).toEqual(['touchDown', 'touchUpInside']);
554
+ });
555
+
556
+ it('presses nothing for a touch that brakes a scroll', () => {
557
+ const events: ControlEvent[] = [];
558
+ const {getByTestId} = render(
559
+ <Button onEvent={event => events.push(event)} />,
560
+ );
561
+ const button = getByTestId('button');
562
+ const brake = vi
563
+ .spyOn(getGestureHost(document), 'isScrollBraking')
564
+ .mockReturnValue(true);
565
+ touch('touchstart', button, {id: 7, x: 1, y: 1}, 0);
566
+ touch('touchend', button, {id: 7, x: 1, y: 1}, 50, true);
567
+ expect(events).toEqual([]);
568
+ brake.mockRestore();
569
+ });
570
+ });