@astryxdesign/core 0.1.8 → 0.1.9-canary.1887ee2

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 (610) 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 +53 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +203 -49
  9. package/dist/Avatar/AvatarStatusDot.d.ts +33 -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 +208 -6
  23. package/dist/Breadcrumbs/index.d.ts +5 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +9 -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 +30 -2
  34. package/dist/Calendar/dayCellUtils.js +1 -1
  35. package/dist/Card/Card.d.ts +8 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +28 -2
  38. package/dist/Carousel/Carousel.d.ts +4 -1
  39. package/dist/Carousel/Carousel.d.ts.map +1 -1
  40. package/dist/Carousel/Carousel.js +24 -4
  41. package/dist/Chat/ChatComposer.d.ts +8 -0
  42. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  43. package/dist/Chat/ChatComposer.js +46 -7
  44. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  45. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  46. package/dist/Chat/ChatComposerDrawer.js +11 -1
  47. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  48. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  49. package/dist/Chat/ChatComposerInput.js +36 -4
  50. package/dist/Chat/ChatContext.d.ts +33 -0
  51. package/dist/Chat/ChatContext.d.ts.map +1 -1
  52. package/dist/Chat/ChatContext.js +16 -2
  53. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  54. package/dist/Chat/ChatDictationButton.js +1 -1
  55. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  56. package/dist/Chat/ChatLayout.js +4 -4
  57. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  59. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  60. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  61. package/dist/Chat/ChatSendButton.js +7 -1
  62. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +18 -9
  65. package/dist/Chat/index.d.ts +2 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/index.js +1 -1
  68. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  69. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  70. package/dist/Chat/useChatStreamScroll.js +22 -8
  71. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  72. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  73. package/dist/Chat/useSpeechRecognition.js +1 -1
  74. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  75. package/dist/Chat/useTriggerMenu.js +2 -2
  76. package/dist/CheckboxInput/CheckboxInput.js +1 -1
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  80. package/dist/Citation/Citation.d.ts +22 -1
  81. package/dist/Citation/Citation.d.ts.map +1 -1
  82. package/dist/Citation/Citation.js +20 -6
  83. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  84. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  85. package/dist/ClickableCard/ClickableCard.js +5 -2
  86. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  87. package/dist/CodeBlock/CodeBlock.js +9 -2
  88. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  89. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  90. package/dist/CommandPalette/CommandPalette.js +3 -1
  91. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  92. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  93. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  94. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  95. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  96. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  97. package/dist/DateInput/DateInput.d.ts +55 -2
  98. package/dist/DateInput/DateInput.d.ts.map +1 -1
  99. package/dist/DateInput/DateInput.js +28 -2
  100. package/dist/DateInput/index.d.ts +1 -1
  101. package/dist/DateInput/index.d.ts.map +1 -1
  102. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  103. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  104. package/dist/DateRangeInput/DateRangeInput.js +3 -1
  105. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  106. package/dist/DateTimeInput/DateTimeInput.js +18 -3
  107. package/dist/Dialog/Dialog.d.ts +3 -0
  108. package/dist/Dialog/Dialog.d.ts.map +1 -1
  109. package/dist/Dialog/Dialog.js +57 -6
  110. package/dist/Dialog/DialogContext.d.ts +7 -0
  111. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  112. package/dist/Dialog/DialogContext.js +2 -2
  113. package/dist/Dialog/DialogHeader.d.ts +5 -2
  114. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  115. package/dist/Dialog/DialogHeader.js +6 -1
  116. package/dist/Divider/Divider.js +1 -1
  117. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  118. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  119. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
  120. package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
  121. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  122. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  123. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  124. package/dist/Field/Field.d.ts.map +1 -1
  125. package/dist/Field/Field.js +2 -3
  126. package/dist/Field/FieldLabel.d.ts +1 -1
  127. package/dist/Field/FieldLabel.d.ts.map +1 -1
  128. package/dist/Field/FieldLabel.js +43 -16
  129. package/dist/FieldStatus/FieldStatus.d.ts +15 -0
  130. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  131. package/dist/FieldStatus/FieldStatus.js +58 -6
  132. package/dist/FileInput/FileInput.d.ts +9 -2
  133. package/dist/FileInput/FileInput.d.ts.map +1 -1
  134. package/dist/FileInput/FileInput.js +42 -20
  135. package/dist/HoverCard/HoverCard.d.ts +9 -1
  136. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  137. package/dist/HoverCard/HoverCard.js +2 -0
  138. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  139. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  140. package/dist/HoverCard/useHoverCard.js +7 -2
  141. package/dist/Icon/Icon.d.ts +7 -2
  142. package/dist/Icon/Icon.d.ts.map +1 -1
  143. package/dist/Item/Item.d.ts +6 -1
  144. package/dist/Item/Item.d.ts.map +1 -1
  145. package/dist/Item/Item.js +22 -1
  146. package/dist/Layer/useLayer.d.ts +6 -0
  147. package/dist/Layer/useLayer.d.ts.map +1 -1
  148. package/dist/Layer/useLayer.js +2 -0
  149. package/dist/Lightbox/Lightbox.js +4 -4
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +6 -1
  152. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  153. package/dist/MobileNav/MobileNavToggle.js +4 -0
  154. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  155. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  156. package/dist/MultiSelector/MultiSelector.js +41 -12
  157. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  158. package/dist/MultiSelector/hooks.js +16 -0
  159. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  160. package/dist/NumberInput/NumberInput.d.ts +9 -2
  161. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  162. package/dist/NumberInput/NumberInput.js +8 -1
  163. package/dist/Outline/Outline.d.ts +0 -1
  164. package/dist/Outline/Outline.d.ts.map +1 -1
  165. package/dist/Outline/Outline.js +0 -1
  166. package/dist/OverflowList/OverflowList.d.ts +20 -3
  167. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  168. package/dist/OverflowList/OverflowList.js +29 -4
  169. package/dist/Pagination/Pagination.d.ts.map +1 -1
  170. package/dist/Pagination/Pagination.js +11 -3
  171. package/dist/Popover/Popover.d.ts.map +1 -1
  172. package/dist/Popover/Popover.js +3 -2
  173. package/dist/Popover/usePopover.d.ts.map +1 -1
  174. package/dist/Popover/usePopover.js +3 -9
  175. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  176. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  177. package/dist/PowerSearch/PowerSearch.js +2 -0
  178. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  179. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  180. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  181. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  182. package/dist/SelectableCard/SelectableCard.js +16 -13
  183. package/dist/Selector/Selector.d.ts +8 -0
  184. package/dist/Selector/Selector.d.ts.map +1 -1
  185. package/dist/Selector/Selector.js +7 -3
  186. package/dist/Selector/hooks.d.ts.map +1 -1
  187. package/dist/Selector/hooks.js +16 -0
  188. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  189. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  190. package/dist/SideNav/SideNavHeading.js +21 -8
  191. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +19 -2
  194. package/dist/Stack/stack.stylex.d.ts +9 -9
  195. package/dist/TabList/Tab.js +2 -2
  196. package/dist/TabList/TabMenu.js +1 -1
  197. package/dist/Table/BaseTable.d.ts.map +1 -1
  198. package/dist/Table/BaseTable.js +3 -2
  199. package/dist/Table/TableCell.js +3 -3
  200. package/dist/Table/TableHeaderCell.js +3 -3
  201. package/dist/Table/index.d.ts +2 -0
  202. package/dist/Table/index.d.ts.map +1 -1
  203. package/dist/Table/index.js +1 -0
  204. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  205. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  206. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  207. package/dist/Table/plugins/rowStatus/index.js +3 -0
  208. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  209. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  210. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  211. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +4 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  215. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  216. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  217. package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
  218. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  219. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  220. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  221. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  222. package/dist/Table/useBaseTablePlugins.js +5 -3
  223. package/dist/TextArea/TextArea.d.ts +9 -1
  224. package/dist/TextArea/TextArea.d.ts.map +1 -1
  225. package/dist/TextArea/TextArea.js +2 -0
  226. package/dist/TextInput/TextInput.d.ts +9 -2
  227. package/dist/TextInput/TextInput.d.ts.map +1 -1
  228. package/dist/TextInput/TextInput.js +6 -1
  229. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  230. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  231. package/dist/Thumbnail/Thumbnail.js +97 -54
  232. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  233. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  234. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  235. package/dist/TimeInput/TimeInput.d.ts +9 -2
  236. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  237. package/dist/TimeInput/TimeInput.js +17 -4
  238. package/dist/Timestamp/Timestamp.d.ts +3 -1
  239. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  240. package/dist/Timestamp/Timestamp.js +8 -6
  241. package/dist/Toast/useToast.d.ts.map +1 -1
  242. package/dist/Toast/useToast.js +2 -5
  243. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  244. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  245. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  246. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  247. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  248. package/dist/Tokenizer/Tokenizer.js +18 -4
  249. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  250. package/dist/TopNav/TopNavHeading.js +18 -8
  251. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  252. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  253. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  255. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +68 -6
  258. package/dist/TreeList/TreeList.d.ts +12 -3
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +2 -0
  261. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  262. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  263. package/dist/TreeList/TreeListBranches.js +10 -4
  264. package/dist/TreeList/TreeListItem.d.ts +8 -2
  265. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  266. package/dist/TreeList/TreeListItem.js +28 -8
  267. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  268. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  269. package/dist/TreeList/index.d.ts +2 -2
  270. package/dist/TreeList/index.d.ts.map +1 -1
  271. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  272. package/dist/Typeahead/BaseTypeahead.js +20 -11
  273. package/dist/Typeahead/Typeahead.d.ts +9 -2
  274. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  275. package/dist/Typeahead/Typeahead.js +2 -0
  276. package/dist/astryx.css +41 -31
  277. package/dist/astryx.umd.js +51 -51
  278. package/dist/astryx.umd.js.map +4 -4
  279. package/dist/authoring/doc.d.ts.map +1 -1
  280. package/dist/docs-types.d.ts +8 -0
  281. package/dist/docs-types.d.ts.map +1 -1
  282. package/dist/hooks/computeOverflow.d.ts +47 -0
  283. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  284. package/dist/hooks/computeOverflow.js +213 -0
  285. package/dist/hooks/index.d.ts +1 -0
  286. package/dist/hooks/index.d.ts.map +1 -1
  287. package/dist/hooks/index.js +2 -1
  288. package/dist/hooks/isRtlElement.d.ts +18 -0
  289. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  290. package/dist/hooks/isRtlElement.js +27 -0
  291. package/dist/hooks/useDevWarning.d.ts +18 -0
  292. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  293. package/dist/hooks/useDevWarning.js +49 -0
  294. package/dist/hooks/useGridFocus.d.ts +6 -1
  295. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  296. package/dist/hooks/useGridFocus.js +12 -9
  297. package/dist/hooks/useListFocus.d.ts +6 -1
  298. package/dist/hooks/useListFocus.d.ts.map +1 -1
  299. package/dist/hooks/useListFocus.js +12 -4
  300. package/dist/hooks/useOverflow.d.ts +19 -0
  301. package/dist/hooks/useOverflow.d.ts.map +1 -1
  302. package/dist/hooks/useOverflow.js +36 -25
  303. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  304. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  305. package/dist/i18n/InternationalizationContext.js +3 -0
  306. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  307. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  308. package/dist/i18n/InternationalizationProvider.js +5 -1
  309. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  310. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  311. package/dist/i18n/getLocaleDirection.js +29 -0
  312. package/dist/i18n/index.d.ts +6 -0
  313. package/dist/i18n/index.d.ts.map +1 -1
  314. package/dist/i18n/index.js +7 -1
  315. package/dist/i18n/resolve.d.ts.map +1 -1
  316. package/dist/i18n/resolve.js +7 -18
  317. package/dist/i18n/useDirection.d.ts +2 -0
  318. package/dist/i18n/useDirection.d.ts.map +1 -0
  319. package/dist/i18n/useDirection.js +27 -0
  320. package/dist/theme/Theme.d.ts.map +1 -1
  321. package/dist/theme/Theme.js +2 -7
  322. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  323. package/dist/theme/derivedVarRegistry.js +13 -0
  324. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  325. package/dist/theme/generateThemeRules.js +51 -0
  326. package/dist/theme/hct.d.ts +0 -1
  327. package/dist/theme/hct.d.ts.map +1 -1
  328. package/dist/theme/hct.js +1 -1
  329. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  330. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  331. package/dist/utils/devWarning.d.ts +42 -0
  332. package/dist/utils/devWarning.d.ts.map +1 -0
  333. package/dist/utils/devWarning.js +88 -0
  334. package/dist/utils/index.d.ts +3 -1
  335. package/dist/utils/index.d.ts.map +1 -1
  336. package/dist/utils/index.js +3 -2
  337. package/dist/utils/plainDate.d.ts +30 -0
  338. package/dist/utils/plainDate.d.ts.map +1 -1
  339. package/dist/utils/plainDate.js +53 -0
  340. package/dist/utils/types.d.ts +13 -0
  341. package/dist/utils/types.d.ts.map +1 -1
  342. package/locales/en.json +32 -0
  343. package/locales/fr-FR.json +14 -0
  344. package/locales/pseudo.json +24 -0
  345. package/package.json +1 -1
  346. package/src/AppShell/AppShell.tsx +6 -0
  347. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  348. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  349. package/src/Avatar/Avatar.doc.mjs +60 -3
  350. package/src/Avatar/Avatar.test.tsx +281 -1
  351. package/src/Avatar/Avatar.tsx +324 -64
  352. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  353. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  354. package/src/Avatar/AvatarStatusDot.tsx +178 -21
  355. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  356. package/src/AvatarGroup/AvatarGroup.test.tsx +125 -0
  357. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  358. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  359. package/src/Banner/Banner.doc.mjs +9 -0
  360. package/src/Banner/Banner.test.tsx +30 -0
  361. package/src/Banner/Banner.tsx +53 -9
  362. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  363. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  364. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  365. package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
  366. package/src/Breadcrumbs/index.ts +27 -0
  367. package/src/Button/Button.doc.mjs +9 -0
  368. package/src/Button/Button.test.tsx +49 -0
  369. package/src/Button/Button.tsx +27 -3
  370. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  371. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  372. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  373. package/src/Calendar/Calendar.doc.mjs +12 -1
  374. package/src/Calendar/Calendar.test.tsx +193 -0
  375. package/src/Calendar/Calendar.tsx +38 -16
  376. package/src/Calendar/dayCellUtils.test.ts +5 -0
  377. package/src/Calendar/dayCellUtils.ts +1 -1
  378. package/src/Card/Card.doc.mjs +9 -0
  379. package/src/Card/Card.test.tsx +21 -3
  380. package/src/Card/Card.tsx +35 -2
  381. package/src/Carousel/Carousel.doc.mjs +1 -0
  382. package/src/Carousel/Carousel.test.tsx +53 -0
  383. package/src/Carousel/Carousel.tsx +34 -4
  384. package/src/Chat/ChatComposer.doc.mjs +12 -3
  385. package/src/Chat/ChatComposer.test.tsx +115 -0
  386. package/src/Chat/ChatComposer.tsx +73 -9
  387. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  388. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  389. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  390. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  391. package/src/Chat/ChatComposerInput.tsx +51 -5
  392. package/src/Chat/ChatContext.tsx +37 -10
  393. package/src/Chat/ChatDictationButton.tsx +4 -1
  394. package/src/Chat/ChatLayout.tsx +7 -5
  395. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  396. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  397. package/src/Chat/ChatSendButton.tsx +11 -1
  398. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  399. package/src/Chat/ChatToolCalls.tsx +25 -4
  400. package/src/Chat/index.ts +5 -1
  401. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  402. package/src/Chat/useChatStreamScroll.ts +27 -10
  403. package/src/Chat/useSpeechRecognition.ts +1 -1
  404. package/src/Chat/useTriggerMenu.tsx +4 -2
  405. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  406. package/src/CheckboxInput/CheckboxInput.tsx +1 -1
  407. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  408. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  409. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  410. package/src/Citation/Citation.doc.mjs +4 -3
  411. package/src/Citation/Citation.test.tsx +97 -0
  412. package/src/Citation/Citation.tsx +43 -11
  413. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  414. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  415. package/src/ClickableCard/ClickableCard.tsx +13 -3
  416. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  417. package/src/CodeBlock/CodeBlock.tsx +10 -2
  418. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  419. package/src/CommandPalette/CommandPalette.tsx +3 -1
  420. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  421. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  422. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  423. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  424. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  425. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  426. package/src/ContextMenu/ContextMenu.test.tsx +193 -0
  427. package/src/DateInput/DateInput.doc.mjs +31 -0
  428. package/src/DateInput/DateInput.test.tsx +131 -0
  429. package/src/DateInput/DateInput.tsx +78 -3
  430. package/src/DateInput/index.ts +1 -0
  431. package/src/DateRangeInput/DateRangeInput.doc.mjs +8 -0
  432. package/src/DateRangeInput/DateRangeInput.test.tsx +23 -0
  433. package/src/DateRangeInput/DateRangeInput.tsx +13 -3
  434. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -1
  435. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  436. package/src/DateTimeInput/DateTimeInput.tsx +42 -18
  437. package/src/Dialog/Dialog.doc.mjs +2 -2
  438. package/src/Dialog/Dialog.test.tsx +77 -4
  439. package/src/Dialog/Dialog.tsx +89 -5
  440. package/src/Dialog/DialogContext.ts +9 -2
  441. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  442. package/src/Dialog/DialogHeader.tsx +9 -2
  443. package/src/Divider/Divider.tsx +2 -2
  444. package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
  445. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
  446. package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
  447. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  448. package/src/Field/Field.test.tsx +57 -12
  449. package/src/Field/Field.tsx +6 -5
  450. package/src/Field/FieldLabel.tsx +9 -1
  451. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  452. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  453. package/src/FieldStatus/FieldStatus.tsx +63 -5
  454. package/src/FileInput/FileInput.doc.mjs +17 -2
  455. package/src/FileInput/FileInput.test.tsx +135 -12
  456. package/src/FileInput/FileInput.tsx +53 -28
  457. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  458. package/src/HoverCard/HoverCard.test.tsx +21 -2
  459. package/src/HoverCard/HoverCard.tsx +11 -0
  460. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  461. package/src/HoverCard/useHoverCard.tsx +24 -2
  462. package/src/Icon/Icon.doc.mjs +3 -2
  463. package/src/Icon/Icon.tsx +7 -2
  464. package/src/IconButton/IconButton.doc.mjs +8 -0
  465. package/src/IconButton/IconButton.test.tsx +15 -18
  466. package/src/Item/Item.test.tsx +40 -18
  467. package/src/Item/Item.tsx +38 -2
  468. package/src/Layer/useLayer.tsx +8 -0
  469. package/src/Lightbox/Lightbox.tsx +4 -4
  470. package/src/List/List.test.tsx +9 -8
  471. package/src/MobileNav/MobileNav.tsx +12 -1
  472. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  473. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  474. package/src/MultiSelector/MultiSelector.doc.mjs +13 -2
  475. package/src/MultiSelector/MultiSelector.test.tsx +195 -3
  476. package/src/MultiSelector/MultiSelector.tsx +65 -12
  477. package/src/MultiSelector/hooks.ts +17 -0
  478. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  479. package/src/NumberInput/NumberInput.doc.mjs +15 -0
  480. package/src/NumberInput/NumberInput.test.tsx +82 -7
  481. package/src/NumberInput/NumberInput.tsx +21 -4
  482. package/src/Outline/Outline.tsx +0 -1
  483. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  484. package/src/OverflowList/OverflowList.test.tsx +111 -0
  485. package/src/OverflowList/OverflowList.tsx +48 -8
  486. package/src/Pagination/Pagination.tsx +11 -3
  487. package/src/Popover/Popover.tsx +7 -4
  488. package/src/Popover/usePopover.tsx +9 -13
  489. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  490. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  491. package/src/PowerSearch/PowerSearch.tsx +10 -1
  492. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  493. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  494. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  495. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  496. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  497. package/src/SelectableCard/SelectableCard.tsx +29 -16
  498. package/src/Selector/Selector.doc.mjs +7 -0
  499. package/src/Selector/Selector.test.tsx +92 -0
  500. package/src/Selector/Selector.tsx +16 -2
  501. package/src/Selector/hooks.ts +17 -0
  502. package/src/SideNav/SideNav.test.tsx +119 -3
  503. package/src/SideNav/SideNavCollapseButton.tsx +6 -1
  504. package/src/SideNav/SideNavHeading.tsx +24 -8
  505. package/src/SideNav/SideNavItem.tsx +5 -1
  506. package/src/Slider/Slider.test.tsx +75 -2
  507. package/src/Slider/Slider.tsx +21 -5
  508. package/src/Switch/Switch.test.tsx +32 -1
  509. package/src/TabList/Tab.tsx +2 -2
  510. package/src/TabList/TabMenu.tsx +2 -2
  511. package/src/Table/BaseTable.tsx +3 -5
  512. package/src/Table/TableCell.tsx +3 -3
  513. package/src/Table/TableHeaderCell.tsx +3 -3
  514. package/src/Table/index.ts +5 -0
  515. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
  516. package/src/Table/plugins/rowStatus/index.ts +7 -0
  517. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  518. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  519. package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
  520. package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
  521. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  522. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  523. package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
  524. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  525. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  526. package/src/Table/useBaseTablePlugins.ts +10 -6
  527. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  528. package/src/Table/useTableSelection.doc.mjs +65 -14
  529. package/src/Table/useTableTreeData.doc.mjs +29 -0
  530. package/src/Table/useTableTreeState.doc.mjs +2 -2
  531. package/src/TextArea/TextArea.doc.mjs +15 -0
  532. package/src/TextArea/TextArea.test.tsx +32 -1
  533. package/src/TextArea/TextArea.tsx +10 -0
  534. package/src/TextInput/TextInput.doc.mjs +15 -0
  535. package/src/TextInput/TextInput.test.tsx +44 -0
  536. package/src/TextInput/TextInput.tsx +13 -1
  537. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  538. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  539. package/src/Thumbnail/Thumbnail.tsx +142 -42
  540. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  541. package/src/TimeInput/TimeInput.doc.mjs +15 -0
  542. package/src/TimeInput/TimeInput.test.tsx +99 -1
  543. package/src/TimeInput/TimeInput.tsx +29 -6
  544. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  545. package/src/Timestamp/Timestamp.test.tsx +32 -0
  546. package/src/Timestamp/Timestamp.tsx +28 -8
  547. package/src/Toast/useToast.tsx +7 -8
  548. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  549. package/src/Tokenizer/Tokenizer.doc.mjs +30 -1
  550. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  551. package/src/Tokenizer/Tokenizer.tsx +26 -4
  552. package/src/TopNav/TopNav.test.tsx +125 -1
  553. package/src/TopNav/TopNavHeading.tsx +24 -8
  554. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  555. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  556. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  557. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  558. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  559. package/src/TopNav/TopNavMenu.tsx +83 -5
  560. package/src/TreeList/TreeList.doc.mjs +22 -0
  561. package/src/TreeList/TreeList.test.tsx +232 -0
  562. package/src/TreeList/TreeList.tsx +18 -2
  563. package/src/TreeList/TreeListBranches.tsx +16 -2
  564. package/src/TreeList/TreeListItem.tsx +52 -12
  565. package/src/TreeList/TreeListTypes.ts +27 -1
  566. package/src/TreeList/index.ts +2 -2
  567. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  568. package/src/Typeahead/Typeahead.doc.mjs +7 -0
  569. package/src/Typeahead/Typeahead.test.tsx +50 -0
  570. package/src/Typeahead/Typeahead.tsx +10 -0
  571. package/src/authoring/doc.ts +1 -3
  572. package/src/docs-types.ts +5 -0
  573. package/src/hooks/computeOverflow.test.ts +422 -0
  574. package/src/hooks/computeOverflow.ts +290 -0
  575. package/src/hooks/index.ts +2 -0
  576. package/src/hooks/isRtlElement.ts +27 -0
  577. package/src/hooks/useDevWarning.test.tsx +45 -0
  578. package/src/hooks/useDevWarning.ts +54 -0
  579. package/src/hooks/useGridFocus.doc.mjs +3 -3
  580. package/src/hooks/useGridFocus.test.tsx +41 -0
  581. package/src/hooks/useGridFocus.ts +21 -10
  582. package/src/hooks/useListFocus.doc.mjs +3 -3
  583. package/src/hooks/useListFocus.test.tsx +67 -1
  584. package/src/hooks/useListFocus.ts +21 -5
  585. package/src/hooks/useOverflow.test.ts +96 -4
  586. package/src/hooks/useOverflow.ts +74 -33
  587. package/src/i18n/InternationalizationContext.ts +4 -0
  588. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  589. package/src/i18n/InternationalizationProvider.tsx +12 -2
  590. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  591. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  592. package/src/i18n/getLocaleDirection.ts +29 -0
  593. package/src/i18n/index.ts +6 -0
  594. package/src/i18n/resolve.ts +9 -21
  595. package/src/i18n/useDirection.ts +29 -0
  596. package/src/reset.css +0 -26
  597. package/src/reset.test.ts +60 -0
  598. package/src/theme/Theme.tsx +11 -14
  599. package/src/theme/derivedVarRegistry.test.ts +1 -0
  600. package/src/theme/derivedVarRegistry.ts +6 -0
  601. package/src/theme/generateThemeRules.test.ts +107 -0
  602. package/src/theme/generateThemeRules.ts +56 -0
  603. package/src/theme/hct.ts +1 -1
  604. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  605. package/src/utils/devWarning.test.ts +56 -0
  606. package/src/utils/devWarning.ts +102 -0
  607. package/src/utils/index.ts +6 -0
  608. package/src/utils/plainDate.test.ts +22 -0
  609. package/src/utils/plainDate.ts +61 -0
  610. package/src/utils/types.ts +14 -0
@@ -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
  });
@@ -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,