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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +5 -5
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +183 -5
  6. package/dist/AppShell/observeMainOverflow.d.ts +9 -0
  7. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
  8. package/dist/AppShell/observeMainOverflow.js +125 -0
  9. package/dist/Avatar/Avatar.d.ts.map +1 -1
  10. package/dist/Avatar/Avatar.js +12 -3
  11. package/dist/Badge/Badge.d.ts.map +1 -1
  12. package/dist/Badge/Badge.js +7 -1
  13. package/dist/BottomSheet/BottomSheet.js +1 -1
  14. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  15. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  16. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  17. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  18. package/dist/BottomSheet/useSheetGestures.js +30 -3
  19. package/dist/Button/Button.js +4 -4
  20. package/dist/Carousel/Carousel.d.ts +3 -1
  21. package/dist/Carousel/Carousel.d.ts.map +1 -1
  22. package/dist/Carousel/Carousel.js +12 -3
  23. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  25. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  26. package/dist/ClickableCard/ClickableCard.js +37 -4
  27. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  28. package/dist/ComplexSelector/ComplexSelector.js +41 -4
  29. package/dist/DateInput/DateInput.d.ts.map +1 -1
  30. package/dist/DateInput/DateInput.js +12 -4
  31. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  32. package/dist/DateInput/MonthScroller.js +101 -15
  33. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  34. package/dist/DateInput/TouchDateField.js +8 -3
  35. package/dist/DateInput/Wheel.d.ts.map +1 -1
  36. package/dist/DateInput/Wheel.js +11 -7
  37. package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
  38. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  39. package/dist/DateInput/usePointerDragScroll.js +25 -9
  40. package/dist/DateInput/useScrollSettle.d.ts +3 -1
  41. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  42. package/dist/DateInput/useScrollSettle.js +37 -8
  43. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  44. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  45. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  46. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  47. package/dist/DateTimeInput/DateTimeInput.js +23 -12
  48. package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
  49. package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
  50. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  51. package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
  52. package/dist/Dialog/Dialog.d.ts.map +1 -1
  53. package/dist/Dialog/Dialog.js +34 -9
  54. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  55. package/dist/Dialog/DialogHeader.js +5 -4
  56. package/dist/Divider/Divider.d.ts.map +1 -1
  57. package/dist/Divider/Divider.js +2 -1
  58. package/dist/Drawer/Drawer.d.ts +1 -0
  59. package/dist/Drawer/Drawer.d.ts.map +1 -1
  60. package/dist/Drawer/Drawer.js +7 -2
  61. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  62. package/dist/DropdownMenu/DropdownMenu.js +35 -22
  63. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  64. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  65. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
  66. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  67. package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
  68. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  69. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  70. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  71. package/dist/EmptyState/EmptyState.js +2 -1
  72. package/dist/Field/FieldLabel.d.ts +1 -1
  73. package/dist/Field/FieldLabel.d.ts.map +1 -1
  74. package/dist/Field/FieldLabel.js +4 -4
  75. package/dist/Field/InputClearButton.js +3 -3
  76. package/dist/Field/PanelSearchInput.js +2 -2
  77. package/dist/FieldStatus/FieldStatus.d.ts +3 -0
  78. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  79. package/dist/FieldStatus/FieldStatus.js +3 -2
  80. package/dist/FileInput/FileInput.d.ts +3 -0
  81. package/dist/FileInput/FileInput.d.ts.map +1 -1
  82. package/dist/FileInput/FileInput.js +34 -13
  83. package/dist/Heading/Heading.js +1 -1
  84. package/dist/Icon/Icon.js +1 -1
  85. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  86. package/dist/Indicator/CheckIndicator.js +2 -1
  87. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  88. package/dist/Indicator/CheckboxIndicator.js +3 -1
  89. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  90. package/dist/Indicator/RadioIndicator.js +3 -1
  91. package/dist/Item/Item.d.ts.map +1 -1
  92. package/dist/Item/Item.js +21 -7
  93. package/dist/Item/ItemSwipeLayer.js +1 -1
  94. package/dist/Layer/popoverOperations.d.ts +27 -0
  95. package/dist/Layer/popoverOperations.d.ts.map +1 -0
  96. package/dist/Layer/popoverOperations.js +159 -0
  97. package/dist/Layer/useLayer.d.ts +1 -1
  98. package/dist/Layer/useLayer.d.ts.map +1 -1
  99. package/dist/Layer/useLayer.js +120 -65
  100. package/dist/Layout/Layout.js +1 -1
  101. package/dist/Layout/LayoutContent.js +1 -1
  102. package/dist/Layout/LayoutFooter.js +1 -1
  103. package/dist/Layout/LayoutHeader.js +1 -1
  104. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  105. package/dist/Lightbox/Lightbox.js +5 -0
  106. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  107. package/dist/Link/Link.d.ts.map +1 -1
  108. package/dist/Link/Link.js +8 -3
  109. package/dist/List/List.js +1 -1
  110. package/dist/List/ListItem.js +3 -3
  111. package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
  112. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  113. package/dist/MobileNav/MobileNav.js +7 -2
  114. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
  115. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  116. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  117. package/dist/MultiSelector/MultiSelector.js +26 -10
  118. package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
  119. package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
  120. package/dist/NumberInput/NumberInput.d.ts +3 -1
  121. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  122. package/dist/NumberInput/NumberInput.js +26 -5
  123. package/dist/NumberInput/numberParser.d.ts +3 -0
  124. package/dist/NumberInput/numberParser.d.ts.map +1 -1
  125. package/dist/NumberInput/numberParser.js +7 -44
  126. package/dist/Outline/Outline.d.ts.map +1 -1
  127. package/dist/Outline/Outline.js +27 -0
  128. package/dist/Popover/Popover.d.ts.map +1 -1
  129. package/dist/Popover/Popover.js +32 -12
  130. package/dist/Popover/usePopover.d.ts.map +1 -1
  131. package/dist/Popover/usePopover.js +10 -3
  132. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  133. package/dist/PowerSearch/PowerSearch.js +37 -30
  134. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  135. package/dist/ProgressBar/ProgressBar.js +16 -12
  136. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  137. package/dist/RadioList/RadioListItem.js +11 -3
  138. package/dist/Resizable/useResizable.d.ts.map +1 -1
  139. package/dist/Resizable/useResizable.js +28 -2
  140. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  141. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  142. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  143. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  144. package/dist/Selector/useSelectorPresentation.js +20 -4
  145. package/dist/SideNav/SideNavItem.d.ts +2 -2
  146. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  147. package/dist/SideNav/SideNavItem.js +18 -7
  148. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  149. package/dist/Skeleton/Skeleton.js +1 -1
  150. package/dist/Slider/Slider.d.ts.map +1 -1
  151. package/dist/Slider/Slider.js +10 -2
  152. package/dist/Spinner/Spinner.d.ts.map +1 -1
  153. package/dist/Spinner/Spinner.js +3 -3
  154. package/dist/Stack/Stack.js +1 -1
  155. package/dist/Stack/StackItem.js +1 -1
  156. package/dist/Stepper/Step.d.ts.map +1 -1
  157. package/dist/Stepper/Step.js +26 -6
  158. package/dist/Switch/Switch.d.ts.map +1 -1
  159. package/dist/Switch/Switch.js +10 -3
  160. package/dist/TabList/TabList.d.ts.map +1 -1
  161. package/dist/TabList/TabList.js +16 -1
  162. package/dist/Table/Table.d.ts.map +1 -1
  163. package/dist/Table/Table.js +36 -10
  164. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  165. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  166. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  167. package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
  168. package/dist/Text/Text.js +1 -1
  169. package/dist/Text/useTruncation.d.ts.map +1 -1
  170. package/dist/Text/useTruncation.js +23 -5
  171. package/dist/TextArea/TextArea.d.ts +1 -1
  172. package/dist/TextArea/TextArea.d.ts.map +1 -1
  173. package/dist/TextArea/TextArea.js +13 -2
  174. package/dist/TextInput/TextInput.d.ts.map +1 -1
  175. package/dist/TextInput/TextInput.js +3 -3
  176. package/dist/TimeInput/TimeInput.d.ts +6 -2
  177. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  178. package/dist/TimeInput/TimeInput.js +21 -14
  179. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  180. package/dist/TimeInput/TouchTimeField.js +5 -4
  181. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  182. package/dist/Timestamp/Timestamp.js +2 -2
  183. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  184. package/dist/Toast/Toast.d.ts.map +1 -1
  185. package/dist/Toast/Toast.js +60 -20
  186. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  187. package/dist/Toast/ToastViewport.js +101 -54
  188. package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
  189. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  190. package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
  191. package/dist/Token/Token.d.ts +1 -1
  192. package/dist/Token/Token.d.ts.map +1 -1
  193. package/dist/Token/Token.js +52 -5
  194. package/dist/Token/TokenLink.d.ts.map +1 -1
  195. package/dist/Token/TokenLink.js +14 -2
  196. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  197. package/dist/Tokenizer/Tokenizer.js +44 -7
  198. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  199. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
  200. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
  201. package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
  202. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  203. package/dist/Toolbar/Toolbar.js +2 -1
  204. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  205. package/dist/TopNav/TopNavMegaMenu.js +3 -0
  206. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  207. package/dist/TopNav/TopNavMenu.js +1 -0
  208. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  209. package/dist/TreeList/TreeListItem.js +27 -4
  210. package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
  211. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  212. package/dist/Typeahead/BaseTypeahead.js +43 -7
  213. package/dist/Typeahead/Typeahead.d.ts +1 -1
  214. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  215. package/dist/Typeahead/Typeahead.js +43 -9
  216. package/dist/astryx.css +25 -4
  217. package/dist/gestures/GestureArena.d.ts +32 -1
  218. package/dist/gestures/GestureArena.d.ts.map +1 -1
  219. package/dist/gestures/GestureArena.js +110 -9
  220. package/dist/gestures/GestureHost.d.ts +351 -0
  221. package/dist/gestures/GestureHost.d.ts.map +1 -0
  222. package/dist/gestures/GestureHost.js +1773 -0
  223. package/dist/gestures/GestureRecognizer.d.ts +13 -1
  224. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  225. package/dist/gestures/GestureRecognizer.js +19 -1
  226. package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
  227. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
  228. package/dist/gestures/LongPressGestureRecognizer.js +3 -0
  229. package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
  230. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  231. package/dist/gestures/PanGestureRecognizer.js +3 -0
  232. package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
  233. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  234. package/dist/gestures/PinchGestureRecognizer.js +128 -0
  235. package/dist/gestures/PressTracker.d.ts +112 -0
  236. package/dist/gestures/PressTracker.d.ts.map +1 -0
  237. package/dist/gestures/PressTracker.js +267 -0
  238. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
  239. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  240. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
  241. package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
  242. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  243. package/dist/gestures/SwipeGestureRecognizer.js +148 -0
  244. package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
  245. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
  246. package/dist/gestures/TapGestureRecognizer.js +3 -0
  247. package/dist/gestures/VelocityTracker.d.ts +6 -2
  248. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  249. package/dist/gestures/VelocityTracker.js +7 -3
  250. package/dist/gestures/haptics.d.ts +65 -0
  251. package/dist/gestures/haptics.d.ts.map +1 -0
  252. package/dist/gestures/haptics.js +182 -0
  253. package/dist/gestures/index.d.ts +37 -0
  254. package/dist/gestures/index.d.ts.map +1 -0
  255. package/dist/gestures/index.js +25 -0
  256. package/dist/gestures/nativeScroll.d.ts +42 -0
  257. package/dist/gestures/nativeScroll.d.ts.map +1 -0
  258. package/dist/gestures/nativeScroll.js +228 -0
  259. package/dist/gestures/touchAction.d.ts +60 -0
  260. package/dist/gestures/touchAction.d.ts.map +1 -0
  261. package/dist/gestures/touchAction.js +157 -0
  262. package/dist/gestures/touchActionRule.d.ts +34 -0
  263. package/dist/gestures/touchActionRule.d.ts.map +1 -0
  264. package/dist/gestures/touchActionRule.js +140 -0
  265. package/dist/gestures/types.d.ts +18 -7
  266. package/dist/gestures/types.d.ts.map +1 -1
  267. package/dist/gestures/types.js +22 -2
  268. package/dist/gestures/useGestureRecognizer.d.ts +56 -0
  269. package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
  270. package/dist/gestures/useGestureRecognizer.js +226 -0
  271. package/dist/hooks/index.d.ts +1 -1
  272. package/dist/hooks/index.d.ts.map +1 -1
  273. package/dist/hooks/modalAnnounce.d.ts.map +1 -1
  274. package/dist/hooks/modalAnnounce.js +107 -61
  275. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
  276. package/dist/hooks/scrollKeyboardDelegation.js +7 -3
  277. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  278. package/dist/hooks/useAdaptivePresentation.js +4 -1
  279. package/dist/hooks/useAnnounce.d.ts +101 -42
  280. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  281. package/dist/hooks/useAnnounce.js +161 -75
  282. package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
  283. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  284. package/dist/hooks/useAnnounceRenderedText.js +5 -3
  285. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  286. package/dist/hooks/useBusyAnnouncement.js +6 -12
  287. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  288. package/dist/hooks/useMenuHover.js +12 -1
  289. package/dist/hooks/useScrollOverflow.d.ts +2 -1
  290. package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
  291. package/dist/hooks/useScrollOverflow.js +56 -10
  292. package/dist/i18n/generated-locales/af-ZA.generated.d.ts.map +1 -1
  293. package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
  294. package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
  295. package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
  296. package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
  297. package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
  298. package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
  299. package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
  300. package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
  301. package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
  302. package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
  304. package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
  305. package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
  306. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  307. package/dist/i18n/generated-locales/en.generated.js +8 -5
  308. package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
  309. package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
  310. package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
  311. package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
  312. package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
  313. package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
  314. package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
  315. package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
  316. package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
  317. package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
  318. package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
  319. package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
  320. package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
  321. package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
  322. package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
  323. package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
  324. package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
  325. package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
  326. package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
  327. package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
  328. package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
  329. package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
  330. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  331. package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
  332. package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
  333. package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
  334. package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
  335. package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
  336. package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
  337. package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
  338. package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
  339. package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
  340. package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
  341. package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
  342. package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
  343. package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
  344. package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
  345. package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
  346. package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
  347. package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
  348. package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
  349. package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
  350. package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
  351. package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
  352. package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
  353. package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
  354. package/dist/i18n/useListFormatter.d.ts +9 -0
  355. package/dist/i18n/useListFormatter.d.ts.map +1 -0
  356. package/dist/i18n/useListFormatter.js +41 -0
  357. package/dist/motion/animator.d.ts +83 -8
  358. package/dist/motion/animator.d.ts.map +1 -1
  359. package/dist/motion/animator.js +701 -119
  360. package/dist/motion/coast.d.ts +4 -1
  361. package/dist/motion/coast.d.ts.map +1 -1
  362. package/dist/motion/coast.js +4 -2
  363. package/dist/motion/reducedMotion.d.ts.map +1 -1
  364. package/dist/motion/reducedMotion.js +6 -2
  365. package/dist/motion/reducedMotionPlan.d.ts +7 -0
  366. package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
  367. package/dist/motion/reducedMotionPlan.js +14 -1
  368. package/dist/motion/resolveMotion.d.ts +42 -0
  369. package/dist/motion/resolveMotion.d.ts.map +1 -0
  370. package/dist/motion/resolveMotion.js +43 -0
  371. package/dist/motion/roleValue.d.ts +2 -1
  372. package/dist/motion/roleValue.d.ts.map +1 -1
  373. package/dist/motion/roleValue.js +2 -1
  374. package/dist/motion/uikit/timing.d.ts +7 -1
  375. package/dist/motion/uikit/timing.d.ts.map +1 -1
  376. package/dist/motion/uikit/timing.js +19 -1
  377. package/dist/theme/defineTheme.d.ts +19 -5
  378. package/dist/theme/defineTheme.d.ts.map +1 -1
  379. package/dist/theme/defineTheme.js +64 -4
  380. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  381. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  382. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  383. package/dist/theme/domainTokens/index.d.ts +5 -4
  384. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  385. package/dist/theme/domainTokens/index.js +5 -9
  386. package/dist/theme/index.d.ts +1 -0
  387. package/dist/theme/index.d.ts.map +1 -1
  388. package/dist/theme/motionKnobs.d.ts +56 -0
  389. package/dist/theme/motionKnobs.d.ts.map +1 -0
  390. package/dist/theme/motionKnobs.js +48 -0
  391. package/dist/theme/resolveThemeValues.d.ts +11 -4
  392. package/dist/theme/resolveThemeValues.d.ts.map +1 -1
  393. package/dist/theme/resolveThemeValues.js +40 -4
  394. package/dist/theme/themeAdaptations.d.ts +7 -3
  395. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  396. package/dist/theme/themeAdaptations.js +36 -7
  397. package/dist/theme/themeMotion.d.ts +96 -0
  398. package/dist/theme/themeMotion.d.ts.map +1 -0
  399. package/dist/theme/themeMotion.js +177 -0
  400. package/dist/theme/tokenReferences.d.ts +31 -0
  401. package/dist/theme/tokenReferences.d.ts.map +1 -0
  402. package/dist/theme/tokenReferences.js +132 -0
  403. package/dist/theme/tokens.d.ts +1 -0
  404. package/dist/theme/tokens.d.ts.map +1 -1
  405. package/dist/theme/tokens.js +9 -129
  406. package/dist/theme/tokens.stylex.d.ts +12 -0
  407. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  408. package/dist/theme/tokens.stylex.js +12 -0
  409. package/dist/utils/focusOutline.stylex.d.ts +6 -0
  410. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  411. package/dist/utils/focusOutline.stylex.js +7 -0
  412. package/dist/utils/focusReturn.d.ts +17 -1
  413. package/dist/utils/focusReturn.d.ts.map +1 -1
  414. package/dist/utils/focusReturn.js +11 -4
  415. package/dist/utils/getNodeText.d.ts +8 -0
  416. package/dist/utils/getNodeText.d.ts.map +1 -0
  417. package/dist/utils/getNodeText.js +37 -0
  418. package/dist/utils/interactionModality.d.ts +11 -2
  419. package/dist/utils/interactionModality.d.ts.map +1 -1
  420. package/dist/utils/interactionModality.js +58 -5
  421. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  422. package/dist/utils/interactionOverlay.stylex.js +17 -8
  423. package/dist/utils/plainDate.d.ts +2 -0
  424. package/dist/utils/plainDate.d.ts.map +1 -1
  425. package/dist/utils/plainDate.js +46 -3
  426. package/dist/utils/presentation.d.ts +50 -0
  427. package/dist/utils/presentation.d.ts.map +1 -0
  428. package/dist/utils/presentation.js +125 -0
  429. package/dist/utils/pressFeedback.d.ts.map +1 -1
  430. package/dist/utils/pressFeedback.js +20 -1
  431. package/dist/utils/primaryClick.d.ts +11 -0
  432. package/dist/utils/primaryClick.d.ts.map +1 -0
  433. package/dist/utils/primaryClick.js +25 -0
  434. package/dist/utils/sharedMutationObserver.d.ts +19 -11
  435. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  436. package/dist/utils/sharedMutationObserver.js +66 -26
  437. package/dist/utils/timeFormat.d.ts +47 -0
  438. package/dist/utils/timeFormat.d.ts.map +1 -0
  439. package/dist/utils/timeFormat.js +240 -0
  440. package/dist/utils/touchPresentation.d.ts +2 -2
  441. package/dist/utils/touchPresentation.d.ts.map +1 -1
  442. package/dist/utils/touchPresentation.js +13 -8
  443. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  444. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  445. package/dist/utils/touchPresentation.stylex.js +33 -0
  446. package/dist/utils/touchQueries.d.ts +13 -0
  447. package/dist/utils/touchQueries.d.ts.map +1 -0
  448. package/dist/utils/touchQueries.js +15 -0
  449. package/dist/utils/unicodeDigits.d.ts +20 -0
  450. package/dist/utils/unicodeDigits.d.ts.map +1 -0
  451. package/dist/utils/unicodeDigits.js +70 -0
  452. package/dist/utils/useFocusAcrossSwap.d.ts +19 -0
  453. package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
  454. package/dist/utils/useFocusAcrossSwap.js +41 -0
  455. package/locales/af-ZA.json +0 -21
  456. package/locales/ar-SA.json +0 -21
  457. package/locales/ca-ES.json +0 -21
  458. package/locales/cs-CZ.json +0 -21
  459. package/locales/da-DK.json +0 -21
  460. package/locales/de-DE.json +0 -21
  461. package/locales/el-GR.json +0 -21
  462. package/locales/en.json +35 -23
  463. package/locales/es-ES.json +0 -21
  464. package/locales/fi-FI.json +0 -21
  465. package/locales/fr-FR.json +0 -21
  466. package/locales/he-IL.json +0 -21
  467. package/locales/hu-HU.json +0 -21
  468. package/locales/it-IT.json +0 -21
  469. package/locales/ja-JP.json +0 -21
  470. package/locales/ko-KR.json +0 -21
  471. package/locales/nl-NL.json +0 -21
  472. package/locales/no-NO.json +0 -21
  473. package/locales/pl-PL.json +0 -21
  474. package/locales/pseudo.json +23 -14
  475. package/locales/pt-BR.json +0 -21
  476. package/locales/pt-PT.json +0 -21
  477. package/locales/ro-RO.json +0 -21
  478. package/locales/ru-RU.json +0 -21
  479. package/locales/sr-SP.json +0 -21
  480. package/locales/sv-SE.json +0 -21
  481. package/locales/tr-TR.json +0 -21
  482. package/locales/uk-UA.json +0 -21
  483. package/locales/vi-VN.json +0 -21
  484. package/locales/zh-CN.json +0 -21
  485. package/locales/zh-TW.json +0 -21
  486. package/package.json +5 -4
  487. package/src/AlertDialog/AlertDialog.tsx +6 -5
  488. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  489. package/src/AppShell/AppShell.doc.mjs +1 -1
  490. package/src/AppShell/AppShell.spec.md +9 -12
  491. package/src/AppShell/AppShell.test.tsx +164 -2
  492. package/src/AppShell/AppShell.tsx +225 -5
  493. package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
  494. package/src/AppShell/observeMainOverflow.test.ts +173 -0
  495. package/src/AppShell/observeMainOverflow.ts +143 -0
  496. package/src/Avatar/Avatar.spec.md +22 -22
  497. package/src/Avatar/Avatar.tsx +18 -1
  498. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  499. package/src/Badge/Badge.doc.mjs +1 -1
  500. package/src/Badge/Badge.tsx +19 -2
  501. package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
  502. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  503. package/src/BottomSheet/BottomSheet.tsx +1 -1
  504. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  505. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  506. package/src/BottomSheet/useSheetGestures.ts +37 -6
  507. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  508. package/src/Button/Button.tsx +4 -4
  509. package/src/Calendar/Calendar.spec.md +87 -48
  510. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  511. package/src/Carousel/Carousel.doc.mjs +1 -1
  512. package/src/Carousel/Carousel.spec.md +9 -9
  513. package/src/Carousel/Carousel.test.tsx +124 -3
  514. package/src/Carousel/Carousel.tsx +10 -2
  515. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  516. package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
  517. package/src/Chat/ChatComposer.spec.md +75 -59
  518. package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
  519. package/src/Chat/ChatDictationButton.spec.md +126 -81
  520. package/src/Chat/ChatLayout.spec.md +41 -36
  521. package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
  522. package/src/Chat/ChatMessage.spec.md +64 -65
  523. package/src/Chat/ChatSendButton.spec.md +78 -67
  524. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  525. package/src/Citation/Citation.spec.md +60 -47
  526. package/src/ClickableCard/ClickableCard.test.tsx +96 -0
  527. package/src/ClickableCard/ClickableCard.tsx +48 -4
  528. package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
  529. package/src/Collapsible/Collapsible.spec.md +2 -0
  530. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  531. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  532. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  533. package/src/ComplexSelector/ComplexSelector.test.tsx +148 -0
  534. package/src/ComplexSelector/ComplexSelector.tsx +41 -4
  535. package/src/ContextMenu/ContextMenu.spec.md +84 -56
  536. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  537. package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
  538. package/src/DateInput/DateInput.spec.md +74 -57
  539. package/src/DateInput/DateInput.test.tsx +115 -3
  540. package/src/DateInput/DateInput.tsx +29 -14
  541. package/src/DateInput/DateInputTouch.test.tsx +120 -0
  542. package/src/DateInput/MonthScroller.tsx +106 -20
  543. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  544. package/src/DateInput/TouchDateField.tsx +14 -3
  545. package/src/DateInput/Wheel.tsx +9 -6
  546. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  547. package/src/DateInput/usePointerDragScroll.ts +34 -10
  548. package/src/DateInput/useScrollSettle.ts +38 -7
  549. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  550. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  551. package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
  552. package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
  553. package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
  554. package/src/DateTimeInput/DateTimeInput.tsx +46 -24
  555. package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
  556. package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
  557. package/src/Dialog/Dialog.test.tsx +216 -2
  558. package/src/Dialog/Dialog.tsx +42 -9
  559. package/src/Dialog/DialogHeader.tsx +5 -4
  560. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  561. package/src/Divider/Divider.tsx +2 -1
  562. package/src/Drawer/Drawer.spec.md +111 -80
  563. package/src/Drawer/Drawer.test.tsx +35 -0
  564. package/src/Drawer/Drawer.tsx +13 -2
  565. package/src/Drawer/DrawerHeader.spec.md +181 -0
  566. package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
  567. package/src/DropdownMenu/DropdownMenu.spec.md +198 -218
  568. package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
  569. package/src/DropdownMenu/DropdownMenu.tsx +43 -21
  570. package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
  571. package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
  572. package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
  573. package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
  574. package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
  575. package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
  576. package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
  577. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  578. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  579. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  580. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  581. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
  582. package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
  583. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  584. package/src/EmptyState/EmptyState.spec.md +35 -29
  585. package/src/EmptyState/EmptyState.tsx +2 -1
  586. package/src/Field/FieldLabel.tsx +5 -4
  587. package/src/Field/InputClearButton.tsx +3 -3
  588. package/src/Field/PanelSearchInput.tsx +2 -2
  589. package/src/FieldStatus/FieldStatus.tsx +9 -2
  590. package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
  591. package/src/FileInput/FileInput.test.tsx +159 -0
  592. package/src/FileInput/FileInput.tsx +34 -6
  593. package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
  594. package/src/FormLayout/FormLayout.spec.md +11 -20
  595. package/src/Heading/Heading.tsx +1 -1
  596. package/src/Icon/Icon.tsx +1 -1
  597. package/src/Indicator/CheckIndicator.spec.md +47 -42
  598. package/src/Indicator/CheckIndicator.tsx +2 -1
  599. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  600. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  601. package/src/Indicator/Indicator.spec.md +188 -0
  602. package/src/Indicator/RadioIndicator.tsx +3 -1
  603. package/src/Item/Item.test.tsx +60 -0
  604. package/src/Item/Item.tsx +16 -8
  605. package/src/Item/ItemSwipeLayer.tsx +1 -1
  606. package/src/Kbd/Kbd.spec.md +81 -38
  607. package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
  608. package/src/Layer/popoverOperations.test.ts +205 -0
  609. package/src/Layer/popoverOperations.ts +172 -0
  610. package/src/Layer/useLayer.test.tsx +426 -4
  611. package/src/Layer/useLayer.tsx +145 -77
  612. package/src/Layout/Layout.spec.md +127 -131
  613. package/src/Layout/Layout.tsx +1 -1
  614. package/src/Layout/LayoutContent.spec.md +205 -0
  615. package/src/Layout/LayoutContent.tsx +1 -1
  616. package/src/Layout/LayoutFooter.spec.md +190 -0
  617. package/src/Layout/LayoutFooter.tsx +1 -1
  618. package/src/Layout/LayoutHeader.spec.md +193 -0
  619. package/src/Layout/LayoutHeader.tsx +1 -1
  620. package/src/Layout/LayoutPanel.spec.md +194 -0
  621. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  622. package/src/Lightbox/Lightbox.test.tsx +18 -0
  623. package/src/Lightbox/Lightbox.tsx +5 -0
  624. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  625. package/src/Link/Link.spec.md +3 -2
  626. package/src/Link/Link.tsx +11 -0
  627. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  628. package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
  629. package/src/List/List.tsx +1 -1
  630. package/src/List/ListItem.spec.md +205 -0
  631. package/src/List/ListItem.tsx +3 -3
  632. package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
  633. package/src/MetadataList/MetadataList.spec.md +187 -0
  634. package/src/MetadataList/MetadataListItem.spec.md +165 -0
  635. package/src/MobileNav/MobileNav.test.tsx +15 -0
  636. package/src/MobileNav/MobileNav.tsx +9 -1
  637. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  638. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  639. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
  640. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  641. package/src/MultiSelector/MultiSelector.test.tsx +270 -1
  642. package/src/MultiSelector/MultiSelector.tsx +25 -10
  643. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  644. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  645. package/src/NavMenu/NavHeadingMenuItem.tsx +5 -39
  646. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  647. package/src/NumberInput/NumberInput.spec.md +59 -37
  648. package/src/NumberInput/NumberInput.test.tsx +68 -7
  649. package/src/NumberInput/NumberInput.tsx +44 -4
  650. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  651. package/src/NumberInput/numberParser.ts +7 -45
  652. package/src/Outline/Outline.spec.md +165 -69
  653. package/src/Outline/Outline.test.tsx +67 -2
  654. package/src/Outline/Outline.tsx +23 -0
  655. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
  656. package/src/OverflowList/OverflowList.spec.md +102 -55
  657. package/src/Pagination/Pagination.spec.md +158 -84
  658. package/src/Popover/Popover.test.tsx +84 -0
  659. package/src/Popover/Popover.tsx +34 -14
  660. package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
  661. package/src/Popover/usePopover.tsx +10 -3
  662. package/src/PowerSearch/PowerSearch.test.tsx +24 -0
  663. package/src/PowerSearch/PowerSearch.tsx +42 -31
  664. package/src/ProgressBar/ProgressBar.spec.md +143 -119
  665. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  666. package/src/ProgressBar/ProgressBar.tsx +58 -10
  667. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  668. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  669. package/src/RadioList/RadioList.spec.md +1 -1
  670. package/src/RadioList/RadioList.test.tsx +84 -0
  671. package/src/RadioList/RadioListItem.tsx +11 -2
  672. package/src/Resizable/Resizable.spec.md +144 -124
  673. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  674. package/src/Resizable/useResizable.test.ts +43 -0
  675. package/src/Resizable/useResizable.ts +32 -9
  676. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  677. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  678. package/src/Selector/Selector.test.tsx +90 -1
  679. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  680. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  681. package/src/Selector/useSelectorPresentation.ts +31 -3
  682. package/src/SideNav/SideNav.test.tsx +151 -4
  683. package/src/SideNav/SideNavItem.spec.md +14 -24
  684. package/src/SideNav/SideNavItem.tsx +27 -10
  685. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
  686. package/src/Skeleton/Skeleton.tsx +3 -1
  687. package/src/Slider/Slider.test.tsx +31 -0
  688. package/src/Slider/Slider.tsx +8 -3
  689. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  690. package/src/Spinner/Spinner.tsx +5 -3
  691. package/src/Stack/Stack.tsx +1 -1
  692. package/src/Stack/StackItem.tsx +1 -1
  693. package/src/Stepper/Step.spec.md +36 -42
  694. package/src/Stepper/Step.tsx +33 -6
  695. package/src/Stepper/Stepper.doc.mjs +1 -1
  696. package/src/Stepper/Stepper.test.tsx +69 -7
  697. package/src/Switch/Switch.spec.md +1 -1
  698. package/src/Switch/Switch.test.tsx +66 -1
  699. package/src/Switch/Switch.tsx +11 -3
  700. package/src/TabList/TabList.test.tsx +58 -4
  701. package/src/TabList/TabList.tsx +16 -1
  702. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  703. package/src/Table/Table.spec.md +1 -1
  704. package/src/Table/Table.test.tsx +32 -0
  705. package/src/Table/Table.tsx +43 -11
  706. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  707. package/src/Table/__tests__/Table.a11y.states.ts +1 -5
  708. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  709. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  710. package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
  711. package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
  712. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
  713. package/src/Text/Text.tsx +1 -1
  714. package/src/Text/useTruncation.test.tsx +128 -1
  715. package/src/Text/useTruncation.ts +23 -5
  716. package/src/TextArea/TextArea.spec.md +10 -13
  717. package/src/TextArea/TextArea.test.tsx +60 -0
  718. package/src/TextArea/TextArea.tsx +15 -1
  719. package/src/TextInput/TextInput.test.tsx +21 -0
  720. package/src/TextInput/TextInput.tsx +3 -1
  721. package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
  722. package/src/TimeInput/Presentation.test.tsx +21 -0
  723. package/src/TimeInput/TimeInput.doc.mjs +8 -8
  724. package/src/TimeInput/TimeInput.spec.md +58 -61
  725. package/src/TimeInput/TimeInput.test.tsx +76 -0
  726. package/src/TimeInput/TimeInput.tsx +36 -18
  727. package/src/TimeInput/TouchTimeField.tsx +4 -6
  728. package/src/Timestamp/Timestamp.spec.md +6 -12
  729. package/src/Timestamp/Timestamp.test.tsx +30 -5
  730. package/src/Timestamp/Timestamp.tsx +6 -2
  731. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  732. package/src/Toast/Toast.spec.md +15 -24
  733. package/src/Toast/Toast.tsx +104 -36
  734. package/src/Toast/ToastViewport.test.tsx +798 -1
  735. package/src/Toast/ToastViewport.tsx +121 -53
  736. package/src/ToggleButton/ToggleButton.test.tsx +27 -0
  737. package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
  738. package/src/Token/Token.doc.mjs +2 -2
  739. package/src/Token/Token.spec.md +52 -61
  740. package/src/Token/Token.test.tsx +104 -0
  741. package/src/Token/Token.tsx +75 -5
  742. package/src/Token/TokenLink.tsx +21 -7
  743. package/src/Tokenizer/Tokenizer.spec.md +18 -4
  744. package/src/Tokenizer/Tokenizer.test.tsx +176 -0
  745. package/src/Tokenizer/Tokenizer.tsx +48 -12
  746. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
  747. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  748. package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
  749. package/src/Toolbar/Toolbar.spec.md +5 -6
  750. package/src/Toolbar/Toolbar.test.tsx +30 -0
  751. package/src/Toolbar/Toolbar.tsx +2 -1
  752. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  753. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  754. package/src/TopNav/TopNav.test.tsx +27 -0
  755. package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
  756. package/src/TopNav/TopNavMegaMenu.tsx +4 -1
  757. package/src/TopNav/TopNavMenu.test.tsx +17 -0
  758. package/src/TopNav/TopNavMenu.tsx +1 -0
  759. package/src/TreeList/TreeList.test.tsx +26 -0
  760. package/src/TreeList/TreeListItem.tsx +26 -4
  761. package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
  762. package/src/Typeahead/BaseTypeahead.spec.md +45 -45
  763. package/src/Typeahead/BaseTypeahead.tsx +48 -9
  764. package/src/Typeahead/Typeahead.test.tsx +294 -11
  765. package/src/Typeahead/Typeahead.tsx +51 -9
  766. package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
  767. package/src/__tests__/pressState.ts +8 -4
  768. package/src/gestures/GestureArena.ts +111 -11
  769. package/src/gestures/GestureHost.ts +2064 -0
  770. package/src/gestures/GestureRecognizer.ts +21 -1
  771. package/src/gestures/LongPressGestureRecognizer.ts +4 -0
  772. package/src/gestures/PanGestureRecognizer.ts +4 -0
  773. package/src/gestures/PinchGestureRecognizer.ts +148 -0
  774. package/src/gestures/PressTracker.ts +386 -0
  775. package/src/gestures/README.md +420 -0
  776. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
  777. package/src/gestures/SwipeGestureRecognizer.ts +197 -0
  778. package/src/gestures/TapGestureRecognizer.ts +4 -0
  779. package/src/gestures/VelocityTracker.ts +10 -3
  780. package/src/gestures/__tests__/GestureHost.test.ts +2136 -0
  781. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  782. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  783. package/src/gestures/__tests__/PressTracker.test.ts +275 -0
  784. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  785. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  786. package/src/gestures/__tests__/arena.test.ts +40 -0
  787. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
  788. package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
  789. package/src/gestures/__tests__/browser/fixture.ts +307 -0
  790. package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
  791. package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
  792. package/src/gestures/__tests__/haptics.test.ts +187 -0
  793. package/src/gestures/__tests__/harness.ts +52 -4
  794. package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
  795. package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
  796. package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
  797. package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
  798. package/src/gestures/haptics.ts +203 -0
  799. package/src/gestures/index.ts +79 -0
  800. package/src/gestures/nativeScroll.ts +277 -0
  801. package/src/gestures/touchAction.ts +191 -0
  802. package/src/gestures/touchActionRule.ts +157 -0
  803. package/src/gestures/types.ts +30 -9
  804. package/src/gestures/useGestureRecognizer.ts +305 -0
  805. package/src/hooks/index.ts +5 -1
  806. package/src/hooks/modalAnnounce.ts +129 -72
  807. package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
  808. package/src/hooks/scrollKeyboardDelegation.ts +9 -3
  809. package/src/hooks/useAdaptivePresentation.ts +4 -1
  810. package/src/hooks/useAnnounce.doc.mjs +35 -3
  811. package/src/hooks/useAnnounce.replace.test.tsx +516 -0
  812. package/src/hooks/useAnnounce.ts +209 -102
  813. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
  814. package/src/hooks/useAnnounceRenderedText.ts +17 -3
  815. package/src/hooks/useBusyAnnouncement.ts +7 -10
  816. package/src/hooks/useMenuHover.ts +15 -1
  817. package/src/hooks/useScrollOverflow.doc.mjs +1 -1
  818. package/src/hooks/useScrollOverflow.test.tsx +102 -1
  819. package/src/hooks/useScrollOverflow.ts +59 -10
  820. package/src/i18n/__tests__/useListFormatter.test.tsx +58 -0
  821. package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
  822. package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
  823. package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
  824. package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
  825. package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
  826. package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
  827. package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
  828. package/src/i18n/generated-locales/en.generated.ts +9 -6
  829. package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
  830. package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
  831. package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
  832. package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
  833. package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
  834. package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
  835. package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
  836. package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
  837. package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
  838. package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
  839. package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
  840. package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
  841. package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
  842. package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
  843. package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
  844. package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
  845. package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
  846. package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
  847. package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
  848. package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
  849. package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
  850. package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
  851. package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
  852. package/src/i18n/useListFormatter.ts +42 -0
  853. package/src/motion/MEASUREMENTS.md +2 -1
  854. package/src/motion/README.md +113 -33
  855. package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
  856. package/src/motion/__tests__/motionBundle.ts +14 -0
  857. package/src/motion/animator.test.ts +1125 -32
  858. package/src/motion/animator.ts +932 -130
  859. package/src/motion/coast.ts +10 -3
  860. package/src/motion/reducedMotion.ts +12 -2
  861. package/src/motion/reducedMotionPlan.test.ts +26 -0
  862. package/src/motion/reducedMotionPlan.ts +20 -1
  863. package/src/motion/resolveMotion.test.ts +123 -0
  864. package/src/motion/resolveMotion.ts +68 -0
  865. package/src/motion/roleValue.ts +2 -1
  866. package/src/motion/roles.test.ts +21 -4
  867. package/src/motion/uikit/tableImports.test.ts +293 -0
  868. package/src/motion/uikit/timing.ts +15 -1
  869. package/src/motion/uikit/values.test.ts +23 -12
  870. package/src/theme/Theme.doc.mjs +1 -1
  871. package/src/theme/defineTheme.ts +117 -8
  872. package/src/theme/derivedVarRegistry.test.ts +4 -0
  873. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  874. package/src/theme/domainTokens/index.ts +6 -10
  875. package/src/theme/expandMotionScale.test.ts +1 -1
  876. package/src/theme/index.ts +5 -0
  877. package/src/theme/motionKnobs.ts +82 -0
  878. package/src/theme/resolveThemeValues.ts +68 -6
  879. package/src/theme/themeAdaptations.ts +52 -12
  880. package/src/theme/themeMotion.test.ts +620 -0
  881. package/src/theme/themeMotion.ts +221 -0
  882. package/src/theme/tokenReferences.ts +149 -0
  883. package/src/theme/tokens.stylex.ts +10 -0
  884. package/src/theme/tokens.ts +15 -158
  885. package/src/utils/focusOutline.stylex.ts +28 -0
  886. package/src/utils/focusReturn.ts +17 -6
  887. package/src/utils/getNodeText.test.ts +24 -0
  888. package/src/utils/getNodeText.ts +37 -0
  889. package/src/utils/interactionModality.test.ts +45 -1
  890. package/src/utils/interactionModality.ts +64 -5
  891. package/src/utils/interactionOverlay.stylex.ts +12 -3
  892. package/src/utils/plainDate.test.ts +90 -0
  893. package/src/utils/plainDate.ts +58 -3
  894. package/src/utils/presentation.test.ts +380 -0
  895. package/src/utils/presentation.ts +180 -0
  896. package/src/utils/pressFeedback.test.ts +138 -0
  897. package/src/utils/pressFeedback.ts +34 -11
  898. package/src/utils/pressGesture.test.ts +9 -0
  899. package/src/utils/pressPaintPriority.test.ts +80 -0
  900. package/src/utils/primaryClick.test.ts +38 -0
  901. package/src/utils/primaryClick.ts +28 -0
  902. package/src/utils/sharedMutationObserver.test.ts +54 -1
  903. package/src/utils/sharedMutationObserver.ts +87 -29
  904. package/src/utils/timeFormat.test.ts +204 -0
  905. package/src/utils/timeFormat.ts +314 -0
  906. package/src/utils/touchPresentation.stylex.ts +43 -0
  907. package/src/utils/touchPresentation.test.ts +140 -1
  908. package/src/utils/touchPresentation.ts +13 -8
  909. package/src/utils/touchQueries.ts +15 -0
  910. package/src/utils/unicodeDigits.test.ts +44 -0
  911. package/src/utils/unicodeDigits.ts +71 -0
  912. package/src/utils/useFocusAcrossSwap.ts +55 -0
