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

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 (559) 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/Badge/Badge.d.ts.map +1 -1
  7. package/dist/Badge/Badge.js +7 -1
  8. package/dist/BottomSheet/BottomSheet.js +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  10. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  11. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  12. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  13. package/dist/BottomSheet/useSheetGestures.js +30 -3
  14. package/dist/Button/Button.js +4 -4
  15. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  16. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  17. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  18. package/dist/ClickableCard/ClickableCard.js +37 -4
  19. package/dist/DateInput/DateInput.d.ts.map +1 -1
  20. package/dist/DateInput/DateInput.js +12 -4
  21. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  22. package/dist/DateInput/MonthScroller.js +101 -15
  23. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  24. package/dist/DateInput/TouchDateField.js +8 -3
  25. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  26. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  27. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  28. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  29. package/dist/DateTimeInput/DateTimeInput.js +23 -12
  30. package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
  31. package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
  32. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  33. package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
  34. package/dist/Dialog/Dialog.d.ts.map +1 -1
  35. package/dist/Dialog/Dialog.js +34 -9
  36. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  37. package/dist/Dialog/DialogHeader.js +5 -4
  38. package/dist/Divider/Divider.d.ts.map +1 -1
  39. package/dist/Divider/Divider.js +2 -1
  40. package/dist/Drawer/Drawer.d.ts +1 -0
  41. package/dist/Drawer/Drawer.d.ts.map +1 -1
  42. package/dist/Drawer/Drawer.js +7 -2
  43. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  44. package/dist/DropdownMenu/DropdownMenu.js +7 -3
  45. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  46. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  47. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
  48. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  49. package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
  50. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  51. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  52. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  53. package/dist/EmptyState/EmptyState.js +2 -1
  54. package/dist/Field/FieldLabel.d.ts +1 -1
  55. package/dist/Field/FieldLabel.d.ts.map +1 -1
  56. package/dist/Field/FieldLabel.js +4 -4
  57. package/dist/Field/InputClearButton.js +3 -3
  58. package/dist/Field/PanelSearchInput.js +2 -2
  59. package/dist/FieldStatus/FieldStatus.js +2 -2
  60. package/dist/FileInput/FileInput.d.ts.map +1 -1
  61. package/dist/FileInput/FileInput.js +7 -1
  62. package/dist/Heading/Heading.js +1 -1
  63. package/dist/Icon/Icon.js +1 -1
  64. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  65. package/dist/Indicator/CheckIndicator.js +2 -1
  66. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  67. package/dist/Indicator/CheckboxIndicator.js +3 -1
  68. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  69. package/dist/Indicator/RadioIndicator.js +3 -1
  70. package/dist/Item/Item.d.ts.map +1 -1
  71. package/dist/Item/Item.js +2 -1
  72. package/dist/Item/ItemSwipeLayer.js +1 -1
  73. package/dist/Layer/popoverOperations.d.ts +27 -0
  74. package/dist/Layer/popoverOperations.d.ts.map +1 -0
  75. package/dist/Layer/popoverOperations.js +159 -0
  76. package/dist/Layer/useLayer.d.ts +1 -1
  77. package/dist/Layer/useLayer.d.ts.map +1 -1
  78. package/dist/Layer/useLayer.js +93 -59
  79. package/dist/Layout/Layout.js +1 -1
  80. package/dist/Layout/LayoutContent.js +1 -1
  81. package/dist/Layout/LayoutFooter.js +1 -1
  82. package/dist/Layout/LayoutHeader.js +1 -1
  83. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  84. package/dist/Lightbox/Lightbox.js +5 -0
  85. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  86. package/dist/List/List.js +1 -1
  87. package/dist/List/ListItem.js +3 -3
  88. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  89. package/dist/MobileNav/MobileNav.js +7 -2
  90. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
  91. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  92. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  93. package/dist/MultiSelector/MultiSelector.js +26 -10
  94. package/dist/NumberInput/NumberInput.d.ts +3 -1
  95. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  96. package/dist/NumberInput/NumberInput.js +3 -3
  97. package/dist/NumberInput/numberParser.d.ts +3 -0
  98. package/dist/NumberInput/numberParser.d.ts.map +1 -1
  99. package/dist/NumberInput/numberParser.js +7 -44
  100. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  101. package/dist/ProgressBar/ProgressBar.js +16 -12
  102. package/dist/Resizable/useResizable.d.ts.map +1 -1
  103. package/dist/Resizable/useResizable.js +28 -2
  104. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  105. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  106. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  107. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  108. package/dist/Selector/useSelectorPresentation.js +20 -4
  109. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  110. package/dist/Skeleton/Skeleton.js +1 -1
  111. package/dist/Slider/Slider.d.ts.map +1 -1
  112. package/dist/Slider/Slider.js +10 -2
  113. package/dist/Spinner/Spinner.d.ts.map +1 -1
  114. package/dist/Spinner/Spinner.js +3 -3
  115. package/dist/Stack/Stack.js +1 -1
  116. package/dist/Stack/StackItem.js +1 -1
  117. package/dist/TabList/TabList.d.ts.map +1 -1
  118. package/dist/TabList/TabList.js +16 -1
  119. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  120. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  121. package/dist/Text/Text.js +1 -1
  122. package/dist/Text/useTruncation.d.ts.map +1 -1
  123. package/dist/Text/useTruncation.js +23 -5
  124. package/dist/TextArea/TextArea.d.ts +1 -1
  125. package/dist/TextArea/TextArea.d.ts.map +1 -1
  126. package/dist/TextArea/TextArea.js +13 -2
  127. package/dist/TextInput/TextInput.d.ts.map +1 -1
  128. package/dist/TextInput/TextInput.js +3 -3
  129. package/dist/TimeInput/TimeInput.d.ts +6 -2
  130. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  131. package/dist/TimeInput/TimeInput.js +21 -14
  132. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  133. package/dist/TimeInput/TouchTimeField.js +5 -4
  134. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  135. package/dist/Timestamp/Timestamp.js +2 -2
  136. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  137. package/dist/Toast/Toast.d.ts.map +1 -1
  138. package/dist/Toast/Toast.js +60 -20
  139. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  140. package/dist/Toast/ToastViewport.js +82 -51
  141. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  142. package/dist/Tokenizer/Tokenizer.js +13 -2
  143. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  144. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  145. package/dist/Toolbar/Toolbar.js +2 -1
  146. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  147. package/dist/TopNav/TopNavMegaMenu.js +3 -0
  148. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  149. package/dist/TopNav/TopNavMenu.js +1 -0
  150. package/dist/Typeahead/Typeahead.d.ts +1 -1
  151. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  152. package/dist/Typeahead/Typeahead.js +9 -1
  153. package/dist/astryx.css +20 -4
  154. package/dist/gestures/GestureArena.d.ts +6 -0
  155. package/dist/gestures/GestureArena.d.ts.map +1 -1
  156. package/dist/gestures/GestureArena.js +39 -0
  157. package/dist/gestures/GestureHost.d.ts +352 -0
  158. package/dist/gestures/GestureHost.d.ts.map +1 -0
  159. package/dist/gestures/GestureHost.js +1773 -0
  160. package/dist/gestures/GestureRecognizer.d.ts +10 -0
  161. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  162. package/dist/gestures/GestureRecognizer.js +16 -0
  163. package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
  164. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
  165. package/dist/gestures/LongPressGestureRecognizer.js +3 -0
  166. package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
  167. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  168. package/dist/gestures/PanGestureRecognizer.js +3 -0
  169. package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
  170. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  171. package/dist/gestures/PinchGestureRecognizer.js +128 -0
  172. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
  173. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  174. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
  175. package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
  176. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  177. package/dist/gestures/SwipeGestureRecognizer.js +148 -0
  178. package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
  179. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
  180. package/dist/gestures/TapGestureRecognizer.js +3 -0
  181. package/dist/gestures/VelocityTracker.d.ts +6 -2
  182. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  183. package/dist/gestures/VelocityTracker.js +7 -3
  184. package/dist/gestures/haptics.d.ts +65 -0
  185. package/dist/gestures/haptics.d.ts.map +1 -0
  186. package/dist/gestures/haptics.js +182 -0
  187. package/dist/gestures/nativeScroll.d.ts +42 -0
  188. package/dist/gestures/nativeScroll.d.ts.map +1 -0
  189. package/dist/gestures/nativeScroll.js +228 -0
  190. package/dist/gestures/touchAction.d.ts +60 -0
  191. package/dist/gestures/touchAction.d.ts.map +1 -0
  192. package/dist/gestures/touchAction.js +157 -0
  193. package/dist/gestures/touchActionRule.d.ts +34 -0
  194. package/dist/gestures/touchActionRule.d.ts.map +1 -0
  195. package/dist/gestures/touchActionRule.js +140 -0
  196. package/dist/gestures/types.d.ts +18 -7
  197. package/dist/gestures/types.d.ts.map +1 -1
  198. package/dist/gestures/types.js +22 -2
  199. package/dist/hooks/index.d.ts +1 -1
  200. package/dist/hooks/index.d.ts.map +1 -1
  201. package/dist/hooks/modalAnnounce.d.ts.map +1 -1
  202. package/dist/hooks/modalAnnounce.js +107 -61
  203. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  204. package/dist/hooks/useAdaptivePresentation.js +4 -1
  205. package/dist/hooks/useAnnounce.d.ts +101 -42
  206. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  207. package/dist/hooks/useAnnounce.js +161 -75
  208. package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
  209. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  210. package/dist/hooks/useAnnounceRenderedText.js +5 -3
  211. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  212. package/dist/hooks/useBusyAnnouncement.js +6 -12
  213. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  214. package/dist/hooks/useMenuHover.js +12 -1
  215. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  216. package/dist/i18n/generated-locales/en.generated.js +5 -0
  217. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  218. package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
  219. package/dist/motion/animator.d.ts +7 -1
  220. package/dist/motion/animator.d.ts.map +1 -1
  221. package/dist/motion/animator.js +119 -27
  222. package/dist/theme/defineTheme.d.ts +19 -5
  223. package/dist/theme/defineTheme.d.ts.map +1 -1
  224. package/dist/theme/defineTheme.js +64 -4
  225. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  226. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  227. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  228. package/dist/theme/domainTokens/index.d.ts +5 -4
  229. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  230. package/dist/theme/domainTokens/index.js +5 -9
  231. package/dist/theme/index.d.ts +1 -0
  232. package/dist/theme/index.d.ts.map +1 -1
  233. package/dist/theme/motionKnobs.d.ts +56 -0
  234. package/dist/theme/motionKnobs.d.ts.map +1 -0
  235. package/dist/theme/motionKnobs.js +48 -0
  236. package/dist/theme/resolveThemeValues.d.ts +11 -4
  237. package/dist/theme/resolveThemeValues.d.ts.map +1 -1
  238. package/dist/theme/resolveThemeValues.js +40 -4
  239. package/dist/theme/themeAdaptations.d.ts +7 -3
  240. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  241. package/dist/theme/themeAdaptations.js +36 -7
  242. package/dist/theme/themeMotion.d.ts +96 -0
  243. package/dist/theme/themeMotion.d.ts.map +1 -0
  244. package/dist/theme/themeMotion.js +177 -0
  245. package/dist/theme/tokenReferences.d.ts +31 -0
  246. package/dist/theme/tokenReferences.d.ts.map +1 -0
  247. package/dist/theme/tokenReferences.js +132 -0
  248. package/dist/theme/tokens.d.ts +1 -0
  249. package/dist/theme/tokens.d.ts.map +1 -1
  250. package/dist/theme/tokens.js +9 -129
  251. package/dist/theme/tokens.stylex.d.ts +12 -0
  252. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  253. package/dist/theme/tokens.stylex.js +12 -0
  254. package/dist/utils/focusReturn.d.ts +17 -1
  255. package/dist/utils/focusReturn.d.ts.map +1 -1
  256. package/dist/utils/focusReturn.js +11 -4
  257. package/dist/utils/getNodeText.d.ts +8 -0
  258. package/dist/utils/getNodeText.d.ts.map +1 -0
  259. package/dist/utils/getNodeText.js +37 -0
  260. package/dist/utils/interactionModality.d.ts +11 -2
  261. package/dist/utils/interactionModality.d.ts.map +1 -1
  262. package/dist/utils/interactionModality.js +58 -5
  263. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  264. package/dist/utils/interactionOverlay.stylex.js +17 -8
  265. package/dist/utils/plainDate.d.ts +2 -0
  266. package/dist/utils/plainDate.d.ts.map +1 -1
  267. package/dist/utils/plainDate.js +46 -3
  268. package/dist/utils/presentation.d.ts +50 -0
  269. package/dist/utils/presentation.d.ts.map +1 -0
  270. package/dist/utils/presentation.js +125 -0
  271. package/dist/utils/pressFeedback.d.ts.map +1 -1
  272. package/dist/utils/pressFeedback.js +20 -1
  273. package/dist/utils/primaryClick.d.ts +11 -0
  274. package/dist/utils/primaryClick.d.ts.map +1 -0
  275. package/dist/utils/primaryClick.js +25 -0
  276. package/dist/utils/timeFormat.d.ts +47 -0
  277. package/dist/utils/timeFormat.d.ts.map +1 -0
  278. package/dist/utils/timeFormat.js +240 -0
  279. package/dist/utils/touchPresentation.d.ts.map +1 -1
  280. package/dist/utils/touchPresentation.js +5 -3
  281. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  282. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  283. package/dist/utils/touchPresentation.stylex.js +33 -0
  284. package/dist/utils/unicodeDigits.d.ts +20 -0
  285. package/dist/utils/unicodeDigits.d.ts.map +1 -0
  286. package/dist/utils/unicodeDigits.js +70 -0
  287. package/locales/en.json +23 -3
  288. package/locales/pseudo.json +15 -0
  289. package/package.json +5 -4
  290. package/src/AlertDialog/AlertDialog.tsx +6 -5
  291. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  292. package/src/Avatar/Avatar.spec.md +22 -22
  293. package/src/Avatar/Avatar.tsx +18 -1
  294. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  295. package/src/Badge/Badge.doc.mjs +1 -1
  296. package/src/Badge/Badge.tsx +19 -2
  297. package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
  298. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  299. package/src/BottomSheet/BottomSheet.tsx +1 -1
  300. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  301. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  302. package/src/BottomSheet/useSheetGestures.ts +37 -6
  303. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  304. package/src/Button/Button.tsx +4 -4
  305. package/src/Calendar/Calendar.spec.md +87 -48
  306. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  307. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  308. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  309. package/src/ClickableCard/ClickableCard.test.tsx +96 -0
  310. package/src/ClickableCard/ClickableCard.tsx +48 -4
  311. package/src/Collapsible/Collapsible.spec.md +2 -0
  312. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  313. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  314. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  315. package/src/ComplexSelector/ComplexSelector.test.tsx +37 -0
  316. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  317. package/src/DateInput/DateInput.test.tsx +115 -3
  318. package/src/DateInput/DateInput.tsx +29 -14
  319. package/src/DateInput/DateInputTouch.test.tsx +76 -0
  320. package/src/DateInput/MonthScroller.tsx +106 -20
  321. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  322. package/src/DateInput/TouchDateField.tsx +14 -3
  323. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  324. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  325. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  326. package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
  327. package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
  328. package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
  329. package/src/DateTimeInput/DateTimeInput.tsx +46 -24
  330. package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
  331. package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
  332. package/src/Dialog/Dialog.test.tsx +216 -2
  333. package/src/Dialog/Dialog.tsx +42 -9
  334. package/src/Dialog/DialogHeader.tsx +5 -4
  335. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  336. package/src/Divider/Divider.tsx +2 -1
  337. package/src/Drawer/Drawer.spec.md +111 -80
  338. package/src/Drawer/Drawer.test.tsx +35 -0
  339. package/src/Drawer/Drawer.tsx +13 -2
  340. package/src/Drawer/DrawerHeader.spec.md +181 -0
  341. package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
  342. package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
  343. package/src/DropdownMenu/DropdownMenu.tsx +10 -3
  344. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  345. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  346. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  347. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  348. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
  349. package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
  350. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  351. package/src/EmptyState/EmptyState.tsx +2 -1
  352. package/src/Field/FieldLabel.tsx +5 -4
  353. package/src/Field/InputClearButton.tsx +3 -3
  354. package/src/Field/PanelSearchInput.tsx +2 -2
  355. package/src/FieldStatus/FieldStatus.tsx +2 -2
  356. package/src/FileInput/FileInput.test.tsx +21 -0
  357. package/src/FileInput/FileInput.tsx +4 -1
  358. package/src/FormLayout/FormLayout.spec.md +7 -8
  359. package/src/Heading/Heading.tsx +1 -1
  360. package/src/Icon/Icon.tsx +1 -1
  361. package/src/Indicator/CheckIndicator.spec.md +47 -42
  362. package/src/Indicator/CheckIndicator.tsx +2 -1
  363. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  364. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  365. package/src/Indicator/Indicator.spec.md +188 -0
  366. package/src/Indicator/RadioIndicator.tsx +3 -1
  367. package/src/Item/Item.tsx +2 -1
  368. package/src/Item/ItemSwipeLayer.tsx +1 -1
  369. package/src/Kbd/Kbd.spec.md +81 -38
  370. package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
  371. package/src/Layer/popoverOperations.test.ts +205 -0
  372. package/src/Layer/popoverOperations.ts +172 -0
  373. package/src/Layer/useLayer.test.tsx +348 -1
  374. package/src/Layer/useLayer.tsx +118 -71
  375. package/src/Layout/Layout.spec.md +127 -131
  376. package/src/Layout/Layout.tsx +1 -1
  377. package/src/Layout/LayoutContent.spec.md +205 -0
  378. package/src/Layout/LayoutContent.tsx +1 -1
  379. package/src/Layout/LayoutFooter.spec.md +190 -0
  380. package/src/Layout/LayoutFooter.tsx +1 -1
  381. package/src/Layout/LayoutHeader.spec.md +193 -0
  382. package/src/Layout/LayoutHeader.tsx +1 -1
  383. package/src/Layout/LayoutPanel.spec.md +194 -0
  384. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  385. package/src/Lightbox/Lightbox.test.tsx +18 -0
  386. package/src/Lightbox/Lightbox.tsx +5 -0
  387. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  388. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  389. package/src/List/List.tsx +1 -1
  390. package/src/List/ListItem.spec.md +205 -0
  391. package/src/List/ListItem.tsx +3 -3
  392. package/src/MetadataList/MetadataList.spec.md +187 -0
  393. package/src/MetadataList/MetadataListItem.spec.md +165 -0
  394. package/src/MobileNav/MobileNav.test.tsx +15 -0
  395. package/src/MobileNav/MobileNav.tsx +9 -1
  396. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  397. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  398. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
  399. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  400. package/src/MultiSelector/MultiSelector.test.tsx +270 -1
  401. package/src/MultiSelector/MultiSelector.tsx +25 -10
  402. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  403. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  404. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  405. package/src/NumberInput/NumberInput.spec.md +59 -37
  406. package/src/NumberInput/NumberInput.tsx +13 -3
  407. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  408. package/src/NumberInput/numberParser.ts +7 -45
  409. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  410. package/src/ProgressBar/ProgressBar.tsx +58 -10
  411. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  412. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  413. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  414. package/src/Resizable/useResizable.test.ts +43 -0
  415. package/src/Resizable/useResizable.ts +32 -9
  416. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  417. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  418. package/src/Selector/Selector.test.tsx +90 -1
  419. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  420. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  421. package/src/Selector/useSelectorPresentation.ts +31 -3
  422. package/src/SideNav/SideNav.test.tsx +27 -0
  423. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
  424. package/src/Skeleton/Skeleton.tsx +3 -1
  425. package/src/Slider/Slider.test.tsx +31 -0
  426. package/src/Slider/Slider.tsx +8 -3
  427. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  428. package/src/Spinner/Spinner.tsx +5 -3
  429. package/src/Stack/Stack.tsx +1 -1
  430. package/src/Stack/StackItem.tsx +1 -1
  431. package/src/TabList/TabList.test.tsx +58 -4
  432. package/src/TabList/TabList.tsx +16 -1
  433. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  434. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  435. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  436. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  437. package/src/Text/Text.tsx +1 -1
  438. package/src/Text/useTruncation.test.tsx +128 -1
  439. package/src/Text/useTruncation.ts +23 -5
  440. package/src/TextArea/TextArea.spec.md +10 -13
  441. package/src/TextArea/TextArea.test.tsx +60 -0
  442. package/src/TextArea/TextArea.tsx +15 -1
  443. package/src/TextInput/TextInput.test.tsx +21 -0
  444. package/src/TextInput/TextInput.tsx +3 -1
  445. package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
  446. package/src/TimeInput/Presentation.test.tsx +21 -0
  447. package/src/TimeInput/TimeInput.doc.mjs +8 -8
  448. package/src/TimeInput/TimeInput.spec.md +45 -48
  449. package/src/TimeInput/TimeInput.test.tsx +76 -0
  450. package/src/TimeInput/TimeInput.tsx +36 -18
  451. package/src/TimeInput/TouchTimeField.tsx +4 -6
  452. package/src/Timestamp/Timestamp.spec.md +6 -12
  453. package/src/Timestamp/Timestamp.test.tsx +30 -5
  454. package/src/Timestamp/Timestamp.tsx +6 -2
  455. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  456. package/src/Toast/Toast.spec.md +14 -20
  457. package/src/Toast/Toast.tsx +104 -36
  458. package/src/Toast/ToastViewport.test.tsx +719 -1
  459. package/src/Toast/ToastViewport.tsx +100 -50
  460. package/src/Tokenizer/Tokenizer.spec.md +5 -3
  461. package/src/Tokenizer/Tokenizer.test.tsx +68 -0
  462. package/src/Tokenizer/Tokenizer.tsx +14 -2
  463. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
  464. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  465. package/src/Toolbar/Toolbar.spec.md +5 -6
  466. package/src/Toolbar/Toolbar.test.tsx +30 -0
  467. package/src/Toolbar/Toolbar.tsx +2 -1
  468. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  469. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  470. package/src/TopNav/TopNav.test.tsx +27 -0
  471. package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
  472. package/src/TopNav/TopNavMegaMenu.tsx +4 -1
  473. package/src/TopNav/TopNavMenu.test.tsx +17 -0
  474. package/src/TopNav/TopNavMenu.tsx +1 -0
  475. package/src/Typeahead/Typeahead.test.tsx +40 -0
  476. package/src/Typeahead/Typeahead.tsx +12 -1
  477. package/src/__tests__/pressState.ts +8 -4
  478. package/src/gestures/GestureArena.ts +35 -0
  479. package/src/gestures/GestureHost.ts +2065 -0
  480. package/src/gestures/GestureRecognizer.ts +18 -0
  481. package/src/gestures/LongPressGestureRecognizer.ts +4 -0
  482. package/src/gestures/PanGestureRecognizer.ts +4 -0
  483. package/src/gestures/PinchGestureRecognizer.ts +148 -0
  484. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
  485. package/src/gestures/SwipeGestureRecognizer.ts +197 -0
  486. package/src/gestures/TapGestureRecognizer.ts +4 -0
  487. package/src/gestures/VelocityTracker.ts +10 -3
  488. package/src/gestures/__tests__/GestureHost.test.ts +2087 -0
  489. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  490. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  491. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  492. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  493. package/src/gestures/__tests__/arena.test.ts +5 -0
  494. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
  495. package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
  496. package/src/gestures/__tests__/browser/fixture.ts +307 -0
  497. package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
  498. package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
  499. package/src/gestures/__tests__/haptics.test.ts +187 -0
  500. package/src/gestures/__tests__/harness.ts +21 -2
  501. package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
  502. package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
  503. package/src/gestures/haptics.ts +203 -0
  504. package/src/gestures/nativeScroll.ts +277 -0
  505. package/src/gestures/touchAction.ts +191 -0
  506. package/src/gestures/touchActionRule.ts +157 -0
  507. package/src/gestures/types.ts +30 -9
  508. package/src/hooks/index.ts +5 -1
  509. package/src/hooks/modalAnnounce.ts +129 -72
  510. package/src/hooks/useAdaptivePresentation.ts +4 -1
  511. package/src/hooks/useAnnounce.doc.mjs +35 -3
  512. package/src/hooks/useAnnounce.replace.test.tsx +516 -0
  513. package/src/hooks/useAnnounce.ts +209 -102
  514. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
  515. package/src/hooks/useAnnounceRenderedText.ts +17 -3
  516. package/src/hooks/useBusyAnnouncement.ts +7 -10
  517. package/src/hooks/useMenuHover.ts +15 -1
  518. package/src/i18n/generated-locales/en.generated.ts +6 -0
  519. package/src/i18n/generated-locales/pseudo.generated.ts +6 -0
  520. package/src/motion/README.md +11 -1
  521. package/src/motion/animator.test.ts +151 -3
  522. package/src/motion/animator.ts +149 -33
  523. package/src/theme/Theme.doc.mjs +1 -1
  524. package/src/theme/defineTheme.ts +117 -8
  525. package/src/theme/derivedVarRegistry.test.ts +4 -0
  526. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  527. package/src/theme/domainTokens/index.ts +6 -10
  528. package/src/theme/expandMotionScale.test.ts +1 -1
  529. package/src/theme/index.ts +5 -0
  530. package/src/theme/motionKnobs.ts +82 -0
  531. package/src/theme/resolveThemeValues.ts +68 -6
  532. package/src/theme/themeAdaptations.ts +52 -12
  533. package/src/theme/themeMotion.test.ts +620 -0
  534. package/src/theme/themeMotion.ts +221 -0
  535. package/src/theme/tokenReferences.ts +149 -0
  536. package/src/theme/tokens.stylex.ts +10 -0
  537. package/src/theme/tokens.ts +15 -158
  538. package/src/utils/focusReturn.ts +17 -6
  539. package/src/utils/getNodeText.test.ts +24 -0
  540. package/src/utils/getNodeText.ts +37 -0
  541. package/src/utils/interactionModality.test.ts +45 -1
  542. package/src/utils/interactionModality.ts +64 -5
  543. package/src/utils/interactionOverlay.stylex.ts +12 -3
  544. package/src/utils/plainDate.test.ts +90 -0
  545. package/src/utils/plainDate.ts +58 -3
  546. package/src/utils/presentation.test.ts +380 -0
  547. package/src/utils/presentation.ts +180 -0
  548. package/src/utils/pressFeedback.test.ts +138 -0
  549. package/src/utils/pressFeedback.ts +34 -11
  550. package/src/utils/pressPaintPriority.test.ts +80 -0
  551. package/src/utils/primaryClick.test.ts +38 -0
  552. package/src/utils/primaryClick.ts +28 -0
  553. package/src/utils/timeFormat.test.ts +204 -0
  554. package/src/utils/timeFormat.ts +314 -0
  555. package/src/utils/touchPresentation.stylex.ts +43 -0
  556. package/src/utils/touchPresentation.test.ts +140 -1
  557. package/src/utils/touchPresentation.ts +5 -3
  558. package/src/utils/unicodeDigits.test.ts +44 -0
  559. package/src/utils/unicodeDigits.ts +71 -0
