@astryxdesign/core 0.7.4 → 0.7.5-canary.04434e7

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 (546) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +2 -2
  2. package/dist/AlertDialog/index.d.ts +4 -4
  3. package/dist/AlertDialog/useImperativeAlertDialog.d.ts +1 -1
  4. package/dist/AppShell/AppShell.d.ts +4 -4
  5. package/dist/AppShell/index.d.ts +4 -4
  6. package/dist/AspectRatio/AspectRatio.d.ts +1 -1
  7. package/dist/AspectRatio/index.d.ts +2 -2
  8. package/dist/Avatar/Avatar.d.ts +2 -2
  9. package/dist/Avatar/AvatarStatusDot.d.ts +2 -2
  10. package/dist/Avatar/index.d.ts +4 -4
  11. package/dist/AvatarGroup/AvatarGroup.d.ts +2 -2
  12. package/dist/AvatarGroup/AvatarGroupContext.d.ts +1 -1
  13. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
  14. package/dist/AvatarGroup/index.d.ts +6 -6
  15. package/dist/Badge/Badge.d.ts +2 -2
  16. package/dist/Badge/index.d.ts +2 -2
  17. package/dist/Banner/Banner.d.ts +4 -4
  18. package/dist/Banner/index.d.ts +2 -2
  19. package/dist/Blockquote/Blockquote.d.ts +1 -1
  20. package/dist/Blockquote/index.d.ts +2 -2
  21. package/dist/BottomSheet/BottomSheet.d.ts +10 -6
  22. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  23. package/dist/BottomSheet/BottomSheet.js +12 -1
  24. package/dist/BottomSheet/BottomSheetPanel.d.ts +3 -3
  25. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +1 -1
  26. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +2 -2
  27. package/dist/BottomSheet/index.d.ts +4 -4
  28. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +4 -4
  29. package/dist/Breadcrumbs/Breadcrumbs.d.ts +2 -2
  30. package/dist/Breadcrumbs/index.d.ts +12 -12
  31. package/dist/Button/Button.d.ts +4 -4
  32. package/dist/Button/index.d.ts +2 -2
  33. package/dist/ButtonGroup/ButtonGroup.d.ts +4 -4
  34. package/dist/ButtonGroup/index.d.ts +4 -4
  35. package/dist/Calendar/Calendar.d.ts +3 -3
  36. package/dist/Calendar/dayCellUtils.d.ts +1 -1
  37. package/dist/Calendar/getInitialFocusDate.d.ts +2 -2
  38. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +1 -1
  39. package/dist/Calendar/hooks/index.d.ts +6 -6
  40. package/dist/Calendar/hooks/useCalendarConstraints.d.ts +2 -2
  41. package/dist/Calendar/hooks/useCalendarDays.d.ts +2 -2
  42. package/dist/Calendar/hooks/useCalendarNavigation.d.ts +2 -2
  43. package/dist/Calendar/index.d.ts +5 -5
  44. package/dist/Calendar/utils.d.ts +1 -1
  45. package/dist/Card/Card.d.ts +4 -4
  46. package/dist/Card/index.d.ts +2 -2
  47. package/dist/Carousel/Carousel.d.ts +2 -2
  48. package/dist/Carousel/index.d.ts +2 -2
  49. package/dist/Center/Center.d.ts +2 -2
  50. package/dist/Center/index.d.ts +2 -2
  51. package/dist/Chat/ChatComposer.d.ts +1 -1
  52. package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
  53. package/dist/Chat/ChatComposerInput.d.ts +4 -4
  54. package/dist/Chat/ChatDictationButton.d.ts +2 -2
  55. package/dist/Chat/ChatLayout.d.ts +1 -1
  56. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  57. package/dist/Chat/ChatMessage.d.ts +2 -2
  58. package/dist/Chat/ChatMessageBubble.d.ts +2 -2
  59. package/dist/Chat/ChatMessageList.d.ts +3 -3
  60. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  61. package/dist/Chat/ChatSendButton.d.ts +1 -1
  62. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  63. package/dist/Chat/ChatTokenizedText.d.ts +2 -2
  64. package/dist/Chat/ChatToolCalls.d.ts +1 -1
  65. package/dist/Chat/index.d.ts +43 -43
  66. package/dist/Chat/useChatComposerTokens.d.ts +1 -1
  67. package/dist/Chat/useChatDictation.d.ts +1 -1
  68. package/dist/Chat/useChatPasteAsToken.d.ts +1 -1
  69. package/dist/Chat/useTriggerMenu.d.ts +2 -2
  70. package/dist/CheckboxInput/CheckboxInput.d.ts +4 -4
  71. package/dist/CheckboxInput/index.d.ts +2 -2
  72. package/dist/CheckboxList/CheckboxList.d.ts +4 -4
  73. package/dist/CheckboxList/CheckboxListItem.d.ts +2 -2
  74. package/dist/CheckboxList/index.d.ts +4 -4
  75. package/dist/Citation/Citation.d.ts +1 -1
  76. package/dist/Citation/index.d.ts +2 -2
  77. package/dist/ClickableCard/ClickableCard.d.ts +3 -3
  78. package/dist/ClickableCard/index.d.ts +2 -2
  79. package/dist/Code/Code.d.ts +1 -1
  80. package/dist/Code/index.d.ts +1 -1
  81. package/dist/CodeBlock/CodeBlock.d.ts +2 -2
  82. package/dist/CodeBlock/highlightRanges.d.ts +1 -1
  83. package/dist/CodeBlock/index.d.ts +8 -8
  84. package/dist/Collapsible/Collapsible.d.ts +2 -2
  85. package/dist/Collapsible/CollapsibleGroup.d.ts +2 -2
  86. package/dist/Collapsible/index.d.ts +7 -7
  87. package/dist/CommandPalette/CommandPalette.d.ts +2 -2
  88. package/dist/CommandPalette/CommandPaletteContext.d.ts +1 -1
  89. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
  90. package/dist/CommandPalette/CommandPaletteFooter.d.ts +1 -1
  91. package/dist/CommandPalette/CommandPaletteGroup.d.ts +1 -1
  92. package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
  93. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  94. package/dist/CommandPalette/CommandPaletteList.d.ts +1 -1
  95. package/dist/CommandPalette/index.d.ts +16 -16
  96. package/dist/ComplexSelector/ComplexSelector.d.ts +5 -5
  97. package/dist/ComplexSelector/index.d.ts +1 -1
  98. package/dist/ContextMenu/ContextMenu.d.ts +4 -4
  99. package/dist/ContextMenu/index.d.ts +9 -9
  100. package/dist/DateInput/DateInput.d.ts +7 -7
  101. package/dist/DateInput/MonthScroller.d.ts +1 -1
  102. package/dist/DateInput/NativeDateField.d.ts +1 -1
  103. package/dist/DateInput/TouchDateField.d.ts +1 -1
  104. package/dist/DateInput/Wheel.d.ts.map +1 -1
  105. package/dist/DateInput/Wheel.js +1 -1
  106. package/dist/DateInput/index.d.ts +2 -2
  107. package/dist/DateInput/monthGeometry.d.ts +1 -1
  108. package/dist/DateRangeInput/DateRangeInput.d.ts +6 -6
  109. package/dist/DateRangeInput/index.d.ts +2 -2
  110. package/dist/DateTimeInput/DateTimeInput.d.ts +6 -6
  111. package/dist/DateTimeInput/NativeDateSegment.d.ts +3 -3
  112. package/dist/DateTimeInput/NativeTimeSegment.d.ts +4 -4
  113. package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
  114. package/dist/DateTimeInput/index.d.ts +2 -2
  115. package/dist/Dialog/Dialog.d.ts +3 -3
  116. package/dist/Dialog/DialogHeader.d.ts +1 -1
  117. package/dist/Dialog/index.d.ts +6 -6
  118. package/dist/Dialog/useImperativeDialog.d.ts +1 -1
  119. package/dist/Divider/Divider.d.ts +2 -2
  120. package/dist/Divider/index.d.ts +2 -2
  121. package/dist/Drawer/Drawer.d.ts +3 -3
  122. package/dist/Drawer/DrawerHeader.d.ts +1 -1
  123. package/dist/Drawer/index.d.ts +4 -4
  124. package/dist/DropdownMenu/DropdownMenu.d.ts +5 -5
  125. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +2 -2
  126. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +1 -1
  127. package/dist/DropdownMenu/DropdownMenuGroup.d.ts +1 -1
  128. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -2
  129. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
  130. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +12 -7
  131. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  132. package/dist/DropdownMenu/DropdownMenuRadioItem.js +13 -5
  133. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +2 -2
  134. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts +1 -1
  135. package/dist/DropdownMenu/index.d.ts +10 -10
  136. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +2 -2
  137. package/dist/DropdownMenu/renderDropdownItems.d.ts +1 -1
  138. package/dist/DropdownMenu/useMenuDrillIn.d.ts +1 -1
  139. package/dist/EmptyState/EmptyState.d.ts +1 -1
  140. package/dist/EmptyState/index.d.ts +2 -2
  141. package/dist/Field/Field.d.ts +5 -5
  142. package/dist/Field/FieldLabel.d.ts +2 -2
  143. package/dist/Field/PanelSearchInput.d.ts +1 -1
  144. package/dist/Field/fieldInputFamily.testing.d.ts +1 -1
  145. package/dist/Field/fieldParts.d.ts +1 -1
  146. package/dist/Field/index.d.ts +10 -10
  147. package/dist/Field/inputDisabledFocus.d.ts +14 -0
  148. package/dist/Field/inputDisabledFocus.d.ts.map +1 -0
  149. package/dist/Field/inputDisabledFocus.js +19 -0
  150. package/dist/FieldStatus/FieldStatus.d.ts +3 -3
  151. package/dist/FieldStatus/index.d.ts +2 -2
  152. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts +1 -1
  153. package/dist/FileInput/FileInput.d.ts +4 -4
  154. package/dist/FileInput/index.d.ts +2 -2
  155. package/dist/FormLayout/FormLayout.d.ts +2 -2
  156. package/dist/FormLayout/index.d.ts +4 -4
  157. package/dist/Grid/Grid.d.ts +3 -3
  158. package/dist/Grid/GridSpan.d.ts +1 -1
  159. package/dist/Grid/index.d.ts +4 -4
  160. package/dist/HStack/HStack.d.ts +2 -2
  161. package/dist/HStack/index.d.ts +1 -1
  162. package/dist/Heading/Heading.d.ts +4 -4
  163. package/dist/Heading/index.d.ts +1 -1
  164. package/dist/HoverCard/HoverCard.d.ts +4 -4
  165. package/dist/HoverCard/index.d.ts +4 -4
  166. package/dist/HoverCard/useHoverCard.d.ts +2 -2
  167. package/dist/Icon/Icon.d.ts +3 -3
  168. package/dist/Icon/IconDefaultSizeContext.d.ts +1 -1
  169. package/dist/Icon/defaultIcons.d.ts +1 -1
  170. package/dist/Icon/globalIconRegistry.d.ts +1 -1
  171. package/dist/Icon/index.d.ts +5 -5
  172. package/dist/Icon/useIcon.d.ts +1 -1
  173. package/dist/IconButton/IconButton.d.ts +1 -1
  174. package/dist/IconButton/index.d.ts +2 -2
  175. package/dist/Indicator/CheckIndicator.d.ts +1 -1
  176. package/dist/Indicator/CheckboxIndicator.d.ts +1 -1
  177. package/dist/Indicator/RadioIndicator.d.ts +1 -1
  178. package/dist/Indicator/index.d.ts +8 -8
  179. package/dist/Indicator/indicatorRegistry.d.ts +2 -2
  180. package/dist/Indicator/types.d.ts +1 -1
  181. package/dist/Indicator/useIndicator.d.ts +2 -2
  182. package/dist/InputGroup/InputGroup.d.ts +2 -2
  183. package/dist/InputGroup/InputGroupText.d.ts +1 -1
  184. package/dist/InputGroup/index.d.ts +6 -6
  185. package/dist/InteractiveRoleContext/InteractiveRoleContext.d.ts +1 -1
  186. package/dist/InteractiveRoleContext/index.d.ts +1 -1
  187. package/dist/Item/Item.d.ts +1 -1
  188. package/dist/Item/ItemSwipeLayer.d.ts +2 -2
  189. package/dist/Item/index.d.ts +2 -2
  190. package/dist/Kbd/Kbd.d.ts +1 -1
  191. package/dist/Kbd/index.d.ts +2 -2
  192. package/dist/Layer/LayerProvider.d.ts +1 -1
  193. package/dist/Layer/index.d.ts +18 -18
  194. package/dist/Layer/layerInset.d.ts +1 -1
  195. package/dist/Layer/layerSlideRules.d.ts +1 -1
  196. package/dist/Layer/modalOutlet.d.ts +1 -1
  197. package/dist/Layer/modalOutlet.js +1 -1
  198. package/dist/Layer/useLayerDismissal.d.ts +1 -1
  199. package/dist/Layer/useTouchTrigger.d.ts +14 -1
  200. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  201. package/dist/Layer/useTouchTrigger.js +72 -17
  202. package/dist/Layout/Layout.d.ts +2 -2
  203. package/dist/Layout/LayoutContent.d.ts +2 -2
  204. package/dist/Layout/LayoutFooter.d.ts +2 -2
  205. package/dist/Layout/LayoutHeader.d.ts +2 -2
  206. package/dist/Layout/LayoutPanel.d.ts +3 -3
  207. package/dist/Layout/index.d.ts +29 -29
  208. package/dist/Layout/padding.stylex.d.ts +1 -1
  209. package/dist/Lightbox/Lightbox.d.ts +1 -1
  210. package/dist/Lightbox/index.d.ts +4 -4
  211. package/dist/Lightbox/useLightbox.d.ts +1 -1
  212. package/dist/Link/Link.d.ts +3 -3
  213. package/dist/Link/LinkContext.d.ts +1 -1
  214. package/dist/Link/LinkProvider.d.ts +1 -1
  215. package/dist/Link/index.d.ts +8 -8
  216. package/dist/Link/useLinkComponent.d.ts +1 -1
  217. package/dist/List/List.d.ts +3 -3
  218. package/dist/List/ListItem.d.ts +2 -2
  219. package/dist/List/index.d.ts +4 -4
  220. package/dist/Markdown/Markdown.d.ts +4 -4
  221. package/dist/Markdown/headingProjection.d.ts +3 -3
  222. package/dist/Markdown/index.d.ts +7 -7
  223. package/dist/Markdown/parser/index.d.ts +3 -3
  224. package/dist/Markdown/parser.d.ts +3 -3
  225. package/dist/Markdown/plugin-renderer/MarkdownPluginNodeRenderer.d.ts +1 -1
  226. package/dist/Markdown/plugin-renderer/index.d.ts +2 -2
  227. package/dist/Markdown/plugins/frontmatter.d.ts +2 -2
  228. package/dist/Markdown/plugins/headingLinks.d.ts +2 -2
  229. package/dist/Markdown/plugins/index.d.ts +14 -14
  230. package/dist/Markdown/plugins/protocol.d.ts +1 -1
  231. package/dist/Markdown/plugins/semanticFence.d.ts +2 -2
  232. package/dist/Markdown/plugins/softBreaks.d.ts +1 -1
  233. package/dist/Markdown/plugins/sourceDecoration.d.ts +2 -2
  234. package/dist/Markdown/plugins/sourceLines.d.ts +1 -1
  235. package/dist/Markdown/plugins/textTransform.d.ts +2 -2
  236. package/dist/Markdown/remark.d.ts +1 -1
  237. package/dist/Markdown/utils.d.ts +4 -4
  238. package/dist/MetadataList/MetadataList.d.ts +2 -2
  239. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  240. package/dist/MetadataList/index.d.ts +5 -5
  241. package/dist/MobileNav/MobileNav.d.ts +1 -1
  242. package/dist/MobileNav/MobileNavToggle.d.ts +1 -1
  243. package/dist/MobileNav/index.d.ts +4 -4
  244. package/dist/MoreMenu/MoreMenu.d.ts +4 -4
  245. package/dist/MoreMenu/index.d.ts +1 -1
  246. package/dist/MultiSelector/MultiSelector.d.ts +7 -7
  247. package/dist/MultiSelector/hooks.d.ts +1 -1
  248. package/dist/MultiSelector/index.d.ts +3 -3
  249. package/dist/MultiSelector/types.d.ts +1 -1
  250. package/dist/NavIcon/NavIcon.d.ts +1 -1
  251. package/dist/NavIcon/index.d.ts +2 -2
  252. package/dist/NavMenu/NavHeadingMenu.d.ts +2 -2
  253. package/dist/NavMenu/NavHeadingMenuItem.d.ts +2 -2
  254. package/dist/NavMenu/index.d.ts +6 -6
  255. package/dist/NumberInput/NumberInput.d.ts +8 -8
  256. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  257. package/dist/NumberInput/NumberInput.js +46 -20
  258. package/dist/NumberInput/index.d.ts +2 -2
  259. package/dist/NumberInput/numberInputCommit.d.ts +1 -1
  260. package/dist/NumberInput/numberParser.d.ts +1 -1
  261. package/dist/Outline/Outline.d.ts +3 -3
  262. package/dist/Outline/index.d.ts +7 -7
  263. package/dist/Outline/parseOutlineFromMarkdown.d.ts +2 -2
  264. package/dist/Outline/useOutlineFromDOM.d.ts +1 -1
  265. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -3
  266. package/dist/Outline/useScrollSpy.d.ts +1 -1
  267. package/dist/OverflowList/OverflowList.d.ts +2 -2
  268. package/dist/OverflowList/index.d.ts +2 -2
  269. package/dist/Overlay/Overlay.d.ts +2 -2
  270. package/dist/Overlay/index.d.ts +5 -5
  271. package/dist/Overlay/useOverlay.d.ts +1 -1
  272. package/dist/Pagination/Pagination.d.ts +2 -2
  273. package/dist/Pagination/index.d.ts +2 -2
  274. package/dist/Popover/Popover.d.ts +3 -3
  275. package/dist/Popover/index.d.ts +4 -4
  276. package/dist/Popover/usePopover.d.ts +2 -2
  277. package/dist/PowerSearch/PowerSearch.d.ts +5 -5
  278. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +2 -2
  279. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  280. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  281. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +2 -2
  282. package/dist/PowerSearch/formatFilterValue.d.ts +3 -3
  283. package/dist/PowerSearch/index.d.ts +8 -8
  284. package/dist/PowerSearch/resolveDateTimeRangePart.d.ts +1 -1
  285. package/dist/PowerSearch/resolveOperatorLabel.d.ts +2 -2
  286. package/dist/PowerSearch/types.d.ts +1 -1
  287. package/dist/PowerSearch/useInternalConfig.d.ts +1 -1
  288. package/dist/PowerSearch/usePowerSearchConfig.d.ts +1 -1
  289. package/dist/PowerSearch/usePowerSearchSource.d.ts +3 -3
  290. package/dist/PowerSearch/utils.d.ts +3 -3
  291. package/dist/ProgressBar/ProgressBar.d.ts +2 -2
  292. package/dist/ProgressBar/index.d.ts +2 -2
  293. package/dist/RadioList/RadioList.d.ts +3 -3
  294. package/dist/RadioList/RadioListItem.d.ts +2 -2
  295. package/dist/RadioList/index.d.ts +4 -4
  296. package/dist/Resizable/ResizeHandle.d.ts +2 -2
  297. package/dist/Resizable/index.d.ts +6 -6
  298. package/dist/Resizable/useResizable.d.ts +2 -2
  299. package/dist/Resizable/utils.d.ts +3 -3
  300. package/dist/ScrollableArea/ScrollableArea.d.ts +3 -3
  301. package/dist/ScrollableArea/index.d.ts +4 -4
  302. package/dist/Section/Section.d.ts +3 -3
  303. package/dist/Section/index.d.ts +2 -2
  304. package/dist/SegmentedControl/SegmentedControl.d.ts +2 -2
  305. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  306. package/dist/SegmentedControl/index.d.ts +5 -5
  307. package/dist/SelectableCard/SelectableCard.d.ts +3 -3
  308. package/dist/SelectableCard/index.d.ts +2 -2
  309. package/dist/Selector/Selector.d.ts +8 -8
  310. package/dist/Selector/SelectorOption.d.ts +1 -1
  311. package/dist/Selector/hooks.d.ts +1 -1
  312. package/dist/Selector/index.d.ts +4 -4
  313. package/dist/Selector/types.d.ts +1 -1
  314. package/dist/Selector/useSelectorPresentation.d.ts +2 -2
  315. package/dist/Selector/utils.d.ts +1 -1
  316. package/dist/SideNav/SideNav.d.ts +3 -3
  317. package/dist/SideNav/SideNavCollapseButton.d.ts +3 -3
  318. package/dist/SideNav/SideNavHeading.d.ts +2 -2
  319. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  320. package/dist/SideNav/SideNavHeading.js +34 -0
  321. package/dist/SideNav/SideNavItem.d.ts +4 -4
  322. package/dist/SideNav/SideNavSection.d.ts +1 -1
  323. package/dist/SideNav/index.d.ts +14 -14
  324. package/dist/SizeContext/index.d.ts +1 -1
  325. package/dist/Skeleton/Skeleton.d.ts +1 -1
  326. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  327. package/dist/Skeleton/Skeleton.js +12 -3
  328. package/dist/Skeleton/index.d.ts +2 -2
  329. package/dist/Slider/Slider.d.ts +3 -3
  330. package/dist/Slider/index.d.ts +2 -2
  331. package/dist/Spinner/Spinner.d.ts +1 -1
  332. package/dist/Spinner/index.d.ts +2 -2
  333. package/dist/Stack/Stack.d.ts +3 -3
  334. package/dist/Stack/StackItem.d.ts +2 -2
  335. package/dist/Stack/index.d.ts +6 -6
  336. package/dist/Stack/stack.stylex.d.ts +1 -1
  337. package/dist/StatusDot/StatusDot.d.ts +2 -2
  338. package/dist/StatusDot/index.d.ts +2 -2
  339. package/dist/Stepper/Step.d.ts +2 -2
  340. package/dist/Stepper/Step.d.ts.map +1 -1
  341. package/dist/Stepper/Step.js +3 -3
  342. package/dist/Stepper/Stepper.d.ts +2 -2
  343. package/dist/Stepper/index.d.ts +7 -7
  344. package/dist/Switch/Switch.d.ts +4 -4
  345. package/dist/Switch/index.d.ts +2 -2
  346. package/dist/TabList/Tab.d.ts +2 -2
  347. package/dist/TabList/TabList.d.ts +3 -3
  348. package/dist/TabList/TabMenu.d.ts +2 -2
  349. package/dist/TabList/index.d.ts +8 -8
  350. package/dist/Table/BaseTable.d.ts +1 -1
  351. package/dist/Table/Table.d.ts +1 -1
  352. package/dist/Table/TableBody.d.ts +1 -1
  353. package/dist/Table/TableCell.d.ts +3 -3
  354. package/dist/Table/TableContext.d.ts +1 -1
  355. package/dist/Table/TableFooter.d.ts +1 -1
  356. package/dist/Table/TableHeader.d.ts +1 -1
  357. package/dist/Table/TableHeaderCell.d.ts +3 -3
  358. package/dist/Table/TableRow.d.ts +2 -2
  359. package/dist/Table/TableSelectionToolbar.d.ts +2 -2
  360. package/dist/Table/columnUtils.d.ts +1 -1
  361. package/dist/Table/index.d.ts +54 -54
  362. package/dist/Table/plugins/columnResize/index.d.ts +2 -2
  363. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts +1 -1
  364. package/dist/Table/plugins/columnSettings/index.d.ts +4 -4
  365. package/dist/Table/plugins/columnSettings/useTableColumnSettings.d.ts +2 -2
  366. package/dist/Table/plugins/columnSettings/useTableColumnSettingsState.d.ts +1 -1
  367. package/dist/Table/plugins/filtering/index.d.ts +4 -4
  368. package/dist/Table/plugins/filtering/useTableFilterState.d.ts +1 -1
  369. package/dist/Table/plugins/filtering/useTableFiltering.d.ts +2 -2
  370. package/dist/Table/plugins/groupedRows/index.d.ts +2 -2
  371. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  372. package/dist/Table/plugins/pagination/index.d.ts +3 -3
  373. package/dist/Table/plugins/pagination/useTablePagination.d.ts +1 -1
  374. package/dist/Table/plugins/rowExpansion/index.d.ts +2 -2
  375. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
  376. package/dist/Table/plugins/rowIndex/index.d.ts +2 -2
  377. package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts +1 -1
  378. package/dist/Table/plugins/rowStatus/index.d.ts +2 -2
  379. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +2 -2
  380. package/dist/Table/plugins/selection/index.d.ts +4 -4
  381. package/dist/Table/plugins/selection/useTableSelection.d.ts +1 -1
  382. package/dist/Table/plugins/selection/useTableSelectionState.d.ts +1 -1
  383. package/dist/Table/plugins/sortable/index.d.ts +4 -4
  384. package/dist/Table/plugins/sortable/useTableSortable.d.ts +1 -1
  385. package/dist/Table/plugins/sortable/useTableSortableState.d.ts +1 -1
  386. package/dist/Table/plugins/stickyColumns/index.d.ts +2 -2
  387. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +1 -1
  388. package/dist/Table/plugins/tree/index.d.ts +4 -4
  389. package/dist/Table/plugins/tree/useTableTreeData.d.ts +1 -1
  390. package/dist/Table/plugins/tree/useTableTreeState.d.ts +1 -1
  391. package/dist/Table/tableContextMenu.d.ts +2 -2
  392. package/dist/Table/types.d.ts +3 -3
  393. package/dist/Table/useBaseTablePlugins.d.ts +1 -1
  394. package/dist/Table/useTableCellStyles.d.ts +2 -2
  395. package/dist/Table/utils.d.ts +2 -2
  396. package/dist/Text/Text.d.ts +3 -3
  397. package/dist/Text/index.d.ts +4 -4
  398. package/dist/TextArea/TextArea.d.ts +10 -8
  399. package/dist/TextArea/TextArea.d.ts.map +1 -1
  400. package/dist/TextArea/TextArea.js +14 -11
  401. package/dist/TextArea/index.d.ts +2 -2
  402. package/dist/TextInput/TextInput.d.ts +11 -9
  403. package/dist/TextInput/TextInput.d.ts.map +1 -1
  404. package/dist/TextInput/TextInput.js +27 -17
  405. package/dist/TextInput/index.d.ts +2 -2
  406. package/dist/Thumbnail/Thumbnail.d.ts +1 -1
  407. package/dist/Thumbnail/index.d.ts +2 -2
  408. package/dist/TimeInput/TimeInput.d.ts +6 -6
  409. package/dist/TimeInput/TouchTimeField.d.ts +1 -1
  410. package/dist/TimeInput/index.d.ts +3 -3
  411. package/dist/Timer/Timer.d.ts +2 -2
  412. package/dist/Timer/index.d.ts +2 -2
  413. package/dist/Timestamp/Timestamp.d.ts +3 -3
  414. package/dist/Timestamp/TimestampHoverCard.d.ts +1 -1
  415. package/dist/Timestamp/formatInstant.d.ts +2 -2
  416. package/dist/Timestamp/formatRelativeTime.d.ts +1 -1
  417. package/dist/Timestamp/index.d.ts +3 -3
  418. package/dist/Timestamp/tooltipEntries.d.ts +2 -2
  419. package/dist/Toast/Toast.d.ts +2 -2
  420. package/dist/Toast/ToastContext.d.ts +1 -1
  421. package/dist/Toast/ToastViewport.d.ts +2 -2
  422. package/dist/Toast/index.d.ts +6 -6
  423. package/dist/Toast/useToast.d.ts +1 -1
  424. package/dist/ToggleButton/ToggleButton.d.ts +3 -3
  425. package/dist/ToggleButton/ToggleButtonGroup.d.ts +1 -1
  426. package/dist/ToggleButton/index.d.ts +4 -4
  427. package/dist/Token/Token.d.ts +2 -2
  428. package/dist/Token/TokenLink.d.ts +1 -1
  429. package/dist/Token/index.d.ts +2 -2
  430. package/dist/Tokenizer/Tokenizer.d.ts +6 -6
  431. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  432. package/dist/Tokenizer/Tokenizer.js +44 -40
  433. package/dist/Tokenizer/index.d.ts +2 -2
  434. package/dist/Tokenizer/useEndLaneReserve.d.ts +3 -2
  435. package/dist/Tokenizer/useEndLaneReserve.d.ts.map +1 -1
  436. package/dist/Tokenizer/useEndLaneReserve.js +3 -2
  437. package/dist/Toolbar/Toolbar.d.ts +4 -4
  438. package/dist/Toolbar/index.d.ts +2 -2
  439. package/dist/Tooltip/Tooltip.d.ts +3 -3
  440. package/dist/Tooltip/index.d.ts +4 -4
  441. package/dist/Tooltip/useTooltip.d.ts +2 -2
  442. package/dist/TopNav/TopNav.d.ts +1 -1
  443. package/dist/TopNav/TopNavHeading.d.ts +2 -2
  444. package/dist/TopNav/TopNavItem.d.ts +3 -3
  445. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  446. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  447. package/dist/TopNav/TopNavMegaMenuItem.d.ts +2 -2
  448. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  449. package/dist/TopNav/index.d.ts +16 -16
  450. package/dist/TreeList/TreeList.d.ts +3 -3
  451. package/dist/TreeList/TreeListItem.d.ts +1 -1
  452. package/dist/TreeList/TreeListTypes.d.ts +1 -1
  453. package/dist/TreeList/index.d.ts +3 -3
  454. package/dist/Typeahead/BaseTypeahead.d.ts +2 -2
  455. package/dist/Typeahead/Typeahead.d.ts +6 -6
  456. package/dist/Typeahead/TypeaheadItem.d.ts +2 -2
  457. package/dist/Typeahead/createStaticSource.d.ts +1 -1
  458. package/dist/Typeahead/index.d.ts +9 -9
  459. package/dist/Typeahead/utils.d.ts +3 -3
  460. package/dist/VStack/VStack.d.ts +2 -2
  461. package/dist/VStack/index.d.ts +1 -1
  462. package/dist/VisuallyHidden/VisuallyHidden.d.ts +24 -6
  463. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  464. package/dist/VisuallyHidden/VisuallyHidden.js +24 -5
  465. package/dist/VisuallyHidden/index.d.ts +2 -2
  466. package/dist/astryx.css +8 -16
  467. package/dist/hooks/index.d.ts +52 -52
  468. package/dist/hooks/useAutoMediaMode.d.ts +1 -1
  469. package/dist/hooks/useInputContainer.d.ts +1 -1
  470. package/dist/hooks/useInputStatusIcon.d.ts +3 -3
  471. package/dist/hooks/useMenuPress.d.ts +1 -1
  472. package/dist/hooks/usePressFeedback.d.ts +1 -1
  473. package/dist/hooks/useScrollableArea.d.ts +1 -1
  474. package/dist/i18n/InternationalizationContext.d.ts +2 -2
  475. package/dist/i18n/InternationalizationProvider.d.ts +1 -1
  476. package/dist/i18n/index.d.ts +12 -12
  477. package/dist/i18n/resolve.d.ts +1 -1
  478. package/dist/i18n/useLocale.d.ts +1 -1
  479. package/dist/index.d.ts +111 -111
  480. package/dist/theme/Theme.d.ts +2 -2
  481. package/dist/theme/contrast.d.ts +1 -1
  482. package/dist/theme/defineTheme.d.ts +12 -12
  483. package/dist/theme/domainTokens/index.d.ts +6 -6
  484. package/dist/theme/generateThemeRules.d.ts +1 -1
  485. package/dist/theme/index.d.ts +31 -31
  486. package/dist/theme/localTokens.d.ts +1 -1
  487. package/dist/theme/mergeComponents.d.ts +1 -1
  488. package/dist/theme/onMediaTokens.d.ts +1 -1
  489. package/dist/theme/resolveThemeValues.d.ts +7 -7
  490. package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
  491. package/dist/theme/syntax/index.d.ts +7 -7
  492. package/dist/theme/syntax/presets.d.ts +1 -1
  493. package/dist/theme/themeAdaptations.d.ts +5 -5
  494. package/dist/theme/themeRegistry.d.ts +1 -1
  495. package/dist/theme/tokens.d.ts +1 -1
  496. package/dist/theme/types.d.ts +1 -1
  497. package/dist/theme/useTheme.d.ts +2 -2
  498. package/dist/utils/dateParser.d.ts +3 -3
  499. package/dist/utils/groupItems.d.ts +1 -1
  500. package/dist/utils/index.d.ts +29 -29
  501. package/dist/utils/plainDate.d.ts +3 -3
  502. package/package.json +5 -5
  503. package/src/Badge/Badge.doc.mjs +2 -1
  504. package/src/BottomSheet/BottomSheet.tsx +12 -1
  505. package/src/BottomSheet/__tests__/BottomSheetToastOutlet.a11y.chromium.spec.ts +82 -0
  506. package/src/DateInput/DateInputTouch.test.tsx +9 -0
  507. package/src/DateInput/Wheel.tsx +4 -1
  508. package/src/DateInput/__tests__/WheelPinchZoom.a11y.chromium.spec.ts +158 -0
  509. package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +5 -2
  510. package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +226 -0
  511. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +32 -16
  512. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +158 -0
  513. package/src/DropdownMenu/__tests__/DropdownMenuRadioItemAudit.a11y.chromium.spec.ts +539 -0
  514. package/src/Field/inputDisabledFocus.ts +28 -0
  515. package/src/HoverCard/HoverCard.test.tsx +93 -3
  516. package/src/Icon/Icon.spec.md +40 -29
  517. package/src/Layer/__tests__/TouchTrigger.a11y.chromium.spec.ts +199 -0
  518. package/src/Layer/modalOutlet.ts +1 -1
  519. package/src/Layer/useTouchTrigger.ts +95 -41
  520. package/src/NumberInput/NumberInput.doc.mjs +6 -6
  521. package/src/NumberInput/NumberInput.test.tsx +144 -14
  522. package/src/NumberInput/NumberInput.tsx +68 -21
  523. package/src/Pagination/Pagination.test.tsx +2 -2
  524. package/src/SideNav/SideNav.test.tsx +15 -6
  525. package/src/SideNav/SideNavHeading.tsx +41 -0
  526. package/src/Skeleton/Skeleton.test.tsx +108 -1
  527. package/src/Skeleton/Skeleton.tsx +30 -2
  528. package/src/Stepper/Step.tsx +7 -0
  529. package/src/Stepper/Stepper.test.tsx +33 -0
  530. package/src/TextArea/TextArea.doc.mjs +6 -6
  531. package/src/TextArea/TextArea.test.tsx +65 -6
  532. package/src/TextArea/TextArea.tsx +26 -14
  533. package/src/TextInput/TextInput.doc.mjs +8 -8
  534. package/src/TextInput/TextInput.test.tsx +83 -10
  535. package/src/TextInput/TextInput.tsx +38 -19
  536. package/src/Toast/ToastViewport.modalHost.test.tsx +139 -4
  537. package/src/Tokenizer/Tokenizer.test.tsx +26 -8
  538. package/src/Tokenizer/Tokenizer.tsx +65 -72
  539. package/src/Tokenizer/__tests__/TokenizerEndLane.a11y.chromium.spec.ts +471 -0
  540. package/src/Tokenizer/useEndLaneReserve.ts +3 -2
  541. package/src/Tooltip/Tooltip.test.tsx +148 -3
  542. package/src/Tooltip/__tests__/Tooltip.a11y.states.ts +2 -2
  543. package/src/VisuallyHidden/VisuallyHidden.doc.mjs +1 -1
  544. package/src/VisuallyHidden/VisuallyHidden.test.tsx +39 -0
  545. package/src/VisuallyHidden/VisuallyHidden.tsx +38 -5
  546. package/src/theme/tokens.test.ts +60 -0
