@astryxdesign/core 0.7.5 → 0.7.6-canary.bb18c81

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 (353) 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/Avatar/Avatar.d.ts.map +1 -1
  5. package/dist/Avatar/Avatar.js +12 -3
  6. package/dist/BottomSheet/BottomSheet.js +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  8. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  9. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  10. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  11. package/dist/BottomSheet/useSheetGestures.js +30 -3
  12. package/dist/Button/Button.js +4 -4
  13. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  14. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  15. package/dist/DateInput/DateInput.d.ts.map +1 -1
  16. package/dist/DateInput/DateInput.js +4 -1
  17. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  18. package/dist/DateInput/MonthScroller.js +101 -15
  19. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  20. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  21. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  22. package/dist/DateTimeInput/DateTimeInput.js +4 -1
  23. package/dist/Dialog/Dialog.d.ts.map +1 -1
  24. package/dist/Dialog/Dialog.js +34 -9
  25. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  26. package/dist/Dialog/DialogHeader.js +5 -4
  27. package/dist/Divider/Divider.d.ts.map +1 -1
  28. package/dist/Divider/Divider.js +2 -1
  29. package/dist/Drawer/Drawer.d.ts.map +1 -1
  30. package/dist/Drawer/Drawer.js +5 -0
  31. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  32. package/dist/DropdownMenu/DropdownMenu.js +4 -1
  33. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  34. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  35. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +10 -1
  36. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  37. package/dist/DropdownMenu/lazyMenuBottomSheet.js +16 -2
  38. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  39. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  40. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  41. package/dist/EmptyState/EmptyState.js +2 -1
  42. package/dist/Field/FieldLabel.d.ts +1 -1
  43. package/dist/Field/FieldLabel.d.ts.map +1 -1
  44. package/dist/Field/FieldLabel.js +4 -4
  45. package/dist/Field/InputClearButton.js +3 -3
  46. package/dist/Field/PanelSearchInput.js +2 -2
  47. package/dist/FieldStatus/FieldStatus.js +2 -2
  48. package/dist/FileInput/FileInput.d.ts.map +1 -1
  49. package/dist/FileInput/FileInput.js +7 -1
  50. package/dist/Heading/Heading.js +1 -1
  51. package/dist/Icon/Icon.js +1 -1
  52. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  53. package/dist/Indicator/CheckIndicator.js +2 -1
  54. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  55. package/dist/Indicator/CheckboxIndicator.js +3 -1
  56. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  57. package/dist/Indicator/RadioIndicator.js +3 -1
  58. package/dist/Item/Item.d.ts.map +1 -1
  59. package/dist/Item/Item.js +2 -1
  60. package/dist/Item/ItemSwipeLayer.js +1 -1
  61. package/dist/Layout/Layout.js +1 -1
  62. package/dist/Layout/LayoutContent.js +1 -1
  63. package/dist/Layout/LayoutFooter.js +1 -1
  64. package/dist/Layout/LayoutHeader.js +1 -1
  65. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  66. package/dist/Lightbox/Lightbox.js +5 -0
  67. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  68. package/dist/List/List.js +1 -1
  69. package/dist/List/ListItem.js +3 -3
  70. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  71. package/dist/MobileNav/MobileNav.js +7 -2
  72. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  73. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  74. package/dist/MultiSelector/MultiSelector.js +5 -2
  75. package/dist/NumberInput/NumberInput.d.ts +3 -1
  76. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  77. package/dist/NumberInput/NumberInput.js +3 -3
  78. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  79. package/dist/ProgressBar/ProgressBar.js +16 -12
  80. package/dist/Resizable/useResizable.d.ts.map +1 -1
  81. package/dist/Resizable/useResizable.js +28 -2
  82. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  83. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  84. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  85. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  86. package/dist/Selector/useSelectorPresentation.js +20 -4
  87. package/dist/Slider/Slider.d.ts.map +1 -1
  88. package/dist/Slider/Slider.js +7 -1
  89. package/dist/Spinner/Spinner.js +2 -2
  90. package/dist/Stack/Stack.js +1 -1
  91. package/dist/Stack/StackItem.js +1 -1
  92. package/dist/TabList/TabList.d.ts.map +1 -1
  93. package/dist/TabList/TabList.js +16 -1
  94. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  95. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  96. package/dist/Text/Text.js +1 -1
  97. package/dist/Text/useTruncation.d.ts.map +1 -1
  98. package/dist/Text/useTruncation.js +23 -5
  99. package/dist/TextArea/TextArea.d.ts +1 -1
  100. package/dist/TextArea/TextArea.d.ts.map +1 -1
  101. package/dist/TextArea/TextArea.js +13 -2
  102. package/dist/TextInput/TextInput.d.ts.map +1 -1
  103. package/dist/TextInput/TextInput.js +3 -3
  104. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  105. package/dist/Timestamp/Timestamp.js +2 -2
  106. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  107. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  108. package/dist/Toast/ToastViewport.js +82 -51
  109. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  110. package/dist/Tokenizer/Tokenizer.js +13 -2
  111. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  112. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  113. package/dist/Toolbar/Toolbar.js +2 -1
  114. package/dist/Typeahead/Typeahead.d.ts +1 -1
  115. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  116. package/dist/Typeahead/Typeahead.js +9 -1
  117. package/dist/astryx.css +14 -1
  118. package/dist/gestures/PinchGestureRecognizer.d.ts +30 -0
  119. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  120. package/dist/gestures/PinchGestureRecognizer.js +125 -0
  121. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +70 -0
  122. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  123. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +220 -0
  124. package/dist/gestures/SwipeGestureRecognizer.d.ts +36 -0
  125. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  126. package/dist/gestures/SwipeGestureRecognizer.js +145 -0
  127. package/dist/gestures/VelocityTracker.d.ts +6 -2
  128. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  129. package/dist/gestures/VelocityTracker.js +7 -3
  130. package/dist/gestures/types.d.ts +11 -7
  131. package/dist/gestures/types.d.ts.map +1 -1
  132. package/dist/gestures/types.js +22 -2
  133. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  134. package/dist/hooks/useAdaptivePresentation.js +4 -1
  135. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  136. package/dist/hooks/useMenuHover.js +12 -1
  137. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  138. package/dist/i18n/generated-locales/en.generated.js +3 -0
  139. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  140. package/dist/i18n/generated-locales/pseudo.generated.js +3 -0
  141. package/dist/motion/animator.d.ts +7 -1
  142. package/dist/motion/animator.d.ts.map +1 -1
  143. package/dist/motion/animator.js +119 -27
  144. package/dist/theme/defineTheme.js +1 -1
  145. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  146. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  147. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  148. package/dist/theme/domainTokens/index.d.ts +5 -4
  149. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  150. package/dist/theme/domainTokens/index.js +5 -9
  151. package/dist/utils/focusReturn.d.ts +17 -1
  152. package/dist/utils/focusReturn.d.ts.map +1 -1
  153. package/dist/utils/focusReturn.js +11 -4
  154. package/dist/utils/getNodeText.d.ts +8 -0
  155. package/dist/utils/getNodeText.d.ts.map +1 -0
  156. package/dist/utils/getNodeText.js +37 -0
  157. package/dist/utils/interactionModality.d.ts +11 -2
  158. package/dist/utils/interactionModality.d.ts.map +1 -1
  159. package/dist/utils/interactionModality.js +58 -5
  160. package/dist/utils/presentation.d.ts +50 -0
  161. package/dist/utils/presentation.d.ts.map +1 -0
  162. package/dist/utils/presentation.js +125 -0
  163. package/dist/utils/touchPresentation.d.ts.map +1 -1
  164. package/dist/utils/touchPresentation.js +5 -3
  165. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  166. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  167. package/dist/utils/touchPresentation.stylex.js +33 -0
  168. package/locales/en.json +13 -1
  169. package/locales/pseudo.json +9 -0
  170. package/package.json +5 -4
  171. package/src/AlertDialog/AlertDialog.tsx +6 -5
  172. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  173. package/src/Avatar/Avatar.spec.md +22 -22
  174. package/src/Avatar/Avatar.tsx +18 -1
  175. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  176. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  177. package/src/BottomSheet/BottomSheet.tsx +1 -1
  178. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  179. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  180. package/src/BottomSheet/useSheetGestures.ts +37 -6
  181. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  182. package/src/Button/Button.tsx +4 -4
  183. package/src/Calendar/Calendar.spec.md +87 -48
  184. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  185. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  186. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  187. package/src/Collapsible/Collapsible.spec.md +2 -0
  188. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  189. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  190. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  191. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  192. package/src/DateInput/DateInput.test.tsx +53 -2
  193. package/src/DateInput/DateInput.tsx +15 -11
  194. package/src/DateInput/MonthScroller.tsx +106 -20
  195. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  196. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  197. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  198. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  199. package/src/DateTimeInput/DateTimeInput.spec.md +71 -48
  200. package/src/DateTimeInput/DateTimeInput.test.tsx +61 -0
  201. package/src/DateTimeInput/DateTimeInput.tsx +15 -11
  202. package/src/Dialog/Dialog.test.tsx +216 -2
  203. package/src/Dialog/Dialog.tsx +42 -9
  204. package/src/Dialog/DialogHeader.tsx +5 -4
  205. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  206. package/src/Divider/Divider.tsx +2 -1
  207. package/src/Drawer/Drawer.spec.md +111 -80
  208. package/src/Drawer/Drawer.test.tsx +22 -0
  209. package/src/Drawer/Drawer.tsx +5 -0
  210. package/src/Drawer/DrawerHeader.spec.md +181 -0
  211. package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
  212. package/src/DropdownMenu/DropdownMenu.tsx +7 -1
  213. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  214. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  215. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  216. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  217. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +53 -0
  218. package/src/DropdownMenu/lazyMenuBottomSheet.ts +23 -6
  219. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  220. package/src/EmptyState/EmptyState.tsx +2 -1
  221. package/src/Field/FieldLabel.tsx +5 -4
  222. package/src/Field/InputClearButton.tsx +3 -3
  223. package/src/Field/PanelSearchInput.tsx +2 -2
  224. package/src/FieldStatus/FieldStatus.tsx +2 -2
  225. package/src/FileInput/FileInput.test.tsx +21 -0
  226. package/src/FileInput/FileInput.tsx +4 -1
  227. package/src/FormLayout/FormLayout.spec.md +7 -8
  228. package/src/Heading/Heading.tsx +1 -1
  229. package/src/Icon/Icon.tsx +1 -1
  230. package/src/Indicator/CheckIndicator.spec.md +47 -42
  231. package/src/Indicator/CheckIndicator.tsx +2 -1
  232. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  233. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  234. package/src/Indicator/Indicator.spec.md +188 -0
  235. package/src/Indicator/RadioIndicator.tsx +3 -1
  236. package/src/Item/Item.tsx +2 -1
  237. package/src/Item/ItemSwipeLayer.tsx +1 -1
  238. package/src/Layout/Layout.spec.md +127 -131
  239. package/src/Layout/Layout.tsx +1 -1
  240. package/src/Layout/LayoutContent.spec.md +205 -0
  241. package/src/Layout/LayoutContent.tsx +1 -1
  242. package/src/Layout/LayoutFooter.spec.md +190 -0
  243. package/src/Layout/LayoutFooter.tsx +1 -1
  244. package/src/Layout/LayoutHeader.spec.md +193 -0
  245. package/src/Layout/LayoutHeader.tsx +1 -1
  246. package/src/Layout/LayoutPanel.spec.md +194 -0
  247. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  248. package/src/Lightbox/Lightbox.test.tsx +18 -0
  249. package/src/Lightbox/Lightbox.tsx +5 -0
  250. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  251. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  252. package/src/List/List.tsx +1 -1
  253. package/src/List/ListItem.tsx +3 -3
  254. package/src/MobileNav/MobileNav.test.tsx +15 -0
  255. package/src/MobileNav/MobileNav.tsx +9 -1
  256. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  257. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  258. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  259. package/src/MultiSelector/MultiSelector.test.tsx +118 -1
  260. package/src/MultiSelector/MultiSelector.tsx +6 -2
  261. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  262. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  263. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  264. package/src/NumberInput/NumberInput.spec.md +59 -37
  265. package/src/NumberInput/NumberInput.tsx +13 -3
  266. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  267. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  268. package/src/ProgressBar/ProgressBar.tsx +58 -10
  269. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  270. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  271. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  272. package/src/Resizable/useResizable.test.ts +43 -0
  273. package/src/Resizable/useResizable.ts +32 -9
  274. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  275. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  276. package/src/Selector/Selector.test.tsx +90 -1
  277. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  278. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  279. package/src/Selector/useSelectorPresentation.ts +31 -3
  280. package/src/SideNav/SideNav.test.tsx +27 -0
  281. package/src/Slider/Slider.test.tsx +12 -0
  282. package/src/Slider/Slider.tsx +4 -1
  283. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  284. package/src/Spinner/Spinner.tsx +2 -2
  285. package/src/Stack/Stack.tsx +1 -1
  286. package/src/Stack/StackItem.tsx +1 -1
  287. package/src/TabList/TabList.test.tsx +52 -1
  288. package/src/TabList/TabList.tsx +16 -1
  289. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  290. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  291. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  292. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  293. package/src/Text/Text.tsx +1 -1
  294. package/src/Text/useTruncation.test.tsx +128 -1
  295. package/src/Text/useTruncation.ts +23 -5
  296. package/src/TextArea/TextArea.spec.md +10 -13
  297. package/src/TextArea/TextArea.test.tsx +60 -0
  298. package/src/TextArea/TextArea.tsx +15 -1
  299. package/src/TextInput/TextInput.test.tsx +21 -0
  300. package/src/TextInput/TextInput.tsx +3 -1
  301. package/src/Timestamp/Timestamp.spec.md +6 -12
  302. package/src/Timestamp/Timestamp.test.tsx +30 -5
  303. package/src/Timestamp/Timestamp.tsx +6 -2
  304. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  305. package/src/Toast/Toast.spec.md +7 -10
  306. package/src/Toast/ToastViewport.test.tsx +575 -1
  307. package/src/Toast/ToastViewport.tsx +100 -50
  308. package/src/Tokenizer/Tokenizer.spec.md +5 -3
  309. package/src/Tokenizer/Tokenizer.test.tsx +68 -0
  310. package/src/Tokenizer/Tokenizer.tsx +14 -2
  311. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
  312. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  313. package/src/Toolbar/Toolbar.spec.md +5 -6
  314. package/src/Toolbar/Toolbar.test.tsx +30 -0
  315. package/src/Toolbar/Toolbar.tsx +2 -1
  316. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  317. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  318. package/src/TopNav/TopNav.test.tsx +27 -0
  319. package/src/Typeahead/Typeahead.test.tsx +40 -0
  320. package/src/Typeahead/Typeahead.tsx +12 -1
  321. package/src/gestures/PinchGestureRecognizer.ts +144 -0
  322. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +252 -0
  323. package/src/gestures/SwipeGestureRecognizer.ts +193 -0
  324. package/src/gestures/VelocityTracker.ts +10 -3
  325. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  326. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  327. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  328. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  329. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +188 -0
  330. package/src/gestures/__tests__/harness.ts +21 -2
  331. package/src/gestures/types.ts +23 -9
  332. package/src/hooks/useAdaptivePresentation.ts +4 -1
  333. package/src/hooks/useMenuHover.ts +15 -1
  334. package/src/i18n/generated-locales/en.generated.ts +4 -0
  335. package/src/i18n/generated-locales/pseudo.generated.ts +4 -0
  336. package/src/motion/README.md +11 -1
  337. package/src/motion/animator.test.ts +151 -3
  338. package/src/motion/animator.ts +149 -33
  339. package/src/theme/defineTheme.ts +1 -1
  340. package/src/theme/derivedVarRegistry.test.ts +4 -0
  341. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  342. package/src/theme/domainTokens/index.ts +6 -10
  343. package/src/utils/focusReturn.ts +17 -6
  344. package/src/utils/getNodeText.test.ts +24 -0
  345. package/src/utils/getNodeText.ts +37 -0
  346. package/src/utils/interactionModality.test.ts +45 -1
  347. package/src/utils/interactionModality.ts +64 -5
  348. package/src/utils/presentation.test.ts +380 -0
  349. package/src/utils/presentation.ts +180 -0
  350. package/src/utils/pressPaintPriority.test.ts +80 -0
  351. package/src/utils/touchPresentation.stylex.ts +43 -0
  352. package/src/utils/touchPresentation.test.ts +140 -1
  353. package/src/utils/touchPresentation.ts +5 -3
