@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
@@ -45,6 +45,23 @@ afterEach(() => {
45
45
  vi.unstubAllGlobals();
46
46
  });
47
47
 
48
+ // The global test setup polyfills matchMedia with a never-matching stub;
49
+ // this override makes only the reduced-motion query match, mirroring the
50
+ // pattern in useStreamingText.test.ts. Undone by afterEach's
51
+ // unstubAllGlobals.
52
+ function stubReducedMotion() {
53
+ vi.stubGlobal('matchMedia', (query: string) => ({
54
+ matches: query.includes('prefers-reduced-motion'),
55
+ media: query,
56
+ onchange: null,
57
+ addListener: () => {},
58
+ removeListener: () => {},
59
+ addEventListener: () => {},
60
+ removeEventListener: () => {},
61
+ dispatchEvent: () => false,
62
+ }));
63
+ }
64
+
48
65
  function setGeometry(
49
66
  el: HTMLElement,
50
67
  {scrollHeight, clientHeight}: {scrollHeight: number; clientHeight: number},
@@ -166,3 +183,35 @@ describe("useChatStreamScroll — scrollToBottom({behavior: 'instant'})", () =>
166
183
  expect(rafQueue.length).toBeGreaterThan(0);
167
184
  });
168
185
  });
186
+
187
+ describe('useChatStreamScroll — prefers-reduced-motion', () => {
188
+ it('streaming growth jumps synchronously instead of springing', () => {
189
+ stubReducedMotion();
190
+ const {api, el} = renderHook();
191
+ setGeometry(el, {scrollHeight: 1000, clientHeight: 400});
192
+ flushRaf(); // consume the mount jump
193
+ expect(el.scrollTop).toBe(600);
194
+
195
+ // Post-first-fill growth would normally take the spring path; under
196
+ // reduced motion it must land in the same synchronous step.
197
+ setGeometry(el, {scrollHeight: 1400, clientHeight: 400});
198
+ rafQueue = [];
199
+ act(() => api.current!.scrollIfLocked());
200
+ expect(el.scrollTop).toBe(1000);
201
+ expect(rafQueue).toHaveLength(0);
202
+ });
203
+
204
+ it('default scrollToBottom falls back to an instant jump', () => {
205
+ stubReducedMotion();
206
+ const {api, el} = renderHook();
207
+ setGeometry(el, {scrollHeight: 1000, clientHeight: 400});
208
+ flushRaf();
209
+ el.scrollTop = 100; // user scrolled up
210
+
211
+ rafQueue = [];
212
+ act(() => api.current!.scrollToBottom());
213
+ expect(el.scrollTop).toBe(600);
214
+ expect(rafQueue).toHaveLength(0);
215
+ expect(api.current!.isLocked).toBe(true);
216
+ });
217
+ });
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file useChatStreamScroll.ts
7
- * @input Uses React refs, state, callbacks
7
+ * @input Uses React refs, state, callbacks, useMediaQuery
8
8
  * @output Exports useChatStreamScroll hook for AI chat scroll behavior
9
9
  * @position Utility hook — used by ChatLayout, also usable standalone
10
10
  *
@@ -15,6 +15,8 @@
15
15
  * - The first fill positions instantly (whether content is present at
16
16
  * mount or arrives async); only subsequent growth springs
17
17
  * - `scrollToBottom({behavior: 'instant'})` jumps in one frame, no animation
18
+ * - Under `prefers-reduced-motion`, every spring path falls back to the
19
+ * same instant jump — following still works, it just doesn't animate
18
20
  *
19
21
  * Uses scroll direction (lastScrollTop comparison) to detect user
20
22
  * intent — works for wheel, touch, scrollbar drag, keyboard, everything.
@@ -26,6 +28,7 @@
26
28
  */
27
29
 
28
30
  import {useCallback, useEffect, useRef, useState} from 'react';
31
+ import {useMediaQuery} from '../hooks/useMediaQuery';
29
32
 
30
33
  // =============================================================================
31
34
  // Types