@@ -0,0 +1,796 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // @pr-a11y audit FileInput
3
+
4
+ /**
5
+ * @file FileInputAudit.a11y.chromium.spec.ts
6
+ * @input Exact-head FileInput audit matrix across themes, modes, direction, viewport, forced colors, focus, and drag-over
7
+ * @output Screenshots and fail-closed sensor receipts for the FileInput whole-component audit
8
+ * @position Component-owned Night Watch browser evidence; CI runs it only for a FileInput audit pull request
9
+ */
10
+
11
+ import {createHash} from 'node:crypto';
12
+ import {execFileSync} from 'node:child_process';
13
+ import * as fs from 'node:fs';
14
+ import * as path from 'node:path';
15
+ import {expect, test, type Page} from '@playwright/test';
16
+ import {holdMotionStill} from '@astryxdesign/a11y-spec/chromium';
17
+ import {
18
+ DEFAULT_STORYBOOK_DIR,
19
+ serveStorybook,
20
+ type StaticServer,
21
+ } from '@astryxdesign/a11y-spec/storybook';
22
+
23
+ const OUTPUT = path.resolve('file-input-audit-evidence');
24
+ const STORY_ID = 'core-fileinput--audit-matrix';
25
+ const WIDE = {width: 1280, height: 1100};
26
+ const NARROW = {width: 320, height: 2600};
27
+ const STATUS_MESSAGE = 'File must be under 10MB';
28
+ const LONG_NAME =
29
+ 'quarterly-financial-report-final-revised-approved-2026-q3-v12.pdf';
30
+
31
+ type Mode = 'light' | 'dark';
32
+ type Direction = 'ltr' | 'rtl';
33
+ type Theme = 'neutral' | 'butter';
34
+
35
+ type FrameCase = {
36
+ key: string;
37
+ mode: Mode;
38
+ direction: Direction;
39
+ theme: Theme;
40
+ viewport: {width: number; height: number};
41
+ forcedColors: boolean;
42
+ interaction: boolean;
43
+ };
44
+
45
+ type Expectation = {
46
+ mode: 'input' | 'dropzone';
47
+ status?: 'attached' | 'detached' | 'tooltip';
48
+ loading?: boolean;
49
+ fileName?: string;
50
+ uploadIcon: boolean;
51
+ /** The loading dropzone shows only the decorative spinner. */
52
+ noText?: boolean;
53
+ };
54
+
55
+ // Expected facts per case, authored from the component contract and the
56
+ // input-fields family contract before observing the page.
57
+ const EXPECTED: Record<string, Expectation> = {
58
+ 'input-empty': {mode: 'input', uploadIcon: true},
59
+ 'input-selected': {mode: 'input', fileName: 'resume.pdf', uploadIcon: true},
60
+ 'input-long-name': {mode: 'input', fileName: LONG_NAME, uploadIcon: true},
61
+ 'input-error-attached': {mode: 'input', status: 'attached', uploadIcon: true},
62
+ 'input-error-tooltip': {mode: 'input', status: 'tooltip', uploadIcon: true},
63
+ 'input-loading-error-tooltip': {
64
+ mode: 'input',
65
+ status: 'tooltip',
66
+ loading: true,
67
+ fileName: 'resume.pdf',
68
+ uploadIcon: false,
69
+ },
70
+ 'dropzone-empty': {mode: 'dropzone', uploadIcon: true},
71
+ 'dropzone-selected': {
72
+ mode: 'dropzone',
73
+ fileName: 'resume.pdf',
74
+ uploadIcon: false,
75
+ },
76
+ 'dropzone-long-name': {
77
+ mode: 'dropzone',
78
+ fileName: LONG_NAME,
79
+ uploadIcon: false,
80
+ },
81
+ 'dropzone-error-attached': {
82
+ mode: 'dropzone',
83
+ status: 'attached',
84
+ uploadIcon: true,
85
+ },
86
+ 'dropzone-error-detached': {
87
+ mode: 'dropzone',
88
+ status: 'detached',
89
+ uploadIcon: true,
90
+ },
91
+ 'dropzone-error-tooltip': {
92
+ mode: 'dropzone',
93
+ status: 'tooltip',
94
+ uploadIcon: true,
95
+ },
96
+ 'dropzone-selected-error-tooltip': {
97
+ mode: 'dropzone',
98
+ status: 'tooltip',
99
+ fileName: 'resume.pdf',
100
+ uploadIcon: false,
101
+ },
102
+ 'dropzone-loading-error-tooltip': {
103
+ mode: 'dropzone',
104
+ status: 'tooltip',
105
+ loading: true,
106
+ uploadIcon: false,
107
+ noText: true,
108
+ },
109
+ 'dropzone-loading': {
110
+ mode: 'dropzone',
111
+ loading: true,
112
+ uploadIcon: false,
113
+ noText: true,
114
+ },
115
+ };
116
+ const CASE_IDS = Object.keys(EXPECTED);
117
+
118
+ const frames: FrameCase[] = [];
119
+ function addPair(
120
+ key: string,
121
+ options: Partial<Omit<FrameCase, 'key' | 'mode'>> = {},
122
+ ) {
123
+ for (const mode of ['light', 'dark'] as const) {
124
+ frames.push({
125
+ key: `${key}-${mode}`,
126
+ mode,
127
+ direction: options.direction ?? 'ltr',
128
+ theme: options.theme ?? 'neutral',
129
+ viewport: options.viewport ?? WIDE,
130
+ forcedColors: options.forcedColors ?? false,
131
+ interaction: options.interaction ?? false,
132
+ });
133
+ }
134
+ }
135
+
136
+ addPair('default');
137
+ addPair('custom-theme', {theme: 'butter'});
138
+ addPair('rtl', {direction: 'rtl'});
139
+ addPair('narrow', {viewport: NARROW});
140
+ addPair('forced-colors', {forcedColors: true});
141
+ addPair('interaction', {interaction: true});
142
+
143
+ test.describe.configure({mode: 'serial', retries: 0});
144
+ let server: StaticServer;
145
+ let checkoutSha: string;
146
+ let storybookSha: string;
147
+
148
+ function storyUrl(item: FrameCase) {
149
+ return `${server.origin}/iframe.html?id=${STORY_ID}&viewMode=story&globals=colorMode:${item.mode};astryxTheme:${item.theme};direction:${item.direction}`;
150
+ }
151
+
152
+ async function settle(page: Page) {
153
+ await holdMotionStill(page);
154
+ await page.evaluate(async () => document.fonts.ready);
155
+ await page.evaluate(
156
+ async () =>
157
+ new Promise<void>(resolve =>
158
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve())),
159
+ ),
160
+ );
161
+ await page.waitForTimeout(40);
162
+ }
163
+
164
+ async function observe(page: Page) {
165
+ return page.evaluate(
166
+ ({caseIds, longName}: {caseIds: string[]; longName: string}) => {
167
+ type Rgba = {r: number; g: number; b: number; a: number};
168
+ function parseColor(color: string): Rgba | null {
169
+ const match = color.match(/rgba?\(([^)]+)\)/);
170
+ if (!match) {
171
+ return null;
172
+ }
173
+ const [r, g, b, a = 1] = match[1]
174
+ .split(/[\s,/]+/)
175
+ .filter(Boolean)
176
+ .map(Number);
177
+ return {r, g, b, a};
178
+ }
179
+ function over(top: Rgba, bottom: Rgba): Rgba {
180
+ return {
181
+ r: top.r * top.a + bottom.r * (1 - top.a),
182
+ g: top.g * top.a + bottom.g * (1 - top.a),
183
+ b: top.b * top.a + bottom.b * (1 - top.a),
184
+ a: 1,
185
+ };
186
+ }
187
+ function backdrop(element: Element): Rgba {
188
+ const layers: Rgba[] = [];
189
+ for (
190
+ let node: Element | null = element;
191
+ node != null;
192
+ node = node.parentElement
193
+ ) {
194
+ const color = parseColor(getComputedStyle(node).backgroundColor);
195
+ if (color != null && color.a > 0) {
196
+ layers.push(color);
197
+ if (color.a >= 1) {
198
+ break;
199
+ }
200
+ }
201
+ }
202
+ let result: Rgba = {r: 255, g: 255, b: 255, a: 1};
203
+ for (const layer of layers.reverse()) {
204
+ result = over(layer, result);
205
+ }
206
+ return result;
207
+ }
208
+ function luminance({r, g, b}: Rgba): number {
209
+ const [lr, lg, lb] = [r, g, b].map(channel => {
210
+ const c = channel / 255;
211
+ return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
212
+ });
213
+ return 0.2126 * lr + 0.7152 * lg + 0.0722 * lb;
214
+ }
215
+ function contrast(element: Element): number | null {
216
+ const fg = parseColor(getComputedStyle(element).color);
217
+ if (fg == null) {
218
+ return null;
219
+ }
220
+ const bg = backdrop(element);
221
+ const a = luminance(over(fg, bg));
222
+ const b = luminance(bg);
223
+ const [hi, lo] = a > b ? [a, b] : [b, a];
224
+ return Math.round(((hi + 0.05) / (lo + 0.05)) * 100) / 100;
225
+ }
226
+ function rect(element: Element) {
227
+ const box = element.getBoundingClientRect();
228
+ return {
229
+ x: Math.round(box.x * 10) / 10,
230
+ y: Math.round(box.y * 10) / 10,
231
+ width: Math.round(box.width * 10) / 10,
232
+ height: Math.round(box.height * 10) / 10,
233
+ };
234
+ }
235
+
236
+ const cases = caseIds.map(id => {
237
+ const root = document.querySelector<HTMLElement>(
238
+ `[data-audit-case="${id}"]`,
239
+ );
240
+ if (root == null) {
241
+ return {id, present: false as const};
242
+ }
243
+ const surface = root.querySelector<HTMLElement>('.astryx-file-input');
244
+ const trigger = surface?.querySelector<HTMLButtonElement>(
245
+ 'button[type="button"][aria-label]',
246
+ );
247
+ const describedBy = (trigger?.getAttribute('aria-describedby') ?? '')
248
+ .split(/\s+/)
249
+ .filter(Boolean);
250
+ const describedTargets = describedBy.map(ref => {
251
+ const target = document.getElementById(ref);
252
+ return {
253
+ id: ref,
254
+ exists: target != null,
255
+ text: target?.textContent?.replace(/\s+/g, ' ').trim() ?? null,
256
+ };
257
+ });
258
+ const statusBox = root.querySelector<HTMLElement>(
259
+ '.astryx-field-status',
260
+ );
261
+ const statusIcon = surface?.querySelector<HTMLElement>(
262
+ '.astryx-input-status-icon',
263
+ );
264
+ const statusButton = statusIcon?.closest('button') ?? null;
265
+ const spinner = surface?.querySelector<HTMLElement>('.astryx-spinner');
266
+ const clearButton = surface?.querySelector<HTMLElement>(
267
+ '.astryx-input-clear-button',
268
+ );
269
+ const nameElement =
270
+ surface == null
271
+ ? null
272
+ : (Array.from(
273
+ surface.querySelectorAll<HTMLElement>('div,span'),
274
+ ).find(
275
+ element =>
276
+ element.children.length === 0 &&
277
+ element.closest('[aria-hidden="true"],[hidden]') == null &&
278
+ (element.textContent ?? '').includes('.pdf'),
279
+ ) ?? null);
280
+ const placeholder =
281
+ surface == null
282
+ ? null
283
+ : (Array.from(surface.querySelectorAll<HTMLElement>('span')).find(
284
+ element =>
285
+ element.children.length === 0 &&
286
+ /^(Choose file|Choose files|Drop files here)$/.test(
287
+ (element.textContent ?? '').trim(),
288
+ ),
289
+ ) ?? null);
290
+ const textElement = nameElement ?? placeholder;
291
+ // spec family:input-fields FR2: text and end controls own
292
+ // non-overlapping space.
293
+ const parts = [
294
+ ['status', statusButton],
295
+ ['spinner', spinner],
296
+ ['text', textElement],
297
+ ['clear', clearButton],
298
+ ]
299
+ .filter((part): part is [string, HTMLElement] => part[1] != null)
300
+ .map(([name, element]) => {
301
+ const box = element.getBoundingClientRect();
302
+ return {
303
+ name,
304
+ left: box.left,
305
+ right: box.right,
306
+ top: box.top,
307
+ bottom: box.bottom,
308
+ };
309
+ })
310
+ .filter(part => part.right > part.left && part.bottom > part.top);
311
+ const overlaps: string[] = [];
312
+ for (let a = 0; a < parts.length; a++) {
313
+ for (let b = a + 1; b < parts.length; b++) {
314
+ const p = parts[a];
315
+ const q = parts[b];
316
+ if (
317
+ p.left < q.right - 1 &&
318
+ q.left < p.right - 1 &&
319
+ p.top < q.bottom - 1 &&
320
+ q.top < p.bottom - 1
321
+ ) {
322
+ overlaps.push(`${p.name}/${q.name}`);
323
+ }
324
+ }
325
+ }
326
+ const surfaceRect = surface?.getBoundingClientRect();
327
+ const rootRect = root.getBoundingClientRect();
328
+ const surfaceStyle = surface ? getComputedStyle(surface) : null;
329
+ return {
330
+ id,
331
+ present: true as const,
332
+ surfaceCount: root.querySelectorAll('.astryx-file-input').length,
333
+ dataMode: surface?.getAttribute('data-mode') ?? null,
334
+ dataStatus: surface?.getAttribute('data-status') ?? null,
335
+ triggerLabel: trigger?.getAttribute('aria-label') ?? null,
336
+ ariaInvalid: trigger?.getAttribute('aria-invalid') ?? null,
337
+ ariaBusy: trigger?.getAttribute('aria-busy') ?? null,
338
+ ariaDisabled: trigger?.getAttribute('aria-disabled') ?? null,
339
+ triggerTabIndex: trigger?.tabIndex ?? null,
340
+ describedTargets,
341
+ statusBoxText:
342
+ statusBox?.textContent?.replace(/\s+/g, ' ').trim() ?? null,
343
+ statusIconCount:
344
+ surface?.querySelectorAll('.astryx-input-status-icon').length ?? 0,
345
+ statusButtonLabel: statusButton?.getAttribute('aria-label') ?? null,
346
+ statusButtonFocusable: statusButton
347
+ ? statusButton.tabIndex >= 0
348
+ : null,
349
+ uploadIconCount:
350
+ surface?.querySelectorAll('.astryx-file-input-icon').length ?? 0,
351
+ spinnerCount:
352
+ surface?.querySelectorAll('.astryx-spinner').length ?? 0,
353
+ nameText: nameElement?.textContent ?? null,
354
+ overlaps,
355
+ nameTruncated: nameElement
356
+ ? nameElement.scrollWidth > nameElement.clientWidth + 1
357
+ : null,
358
+ nameIsLong: nameElement
359
+ ? (nameElement.textContent ?? '').includes(longName)
360
+ : null,
361
+ textContrast: textElement ? contrast(textElement) : null,
362
+ textFontSize: textElement
363
+ ? getComputedStyle(textElement).fontSize
364
+ : null,
365
+ surfaceEscapesCase:
366
+ surfaceRect != null &&
367
+ (surfaceRect.left < rootRect.left - 1 ||
368
+ surfaceRect.right > rootRect.right + 1),
369
+ surfaceInlineOverflow: surface
370
+ ? surface.scrollWidth > surface.clientWidth + 1
371
+ : null,
372
+ borderColor: surfaceStyle?.borderTopColor ?? null,
373
+ backgroundColor: surfaceStyle?.backgroundColor ?? null,
374
+ borderStyle: surfaceStyle?.borderTopStyle ?? null,
375
+ geometry: surface ? rect(surface) : null,
376
+ };
377
+ });
378
+ const first = document.querySelector<HTMLElement>('.astryx-file-input');
379
+ return {
380
+ theme: document
381
+ .querySelector('[data-astryx-theme]')
382
+ ?.getAttribute('data-astryx-theme'),
383
+ mode: document.documentElement.getAttribute('data-theme'),
384
+ direction: first ? getComputedStyle(first).direction : null,
385
+ viewport: {width: innerWidth, height: innerHeight},
386
+ dpr: devicePixelRatio,
387
+ reducedMotion: matchMedia('(prefers-reduced-motion: reduce)').matches,
388
+ forcedColors: matchMedia('(forced-colors: active)').matches,
389
+ documentOverflow: document.documentElement.scrollWidth > innerWidth + 1,
390
+ fonts: document.fonts.status,
391
+ runningAnimations: document
392
+ .getAnimations()
393
+ .filter(animation => animation.playState === 'running').length,
394
+ storybookError: document.body.classList.contains(
395
+ 'sb-show-errordisplay',
396
+ ),
397
+ cases,
398
+ };
399
+ },
400
+ {caseIds: CASE_IDS, longName: LONG_NAME},
401
+ );
402
+ }
403
+
404
+ type Observed = Awaited<ReturnType<typeof observe>>;
405
+
406
+ function checkCases(
407
+ observed: Observed,
408
+ item: FrameCase,
409
+ check: (condition: boolean, message: string) => void,
410
+ ) {
411
+ for (const entry of observed.cases) {
412
+ const id = entry.id;
413
+ const expected = EXPECTED[id];
414
+ if (!entry.present) {
415
+ check(false, `${id}: case not rendered`);
416
+ continue;
417
+ }
418
+ check(entry.surfaceCount === 1, `${id}: ${entry.surfaceCount} surfaces`);
419
+ check(
420
+ entry.dataMode === expected.mode,
421
+ `${id}: data-mode ${entry.dataMode}`,
422
+ );
423
+ check(entry.triggerLabel != null, `${id}: no named trigger`);
424
+ check(entry.triggerTabIndex === 0, `${id}: trigger not in tab order`);
425
+ check(
426
+ entry.describedTargets.every(target => target.exists),
427
+ `${id}: aria-describedby names a missing element (${entry.describedTargets
428
+ .filter(target => !target.exists)
429
+ .map(target => target.id)
430
+ .join(',')})`,
431
+ );
432
+ check(
433
+ entry.uploadIconCount === (expected.uploadIcon ? 1 : 0),
434
+ `${id}: ${entry.uploadIconCount} upload glyphs`,
435
+ );
436
+ check(
437
+ entry.spinnerCount === (expected.loading ? 1 : 0),
438
+ `${id}: ${entry.spinnerCount} spinners`,
439
+ );
440
+ check(
441
+ (entry.ariaBusy === 'true') === Boolean(expected.loading),
442
+ `${id}: aria-busy ${entry.ariaBusy}`,
443
+ );
444
+ // Disabled states keep their own stories; no matrix case is disabled.
445
+ check(
446
+ entry.ariaDisabled == null,
447
+ `${id}: aria-disabled ${entry.ariaDisabled}`,
448
+ );
449
+ if (expected.fileName != null) {
450
+ check(
451
+ entry.nameText?.includes(expected.fileName) === true,
452
+ `${id}: file name not rendered`,
453
+ );
454
+ check(
455
+ entry.triggerLabel?.includes(expected.fileName) === true,
456
+ `${id}: trigger name omits the file`,
457
+ );
458
+ }
459
+ if (expected.status != null) {
460
+ check(entry.ariaInvalid === 'true', `${id}: aria-invalid missing`);
461
+ check(
462
+ entry.dataStatus === 'error',
463
+ `${id}: data-status ${entry.dataStatus}`,
464
+ );
465
+ if (expected.status === 'tooltip') {
466
+ // spec family:input-fields FR8: every input offers the tooltip
467
+ // placement, so the message must stay reachable from a focusable
468
+ // status button and describe the trigger.
469
+ check(entry.statusBoxText == null, `${id}: tooltip renders a box`);
470
+ check(
471
+ entry.statusIconCount === 1 && entry.statusButtonFocusable === true,
472
+ `${id}: no focusable status button carries the message`,
473
+ );
474
+ check(
475
+ entry.describedTargets.some(target =>
476
+ target.text?.includes(STATUS_MESSAGE),
477
+ ),
478
+ `${id}: trigger is not described by the status message`,
479
+ );
480
+ } else {
481
+ check(
482
+ entry.statusBoxText === STATUS_MESSAGE,
483
+ `${id}: status box ${entry.statusBoxText}`,
484
+ );
485
+ check(
486
+ entry.describedTargets.some(target =>
487
+ target.text?.includes(STATUS_MESSAGE),
488
+ ),
489
+ `${id}: trigger is not described by the status message`,
490
+ );
491
+ }
492
+ } else {
493
+ check(entry.ariaInvalid == null, `${id}: unexpected aria-invalid`);
494
+ check(entry.statusBoxText == null, `${id}: unexpected status box`);
495
+ }
496
+ check(
497
+ entry.overlaps.length === 0,
498
+ `${id}: parts overlap (${entry.overlaps.join(', ')})`,
499
+ );
500
+ check(!entry.surfaceEscapesCase, `${id}: surface escapes its column`);
501
+ check(!entry.surfaceInlineOverflow, `${id}: surface overflows inline`);
502
+ check(
503
+ expected.noText ? entry.textContrast == null : entry.textContrast != null,
504
+ `${id}: placeholder or file name text ${expected.noText ? 'rendered' : 'missing'}`,
505
+ );
506
+ if (!expected.noText && !item.forcedColors) {
507
+ // WCAG 2.2 SC 1.4.3 for the placeholder or file name text.
508
+ check(
509
+ entry.textContrast != null && entry.textContrast >= 4.5,
510
+ `${id}: text contrast ${entry.textContrast}`,
511
+ );
512
+ }
513
+ }
514
+ }
515
+
516
+ test.beforeAll(async () => {
517
+ fs.rmSync(OUTPUT, {recursive: true, force: true});
518
+ fs.mkdirSync(OUTPUT, {recursive: true});
519
+ checkoutSha = execFileSync('git', ['rev-parse', 'HEAD'], {
520
+ encoding: 'utf8',
521
+ }).trim();
522
+ const expected = process.env.ASTRYX_HEAD_SHA;
523
+ if (expected && expected !== checkoutSha) {
524
+ throw new Error(
525
+ `checkout ${checkoutSha} does not match expected head ${expected}`,
526
+ );
527
+ }
528
+ server = await serveStorybook(
529
+ process.env.ASTRYX_STORYBOOK_DIR ?? DEFAULT_STORYBOOK_DIR,
530
+ );
531
+ const response = await fetch(`${server.origin}/astryx-build-sha.txt`);
532
+ if (!response.ok) {
533
+ throw new Error(`Storybook build has no SHA stamp (${response.status})`);
534
+ }
535
+ storybookSha = (await response.text()).trim();
536
+ if (storybookSha !== checkoutSha) {
537
+ throw new Error(
538
+ `Storybook ${storybookSha} does not match checkout ${checkoutSha}`,
539
+ );
540
+ }
541
+ });
542
+
543
+ test.afterAll(async () => {
544
+ await server?.close();
545
+ });
546
+
547
+ for (const item of frames) {
548
+ test(item.key, async ({browser}) => {
549
+ const context = await browser.newContext({
550
+ viewport: item.viewport,
551
+ deviceScaleFactor: 1,
552
+ colorScheme: item.mode,
553
+ reducedMotion: 'reduce',
554
+ forcedColors: item.forcedColors ? 'active' : 'none',
555
+ });
556
+ const page = await context.newPage();
557
+ const pageErrors: string[] = [];
558
+ page.on('pageerror', error => pageErrors.push(String(error)));
559
+ await page.goto(storyUrl(item), {waitUntil: 'load'});
560
+ await page.locator('#storybook-root').waitFor();
561
+ await expect(page.locator('[data-audit-case]')).toHaveCount(
562
+ CASE_IDS.length,
563
+ );
564
+
565
+ const failures: string[] = [];
566
+ const check = (condition: boolean, message: string) => {
567
+ if (!condition) {
568
+ failures.push(message);
569
+ }
570
+ };
571
+
572
+ await settle(page);
573
+ const first = await observe(page);
574
+ await page.waitForTimeout(100);
575
+ await settle(page);
576
+ const observed = await observe(page);
577
+ const geometryStable =
578
+ JSON.stringify(first.cases.map(entry => entry.geometry ?? null)) ===
579
+ JSON.stringify(observed.cases.map(entry => entry.geometry ?? null));
580
+
581
+ const interaction: Record<string, unknown> = {};
582
+ if (item.interaction) {
583
+ // Keyboard focus reaches the first trigger and paints the surface.
584
+ const surface = page.locator(
585
+ '[data-audit-case="input-empty"] .astryx-file-input',
586
+ );
587
+ const restBorder = await surface.evaluate(
588
+ element => getComputedStyle(element).borderTopColor,
589
+ );
590
+ await page.locator('body').click({position: {x: 1, y: 1}});
591
+ await page.keyboard.press('Tab');
592
+ const focusedLabel = await page.evaluate(
593
+ () => document.activeElement?.getAttribute('aria-label') ?? null,
594
+ );
595
+ const focusBorder = await surface.evaluate(
596
+ element => getComputedStyle(element).borderTopColor,
597
+ );
598
+ check(focusedLabel === 'Resume', `focus landed on ${focusedLabel}`);
599
+ check(focusBorder !== restBorder, 'keyboard focus does not paint');
600
+ // Dragging a file over the empty dropzone shows the drop hint.
601
+ const dropzone = page.locator(
602
+ '[data-audit-case="dropzone-empty"] .astryx-file-input',
603
+ );
604
+ const restBackground = await dropzone.evaluate(
605
+ element => getComputedStyle(element).backgroundColor,
606
+ );
607
+ const restDropBorder = await dropzone.evaluate(
608
+ element => getComputedStyle(element).borderTopColor,
609
+ );
610
+ const dataTransfer = await page.evaluateHandle(() => {
611
+ const transfer = new DataTransfer();
612
+ transfer.items.add(new File(['x'], 'drag.pdf'));
613
+ return transfer;
614
+ });
615
+ await dropzone.dispatchEvent('dragenter', {dataTransfer});
616
+ await settle(page);
617
+ const dragText = await dropzone.innerText();
618
+ const dragBackground = await dropzone.evaluate(
619
+ element => getComputedStyle(element).backgroundColor,
620
+ );
621
+ const dragBorder = await dropzone.evaluate(
622
+ element => getComputedStyle(element).borderTopColor,
623
+ );
624
+ check(dragText.includes('Drop files here'), 'drop hint not shown');
625
+ // The drag state paints the accent border and the accent-muted fill; a
626
+ // theme may resolve that fill to the surface color, so either cue counts.
627
+ check(
628
+ dragBackground !== restBackground || dragBorder !== restDropBorder,
629
+ 'drag-over does not paint',
630
+ );
631
+ await dropzone.dispatchEvent('dragleave', {dataTransfer});
632
+
633
+ // The tooltip status button is the next Tab stop after its trigger,
634
+ // opens its tooltip on focus, and never opens the file picker.
635
+ const tooltipCase = page.locator(
636
+ '[data-audit-case="dropzone-error-tooltip"]',
637
+ );
638
+ await tooltipCase
639
+ .locator('button[type="button"][aria-label]')
640
+ .first()
641
+ .focus();
642
+ await page.keyboard.press('Tab');
643
+ const statusFocusLabel = await page.evaluate(
644
+ () => document.activeElement?.getAttribute('aria-label') ?? null,
645
+ );
646
+ await settle(page);
647
+ const tooltipOpen = await page.evaluate(
648
+ message =>
649
+ Array.from(document.querySelectorAll('[role="tooltip"]')).some(
650
+ element =>
651
+ element.matches(':popover-open') &&
652
+ (element.textContent ?? '').includes(message),
653
+ ),
654
+ STATUS_MESSAGE,
655
+ );
656
+ check(
657
+ statusFocusLabel === 'Error details',
658
+ `Tab after the trigger landed on ${statusFocusLabel}`,
659
+ );
660
+ check(tooltipOpen, 'status tooltip does not open on focus');
661
+ // Positive control: a click on the empty dropzone surface does raise
662
+ // the file chooser, so the negative check below can fail.
663
+ const controlChooser = page
664
+ .waitForEvent('filechooser', {timeout: 3000})
665
+ .then(() => true)
666
+ .catch(() => false);
667
+ await page
668
+ .locator('[data-audit-case="dropzone-empty"] .astryx-file-input')
669
+ .click();
670
+ const controlPickerOpened = await controlChooser;
671
+ check(controlPickerOpened, 'surface click raises no file chooser');
672
+ const chooser = page
673
+ .waitForEvent('filechooser', {timeout: 750})
674
+ .then(() => true)
675
+ .catch(() => false);
676
+ await tooltipCase.getByRole('button', {name: 'Error details'}).click();
677
+ const pickerOpened = await chooser;
678
+ check(!pickerOpened, 'clicking the status button opens the file picker');
679
+ Object.assign(interaction, {
680
+ focusedLabel,
681
+ restBorder,
682
+ focusBorder,
683
+ dragText,
684
+ restBackground,
685
+ dragBackground,
686
+ restDropBorder,
687
+ dragBorder,
688
+ statusFocusLabel,
689
+ tooltipOpen,
690
+ controlPickerOpened,
691
+ pickerOpened,
692
+ });
693
+ }
694
+
695
+ check(storybookSha === checkoutSha, 'storybook build mismatch');
696
+ check(pageErrors.length === 0, `page errors: ${pageErrors.join(' | ')}`);
697
+ check(!observed.storybookError, 'storybook error display');
698
+ check(observed.theme === item.theme, `theme ${observed.theme}`);
699
+ check(observed.mode === item.mode, `mode ${observed.mode}`);
700
+ check(
701
+ observed.direction === item.direction,
702
+ `direction ${observed.direction}`,
703
+ );
704
+ check(
705
+ observed.viewport.width === item.viewport.width &&
706
+ observed.viewport.height === item.viewport.height,
707
+ 'viewport mismatch',
708
+ );
709
+ check(observed.dpr === 1, `dpr ${observed.dpr}`);
710
+ check(observed.reducedMotion, 'reduced motion not applied');
711
+ check(
712
+ observed.forcedColors === item.forcedColors,
713
+ `forced colors ${observed.forcedColors}`,
714
+ );
715
+ check(observed.fonts === 'loaded', `fonts ${observed.fonts}`);
716
+ check(geometryStable, 'geometry changed between samples');
717
+ check(!observed.documentOverflow, 'document scrolls horizontally');
718
+ checkCases(observed, item, check);
719
+
720
+ const png = await page.screenshot({animations: 'disabled', fullPage: true});
721
+ check(png.length > 1000, 'screenshot is empty');
722
+ const image = `${item.key}.png`;
723
+ const receipt = {
724
+ schemaVersion: 1,
725
+ expected: {
726
+ build: checkoutSha,
727
+ storyId: STORY_ID,
728
+ mode: item.mode,
729
+ direction: item.direction,
730
+ theme: item.theme,
731
+ viewport: item.viewport,
732
+ forcedColors: item.forcedColors,
733
+ interaction: item.interaction,
734
+ cases: EXPECTED,
735
+ },
736
+ observed: {
737
+ build: storybookSha,
738
+ ...observed,
739
+ interaction,
740
+ geometryStable,
741
+ pageErrors,
742
+ },
743
+ image: {
744
+ file: image,
745
+ sha256: createHash('sha256').update(png).digest('hex'),
746
+ width: png.readUInt32BE(16),
747
+ height: png.readUInt32BE(20),
748
+ },
749
+ failures,
750
+ passed: failures.length === 0,
751
+ };
752
+ fs.writeFileSync(path.join(OUTPUT, image), png);
753
+ fs.writeFileSync(
754
+ path.join(OUTPUT, `${item.key}.sensors.json`),
755
+ `${JSON.stringify(receipt, null, 2)}\n`,
756
+ );
757
+ await context.close();
758
+ });
759
+ }
760
+
761
+ test('manifest is complete', async () => {
762
+ const receiptFiles = fs
763
+ .readdirSync(OUTPUT)
764
+ .filter(file => file.endsWith('.sensors.json'));
765
+ const receipts = receiptFiles.map(
766
+ file =>
767
+ JSON.parse(fs.readFileSync(path.join(OUTPUT, file), 'utf8')) as {
768
+ passed: boolean;
769
+ expected: {mode: string; theme: string};
770
+ failures: string[];
771
+ },
772
+ );
773
+ fs.writeFileSync(
774
+ path.join(OUTPUT, 'manifest.json'),
775
+ `${JSON.stringify(
776
+ {
777
+ schemaVersion: 1,
778
+ component: 'core/FileInput',
779
+ build: checkoutSha,
780
+ frames: frames.map(item => ({
781
+ key: item.key,
782
+ image: `${item.key}.png`,
783
+ receipt: `${item.key}.sensors.json`,
784
+ })),
785
+ },
786
+ null,
787
+ 2,
788
+ )}\n`,
789
+ );
790
+ expect(receiptFiles).toHaveLength(frames.length);
791
+ expect(
792
+ receipts
793
+ .filter(receipt => !receipt.passed)
794
+ .map(receipt => ({frame: receipt.expected, failures: receipt.failures})),
795
+ ).toEqual([]);
796
+ });