@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,126 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // @pr-a11y scope ^packages/core/src/Avatar/ ^apps/storybook/stories/Avatar
3
+
4
+ /**
5
+ * @file AvatarForcedColors.a11y.chromium.spec.ts
6
+ * @input The built Avatar "Initials Fallback" story in real Chromium, with
7
+ * forced colors emulated and without
8
+ * @output Browser evidence that, in forced colors, a lone Avatar's initials
9
+ * take the color around them: CanvasText by default, GrayText inside a control
10
+ * that paints itself disabled, HighlightText inside a
11
+ * selected one, while grouped faces keep CanvasText on the group's ring;
12
+ * outside forced colors they keep the theme's color
13
+ * @position Regression proof for Avatar's fallback color (Chromium only:
14
+ * Playwright's WebKit matches the forced-colors query but forces nothing)
15
+ */
16
+
17
+ import {expect, test, type Page} from '@playwright/test';
18
+ import {
19
+ DEFAULT_STORYBOOK_DIR,
20
+ serveStorybook,
21
+ type StaticServer,
22
+ } from '@astryxdesign/a11y-spec/storybook';
23
+
24
+ let storybook: StaticServer;
25
+ test.beforeAll(async () => {
26
+ storybook = await serveStorybook(
27
+ process.env.ASTRYX_STORYBOOK_DIR ?? DEFAULT_STORYBOOK_DIR,
28
+ );
29
+ });
30
+ test.afterAll(async () => {
31
+ await storybook?.close();
32
+ });
33
+
34
+ /**
35
+ * The initials' color, with `around` painted on `host`: the Avatar's own box
36
+ * for a lone Avatar, the group's for grouped ones.
37
+ */
38
+ async function initialsColor(
39
+ page: Page,
40
+ forcedColors: 'active' | 'none',
41
+ around: string | null,
42
+ {
43
+ story = 'core-avatar--initials-fallback',
44
+ host = '.astryx-avatar',
45
+ }: {story?: string; host?: string} = {},
46
+ ): Promise<{initials: string; reference: string}> {
47
+ await page.emulateMedia({forcedColors});
48
+ await page.goto(`${storybook.origin}/iframe.html?id=${story}&viewMode=story`);
49
+ await page.locator('.astryx-avatar-fallback').first().waitFor();
50
+ if (around != null) {
51
+ await page.addStyleTag({content: `${host} { ${around} }`});
52
+ }
53
+ return page.evaluate(() => {
54
+ const initials = document.querySelector('.astryx-avatar-fallback');
55
+ // A probe painted with the system color the initials should show.
56
+ const probe = document.createElement('span');
57
+ document.body.append(probe);
58
+ const read = (color: string) => {
59
+ probe.style.color = color;
60
+ return getComputedStyle(probe).color;
61
+ };
62
+ const result = {
63
+ initials: initials == null ? '' : getComputedStyle(initials).color,
64
+ reference: JSON.stringify({
65
+ CanvasText: read('CanvasText'),
66
+ GrayText: read('GrayText'),
67
+ HighlightText: read('HighlightText'),
68
+ }),
69
+ };
70
+ probe.remove();
71
+ return result;
72
+ });
73
+ }
74
+
75
+ test('in forced colors the initials are CanvasText by default', async ({
76
+ page,
77
+ }) => {
78
+ const {initials, reference} = await initialsColor(page, 'active', null);
79
+ expect(initials).toBe(JSON.parse(reference).CanvasText);
80
+ });
81
+
82
+ test('in forced colors the initials take GrayText inside a control that paints itself disabled', async ({
83
+ page,
84
+ }) => {
85
+ const {initials, reference} = await initialsColor(
86
+ page,
87
+ 'active',
88
+ 'color: GrayText;',
89
+ );
90
+ expect(initials).toBe(JSON.parse(reference).GrayText);
91
+ });
92
+
93
+ test('in forced colors the initials take HighlightText inside a selected control', async ({
94
+ page,
95
+ }) => {
96
+ const {initials, reference} = await initialsColor(
97
+ page,
98
+ 'active',
99
+ 'forced-color-adjust: none; background: Highlight; color: HighlightText;',
100
+ );
101
+ expect(initials).toBe(JSON.parse(reference).HighlightText);
102
+ });
103
+
104
+ test("outside forced colors the initials keep the theme's color, whatever is around them", async ({
105
+ page,
106
+ }) => {
107
+ const plain = await initialsColor(page, 'none', null);
108
+ const around = await initialsColor(page, 'none', 'color: rgb(200, 0, 0);');
109
+ expect(around.initials).toBe(plain.initials);
110
+ expect(plain.initials).not.toBe('rgb(200, 0, 0)');
111
+ });
112
+
113
+ test("in forced colors grouped initials keep CanvasText on the group's ring", async ({
114
+ page,
115
+ }) => {
116
+ const {initials, reference} = await initialsColor(
117
+ page,
118
+ 'active',
119
+ 'color: GrayText;',
120
+ {
121
+ story: 'core-avatargroup--initials-fallback',
122
+ host: '.astryx-avatar-group',
123
+ },
124
+ );
125
+ expect(initials).toBe(JSON.parse(reference).CanvasText);
126
+ });
@@ -1045,6 +1045,52 @@ describe('BottomSheet', () => {
1045
1045
  });
