@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3

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 (730) hide show
  1. package/CHANGELOG.md +161 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +49 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +62 -20
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +7 -3
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +21 -23
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +12 -12
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +17 -9
  49. package/dist/Card/index.d.ts +35 -1
  50. package/dist/Card/index.d.ts.map +1 -1
  51. package/dist/Card/index.js +21 -1
  52. package/dist/Carousel/Carousel.d.ts.map +1 -1
  53. package/dist/Carousel/Carousel.js +3 -3
  54. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  55. package/dist/Chat/ChatComposerInput.js +2 -3
  56. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  57. package/dist/Chat/ChatLayout.js +3 -3
  58. package/dist/Chat/ChatMessageList.d.ts +22 -3
  59. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  60. package/dist/Chat/ChatMessageList.js +6 -3
  61. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  62. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  63. package/dist/Chat/ChatTokenizedText.js +11 -6
  64. package/dist/Chat/useChatComposerTokens.js +1 -1
  65. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  66. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  67. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  68. package/dist/ClickableCard/ClickableCard.js +3 -3
  69. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  70. package/dist/CodeBlock/CodeBlock.js +15 -4
  71. package/dist/CodeBlock/highlightRanges.js +1 -1
  72. package/dist/CodeBlock/highlightStyles.js +13 -13
  73. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  75. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  76. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +1 -3
  79. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  80. package/dist/ContextMenu/ContextMenu.js +4 -3
  81. package/dist/DateInput/DateInput.d.ts +43 -0
  82. package/dist/DateInput/DateInput.d.ts.map +1 -1
  83. package/dist/DateInput/DateInput.js +22 -2
  84. package/dist/DateInput/NativeDateField.d.ts +10 -0
  85. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  86. package/dist/DateInput/NativeDateField.js +494 -0
  87. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  88. package/dist/DateInput/TouchDateField.js +82 -23
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  92. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  93. package/dist/DateInput/nativeDateSegments.js +111 -0
  94. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  95. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  96. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  97. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  98. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  99. package/dist/DateTimeInput/index.d.ts +1 -1
  100. package/dist/DateTimeInput/index.d.ts.map +1 -1
  101. package/dist/Dialog/Dialog.d.ts +21 -1
  102. package/dist/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/Dialog/Dialog.js +110 -58
  104. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  106. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  108. package/dist/Field/FieldLabel.d.ts.map +1 -1
  109. package/dist/Field/FieldLabel.js +9 -1
  110. package/dist/Field/InputClearButton.d.ts +9 -3
  111. package/dist/Field/InputClearButton.d.ts.map +1 -1
  112. package/dist/Field/InputClearButton.js +14 -3
  113. package/dist/FileInput/FileInput.d.ts.map +1 -1
  114. package/dist/FileInput/FileInput.js +3 -2
  115. package/dist/Heading/Heading.d.ts.map +1 -1
  116. package/dist/Heading/Heading.js +6 -3
  117. package/dist/HoverCard/HoverCard.d.ts +6 -0
  118. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/HoverCard.js +104 -3
  120. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  121. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  122. package/dist/HoverCard/useHoverCard.js +74 -26
  123. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  124. package/dist/Indicator/CheckboxIndicator.js +6 -2
  125. package/dist/Item/Item.d.ts.map +1 -1
  126. package/dist/Item/Item.js +4 -2
  127. package/dist/Kbd/Kbd.d.ts.map +1 -1
  128. package/dist/Kbd/Kbd.js +2 -19
  129. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  130. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  131. package/dist/Layer/LayerDepthContext.js +66 -0
  132. package/dist/Layer/gestureCounter.d.ts +8 -0
  133. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  134. package/dist/Layer/gestureCounter.js +53 -0
  135. package/dist/Layer/index.d.ts +3 -0
  136. package/dist/Layer/index.d.ts.map +1 -1
  137. package/dist/Layer/index.js +4 -0
  138. package/dist/Layer/layerStack.d.ts +98 -0
  139. package/dist/Layer/layerStack.d.ts.map +1 -0
  140. package/dist/Layer/layerStack.js +306 -0
  141. package/dist/Layer/useLayer.d.ts +23 -13
  142. package/dist/Layer/useLayer.d.ts.map +1 -1
  143. package/dist/Layer/useLayer.js +128 -8
  144. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  145. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  146. package/dist/Layer/useLayerDismissal.js +91 -0
  147. package/dist/Lightbox/Lightbox.d.ts +1 -0
  148. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  149. package/dist/Lightbox/Lightbox.js +103 -81
  150. package/dist/List/List.d.ts +1 -1
  151. package/dist/List/List.d.ts.map +1 -1
  152. package/dist/List/List.js +15 -4
  153. package/dist/Markdown/Markdown.d.ts +1 -1
  154. package/dist/Markdown/Markdown.d.ts.map +1 -1
  155. package/dist/Markdown/Markdown.js +20 -7
  156. package/dist/Markdown/index.d.ts +1 -1
  157. package/dist/Markdown/index.d.ts.map +1 -1
  158. package/dist/Markdown/parser.d.ts +38 -1
  159. package/dist/Markdown/parser.d.ts.map +1 -1
  160. package/dist/Markdown/parser.js +182 -32
  161. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  162. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  163. package/dist/MetadataList/MetadataListItem.js +4 -1
  164. package/dist/MobileNav/MobileNav.d.ts +6 -1
  165. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  166. package/dist/MobileNav/MobileNav.js +61 -36
  167. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  168. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  169. package/dist/MultiSelector/MultiSelector.js +73 -15
  170. package/dist/MultiSelector/hooks.d.ts +7 -1
  171. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  172. package/dist/MultiSelector/hooks.js +3 -2
  173. package/dist/MultiSelector/index.d.ts +1 -1
  174. package/dist/MultiSelector/index.d.ts.map +1 -1
  175. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  176. package/dist/NavIcon/NavIcon.js +5 -1
  177. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  178. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  179. package/dist/NavMenu/NavHeadingMenu.js +9 -5
  180. package/dist/NumberInput/NumberInput.d.ts +6 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +54 -104
  183. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  184. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  185. package/dist/NumberInput/numberInputCommit.js +71 -0
  186. package/dist/NumberInput/numberParser.d.ts +64 -0
  187. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  188. package/dist/NumberInput/numberParser.js +350 -0
  189. package/dist/Outline/Outline.d.ts.map +1 -1
  190. package/dist/Outline/Outline.js +3 -2
  191. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  192. package/dist/OverflowList/OverflowList.js +3 -2
  193. package/dist/Overlay/Overlay.d.ts.map +1 -1
  194. package/dist/Overlay/Overlay.js +3 -2
  195. package/dist/Popover/Popover.d.ts.map +1 -1
  196. package/dist/Popover/Popover.js +1 -9
  197. package/dist/Popover/usePopover.d.ts +7 -41
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +40 -21
  200. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +19 -6
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  206. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  207. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  209. package/dist/PowerSearch/types.d.ts +2 -0
  210. package/dist/PowerSearch/types.d.ts.map +1 -1
  211. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  212. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  213. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  214. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  215. package/dist/ProgressBar/ProgressBar.js +18 -5
  216. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  217. package/dist/Resizable/ResizeHandle.js +3 -2
  218. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  219. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  220. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  221. package/dist/SelectableCard/SelectableCard.js +12 -3
  222. package/dist/Selector/Selector.d.ts +18 -1
  223. package/dist/Selector/Selector.d.ts.map +1 -1
  224. package/dist/Selector/Selector.js +91 -18
  225. package/dist/Selector/hooks.d.ts +7 -1
  226. package/dist/Selector/hooks.d.ts.map +1 -1
  227. package/dist/Selector/hooks.js +3 -2
  228. package/dist/SideNav/SideNav.d.ts.map +1 -1
  229. package/dist/SideNav/SideNav.js +4 -3
  230. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavHeading.js +8 -7
  232. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  233. package/dist/SideNav/SideNavItem.js +4 -3
  234. package/dist/Slider/Slider.d.ts.map +1 -1
  235. package/dist/Slider/Slider.js +37 -5
  236. package/dist/Spinner/Spinner.d.ts +3 -3
  237. package/dist/Spinner/Spinner.d.ts.map +1 -1
  238. package/dist/Spinner/Spinner.js +130 -78
  239. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  240. package/dist/StatusDot/StatusDot.js +6 -1
  241. package/dist/Stepper/Step.d.ts +140 -0
  242. package/dist/Stepper/Step.d.ts.map +1 -0
  243. package/dist/Stepper/Step.js +1045 -0
  244. package/dist/Stepper/StepStatus.d.ts +24 -0
  245. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  246. package/dist/Stepper/StepStatus.js +1 -0
  247. package/dist/Stepper/Stepper.d.ts +93 -0
  248. package/dist/Stepper/Stepper.d.ts.map +1 -0
  249. package/dist/Stepper/Stepper.js +184 -0
  250. package/dist/Stepper/StepperContext.d.ts +41 -0
  251. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  252. package/dist/Stepper/StepperContext.js +34 -0
  253. package/dist/Stepper/index.d.ts +8 -0
  254. package/dist/Stepper/index.d.ts.map +1 -0
  255. package/dist/Stepper/index.js +7 -0
  256. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  257. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  258. package/dist/Stepper/stepper.stylex.js +20 -0
  259. package/dist/Switch/Switch.d.ts.map +1 -1
  260. package/dist/Switch/Switch.js +8 -3
  261. package/dist/TabList/Tab.d.ts +15 -2
  262. package/dist/TabList/Tab.d.ts.map +1 -1
  263. package/dist/TabList/Tab.js +32 -7
  264. package/dist/TabList/TabList.d.ts +46 -7
  265. package/dist/TabList/TabList.d.ts.map +1 -1
  266. package/dist/TabList/TabList.js +353 -23
  267. package/dist/TabList/TabListContext.d.ts +11 -1
  268. package/dist/TabList/TabListContext.d.ts.map +1 -1
  269. package/dist/TabList/TabListContext.js +11 -2
  270. package/dist/TabList/TabMenu.d.ts.map +1 -1
  271. package/dist/TabList/TabMenu.js +3 -2
  272. package/dist/TabList/index.d.ts +2 -2
  273. package/dist/TabList/index.d.ts.map +1 -1
  274. package/dist/Table/BaseTable.d.ts.map +1 -1
  275. package/dist/Table/BaseTable.js +10 -2
  276. package/dist/Table/Table.d.ts.map +1 -1
  277. package/dist/Table/Table.js +3 -6
  278. package/dist/Table/TableRow.d.ts +16 -5
  279. package/dist/Table/TableRow.d.ts.map +1 -1
  280. package/dist/Table/TableRow.js +16 -5
  281. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  282. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  283. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  284. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  285. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
  286. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  287. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  288. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  289. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  290. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  291. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  292. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  293. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  294. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  295. package/dist/Table/plugins/selection/useTableSelection.js +43 -5
  296. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  297. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  298. package/dist/Table/types.d.ts +22 -4
  299. package/dist/Table/types.d.ts.map +1 -1
  300. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  301. package/dist/Table/useBaseTablePlugins.js +5 -0
  302. package/dist/Text/Text.d.ts.map +1 -1
  303. package/dist/Text/Text.js +6 -3
  304. package/dist/TextArea/TextArea.d.ts.map +1 -1
  305. package/dist/TextArea/TextArea.js +16 -10
  306. package/dist/TextInput/TextInput.d.ts.map +1 -1
  307. package/dist/TextInput/TextInput.js +3 -2
  308. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  309. package/dist/TimeInput/TimeInput.js +3 -2
  310. package/dist/Timestamp/Timestamp.d.ts +1 -1
  311. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  312. package/dist/Timestamp/Timestamp.js +15 -21
  313. package/dist/Toast/Toast.d.ts.map +1 -1
  314. package/dist/Toast/Toast.js +22 -7
  315. package/dist/Toast/ToastViewport.d.ts +1 -0
  316. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  317. package/dist/Toast/ToastViewport.js +71 -18
  318. package/dist/Token/Token.d.ts +1 -1
  319. package/dist/Token/Token.d.ts.map +1 -1
  320. package/dist/Token/Token.js +20 -9
  321. package/dist/Token/TokenLink.d.ts +1 -1
  322. package/dist/Token/TokenLink.d.ts.map +1 -1
  323. package/dist/Token/TokenLink.js +7 -4
  324. package/dist/Tokenizer/Tokenizer.d.ts +14 -1
  325. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  326. package/dist/Tokenizer/Tokenizer.js +33 -21
  327. package/dist/Tooltip/Tooltip.d.ts +5 -0
  328. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  329. package/dist/Tooltip/useTooltip.d.ts +5 -0
  330. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  331. package/dist/Tooltip/useTooltip.js +39 -24
  332. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  333. package/dist/TopNav/TopNavHeading.js +5 -4
  334. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  335. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  336. package/dist/TopNav/TopNavMegaMenu.js +31 -11
  337. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  338. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  339. package/dist/TopNav/TopNavMenu.js +22 -7
  340. package/dist/TreeList/TreeList.d.ts +1 -1
  341. package/dist/TreeList/TreeList.d.ts.map +1 -1
  342. package/dist/TreeList/TreeList.js +7 -2
  343. package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
  344. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  345. package/dist/Typeahead/BaseTypeahead.js +119 -37
  346. package/dist/Typeahead/Typeahead.d.ts +8 -1
  347. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  348. package/dist/Typeahead/Typeahead.js +5 -2
  349. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  350. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  351. package/dist/Typeahead/TypeaheadItem.js +7 -2
  352. package/dist/astryx.css +113 -11
  353. package/dist/hooks/index.d.ts +1 -0
  354. package/dist/hooks/index.d.ts.map +1 -1
  355. package/dist/hooks/index.js +1 -0
  356. package/dist/hooks/useFocusTrap.d.ts +7 -4
  357. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  358. package/dist/hooks/useFocusTrap.js +60 -95
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -18
  361. package/dist/hooks/useMergedRefs.d.ts +18 -0
  362. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  363. package/dist/hooks/useMergedRefs.js +25 -0
  364. package/dist/index.d.ts +1 -0
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +1 -0
  367. package/dist/theme/Theme.d.ts.map +1 -1
  368. package/dist/theme/Theme.js +46 -10
  369. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  370. package/dist/theme/derivedVarRegistry.js +24 -4
  371. package/dist/theme/generateThemeRules.d.ts +21 -0
  372. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  373. package/dist/theme/generateThemeRules.js +26 -0
  374. package/dist/theme/syntax/tokens.d.ts +1 -1
  375. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  376. package/dist/theme/syntax/tokens.js +5 -2
  377. package/dist/utils/groupItems.d.ts +5 -1
  378. package/dist/utils/groupItems.d.ts.map +1 -1
  379. package/dist/utils/groupItems.js +9 -9
  380. package/dist/utils/index.d.ts +1 -1
  381. package/dist/utils/index.d.ts.map +1 -1
  382. package/dist/utils/isApplePlatform.d.ts +18 -0
  383. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  384. package/dist/utils/isApplePlatform.js +37 -0
  385. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  386. package/dist/utils/sharedResizeObserver.js +10 -1
  387. package/dist/utils/timeParser.d.ts +1 -1
  388. package/dist/utils/timeParser.d.ts.map +1 -1
  389. package/dist/utils/timeParser.js +26 -12
  390. package/locales/af-ZA.json +6 -6
  391. package/locales/ar-SA.json +6 -6
  392. package/locales/ca-ES.json +5 -5
  393. package/locales/cs-CZ.json +6 -6
  394. package/locales/da-DK.json +6 -6
  395. package/locales/de-DE.json +6 -6
  396. package/locales/el-GR.json +6 -6
  397. package/locales/en.json +163 -11
  398. package/locales/es-ES.json +5 -5
  399. package/locales/fi-FI.json +6 -6
  400. package/locales/fr-FR.json +6 -6
  401. package/locales/he-IL.json +6 -6
  402. package/locales/hu-HU.json +6 -6
  403. package/locales/it-IT.json +6 -6
  404. package/locales/ja-JP.json +6 -6
  405. package/locales/ko-KR.json +6 -6
  406. package/locales/nl-NL.json +6 -6
  407. package/locales/no-NO.json +6 -6
  408. package/locales/pl-PL.json +6 -6
  409. package/locales/pseudo.json +114 -0
  410. package/locales/pt-BR.json +6 -6
  411. package/locales/pt-PT.json +6 -6
  412. package/locales/ro-RO.json +6 -6
  413. package/locales/ru-RU.json +6 -6
  414. package/locales/sr-SP.json +6 -6
  415. package/locales/sv-SE.json +6 -6
  416. package/locales/tr-TR.json +6 -6
  417. package/locales/uk-UA.json +6 -6
  418. package/locales/vi-VN.json +6 -6
  419. package/locales/zh-CN.json +6 -6
  420. package/locales/zh-TW.json +6 -6
  421. package/package.json +8 -3
  422. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  423. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  424. package/src/AlertDialog/AlertDialog.tsx +62 -20
  425. package/src/AppShell/AppShell.tsx +3 -2
  426. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  427. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  428. package/src/AspectRatio/AspectRatio.tsx +40 -1
  429. package/src/Avatar/Avatar.doc.mjs +14 -3
  430. package/src/Avatar/Avatar.test.tsx +97 -0
  431. package/src/Avatar/Avatar.tsx +125 -52
  432. package/src/Avatar/index.ts +2 -2
  433. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  434. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  435. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  436. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  437. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  438. package/src/Banner/Banner.doc.mjs +22 -11
  439. package/src/Banner/Banner.test.tsx +177 -25
  440. package/src/Banner/Banner.tsx +93 -27
  441. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  442. package/src/BottomSheet/BottomSheet.tsx +17 -4
  443. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  444. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  445. package/src/Button/Button.doc.mjs +24 -1
  446. package/src/Button/Button.test.tsx +32 -4
  447. package/src/Button/Button.tsx +12 -5
  448. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  449. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  450. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  451. package/src/Calendar/Calendar.doc.mjs +7 -6
  452. package/src/Calendar/Calendar.test.tsx +143 -0
  453. package/src/Calendar/Calendar.tsx +30 -26
  454. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  455. package/src/Calendar/getInitialFocusDate.ts +93 -0
  456. package/src/Calendar/styles.ts +49 -31
  457. package/src/Card/Card.doc.mjs +10 -7
  458. package/src/Card/Card.test.tsx +113 -19
  459. package/src/Card/Card.tsx +67 -89
  460. package/src/Card/index.ts +36 -1
  461. package/src/Carousel/Carousel.tsx +3 -2
  462. package/src/Chat/ChatComposerInput.tsx +5 -1
  463. package/src/Chat/ChatLayout.tsx +3 -2
  464. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  465. package/src/Chat/ChatMessageList.test.tsx +46 -0
  466. package/src/Chat/ChatMessageList.tsx +28 -4
  467. package/src/Chat/ChatTokenizedText.tsx +17 -10
  468. package/src/Chat/useChatComposerTokens.ts +1 -1
  469. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  470. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  471. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  472. package/src/ClickableCard/ClickableCard.tsx +3 -2
  473. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  474. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  475. package/src/CodeBlock/CodeBlock.tsx +20 -4
  476. package/src/CodeBlock/highlightRanges.ts +1 -1
  477. package/src/CodeBlock/highlightStyles.ts +13 -13
  478. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  479. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  480. package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
  481. package/src/ComplexSelector/ComplexSelector.tsx +1 -3
  482. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  483. package/src/ContextMenu/ContextMenu.tsx +4 -3
  484. package/src/DateInput/DateInput.doc.mjs +16 -0
  485. package/src/DateInput/DateInput.tsx +55 -2
  486. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  487. package/src/DateInput/NativeDateField.test.tsx +635 -0
  488. package/src/DateInput/NativeDateField.tsx +641 -0
  489. package/src/DateInput/TouchDateField.tsx +108 -24
  490. package/src/DateInput/index.ts +1 -0
  491. package/src/DateInput/nativeDateSegments.ts +127 -0
  492. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  493. package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
  494. package/src/DateRangeInput/DateRangeInput.tsx +4 -2
  495. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  496. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  497. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  498. package/src/DateTimeInput/index.ts +1 -0
  499. package/src/Dialog/Dialog.doc.mjs +8 -3
  500. package/src/Dialog/Dialog.test.tsx +429 -2
  501. package/src/Dialog/Dialog.tsx +133 -58
  502. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  503. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  504. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  505. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  506. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  507. package/src/Field/Field.doc.mjs +13 -2
  508. package/src/Field/FieldLabel.test.tsx +29 -0
  509. package/src/Field/FieldLabel.tsx +7 -0
  510. package/src/Field/InputClearButton.test.tsx +15 -1
  511. package/src/Field/InputClearButton.tsx +28 -4
  512. package/src/FileInput/FileInput.tsx +3 -2
  513. package/src/Heading/Heading.test.tsx +23 -1
  514. package/src/Heading/Heading.tsx +6 -3
  515. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  516. package/src/HoverCard/HoverCard.test.tsx +154 -4
  517. package/src/HoverCard/HoverCard.tsx +143 -3
  518. package/src/HoverCard/useHoverCard.tsx +104 -33
  519. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  520. package/src/Indicator/Indicator.doc.mjs +2 -0
  521. package/src/Item/Item.tsx +5 -4
  522. package/src/Kbd/Kbd.tsx +2 -19
  523. package/src/Layer/LayerDepthContext.tsx +62 -0
  524. package/src/Layer/gestureCounter.ts +57 -0
  525. package/src/Layer/index.ts +9 -0
  526. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  527. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  528. package/src/Layer/layerStack.ts +362 -0
  529. package/src/Layer/useLayer.test.tsx +324 -15
  530. package/src/Layer/useLayer.tsx +164 -8
  531. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  532. package/src/Layer/useLayerDismissal.ts +173 -0
  533. package/src/Layout/Layout.doc.mjs +2 -2
  534. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  535. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  536. package/src/Lightbox/Lightbox.tsx +124 -102
  537. package/src/Link/Link.doc.mjs +39 -0
  538. package/src/List/List.test.tsx +38 -0
  539. package/src/List/List.tsx +8 -1
  540. package/src/Markdown/Markdown.doc.mjs +5 -0
  541. package/src/Markdown/Markdown.test.tsx +37 -0
  542. package/src/Markdown/Markdown.tsx +16 -5
  543. package/src/Markdown/incremental.test.ts +16 -2
  544. package/src/Markdown/index.ts +1 -0
  545. package/src/Markdown/parser.perf.test.ts +96 -1
  546. package/src/Markdown/parser.test.ts +178 -2
  547. package/src/Markdown/parser.ts +253 -32
  548. package/src/MetadataList/MetadataList.test.tsx +75 -2
  549. package/src/MetadataList/MetadataListItem.tsx +5 -2
  550. package/src/MobileNav/MobileNav.tsx +62 -36
  551. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  552. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  553. package/src/MultiSelector/MultiSelector.test.tsx +311 -0
  554. package/src/MultiSelector/MultiSelector.tsx +151 -15
  555. package/src/MultiSelector/hooks.ts +9 -2
  556. package/src/MultiSelector/index.ts +1 -0
  557. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  558. package/src/NavIcon/NavIcon.test.tsx +9 -0
  559. package/src/NavIcon/NavIcon.tsx +5 -1
  560. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  561. package/src/NavMenu/NavHeadingMenu.tsx +9 -5
  562. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  563. package/src/NumberInput/NumberInput.test.tsx +436 -8
  564. package/src/NumberInput/NumberInput.tsx +62 -114
  565. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  566. package/src/NumberInput/numberInputCommit.ts +103 -0
  567. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  568. package/src/NumberInput/numberParser.test.ts +222 -0
  569. package/src/NumberInput/numberParser.ts +403 -0
  570. package/src/Outline/Outline.tsx +3 -2
  571. package/src/OverflowList/OverflowList.tsx +3 -2
  572. package/src/Overlay/Overlay.tsx +3 -2
  573. package/src/Pagination/Pagination.test.tsx +3 -2
  574. package/src/Popover/Popover.test.tsx +14 -0
  575. package/src/Popover/Popover.tsx +1 -9
  576. package/src/Popover/usePopover.tsx +57 -32
  577. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  578. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  579. package/src/PowerSearch/PowerSearch.tsx +34 -5
  580. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  581. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  582. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  583. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  584. package/src/PowerSearch/types.ts +2 -0
  585. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  586. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  587. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  588. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  589. package/src/ProgressBar/ProgressBar.tsx +28 -8
  590. package/src/Resizable/ResizeHandle.tsx +3 -2
  591. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  592. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  593. package/src/SelectableCard/SelectableCard.tsx +19 -2
  594. package/src/Selector/Selector.doc.mjs +26 -1
  595. package/src/Selector/Selector.test.tsx +346 -1
  596. package/src/Selector/Selector.tsx +148 -21
  597. package/src/Selector/hooks.ts +17 -2
  598. package/src/SideNav/SideNav.doc.mjs +6 -6
  599. package/src/SideNav/SideNav.tsx +4 -2
  600. package/src/SideNav/SideNavHeading.tsx +12 -12
  601. package/src/SideNav/SideNavItem.tsx +4 -2
  602. package/src/Slider/Slider.test.tsx +106 -1
  603. package/src/Slider/Slider.tsx +55 -3
  604. package/src/Spinner/Spinner.test.tsx +147 -1
  605. package/src/Spinner/Spinner.tsx +120 -101
  606. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  607. package/src/StatusDot/StatusDot.test.tsx +9 -0
  608. package/src/StatusDot/StatusDot.tsx +7 -1
  609. package/src/Stepper/Step.doc.mjs +98 -0
  610. package/src/Stepper/Step.tsx +1638 -0
  611. package/src/Stepper/StepStatus.ts +26 -0
  612. package/src/Stepper/Stepper.doc.mjs +370 -0
  613. package/src/Stepper/Stepper.test.tsx +1024 -0
  614. package/src/Stepper/Stepper.tsx +258 -0
  615. package/src/Stepper/StepperContext.ts +71 -0
  616. package/src/Stepper/index.ts +18 -0
  617. package/src/Stepper/stepper.stylex.ts +19 -0
  618. package/src/Switch/Switch.doc.mjs +2 -0
  619. package/src/Switch/Switch.test.tsx +10 -0
  620. package/src/Switch/Switch.tsx +6 -2
  621. package/src/TabList/Tab.doc.mjs +13 -1
  622. package/src/TabList/Tab.tsx +67 -7
  623. package/src/TabList/TabList.doc.mjs +22 -6
  624. package/src/TabList/TabList.test.tsx +559 -0
  625. package/src/TabList/TabList.tsx +490 -22
  626. package/src/TabList/TabListContext.ts +13 -2
  627. package/src/TabList/TabMenu.tsx +3 -2
  628. package/src/TabList/index.ts +6 -2
  629. package/src/Table/BaseTable.tsx +12 -4
  630. package/src/Table/Table.doc.mjs +9 -2
  631. package/src/Table/Table.test.tsx +132 -14
  632. package/src/Table/Table.tsx +3 -8
  633. package/src/Table/TableBody.doc.mjs +40 -0
  634. package/src/Table/TableFooter.doc.mjs +40 -0
  635. package/src/Table/TableHeader.doc.mjs +40 -0
  636. package/src/Table/TableRow.tsx +16 -5
  637. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  638. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  639. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  640. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  641. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
  642. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  643. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  644. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  645. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  646. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  647. package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
  648. package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
  649. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  650. package/src/Table/types.ts +22 -4
  651. package/src/Table/useBaseTablePlugins.ts +5 -0
  652. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  653. package/src/Table/useTablePagination.doc.mjs +7 -0
  654. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  655. package/src/Table/useTableSelection.doc.mjs +31 -0
  656. package/src/Text/Text.test.tsx +67 -1
  657. package/src/Text/Text.tsx +6 -3
  658. package/src/TextArea/TextArea.doc.mjs +12 -2
  659. package/src/TextArea/TextArea.test.tsx +11 -0
  660. package/src/TextArea/TextArea.tsx +37 -24
  661. package/src/TextInput/TextInput.doc.mjs +10 -0
  662. package/src/TextInput/TextInput.tsx +3 -2
  663. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  664. package/src/TimeInput/TimeInput.tsx +2 -2
  665. package/src/Timestamp/Timestamp.test.tsx +58 -0
  666. package/src/Timestamp/Timestamp.tsx +12 -10
  667. package/src/Toast/Toast.doc.mjs +26 -12
  668. package/src/Toast/Toast.tsx +28 -4
  669. package/src/Toast/ToastViewport.test.tsx +536 -8
  670. package/src/Toast/ToastViewport.tsx +81 -12
  671. package/src/Token/Token.test.tsx +95 -0
  672. package/src/Token/Token.tsx +15 -10
  673. package/src/Token/TokenLink.tsx +14 -5
  674. package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
  675. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  676. package/src/Tokenizer/Tokenizer.tsx +53 -24
  677. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  678. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  679. package/src/Tooltip/Tooltip.test.tsx +32 -0
  680. package/src/Tooltip/Tooltip.tsx +5 -0
  681. package/src/Tooltip/useTooltip.tsx +47 -24
  682. package/src/TopNav/TopNavHeading.tsx +5 -4
  683. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  684. package/src/TopNav/TopNavMegaMenu.tsx +47 -5
  685. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  686. package/src/TopNav/TopNavMenu.tsx +38 -7
  687. package/src/TreeList/TreeList.test.tsx +49 -0
  688. package/src/TreeList/TreeList.tsx +7 -2
  689. package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
  690. package/src/Typeahead/BaseTypeahead.tsx +181 -39
  691. package/src/Typeahead/Typeahead.doc.mjs +11 -0
  692. package/src/Typeahead/Typeahead.test.tsx +203 -0
  693. package/src/Typeahead/Typeahead.tsx +12 -2
  694. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  695. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  696. package/src/hooks/index.ts +2 -0
  697. package/src/hooks/useAnnounce.doc.mjs +96 -0
  698. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  699. package/src/hooks/useDevWarning.doc.mjs +96 -0
  700. package/src/hooks/useFocusTrap.test.tsx +14 -0
  701. package/src/hooks/useFocusTrap.ts +62 -111
  702. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  703. package/src/hooks/useHotkeys.ts +3 -18
  704. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  705. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  706. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  707. package/src/hooks/useLongPress.doc.mjs +123 -0
  708. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  709. package/src/hooks/useMergedRefs.test.tsx +62 -0
  710. package/src/hooks/useMergedRefs.ts +36 -0
  711. package/src/hooks/useTypeahead.doc.mjs +153 -0
  712. package/src/index.ts +1 -0
  713. package/src/raw-import.d.ts +14 -0
  714. package/src/theme/MediaTheme.doc.mjs +5 -5
  715. package/src/theme/Theme.test.tsx +104 -2
  716. package/src/theme/Theme.tsx +49 -14
  717. package/src/theme/defineTheme.test.ts +23 -0
  718. package/src/theme/derivedVarRegistry.test.ts +26 -3
  719. package/src/theme/derivedVarRegistry.ts +23 -4
  720. package/src/theme/generateThemeRules.test.ts +99 -1
  721. package/src/theme/generateThemeRules.ts +28 -0
  722. package/src/theme/syntax/tokens.ts +5 -2
  723. package/src/utils/groupItems.ts +12 -6
  724. package/src/utils/index.ts +1 -1
  725. package/src/utils/isApplePlatform.test.ts +61 -0
  726. package/src/utils/isApplePlatform.ts +37 -0
  727. package/src/utils/sharedResizeObserver.ts +10 -2
  728. package/src/utils/timeParser.test.ts +6 -1
  729. package/src/utils/timeParser.ts +35 -13
  730. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -5,8 +5,7 @@
