@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052

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 (728) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +6 -2
  4. package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
  5. package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
  6. package/dist/Avatar/Avatar.d.ts +58 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +240 -53
  9. package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
  10. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  11. package/dist/Avatar/AvatarStatusDot.js +144 -19
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +58 -6
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
  17. package/dist/Banner/Banner.d.ts +9 -1
  18. package/dist/Banner/Banner.d.ts.map +1 -1
  19. package/dist/Banner/Banner.js +33 -4
  20. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
  21. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
  23. package/dist/Breadcrumbs/index.d.ts +6 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +10 -1
  26. package/dist/Button/Button.d.ts +8 -2
  27. package/dist/Button/Button.d.ts.map +1 -1
  28. package/dist/Button/Button.js +33 -4
  29. package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
  30. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  31. package/dist/ButtonGroup/ButtonGroup.js +30 -1
  32. package/dist/Calendar/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar/Calendar.js +80 -11
  34. package/dist/Calendar/dayCellUtils.d.ts +4 -4
  35. package/dist/Calendar/dayCellUtils.js +3 -3
  36. package/dist/Calendar/styles.d.ts +30 -31
  37. package/dist/Calendar/styles.d.ts.map +1 -1
  38. package/dist/Calendar/styles.js +30 -31
  39. package/dist/Card/Card.d.ts +8 -2
  40. package/dist/Card/Card.d.ts.map +1 -1
  41. package/dist/Card/Card.js +28 -2
  42. package/dist/Carousel/Carousel.d.ts +4 -1
  43. package/dist/Carousel/Carousel.d.ts.map +1 -1
  44. package/dist/Carousel/Carousel.js +46 -16
  45. package/dist/Chat/ChatComposer.d.ts +8 -0
  46. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  47. package/dist/Chat/ChatComposer.js +46 -7
  48. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  49. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  50. package/dist/Chat/ChatComposerDrawer.js +11 -1
  51. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  52. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  53. package/dist/Chat/ChatComposerInput.js +36 -4
  54. package/dist/Chat/ChatContext.d.ts +33 -0
  55. package/dist/Chat/ChatContext.d.ts.map +1 -1
  56. package/dist/Chat/ChatContext.js +16 -2
  57. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatDictationButton.js +4 -2
  59. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  60. package/dist/Chat/ChatLayout.js +4 -4
  61. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  62. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  63. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  64. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  65. package/dist/Chat/ChatSendButton.js +7 -1
  66. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +27 -11
  69. package/dist/Chat/index.d.ts +2 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/index.js +1 -1
  72. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  73. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  74. package/dist/Chat/useChatStreamScroll.js +22 -8
  75. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  76. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  77. package/dist/Chat/useSpeechRecognition.js +1 -1
  78. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  79. package/dist/Chat/useTriggerMenu.js +2 -2
  80. package/dist/CheckboxInput/CheckboxInput.js +5 -5
  81. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  82. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  83. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  84. package/dist/Citation/Citation.d.ts +22 -1
  85. package/dist/Citation/Citation.d.ts.map +1 -1
  86. package/dist/Citation/Citation.js +20 -6
  87. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  88. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  89. package/dist/ClickableCard/ClickableCard.js +5 -2
  90. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  91. package/dist/CodeBlock/CodeBlock.js +22 -9
  92. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  93. package/dist/Collapsible/Collapsible.js +3 -1
  94. package/dist/CommandPalette/CommandPalette.d.ts +2 -2
  95. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  96. package/dist/CommandPalette/CommandPalette.js +45 -4
  97. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  98. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  99. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  100. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  101. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  102. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  103. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  104. package/dist/ContextMenu/ContextMenu.js +14 -5
  105. package/dist/ContextMenu/index.d.ts +1 -0
  106. package/dist/ContextMenu/index.d.ts.map +1 -1
  107. package/dist/ContextMenu/index.js +3 -1
  108. package/dist/DateInput/DateInput.d.ts +56 -2
  109. package/dist/DateInput/DateInput.d.ts.map +1 -1
  110. package/dist/DateInput/DateInput.js +59 -21
  111. package/dist/DateInput/index.d.ts +1 -1
  112. package/dist/DateInput/index.d.ts.map +1 -1
  113. package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
  114. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  115. package/dist/DateRangeInput/DateRangeInput.js +23 -20
  116. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  117. package/dist/DateTimeInput/DateTimeInput.js +33 -19
  118. package/dist/Dialog/Dialog.d.ts +3 -0
  119. package/dist/Dialog/Dialog.d.ts.map +1 -1
  120. package/dist/Dialog/Dialog.js +57 -6
  121. package/dist/Dialog/DialogContext.d.ts +7 -0
  122. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  123. package/dist/Dialog/DialogContext.js +2 -2
  124. package/dist/Dialog/DialogHeader.d.ts +5 -2
  125. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  126. package/dist/Dialog/DialogHeader.js +6 -1
  127. package/dist/Divider/Divider.js +1 -1
  128. package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
  129. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  130. package/dist/DropdownMenu/DropdownMenu.js +22 -5
  131. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  132. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  133. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
  134. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  135. package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
  136. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  137. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  138. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  139. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  140. package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
  141. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
  142. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
  143. package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
  144. package/dist/DropdownMenu/index.d.ts +10 -0
  145. package/dist/DropdownMenu/index.d.ts.map +1 -1
  146. package/dist/DropdownMenu/index.js +13 -0
  147. package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
  148. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
  149. package/dist/DropdownMenu/menuItemHover.js +33 -0
  150. package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
  151. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
  152. package/dist/DropdownMenu/menuItemRoles.js +10 -1
  153. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  154. package/dist/DropdownMenu/renderDropdownItems.js +21 -6
  155. package/dist/Field/Field.d.ts +3 -1
  156. package/dist/Field/Field.d.ts.map +1 -1
  157. package/dist/Field/Field.js +6 -4
  158. package/dist/Field/FieldLabel.d.ts +1 -1
  159. package/dist/Field/FieldLabel.d.ts.map +1 -1
  160. package/dist/Field/FieldLabel.js +43 -16
  161. package/dist/Field/inputStyles.stylex.d.ts +1 -0
  162. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  163. package/dist/Field/inputStyles.stylex.js +1 -0
  164. package/dist/FieldStatus/FieldStatus.d.ts +18 -0
  165. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  166. package/dist/FieldStatus/FieldStatus.js +60 -6
  167. package/dist/FileInput/FileInput.d.ts +10 -2
  168. package/dist/FileInput/FileInput.d.ts.map +1 -1
  169. package/dist/FileInput/FileInput.js +54 -35
  170. package/dist/HoverCard/HoverCard.d.ts +9 -1
  171. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  172. package/dist/HoverCard/HoverCard.js +2 -0
  173. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  174. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  175. package/dist/HoverCard/useHoverCard.js +17 -6
  176. package/dist/Icon/Icon.d.ts +22 -3
  177. package/dist/Icon/Icon.d.ts.map +1 -1
  178. package/dist/Icon/Icon.js +19 -3
  179. package/dist/Item/Item.d.ts +6 -1
  180. package/dist/Item/Item.d.ts.map +1 -1
  181. package/dist/Item/Item.js +22 -1
  182. package/dist/Layer/useLayer.d.ts +6 -0
  183. package/dist/Layer/useLayer.d.ts.map +1 -1
  184. package/dist/Layer/useLayer.js +2 -0
  185. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  186. package/dist/Lightbox/Lightbox.js +19 -13
  187. package/dist/Markdown/Markdown.d.ts.map +1 -1
  188. package/dist/Markdown/Markdown.js +7 -0
  189. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  190. package/dist/MobileNav/MobileNav.js +6 -1
  191. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  192. package/dist/MobileNav/MobileNavToggle.js +4 -0
  193. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  194. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  195. package/dist/MultiSelector/MultiSelector.js +104 -50
  196. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  197. package/dist/MultiSelector/hooks.js +16 -0
  198. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  199. package/dist/NumberInput/NumberInput.d.ts +10 -2
  200. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  201. package/dist/NumberInput/NumberInput.js +22 -17
  202. package/dist/Outline/Outline.d.ts +0 -1
  203. package/dist/Outline/Outline.d.ts.map +1 -1
  204. package/dist/Outline/Outline.js +0 -1
  205. package/dist/OverflowList/OverflowList.d.ts +20 -3
  206. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  207. package/dist/OverflowList/OverflowList.js +29 -4
  208. package/dist/Pagination/Pagination.d.ts.map +1 -1
  209. package/dist/Pagination/Pagination.js +11 -3
  210. package/dist/Popover/Popover.d.ts.map +1 -1
  211. package/dist/Popover/Popover.js +3 -2
  212. package/dist/Popover/usePopover.d.ts.map +1 -1
  213. package/dist/Popover/usePopover.js +3 -9
  214. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  215. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  216. package/dist/PowerSearch/PowerSearch.js +2 -0
  217. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  218. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  219. package/dist/RadioList/RadioList.d.ts +2 -2
  220. package/dist/RadioList/RadioListItem.js +4 -4
  221. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  222. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  223. package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
  224. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  225. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  226. package/dist/SelectableCard/SelectableCard.js +16 -13
  227. package/dist/Selector/Selector.d.ts +8 -0
  228. package/dist/Selector/Selector.d.ts.map +1 -1
  229. package/dist/Selector/Selector.js +65 -19
  230. package/dist/Selector/hooks.d.ts.map +1 -1
  231. package/dist/Selector/hooks.js +16 -0
  232. package/dist/SideNav/SideNav.d.ts.map +1 -1
  233. package/dist/SideNav/SideNav.js +5 -5
  234. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  235. package/dist/SideNav/SideNavCollapseButton.js +13 -10
  236. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  237. package/dist/SideNav/SideNavHeading.js +21 -8
  238. package/dist/SideNav/SideNavItem.d.ts +1 -1
  239. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  240. package/dist/SideNav/SideNavItem.js +12 -10
  241. package/dist/Slider/Slider.d.ts.map +1 -1
  242. package/dist/Slider/Slider.js +106 -36
  243. package/dist/Stack/stack.stylex.d.ts +9 -9
  244. package/dist/Switch/Switch.d.ts +8 -1
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +160 -91
  247. package/dist/TabList/Tab.js +2 -2
  248. package/dist/TabList/TabMenu.js +1 -1
  249. package/dist/Table/BaseTable.d.ts.map +1 -1
  250. package/dist/Table/BaseTable.js +33 -6
  251. package/dist/Table/TableCell.js +3 -3
  252. package/dist/Table/TableHeaderCell.js +3 -3
  253. package/dist/Table/index.d.ts +2 -0
  254. package/dist/Table/index.d.ts.map +1 -1
  255. package/dist/Table/index.js +1 -0
  256. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  257. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
  258. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  259. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
  260. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  261. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  262. package/dist/Table/plugins/rowStatus/index.js +3 -0
  263. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  264. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  265. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  266. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  267. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  268. package/dist/Table/plugins/selection/useTableSelection.js +7 -1
  269. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  270. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  271. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  272. package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
  273. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  274. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  275. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  276. package/dist/Table/types.d.ts +32 -0
  277. package/dist/Table/types.d.ts.map +1 -1
  278. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  279. package/dist/Table/useBaseTablePlugins.js +5 -3
  280. package/dist/TextArea/TextArea.d.ts +10 -1
  281. package/dist/TextArea/TextArea.d.ts.map +1 -1
  282. package/dist/TextArea/TextArea.js +18 -19
  283. package/dist/TextInput/TextInput.d.ts +10 -2
  284. package/dist/TextInput/TextInput.d.ts.map +1 -1
  285. package/dist/TextInput/TextInput.js +20 -17
  286. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  287. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  288. package/dist/Thumbnail/Thumbnail.js +97 -54
  289. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  290. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  291. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  292. package/dist/TimeInput/TimeInput.d.ts +10 -2
  293. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  294. package/dist/TimeInput/TimeInput.js +32 -21
  295. package/dist/Timestamp/Timestamp.d.ts +3 -1
  296. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  297. package/dist/Timestamp/Timestamp.js +8 -6
  298. package/dist/Toast/useToast.d.ts.map +1 -1
  299. package/dist/Toast/useToast.js +2 -5
  300. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  301. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  302. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  303. package/dist/Token/Token.d.ts +30 -3
  304. package/dist/Token/Token.d.ts.map +1 -1
  305. package/dist/Token/Token.js +17 -2
  306. package/dist/Token/index.d.ts +1 -1
  307. package/dist/Token/index.d.ts.map +1 -1
  308. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  309. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  310. package/dist/Tokenizer/Tokenizer.js +20 -6
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +17 -1
  313. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  314. package/dist/TopNav/TopNavHeading.js +18 -8
  315. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  316. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  319. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  320. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  321. package/dist/TopNav/TopNavMenu.js +68 -6
  322. package/dist/TreeList/TreeList.d.ts +12 -3
  323. package/dist/TreeList/TreeList.d.ts.map +1 -1
  324. package/dist/TreeList/TreeList.js +3 -0
  325. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  326. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  327. package/dist/TreeList/TreeListBranches.js +18 -10
  328. package/dist/TreeList/TreeListItem.d.ts +8 -2
  329. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  330. package/dist/TreeList/TreeListItem.js +59 -21
  331. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  332. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  333. package/dist/TreeList/index.d.ts +2 -2
  334. package/dist/TreeList/index.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  336. package/dist/Typeahead/BaseTypeahead.js +20 -11
  337. package/dist/Typeahead/Typeahead.d.ts +9 -2
  338. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  339. package/dist/Typeahead/Typeahead.js +3 -1
  340. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  341. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  342. package/dist/Typeahead/TypeaheadItem.js +20 -10
  343. package/dist/astryx.css +61 -39
  344. package/dist/astryx.umd.js +53 -53
  345. package/dist/astryx.umd.js.map +4 -4
  346. package/dist/authoring/doc.d.ts.map +1 -1
  347. package/dist/docs-types.d.ts +8 -0
  348. package/dist/docs-types.d.ts.map +1 -1
  349. package/dist/hooks/computeOverflow.d.ts +47 -0
  350. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  351. package/dist/hooks/computeOverflow.js +213 -0
  352. package/dist/hooks/index.d.ts +3 -0
  353. package/dist/hooks/index.d.ts.map +1 -1
  354. package/dist/hooks/index.js +3 -1
  355. package/dist/hooks/isRtlElement.d.ts +18 -0
  356. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  357. package/dist/hooks/isRtlElement.js +27 -0
  358. package/dist/hooks/useDevWarning.d.ts +18 -0
  359. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  360. package/dist/hooks/useDevWarning.js +49 -0
  361. package/dist/hooks/useGridFocus.d.ts +6 -1
  362. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  363. package/dist/hooks/useGridFocus.js +12 -9
  364. package/dist/hooks/useInputStatusIcon.d.ts +38 -0
  365. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
  366. package/dist/hooks/useInputStatusIcon.js +158 -0
  367. package/dist/hooks/useListFocus.d.ts +39 -1
  368. package/dist/hooks/useListFocus.d.ts.map +1 -1
  369. package/dist/hooks/useListFocus.js +54 -9
  370. package/dist/hooks/useOverflow.d.ts +19 -0
  371. package/dist/hooks/useOverflow.d.ts.map +1 -1
  372. package/dist/hooks/useOverflow.js +36 -25
  373. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  374. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  375. package/dist/i18n/InternationalizationContext.js +3 -0
  376. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  377. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  378. package/dist/i18n/InternationalizationProvider.js +5 -1
  379. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  380. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  381. package/dist/i18n/getLocaleDirection.js +29 -0
  382. package/dist/i18n/index.d.ts +6 -0
  383. package/dist/i18n/index.d.ts.map +1 -1
  384. package/dist/i18n/index.js +7 -1
  385. package/dist/i18n/resolve.d.ts.map +1 -1
  386. package/dist/i18n/resolve.js +7 -18
  387. package/dist/i18n/useDirection.d.ts +2 -0
  388. package/dist/i18n/useDirection.d.ts.map +1 -0
  389. package/dist/i18n/useDirection.js +27 -0
  390. package/dist/theme/Theme.d.ts.map +1 -1
  391. package/dist/theme/Theme.js +2 -7
  392. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  393. package/dist/theme/derivedVarRegistry.js +13 -0
  394. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  395. package/dist/theme/generateThemeRules.js +51 -0
  396. package/dist/theme/hct.d.ts +0 -1
  397. package/dist/theme/hct.d.ts.map +1 -1
  398. package/dist/theme/hct.js +1 -1
  399. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  400. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  401. package/dist/utils/devWarning.d.ts +42 -0
  402. package/dist/utils/devWarning.d.ts.map +1 -0
  403. package/dist/utils/devWarning.js +88 -0
  404. package/dist/utils/index.d.ts +4 -1
  405. package/dist/utils/index.d.ts.map +1 -1
  406. package/dist/utils/index.js +4 -2
  407. package/dist/utils/plainDate.d.ts +30 -0
  408. package/dist/utils/plainDate.d.ts.map +1 -1
  409. package/dist/utils/plainDate.js +65 -3
  410. package/dist/utils/rtlStyles.d.ts +24 -0
  411. package/dist/utils/rtlStyles.d.ts.map +1 -0
  412. package/dist/utils/rtlStyles.js +27 -0
  413. package/dist/utils/types.d.ts +13 -0
  414. package/dist/utils/types.d.ts.map +1 -1
  415. package/locales/en.json +104 -0
  416. package/locales/fr-FR.json +14 -0
  417. package/locales/pseudo.json +78 -0
  418. package/package.json +6 -1
  419. package/src/AppShell/AppShell.tsx +6 -0
  420. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  421. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  422. package/src/Avatar/Avatar.doc.mjs +64 -5
  423. package/src/Avatar/Avatar.test.tsx +374 -1
  424. package/src/Avatar/Avatar.tsx +367 -69
  425. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  426. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  427. package/src/Avatar/AvatarStatusDot.tsx +180 -21
  428. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  429. package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
  430. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  431. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  432. package/src/Banner/Banner.doc.mjs +9 -0
  433. package/src/Banner/Banner.test.tsx +30 -0
  434. package/src/Banner/Banner.tsx +53 -9
  435. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  436. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  437. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  438. package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
  439. package/src/Breadcrumbs/index.ts +31 -0
  440. package/src/Button/Button.doc.mjs +9 -4
  441. package/src/Button/Button.test.tsx +49 -0
  442. package/src/Button/Button.tsx +27 -3
  443. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  444. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  445. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  446. package/src/Calendar/Calendar.doc.mjs +12 -1
  447. package/src/Calendar/Calendar.test.tsx +362 -19
  448. package/src/Calendar/Calendar.tsx +111 -32
  449. package/src/Calendar/dayCellUtils.test.ts +23 -18
  450. package/src/Calendar/dayCellUtils.ts +3 -3
  451. package/src/Calendar/styles.ts +33 -39
  452. package/src/Card/Card.doc.mjs +9 -0
  453. package/src/Card/Card.test.tsx +21 -3
  454. package/src/Card/Card.tsx +35 -2
  455. package/src/Carousel/Carousel.doc.mjs +1 -0
  456. package/src/Carousel/Carousel.test.tsx +53 -0
  457. package/src/Carousel/Carousel.tsx +59 -10
  458. package/src/Chat/ChatComposer.doc.mjs +12 -3
  459. package/src/Chat/ChatComposer.test.tsx +115 -0
  460. package/src/Chat/ChatComposer.tsx +73 -9
  461. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  462. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  463. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  464. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  465. package/src/Chat/ChatComposerInput.tsx +51 -5
  466. package/src/Chat/ChatContext.tsx +37 -10
  467. package/src/Chat/ChatDictationButton.tsx +11 -2
  468. package/src/Chat/ChatLayout.tsx +7 -5
  469. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  470. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  471. package/src/Chat/ChatSendButton.tsx +11 -1
  472. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  473. package/src/Chat/ChatToolCalls.tsx +33 -5
  474. package/src/Chat/index.ts +5 -1
  475. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  476. package/src/Chat/useChatStreamScroll.ts +27 -10
  477. package/src/Chat/useSpeechRecognition.ts +1 -1
  478. package/src/Chat/useTriggerMenu.tsx +4 -2
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
  480. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  481. package/src/CheckboxInput/CheckboxInput.tsx +5 -5
  482. package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
  483. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  484. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  485. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  486. package/src/Citation/Citation.doc.mjs +4 -3
  487. package/src/Citation/Citation.test.tsx +97 -0
  488. package/src/Citation/Citation.tsx +43 -11
  489. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  490. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  491. package/src/ClickableCard/ClickableCard.tsx +13 -3
  492. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  493. package/src/CodeBlock/CodeBlock.tsx +45 -10
  494. package/src/Collapsible/Collapsible.doc.mjs +1 -0
  495. package/src/Collapsible/Collapsible.test.tsx +7 -0
  496. package/src/Collapsible/Collapsible.tsx +16 -6
  497. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  498. package/src/CommandPalette/CommandPalette.test.tsx +95 -1
  499. package/src/CommandPalette/CommandPalette.tsx +44 -3
  500. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  501. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  502. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  503. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  504. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  505. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  506. package/src/ContextMenu/ContextMenu.test.tsx +235 -0
  507. package/src/ContextMenu/ContextMenu.tsx +13 -11
  508. package/src/ContextMenu/index.ts +5 -0
  509. package/src/DateInput/DateInput.doc.mjs +41 -0
  510. package/src/DateInput/DateInput.test.tsx +338 -0
  511. package/src/DateInput/DateInput.tsx +119 -32
  512. package/src/DateInput/index.ts +1 -0
  513. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  514. package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
  515. package/src/DateRangeInput/DateRangeInput.tsx +42 -30
  516. package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
  517. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  518. package/src/DateTimeInput/DateTimeInput.tsx +58 -41
  519. package/src/Dialog/Dialog.doc.mjs +2 -2
  520. package/src/Dialog/Dialog.test.tsx +77 -4
  521. package/src/Dialog/Dialog.tsx +89 -5
  522. package/src/Dialog/DialogContext.ts +9 -2
  523. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  524. package/src/Dialog/DialogHeader.tsx +9 -2
  525. package/src/Divider/Divider.tsx +2 -2
  526. package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
  527. package/src/DropdownMenu/DropdownMenu.tsx +31 -12
  528. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
  529. package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
  530. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  531. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
  532. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
  533. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
  534. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
  535. package/src/DropdownMenu/index.ts +16 -0
  536. package/src/DropdownMenu/menuItemHover.ts +39 -0
  537. package/src/DropdownMenu/menuItemRoles.ts +9 -0
  538. package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
  539. package/src/Field/Field.test.tsx +57 -12
  540. package/src/Field/Field.tsx +20 -14
  541. package/src/Field/FieldLabel.tsx +9 -1
  542. package/src/Field/inputStyles.stylex.ts +2 -0
  543. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  544. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  545. package/src/FieldStatus/FieldStatus.tsx +69 -5
  546. package/src/FileInput/FileInput.doc.mjs +23 -2
  547. package/src/FileInput/FileInput.test.tsx +135 -12
  548. package/src/FileInput/FileInput.tsx +65 -51
  549. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  550. package/src/HoverCard/HoverCard.test.tsx +21 -2
  551. package/src/HoverCard/HoverCard.tsx +11 -0
  552. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  553. package/src/HoverCard/useHoverCard.tsx +39 -5
  554. package/src/Icon/Icon.doc.mjs +16 -2
  555. package/src/Icon/Icon.test.tsx +89 -0
  556. package/src/Icon/Icon.tsx +58 -5
  557. package/src/IconButton/IconButton.doc.mjs +8 -0
  558. package/src/IconButton/IconButton.test.tsx +15 -18
  559. package/src/Item/Item.test.tsx +40 -18
  560. package/src/Item/Item.tsx +38 -2
  561. package/src/Layer/useLayer.tsx +8 -0
  562. package/src/Lightbox/Lightbox.tsx +15 -7
  563. package/src/List/List.test.tsx +9 -8
  564. package/src/Markdown/Markdown.test.tsx +21 -0
  565. package/src/Markdown/Markdown.tsx +4 -0
  566. package/src/MobileNav/MobileNav.tsx +12 -1
  567. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  568. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  569. package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
  570. package/src/MultiSelector/MultiSelector.test.tsx +498 -3
  571. package/src/MultiSelector/MultiSelector.tsx +149 -65
  572. package/src/MultiSelector/hooks.ts +17 -0
  573. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  574. package/src/NumberInput/NumberInput.doc.mjs +21 -0
  575. package/src/NumberInput/NumberInput.test.tsx +82 -7
  576. package/src/NumberInput/NumberInput.tsx +36 -28
  577. package/src/Outline/Outline.tsx +0 -1
  578. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  579. package/src/OverflowList/OverflowList.test.tsx +111 -0
  580. package/src/OverflowList/OverflowList.tsx +48 -8
  581. package/src/Pagination/Pagination.tsx +11 -3
  582. package/src/Popover/Popover.tsx +7 -4
  583. package/src/Popover/usePopover.tsx +9 -13
  584. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  585. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  586. package/src/PowerSearch/PowerSearch.tsx +10 -1
  587. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  588. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  589. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  590. package/src/RadioList/RadioList.doc.mjs +6 -0
  591. package/src/RadioList/RadioList.tsx +2 -2
  592. package/src/RadioList/RadioListItem.tsx +4 -4
  593. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
  594. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  595. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  596. package/src/SelectableCard/SelectableCard.tsx +29 -16
  597. package/src/Selector/Selector.doc.mjs +15 -0
  598. package/src/Selector/Selector.test.tsx +417 -0
  599. package/src/Selector/Selector.tsx +86 -21
  600. package/src/Selector/hooks.ts +17 -0
  601. package/src/SideNav/SideNav.test.tsx +119 -3
  602. package/src/SideNav/SideNav.tsx +1 -8
  603. package/src/SideNav/SideNavCollapseButton.tsx +15 -8
  604. package/src/SideNav/SideNavHeading.tsx +24 -8
  605. package/src/SideNav/SideNavItem.tsx +10 -4
  606. package/src/Slider/Slider.doc.mjs +6 -0
  607. package/src/Slider/Slider.test.tsx +314 -13
  608. package/src/Slider/Slider.tsx +117 -28
  609. package/src/Switch/Switch.doc.mjs +142 -42
  610. package/src/Switch/Switch.test.tsx +54 -1
  611. package/src/Switch/Switch.tsx +90 -33
  612. package/src/TabList/Tab.tsx +2 -2
  613. package/src/TabList/TabMenu.tsx +2 -2
  614. package/src/Table/BaseTable.tsx +37 -7
  615. package/src/Table/Table.doc.mjs +11 -0
  616. package/src/Table/Table.test.tsx +85 -0
  617. package/src/Table/TableCell.tsx +3 -3
  618. package/src/Table/TableHeaderCell.tsx +3 -3
  619. package/src/Table/index.ts +5 -0
  620. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
  621. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
  622. package/src/Table/plugins/rowStatus/index.ts +7 -0
  623. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  624. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  625. package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
  626. package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
  627. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  628. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  629. package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
  630. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  631. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  632. package/src/Table/types.ts +33 -0
  633. package/src/Table/useBaseTablePlugins.ts +10 -6
  634. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  635. package/src/Table/useTableSelection.doc.mjs +65 -14
  636. package/src/Table/useTableTreeData.doc.mjs +29 -0
  637. package/src/Table/useTableTreeState.doc.mjs +2 -2
  638. package/src/TextArea/TextArea.doc.mjs +21 -0
  639. package/src/TextArea/TextArea.test.tsx +32 -1
  640. package/src/TextArea/TextArea.tsx +27 -26
  641. package/src/TextInput/TextInput.doc.mjs +21 -0
  642. package/src/TextInput/TextInput.test.tsx +150 -0
  643. package/src/TextInput/TextInput.tsx +28 -25
  644. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  645. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  646. package/src/Thumbnail/Thumbnail.tsx +142 -42
  647. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  648. package/src/TimeInput/TimeInput.doc.mjs +21 -0
  649. package/src/TimeInput/TimeInput.test.tsx +99 -1
  650. package/src/TimeInput/TimeInput.tsx +43 -31
  651. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  652. package/src/Timestamp/Timestamp.test.tsx +32 -0
  653. package/src/Timestamp/Timestamp.tsx +28 -8
  654. package/src/Toast/useToast.tsx +7 -8
  655. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  656. package/src/Token/Token.test.tsx +21 -15
  657. package/src/Token/Token.tsx +31 -14
  658. package/src/Token/index.ts +1 -1
  659. package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
  660. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  661. package/src/Tokenizer/Tokenizer.tsx +30 -6
  662. package/src/Tooltip/Tooltip.test.tsx +46 -0
  663. package/src/Tooltip/useTooltip.tsx +20 -0
  664. package/src/TopNav/TopNav.test.tsx +125 -1
  665. package/src/TopNav/TopNavHeading.tsx +24 -8
  666. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  667. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  668. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  669. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  670. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  671. package/src/TopNav/TopNavMenu.tsx +83 -5
  672. package/src/TreeList/TreeList.doc.mjs +28 -0
  673. package/src/TreeList/TreeList.test.tsx +272 -0
  674. package/src/TreeList/TreeList.tsx +23 -2
  675. package/src/TreeList/TreeListBranches.tsx +24 -8
  676. package/src/TreeList/TreeListItem.tsx +84 -22
  677. package/src/TreeList/TreeListTypes.ts +27 -1
  678. package/src/TreeList/index.ts +2 -2
  679. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  680. package/src/Typeahead/Typeahead.doc.mjs +13 -0
  681. package/src/Typeahead/Typeahead.test.tsx +50 -0
  682. package/src/Typeahead/Typeahead.tsx +11 -1
  683. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  684. package/src/__tests__/inputWidthContract.test.tsx +62 -0
  685. package/src/authoring/doc.ts +1 -3
  686. package/src/doc-mjs.d.ts +19 -0
  687. package/src/docs-types.ts +5 -0
  688. package/src/hooks/computeOverflow.test.ts +422 -0
  689. package/src/hooks/computeOverflow.ts +290 -0
  690. package/src/hooks/index.ts +8 -0
  691. package/src/hooks/isRtlElement.ts +27 -0
  692. package/src/hooks/useDevWarning.test.tsx +45 -0
  693. package/src/hooks/useDevWarning.ts +54 -0
  694. package/src/hooks/useGridFocus.doc.mjs +3 -3
  695. package/src/hooks/useGridFocus.test.tsx +41 -0
  696. package/src/hooks/useGridFocus.ts +21 -10
  697. package/src/hooks/useInputStatusIcon.test.tsx +162 -0
  698. package/src/hooks/useInputStatusIcon.tsx +224 -0
  699. package/src/hooks/useListFocus.doc.mjs +25 -3
  700. package/src/hooks/useListFocus.test.tsx +153 -1
  701. package/src/hooks/useListFocus.ts +102 -9
  702. package/src/hooks/useOverflow.test.ts +96 -4
  703. package/src/hooks/useOverflow.ts +74 -33
  704. package/src/i18n/InternationalizationContext.ts +4 -0
  705. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  706. package/src/i18n/InternationalizationProvider.tsx +12 -2
  707. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  708. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  709. package/src/i18n/getLocaleDirection.ts +29 -0
  710. package/src/i18n/index.ts +6 -0
  711. package/src/i18n/resolve.ts +9 -21
  712. package/src/i18n/useDirection.ts +29 -0
  713. package/src/reset.css +0 -26
  714. package/src/reset.test.ts +60 -0
  715. package/src/theme/Theme.tsx +11 -14
  716. package/src/theme/derivedVarRegistry.test.ts +1 -0
  717. package/src/theme/derivedVarRegistry.ts +6 -0
  718. package/src/theme/generateThemeRules.test.ts +107 -0
  719. package/src/theme/generateThemeRules.ts +56 -0
  720. package/src/theme/hct.ts +1 -1
  721. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  722. package/src/utils/devWarning.test.ts +56 -0
  723. package/src/utils/devWarning.ts +102 -0
  724. package/src/utils/index.ts +8 -0
  725. package/src/utils/plainDate.test.ts +46 -6
  726. package/src/utils/plainDate.ts +69 -3
  727. package/src/utils/rtlStyles.ts +27 -0
  728. package/src/utils/types.ts +14 -0
