@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,80 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file pressPaintPriority.test.ts
5
+ * @input Uses vitest, Babel with the StyleX plugin (the repository's shared
6
+ * module resolution) and interactionOverlay.stylex.ts
7
+ * @output Checks, in the compiled CSS, that the press paint outranks the
8
+ * coarse-pointer `:active` reset of the overlay
9
+ * @position Regression test for the cascade order of the press overlay
10
+ *
11
+ * WebKit applies `:active` during a touch. Under a coarse pointer the overlay
12
+ * turns the bare `:active` image off, and the press paint
13
+ * (`[data-astryx-press="on"]`) must still win: its rule has to sit in a
14
+ * higher StyleX priority than the reset. The order is a property of how
15
+ * each key is spelled: an imported `defineConsts` key compiles to a higher
16
+ * priority than the same literal, which put the reset above the paint and
17
+ * erased the touch-down frame.
18
+ */
19
+
20
+ import fs from 'node:fs';
21
+ import {createRequire} from 'node:module';
22
+ import path from 'node:path';
23
+ import {describe, expect, it} from 'vitest';
24
+ import stylexResolution from '../../../../scripts/stylex-module-resolution.cjs';
25
+
26
+ type Rule = [string, {ltr: string}, number];
27
+
28
+ // Babel's types are not part of core's typecheck; type the one call used.
29
+ const {transformSync} = createRequire(import.meta.url)('@babel/core') as {
30
+ transformSync: (
31
+ code: string,
32
+ options: Record<string, unknown>,
33
+ ) => {metadata?: unknown} | null;
34
+ };
35
+
36
+ function compiledRules(file: string): Rule[] {
37
+ const output = transformSync(fs.readFileSync(file, 'utf8'), {
38
+ filename: file,
39
+ babelrc: false,
40
+ configFile: false,
41
+ parserOpts: {plugins: ['typescript', 'jsx']},
42
+ plugins: [
43
+ [
44
+ '@stylexjs/babel-plugin',
45
+ {
46
+ dev: false,
47
+ runtimeInjection: false,
48
+ genConditionalClasses: true,
49
+ treeshakeCompensation: true,
50
+ unstable_moduleResolution: stylexResolution.stylexModuleResolution,
51
+ },
52
+ ],
53
+ ],
54
+ });
55
+ return (output?.metadata as {stylex?: Rule[]}).stylex ?? [];
56
+ }
57
+
58
+ describe('press overlay cascade', () => {
59
+ it('ranks the press paint above the coarse-pointer :active reset', () => {
60
+ const rules = compiledRules(
61
+ path.resolve(__dirname, 'interactionOverlay.stylex.ts'),
62
+ );
63
+ const resets = rules.filter(
64
+ // Matched without its condition's text: an imported key compiles to a
65
+ // placeholder until the bundle step.
66
+ ([, {ltr}]) =>
67
+ ltr.includes(':active') && ltr.includes('background-image:none'),
68
+ );
69
+ const paints = rules.filter(
70
+ ([, {ltr}]) =>
71
+ ltr.includes('[data-astryx-press="on"]') &&
72
+ ltr.includes('background-image:'),
73
+ );
74
+ expect(resets.length).toBeGreaterThan(0);
75
+ expect(paints.length).toBeGreaterThan(0);
76
+ const highestReset = Math.max(...resets.map(([, , priority]) => priority));
77
+ const lowestPaint = Math.min(...paints.map(([, , priority]) => priority));
78
+ expect(highestReset).toBeLessThan(lowestPaint);
79
+ });
80
+ });
@@ -0,0 +1,43 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file touchPresentation.stylex.ts
5
+ * @input Uses StyleX defineConsts
6
+ * @output Exports touchKeys: the touch presentation resolver's queries as
7
+ * StyleX at-rule keys
8
+ * @position The reference spellings of the touch, compact and iOS-gate
9
+ * conditions. Core styles write these as literal keys wherever they need
10
+ * them (`spec:AST-094` FR13, `spec:AST-012` FR9), and a test pins each
11
+ * literal to these values; utils/touchPresentation.ts holds the same
12
+ * queries for script (matchMedia)
13
+ *
14
+ * These are the spellings to match. A style that changes with these
15
+ * conditions writes the same literal key (`'@media (pointer: coarse)'`, the
16
+ * iOS gate as that media key outside `'@supports (-webkit-touch-callout:
17
+ * none)'`), and a test pins every literal in core to these values. Do not use
18
+ * an imported key as a computed StyleX key: it compiles to a different
19
+ * priority than the literal (6000 against 3200) and reorders the cascade.
20
+ * The iOS supports gate is only for a style iOS WebKit itself requires (the
21
+ * 16px input floor), never a behaviour.
22
+ *
23
+ * SYNC: When modified, update touchPresentation.ts and
24
+ * touchPresentation.test.ts.
25
+ */
26
+
27
+ import * as stylex from '@stylexjs/stylex';
28
+
29
+ export const touchKeys = stylex.defineConsts({
30
+ /** The primary pointer is coarse (TOUCH_QUERY). */
31
+ touch: '@media (pointer: coarse)',
32
+ /** The viewport is compact (COMPACT_QUERY, `spec:AST-012` FR9). */
33
+ compact: '@media (width < 768px), (height < 500px)',
34
+ /** Both: a presentation such as a sheet in place of a popover. */
35
+ compactTouch:
36
+ '@media (width < 768px) and (pointer: coarse), (height < 500px) and (pointer: coarse)',
37
+ /**
38
+ * The iOS WebKit gate, inside `touch` (IOS_SUPPORTS_QUERY): only for a
39
+ * style iOS WebKit itself requires (the 16px input floor), never a
40
+ * behaviour; touch behaviour is one model on every touch device.
41
+ */
42
+ iosSupports: '@supports (-webkit-touch-callout: none)',
43
+ });
@@ -22,6 +22,7 @@ import {
22
22
  COMPACT_TOUCH_PRESENTATION_QUERY,
23
23
  useAdaptivePresentation,
24
24
  } from '../hooks/useAdaptivePresentation';