@@ -0,0 +1,240 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file timeFormat.ts
5
+ * @input An ISO time or typed text, plus the provider's BCP 47 locale
6
+ * @output Exports resolveHourFormat, formatLocaleTime, and parseLocaleTime
7
+ * @position Internal shared helper for TimeInput and DateTimeInput; not part
8
+ * of the public surface
9
+ *
10
+ * Time of day as the locale writes it. The hour cycle, digits, separator, and
11
+ * day-period words all come from Intl rather than a table, so a field reads
12
+ * the same way `Timestamp` does beside it.
13
+ *
14
+ * The hour cycle is the locale's own: `en-US` and `ko-KR` read twelve-hour,
15
+ * `en-GB`, `de-DE`, and `vi-VN` read twenty-four-hour. A `-u-hc-` extension
16
+ * on the provider locale (`en-US-u-hc-h23`) carries an app's per-user
17
+ * preference through the same path, so every Astryx time honors it.
18
+ *
19
+ * The parser reads back what the formatter writes: the locale's digits, its
20
+ * hour-minute separator, and its day-period words, on either side of the time.
21
+ * Whatever is left goes through the shared English-tolerant parser, so "2:30
22
+ * PM" and "14:30" keep working in every locale.
23
+ *
24
+ * SYNC: When modified, update these files to stay in sync:
25
+ * - /packages/core/src/utils/timeFormat.test.ts
26
+ * - /packages/core/src/TimeInput/TimeInput.tsx
27
+ * - /packages/core/src/DateTimeInput/DateTimeInput.tsx
28
+ */
29
+
30
+ import { parseISOTime, parseTimeInput } from "./timeParser.js";
31
+ import { INVISIBLE_CHARS, toAsciiDigits } from "./unicodeDigits.js";
32
+ const symbolsByLocale = new Map();
33
+
34
+ // The space family Intl writes between a time and its day period ("2:30 PM"
35
+ // uses U+202F). A typed field shows a plain space so people can edit it.
36
+ const SPACES = /[\u00A0\u2007\u202F]/g;
37
+ // What may sit on a peeled word's inner side: a digit (digits are already
38
+ // ASCII here), whitespace, or nothing.
39
+ const WORD_BOUNDARY = /^[\d\s]?$/;
40
+ function utcDate(hour, minute, second) {
41
+ return new Date(Date.UTC(2000, 0, 1, hour, minute, second));
42
+ }
43
+ function timeFormatter(locale, hourFormat, includeSeconds) {
44
+ const options = {
45
+ hour: hourFormat === '12h' ? 'numeric' : '2-digit',
46
+ minute: '2-digit',
47
+ second: includeSeconds ? '2-digit' : undefined,
48
+ // `hourCycle`, not `hour12`: `hour12: true` resolves to h11 in ja-JP and
49
+ // writes noon as "午後0:30".
50
+ hourCycle: hourFormat === '12h' ? 'h12' : 'h23',
51
+ timeZone: 'UTC'
52
+ };
53
+ try {
54
+ return new Intl.DateTimeFormat(locale, options);
55
+ } catch {
56
+ return new Intl.DateTimeFormat('en', options);
57
+ }
58
+ }
59
+ function getLocaleTimeSymbols(locale) {
60
+ let symbols = symbolsByLocale.get(locale);
61
+ if (symbols !== undefined) {
62
+ return symbols;
63
+ }
64
+ let hourFormat;
65
+ let resolved;
66
+ try {
67
+ resolved = new Intl.DateTimeFormat(locale, {
68
+ hour: 'numeric'
69
+ }).resolvedOptions();
70
+ } catch {
71
+ // A malformed tag formats as English everywhere else in this module.
72
+ resolved = new Intl.DateTimeFormat('en', {
73
+ hour: 'numeric'
74
+ }).resolvedOptions();
75
+ }
76
+ if (resolved.hourCycle !== undefined) {
77
+ hourFormat = resolved.hourCycle === 'h11' || resolved.hourCycle === 'h12' ? '12h' : '24h';
78
+ } else {
79
+ // Engines that leave hourCycle unresolved still write a day period for a
80
+ // twelve-hour locale when no cycle is forced.
81
+ let ambient;
82
+ try {
83
+ ambient = new Intl.DateTimeFormat(locale, {
84
+ hour: 'numeric'
85
+ });
86
+ } catch {
87
+ ambient = new Intl.DateTimeFormat('en', {
88
+ hour: 'numeric'
89
+ });
90
+ }
91
+ hourFormat = ambient.formatToParts(utcDate(13, 0, 0)).some(part => part.type === 'dayPeriod') ? '12h' : '24h';
92
+ }
93
+
94
+ // Literals of every reading this module writes: twelve- and twenty-four-hour,
95
+ // with and without seconds. A literal between two numbers is a separator;
96
+ // one outside them is an edge word.
97
+ const separatorSet = new Set();
98
+ const edgeSet = new Set();
99
+ for (const cycle of ['12h', '24h']) {
100
+ for (const withSeconds of [false, true]) {
101
+ const parts = timeFormatter(locale, cycle, withSeconds).formatToParts(utcDate(13, 30, 5));
102
+ const isNumber = part => part.type === 'hour' || part.type === 'minute' || part.type === 'second';
103
+ const first = parts.findIndex(isNumber);
104
+ const last = parts.length - 1 - [...parts].reverse().findIndex(isNumber);
105
+ parts.forEach((part, index) => {
106
+ if (part.type !== 'literal') {
107
+ return;
108
+ }
109
+ const text = normalizeText(part.value).trim();
110
+ if (text === '' || text === ':') {
111
+ return;
112
+ }
113
+ (index > first && index < last ? separatorSet : edgeSet).add(text);
114
+ });
115
+ }
116
+ }
117
+ const separators = [...separatorSet];
118
+ const edgeWords = [...edgeSet].sort((a, b) => b.length - a.length);
119
+
120
+ // Every hour, because some locales name several periods across the day
121
+ // (flexible day periods). A word that appears on both sides of noon cannot
122
+ // say which half it means, so it is left out.
123
+ const twelveHour = timeFormatter(locale, '12h', false);
124
+ const sides = new Map();
125
+ for (let hour = 0; hour < 24; hour++) {
126
+ const word = twelveHour.formatToParts(utcDate(hour, 0, 0)).find(part => part.type === 'dayPeriod')?.value;
127
+ if (word === undefined) {
128
+ continue;
129
+ }
130
+ const key = normalizeText(word).trim();
131
+ if (key === '') {
132
+ continue;
133
+ }
134
+ const seen = sides.get(key) ?? new Set();
135
+ seen.add(hour >= 12);
136
+ sides.set(key, seen);
137
+ }
138
+ const dayPeriods = [...sides].filter(([, seen]) => seen.size === 1).map(([word, seen]) => ({
139
+ word,
140
+ isPM: seen.has(true)
141
+ })).sort((a, b) => b.word.length - a.word.length);
142
+ const twelveHourIsAmbiguous = normalizeText(twelveHour.format(utcDate(2, 0, 0))) === normalizeText(twelveHour.format(utcDate(14, 0, 0)));
143
+ symbols = {
144
+ hourFormat,
145
+ separators,
146
+ edgeWords,
147
+ dayPeriods,
148
+ twelveHourIsAmbiguous
149
+ };
150
+ symbolsByLocale.set(locale, symbols);
151
+ return symbols;
152
+ }
153
+ function normalizeText(text) {
154
+ const folded = text.normalize('NFKC').replace(INVISIBLE_CHARS, '').replace(SPACES, ' ');
155
+ return (toAsciiDigits(folded) ?? folded).toLowerCase();
156
+ }
157
+ function escapeRegExp(text) {
158
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
159
+ }
160
+
161
+ /**
162
+ * The hour format a field shows: the caller's explicit choice, else the
163
+ * locale's hour cycle (including a `-u-hc-` extension on the tag).
164
+ */
165
+ export function resolveHourFormat(locale, hourFormat) {
166
+ return hourFormat ?? getLocaleTimeSymbols(locale).hourFormat;
167
+ }
168
+
169
+ /**
170
+ * Formats an ISO time as the locale writes it, in the given hour format.
171
+ * en-US: "14:30" → "2:30 PM"; de-DE 24h: "14:30"; ko-KR 12h: "오후 2:30".
172
+ * Returns '' for an empty or malformed time.
173
+ */
174
+ export function formatLocaleTime(time, locale, hourFormat, includeSeconds = false) {
175
+ if (!time) {
176
+ return '';
177
+ }
178
+ const parsed = parseISOTime(time);
179
+ if (!parsed) {
180
+ return '';
181
+ }
182
+ const formatLocale = hourFormat === '12h' && getLocaleTimeSymbols(locale).twelveHourIsAmbiguous ? 'en' : locale;
183
+ return timeFormatter(formatLocale, hourFormat, includeSeconds).format(utcDate(parsed.hour, parsed.minute, parsed.second)).replace(SPACES, ' ');
184
+ }
185
+
186
+ /**
187
+ * Parses typed text into an ISO time, accepting the locale's digits,
188
+ * separator, and day-period words as well as everything `parseTimeInput`
189
+ * accepts. Returns null when no reading fits.
190
+ */
191
+ export function parseLocaleTime(input, locale, includeSeconds = false) {
192
+ if (!input) {
193
+ return null;
194
+ }
195
+ const {
196
+ separators,
197
+ edgeWords,
198
+ dayPeriods
199
+ } = getLocaleTimeSymbols(locale);
200
+ let text = normalizeText(input).trim();
201
+
202
+ // Peel the day period and edge words off both ends, in whatever order the
203
+ // locale writes them ("ŋdi ga 2:30", "kl. 2.30 pm").
204
+ let isPM = null;
205
+ // A word counts only when a digit, whitespace, or nothing sits on its inner
206
+ // side, so gd's "m" (morning) is not read out of an English "pm" or "p.m".
207
+ const strip = word => {
208
+ if (text.startsWith(word) && WORD_BOUNDARY.test(text.charAt(word.length))) {
209
+ text = text.slice(word.length).trim();
210
+ return true;
211
+ }
212
+ if (text.endsWith(word) && WORD_BOUNDARY.test(text.charAt(text.length - word.length - 1))) {
213
+ text = text.slice(0, -word.length).trim();
214
+ return true;
215
+ }
216
+ return false;
217
+ };
218
+ for (let peeled = true; peeled;) {
219
+ peeled = false;
220
+ if (isPM === null) {
221
+ const period = dayPeriods.find(({
222
+ word
223
+ }) => strip(word));
224
+ if (period !== undefined) {
225
+ isPM = period.isPM;
226
+ peeled = true;
227
+ }
228
+ }
229
+ if (edgeWords.some(strip)) {
230
+ peeled = true;
231
+ }
232
+ }
233
+ for (const separator of separators) {
234
+ text = text.replace(new RegExp(`(\\d)\\s*${escapeRegExp(separator)}\\s*(?=\\d)`, 'g'), '$1:');
235
+ }
236
+ if (isPM !== null) {
237
+ text = `${text} ${isPM ? 'pm' : 'am'}`;
238
+ }
239
+ return parseTimeInput(text, includeSeconds);
240
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"touchPresentation.d.ts","sourceRoot":"","sources":["../../src/utils/touchPresentation.ts"],"names":[],"mappings":"AA6DA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,2BAA2B,CAAC;AAGnC,uDAAuD;AACvD,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,QAAmC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,QACe,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,kCAAkC,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,kFAGvB,CAAC;AAEX,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAOxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAC7C,iBAAiB,CAQnB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,EAAE,iBAAiB,GACzB,iBAAiB,CAOnB"}
1
+ {"version":3,"file":"touchPresentation.d.ts","sourceRoot":"","sources":["../../src/utils/touchPresentation.ts"],"names":[],"mappings":"AA+DA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,2BAA2B,CAAC;AAGnC,uDAAuD;AACvD,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,QAAmC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,QACe,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,kCAAkC,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,kFAGvB,CAAC;AAEX,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAOxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAC7C,iBAAiB,CAQnB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,EAAE,iBAAiB,GACzB,iBAAiB,CAOnB"}
@@ -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).
@@ -0,0 +1,15 @@
1
+ export declare const touchKeys: {
2
+ /** The primary pointer is coarse (TOUCH_QUERY). */
3
+ touch: string;
4
+ /** The viewport is compact (COMPACT_QUERY, `spec:AST-012` FR9). */
5
+ compact: string;
6
+ /** Both: a presentation such as a sheet in place of a popover. */
7
+ compactTouch: string;
8
+ /**
9
+ * The iOS WebKit gate, inside `touch` (IOS_SUPPORTS_QUERY): only for a
10
+ * style iOS WebKit itself requires (the 16px input floor), never a
11
+ * behaviour; touch behaviour is one model on every touch device.
12
+ */
13
+ iosSupports: string;
14
+ };
15
+ //# sourceMappingURL=touchPresentation.stylex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"touchPresentation.stylex.d.ts","sourceRoot":"","sources":["../../src/utils/touchPresentation.stylex.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,SAAS;IACpB,mDAAmD;;IAEnD,mEAAmE;;IAEnE,kEAAkE;;IAGlE;;;;OAIG;;CAEH,CAAC"}
@@ -0,0 +1,33 @@
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
+ export const touchKeys = {
29
+ touch: "@media (pointer: coarse)",
30
+ compact: "@media (width < 768px), (height < 500px)",
31
+ compactTouch: "@media (width < 768px) and (pointer: coarse), (height < 500px) and (pointer: coarse)",
32
+ iosSupports: "@supports (-webkit-touch-callout: none)"
33
+ };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Zero-width joiners, bidi marks and isolates (which Intl writes around RTL
3
+ * numbers and day periods), and the BOM Excel prepends.
4
+ */
5
+ export declare const INVISIBLE_CHARS: RegExp;
6
+ /**
7
+ * Value of any Unicode decimal digit. Each digit script lays its ten digits
8
+ * out consecutively, so walking back to the script's zero derives the value
9
+ * for Arabic-Indic, Devanagari, full-width and the rest without shipping a
10
+ * table of them. Returns null for a non-digit, and in the one shape the walk
11
+ * cannot resolve: two digit blocks adjacent in code space (the mathematical
12
+ * alphanumerics).
13
+ */
14
+ export declare function digitValue(char: string): number | null;
15
+ /**
16
+ * Rewrites every decimal digit as its ASCII digit, leaving other characters
17
+ * alone. Returns null when a digit's value cannot be resolved.
18
+ */
19
+ export declare function toAsciiDigits(text: string): string | null;
20
+ //# sourceMappingURL=unicodeDigits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unicodeDigits.d.ts","sourceRoot":"","sources":["../../src/utils/unicodeDigits.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,eAAO,MAAM,eAAe,QAC6B,CAAC;AAE1D;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAczD"}
@@ -0,0 +1,70 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file unicodeDigits.ts
5
+ * @input Text in any digit script
6
+ * @output Exports INVISIBLE_CHARS, digitValue, and toAsciiDigits
7
+ * @position Internal shared utility for the locale-aware parsers
8
+ * (NumberInput/numberParser.ts, utils/timeFormat.ts); not part of the
9
+ * public surface
10
+ *
11
+ * Locale-independent: a digit's value is a Unicode property, not a locale
12
+ * preference, so this needs no Intl and no locale.
13
+ *
14
+ * SYNC: When modified, update these files to stay in sync:
15
+ * - /packages/core/src/utils/unicodeDigits.test.ts
16
+ */
17
+
18
+ // Built at runtime rather than written as a literal: Babel's
19
+ // transform-unicode-property-regex rewrites a `\p{...}` regex LITERAL into an
20
+ // enumerated character class, and the copy bundled with Next rejects the
21
+ // General_Category short names, failing the sandbox build. Property escapes are
22
+ // ES2018 and need no transform in any browser this package supports.
23
+ const DECIMAL_DIGIT = new RegExp('\\p{Nd}', 'u');
24
+
25
+ /**
26
+ * Zero-width joiners, bidi marks and isolates (which Intl writes around RTL
27
+ * numbers and day periods), and the BOM Excel prepends.
28
+ */
29
+ export const INVISIBLE_CHARS = /[\u200B-\u200D\u200E\u200F\u061C\u2066-\u2069\uFEFF]/g;
30
+
31
+ /**
32
+ * Value of any Unicode decimal digit. Each digit script lays its ten digits
33
+ * out consecutively, so walking back to the script's zero derives the value
34
+ * for Arabic-Indic, Devanagari, full-width and the rest without shipping a
35
+ * table of them. Returns null for a non-digit, and in the one shape the walk
36
+ * cannot resolve: two digit blocks adjacent in code space (the mathematical
37
+ * alphanumerics).
38
+ */
39
+ export function digitValue(char) {
40
+ const codePoint = char.codePointAt(0);
41
+ if (codePoint == null || !DECIMAL_DIGIT.test(char)) {
42
+ return null;
43
+ }
44
+ for (let zero = codePoint; codePoint - zero < 10; zero--) {
45
+ if (!DECIMAL_DIGIT.test(String.fromCodePoint(zero - 1))) {
46
+ return codePoint - zero;
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+
52
+ /**
53
+ * Rewrites every decimal digit as its ASCII digit, leaving other characters
54
+ * alone. Returns null when a digit's value cannot be resolved.
55
+ */
56
+ export function toAsciiDigits(text) {
57
+ let out = '';
58
+ for (const char of text) {
59
+ if (!DECIMAL_DIGIT.test(char)) {
60
+ out += char;
61
+ continue;
62
+ }
63
+ const value = digitValue(char);
64
+ if (value == null) {
65
+ return null;
66
+ }
67
+ out += String(value);
68
+ }
69
+ return out;
70
+ }
package/locales/en.json CHANGED
@@ -791,6 +791,14 @@
791
791
  "defaultMessage": "Open menu",
792
792
  "description": "Screen-reader-only label on the `⋯` overflow-menu button embedded in a SideNav section heading. Same string as `topNav.heading.openMenu` — translations may share."
793
793
  },
794
+ "@astryx.slider.minimumThumb": {
795
+ "defaultMessage": "Minimum value",
796
+ "description": "Accessible name of the lower thumb of a range Slider (two thumbs), announced together with the Slider's own label, for example \"Price range, Minimum value, 20\". Never shown on screen."
797
+ },
798
+ "@astryx.slider.maximumThumb": {
799
+ "defaultMessage": "Maximum value",
800
+ "description": "Accessible name of the upper thumb of a range Slider (two thumbs), announced together with the Slider's own label, for example \"Price range, Maximum value, 80\". Never shown on screen."
801
+ },
794
802
  "@astryx.tabList.label": {
795
803
  "defaultMessage": "Tabs",
796
804
  "description": "Screen-reader-only fallback name for a horizontal tab bar. Plural noun; \"Tabs\" here = UI tab panels, not browser tabs or the Tab key."
@@ -803,6 +811,10 @@
803
811
  "defaultMessage": "No data",
804
812
  "description": "Fallback empty-state text in the table body when there are zero rows. Neutral tone (not error-y); consumers commonly override with something specific like \"No results\"."
805
813
  },
814
+ "@astryx.table.columnResize.resizeColumn": {
815
+ "defaultMessage": "Resize column {label}",
816
+ "description": "Accessible name for a Table column-resize handle (a vertical separator between header cells). `label` is the column header's visible text, or the column key when the header has no text."
817
+ },
806
818
  "@astryx.table.filter.allPlaceholder": {
807
819
  "defaultMessage": "All",
808
820
  "description": "Placeholder on a per-column filter dropdown when nothing is selected, meaning \"no filter — all rows match\". Determiner form (as in \"all values\"), not the pronoun."
@@ -1009,11 +1021,11 @@
1009
1021
  },
1010
1022
  "@astryx.dateTimeInput.timeHint12h": {
1011
1023
  "defaultMessage": "e.g., 2:30 PM",
1012
- "description": "Placeholder hint shown in the DateTimeInput time field when focused and empty with 12-hour format. Gives an example of expected input format."
1024
+ "description": "Placeholder hint shown in the TimeInput and DateTimeInput time fields when focused and empty with 12-hour format. Gives an example of expected input format; write the example time as your locale writes 12-hour time."
1013
1025
  },
1014
1026
  "@astryx.dateTimeInput.timeHint24h": {
1015
1027
  "defaultMessage": "e.g., 14:30",
1016
- "description": "Placeholder hint shown in the DateTimeInput time field when focused and empty with 24-hour format. Gives an example of expected input format."
1028
+ "description": "Placeholder hint shown in the TimeInput and DateTimeInput time fields when focused and empty with 24-hour format. Gives an example of expected input format; write the example time as your locale writes 24-hour time."
1017
1029
  },
1018
1030
  "@astryx.dateTimeInput.timeSuffix": {
1019
1031
  "defaultMessage": "{label} time",
@@ -1567,6 +1579,10 @@
1567
1579
  "defaultMessage": "Expand all rows",
1568
1580
  "description": "Aria label for the Table tree-data header toggle when rows are collapsed and clicking it expands them."
1569
1581
  },
1582
+ "@astryx.textArea.counter": {
1583
+ "defaultMessage": "{count, number}/{limit, number}",
1584
+ "description": "Visible character counter at the bottom of a TextArea that has a character limit, for example `62/2,000`. `{count}` is the characters typed so far and `{limit}` the limit; keep both numbers and reorder or change the separator if your language needs to."
1585
+ },
1570
1586
  "@astryx.textArea.charactersRemaining": {
1571
1587
  "defaultMessage": "{count, number} {count, plural, one {character} other {characters}} remaining",
1572
1588
  "description": "Screen-reader-only announcement of how many characters the user can still type before hitting a TextArea's maxLength. Announced politely as the count nears the limit. `{count}` is the number remaining — example: `12 characters remaining`."
@@ -1643,6 +1659,10 @@
1643
1659
  "defaultMessage": "{count, number} of {total, number} selected",
1644
1660
  "description": "Polite screen-reader announcement of how many MultiSelector options are selected out of the total, spoken after each toggle. Live-region text, never shown on screen; example: `3 of 12 selected`."
1645
1661
  },
1662
+ "@astryx.multiSelector.selectedCount": {
1663
+ "defaultMessage": "{count, plural, one {# selected} other {# selected}}",
1664
+ "description": "Visible text on a closed MultiSelector's trigger when it shows a count of the chosen options (`triggerDisplay=\"count\"`), for example `2 selected`. `{count}` is the number of chosen options; use a plural form if your language needs one."
1665
+ },
1646
1666
  "@astryx.multiSelector.createOption": {
1647
1667
  "defaultMessage": "Create \"{query}\"",
1648
1668
  "description": "Label of the first row in a MultiSelector's search panel when `hasCreate` is set and the typed text matches no option. Picking it reports a creation to the caller. `{query}` is the trimmed text the person typed, shown in quotes."
@@ -1693,7 +1713,7 @@
1693
1713
  },
1694
1714
  "@astryx.tokenizer.create": {
1695
1715
  "defaultMessage": "Create \"{value}\"",
1696
- "description": "Label of the create row inside a Tokenizer's bottom sheet when `hasCreate` is set and the typed text matches no existing item. `{value}` is the typed text, e.g. `Create \"Marketing\"`."
1716
+ "description": "Label of a Tokenizer's create row, in the inline menu and the bottom sheet, when `hasCreate` is set and the typed text matches no existing item. `{value}` is the typed text, e.g. `Create \"Marketing\"`."
1697
1717
  },
1698
1718
  "@astryx.tokenizer.add": {
1699
1719
  "defaultMessage": "Add",
@@ -593,6 +593,12 @@
593
593
  "@astryx.sideNav.heading.openMenu": {
594
594
  "defaultMessage": "⟦Óþéñ ɱéñú⟧"
595
595
  },
596
+ "@astryx.slider.minimumThumb": {
597
+ "defaultMessage": "⟦Ṁíñíɱúɱ ṽàłúé⟧"
598
+ },
599
+ "@astryx.slider.maximumThumb": {
600
+ "defaultMessage": "⟦Ṁàẋíɱúɱ ṽàłúé⟧"
601
+ },
596
602
  "@astryx.tabList.label": {
597
603
  "defaultMessage": "⟦Ţàƀš⟧"
598
604
  },
@@ -602,6 +608,9 @@
602
608
  "@astryx.table.noData": {
603
609
  "defaultMessage": "⟦Ñó ðàţà⟧"
604
610
  },
611
+ "@astryx.table.columnResize.resizeColumn": {
612
+ "defaultMessage": "⟦Řéšížé çółúɱñ {label}⟧"
613
+ },
605
614
  "@astryx.table.filter.allPlaceholder": {
606
615
  "defaultMessage": "⟦Àłł⟧"
607
616
  },
@@ -1175,6 +1184,9 @@
1175
1184
  "@astryx.tableTree.expandAllRows": {
1176
1185
  "defaultMessage": "⟦Éẋþàñð àłł řóŵš⟧"
1177
1186
  },
1187
+ "@astryx.textArea.counter": {
1188
+ "defaultMessage": "⟦{count, number}/{limit, number}⟧"
1189
+ },
1178
1190
  "@astryx.textArea.charactersRemaining": {
1179
1191
  "defaultMessage": "⟦{count, number} {count, plural, one {character} other {characters}} řéɱàíñíñĝ⟧"
1180
1192
  },
@@ -1232,6 +1244,9 @@
1232
1244
  "@astryx.multiSelector.selectionCount": {
1233
1245
  "defaultMessage": "⟦{count, number} óƒ {total, number} šéłéçţéð⟧"
1234
1246
  },
1247
+ "@astryx.multiSelector.selectedCount": {
1248
+ "defaultMessage": "⟦{count, plural, one {# selected} other {# selected}}⟧"
1249
+ },
1235
1250
  "@astryx.multiSelector.createOption": {
1236
1251
  "defaultMessage": "⟦Çřéàţé \"{query}\"⟧"
1237
1252
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/core",
3
- "version": "0.7.5",
3
+ "version": "0.7.6-canary.0ef60dd",
4
4
  "displayName": "Astryx Core",
5
5
  "description": "The component library. Accessible, themeable React components with built-in spacing, dark mode, and StyleX styling.",
6
6
  "author": "Meta Open Source",
@@ -847,6 +847,9 @@
847
847
  "react-dom": ">=19.0.0"
848
848
  },
849
849
  "devDependencies": {
850
+ "@astryxdesign/a11y-spec": "0.7.6-canary.0ef60dd",
851
+ "@astryxdesign/cli": "0.7.6-canary.0ef60dd",
852
+ "@astryxdesign/interaction-harness": "0.7.6-canary.0ef60dd",
850
853
  "@babel/cli": "^7.29.7",
851
854
  "@babel/core": "^7.29.7",
852
855
  "@babel/preset-react": "^7.29.7",
@@ -857,9 +860,7 @@
857
860
  "@testing-library/jest-dom": "^6.6.0",
858
861
  "@testing-library/react": "^16.3.2",
859
862
  "@types/babel__core": "^7.20.5",
860
- "tailwindcss": "^4.3.2",
861
- "@astryxdesign/cli": "0.7.5",
862
- "@astryxdesign/a11y-spec": "0.0.0"
863
+ "tailwindcss": "^4.3.2"
863
864
  },
864
865
  "dependencies": {
865
866
  "intl-messageformat": "^11.2.9"
@@ -18,18 +18,19 @@
18
18
 
19
19
  import React, {useId, useCallback} from 'react';
20
20
  import * as stylex from '@stylexjs/stylex';
21
- import {Dialog} from '../Dialog';
21
+ import {Dialog} from '../Dialog/Dialog';
22
22
  import {Layout} from '../Layout/Layout';
23
23
  import {LayoutContent} from '../Layout/LayoutContent';
24
24
  import {LayoutFooter} from '../Layout/LayoutFooter';
25
- import {Stack} from '../Stack';
25
+ import {Stack} from '../Stack/Stack';
26
26
  import {Heading} from '../Heading/Heading';
27
27
  import {Text} from '../Text/Text';
28
- import {Button, type ButtonVariant} from '../Button';
28
+ import {Button} from '../Button/Button';
29
+ import type {ButtonVariant} from '../Button';
29
30
  import type {BaseProps} from '../BaseProps';
30
- import {mergeProps} from '../utils';
31
+ import {mergeProps} from '../utils/mergeProps';
31
32
  import {themeProps} from '../utils/themeProps';
32
- import {useTranslator} from '../i18n';
33
+ import {useTranslator} from '../i18n/useTranslator';
33
34
  import {useMediaQuery} from '../hooks/useMediaQuery';
34
35
 
35
36
  const SMALL_SCREEN_QUERY = '(max-width: 640px)';
@@ -91,15 +91,27 @@ async function runState(
91
91
  });
92
92
  }
93
93
 
94
- test('every alert-dialog expectation is exercised by an AlertDialog state', async ({
95
- page,
96
- }) => {
97
- const cdp = await page.context().newCDPSession(page);
94
+ // Checking coverage runs every state again, which on a loaded runner nears
95
+ // the per-test timeout as one test. It runs as one serial part per state,
96
+ // sharing their results, then one check over all of them.
97
+ test.describe('every alert-dialog expectation is exercised by an AlertDialog state', () => {
98
+ test.describe.configure({mode: 'serial'});
98
99
  const results: BindingResult[] = [];
100
+
99
101
  for (const state of ALERT_DIALOG_BINDING_STATES) {
100
- results.push(await runState(page, cdp, state));
102
+ test(`runs ${state.id}`, async ({page}) => {
103
+ const cdp = await page.context().newCDPSession(page);
104
+ results.push(await runState(page, cdp, state));
105
+ });
101
106
  }
102
- expect(neverExercised(results)).toEqual([]);
107
+
108
+ test('no expectation is left unexercised', () => {
109
+ // Every part ran in this worker; this test alone proves nothing.
110
+ expect(results.map(result => result.state).sort()).toEqual(
111
+ ALERT_DIALOG_BINDING_STATES.map(state => state.id).sort(),
112
+ );
113
+ expect(neverExercised(results)).toEqual([]);
114
+ });
103
115
  });
104
116
 
105
117
  for (const state of ALERT_DIALOG_BINDING_STATES) {