@@ -10,10 +10,14 @@
10
10
  *
11
11
  * SYNC: When modified, update these files to stay in sync:
12
12
  * - /packages/core/src/Citation/index.ts (exports if types change)
13
+ * - /packages/core/src/Citation/Citation.doc.mjs (props table, features)
14
+ * - /packages/core/src/Citation/Citation.test.tsx (tests for new/changed behavior)
15
+ * - /apps/storybook/stories/Citation.stories.tsx (storybook stories)
13
16
  * - /packages/cli/templates/blocks/components/Citation/ (showcase blocks)
14
17
  */
15
18
 
16
19
  import type React from 'react';
20
+ import type {ReactNode} from 'react';
17
21
  import * as stylex from '@stylexjs/stylex';
18
22
  import {
19
23
  colorVars,
@@ -29,11 +33,29 @@ import {mergeProps} from '../utils';
29
33
  import type {BaseProps} from '../BaseProps';
30
34
  import {themeProps} from '../utils/themeProps';
31
35
  import {useTranslator} from '../i18n';
36
+ import {renderIconSlot} from '../Icon';
32
37
 
33
38
  export interface CitationSource {
34
39
  title?: string;
35
40
  url?: string;
36
- icon?: string;
41
+ /**
42
+ * Image URL for a favicon or source logo, rendered as `<img src>` inside the
43
+ * icon circle. This is the idiomatic field for image sources (mirrors
44
+ * `Avatar`/`Thumbnail` `src`). When both `src` and a non-string `icon` are
45
+ * provided, `icon` wins.
46
+ */
47
+ src?: string;
48
+ /**
49
+ * Source icon shown before the label text (label variant only). Accepts:
50
+ * - a React node / Astryx `<Icon>` / SVG element — rendered as-is, or
51
+ * - a string image URL — rendered as `<img src>` for backward compatibility
52
+ * with callers that passed a favicon URL here.
53
+ *
54
+ * Note: unlike icon slots elsewhere in the system, a bare string is treated
55
+ * as an image URL (not a semantic icon name) to preserve the original
56
+ * favicon behavior. Pass an Astryx `<Icon>` (or other node) for a real icon.
57
+ */
58
+ icon?: ReactNode;
37
59
  }
38
60
 
39
61
  export interface CitationProps extends BaseProps<HTMLElement> {
@@ -162,7 +184,18 @@ export function Citation({
162
184
  const t = useTranslator();
163
185
  const title = source.title ?? String(number);
164
186
  const href = source.url;
165
- const icon = source.icon;
187
+
188
+ // Resolve the source icon. A non-string `icon` node renders as-is (an Astryx
189
+ // <Icon>, SVG, avatar, etc.). Otherwise fall back to an image URL: `src`, or
190
+ // a legacy string passed to `icon` (back-compat — favicon URLs still render
191
+ // as <img>). The icon is decorative; the accessible name comes solely from
192
+ // the element's aria-label, so nothing is double-announced.
193
+ const iconNode =
194
+ source.icon != null && typeof source.icon !== 'string' ? source.icon : null;
195
+ const imageSrc =
196
+ source.src ?? (typeof source.icon === 'string' ? source.icon : undefined);
197
+ const hasIcon = iconNode != null || imageSrc != null;
198
+
166
199
  const Tag = href ? 'a' : 'span';
167
200
  // `doc-noteref` is a reference role — only appropriate on the interactive
168
201
  // link form. On a plain (unlinked) span it is not a permitted role
@@ -218,7 +251,7 @@ export function Citation({
218
251
  themeProps('citation', {variant}),
219
252
  stylex.props(
220
253
  styles.label,
221
- icon != null && styles.labelWithIcon,
254
+ hasIcon && styles.labelWithIcon,
222
255
  href != null && styles.labelHover,
223
256
  href != null && styles.labelInteractive,
224
257
  xstyle,
@@ -226,14 +259,13 @@ export function Citation({
226
259
  className,
227
260
  style,
228
261
  )}>
229
- {icon && (
230
- <span {...stylex.props(styles.iconWrap)}>
231
- <img
232
- src={icon}
233
- alt=""
234
- aria-hidden="true"
235
- {...stylex.props(styles.icon)}
236
- />
262
+ {hasIcon && (
263
+ <span aria-hidden="true" {...stylex.props(styles.iconWrap)}>
264
+ {iconNode != null ? (
265
+ renderIconSlot(iconNode, {size: 'sm'})
266
+ ) : (
267
+ <img src={imageSrc} alt="" {...stylex.props(styles.icon)} />
268
+ )}
237
269
  </span>
238
270
  )}
239
271
  <span {...stylex.props(styles.labelText)}>{title}</span>
@@ -28,6 +28,7 @@ export const docs = {
28
28
  {name: 'children', type: 'ReactNode', description: 'Card content.'},
29
29
  {name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inner padding.', default: '4'},
30
30
  {name: 'variant', type: "'default' | 'transparent' | 'muted' | 'blue' | 'cyan' | 'gray' | 'green' | 'orange' | 'pink' | 'purple' | 'red' | 'teal' | 'yellow'", description: 'Background color variant.', default: "'default'"},
31
+ {name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: 'Resting shadow depth. Often raised to signal the whole card is clickable.', default: "'none'"},
31
32
  {name: 'width', type: 'SizeValue', description: 'Card width.'},
32
33
  {name: 'height', type: 'SizeValue', description: 'Card height.'},
33
34
  {name: 'maxWidth', type: 'SizeValue', description: 'Maximum card width.'},
@@ -73,6 +74,7 @@ export const docsDense = {
73
74
  isDisabled: 'disables card',
74
75
  padding: 'inner padding',
75
76
  variant: 'background color variant',
77
+ elevation: 'resting shadow depth: none|low|med|high; often raised to signal clickability',
76
78
  width: 'card width',
77
79
  height: 'card height',
78
80
  maxWidth: 'max card width',
@@ -106,4 +106,38 @@ describe('ClickableCard', () => {
106
106
  const link = screen.getByRole('link', {name: 'Disabled link'});
107
107
  expect(link).toHaveAttribute('aria-disabled', 'true');
108
108
  });
109
+
110
+ describe('elevation', () => {
111
+ it('forwards a distinct elevation class to the card for each level', () => {
112
+ const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
113
+ const {container} = render(
114
+ <ClickableCard label="Card" elevation={elevation}>
115
+ Content
116
+ </ClickableCard>,
117
+ );
118
+ return container.firstElementChild!.className;
119
+ };
120
+ const classes = new Set([
121
+ classFor('none'),
122
+ classFor('low'),
123
+ classFor('med'),
124
+ classFor('high'),
125
+ ]);
126
+ expect(classes.size).toBe(4);
127
+ });
128
+
129
+ it('defaults to flat (elevation none)', () => {
130
+ const {container: def} = render(
131
+ <ClickableCard label="Card">Content</ClickableCard>,
132
+ );
133
+ const {container: none} = render(
134
+ <ClickableCard label="Card" elevation="none">
135
+ Content
136
+ </ClickableCard>,
137
+ );
138
+ expect(def.firstElementChild!.className).toBe(
139
+ none.firstElementChild!.className,
140
+ );
141
+ });
142
+ });
109
143
  });
@@ -14,6 +14,7 @@
14
14
  * - /apps/storybook/stories/ClickableCard.stories.tsx (storybook stories)
15
15
  * - /packages/cli/templates/blocks/components/Card/ClickableCardShowcase.tsx (showcase block)
16
16
  * - /packages/cli/templates/blocks/components/Card/ClickableCardWithNestedButton.tsx (block)
17
+ * - /packages/cli/templates/blocks/components/Card/ClickableCardElevated.tsx (block)
17
18
  *
18
19
  * Composes Card for all visual styling (radius, padding, variants,
19
20
  * container tokens, theming). Adds an interactive wrapper with
@@ -37,7 +38,7 @@ import {
37
38
  durationVars,
38
39
  easeVars,
39
40
  } from '../theme/tokens.stylex';
40
- import type {SizeValue, SpacingStep} from '../utils/types';
41
+ import type {SizeValue, SpacingStep, Elevation} from '../utils/types';
41
42
  import {mergeProps, mergeRefs} from '../utils';
42
43
  import {Card} from '../Card/Card';
43
44
  import type {CardVariant} from '../Card/Card';
@@ -78,13 +79,13 @@ const styles = stylex.create({
78
79
  backgroundColor: 'transparent',
79
80
  },
80
81
  ':active::after': {
81
- backgroundColor: 'color-mix(in srgb, currentColor 10%, transparent)',
82
+ backgroundColor: colorVars['--color-overlay-pressed'],
82
83
  },
83
84
  },
84
85
  hoverOnPointer: {
85
86
  '@media (hover: hover)': {
86
87
  ':hover::after': {
87
- backgroundColor: 'color-mix(in srgb, currentColor 5%, transparent)',
88
+ backgroundColor: colorVars['--color-overlay-hover'],
88
89
  },
89
90
  },
90
91
  },
@@ -197,6 +198,13 @@ export interface ClickableCardProps extends BaseProps {
197
198
  */
198
199
  variant?: CardVariant;
199
200
 
201
+ /**
202
+ * Resting elevation — the shadow depth the card sits at. Often raised to
203
+ * signal that the whole card is clickable.
204
+ * @default 'none'
205
+ */
206
+ elevation?: Elevation;
207
+
200
208
  /** Width of the card. */
201
209
  width?: SizeValue;
202
210
 
@@ -253,6 +261,7 @@ export function ClickableCard({
253
261
  children,
254
262
  padding,
255
263
  variant = 'default',
264
+ elevation = 'none',
256
265
  width,
257
266
  height,
258
267
  maxWidth,
@@ -297,6 +306,7 @@ export function ClickableCard({
297
306
  maxWidth={maxWidth}
298
307
  padding={padding}
299
308
  variant={variant}
309
+ elevation={elevation}
300
310
  {...mergeProps(themeProps('clickable-card', {variant}), {
301
311
  className: classNameProp,
302
312
  style,
@@ -210,6 +210,62 @@ describe('CodeBlock', () => {
210
210
  expect(document.getElementById(controlsId as string)).not.toBeNull();
211
211
  });
212
212
 
213
+ it('makes the collapsed region inert so the scroll container is unreachable', () => {
214
+ render(
215
+ <CodeBlock
216
+ code={LONG_CODE}
217
+ language="javascript"
218
+ title="example"
219
+ isCollapsible
220
+ />,
221
+ );
222
+ const header = screen
223
+ .getAllByRole('button')
224
+ .find(el => el.hasAttribute('aria-expanded'))!;
225
+ const region = document.getElementById(
226
+ header.getAttribute('aria-controls') as string,
227
+ )!;
228
+ // Expanded: the region is not inert and the scroll container is reachable.
229
+ expect(region).not.toHaveAttribute('inert');
230
+
231
+ fireEvent.click(header);
232
+ expect(header).toHaveAttribute('aria-expanded', 'false');
233
+ // Collapsed: the wrapper is inert, so the keyboard-focusable scroll
234
+ // container (tabIndex=0) inside it drops out of the tab order and the
235
+ // accessibility tree instead of remaining an invisible tab stop.
236
+ expect(region).toHaveAttribute('inert');
237
+ const scrollContainer = screen.getByRole('group');
238
+ expect(scrollContainer.closest('[inert]')).toBe(region);
239
+ });
240
+
241
+ it('restores focusability of the scroll container after expanding again', () => {
242
+ render(
243
+ <CodeBlock
244
+ code={LONG_CODE}
245
+ language="javascript"
246
+ title="example"
247
+ isCollapsible
248
+ />,
249
+ );
250
+ const header = screen
251
+ .getAllByRole('button')
252
+ .find(el => el.hasAttribute('aria-expanded'))!;
253
+ const region = document.getElementById(
254
+ header.getAttribute('aria-controls') as string,
255
+ )!;
256
+ // Collapse, then expand again.
257
+ fireEvent.click(header);
258
+ expect(region).toHaveAttribute('inert');
259
+ fireEvent.click(header);
260
+ expect(header).toHaveAttribute('aria-expanded', 'true');
261
+ // Expanded again: inert is removed and the scroll container is a
262
+ // keyboard-focusable group once more.
263
+ expect(region).not.toHaveAttribute('inert');
264
+ const scrollContainer = screen.getByRole('group');
265
+ expect(scrollContainer.closest('[inert]')).toBeNull();
266
+ expect(scrollContainer).toHaveAttribute('tabindex', '0');
267
+ });
268
+
213
269
  it('applies a per-instance syntax theme via the syntaxTheme prop', () => {
214
270
  const {container} = render(
215
271
  <CodeBlock
@@ -88,6 +88,23 @@ const dynamicStyles = stylex.create({
88
88
  }),
89
89
  });
90
90
 
91
+ // Light reveal so the leading chevron eases into view instead of popping in.
92
+ // Growing the chevron's own footprint (width + inline margin) from zero slides
93
+ // the title into place instead of snapping it over, and clipping keeps the
94
+ // glyph from spilling while it's mid-reveal.
95
+ const chevronReveal = stylex.keyframes({
96
+ from: {
97
+ width: 0,
98
+ marginInlineEnd: 0,
99
+ opacity: 0,
100
+ },
101
+ to: {
102
+ width: '14px',
103
+ marginInlineEnd: spacingVars['--spacing-1'],
104
+ opacity: 1,
105
+ },
106
+ });
107
+
91
108
  const styles = stylex.create({
92
109
  root: {
93
110
  position: 'relative',
@@ -133,7 +150,6 @@ const styles = stylex.create({
133
150
  headerTitle: {
134
151
  display: 'flex',
135
152
  alignItems: 'center',
136
- gap: spacingVars['--spacing-1'],
137
153
  fontSize: typeScaleVars['--text-supporting-size'],
138
154
  fontFamily: typographyVars['--font-family-code'],
139
155
  fontWeight: fontWeightVars['--font-weight-medium'],
@@ -173,13 +189,24 @@ const styles = stylex.create({
173
189
  flexShrink: 0,
174
190
  width: '14px',
175
191
  height: '14px',
192
+ marginInlineEnd: spacingVars['--spacing-1'],
193
+ overflow: 'hidden',
176
194
  color: 'var(--color-syntax-comment)',
195
+ animationName: {
196
+ default: chevronReveal,
197
+ '@media (prefers-reduced-motion: reduce)': 'none',
198
+ },
199
+ animationDuration: durationVars['--duration-medium'],
200
+ animationTimingFunction: easeVars['--ease-standard'],
177
201
  transitionProperty: 'transform',
178
202
  transitionDuration: durationVars['--duration-fast'],
179
203
  transitionTimingFunction: easeVars['--ease-standard'],
180
204
  },
181
- collapseChevronCollapsed: {
182
- transform: 'rotate(180deg)',
205
+ collapseChevronExpanded: {
206
+ // Leading disclosure convention (matches TreeList/Table): the resting
207
+ // chevronRight points right (>) when collapsed; rotate it down (v) when
208
+ // expanded.
209
+ transform: 'rotate(90deg)',
183
210
  },
184
211
  headerCollapsible: {
185
212
  cursor: 'pointer',
@@ -296,7 +323,7 @@ const styles = stylex.create({
296
323
  copyButtonAbsolute: {
297
324
  position: 'absolute',
298
325
  top: spacingVars['--spacing-2'],
299
- right: spacingVars['--spacing-2'],
326
+ insetInlineEnd: spacingVars['--spacing-2'],
300
327
  },
301
328
  });
302
329
 
@@ -807,7 +834,9 @@ export function CodeBlock({
807
834
  e.stopPropagation();
808
835
  void handleCopy();
809
836
  }}
810
- aria-label={copied ? t('@astryx.codeBlock.copied') : t('@astryx.codeBlock.copyCode')}
837
+ aria-label={
838
+ copied ? t('@astryx.codeBlock.copied') : t('@astryx.codeBlock.copyCode')
839
+ }
811
840
  {...stylex.props(
812
841
  styles.copyButton,
813
842
  !showHeader && styles.copyButtonAbsolute,
@@ -843,18 +872,18 @@ export function CodeBlock({
843
872
  canCollapse && styles.headerCollapsible,
844
873
  )}>
845
874
  <span {...stylex.props(styles.headerTitle)}>
846
- {title}
847
- {title && languageLabel ? ' — ' : ''}
848
- {languageLabel}
849
875
  {canCollapse && (
850
876
  <span
851
877
  {...stylex.props(
852
878
  styles.collapseChevron,
853
- isCollapsed && styles.collapseChevronCollapsed,
879
+ !isCollapsed && styles.collapseChevronExpanded,
854
880
  )}>
855
- <Icon icon="chevronDown" size="xsm" color="inherit" />
881
+ <Icon icon="chevronRight" size="xsm" color="inherit" />
856
882
  </span>
857
883
  )}
884
+ {title}
885
+ {title && languageLabel ? ' — ' : ''}
886
+ {languageLabel}
858
887
  </span>
859
888
  </div>
860
889
  {copyButtonEl}
@@ -923,6 +952,12 @@ export function CodeBlock({
923
952
  {canCollapse ? (
924
953
  <div
925
954
  id={regionId}
955
+ // While collapsed, the region is only hidden visually (0fr grid
956
+ // row); inert also removes it from the tab order and accessibility
957
+ // tree so keyboard users cannot Tab into the invisible scroll
958
+ // container (tabIndex=0). aria-controls pointing at an inert
959
+ // element remains a valid, resolvable reference.
960
+ inert={isCollapsed ? true : undefined}
926
961
  {...stylex.props(
927
962
  styles.collapseGrid,
928
963
  isCollapsed && styles.collapseGridCollapsed,
@@ -17,6 +17,7 @@ export const docs = {
17
17
  theming: {
18
18
  targets: [
19
19
  {className: 'astryx-collapsible', visualProps: ['density']},
20
+ {className: 'astryx-collapsible-trigger', visualProps: ['density']},
20
21
  {className: 'astryx-collapsible-content', visualProps: ['density']},
21
22
  {className: 'astryx-collapsible-group', visualProps: ['density']},
22
23
  ],
@@ -72,6 +72,13 @@ describe('Collapsible', () => {
72
72
  expect(screen.getByTestId('root')).toHaveClass('astryx-collapsible');
73
73
  });
74
74
 
75
+ it('renders the stable astryx-collapsible-trigger class on the trigger button', () => {
76
+ render(<Collapsible trigger="T">c</Collapsible>);
77
+ expect(screen.getByRole('button')).toHaveClass(
78
+ 'astryx-collapsible-trigger',
79
+ );
80
+ });
81
+
75
82
  it('renders the stable astryx-collapsible-content class on the content area', () => {
76
83
  render(<Collapsible trigger="T">c</Collapsible>);
77
84
  const content = contentFor(screen.getByRole('button'));
@@ -51,7 +51,12 @@ const styles = stylex.create({
51
51
  root: {
52
52
  width: '100%',
53
53
  },
54
- // Trigger button — full width, flex row, no browser button styling
54
+ // Trigger button — full width, flex row, no browser button styling.
55
+ // Anchors heading-adjacent typography (body family, large size, semibold)
56
+ // so the label reads as a section header regardless of where the
57
+ // Collapsible is placed. External themes retarget it independently from the
58
+ // content via the `astryx-collapsible-trigger` target — e.g. a heading font
59
+ // on the trigger while the content stays on the body font.
55
60
  trigger: {
56
61
  all: 'unset',
57
62
  boxSizing: 'border-box',
@@ -113,7 +118,7 @@ const styles = stylex.create({
113
118
  // Anchors body typography so revealed text renders at the system's body
114
119
  // scale (family/size/weight/leading) instead of inheriting from wherever
115
120
  // the Collapsible is placed. External themes override via the
116
- // `astryx-collapsible-content` target.
121
+ // `astryx-collapsible-content` target, independently from the trigger.
117
122
  content: {
118
123
  paddingBlockStart: spacingVars['--spacing-1'],
119
124
  fontFamily: typographyVars['--font-family-body'],
@@ -318,10 +323,15 @@ export function Collapsible({
318
323
  // the system-wide disabled convention (never native `disabled`, which
319
324
  // would swallow events like a wrapping tooltip's hover).
320
325
  tabIndex={isDisabled ? -1 : undefined}
321
- {...stylex.props(
322
- styles.trigger,
323
- density != null && triggerDensity[density],
324
- isDisabled && styles.triggerDisabled,
326
+ {...mergeProps(
327
+ themeProps('collapsible-trigger', {
328
+ density: density ?? undefined,
329
+ }),
330
+ stylex.props(
331
+ styles.trigger,
332
+ density != null && triggerDensity[density],
333
+ isDisabled && styles.triggerDisabled,
334
+ ),
325
335
  )}>
326
336
  <span {...stylex.props(styles.triggerLabel)}>{trigger}</span>
327
337
  <span
@@ -145,6 +145,7 @@ export const docs = {
145
145
  {className: 'astryx-command-palette-empty'},
146
146
  {className: 'astryx-command-palette-footer'},
147
147
  {className: 'astryx-command-palette-group'},
148
+ {className: 'astryx-command-palette-group-heading'},
148
149
  {className: 'astryx-command-palette-input'},
149
150
  {className: 'astryx-command-palette-item'},
150
151
  {className: 'astryx-command-palette-list'},
@@ -8,10 +8,11 @@
8
8
  */
9
9
 
10
10
  import {describe, it, expect, vi, beforeEach} from 'vitest';
11
- import {render, screen, waitFor, fireEvent} from '@testing-library/react';
11
+ import {render, screen, waitFor, fireEvent, act} from '@testing-library/react';
12
12
  import {CommandPalette} from './CommandPalette';
13
13
  import {createStaticSource} from '@astryxdesign/core/Typeahead';
14
14
  import type {SearchSource, SearchableItem} from '@astryxdesign/core/Typeahead';
15
+ import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
15
16
 
16
17
  const simpleSource = createStaticSource([
17
18
  {id: 'home', label: 'Home'},
@@ -35,6 +36,9 @@ beforeEach(() => {
35
36
  HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
36
37
  this.removeAttribute('open');
37
38
  });
39
+ // The live regions are module-level singletons; reset them so
40
+ // announcements from one test don't leak into the next.
41
+ __resetLiveRegionsForTest();
38
42
  });
39
43
 
40
44
  describe('CommandPalette', () => {
@@ -269,4 +273,94 @@ describe('CommandPalette', () => {
269
273
  expect(screen.getByText('No results')).toBeInTheDocument(),
270
274
  );
271
275
  });
276
+
277
+ describe('screen reader announcements', () => {
278
+ const politeRegion = () =>
279
+ document.querySelector('[data-astryx-live-region="polite"]');
280
+
281
+ it('announces the result count politely after typing a query', async () => {
282
+ render(
283
+ <CommandPalette
284
+ isOpen={true}
285
+ onOpenChange={() => {}}
286
+ searchSource={simpleSource}
287
+ />,
288
+ );
289
+ await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
290
+ // "e" matches both Home and Settings.
291
+ fireEvent.change(screen.getByRole('combobox'), {target: {value: 'e'}});
292
+ await waitFor(() => {
293
+ expect(politeRegion()).toHaveTextContent('2 results');
294
+ });
295
+ });
296
+
297
+ it('announces the singular form when one item matches', async () => {
298
+ render(
299
+ <CommandPalette
300
+ isOpen={true}
301
+ onOpenChange={() => {}}
302
+ searchSource={simpleSource}
303
+ />,
304
+ );
305
+ await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
306
+ // "set" matches only Settings. Anchored so it cannot pass on "1 results".
307
+ fireEvent.change(screen.getByRole('combobox'), {target: {value: 'set'}});
308
+ await waitFor(() => {
309
+ expect(politeRegion()).toHaveTextContent(/^1 result$/);
310
+ });
311
+ });
312
+
313
+ it('announces the empty state with the query when nothing matches', async () => {
314
+ render(
315
+ <CommandPalette
316
+ isOpen={true}
317
+ onOpenChange={() => {}}
318
+ searchSource={simpleSource}
319
+ />,
320
+ );
321
+ await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
322
+ fireEvent.change(screen.getByRole('combobox'), {target: {value: 'zzz'}});
323
+ await waitFor(() => {
324
+ expect(politeRegion()).toHaveTextContent('No results for zzz');
325
+ });
326
+ });
327
+
328
+ it('announces loading politely while a search is in flight', async () => {
329
+ // A source whose searches never resolve, so the palette stays busy and
330
+ // only the loading announcement can reach the live region.
331
+ const source: SearchSource = {
332
+ bootstrap: () => [],
333
+ async search(): Promise<SearchableItem[]> {
334
+ return new Promise<SearchableItem[]>(() => {});
335
+ },
336
+ };
337
+ render(
338
+ <CommandPalette
339
+ isOpen={true}
340
+ onOpenChange={() => {}}
341
+ searchSource={source}
342
+ />,
343
+ );
344
+ fireEvent.change(screen.getByRole('combobox'), {target: {value: 'z'}});
345
+ await waitFor(() => {
346
+ expect(politeRegion()).toHaveTextContent('Loading');
347
+ });
348
+ });
349
+
350
+ it('does not announce on initial open (bootstrap)', async () => {
351
+ render(
352
+ <CommandPalette
353
+ isOpen={true}
354
+ onOpenChange={() => {}}
355
+ searchSource={simpleSource}
356
+ />,
357
+ );
358
+ await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
359
+ // Flush effects and any pending live-region rAF writes.
360
+ await act(async () => {
361
+ await new Promise(resolve => setTimeout(resolve, 50));
362
+ });
363
+ expect(politeRegion()?.textContent ?? '').toBe('');
364
+ });
365
+ });
272
366
  });