@@ -0,0 +1,539 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file DropdownMenuRadioItemAudit.a11y.chromium.spec.ts
5
+ * @input Exact-head DropdownMenuRadioItem row-state story across states, themes, sizes, direction, pointer, forced colors, and viewport widths
6
+ * @output Screenshots and fail-closed sensor receipts for the DropdownMenuRadioItem component audit
7
+ * @position Component-owned Night Watch browser evidence; CI runs it only for a DropdownMenuRadioItem audit pull request
8
+ */
9
+
10
+ import {createHash} from 'node:crypto';
11
+ import {execFileSync} from 'node:child_process';
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import {expect, test, type Page} from '@playwright/test';
15
+ import {holdMotionStill} from '@astryxdesign/a11y-spec/chromium';
16
+ import {
17
+ DEFAULT_STORYBOOK_DIR,
18
+ serveStorybook,
19
+ type StaticServer,
20
+ } from '@astryxdesign/a11y-spec/storybook';
21
+
22
+ const OUTPUT = path.resolve('dropdown-menu-radio-item-audit-evidence');
23
+ const STORY_ID = 'core-dropdownmenuradioitem--row-states';
24
+ const WIDE = {width: 1024, height: 768};
25
+ const NARROW = {width: 320, height: 720};
26
+
27
+ type Interaction =
28
+ 'rest' | 'hover' | 'focus' | 'pressed' | 'select' | 'disabled-hover';
29
+ type AuditCase = {
30
+ key: string;
31
+ mode: 'light' | 'dark';
32
+ direction: 'ltr' | 'rtl';
33
+ theme: 'neutral' | 'butter';
34
+ size: 'sm' | 'md' | 'lg';
35
+ pointer: 'fine' | 'coarse';
36
+ forcedColors: boolean;
37
+ viewport: {width: number; height: number};
38
+ interaction: Interaction;
39
+ };
40
+
41
+ const defaults: Omit<AuditCase, 'key' | 'interaction'> = {
42
+ mode: 'light',
43
+ direction: 'ltr',
44
+ theme: 'neutral',
45
+ size: 'md',
46
+ pointer: 'fine',
47
+ forcedColors: false,
48
+ viewport: WIDE,
49
+ };
50
+
51
+ const overrides: (Partial<AuditCase> &
52
+ Pick<AuditCase, 'key' | 'interaction'>)[] = [
53
+ {key: 'neutral-light-rest', interaction: 'rest'},
54
+ {key: 'neutral-dark-rest', mode: 'dark', interaction: 'rest'},
55
+ {key: 'butter-light-rest', theme: 'butter', interaction: 'rest'},
56
+ {key: 'butter-dark-rest', theme: 'butter', mode: 'dark', interaction: 'rest'},
57
+ {key: 'rtl-light-rest', direction: 'rtl', interaction: 'rest'},
58
+ {key: 'rtl-dark-rest', direction: 'rtl', mode: 'dark', interaction: 'rest'},
59
+ {key: 'narrow-light-rest', viewport: NARROW, interaction: 'rest'},
60
+ {
61
+ key: 'narrow-dark-rest',
62
+ viewport: NARROW,
63
+ mode: 'dark',
64
+ interaction: 'rest',
65
+ },
66
+ {key: 'size-sm-light-rest', size: 'sm', interaction: 'rest'},
67
+ {key: 'size-lg-light-rest', size: 'lg', interaction: 'rest'},
68
+ {key: 'size-sm-dark-rest', size: 'sm', mode: 'dark', interaction: 'rest'},
69
+ {key: 'size-lg-dark-rest', size: 'lg', mode: 'dark', interaction: 'rest'},
70
+ {key: 'coarse-light-rest', pointer: 'coarse', interaction: 'rest'},
71
+ {
72
+ key: 'coarse-rtl-light-rest',
73
+ pointer: 'coarse',
74
+ direction: 'rtl',
75
+ interaction: 'rest',
76
+ },
77
+ {key: 'neutral-light-hover', interaction: 'hover'},
78
+ {key: 'neutral-dark-hover', mode: 'dark', interaction: 'hover'},
79
+ {key: 'neutral-light-focus', interaction: 'focus'},
80
+ {key: 'neutral-dark-focus', mode: 'dark', interaction: 'focus'},
81
+ {key: 'butter-light-focus', theme: 'butter', interaction: 'focus'},
82
+ {key: 'neutral-light-pressed', interaction: 'pressed'},
83
+ {key: 'neutral-light-select', interaction: 'select'},
84
+ {key: 'neutral-dark-pressed', mode: 'dark', interaction: 'pressed'},
85
+ {key: 'neutral-dark-select', mode: 'dark', interaction: 'select'},
86
+ {key: 'neutral-light-disabled-hover', interaction: 'disabled-hover'},
87
+ {
88
+ key: 'neutral-dark-disabled-hover',
89
+ mode: 'dark',
90
+ interaction: 'disabled-hover',
91
+ },
92
+ {key: 'forced-colors-focus', forcedColors: true, interaction: 'focus'},
93
+ ];
94
+ const cases: AuditCase[] = overrides.map(item => ({...defaults, ...item}));
95
+
96
+ // Authored before observation: which row each interaction leaves checked and
97
+ // active, and how many consumer handler calls the fixture must record.
98
+ const expectedChecked = (item: AuditCase) =>
99
+ item.interaction === 'select' ? 'List' : 'Board';
100
+ const expectedActive = (item: AuditCase) =>
101
+ ({
102
+ rest: undefined,
103
+ hover: 'List',
104
+ focus: 'Board',
105
+ pressed: 'List',
106
+ select: 'List',
107
+ 'disabled-hover': null,
108
+ })[item.interaction];
109
+
110
+ let server: StaticServer;
111
+ let checkoutSha: string;
112
+ let storybookSha: string;
113
+
114
+ function storyUrl(item: AuditCase) {
115
+ return `${server.origin}/iframe.html?id=${STORY_ID}&viewMode=story&args=size:${item.size}&globals=colorMode:${item.mode};astryxTheme:${item.theme};direction:${item.direction}`;
116
+ }
117
+
118
+ async function settle(page: Page) {
119
+ await holdMotionStill(page);
120
+ await page.evaluate(async () => document.fonts.ready);
121
+ await page.waitForTimeout(60);
122
+ }
123
+
124
+ test.beforeAll(async () => {
125
+ fs.mkdirSync(OUTPUT, {recursive: true});
126
+ checkoutSha = execFileSync('git', ['rev-parse', 'HEAD'], {
127
+ encoding: 'utf8',
128
+ }).trim();
129
+ const expected = process.env.ASTRYX_HEAD_SHA;
130
+ if (expected && expected !== checkoutSha) {
131
+ throw new Error(
132
+ `checkout ${checkoutSha} does not match expected head ${expected}`,
133
+ );
134
+ }
135
+ server = await serveStorybook(
136
+ process.env.ASTRYX_STORYBOOK_DIR ?? DEFAULT_STORYBOOK_DIR,
137
+ );
138
+ const response = await fetch(`${server.origin}/astryx-build-sha.txt`);
139
+ if (!response.ok) {
140
+ throw new Error(`Storybook build has no SHA stamp (${response.status})`);
141
+ }
142
+ storybookSha = (await response.text()).trim();
143
+ if (storybookSha !== checkoutSha) {
144
+ throw new Error(
145
+ `Storybook ${storybookSha} does not match checkout ${checkoutSha}`,
146
+ );
147
+ }
148
+ });
149
+
150
+ test.afterAll(async () => {
151
+ await server?.close();
152
+ const receipts = fs
153
+ .readdirSync(OUTPUT)
154
+ .filter(file => file.endsWith('.sensors.json'))
155
+ .sort();
156
+ fs.writeFileSync(
157
+ path.join(OUTPUT, 'manifest.json'),
158
+ `${JSON.stringify(
159
+ {
160
+ schemaVersion: 1,
161
+ component: 'core/DropdownMenuRadioItem',
162
+ build: checkoutSha,
163
+ expectedFrames: cases.map(item => item.key),
164
+ receipts: receipts.map(file => {
165
+ const receipt = JSON.parse(
166
+ fs.readFileSync(path.join(OUTPUT, file), 'utf8'),
167
+ );
168
+ return {
169
+ key: file.replace('.sensors.json', ''),
170
+ passed: receipt.passed,
171
+ };
172
+ }),
173
+ },
174
+ null,
175
+ 2,
176
+ )}\n`,
177
+ );
178
+ });
179
+
180
+ for (const item of cases) {
181
+ test(item.key, async ({browser}) => {
182
+ const coarse = item.pointer === 'coarse';
183
+ const context = await browser.newContext({
184
+ viewport: item.viewport,
185
+ colorScheme: item.mode,
186
+ reducedMotion: 'reduce',
187
+ forcedColors: item.forcedColors ? 'active' : 'none',
188
+ hasTouch: coarse,
189
+ isMobile: coarse,
190
+ });
191
+ const page = await context.newPage();
192
+ const pageErrors: string[] = [];
193
+ page.on('pageerror', error => pageErrors.push(String(error)));
194
+ await page.goto(storyUrl(item), {waitUntil: 'load'});
195
+ await page.locator('#storybook-root').waitFor();
196
+
197
+ const fixture = page.getByTestId('dropdown-menu-radio-item-audit');
198
+ const menu = page.getByRole('menu').last();
199
+ await expect(menu).toBeVisible();
200
+ const row = (name: string) =>
201
+ menu.getByRole('menuitemradio', {name: new RegExp(`^${name}`)});
202
+ await expect(menu.getByRole('menuitemradio')).toHaveCount(5);
203
+
204
+ if (item.interaction === 'hover') {
205
+ await row('List').hover();
206
+ await expect(row('List')).toBeFocused();
207
+ } else if (item.interaction === 'focus') {
208
+ await page.getByRole('button', {name: 'View'}).focus();
209
+ await page.keyboard.press('ArrowDown');
210
+ await expect(row('Board')).toBeFocused();
211
+ } else if (item.interaction === 'pressed') {
212
+ await row('List').hover();
213
+ await page.mouse.down();
214
+ } else if (item.interaction === 'select') {
215
+ await row('List').click();
216
+ await expect(row('List')).toHaveAttribute('aria-checked', 'true');
217
+ } else if (item.interaction === 'disabled-hover') {
218
+ await row('Archive').hover();
219
+ }
220
+ await settle(page);
221
+
222
+ // Geometry must be settled before any frame is trusted: read every row and
223
+ // marker box, wait two animation frames plus a pause, and read again.
224
+ const settledGeometry = await menu.evaluate(async element => {
225
+ const read = () =>
226
+ [
227
+ element,
228
+ ...Array.from(
229
+ element.querySelectorAll(
230
+ '[role="menuitemradio"], .astryx-dropdown-menu-radio',
231
+ ),
232
+ ),
233
+ ]
234
+ .map(node => {
235
+ const box = node.getBoundingClientRect();
236
+ return [box.x, box.y, box.width, box.height]
237
+ .map(value => value.toFixed(2))
238
+ .join(',');
239
+ })
240
+ .join('|');
241
+ const first = read();
242
+ await new Promise<void>(resolve => {
243
+ requestAnimationFrame(() =>
244
+ requestAnimationFrame(() => setTimeout(resolve, 120)),
245
+ );
246
+ });
247
+ const second = read();
248
+ return {stable: first === second, boxes: first.split('|').length};
249
+ });
250
+
251
+ const observed = await menu.evaluate(element => {
252
+ const canvas = document.createElement('canvas');
253
+ canvas.width = 1;
254
+ canvas.height = 1;
255
+ const ctx = canvas.getContext('2d', {willReadFrequently: true});
256
+ if (ctx === null) {
257
+ throw new Error('2d canvas context is unavailable');
258
+ }
259
+ type Rgba = [number, number, number, number];
260
+ const rgba = (color: string): Rgba => {
261
+ ctx.clearRect(0, 0, 1, 1);
262
+ ctx.fillStyle = '#000';
263
+ ctx.fillStyle = color;
264
+ ctx.fillRect(0, 0, 1, 1);
265
+ const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
266
+ return [r, g, b, a / 255];
267
+ };
268
+ const over = (top: Rgba, bottom: Rgba): Rgba => {
269
+ const alpha = top[3] + bottom[3] * (1 - top[3]);
270
+ if (alpha === 0) {
271
+ return [0, 0, 0, 0];
272
+ }
273
+ const mix = (i: number) =>
274
+ (top[i] * top[3] + bottom[i] * bottom[3] * (1 - top[3])) / alpha;
275
+ return [mix(0), mix(1), mix(2), alpha];
276
+ };
277
+ const backdrop = (node: Element): Rgba => {
278
+ const layers: Rgba[] = [];
279
+ for (let n: Element | null = node; n; n = n.parentElement) {
280
+ layers.push(rgba(getComputedStyle(n).backgroundColor));
281
+ }
282
+ let acc: Rgba = [255, 255, 255, 1];
283
+ for (let i = layers.length - 1; i >= 0; i--) {
284
+ acc = over(layers[i], acc);
285
+ }
286
+ return acc;
287
+ };
288
+ const luminance = ([r, g, b]: Rgba) => {
289
+ const f = (v: number) => {
290
+ const c = v / 255;
291
+ return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
292
+ };
293
+ return 0.2126 * f(r) + 0.7152 * f(g) + 0.0722 * f(b);
294
+ };
295
+ const ratio = (fg: Rgba, bg: Rgba) => {
296
+ const [hi, lo] = [luminance(over(fg, bg)), luminance(bg)].sort(
297
+ (a, b) => b - a,
298
+ );
299
+ return Math.round(((hi + 0.05) / (lo + 0.05)) * 100) / 100;
300
+ };
301
+ const hex = (c: Rgba) =>
302
+ `#${c
303
+ .slice(0, 3)
304
+ .map(v => Math.round(v).toString(16).padStart(2, '0'))
305
+ .join('')}${c[3] < 1 ? `@${c[3].toFixed(2)}` : ''}`;
306
+ const fade = (c: Rgba, opacity: number): Rgba => [
307
+ c[0],
308
+ c[1],
309
+ c[2],
310
+ c[3] * opacity,
311
+ ];
312
+ const menuBackdrop = backdrop(element);
313
+ const rows = Array.from(
314
+ element.querySelectorAll<HTMLElement>('[role="menuitemradio"]'),
315
+ ).map(row => {
316
+ const box = row.getBoundingClientRect();
317
+ const style = getComputedStyle(row);
318
+ const opacity = Number(style.opacity);
319
+ const rowBackdrop = backdrop(row);
320
+ const texts = Array.from(row.querySelectorAll('span'))
321
+ .filter(n => n.children.length === 0 && n.textContent?.trim())
322
+ .map(n => {
323
+ const color = rgba(getComputedStyle(n).color);
324
+ const nodeBackdrop = backdrop(n);
325
+ return {
326
+ text: (n.textContent ?? '').trim().slice(0, 24),
327
+ fontSize: getComputedStyle(n).fontSize,
328
+ color: hex(color),
329
+ backdrop: hex(nodeBackdrop),
330
+ contrast: ratio(fade(color, opacity), nodeBackdrop),
331
+ };
332
+ });
333
+ const indicator = row.querySelector<HTMLElement>(
334
+ '.astryx-dropdown-menu-radio',
335
+ );
336
+ const indicatorStyle = indicator ? getComputedStyle(indicator) : null;
337
+ const indicatorBox = indicator?.getBoundingClientRect() ?? null;
338
+ const border = indicatorStyle
339
+ ? rgba(indicatorStyle.borderTopColor)
340
+ : null;
341
+ const fill = indicatorStyle
342
+ ? rgba(indicatorStyle.backgroundColor)
343
+ : null;
344
+ const isRtl = style.direction === 'rtl';
345
+ return {
346
+ name: row.textContent?.replace(/\s+/g, ' ').trim() ?? '',
347
+ checked: row.getAttribute('aria-checked'),
348
+ disabled: row.getAttribute('aria-disabled'),
349
+ tabIndex: row.getAttribute('tabindex'),
350
+ focused: document.activeElement === row,
351
+ focusVisible: row.matches(':focus-visible'),
352
+ cursor: style.cursor,
353
+ opacity,
354
+ outline: `${style.outlineStyle} ${style.outlineWidth}`,
355
+ background: hex(rgba(style.backgroundColor)),
356
+ rowBackdrop: hex(rowBackdrop),
357
+ rowAgainstMenu: ratio(rowBackdrop, menuBackdrop),
358
+ texts,
359
+ indicator:
360
+ indicator && indicatorBox && indicatorStyle && border && fill
361
+ ? {
362
+ classes: Array.from(indicator.classList).filter(c =>
363
+ c.startsWith('astryx-'),
364
+ ),
365
+ dataSize: indicator.getAttribute('data-size'),
366
+ dataChecked: indicator.getAttribute('data-checked'),
367
+ hidden: indicator.closest('[aria-hidden="true"]') !== null,
368
+ width: indicatorBox.width,
369
+ height: indicatorBox.height,
370
+ inlineStartOffset: isRtl
371
+ ? box.right - indicatorBox.right
372
+ : indicatorBox.left - box.left,
373
+ inlineEndOffset: isRtl
374
+ ? indicatorBox.left - box.left
375
+ : box.right - indicatorBox.right,
376
+ border: hex(border),
377
+ fill: hex(fill),
378
+ borderContrast: ratio(fade(border, opacity), rowBackdrop),
379
+ fillContrast:
380
+ fill[3] > 0
381
+ ? ratio(fade(fill, opacity), rowBackdrop)
382
+ : null,
383
+ }
384
+ : null,
385
+ geometry: {
386
+ x: box.x,
387
+ y: box.y,
388
+ width: box.width,
389
+ height: box.height,
390
+ },
391
+ };
392
+ });
393
+ const fixtureNode = element.ownerDocument.querySelector(
394
+ '[data-testid="dropdown-menu-radio-item-audit"]',
395
+ );
396
+ const menuBox = element.getBoundingClientRect();
397
+ return {
398
+ theme:
399
+ document
400
+ .querySelector('[data-astryx-theme]')
401
+ ?.getAttribute('data-astryx-theme') ?? null,
402
+ mode: document.documentElement.getAttribute('data-theme'),
403
+ direction: getComputedStyle(element).direction,
404
+ viewport: {width: innerWidth, height: innerHeight},
405
+ media: {
406
+ pointerCoarse: matchMedia('(pointer: coarse)').matches,
407
+ forcedColors: matchMedia('(forced-colors: active)').matches,
408
+ reducedMotion: matchMedia('(prefers-reduced-motion: reduce)').matches,
409
+ devicePixelRatio,
410
+ },
411
+ fonts: document.fonts.status,
412
+ horizontalOverflow:
413
+ document.documentElement.scrollWidth > innerWidth + 1,
414
+ menuBackdrop: hex(menuBackdrop),
415
+ menu: {
416
+ x: menuBox.x,
417
+ y: menuBox.y,
418
+ width: menuBox.width,
419
+ height: menuBox.height,
420
+ },
421
+ activeRow:
422
+ document.activeElement?.getAttribute('role') === 'menuitemradio'
423
+ ? (document.activeElement.textContent
424
+ ?.replace(/\s+/g, ' ')
425
+ .trim() ?? null)
426
+ : null,
427
+ consumerClicks: Number(
428
+ fixtureNode?.getAttribute('data-row-click-count') ?? 'NaN',
429
+ ),
430
+ consumerPointerMoves: Number(
431
+ fixtureNode?.getAttribute('data-row-pointer-move-count') ?? 'NaN',
432
+ ),
433
+ rows,
434
+ };
435
+ });
436
+ await expect(fixture).toBeAttached();
437
+
438
+ const checked = observed.rows
439
+ .filter(row => row.checked === 'true')
440
+ .map(row => row.name);
441
+ const active = expectedActive(item);
442
+ const markerSize = item.size === 'sm' ? 'sm' : 'md';
443
+ const checks = {
444
+ build: storybookSha === checkoutSha,
445
+ noPageErrors: pageErrors.length === 0,
446
+ theme: observed.theme === item.theme,
447
+ mode: observed.mode === item.mode,
448
+ direction: observed.direction === item.direction,
449
+ viewport:
450
+ observed.viewport.width === item.viewport.width &&
451
+ observed.viewport.height === item.viewport.height,
452
+ pointer: observed.media.pointerCoarse === (item.pointer === 'coarse'),
453
+ forcedColors: observed.media.forcedColors === item.forcedColors,
454
+ reducedMotion: observed.media.reducedMotion,
455
+ fonts: observed.fonts === 'loaded',
456
+ noHorizontalOverflow: !observed.horizontalOverflow,
457
+ rows: observed.rows.length === 5,
458
+ checked:
459
+ checked.length === 1 && checked[0].startsWith(expectedChecked(item)),
460
+ disabledRow:
461
+ observed.rows[4]?.disabled === 'true' &&
462
+ observed.rows[4]?.tabIndex === null,
463
+ activeRow:
464
+ active === undefined
465
+ ? true
466
+ : active === null
467
+ ? !(observed.activeRow ?? '').startsWith('Archive')
468
+ : (observed.activeRow ?? '').startsWith(active),
469
+ decorativeMarker: observed.rows.every(
470
+ row =>
471
+ row.indicator !== null &&
472
+ row.indicator.hidden &&
473
+ row.indicator.dataSize === markerSize &&
474
+ row.indicator.width > 0 &&
475
+ row.indicator.classes.includes('astryx-radio-indicator'),
476
+ ),
477
+ markerPlacement: observed.rows.every(row =>
478
+ row.indicator === null
479
+ ? false
480
+ : item.pointer === 'coarse'
481
+ ? row.indicator.inlineEndOffset < row.indicator.inlineStartOffset
482
+ : row.indicator.inlineStartOffset < row.indicator.inlineEndOffset,
483
+ ),
484
+ geometrySettled: settledGeometry.stable && settledGeometry.boxes === 11,
485
+ geometry: observed.rows.every(
486
+ row => row.geometry.width > 0 && row.geometry.height >= 24,
487
+ ),
488
+ // The fixture's consumer handlers record every call; a selection click
489
+ // must reach the consumer click handler and the hover that preceded it
490
+ // must reach the consumer pointer-move handler.
491
+ consumerHandlers:
492
+ item.interaction === 'select'
493
+ ? observed.consumerClicks === 1 && observed.consumerPointerMoves > 0
494
+ : observed.consumerClicks === 0,
495
+ };
496
+
497
+ const png = await page.screenshot({animations: 'disabled'});
498
+ if (item.interaction === 'pressed') {
499
+ await page.mouse.up();
500
+ }
501
+ const image = `${item.key}.png`;
502
+ const receipt = {
503
+ schemaVersion: 1,
504
+ expected: {
505
+ build: checkoutSha,
506
+ storyId: STORY_ID,
507
+ ...item,
508
+ checked: expectedChecked(item),
509
+ activeRow: active,
510
+ },
511
+ observed: {
512
+ build: storybookSha,
513
+ browser: context.browser()?.version() ?? null,
514
+ ...observed,
515
+ settledGeometry,
516
+ pageErrors,
517
+ },
518
+ image: {
519
+ file: image,
520
+ sha256: createHash('sha256').update(png).digest('hex'),
521
+ width: png.readUInt32BE(16),
522
+ height: png.readUInt32BE(20),
523
+ },
524
+ checks,
525
+ passed: Object.values(checks).every(Boolean),
526
+ };
527
+ fs.writeFileSync(path.join(OUTPUT, image), png);
528
+ fs.writeFileSync(
529
+ path.join(OUTPUT, `${item.key}.sensors.json`),
530
+ `${JSON.stringify(receipt, null, 2)}\n`,
531
+ );
532
+ await context.close();
533
+ expect(
534
+ Object.entries(checks)
535
+ .filter(([, passed]) => !passed)
536
+ .map(([name]) => name),
537
+ ).toEqual([]);
538
+ });
539
+ }
@@ -0,0 +1,28 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file inputDisabledFocus.ts
5
+ * @input Uses StyleX and theme tokens
6
+ * @output inputDisabledFocusStyles (internal; not re-exported from Field/index.ts)
7
+ * @position Field wrapper style shared by TextInput and TextArea
8
+ */
9
+
10
+ import * as stylex from '@stylexjs/stylex';
11
+ import {colorVars} from '../theme/tokens.stylex';
12
+
13
+ export const inputDisabledFocusStyles = stylex.create({
14
+ // The shared disabled style drops the focus ring; restore it while the field's
15
+ // own control, a direct child, has keyboard focus (`spec:AST-085` FR6), so a
16
+ // focused status button keeps only its own outline.
17
+ ring: {
18
+ borderColor: {
19
+ default: colorVars['--color-border-emphasized'],
20
+ ':has(> [aria-disabled="true"]:focus-visible)':
21
+ colorVars['--color-accent'],
22
+ },
23
+ boxShadow: {
24
+ default: 'none',
25
+ ':has(> [aria-disabled="true"]:focus-visible)': `inset 0px 0px 0px 2px ${colorVars['--color-accent-muted']}`,
26
+ },
27
+ },
28
+ });
@@ -1049,7 +1049,11 @@ describe('HoverCard', () => {
1049
1049
  __resetInteractionModalityForTest();
1050
1050
  });