5
5
  /**
6
6
  * @file InputClearButton.tsx
7
7
  * @input Uses React, Button, Icon
8
- * @output Exports InputClearButton, the shared clear (✕) button rendered by
9
- * every clearable input in the family.
8
+ * @output Exports the public InputClearButton and an internal popup-aware variant.
10
9
  * @position Shared primitive. Every input that renders a clear affordance —
11
10
  * TextInput, NumberInput, TimeInput, DateInput, DateTimeInput,
12
11
  * DateRangeInput, Selector, MultiSelector, Typeahead, Tokenizer, FileInput —
@@ -80,12 +79,24 @@ export interface InputClearButtonProps {
80
79
  iconClassName?: string;
81
80
  }
82
81
 
83
- export function InputClearButton({
82
+ interface InternalInputClearButtonProps extends InputClearButtonProps {
83
+ onPointerDown: React.PointerEventHandler<HTMLElement>;
84
+ onClickCapture: React.MouseEventHandler<HTMLElement>;
85
+ }
86
+
87
+ type InputClearButtonRenderProps = InputClearButtonProps &
88
+ Partial<
89
+ Pick<InternalInputClearButtonProps, 'onPointerDown' | 'onClickCapture'>
90
+ >;
91
+
92
+ function renderInputClearButton({
84
93
  label,
85
94
  onClick,
95
+ onPointerDown,
96
+ onClickCapture,
86
97
  xstyle,
87
98
  iconClassName,
88
- }: InputClearButtonProps): ReactNode {
99
+ }: InputClearButtonRenderProps): ReactNode {
89
100
  const {className: iconTargetClassName} = themeProps('input-clear-icon');
90
101
  const {className: buttonTargetClassName} = themeProps('input-clear-button');
91
102
  return (
@@ -107,10 +118,23 @@ export function InputClearButton({
107
118
  />
108
119
  }
109
120
  onClick={onClick}
121
+ onPointerDown={onPointerDown}
122
+ onClickCapture={onClickCapture}
110
123
  isIconOnly
111
124
  xstyle={[styles.button, xstyle]}
112
125
  />
113
126
  );
114
127
  }
115
128
 
129
+ export function InputClearButton(props: InputClearButtonProps): ReactNode {
130
+ return renderInputClearButton(props);
131
+ }
132
+
133
+ /** Internal variant used while popup-aware clear behavior is rolled out. */
134
+ export function InternalInputClearButton(
135
+ props: InternalInputClearButtonProps,
136
+ ): ReactNode {
137
+ return renderInputClearButton(props);
138
+ }
139
+
116
140
  InputClearButton.displayName = 'InputClearButton';