@@ -0,0 +1,193 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SwipeGestureRecognizer.ts
5
+ * @input Touches from a GestureArena
6
+ * @output Exports SwipeGestureRecognizer (UISwipeGestureRecognizer), its
7
+ * options and direction type
8
+ * @position Discrete recognizer of packages/core/src/gestures
9
+ *
10
+ * Recognized WHILE the fingers move, as UIKit's is: as soon as the centroid
11
+ * has travelled `minimumDistance` along an allowed direction, within
12
+ * `maximumDuration` of touch-down, with off-axis travel no more than
13
+ * `maximumSecondaryMovement` px across it. Off-axis travel past that
14
+ * allowance, or the distance travelled the wrong way, rules a direction out;
15
+ * the swipe fails once every allowed direction is ruled out, as it does for
16
+ * too many fingers, the duration running out, and a lift before it was
17
+ * recognized.
18
+ */
19
+
20
+ import {UIKIT_SWIPE} from '../motion/uikit/gestures';
21
+ import {centroid} from './geometry';
22
+ import {
23
+ GestureRecognizer,
24
+ type GestureRecognizerOptions,
25
+ type NativeTouchBehavior,
26
+ } from './GestureRecognizer';
27
+ import type {GestureEventContext, GestureTouch, Point} from './types';
28
+
29
+ export type SwipeDirection = 'left' | 'right' | 'up' | 'down';
30
+
31
+ export interface SwipeGestureRecognizerOptions extends GestureRecognizerOptions<SwipeGestureRecognizer> {
32
+ /** @default ['right'] */
33
+ direction?: SwipeDirection | ReadonlyArray<SwipeDirection>;
34
+ /** @default 1 */
35
+ numberOfTouchesRequired?: number;
36
+ minimumDistance?: number;
37
+ maximumDuration?: number;
38
+ maximumSecondaryMovement?: number;
39
+ }
40
+
41
+ const SWIPE = UIKIT_SWIPE;
42
+
43
+ export class SwipeGestureRecognizer extends GestureRecognizer {
44
+ directions: ReadonlyArray<SwipeDirection>;
45
+ numberOfTouchesRequired: number;
46
+ minimumDistance: number;
47
+ maximumDuration: number;
48
+ maximumSecondaryMovement: number;
49
+ /** The direction of the recognized swipe. */
50
+ recognizedDirection: SwipeDirection | null = null;
51
+
52
+ private origin: Point = {x: 0, y: 0};
53
+ /** Directions this touch's path has ruled out. */
54
+ private readonly ruledOut = new Set<SwipeDirection>();
55
+ /** The centroid at the previous move. */
56
+ private last: Point | null = null;
57
+
58
+ constructor(options: SwipeGestureRecognizerOptions = {}) {
59
+ super(options);
60
+ const direction = options.direction ?? ['right'];
61
+ this.directions = typeof direction === 'string' ? [direction] : direction;
62
+ this.numberOfTouchesRequired = options.numberOfTouchesRequired ?? 1;
63
+ this.minimumDistance =
64
+ options.minimumDistance ?? SWIPE.minimumDistance.value;
65
+ this.maximumDuration =
66
+ options.maximumDuration ?? SWIPE.maximumDuration.value;
67
+ this.maximumSecondaryMovement =
68
+ options.maximumSecondaryMovement ?? SWIPE.maximumSecondaryMovement.value;
69
+ }
70
+
71
+ override get isDiscrete(): boolean {
72
+ return true;
73
+ }
74
+
75
+ override get nativeTouchBehavior(): NativeTouchBehavior {
76
+ const horizontal = this.directions.some(
77
+ direction => direction === 'left' || direction === 'right',
78
+ );
79
+ const vertical = this.directions.some(
80
+ direction => direction === 'up' || direction === 'down',
81
+ );
82
+ return {
83
+ panX: !horizontal,
84
+ panY: !vertical,
85
+ pinchZoom: true,
86
+ doubleTapZoom: false,
87
+ };
88
+ }
89
+
90
+ protected override touchesBegan(
91
+ touches: ReadonlyArray<GestureTouch>,
92
+ event: GestureEventContext,
93
+ ): void {
94
+ if (this.numberOfTouches > this.numberOfTouchesRequired) {
95
+ this.setState('failed');
96
+ return;
97
+ }
98
+ if (this.numberOfTouches === touches.length) {
99
+ this.setTimer(event.time + this.maximumDuration, () => {
100
+ // A swipe already recognized, waiting on a recognizer it requires to
101
+ // fail, holds its recognition (spec:AST-094 FR15).
102
+ if (this.pending == null) {
103
+ this.setState('failed');
104
+ }
105
+ });
106
+ }
107
+ // Measure from where every required finger is down.
108
+ this.origin = centroid(this.touches.values());
109
+ this.last = null;
110
+ }
111
+
112
+ protected override touchesMoved(): void {
113
+ if (
114
+ this.pending != null ||
115
+ this.numberOfTouches !== this.numberOfTouchesRequired
116
+ ) {
117
+ return;
118
+ }
119
+ const current = centroid(this.touches.values());
120
+ const from = this.last ?? this.origin;
121
+ this.last = current;
122
+ for (const direction of this.directions) {
123
+ if (this.ruledOut.has(direction)) {
124
+ continue;
125
+ }
126
+ // Along and across this direction at the start and the end of the
127
+ // move. The path between two events is read as a straight segment, so
128
+ // the verdict does not depend on how far apart the events were.
129
+ const [along0, across0] = this.project(direction, from);
130
+ const [along1, across1] = this.project(direction, current);
131
+ const reaches = segmentCrossing(along0, along1, this.minimumDistance);
132
+ const strays = Math.max(
133
+ segmentCrossing(across0, across1, this.maximumSecondaryMovement),
134
+ segmentCrossing(-across0, -across1, this.maximumSecondaryMovement),
135
+ );
136
+ const strayAt = strays < 0 ? Infinity : strays;
137
+ if (reaches >= 0 && reaches <= strayAt) {
138
+ this.recognizedDirection = direction;
139
+ this.setState('ended');
140
+ return;
141
+ }
142
+ // Off-axis travel past the allowance, or the distance the wrong way,
143
+ // rules a direction out for good.
144
+ if (strays >= 0 || along1 <= -this.minimumDistance) {
145
+ this.ruledOut.add(direction);
146
+ }
147
+ }
148
+ if (this.directions.every(direction => this.ruledOut.has(direction))) {
149
+ this.setState('failed');
150
+ }
151
+ }
152
+
153
+ /** Travel along and across `direction` from the origin to `point`. */
154
+ private project(direction: SwipeDirection, point: Point): [number, number] {
155
+ const dx = point.x - this.origin.x;
156
+ const dy = point.y - this.origin.y;
157
+ return direction === 'left'
158
+ ? [-dx, dy]
159
+ : direction === 'right'
160
+ ? [dx, dy]
161
+ : direction === 'up'
162
+ ? [-dy, dx]
163
+ : [dy, dx];
164
+ }
165
+
166
+ protected override touchesEnded(): void {
167
+ // Recognized and waiting, it holds past the lift (FR15).
168
+ if (this.pending == null) {
169
+ this.setState('failed');
170
+ }
171
+ }
172
+
173
+ protected override reset(): void {
174
+ this.recognizedDirection = null;
175
+ this.ruledOut.clear();
176
+ this.last = null;
177
+ this.origin = {x: 0, y: 0};
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Where on the segment from `start` to `end` (0 to 1) the value first
183
+ * reaches `limit`; 0 when it starts there, -1 when it never does.
184
+ */
185
+ function segmentCrossing(start: number, end: number, limit: number): number {
186
+ if (start >= limit) {
187
+ return 0;
188
+ }
189
+ if (end < limit) {
190
+ return -1;
191
+ }
192
+ return (limit - start) / (end - start);
193
+ }
@@ -88,15 +88,22 @@ export class VelocityTracker {
88
88
  * Record a position. Timestamps must not go backwards (an older sample is
89
89
  * ignored), and a moved sample at the newest moved sample's timestamp
90
90
  * replaces it. A sample at the newest position is not motion: it changes
91
- * no velocity.
91
+ * no velocity, unless `isMotion` says the contact moved anyway (a pinch's
92
+ * value holding while both fingers move, which reads as zero velocity for
93
+ * that interval).
92
94
  */
93
- add(x: number, y: number, time: number): void {
95
+ add(
96
+ x: number,
97
+ y: number,
98
+ time: number,
99
+ {isMotion = false}: {isMotion?: boolean} = {},
100
+ ): void {
94
101
  if (this.newest != null && time < this.newest.time) {
95
102
  return;
96
103
  }
97
104
  this.newest = {x, y, time};
98
105
  const last = this.moved[this.moved.length - 1];
99
- if (last != null && x === last.x && y === last.y) {
106
+ if (last != null && x === last.x && y === last.y && !isMotion) {
100
107
  return;
101
108
  }
102
109
  if (last != null && time === last.time) {
@@ -8,15 +8,15 @@
8
8
  */
9
9
 
10
10
  import {describe, expect, it} from 'vitest';
11
- import {UIKIT_GESTURES} from '../../motion/uikit/gestures';
11
+ import {UIKIT_PAN, UIKIT_VELOCITY} from '../../motion/uikit/gestures';
12
12
  import {PanGestureRecognizer} from '../PanGestureRecognizer';
13
- import {createHarness, scrollProbe} from './harness';
13
+ import {createHarness} from './harness';
14
14
 
15
15
  describe('PanGestureRecognizer', () => {
16
16
  it('begins past the hysteresis and leaves the threshold out of the translation', () => {
17
17
  const h = createHarness();
18
18
  const pan = new PanGestureRecognizer({name: 'pan'});
19
- const hysteresis = UIKIT_GESTURES.pan.hysteresis.value;
19
+ const hysteresis = UIKIT_PAN.hysteresis.value;
20
20
  h.finger(1).down(100, 100, 0, {recognizers: [pan]});
21
21
  h.finger(1).move(100 + hysteresis - 0.1, 100, 16);
22
22
  expect(pan.state).toBe('possible');
@@ -75,7 +75,7 @@ describe('PanGestureRecognizer', () => {
75
75
  });
76
76
 
77
77
  it('releases at 0 after a rest longer than the stillness interval (AST-100 FR2)', () => {
78
- const stillness = UIKIT_GESTURES.velocity.stillness.value;
78
+ const stillness = UIKIT_VELOCITY.stillness.value;
79
79
  const release = (liftAt: number) => {
80
80
  const h = createHarness();
81
81
  const pan = new PanGestureRecognizer({name: 'pan'});
@@ -0,0 +1,74 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file PinchGestureRecognizer.test.ts
5
+ * @input Synthetic touches with explicit timestamps through a GestureArena
6
+ * @output PinchGestureRecognizer's state machine: the hysteresis, the scale against the moved starting span, the velocity, extra fingers, re-basing
7
+ * @position Unit tests of packages/core/src/gestures/PinchGestureRecognizer.ts
8
+ */
9
+
10
+ import {describe, expect, it} from 'vitest';
11
+ import {PinchGestureRecognizer} from '../PinchGestureRecognizer';
12
+ import {createHarness} from './harness';
13
+
14
+ describe('PinchGestureRecognizer', () => {
15
+ it('begins after the hysteresis and reports scale and velocity', () => {
16
+ const h = createHarness();
17
+ const pinch = new PinchGestureRecognizer({name: 'pinch'});
18
+ h.finger(1).down(100, 100, 0, {recognizers: [pinch]});
19
+ h.finger(2).down(200, 100, 0, {recognizers: [pinch]});
20
+ h.finger(2).move(205, 100, 16);
21
+ expect(pinch.state).toBe('possible');
22
+ h.finger(2).move(210, 100, 32);
23
+ expect(pinch.state).toBe('began');
24
+ // UIKit: against the starting span moved by the hysteresis (100 + 8).
25
+ expect(pinch.scale).toBeCloseTo(110 / 108, 5);
26
+ for (let t = 48; t <= 160; t += 16) {
27
+ h.finger(2).move(210 + (t - 32) * 0.1, 100, t);
28
+ }
29
+ // 0.1 px/ms over 108 px.
30
+ expect(pinch.velocity).toBeCloseTo(100 / 108, 5);
31
+ h.finger(1).up(170);
32
+ expect(h.log).toContain('pinch:ended@170');
33
+ });
34
+
35
+ it('ignores a third finger and can be re-based', () => {
36
+ const h = createHarness();
37
+ const pinch = new PinchGestureRecognizer({name: 'pinch'});
38
+ h.finger(1).down(0, 0, 0, {recognizers: [pinch]});
39
+ h.finger(2).down(100, 0, 0, {recognizers: [pinch]});
40
+ h.finger(3).down(50, 50, 5, {recognizers: [pinch]});
41
+ expect(pinch.numberOfTouches).toBe(2);
42
+ h.finger(2).move(150, 0, 16);
43
+ pinch.scale = 1;
44
+ h.finger(2).move(300, 0, 32);
45
+ expect(pinch.scale).toBeCloseTo(2, 5);
46
+ });
47
+
48
+ it('lets the velocity settle when the span holds while the fingers move', () => {
49
+ const h = createHarness();
50
+ const pinch = new PinchGestureRecognizer({name: 'pinch'});
51
+ h.finger(1).down(100, 100, 0, {recognizers: [pinch]});
52
+ h.finger(2).down(200, 100, 0, {recognizers: [pinch]});
53
+ let time = 0;
54
+ for (let x = 210; x <= 260; x += 10) {
55
+ time += 16;
56
+ h.finger(2).move(x, 100, time);
57
+ }
58
+ const spreading = pinch.velocity;
59
+ expect(spreading).toBeGreaterThan(0);
60
+ // The second finger circles the first at exactly the same distance (160:
61
+ // 3-4-5 triangles), so the span holds while it moves.
62
+ for (const [dx, dy] of [
63
+ [128, 96],
64
+ [96, 128],
65
+ [0, 160],
66
+ [-96, 128],
67
+ [-128, 96],
68
+ ]) {
69
+ time += 16;
70
+ h.finger(2).move(100 + dx, 100 + dy, time);
71
+ }
72
+ expect(Math.abs(pinch.velocity)).toBeLessThan(spreading * 0.25);
73
+ });
74
+ });