25
+ import {reducedMotionKeys} from '../motion/reducedMotion.stylex';
25
26
  import {DEFAULT_COMPACT_DEFINITION} from '../theme/themeAdaptations';
26
27
  import {Theme, defineTheme} from '../theme';
27
28
  import {
@@ -33,6 +34,7 @@ import {
33
34
  readTouchPresentation,
34
35
  useTouchPresentation,
35
36
  } from './touchPresentation';
37
+ import {touchKeys} from './touchPresentation.stylex';
36
38
 
37
39
  /**
38
40
  * A device: what its primary pointer is, how big its viewport is, and
@@ -90,6 +92,32 @@ afterEach(() => {
90
92
  vi.unstubAllGlobals();
91
93
  });
92
94
 
95
+ /**
96
+ * The Levenshtein distance between two strings, or more than `limit` as soon
97
+ * as it must exceed it: how many characters a spelling is off another.
98
+ */
99
+ function editDistance(a: string, b: string, limit: number): number {
100
+ if (Math.abs(a.length - b.length) > limit) {
101
+ return limit + 1;
102
+ }
103
+ let previous = Array.from({length: b.length + 1}, (_, j) => j);
104
+ for (let i = 1; i <= a.length; i++) {
105
+ const current = [i];
106
+ for (let j = 1; j <= b.length; j++) {
107
+ current[j] = Math.min(
108
+ previous[j] + 1,
109
+ current[j - 1] + 1,
110
+ previous[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1),
111
+ );
112
+ }
113
+ if (Math.min(...current) > limit) {
114
+ return limit + 1;
115
+ }
116
+ previous = current;
117
+ }
118
+ return previous[b.length];
119
+ }
120
+
93
121
  describe('touch presentation', () => {
94
122
  it('keys touch on the primary pointer and compact on the width', () => {
95
123
  const {result} = renderHook(() => useTouchPresentation());
@@ -181,6 +209,116 @@ describe('touch presentation', () => {
181
209
  });
182
210
  });
183
211
 
212
+ it('holds the same keys the resolver defines', () => {
213
+ expect(touchKeys.touch).toBe(`@media ${TOUCH_QUERY}`);
214
+ expect(touchKeys.compact).toBe(`@media ${COMPACT_QUERY}`);
215
+ expect(touchKeys.compactTouch).toBe(`@media ${COMPACT_TOUCH_QUERY}`);
216
+ expect(touchKeys.iosSupports).toBe(`@supports ${IOS_SUPPORTS_QUERY}`);
217
+ expect(IOS_TOUCH_STYLE_KEYS).toEqual([
218
+ touchKeys.touch,
219
+ touchKeys.iosSupports,
220
+ ]);
221
+ });
222
+
223
+ it('keeps every touch and Reduce Motion key literal in core: no computed StyleX key', () => {
224
+ // An imported defineConsts at-rule key compiles to a different StyleX
225
+ // priority than the same literal (6000 vs 3200), which reorders the
226
+ // cascade; core spells the keys and matches them to the constants.
227
+ const root = path.resolve(__dirname, '..');
228
+ const computed: string[] = [];
229
+ const walk = (dir: string): void => {
230
+ for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
231
+ const full = path.join(dir, entry.name);
232
+ if (entry.isDirectory()) {
233
+ if (entry.name !== '__tests__' && entry.name !== 'node_modules') {
234
+ walk(full);
235
+ }
236
+ } else if (
237
+ /\.(ts|tsx)$/.test(entry.name) &&
238
+ !/\.test\.|\.spec\./.test(entry.name)
239
+ ) {
240
+ fs.readFileSync(full, 'utf8')
241
+ .split('\n')
242
+ .forEach((line, index) => {
243
+ if (
244
+ !/^\s*(\*|\/\/)/.test(line) &&
245
+ /\[(touchKeys|reducedMotionKeys)\.[a-zA-Z]+\]\s*:/.test(line)
246
+ ) {
247
+ computed.push(`${path.relative(root, full)}:${index + 1}`);
248
+ }
249
+ });
250
+ }
251
+ }
252
+ };
253
+ walk(root);
254
+ expect(computed).toEqual([]);
255
+ });
256
+
257
+ it('keeps every quoted at-rule key in core that names the pointer, the touch callout or a compact size, or that is a few characters off a reference spelling, one of the reference spellings', () => {
258
+ // Every quoted string that starts with `@` is read, whatever its at-rule
259
+ // is spelled. Two rules, so no drift depends on which character moved:
260
+ // - one that names the pointer or the touch callout (any word of either
261
+ // query, any case), or a compact size with its breakpoint, is one of
262
+ // the resolver's own spellings or a query the presentation does not
263
+ // decide (a second pointer, a fine pointer, Reduce Motion split by
264
+ // pointer);
265
+ // - one within three characters of any of those spellings, case aside,
266
+ // is that spelling exactly: a capital, a digit or a typo anywhere, in
267
+ // the at-rule, a feature or a value, fails.
268
+ const pointerKeys = new Set<string>([
269
+ touchKeys.touch,
270
+ touchKeys.compactTouch,
271
+ touchKeys.iosSupports,
272
+ '@media (any-pointer: coarse)',
273
+ '@media (pointer: fine)',
274
+ reducedMotionKeys.fade,
275
+ reducedMotionKeys.instant,
276
+ ]);
277
+ const references = new Set<string>([...pointerKeys, touchKeys.compact]);
278
+ const lowered = [...references].map(reference => reference.toLowerCase());
279
+ const root = path.resolve(__dirname, '..');
280
+ const drifted: string[] = [];
281
+ let pointerLiterals = 0;
282
+ const walk = (dir: string): void => {
283
+ for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
284
+ const full = path.join(dir, entry.name);
285
+ if (entry.isDirectory()) {
286
+ if (entry.name !== '__tests__' && entry.name !== 'node_modules') {
287
+ walk(full);
288
+ }
289
+ } else if (
290
+ /\.(ts|tsx)$/.test(entry.name) &&
291
+ !/\.(test|spec|stories)\./.test(entry.name)
292
+ ) {
293
+ const source = fs.readFileSync(full, 'utf8');
294
+ for (const match of source.matchAll(/'(@[^'\n]*)'/g)) {
295
+ const key = match[1];
296
+ if (references.has(key)) {
297
+ if (pointerKeys.has(key)) {
298
+ pointerLiterals++;
299
+ }
300
+ continue;
301
+ }
302
+ const names =
303
+ /pointer|coarse|fine|touch|callout/i.test(key) ||
304
+ (/\b(width|height)\b/i.test(key) && /\b(768|500)px\b/.test(key));
305
+ const lower = key.toLowerCase();
306
+ const isNear = lowered.some(
307
+ reference => editDistance(lower, reference, 3) <= 3,
308
+ );
309
+ if (names || isNear) {
310
+ drifted.push(`${path.relative(root, full)}: ${key}`);
311
+ }
312
+ }
313
+ }
314
+ }
315
+ };
316
+ walk(root);
317
+ expect(drifted).toEqual([]);
318
+ // Core writes the touch key as a literal in many places.
319
+ expect(pointerLiterals).toBeGreaterThan(50);
320
+ });
321
+
184
322
  it('keeps every iOS gate in core spelled and nested as the resolver', () => {
185
323
  // The gate is the media query outside and the supports query inside; a
186
324
  // single supports query that names the pointer never matches anywhere.
@@ -201,7 +339,8 @@ describe('touch presentation', () => {
201
339
  } else if (
202
340
  /\.(ts|tsx)$/.test(entry.name) &&
203
341
  !/\.test\.|\.spec\./.test(entry.name) &&
204
- entry.name !== 'touchPresentation.ts'
342
+ entry.name !== 'touchPresentation.ts' &&
343
+ entry.name !== 'touchPresentation.stylex.ts'
205
344
  ) {
206
345
  const lines = fs.readFileSync(full, 'utf8').split('\n');
207
346
  lines.forEach((line, index) => {
@@ -46,9 +46,11 @@
46
46
  * test keeps core's compact-touch keys identical to COMPACT_TOUCH_QUERY and
47
47
  * every touch-callout key spelled and nested as above. The iOS style gate
48
48
  * is only for a style iOS WebKit itself requires (core's 16px input floor);
49
- * it never selects a behaviour. The keys are literal because the Astryx
50
- * StyleX build does not resolve a key shared across files through
51
- * `defineConsts`. The hook is for behaviour. It answers the server default
49
+ * it never selects a behaviour. Core spells the keys literally: an imported
50
+ * `defineConsts` key compiles to a different StyleX priority than the same
51
+ * literal, which would reorder the cascade. `touchKeys`
52
+ * (touchPresentation.stylex.ts, internal to core) holds the same keys, and a
53
+ * test keeps every literal equal to them. The hook is for behaviour. It answers the server default
52
54
  * (not touch, not compact) until hydrated unless the caller passes a server
53
55
  * hint, and follows the pointer and size when they change (a tablet docking
54
56
  * a mouse).