@@ -54,13 +54,14 @@ export type {
54
54
  InputStatus as FileInputStatus,
55
55
  InputStatusType as FileInputStatusType,
56
56
  } from '../Field';
57
- import {mergeProps, mergeRefs} from '../utils';
57
+ import {mergeProps} from '../utils';
58
58
  import type {BaseProps} from '../BaseProps';
59
59
  import type {SizeValue} from '../utils/types';
60
60
  import {themeProps} from '../utils/themeProps';
61
61
  import {useTranslator} from '../i18n';
62
62
  import type {TranslatorFn} from '../i18n';
63
63
 
64
+ import {useMergedRefs} from '../hooks/useMergedRefs';
64
65
  function formatFileSize(bytes: number): string {
65
66
  if (bytes < 1024) {
66
67
  return `${bytes} B`;
@@ -827,7 +828,7 @@ export function FileInput({
827
828
  </VisuallyHidden>
828
829
  <input
829
830
  {...rest}
830
- ref={mergeRefs(ref, inputRef)}
831
+ ref={useMergedRefs(ref, inputRef)}
831
832
  id={id}
832
833
  type="file"
833
834
  accept={accept}
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import {render, screen} from '@testing-library/react';
9
- import {describe, it, expect} from 'vitest';
9
+ import {describe, it, expect, vi} from 'vitest';
10
10
  import {Heading} from './Heading';
11
11
 
12
12
  describe('Heading', () => {
@@ -16,6 +16,28 @@ describe('Heading', () => {
16
16
  expect(screen.getByText('Page Title')).toBeInTheDocument();
17
17
  });
18
18
 
19
+ it('keeps a forwarded ref attached across rerenders', () => {
20
+ const ref = vi.fn();
21
+ const {rerender} = render(
22
+ <Heading ref={ref} level={1}>
23
+ Before
24
+ </Heading>,
25
+ );
26
+
27
+ const element = screen.getByText('Before');
28
+ expect(ref).toHaveBeenLastCalledWith(element);
29
+ ref.mockClear();
30
+
31
+ rerender(
32
+ <Heading ref={ref} level={1}>
33
+ After
34
+ </Heading>,
35
+ );
36
+
37
+ expect(ref).not.toHaveBeenCalled();
38
+ expect(screen.getByText('After')).toBe(element);
39
+ });
40
+
19
41
  it('renders h1 for level 1', () => {
20
42
  render(<Heading level={1}>H1</Heading>);
21
43
  const element = screen.getByText('H1');
@@ -43,7 +43,8 @@ import {
43
43
  import {useTruncation} from '../Text/useTruncation';
44
44
  import {resolveStyleColor} from '../Text/Text';
45
45
  import type {LayerPlacement} from '../Layer';
46
- import {mergeProps, mergeRefs} from '../utils';
46
+ import {mergeProps} from '../utils';
47
+ import {useMergedRefs} from '../hooks/useMergedRefs';
47
48
  import type {BaseProps} from '../BaseProps';
48
49
  import {themeProps} from '../utils/themeProps';
49
50
 
@@ -242,13 +243,16 @@ export function Heading({
242
243
  // Ref for the heading element (used as tooltip anchor)
243
244
  const headingRef = useRef<HTMLHeadingElement>(null);
244
245
 
246
+ // Keep the merged ref stable across rerenders.
247
+ const mergedRef = useMergedRefs(ref, truncation.ref, headingRef);
248
+
245
249
  // Build inline style for -webkit-line-clamp (dynamic value)
246
250
  const inlineStyle = maxLines > 1 ? {WebkitLineClamp: maxLines} : undefined;
247
251
 
248
252
  return (
249
253
  <>
250
254
  <Component
251
- ref={mergeRefs(ref, truncation.ref, headingRef)}
255
+ ref={mergedRef}
252
256
  {...mergeProps(
253
257
  themeProps('heading', {level, color, ...(type && {type})}),
254
258
  stylex.props(
@@ -277,7 +281,6 @@ export function Heading({
277
281
  className,
278
282
  {...style, ...inlineStyle},
279
283
  )}
280
- title={tooltipEnabled ? truncation.fullText : undefined}
281
284
  {...ariaProps}
282
285
  {...props}>
283
286
  {children}
@@ -16,7 +16,10 @@ export const docs = {
16
16
  },
17
17
  theming: {
18
18
  targets: [
19
- {className: 'astryx-hovercard'},
19
+ {className: 'astryx-hover-card'},
20
+ // Still emitted beside the names above, so themes written against
21
+ // them keep working. Drop in the next major.
22
+ {className: 'astryx-hovercard', deprecatedFor: 'hover-card'},
20
23
  ],
21
24
  vars: [
22
25
  {name: '--_hovercard-radius', description: 'Border radius of the hover card', default: 'var(--radius-container)', private: true},
@@ -109,6 +112,11 @@ export const docs = {
109
112
  type: 'boolean',
110
113
  description: 'Whether the hover card should be shown on mount. Still dismissible.',
111
114
  },
115
+ {
116
+ name: 'isOpen',
117
+ type: 'boolean',
118
+ description: 'Controlled open state for the hover card.',
119
+ },
112
120
  ],
113
121
  },
114
122
  ],
@@ -139,7 +147,10 @@ export const docsZh = {
139
147
  displayName: 'Hover Card',
140
148
  theming: {
141
149
  targets: [
142
- {className: 'astryx-hovercard'},
150
+ {className: 'astryx-hover-card'},
151
+ // Still emitted beside the names above, so themes written against
152
+ // them keep working. Drop in the next major.
153
+ {className: 'astryx-hovercard', deprecatedFor: 'hover-card'},
143
154
  ],
144
155
  vars: [
145
156
  {name: '--_hovercard-radius', description: 'Border radius of the hover card', default: 'var(--radius-container)', private: true},
@@ -365,7 +365,94 @@ describe('HoverCard', () => {
365
365
  );
366
366
  });
367
367
 
368
- it('injects aria-describedby on trigger', () => {
368
+ it('advertises a dialog popup on the trigger when labelled', () => {
369
+ render(
370
+ <HoverCard content={<span>Card content</span>} label="Profile actions">
371
+ <button type="button">Trigger</button>
372
+ </HoverCard>,
373
+ );
374
+ const trigger = screen.getByRole('button', {name: 'Trigger'});
375
+ expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
376
+ // While closed, the layer is not in the DOM, so aria-controls must not
377
+ // point at a missing id (see DateInput). It is set once the card opens.
378
+ expect(trigger).not.toHaveAttribute('aria-controls');
379
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
380
+ expect(trigger).not.toHaveAttribute('aria-describedby');
381
+ });
382
+
383
+ it('merges existing popup attributes on the trigger when labelled', () => {
384
+ render(
385
+ <HoverCard content={<span>Card content</span>} label="Profile actions">
386
+ <button
387
+ type="button"
388
+ aria-haspopup="menu"
389
+ aria-controls="menu-id"
390
+ aria-expanded="true">
391
+ Trigger
392
+ </button>
393
+ </HoverCard>,
394
+ );
395
+ const trigger = screen.getByRole('button', {name: 'Trigger'});
396
+ // The hover card's dialog popup is advertised, but the trigger's own
397
+ // popup semantics are preserved rather than overwritten.
398
+ expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
399
+ expect(trigger.getAttribute('aria-controls')).toContain('menu-id');
400
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
401
+ });
402
+
403
+ it('omits aria-expanded on a trigger whose role does not support it', () => {
404
+ render(
405
+ <HoverCard content={<span>Card content</span>} label="Timestamp details">
406
+ <time dateTime="2026-08-25" tabIndex={0}>
407
+ 2 hours ago
408
+ </time>
409
+ </HoverCard>,
410
+ );
411
+ const trigger = screen.getByText('2 hours ago');
412
+ expect(trigger.tagName).toBe('TIME');
413
+ // Global attributes are valid on any element, so the popup relationship is
414
+ // still advertised.
415
+ expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
416
+ // aria-expanded is not: <time> has no role that supports it, and emitting
417
+ // it is a critical axe aria-allowed-attr violation.
418
+ expect(trigger).not.toHaveAttribute('aria-expanded');
419
+ });
420
+
421
+ it('keeps aria-expanded on a role-less trigger that declares a supporting role', () => {
422
+ render(
423
+ <HoverCard content={<span>Card content</span>} label="Profile actions">
424
+ <span role="button" tabIndex={0}>
425
+ Trigger
426
+ </span>
427
+ </HoverCard>,
428
+ );
429
+ const trigger = screen.getByRole('button', {name: 'Trigger'});
430
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
431
+ });
432
+
433
+ it('leaves a role-less trigger own aria-expanded untouched', () => {
434
+ render(
435
+ <HoverCard content={<span>Card content</span>} label="Profile actions">
436
+ <span aria-expanded="true">Trigger</span>
437
+ </HoverCard>,
438
+ );
439
+ const trigger = screen.getByText('Trigger');
440
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
441
+ });
442
+
443
+ it('keeps aria-expanded on triggers whose implicit role supports it', () => {
444
+ render(
445
+ <HoverCard content={<span>Card content</span>} label="Profile actions">
446
+ <input type="button" value="Trigger" />
447
+ </HoverCard>,
448
+ );
449
+ expect(screen.getByRole('button')).toHaveAttribute(
450
+ 'aria-expanded',
451
+ 'false',
452
+ );
453
+ });
454
+
455
+ it('keeps aria-describedby on the trigger when no label is provided', () => {
369
456
  render(
370
457
  <HoverCard content={<span>Card content</span>}>
371
458
  <button type="button">Trigger</button>
@@ -373,9 +460,10 @@ describe('HoverCard', () => {
373
460
  );
374
461
  const trigger = screen.getByRole('button', {name: 'Trigger'});
375
462
  expect(trigger).toHaveAttribute('aria-describedby');
463
+ expect(trigger).not.toHaveAttribute('aria-haspopup');
376
464
  });
377
465
 
378
- it('merges existing aria-describedby', () => {
466
+ it('preserves existing aria-describedby when no label is provided', () => {
379
467
  render(
380
468
  <HoverCard content={<span>Card content</span>}>
381
469
  <button type="button" aria-describedby="existing-id">
@@ -388,6 +476,34 @@ describe('HoverCard', () => {
388
476
  expect(describedBy).toContain('existing-id');
389
477
  });
390
478
 
479
+ it('updates aria-expanded when the labelled hover card opens and closes', async () => {
480
+ render(
481
+ <HoverCard
482
+ content={<span>Card content</span>}
483
+ label="Profile actions"
484
+ delay={0}>
485
+ <button type="button">Trigger</button>
486
+ </HoverCard>,
487
+ );
488
+ const trigger = screen.getByRole('button', {name: 'Trigger'});
489
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
490
+ expect(trigger).not.toHaveAttribute('aria-controls');
491
+
492
+ fireEvent.mouseEnter(trigger);
493
+ await waitFor(() => {
494
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
495
+ // The layer is in the DOM now, so aria-controls points at it.
496
+ expect(trigger).toHaveAttribute('aria-controls');
497
+ });
498
+
499
+ fireEvent.mouseLeave(trigger);
500
+ await waitFor(() => {
501
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
502
+ // The layer is gone from the DOM, so aria-controls is cleared.
503
+ expect(trigger).not.toHaveAttribute('aria-controls');
504
+ });
505
+ });
506
+
391
507
  it('calls onOpenChange(true) when shown', async () => {
392
508
  const onOpenChange = vi.fn();
393
509
  render(
@@ -429,16 +545,33 @@ describe('HoverCard', () => {
429
545
 
430
546
  it('supports text-only children with inline wrapper', () => {
431
547
  render(
432
- <HoverCard content={<span>Card content</span>}>
548
+ <HoverCard content={<span>Card content</span>} label="Profile actions">
433
549
  Just text, no element
434
550
  </HoverCard>,
435
551
  );
436
552
  // Text should be rendered
437
553
  expect(screen.getByText('Just text, no element')).toBeInTheDocument();
438
- // Should have aria-describedby on the wrapper span
554
+ // When labelled, the wrapper advertises a dialog popup.
555
+ const wrapper = screen.getByText('Just text, no element');
556
+ expect(wrapper.tagName).toBe('SPAN');
557
+ expect(wrapper).toHaveAttribute('aria-haspopup', 'dialog');
558
+ // The wrapper is a role-less <span>; aria-expanded is invalid there.
559
+ expect(wrapper).not.toHaveAttribute('aria-expanded');
560
+ // While closed, the layer is not in the DOM, so aria-controls is unset.
561
+ expect(wrapper).not.toHaveAttribute('aria-controls');
562
+ expect(wrapper).not.toHaveAttribute('aria-describedby');
563
+ });
564
+
565
+ it('keeps aria-describedby on text-only children when no label is provided', () => {
566
+ render(
567
+ <HoverCard content={<span>Card content</span>}>
568
+ Just text, no element
569
+ </HoverCard>,
570
+ );
439
571
  const wrapper = screen.getByText('Just text, no element');
440
572
  expect(wrapper.tagName).toBe('SPAN');
441
573
  expect(wrapper).toHaveAttribute('aria-describedby');
574
+ expect(wrapper).not.toHaveAttribute('aria-haspopup');
442
575
  });
443
576
 
444
577
  describe('isDefaultOpen', () => {
@@ -994,3 +1127,20 @@ describe('HoverCard', () => {
994
1127
  });
995
1128
  });
996
1129
  });
1130
+
1131
+ describe('HoverCard theme target names', () => {
1132
+ it('renders the deprecated class beside the current one on the card surface', async () => {
1133
+ render(
1134
+ <HoverCard content={<span>Card content</span>} delay={0}>
1135
+ <button type="button">Trigger</button>
1136
+ </HoverCard>,
1137
+ );
1138
+ fireEvent.mouseEnter(screen.getByRole('button', {name: 'Trigger'}));
1139
+
1140
+ await waitFor(() => {
1141
+ const layer = screen.getByText('Card content').closest('[popover]');
1142
+ expect(layer).toHaveClass('astryx-hover-card');
1143
+ expect(layer).toHaveClass('astryx-hovercard');
1144
+ });
1145
+ });
1146
+ });
@@ -32,6 +32,66 @@ export type {
32
32
  HoverCardTouchTrigger,
33
33
  } from './useHoverCard';
34
34
 
35
+ // `aria-haspopup` and `aria-controls` are global, so any trigger may carry
36
+ // them. `aria-expanded` is not. This is the ARIA 1.2 "Supported States and
37
+ // Properties" list for it — deliberately the narrow reading: axe accepts the
38
+ // attribute on rather more roles, since it also allows every subclass of these,
39
+ // so a role outside this set is not necessarily a violation. Widening it is
40
+ // safe; the set is a floor, not the spec's ceiling. The same rule is applied in
41
+ // Chat/useTriggerMenu.tsx, which only emits the combobox attributes once the
42
+ // element is actually a combobox.
43
+ const EXPANDABLE_ROLES = new Set([
44
+ 'application',
45
+ 'button',
46
+ 'checkbox',
47
+ 'columnheader',
48
+ 'combobox',
49
+ 'gridcell',
50
+ 'link',
51
+ 'listbox',
52
+ 'menuitem',
53
+ 'menuitemcheckbox',
54
+ 'menuitemradio',
55
+ 'row',
56
+ 'rowheader',
57
+ 'switch',
58
+ 'tab',
59
+ 'treeitem',
60
+ ]);
61
+
62
+ const BUTTON_INPUT_TYPES = new Set(['button', 'submit', 'reset', 'image']);
63
+
64
+ // Deliberately partial, and unlisted elements are read as role-less: dropping
65
+ // aria-expanded where it might have been legal costs an AT user a state they
66
+ // can still infer, whereas emitting it where it is illegal is a critical
67
+ // aria-allowed-attr defect.
68
+ function supportsAriaExpanded(el: HTMLElement): boolean {
69
+ const explicit = el.getAttribute('role')?.trim().split(/\s+/)[0];
70
+ if (explicit) {
71
+ return EXPANDABLE_ROLES.has(explicit);
72
+ }
73
+ switch (el.tagName) {
74
+ case 'BUTTON':
75
+ case 'SUMMARY':
76
+ return true;
77
+ case 'A':
78
+ case 'AREA':
79
+ return el.hasAttribute('href');
80
+ case 'INPUT':
81
+ // The button-flavoured input types map to role="button"; every other
82
+ // type maps to a textbox-family role, which does not take it.
83
+ return BUTTON_INPUT_TYPES.has(
84
+ (el as HTMLInputElement).type?.toLowerCase(),
85
+ );
86
+ case 'SELECT':
87
+ // combobox when it is a single-line picker, listbox otherwise; both
88
+ // support aria-expanded.
89
+ return true;
90
+ default:
91
+ return false;
92
+ }
93
+ }
94
+
35
95
  const styles = stylex.create({
36
96
  wrapperContents: {
37
97
  display: 'contents',
@@ -144,6 +204,12 @@ export interface HoverCardProps extends Pick<
144
204
  * - `true`: force-show the hover card (hover/focus hide is suppressed)
145
205
  * - `false`: force-hide the hover card
146
206
  * - `undefined`: uncontrolled — hover/focus triggers manage visibility
207
+ *
208
+ * A controlled hover card still takes Escape when it is the top-most layer,
209
+ * and answers by calling `onOpenChange(false)` without hiding itself —
210
+ * closing is your update's decision, exactly as for a controlled Dialog.
211
+ * Ignore the call and the card stays, and so does the press: nothing
212
+ * underneath dismisses.
147
213
  */
148
214
  isOpen?: boolean;
149
215
 
@@ -253,7 +319,70 @@ export function HoverCard({
253
319
  // Use combined ref for position + interaction
254
320
  hoverCard.ref(firstChild);
255
321
 
256
- // Set aria-describedby, merging with existing
322
+ if (label) {
323
+ // When named, the hover card is a dialog. The trigger should advertise the
324
+ // popup relationship with aria-haspopup/aria-expanded, not describe the
325
+ // trigger with the dialog's content (aria-describedby is for plain-text
326
+ // descriptions, not navigable regions). See #5049.
327
+ //
328
+ // aria-expanded only goes on a trigger whose role permits it. A role-less
329
+ // trigger (Timestamp's <time>/<span>) gets haspopup + controls, which are
330
+ // global, and no expanded state.
331
+ //
332
+ // Merge rather than overwrite: the trigger may already carry its own
333
+ // popup semantics (e.g. a menu button wrapped in a labelled HoverCard),
334
+ // so preserve the existing values and restore them on cleanup.
335
+ const existingHaspopup = firstChild.getAttribute('aria-haspopup');
336
+ const existingControls = firstChild.getAttribute('aria-controls');
337
+ const existingExpanded = firstChild.getAttribute('aria-expanded');
338
+ const canExpand = supportsAriaExpanded(firstChild);
339
+
340
+ firstChild.setAttribute('aria-haspopup', 'dialog');
341
+ // Only point aria-controls at the layer while it is open and in the DOM.
342
+ // While closed, useLayer leaves only an inert <template> marker, so the
343
+ // id would reference nothing. DateInput gates it the same way. The
344
+ // trigger's own aria-controls (if any) is preserved either way.
345
+ if (hoverCard.isOpen) {
346
+ firstChild.setAttribute(
347
+ 'aria-controls',
348
+ mergeIds(existingControls, hoverCard.id) ?? '',
349
+ );
350
+ } else if (existingControls) {
351
+ firstChild.setAttribute('aria-controls', existingControls);
352
+ } else {
353
+ firstChild.removeAttribute('aria-controls');
354
+ }
355
+ if (canExpand) {
356
+ firstChild.setAttribute('aria-expanded', String(hoverCard.isOpen));
357
+ } else if (existingExpanded) {
358
+ firstChild.setAttribute('aria-expanded', existingExpanded);
359
+ } else {
360
+ firstChild.removeAttribute('aria-expanded');
361
+ }
362
+
363
+ return () => {
364
+ hoverCard.ref(null);
365
+ if (existingHaspopup) {
366
+ firstChild.setAttribute('aria-haspopup', existingHaspopup);
367
+ } else {
368
+ firstChild.removeAttribute('aria-haspopup');
369
+ }
370
+ if (existingControls) {
371
+ firstChild.setAttribute('aria-controls', existingControls);
372
+ } else {
373
+ firstChild.removeAttribute('aria-controls');
374
+ }
375
+ if (existingExpanded) {
376
+ firstChild.setAttribute('aria-expanded', existingExpanded);
377
+ } else {
378
+ firstChild.removeAttribute('aria-expanded');
379
+ }
380
+ };
381
+ }
382
+
383
+ // Unnamed fallback: the popup remains role="group", which is not a dialog,
384
+ // so keep the previous description relationship until a naming decision is
385
+ // made for the no-label case (tracked in #5049).
257
386
  const existingDescribedBy = firstChild.getAttribute('aria-describedby');
258
387
  firstChild.setAttribute(
259
388
  'aria-describedby',
@@ -268,7 +397,14 @@ export function HoverCard({
268
397
  firstChild.removeAttribute('aria-describedby');
269
398
  }
270
399
  };
271
- }, [textOnly, hoverCard.ref, hoverCard.describedBy]);
400
+ }, [
401
+ textOnly,
402
+ label,
403
+ hoverCard.ref,
404
+ hoverCard.id,
405
+ hoverCard.isOpen,
406
+ hoverCard.describedBy,
407
+ ]);
272
408
 
273
409
  // While closed, useLayer leaves only an inert <template> marker at this JSX
274
410
  // position. When the card needs to open, it uses that marker to keep the
@@ -287,7 +423,11 @@ export function HoverCard({
287
423
  <span
288
424
  ref={hoverCard.ref}
289
425
  tabIndex={0}
290
- aria-describedby={hoverCard.describedBy}
426
+ aria-haspopup={label ? 'dialog' : undefined}
427
+ aria-controls={label && hoverCard.isOpen ? hoverCard.id : undefined}
428
+ // No aria-expanded: this wrapper is a role-less <span>, and
429
+ // aria-expanded is invalid on it (see EXPANDABLE_ROLES above).
430
+ aria-describedby={label ? undefined : hoverCard.describedBy}
291
431
  {...stylex.props(
292
432
  styles.wrapperInline,
293
433
  showHoverIndication && styles.hoverIndication,