1046
1046
 
1047
1047
  describe('swipe to dismiss', () => {
1048
+ it("a sheet opened from inside another sheet's content drags to dismiss by its own handle, and the covered host neither drags nor takes the pointer (FR6, FR7)", () => {
1049
+ const onInnerOpenChange = vi.fn();
1050
+ const onOuterOpenChange = vi.fn();
1051
+ render(
1052
+ <BottomSheet isOpen onOpenChange={onOuterOpenChange} label="Outer">
1053
+ Outer content
1054
+ <BottomSheet isOpen onOpenChange={onInnerOpenChange} label="Inner">
1055
+ Inner content
1056
+ </BottomSheet>
1057
+ </BottomSheet>,
1058
+ );
1059
+ const dialogs = screen.getAllByRole('dialog', {hidden: true});
1060
+ expect(dialogs).toHaveLength(2);
1061
+ const [outerDialog, innerDialog] = dialogs;
1062
+ // The inner sheet's dialog is rendered inside the outer sheet's body,
1063
+ // so its events bubble through the outer body's gesture listeners.
1064
+ expect(outerDialog.contains(innerDialog)).toBe(true);
1065
+ const outerPanel = outerDialog.querySelector<HTMLElement>(
1066
+ ':scope > .astryx-bottom-sheet',
1067
+ )!;
1068
+ const outerBody = outerPanel.querySelector<HTMLElement>(
1069
+ ':scope > :not([aria-hidden])',
1070
+ )!;
1071
+ const innerHandle = innerDialog.querySelector<HTMLElement>(
1072
+ '.astryx-bottom-sheet > [aria-hidden="true"]',
1073
+ )!;
1074
+ // `setPointerCapture` is a prototype stub here, so record who captures.
1075
+ const captured: Element[] = [];
1076
+ const capture = vi
1077
+ .spyOn(Element.prototype, 'setPointerCapture')
1078
+ .mockImplementation(function (this: Element) {
1079
+ captured.push(this);
1080
+ });
1081
+ drag(innerHandle, [{y: 0}, {y: 40}, {y: 120}], 'touch');
1082
+ capture.mockRestore();
1083
+ // The inner sheet's own drag ran to its dismissal.
1084
+ expect(onInnerOpenChange).toHaveBeenCalledWith(false);
1085
+ // The covered host saw the same pointer bubble up and did nothing with
1086
+ // it: no drag of its own (its panel keeps its resting transform) and no
1087
+ // pointer capture, which would have cancelled the inner handle's drag.
1088
+ expect(onOuterOpenChange).not.toHaveBeenCalled();
1089
+ expect(captured).toContain(innerHandle);
1090
+ expect(captured).not.toContain(outerBody);
1091
+ expect(outerPanel.style.transform).toBe('');
1092
+ });
1093
+
1048
1094
  it('requests close when dragged past the dismiss threshold', () => {
1049
1095
  const onOpenChange = vi.fn();
1050
1096
  render(
@@ -99,7 +99,7 @@ import {
99
99
  } from '../theme/tokens.stylex';
100
100
  import {useDevWarning} from '../hooks/useDevWarning';
101
101
  import {useScrollLock} from '../hooks/useScrollLock';
102
- import {mergeProps} from '../utils';
102
+ import {mergeProps} from '../utils/mergeProps';
103
103
  import {LayerDepthProvider} from '../Layer/LayerDepthContext';
104
104
  import {ModalAnnounceProvider} from '../hooks/ModalAnnounceProvider';
105
105
  import {useModalOutlet} from '../Layer/modalOutlet';
@@ -48,7 +48,8 @@ import {
48
48
  sizeVars,
49
49
  spacingVars,
50
50
  } from '../theme/tokens.stylex';
51
- import {mergeProps, themeProps} from '../utils';
51
+ import {mergeProps} from '../utils/mergeProps';
52
+ import {themeProps} from '../utils/themeProps';
52
53
  import {focusOutlineStyles} from '../utils/focusOutline.stylex';
53
54
  import {layerTextReset} from '../Layer/layerTextReset.stylex';
54
55
  import {layerStructureReset} from '../Layer/layerStructureReset.stylex';
@@ -12,6 +12,7 @@
12
12
  import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
13
13
  import {act, renderHook} from '@testing-library/react';
14
14
  import {
15
+ isInsideNestedLayer,
15
16
  useSheetGestures,
16
17
  type UseSheetGesturesOptions,
17
18
  } from './useSheetGestures';
@@ -106,6 +107,27 @@ function up(hook: Hook, y: number, t: number, target: HTMLElement) {
106
107
  );
107
108
  }
108
109
 
110
+ describe('isInsideNestedLayer', () => {
111
+ it("is true for a target inside a <dialog> rendered within the body, and false for the body's own content", () => {
112
+ const body = document.createElement('div');
113
+ const own = document.createElement('button');
114
+ body.append(own);
115
+ const nested = document.createElement('dialog');
116
+ const nestedHandle = document.createElement('div');
117
+ nested.append(nestedHandle);
118
+ body.append(nested);
119
+ expect(isInsideNestedLayer(own, body)).toBe(false);
120
+ expect(isInsideNestedLayer(body, body)).toBe(false);
121
+ expect(isInsideNestedLayer(nestedHandle, body)).toBe(true);
122
+ expect(isInsideNestedLayer(nested, body)).toBe(true);
123
+ // A dialog above the body (the sheet's own) does not count.
124
+ const ownDialog = document.createElement('dialog');
125
+ ownDialog.append(body);
126
+ expect(isInsideNestedLayer(own, body)).toBe(false);
127
+ expect(isInsideNestedLayer(null, body)).toBe(false);
128
+ });
129
+ });
130
+
109
131
  describe('useSheetGestures', () => {
110
132
  it('dismisses on a fast downward flick (swipe-to-close)', () => {
111
133
  const {hook, onDismiss} = setup({snapHeights: () => [200]});
@@ -1213,6 +1235,36 @@ describe('useSheetGestures', () => {
1213
1235
  expect(hook.result.current.isDragging).toBe(true);
1214
1236
  });
1215
1237
 
1238
+ it('leaves a touch that starts inside a nested <dialog> to that layer', () => {
1239
+ // A sheet opened from this sheet's content renders its <dialog> inside
1240
+ // the body, so its touches bubble here. The same pull-down from the
1241
+ // body's own content promotes (see above); from the nested layer it
1242
+ // must not.
1243
+ const {hook} = setup({snapHeights: () => [200]});
1244
+ const {body} = makeNested({
1245
+ bodyScrollTop: 0,
1246
+ innerScrollTop: 0,
1247
+ innerScrollHeight: 200,
1248
+ });
1249
+ const nested = document.createElement('dialog');
1250
+ const nestedHandle = document.createElement('div');
1251
+ nested.appendChild(nestedHandle);
1252
+ body.appendChild(nested);
1253
+ act(() => hook.result.current.sheetRef(body));
1254
+ act(() => hook.result.current.bodyProps.ref(body));
1255
+ let start: Event | undefined;
1256
+ let pull: Event | undefined;
1257
+ act(() => {
1258
+ start = touchOn(nestedHandle, body, 'touchstart', 100);
1259
+ pull = touchOn(nestedHandle, body, 'touchmove', 160);
1260
+ });
1261
+ expect(start?.defaultPrevented).toBe(false);
1262
+ expect(pull?.defaultPrevented).toBe(false);
1263
+ expect(hook.result.current.isDragging).toBe(false);
1264
+ expect(liveOffset(hook)).toBe(0);
1265
+ expect(body.style.transform).toBe('');
1266
+ });
1267
+
1216
1268
  it('leaves a pull-up to a nested scroller with content below', () => {
1217
1269
  const {hook} = setup({snapHeights: () => [200]});
1218
1270
  const {body, tile} = makeNested({bodyScrollTop: 0, innerScrollTop: 100});
@@ -235,6 +235,33 @@ function isBlockScroller(element: HTMLElement): boolean {
235
235
  return overflowY === 'auto' || overflowY === 'scroll';
236
236
  }
237
237
 
238
+ /**
239
+ * Whether a gesture that lands on `target` began inside another layer
240
+ * rendered in this sheet's content — a `<dialog>` between the target and the
241
+ * body. A sheet opened from inside a sheet's content, a Dialog opened there,
242
+ * renders its dialog as a descendant of the host's body, so its pointer and
243
+ * touch events bubble through the host's gesture listeners. That gesture is
244
+ * the layer's own: the host must neither arm a drag on it nor take pointer
245
+ * capture for it, which would cancel the drag the layer's own handle began
246
+ * (`component:BottomSheet` FR7: a swipe reaches only the top sheet of a
247
+ * stack; FR6: a covered sheet is blocked).
248
+ */
249
+ export function isInsideNestedLayer(
250
+ target: EventTarget | null,
251
+ body: HTMLElement,
252
+ ): boolean {
253
+ for (
254
+ let element = target instanceof Element ? target : null;
255
+ element != null && element !== body;
256
+ element = element.parentElement
257
+ ) {
258
+ if (element.localName === 'dialog') {
259
+ return true;
260
+ }
261
+ }
262
+ return false;
263
+ }
264
+
238
265
  /**
239
266
  * The scrollers a gesture that lands on `target` can scroll, innermost first
240
267
  * and the body last: every scrollable box between the target and the body,
@@ -1328,10 +1355,13 @@ export function useSheetGestures({
1328
1355
  if (event.button !== 0 || !event.isPrimary) {
1329
1356
  return;
1330
1357
  }
1331
- const scrollers = scrollChainUnder(
1332
- event.target,
1333
- event.currentTarget as HTMLElement,
1334
- );
1358
+ const body = event.currentTarget as HTMLElement;
1359
+ // A gesture inside a layer this sheet hosts belongs to that layer.
1360
+ if (isInsideNestedLayer(event.target, body)) {
1361
+ armedBodyRef.current = null;
1362
+ return;
1363
+ }
1364
+ const scrollers = scrollChainUnder(event.target, body);
1335
1365
  if (!chainAtTop(scrollers)) {
1336
1366
  armedBodyRef.current = null;
1337
1367
  return;
@@ -1465,8 +1495,9 @@ export function useSheetGestures({
1465
1495
  // At the top, a pull DOWN hands off (collapse); at the bottom, a pull UP
1466
1496
  // hands off (expand). A gesture that starts mid-content is an ordinary
1467
1497
  // scroll, but it is tracked all the same: the scroller can run out of
1468
- // content while the finger is still down (see onTouchMove).
1469
- if (!touch) {
1498
+ // content while the finger is still down (see onTouchMove). A touch
1499
+ // inside a layer this sheet hosts is that layer's, never tracked here.
1500
+ if (!touch || isInsideNestedLayer(event.target, body)) {
1470
1501
  touchDragRef.current = null;
1471
1502
  return;
1472
1503
  }
@@ -97,15 +97,27 @@ async function runState(
97
97
  });
98
98
  }
99
99
 
100
- test('every Breadcrumb expectation is exercised by at least one state', async ({
101
- page,
102
- }) => {
103
- const cdp = await page.context().newCDPSession(page);
100
+ // Checking coverage runs every state again, which on a loaded runner nears
101
+ // the per-test timeout as one test. It runs as one serial part per state,
102
+ // sharing their results, then one check over all of them.
103
+ test.describe('every Breadcrumb expectation is exercised by at least one state', () => {
104
+ test.describe.configure({mode: 'serial'});
104
105
  const results: BindingResult[] = [];
106
+
105
107
  for (const state of BREADCRUMB_A11Y_STATES) {
106
- results.push(await runState(page, cdp, state));
108
+ test(`runs ${state.id}`, async ({page}) => {
109
+ const cdp = await page.context().newCDPSession(page);
110
+ results.push(await runState(page, cdp, state));
111
+ });
107
112
  }
108
- expect(neverExercised(results)).toEqual([]);
113
+
114
+ test('no expectation is left unexercised', () => {
115
+ // Every part ran in this worker; this test alone proves nothing.
116
+ expect(results.map(result => result.state).sort()).toEqual(
117
+ BREADCRUMB_A11Y_STATES.map(state => state.id).sort(),
118
+ );
119
+ expect(neverExercised(results)).toEqual([]);
120
+ });
109
121
  });
110
122
 
111
123
  for (const state of BREADCRUMB_A11Y_STATES) {
@@ -43,8 +43,8 @@ import {
43
43
  shadowVars,
44
44
  focusVars,
45
45
  } from '../theme/tokens.stylex';
46
- import {Spinner} from '../Spinner';
47
- import {VisuallyHidden} from '../VisuallyHidden';
46
+ import {Spinner} from '../Spinner/Spinner';
47
+ import {VisuallyHidden} from '../VisuallyHidden/VisuallyHidden';
48
48
  import {IconDefaultSizeProvider} from '../Icon/IconDefaultSizeContext';
49
49
  import {iconBoxSizeStyles, type IconSize} from '../Icon/IconSize.stylex';
50
50
 
@@ -57,7 +57,7 @@ import {
57
57
  groupStyles as inputGroupStyles,
58
58
  inputGroupItemProps,
59
59
  } from '../InputGroup/groupStyles';
60
- import {mergeProps} from '../utils';
60
+ import {mergeProps} from '../utils/mergeProps';
61
61
  import {useMergedRefs} from '../hooks/useMergedRefs';
62
62
  import {useLinkComponent} from '../Link/useLinkComponent';
63
63
  import type {LinkComponentType} from '../Link/types';
@@ -65,7 +65,7 @@ import {themeProps} from '../utils/themeProps';
65
65
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
66
66
  import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
67
67
  import {usePressFeedback} from '../hooks/usePressFeedback';
68
- import {useTranslator} from '../i18n';
68
+ import {useTranslator} from '../i18n/useTranslator';
69
69
  import type {ButtonVariantMap} from './index';
70
70
 
71
71
  /**