1051
1051
 
1052
- /** A tap: the pointer sequence a finger produces before hover is faked. */
1052
+ /**
1053
+ * A tap, in the order a browser dispatches it: the finger's pointer events,
1054
+ * then the hover it synthesizes, then the `click` that says the touch was a
1055
+ * tap and not the start of a scroll.
1056
+ */
1053
1057
  const tap = (element: HTMLElement) => {
1054
1058
  // A finger's arrival fires pointerenter too, and that is the path a pen
1055
1059
  // must not take — cover it here rather than starting at pointerdown.
@@ -1058,6 +1062,7 @@ describe('HoverCard', () => {
1058
1062
  fireEvent.pointerUp(element, {pointerType: 'touch'});
1059
1063
  // Touch synthesizes hover after the press; the card must not act on it.
1060
1064
  fireEvent.mouseEnter(element);
1065
+ fireEvent.click(element);
1061
1066
  };
1062
1067
 
1063
1068
  it('opens on a tap when the trigger performs no action', async () => {
@@ -1141,6 +1146,8 @@ describe('HoverCard', () => {
1141
1146
  hidden: true,
1142
1147
  });
1143
1148
  fireEvent.pointerDown(action, {pointerType: 'touch'});
1149
+ fireEvent.pointerUp(action, {pointerType: 'touch'});
1150
+ fireEvent.click(action);
1144
1151
 
1145
1152
  await new Promise(resolve => setTimeout(resolve, 50));
1146
1153
  expect(onOpenChange).not.toHaveBeenCalledWith(false);
@@ -1166,10 +1173,93 @@ describe('HoverCard', () => {
1166
1173
  expect(onOpenChange).toHaveBeenCalledWith(true);
1167
1174
  });
1168
1175
 
1169
- fireEvent.pointerDown(screen.getByRole('button', {name: 'Elsewhere'}), {
1170
- pointerType: 'touch',
1176
+ const elsewhere = screen.getByRole('button', {name: 'Elsewhere'});
1177
+ fireEvent.pointerDown(elsewhere, {pointerType: 'touch'});
1178
+ // Not yet: a popover closes when the outside tap lifts.
1179
+ await new Promise(resolve => setTimeout(resolve, 50));
1180
+ expect(onOpenChange).not.toHaveBeenCalledWith(false);
1181
+
1182
+ fireEvent.pointerUp(elsewhere, {pointerType: 'touch'});
1183
+ await waitFor(() => {
1184
+ expect(onOpenChange).toHaveBeenCalledWith(false);
1185
+ });
1186
+ });
1187
+
1188
+ it('opens when the finger lifts, not when it lands', async () => {
1189
+ const onOpenChange = vi.fn();
1190
+ render(
1191
+ <HoverCard
1192
+ content={<span>Card content</span>}
1193
+ onOpenChange={onOpenChange}
1194
+ delay={0}>
1195
+ Ruby Cheung
1196
+ </HoverCard>,
1197
+ );
1198
+
1199
+ const trigger = screen.getByText('Ruby Cheung');
1200
+ fireEvent.pointerEnter(trigger, {pointerType: 'touch'});
1201
+ fireEvent.pointerDown(trigger, {pointerType: 'touch'});
1202
+ await new Promise(resolve => setTimeout(resolve, 50));
1203
+ expect(onOpenChange).not.toHaveBeenCalled();
1204
+
1205
+ fireEvent.pointerUp(trigger, {pointerType: 'touch'});
1206
+ fireEvent.click(trigger);
1207
+ await waitFor(() => {
1208
+ expect(onOpenChange).toHaveBeenCalledWith(true);
1209
+ });
1210
+ });
1211
+
1212
+ it('never opens for a touch that turns into a scroll', async () => {
1213
+ const onOpenChange = vi.fn();
1214
+ render(
1215
+ <HoverCard
1216
+ content={<span>Card content</span>}
1217
+ onOpenChange={onOpenChange}
1218
+ delay={0}>
1219
+ Ruby Cheung
1220
+ </HoverCard>,
1221
+ );
1222
+
1223
+ const trigger = screen.getByText('Ruby Cheung');
1224
+ fireEvent.pointerEnter(trigger, {pointerType: 'touch'});
1225
+ fireEvent.pointerDown(trigger, {pointerType: 'touch'});
1226
+ fireEvent.pointerCancel(trigger, {pointerType: 'touch'});
1227
+
1228
+ await new Promise(resolve => setTimeout(resolve, 50));
1229
+ expect(onOpenChange).not.toHaveBeenCalled();
1230
+ });
1231
+
1232
+ it('closes when a scroll starts outside, but not for one inside the card', async () => {
1233
+ const onOpenChange = vi.fn();
1234
+ render(
1235
+ <>
1236
+ <HoverCard
1237
+ content={<p>Card content</p>}
1238
+ onOpenChange={onOpenChange}
1239
+ delay={0}
1240
+ hideDelay={0}>
1241
+ Ruby Cheung
1242
+ </HoverCard>
1243
+ <p>Page content</p>
1244
+ </>,
1245
+ );
1246
+
1247
+ tap(screen.getByText('Ruby Cheung'));
1248
+ await waitFor(() => {
1249
+ expect(onOpenChange).toHaveBeenCalledWith(true);
1171
1250
  });
1251
+ onOpenChange.mockClear();
1252
+
1253
+ // Scrolling the card's own content keeps it.
1254
+ const inside = await screen.findByText('Card content');
1255
+ fireEvent.pointerDown(inside, {pointerType: 'touch'});
1256
+ fireEvent.pointerCancel(inside, {pointerType: 'touch'});
1257
+ await new Promise(resolve => setTimeout(resolve, 50));
1258
+ expect(onOpenChange).not.toHaveBeenCalledWith(false);
1172
1259
 
1260
+ const page = screen.getByText('Page content');
1261
+ fireEvent.pointerDown(page, {pointerType: 'touch'});
1262
+ fireEvent.pointerCancel(page, {pointerType: 'touch'});
1173
1263
  await waitFor(() => {
1174
1264
  expect(onOpenChange).toHaveBeenCalledWith(false);
1175
1265
  });