@@ -37,7 +40,8 @@ export interface ChatScrollToBottomOptions {
37
40
  * the spring animation. Use for programmatic positioning (opening a
38
41
  * conversation, restoring a session) — keep the default `'spring'` for
39
42
  * user-initiated scrolls like the scroll-to-bottom button. Mirrors the
40
- * DOM's `scrollTo({behavior})`.
43
+ * DOM's `scrollTo({behavior})`. When the user prefers reduced motion,
44
+ * `'spring'` also jumps instantly.
41
45
  * @default 'spring'
42
46
  */
43
47
  behavior?: 'instant' | 'spring';
@@ -189,14 +193,6 @@ export function useChatStreamScroll({
189
193
  requestAnimationFrame(animate);
190
194
  }, [scrollRef, damping, stiffness, mass]);
191
195
 
192
- const startAnimation = useCallback(() => {
193
- if (!animatingRef.current && lockedRef.current) {
194
- animatingRef.current = true;
195
- lastTickRef.current = undefined;
196
- requestAnimationFrame(animate);
197
- }
198
- }, [animate]);
199
-
200
196
  // Jump to the bottom in a single frame — cancels any in-flight spring so
201
197
  // a later animation tick can't fight the assignment.
202
198
  const jumpToBottom = useCallback(() => {
@@ -211,6 +207,27 @@ export function useChatStreamScroll({
211
207
  lastScrollTopRef.current = el.scrollTop;
212
208
  }, [scrollRef]);
213
209
 
210
+ const prefersReducedMotion = useMediaQuery(
211
+ '(prefers-reduced-motion: reduce)',
212
+ );
213
+
214
+ // Every spring entry point (scrollToBottom, lock, scrollIfLocked growth
215
+ // follow) funnels through here, so this one branch covers them all.
216
+ const startAnimation = useCallback(() => {
217
+ if (!lockedRef.current) {
218
+ return;
219
+ }
220
+ if (prefersReducedMotion) {
221
+ jumpToBottom();
222
+ return;
223
+ }
224
+ if (!animatingRef.current) {
225
+ animatingRef.current = true;
226
+ lastTickRef.current = undefined;
227
+ requestAnimationFrame(animate);
228
+ }
229
+ }, [animate, jumpToBottom, prefersReducedMotion]);
230
+
214
231
  // --- Public API ---
215
232
 
216
233
  const scrollToBottom = useCallback(
@@ -242,7 +242,7 @@ async function createVolumeAnalyser(
242
242
 
243
243
  let _sharedAudioCtx: AudioContext | null = null;
244
244
 
245
- export function getDefaultAudioContext(): AudioContext {
245
+ function getDefaultAudioContext(): AudioContext {
246
246
  if (!_sharedAudioCtx || _sharedAudioCtx.state === 'closed') {
247
247
  _sharedAudioCtx = new AudioContext();
248
248
  }
@@ -125,7 +125,7 @@ const styles = stylex.create({
125
125
  outline: 'none',
126
126
  backgroundColor: 'transparent',
127
127
  border: 'none',
128
- textAlign: 'left' as const,
128
+ textAlign: 'start' as const,
129
129
  fontFamily: typographyVars['--font-family-body'],
130
130
  fontSize: typeScaleVars['--text-body-size'],
131
131
  lineHeight: typeScaleVars['--text-body-leading'],
@@ -699,7 +699,9 @@ export function useTriggerMenu(
699
699
  <div
700
700
  id={listboxId}
701
701
  role="listbox"
702
- aria-label={trigger?.menuLabel ?? t('@astryx.chatTriggerMenu.suggestions')}
702
+ aria-label={
703
+ trigger?.menuLabel ?? t('@astryx.chatTriggerMenu.suggestions')
704
+ }
703
705
  {...mergeProps(
704
706
  themeProps('trigger-menu'),
705
707
  stylex.props(styles.dropdown),
@@ -121,6 +121,12 @@ export const docs = {
121
121
  description:
122
122
  'Status indicator. Displays a colored message box below the checkbox and sets aria-invalid for errors.',
123
123
  },
124
+ {
125
+ name: 'width',
126
+ type: 'SizeValue',
127
+ description:
128
+ 'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
129
+ },
124
130
  ],
125
131
  theming: {
126
132
  targets: [
@@ -9,10 +9,15 @@
9
9
  * SYNC: When CheckboxInput.tsx changes, update tests to match new behavior
10
10
  */
11
11
 
12
- import {describe, it, expect, vi, beforeEach} from 'vitest';
12
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
13
13
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {CheckboxInput} from './CheckboxInput';
16
+ import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
17
+
18
+ afterEach(() => {
19
+ __resetLiveRegionsForTest();
20
+ });
16
21
 
17
22
  // Mock showPopover/hidePopover (not implemented in jsdom) so the tooltip layer
18
23
  // reflects its open state via a `popover-open` attribute the tests can assert.
@@ -333,6 +338,32 @@ describe('CheckboxInput', () => {
333
338
  );
334
339
  });
335
340
 
341
+ // Regression: the status is conditionally mounted, so it must be announced
342
+ // through the persistent useAnnounce live region — a live region born
343
+ // together with its content is not reliably announced.
344
+ it('announces a status message that appears after mount', async () => {
345
+ const {rerender} = render(
346
+ <CheckboxInput label="Accept terms" value={false} onChange={() => {}} />,
347
+ );
348
+ expect(
349
+ document.querySelector('[data-astryx-live-region="assertive"]'),
350
+ ).toBeNull();
351
+
352
+ rerender(
353
+ <CheckboxInput
354
+ label="Accept terms"
355
+ value={false}
356
+ onChange={() => {}}
357
+ status={{type: 'error', message: 'Required field'}}
358
+ />,
359
+ );
360
+ await waitFor(() => {
361
+ expect(
362
+ document.querySelector('[data-astryx-live-region="assertive"]'),
363
+ ).toHaveTextContent('Required field');
364
+ });
365
+ });
366
+
336
367
  describe('disabledMessage', () => {
337
368
  const h = {hidden: true} as const;
338
369
 
@@ -166,7 +166,7 @@ const styles = stylex.create({
166
166
  indeterminateMark: {
167
167
  display: 'none',
168
168
  backgroundColor: colorVars['--color-on-accent'],
169
- borderRadius: 1,
169
+ borderRadius: radiusVars['--radius-full'],
170
170
  },
171
171
  indeterminateMarkVisible: {
172
172
  display: 'block',
@@ -198,12 +198,12 @@ const wrapperSizeStyles = stylex.create({
198
198
 
199
199
  const checkboxSizeStyles = stylex.create({
200
200
  sm: {
201
- width: 18,
202
- height: 18,
201
+ width: 20,
202
+ height: 20,
203
203
  },
204
204
  md: {
205
- width: 22,
206
- height: 22,
205
+ width: 24,
206
+ height: 24,
207
207
  },
208
208
  });
209
209
 
@@ -88,6 +88,12 @@ export const docs = {
88
88
  type: "{type: 'warning' | 'error' | 'success', message?: string}",
89
89
  description: 'Status indicator ({ type, message }).',
90
90
  },
91
+ {
92
+ name: 'width',
93
+ type: 'SizeValue',
94
+ description:
95
+ 'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
96
+ },
91
97
  {
92
98
  name: 'xstyle',
93
99
  type: 'StyleXStyles',
@@ -9,7 +9,7 @@
9
9
  * SYNC: When CheckboxList.tsx or CheckboxListItem.tsx changes, update tests to match new behavior
10
10
  */
11
11
 
12
- import {describe, it, expect, vi, beforeEach} from 'vitest';
12
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
13
13
  import {
14
14
  render,
15
15
  screen,
@@ -20,8 +20,16 @@ import {
20
20
  import userEvent from '@testing-library/user-event';
21
21
  import {CheckboxList} from './CheckboxList';
22
22
  import {CheckboxListItem} from './CheckboxListItem';
23
+ import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
23
24
  import {List} from '../List/List';
24
25
 
26
+ // FieldStatus announces status messages through the persistent useAnnounce
27
+ // singletons; remove them between tests so role/aria-live queries in this
28
+ // file never match a leftover region.
29
+ afterEach(() => {
30
+ __resetLiveRegionsForTest();
31
+ });
32
+
25
33
  // Mock showPopover/hidePopover (not implemented in jsdom) so the tooltip layer
26
34
  // reflects its open state via a `popover-open` attribute the tests can assert.
27
35
  beforeEach(() => {
@@ -437,6 +445,71 @@ describe('CheckboxListItem standalone mode', () => {
437
445
  });
438
446
  });
439
447
 
448
+ describe('CheckboxListItem accessible name', () => {
449
+ it('names the checkbox from a string label', () => {
450
+ render(
451
+ <CheckboxList label="Preferences" value={[]} onChange={() => {}}>
452
+ <CheckboxListItem label="Option A" value="a" />
453
+ </CheckboxList>,
454
+ );
455
+ expect(
456
+ screen.getByRole('checkbox', {name: 'Option A'}),
457
+ ).toBeInTheDocument();
458
+ });
459
+
460
+ it('names the checkbox from aria-label when the label is a ReactNode', () => {
461
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
462
+ render(
463
+ <CheckboxList label="Plans" value={[]} onChange={() => {}}>
464
+ <CheckboxListItem
465
+ label={
466
+ <span>
467
+ Pro plan <em>(recommended)</em>
468
+ </span>
469
+ }
470
+ aria-label="Pro plan"
471
+ value="pro"
472
+ />
473
+ </CheckboxList>,
474
+ );
475
+ expect(
476
+ screen.getByRole('checkbox', {name: 'Pro plan'}),
477
+ ).toBeInTheDocument();
478
+ // A named checkbox needs no dev guidance.
479
+ expect(warnSpy).not.toHaveBeenCalled();
480
+ warnSpy.mockRestore();
481
+ });
482
+
483
+ it('warns once when a ReactNode label has no aria-label', () => {
484
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
485
+ const richLabel = (
486
+ <span>
487
+ Pro plan <em>(recommended)</em>
488
+ </span>
489
+ );
490
+ const {rerender} = render(
491
+ <CheckboxList label="Plans" value={[]} onChange={() => {}}>
492
+ <CheckboxListItem label={richLabel} value="pro" />
493
+ </CheckboxList>,
494
+ );
495
+ // Falls back to the generic name, and tells the developer how to fix it.
496
+ expect(
497
+ screen.getByRole('checkbox', {name: 'Checkbox'}),
498
+ ).toBeInTheDocument();
499
+ expect(warnSpy).toHaveBeenCalledTimes(1);
500
+ expect(String(warnSpy.mock.calls[0]?.[0])).toContain('aria-label');
501
+
502
+ // Warn once per item instance — re-renders don't repeat it.
503
+ rerender(
504
+ <CheckboxList label="Plans" value={['pro']} onChange={() => {}}>
505
+ <CheckboxListItem label={richLabel} value="pro" />
506
+ </CheckboxList>,
507
+ );
508
+ expect(warnSpy).toHaveBeenCalledTimes(1);
509
+ warnSpy.mockRestore();
510
+ });
511
+ });
512
+
440
513
  describe('CheckboxListItem ARIA props', () => {
441
514
  it('conveys checked state via the inner checkbox, not aria-checked on the listitem', () => {
442
515
  render(
@@ -567,7 +640,7 @@ describe('CheckboxListItem ARIA props', () => {
567
640
  expect(changeAction).toHaveBeenCalledWith(['a']);
568
641
  });
569
642
 
570
- it('forwards arbitrary aria attributes to the list item DOM element', () => {
643
+ it('forwards arbitrary aria attributes to the list item, but aria-label names the checkbox', () => {
571
644
  render(
572
645
  <List>
573
646
  <CheckboxListItem
@@ -578,8 +651,13 @@ describe('CheckboxListItem ARIA props', () => {
578
651
  </List>,
579
652
  );
580
653
  const item = screen.getByRole('listitem');
654
+ // Arbitrary aria-* still forward to the row...
581
655
  expect(item).toHaveAttribute('aria-describedby', 'help-text');
582
- expect(item).toHaveAttribute('aria-label', 'custom label');
656
+ // ...but aria-label names the checkbox control, not the row.
657
+ expect(item).not.toHaveAttribute('aria-label');
658
+ expect(
659
+ screen.getByRole('checkbox', {name: 'custom label'}),
660
+ ).toBeInTheDocument();
583
661
  });
584
662
 
585
663
  describe('disabledMessage', () => {
@@ -7,14 +7,22 @@ export const docs = {
7
7
  subComponentOf: 'CheckboxList',
8
8
  displayName: 'Checkbox List Item',
9
9
  isHiddenFromOverview: true,
10
- description: 'Individual checkbox item with label, description, and end content slot. Works in collection mode (inside CheckboxList) or standalone mode (inside List).',
10
+ description:
11
+ 'Individual checkbox item with label, description, and end content slot. Works in collection mode (inside CheckboxList) or standalone mode (inside List).',
11
12
  props: [
12
13
  {
13
14
  name: 'label',
14
- type: 'string',
15
- description: 'Primary text label for the item.',
15
+ type: 'ReactNode',
16
+ description:
17
+ 'Primary text label for the item. A plain string names the checkbox automatically; a rich (ReactNode) label should be paired with aria-label so screen readers get a concise name.',
16
18
  required: true,
17
19
  },
20
+ {
21
+ name: 'aria-label',
22
+ type: 'string',
23
+ description:
24
+ 'Plain-text accessible name for the checkbox when label is a ReactNode. Applied to the checkbox control. Without it, rich-label items all announce as the generic "Checkbox" to screen readers.',
25
+ },
18
26
  {
19
27
  name: 'value',
20
28
  type: 'string',
@@ -69,13 +77,24 @@ export const docs = {
69
77
  description: 'Direct check handler (standalone mode only).',
70
78
  },
71
79
  ],
80
+ examples: [
81
+ {
82
+ label: 'Rich label with an accessible name',
83
+ code: `<CheckboxListItem
84
+ label={<span>Pro plan <Badge label="Recommended" /></span>}
85
+ aria-label="Pro plan"
86
+ value="pro"
87
+ />`,
88
+ },
89
+ ],
72
90
  };
73
91
 
74
92
  export const docsZh = {
75
93
  name: 'CheckboxListItem',
76
94
  isHiddenFromOverview: true,
77
95
  displayName: 'Checkbox List Item',
78
- description: '单个复选框选项,包含标签、描述和尾部内容插槽。可在集合模式或独立模式下使用。',
96
+ description:
97
+ '单个复选框选项,包含标签、描述和尾部内容插槽。可在集合模式或独立模式下使用。',
79
98
  props: [
80
99
  {
81
100
  name: 'label',
@@ -83,6 +102,12 @@ export const docsZh = {
83
102
  description: '选项的主要文本标签。',
84
103
  required: true,
85
104
  },
105
+ {
106
+ name: 'aria-label',
107
+ type: 'string',
108
+ description:
109
+ '当 label 是 ReactNode 时,复选框的纯文本无障碍名称。缺少它时,富标签选项都会向屏幕阅读器播报为通用的 "Checkbox"。',
110
+ },
86
111
  {
87
112
  name: 'value',
88
113
  type: 'string',
@@ -128,9 +153,12 @@ export const docsDense = {
128
153
  name: 'CheckboxListItem',
129
154
  isHiddenFromOverview: true,
130
155
  displayName: 'Checkbox List Item',
131
- description: 'Individual checkbox item w/ label, description, end content slot.',
156
+ description:
157
+ 'Individual checkbox item w/ label, description, end content slot.',
132
158
  propDescriptions: {
133
159
  label: 'Primary text label for item.',
160
+ 'aria-label':
161
+ 'Plain-text checkbox name when label is a ReactNode. Without it, rich-label items all announce as "Checkbox".',
134
162
  value: 'Identity key (required inside CheckboxList).',
135
163
  description: 'Secondary text below label.',
136
164
  endContent: 'Content rendered after label area.',
@@ -22,6 +22,7 @@ import type {StyleXStyles} from '@stylexjs/stylex';
22
22
  import {colorVars} from '../theme/tokens.stylex';
23
23
  import type {BaseProps} from '../BaseProps';
24
24
  import {composeEventHandlers} from '../utils';
25
+ import {useDevWarning} from '../hooks/useDevWarning';
25
26
  import {CheckboxInput} from '../CheckboxInput/CheckboxInput';
26
27
  import {ListItem} from '../List/ListItem';
27
28
  import {ListContext} from '../List/ListContext';
@@ -51,6 +52,25 @@ export interface CheckboxListItemProps extends BaseProps<HTMLLIElement> {
51
52
  * child components control their own text behavior).
52
53
  */
53
54
  label: ReactNode;
55
+ /**
56
+ * Plain-text accessible name for the checkbox when `label` is a ReactNode.
57
+ *
58
+ * A string `label` names the checkbox automatically. A rich (ReactNode)
59
+ * `label` cannot, so pass a concise string equivalent via the standard
60
+ * `aria-label` — otherwise the checkbox falls back to the generic name
61
+ * "Checkbox" and every rich-label item in a list announces identically to
62
+ * screen readers. Applied to the checkbox control, not the row.
63
+ *
64
+ * @example
65
+ * ```
66
+ * <CheckboxListItem
67
+ * label={<span>Pro plan <Badge label="Recommended" /></span>}
68
+ * aria-label="Pro plan"
69
+ * value="pro"
70
+ * />
71
+ * ```
72
+ */
73
+ 'aria-label'?: string;
54
74
  /**
55
75
  * Identity key for collection mode (REQUIRED inside CheckboxList).
56
76
  * Throws a runtime error if missing when used inside CheckboxList.
@@ -119,6 +139,7 @@ export interface CheckboxListItemProps extends BaseProps<HTMLLIElement> {
119
139
  */
120
140
  export function CheckboxListItem({
121
141
  label,
142
+ 'aria-label': ariaLabel,
122
143
  value,
123
144
  description,
124
145
  endContent,
@@ -142,6 +163,25 @@ export function CheckboxListItem({
142
163
  );
143
164
  }
144
165
 
166
+ // Accessible name for the (visually hidden) checkbox label. A string
167
+ // `label` names it directly; a rich label needs `aria-label`.
168
+ const checkboxLabel =
169
+ ariaLabel ??
170
+ (typeof label === 'string'
171
+ ? label
172
+ : t('@astryx.checkboxList.item.checkbox'));
173
+
174
+ // Dev-time guardrail: a rich label without `aria-label` leaves the
175
+ // checkbox with the generic name "Checkbox".
176
+ useDevWarning(
177
+ 'CheckboxListItem',
178
+ '`label` is a ReactNode, so the checkbox falls ' +
179
+ 'back to the generic accessible name "Checkbox". Pass ' +
180
+ '`aria-label` with a concise string equivalent of the visible ' +
181
+ 'label so screen readers can tell items apart.',
182
+ typeof label !== 'string' && ariaLabel == null,
183
+ );
184
+
145
185
  // Density from list context for checkbox sizing
146
186
  const listCtx = use(ListContext);
147
187
  const density = listCtx?.density ?? 'balanced';
@@ -226,11 +266,7 @@ export function CheckboxListItem({
226
266
  style={style}
227
267
  startContent={
228
268
  <CheckboxInput
229
- label={
230
- typeof label === 'string'
231
- ? label
232
- : t('@astryx.checkboxList.item.checkbox')
233
- }
269
+ label={checkboxLabel}
234
270
  isLabelHidden
235
271
  value={resolvedChecked}
236
272
  onChange={() => handleToggle()}
@@ -39,7 +39,7 @@ export const docs = {
39
39
  name: 'Icon',
40
40
  required: false,
41
41
  description:
42
- 'An optional favicon or source icon displayed before the label text. Only available in the label variant.',
42
+ 'An optional source icon shown before the label text. Accepts a favicon/logo image URL (via source.src) or a React node such as an Astryx <Icon>. Only available in the label variant.',
43
43
  },
44
44
  {
45
45
  name: 'Label text',
@@ -71,7 +71,7 @@ export const docs = {
71
71
  name: 'source',
72
72
  type: 'CitationSource',
73
73
  description:
74
- 'The citation source object containing title, url, and optional icon.',
74
+ 'The citation source object containing title, url, an optional image src, and an optional icon node.',
75
75
  required: true,
76
76
  },
77
77
  {
@@ -121,7 +121,8 @@ export const docsDense = {
121
121
  ],
122
122
  },
123
123
  propDescriptions: {
124
- source: 'citation source object with title, url, optional icon.',
124
+ source:
125
+ 'citation source object with title, url, optional image src, and optional icon node.',
125
126
  number: 'display index for this citation.',
126
127
  variant: 'display style: label chip with source title or compact numbered badge.',
127
128
  },
@@ -169,4 +169,101 @@ describe('Citation', () => {
169
169
  expect(el.classList.contains(cls)).toBe(true);
170
170
  }
171
171
  });
172
+
173
+ // --- Source icon: image URL (back-compat) vs ReactNode ---------------------
174
+
175
+ it('renders a legacy string icon as a decorative image (back-compat)', () => {
176
+ // Existing callers pass a favicon URL to `source.icon`. A bare string must
177
+ // still render as <img src>, unchanged from the original behavior.
178
+ const {container} = render(
179
+ <Citation
180
+ source={{
181
+ title: 'GitHub',
182
+ url: 'https://github.com',
183
+ icon: 'https://example.com/favicon.png',
184
+ }}
185
+ number={1}
186
+ data-testid="citation"
187
+ />,
188
+ );
189
+ const img = container.querySelector('img');
190
+ expect(img).not.toBeNull();
191
+ expect(img).toHaveAttribute('src', 'https://example.com/favicon.png');
192
+ // Decorative: empty alt, and the wrapper is aria-hidden.
193
+ expect(img).toHaveAttribute('alt', '');
194
+ expect(container.querySelector('[aria-hidden="true"] img')).toBe(img);
195
+ });
196
+
197
+ it('renders source.src as a decorative image', () => {
198
+ const {container} = render(
199
+ <Citation
200
+ source={{
201
+ title: 'GitHub',
202
+ url: 'https://github.com',
203
+ src: 'https://example.com/logo.png',
204
+ }}
205
+ number={1}
206
+ data-testid="citation"
207
+ />,
208
+ );
209
+ const img = container.querySelector('img');
210
+ expect(img).toHaveAttribute('src', 'https://example.com/logo.png');
211
+ expect(img).toHaveAttribute('alt', '');
212
+ });
213
+
214
+ it('renders a ReactNode icon as-is (not an <img>)', () => {
215
+ const {container} = render(
216
+ <Citation
217
+ source={{
218
+ title: 'GitHub',
219
+ url: 'https://github.com',
220
+ icon: <svg data-testid="custom-icon" />,
221
+ }}
222
+ number={1}
223
+ data-testid="citation"
224
+ />,
225
+ );
226
+ // The node renders directly; no <img> is produced for a node icon.
227
+ expect(container.querySelector('img')).toBeNull();
228
+ expect(screen.getByTestId('custom-icon')).toBeInTheDocument();
229
+ // Still decorative — wrapped in an aria-hidden container.
230
+ expect(
231
+ container.querySelector(
232
+ '[aria-hidden="true"] [data-testid="custom-icon"]',
233
+ ),
234
+ ).not.toBeNull();
235
+ });
236
+
237
+ it('prefers a node icon over src when both are provided', () => {
238
+ const {container} = render(
239
+ <Citation
240
+ source={{
241
+ title: 'GitHub',
242
+ url: 'https://github.com',
243
+ src: 'https://example.com/logo.png',
244
+ icon: <svg data-testid="custom-icon" />,
245
+ }}
246
+ number={1}
247
+ data-testid="citation"
248
+ />,
249
+ );
250
+ expect(screen.getByTestId('custom-icon')).toBeInTheDocument();
251
+ expect(container.querySelector('img')).toBeNull();
252
+ });
253
+
254
+ it('keeps aria-label as the sole accessible name when an icon is present', () => {
255
+ render(
256
+ <Citation
257
+ source={{
258
+ title: 'GitHub',
259
+ url: 'https://github.com',
260
+ icon: 'https://example.com/favicon.png',
261
+ }}
262
+ number={2}
263
+ data-testid="citation"
264
+ />,
265
+ );
266
+ const el = screen.getByTestId('citation');
267
+ expect(el).toHaveAttribute('aria-label', 'Citation 2: GitHub');
268
+ });
172
269
  });