@astryxdesign/core 0.1.8 → 0.1.9-canary.08c278e

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 (603) 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/ClickableCard/ClickableCard.d.ts +9 -2
  81. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  82. package/dist/ClickableCard/ClickableCard.js +5 -2
  83. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  84. package/dist/CodeBlock/CodeBlock.js +9 -2
  85. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  86. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  87. package/dist/CommandPalette/CommandPalette.js +3 -1
  88. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  89. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  90. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  91. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  92. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  93. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  94. package/dist/DateInput/DateInput.d.ts +55 -2
  95. package/dist/DateInput/DateInput.d.ts.map +1 -1
  96. package/dist/DateInput/DateInput.js +28 -2
  97. package/dist/DateInput/index.d.ts +1 -1
  98. package/dist/DateInput/index.d.ts.map +1 -1
  99. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  100. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  101. package/dist/DateRangeInput/DateRangeInput.js +3 -1
  102. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  103. package/dist/DateTimeInput/DateTimeInput.js +18 -3
  104. package/dist/Dialog/Dialog.d.ts +3 -0
  105. package/dist/Dialog/Dialog.d.ts.map +1 -1
  106. package/dist/Dialog/Dialog.js +57 -6
  107. package/dist/Dialog/DialogContext.d.ts +7 -0
  108. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  109. package/dist/Dialog/DialogContext.js +2 -2
  110. package/dist/Dialog/DialogHeader.d.ts +5 -2
  111. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  112. package/dist/Dialog/DialogHeader.js +6 -1
  113. package/dist/Divider/Divider.js +1 -1
  114. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  115. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  116. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
  117. package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
  118. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  119. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  120. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  121. package/dist/Field/Field.d.ts.map +1 -1
  122. package/dist/Field/Field.js +2 -3
  123. package/dist/Field/FieldLabel.d.ts +1 -1
  124. package/dist/Field/FieldLabel.d.ts.map +1 -1
  125. package/dist/Field/FieldLabel.js +43 -16
  126. package/dist/FieldStatus/FieldStatus.d.ts +15 -0
  127. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  128. package/dist/FieldStatus/FieldStatus.js +58 -6
  129. package/dist/FileInput/FileInput.d.ts +9 -2
  130. package/dist/FileInput/FileInput.d.ts.map +1 -1
  131. package/dist/FileInput/FileInput.js +42 -20
  132. package/dist/HoverCard/HoverCard.d.ts +9 -1
  133. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  134. package/dist/HoverCard/HoverCard.js +2 -0
  135. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  136. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  137. package/dist/HoverCard/useHoverCard.js +7 -2
  138. package/dist/Icon/Icon.d.ts +7 -2
  139. package/dist/Icon/Icon.d.ts.map +1 -1
  140. package/dist/Item/Item.d.ts +6 -1
  141. package/dist/Item/Item.d.ts.map +1 -1
  142. package/dist/Item/Item.js +22 -1
  143. package/dist/Layer/useLayer.d.ts +6 -0
  144. package/dist/Layer/useLayer.d.ts.map +1 -1
  145. package/dist/Layer/useLayer.js +2 -0
  146. package/dist/Lightbox/Lightbox.js +4 -4
  147. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  148. package/dist/MobileNav/MobileNav.js +6 -1
  149. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  150. package/dist/MobileNav/MobileNavToggle.js +4 -0
  151. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  152. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  153. package/dist/MultiSelector/MultiSelector.js +41 -12
  154. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  155. package/dist/MultiSelector/hooks.js +16 -0
  156. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  157. package/dist/NumberInput/NumberInput.d.ts +9 -2
  158. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  159. package/dist/NumberInput/NumberInput.js +8 -1
  160. package/dist/Outline/Outline.d.ts +0 -1
  161. package/dist/Outline/Outline.d.ts.map +1 -1
  162. package/dist/Outline/Outline.js +0 -1
  163. package/dist/OverflowList/OverflowList.d.ts +20 -3
  164. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  165. package/dist/OverflowList/OverflowList.js +29 -4
  166. package/dist/Pagination/Pagination.d.ts.map +1 -1
  167. package/dist/Pagination/Pagination.js +11 -3
  168. package/dist/Popover/Popover.d.ts.map +1 -1
  169. package/dist/Popover/Popover.js +3 -2
  170. package/dist/Popover/usePopover.d.ts.map +1 -1
  171. package/dist/Popover/usePopover.js +3 -9
  172. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  173. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  174. package/dist/PowerSearch/PowerSearch.js +2 -0
  175. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  176. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  178. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  179. package/dist/SelectableCard/SelectableCard.js +16 -13
  180. package/dist/Selector/Selector.d.ts +8 -0
  181. package/dist/Selector/Selector.d.ts.map +1 -1
  182. package/dist/Selector/Selector.js +7 -3
  183. package/dist/Selector/hooks.d.ts.map +1 -1
  184. package/dist/Selector/hooks.js +16 -0
  185. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  186. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  187. package/dist/SideNav/SideNavHeading.js +21 -8
  188. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  189. package/dist/Slider/Slider.d.ts.map +1 -1
  190. package/dist/Slider/Slider.js +19 -2
  191. package/dist/Stack/stack.stylex.d.ts +9 -9
  192. package/dist/TabList/Tab.js +2 -2
  193. package/dist/TabList/TabMenu.js +1 -1
  194. package/dist/Table/BaseTable.d.ts.map +1 -1
  195. package/dist/Table/BaseTable.js +3 -2
  196. package/dist/Table/TableCell.js +3 -3
  197. package/dist/Table/TableHeaderCell.js +3 -3
  198. package/dist/Table/index.d.ts +2 -0
  199. package/dist/Table/index.d.ts.map +1 -1
  200. package/dist/Table/index.js +1 -0
  201. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  202. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  203. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  204. package/dist/Table/plugins/rowStatus/index.js +3 -0
  205. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  206. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  207. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  208. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  209. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  210. package/dist/Table/plugins/selection/useTableSelection.js +4 -1
  211. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  212. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  213. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  214. package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
  215. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  216. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  217. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  218. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  219. package/dist/Table/useBaseTablePlugins.js +5 -3
  220. package/dist/TextArea/TextArea.d.ts +9 -1
  221. package/dist/TextArea/TextArea.d.ts.map +1 -1
  222. package/dist/TextArea/TextArea.js +2 -0
  223. package/dist/TextInput/TextInput.d.ts +9 -2
  224. package/dist/TextInput/TextInput.d.ts.map +1 -1
  225. package/dist/TextInput/TextInput.js +6 -1
  226. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  227. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  228. package/dist/Thumbnail/Thumbnail.js +97 -54
  229. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  230. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  231. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  232. package/dist/TimeInput/TimeInput.d.ts +9 -2
  233. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  234. package/dist/TimeInput/TimeInput.js +17 -4
  235. package/dist/Timestamp/Timestamp.d.ts +3 -1
  236. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  237. package/dist/Timestamp/Timestamp.js +8 -6
  238. package/dist/Toast/useToast.d.ts.map +1 -1
  239. package/dist/Toast/useToast.js +2 -5
  240. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  241. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  242. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  243. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  244. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  245. package/dist/Tokenizer/Tokenizer.js +18 -4
  246. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  247. package/dist/TopNav/TopNavHeading.js +18 -8
  248. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  249. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  250. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  251. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  252. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  253. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMenu.js +68 -6
  255. package/dist/TreeList/TreeList.d.ts +12 -3
  256. package/dist/TreeList/TreeList.d.ts.map +1 -1
  257. package/dist/TreeList/TreeList.js +2 -0
  258. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  259. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  260. package/dist/TreeList/TreeListBranches.js +10 -4
  261. package/dist/TreeList/TreeListItem.d.ts +8 -2
  262. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  263. package/dist/TreeList/TreeListItem.js +28 -8
  264. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  265. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  266. package/dist/TreeList/index.d.ts +2 -2
  267. package/dist/TreeList/index.d.ts.map +1 -1
  268. package/dist/Typeahead/BaseTypeahead.js +1 -1
  269. package/dist/Typeahead/Typeahead.d.ts +9 -2
  270. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  271. package/dist/Typeahead/Typeahead.js +2 -0
  272. package/dist/astryx.css +41 -31
  273. package/dist/astryx.umd.js +51 -51
  274. package/dist/astryx.umd.js.map +4 -4
  275. package/dist/authoring/doc.d.ts.map +1 -1
  276. package/dist/docs-types.d.ts +8 -0
  277. package/dist/docs-types.d.ts.map +1 -1
  278. package/dist/hooks/computeOverflow.d.ts +47 -0
  279. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  280. package/dist/hooks/computeOverflow.js +213 -0
  281. package/dist/hooks/index.d.ts +1 -0
  282. package/dist/hooks/index.d.ts.map +1 -1
  283. package/dist/hooks/index.js +2 -1
  284. package/dist/hooks/isRtlElement.d.ts +18 -0
  285. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  286. package/dist/hooks/isRtlElement.js +27 -0
  287. package/dist/hooks/useDevWarning.d.ts +18 -0
  288. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  289. package/dist/hooks/useDevWarning.js +49 -0
  290. package/dist/hooks/useGridFocus.d.ts +6 -1
  291. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  292. package/dist/hooks/useGridFocus.js +12 -9
  293. package/dist/hooks/useListFocus.d.ts +6 -1
  294. package/dist/hooks/useListFocus.d.ts.map +1 -1
  295. package/dist/hooks/useListFocus.js +12 -4
  296. package/dist/hooks/useOverflow.d.ts +19 -0
  297. package/dist/hooks/useOverflow.d.ts.map +1 -1
  298. package/dist/hooks/useOverflow.js +36 -25
  299. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  300. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  301. package/dist/i18n/InternationalizationContext.js +3 -0
  302. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  303. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  304. package/dist/i18n/InternationalizationProvider.js +5 -1
  305. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  306. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  307. package/dist/i18n/getLocaleDirection.js +29 -0
  308. package/dist/i18n/index.d.ts +6 -0
  309. package/dist/i18n/index.d.ts.map +1 -1
  310. package/dist/i18n/index.js +7 -1
  311. package/dist/i18n/resolve.d.ts.map +1 -1
  312. package/dist/i18n/resolve.js +7 -18
  313. package/dist/i18n/useDirection.d.ts +2 -0
  314. package/dist/i18n/useDirection.d.ts.map +1 -0
  315. package/dist/i18n/useDirection.js +27 -0
  316. package/dist/theme/Theme.d.ts.map +1 -1
  317. package/dist/theme/Theme.js +2 -7
  318. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  319. package/dist/theme/derivedVarRegistry.js +13 -0
  320. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  321. package/dist/theme/generateThemeRules.js +51 -0
  322. package/dist/theme/hct.d.ts +0 -1
  323. package/dist/theme/hct.d.ts.map +1 -1
  324. package/dist/theme/hct.js +1 -1
  325. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  326. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  327. package/dist/utils/devWarning.d.ts +42 -0
  328. package/dist/utils/devWarning.d.ts.map +1 -0
  329. package/dist/utils/devWarning.js +88 -0
  330. package/dist/utils/index.d.ts +3 -1
  331. package/dist/utils/index.d.ts.map +1 -1
  332. package/dist/utils/index.js +3 -2
  333. package/dist/utils/plainDate.d.ts +30 -0
  334. package/dist/utils/plainDate.d.ts.map +1 -1
  335. package/dist/utils/plainDate.js +53 -0
  336. package/dist/utils/types.d.ts +13 -0
  337. package/dist/utils/types.d.ts.map +1 -1
  338. package/locales/en.json +32 -0
  339. package/locales/fr-FR.json +14 -0
  340. package/locales/pseudo.json +24 -0
  341. package/package.json +1 -1
  342. package/src/AppShell/AppShell.tsx +6 -0
  343. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  344. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  345. package/src/Avatar/Avatar.doc.mjs +60 -3
  346. package/src/Avatar/Avatar.test.tsx +281 -1
  347. package/src/Avatar/Avatar.tsx +324 -64
  348. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  349. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  350. package/src/Avatar/AvatarStatusDot.tsx +178 -21
  351. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  352. package/src/AvatarGroup/AvatarGroup.test.tsx +125 -0
  353. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  354. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  355. package/src/Banner/Banner.doc.mjs +9 -0
  356. package/src/Banner/Banner.test.tsx +30 -0
  357. package/src/Banner/Banner.tsx +53 -9
  358. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  359. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  360. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  361. package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
  362. package/src/Breadcrumbs/index.ts +27 -0
  363. package/src/Button/Button.doc.mjs +9 -0
  364. package/src/Button/Button.test.tsx +49 -0
  365. package/src/Button/Button.tsx +27 -3
  366. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  367. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  368. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  369. package/src/Calendar/Calendar.doc.mjs +12 -1
  370. package/src/Calendar/Calendar.test.tsx +193 -0
  371. package/src/Calendar/Calendar.tsx +38 -16
  372. package/src/Calendar/dayCellUtils.test.ts +5 -0
  373. package/src/Calendar/dayCellUtils.ts +1 -1
  374. package/src/Card/Card.doc.mjs +9 -0
  375. package/src/Card/Card.test.tsx +21 -3
  376. package/src/Card/Card.tsx +35 -2
  377. package/src/Carousel/Carousel.doc.mjs +1 -0
  378. package/src/Carousel/Carousel.test.tsx +53 -0
  379. package/src/Carousel/Carousel.tsx +34 -4
  380. package/src/Chat/ChatComposer.doc.mjs +12 -3
  381. package/src/Chat/ChatComposer.test.tsx +115 -0
  382. package/src/Chat/ChatComposer.tsx +73 -9
  383. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  384. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  385. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  386. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  387. package/src/Chat/ChatComposerInput.tsx +51 -5
  388. package/src/Chat/ChatContext.tsx +37 -10
  389. package/src/Chat/ChatDictationButton.tsx +4 -1
  390. package/src/Chat/ChatLayout.tsx +7 -5
  391. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  392. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  393. package/src/Chat/ChatSendButton.tsx +11 -1
  394. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  395. package/src/Chat/ChatToolCalls.tsx +25 -4
  396. package/src/Chat/index.ts +5 -1
  397. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  398. package/src/Chat/useChatStreamScroll.ts +27 -10
  399. package/src/Chat/useSpeechRecognition.ts +1 -1
  400. package/src/Chat/useTriggerMenu.tsx +4 -2
  401. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  402. package/src/CheckboxInput/CheckboxInput.tsx +1 -1
  403. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  404. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  405. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  406. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  407. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  408. package/src/ClickableCard/ClickableCard.tsx +13 -3
  409. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  410. package/src/CodeBlock/CodeBlock.tsx +10 -2
  411. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  412. package/src/CommandPalette/CommandPalette.tsx +3 -1
  413. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  414. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  415. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  416. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  417. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  418. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  419. package/src/ContextMenu/ContextMenu.test.tsx +193 -0
  420. package/src/DateInput/DateInput.doc.mjs +31 -0
  421. package/src/DateInput/DateInput.test.tsx +131 -0
  422. package/src/DateInput/DateInput.tsx +78 -3
  423. package/src/DateInput/index.ts +1 -0
  424. package/src/DateRangeInput/DateRangeInput.doc.mjs +8 -0
  425. package/src/DateRangeInput/DateRangeInput.test.tsx +23 -0
  426. package/src/DateRangeInput/DateRangeInput.tsx +13 -3
  427. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -1
  428. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  429. package/src/DateTimeInput/DateTimeInput.tsx +42 -18
  430. package/src/Dialog/Dialog.doc.mjs +2 -2
  431. package/src/Dialog/Dialog.test.tsx +77 -4
  432. package/src/Dialog/Dialog.tsx +89 -5
  433. package/src/Dialog/DialogContext.ts +9 -2
  434. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  435. package/src/Dialog/DialogHeader.tsx +9 -2
  436. package/src/Divider/Divider.tsx +2 -2
  437. package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
  438. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
  439. package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
  440. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  441. package/src/Field/Field.test.tsx +57 -12
  442. package/src/Field/Field.tsx +6 -5
  443. package/src/Field/FieldLabel.tsx +9 -1
  444. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  445. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  446. package/src/FieldStatus/FieldStatus.tsx +63 -5
  447. package/src/FileInput/FileInput.doc.mjs +17 -2
  448. package/src/FileInput/FileInput.test.tsx +135 -12
  449. package/src/FileInput/FileInput.tsx +53 -28
  450. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  451. package/src/HoverCard/HoverCard.test.tsx +21 -2
  452. package/src/HoverCard/HoverCard.tsx +11 -0
  453. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  454. package/src/HoverCard/useHoverCard.tsx +24 -2
  455. package/src/Icon/Icon.doc.mjs +3 -2
  456. package/src/Icon/Icon.tsx +7 -2
  457. package/src/IconButton/IconButton.doc.mjs +8 -0
  458. package/src/IconButton/IconButton.test.tsx +15 -18
  459. package/src/Item/Item.test.tsx +40 -18
  460. package/src/Item/Item.tsx +38 -2
  461. package/src/Layer/useLayer.tsx +8 -0
  462. package/src/Lightbox/Lightbox.tsx +4 -4
  463. package/src/List/List.test.tsx +9 -8
  464. package/src/MobileNav/MobileNav.tsx +12 -1
  465. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  466. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  467. package/src/MultiSelector/MultiSelector.doc.mjs +13 -2
  468. package/src/MultiSelector/MultiSelector.test.tsx +195 -3
  469. package/src/MultiSelector/MultiSelector.tsx +65 -12
  470. package/src/MultiSelector/hooks.ts +17 -0
  471. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  472. package/src/NumberInput/NumberInput.doc.mjs +15 -0
  473. package/src/NumberInput/NumberInput.test.tsx +82 -7
  474. package/src/NumberInput/NumberInput.tsx +21 -4
  475. package/src/Outline/Outline.tsx +0 -1
  476. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  477. package/src/OverflowList/OverflowList.test.tsx +111 -0
  478. package/src/OverflowList/OverflowList.tsx +48 -8
  479. package/src/Pagination/Pagination.tsx +11 -3
  480. package/src/Popover/Popover.tsx +7 -4
  481. package/src/Popover/usePopover.tsx +9 -13
  482. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  483. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  484. package/src/PowerSearch/PowerSearch.tsx +10 -1
  485. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  486. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  487. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  488. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  489. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  490. package/src/SelectableCard/SelectableCard.tsx +29 -16
  491. package/src/Selector/Selector.doc.mjs +7 -0
  492. package/src/Selector/Selector.test.tsx +92 -0
  493. package/src/Selector/Selector.tsx +16 -2
  494. package/src/Selector/hooks.ts +17 -0
  495. package/src/SideNav/SideNav.test.tsx +119 -3
  496. package/src/SideNav/SideNavCollapseButton.tsx +6 -1
  497. package/src/SideNav/SideNavHeading.tsx +24 -8
  498. package/src/SideNav/SideNavItem.tsx +5 -1
  499. package/src/Slider/Slider.test.tsx +75 -2
  500. package/src/Slider/Slider.tsx +21 -5
  501. package/src/Switch/Switch.test.tsx +32 -1
  502. package/src/TabList/Tab.tsx +2 -2
  503. package/src/TabList/TabMenu.tsx +2 -2
  504. package/src/Table/BaseTable.tsx +3 -5
  505. package/src/Table/TableCell.tsx +3 -3
  506. package/src/Table/TableHeaderCell.tsx +3 -3
  507. package/src/Table/index.ts +5 -0
  508. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
  509. package/src/Table/plugins/rowStatus/index.ts +7 -0
  510. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  511. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  512. package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
  513. package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
  514. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  515. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  516. package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
  517. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  518. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  519. package/src/Table/useBaseTablePlugins.ts +10 -6
  520. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  521. package/src/Table/useTableSelection.doc.mjs +65 -14
  522. package/src/Table/useTableTreeData.doc.mjs +29 -0
  523. package/src/Table/useTableTreeState.doc.mjs +2 -2
  524. package/src/TextArea/TextArea.doc.mjs +15 -0
  525. package/src/TextArea/TextArea.test.tsx +32 -1
  526. package/src/TextArea/TextArea.tsx +10 -0
  527. package/src/TextInput/TextInput.doc.mjs +15 -0
  528. package/src/TextInput/TextInput.test.tsx +44 -0
  529. package/src/TextInput/TextInput.tsx +13 -1
  530. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  531. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  532. package/src/Thumbnail/Thumbnail.tsx +142 -42
  533. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  534. package/src/TimeInput/TimeInput.doc.mjs +15 -0
  535. package/src/TimeInput/TimeInput.test.tsx +99 -1
  536. package/src/TimeInput/TimeInput.tsx +29 -6
  537. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  538. package/src/Timestamp/Timestamp.test.tsx +32 -0
  539. package/src/Timestamp/Timestamp.tsx +28 -8
  540. package/src/Toast/useToast.tsx +7 -8
  541. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  542. package/src/Tokenizer/Tokenizer.doc.mjs +30 -1
  543. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  544. package/src/Tokenizer/Tokenizer.tsx +26 -4
  545. package/src/TopNav/TopNav.test.tsx +125 -1
  546. package/src/TopNav/TopNavHeading.tsx +24 -8
  547. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  548. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  549. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  550. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  551. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  552. package/src/TopNav/TopNavMenu.tsx +83 -5
  553. package/src/TreeList/TreeList.doc.mjs +22 -0
  554. package/src/TreeList/TreeList.test.tsx +232 -0
  555. package/src/TreeList/TreeList.tsx +18 -2
  556. package/src/TreeList/TreeListBranches.tsx +16 -2
  557. package/src/TreeList/TreeListItem.tsx +52 -12
  558. package/src/TreeList/TreeListTypes.ts +27 -1
  559. package/src/TreeList/index.ts +2 -2
  560. package/src/Typeahead/BaseTypeahead.tsx +1 -1
  561. package/src/Typeahead/Typeahead.doc.mjs +7 -0
  562. package/src/Typeahead/Typeahead.test.tsx +23 -0
  563. package/src/Typeahead/Typeahead.tsx +10 -0
  564. package/src/authoring/doc.ts +1 -3
  565. package/src/docs-types.ts +5 -0
  566. package/src/hooks/computeOverflow.test.ts +422 -0
  567. package/src/hooks/computeOverflow.ts +290 -0
  568. package/src/hooks/index.ts +2 -0
  569. package/src/hooks/isRtlElement.ts +27 -0
  570. package/src/hooks/useDevWarning.test.tsx +45 -0
  571. package/src/hooks/useDevWarning.ts +54 -0
  572. package/src/hooks/useGridFocus.doc.mjs +3 -3
  573. package/src/hooks/useGridFocus.test.tsx +41 -0
  574. package/src/hooks/useGridFocus.ts +21 -10
  575. package/src/hooks/useListFocus.doc.mjs +3 -3
  576. package/src/hooks/useListFocus.test.tsx +67 -1
  577. package/src/hooks/useListFocus.ts +21 -5
  578. package/src/hooks/useOverflow.test.ts +96 -4
  579. package/src/hooks/useOverflow.ts +74 -33
  580. package/src/i18n/InternationalizationContext.ts +4 -0
  581. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  582. package/src/i18n/InternationalizationProvider.tsx +12 -2
  583. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  584. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  585. package/src/i18n/getLocaleDirection.ts +29 -0
  586. package/src/i18n/index.ts +6 -0
  587. package/src/i18n/resolve.ts +9 -21
  588. package/src/i18n/useDirection.ts +29 -0
  589. package/src/reset.css +0 -26
  590. package/src/reset.test.ts +60 -0
  591. package/src/theme/Theme.tsx +11 -14
  592. package/src/theme/derivedVarRegistry.test.ts +1 -0
  593. package/src/theme/derivedVarRegistry.ts +6 -0
  594. package/src/theme/generateThemeRules.test.ts +107 -0
  595. package/src/theme/generateThemeRules.ts +56 -0
  596. package/src/theme/hct.ts +1 -1
  597. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  598. package/src/utils/devWarning.test.ts +56 -0
  599. package/src/utils/devWarning.ts +102 -0
  600. package/src/utils/index.ts +6 -0
  601. package/src/utils/plainDate.test.ts +22 -0
  602. package/src/utils/plainDate.ts +61 -0
  603. 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()}
@@ -28,6 +28,7 @@ export const docs = {
28
28
  {name: 'children', type: 'ReactNode', description: 'Card content.'},
29
29
  {name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inner padding.', default: '4'},
30
30
  {name: 'variant', type: "'default' | 'transparent' | 'muted' | 'blue' | 'cyan' | 'gray' | 'green' | 'orange' | 'pink' | 'purple' | 'red' | 'teal' | 'yellow'", description: 'Background color variant.', default: "'default'"},
31
+ {name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: 'Resting shadow depth. Often raised to signal the whole card is clickable.', default: "'none'"},
31
32
  {name: 'width', type: 'SizeValue', description: 'Card width.'},
32
33
  {name: 'height', type: 'SizeValue', description: 'Card height.'},
33
34
  {name: 'maxWidth', type: 'SizeValue', description: 'Maximum card width.'},
@@ -73,6 +74,7 @@ export const docsDense = {
73
74
  isDisabled: 'disables card',
74
75
  padding: 'inner padding',
75
76
  variant: 'background color variant',
77
+ elevation: 'resting shadow depth: none|low|med|high; often raised to signal clickability',
76
78
  width: 'card width',
77
79
  height: 'card height',
78
80
  maxWidth: 'max card width',
@@ -106,4 +106,38 @@ describe('ClickableCard', () => {
106
106
  const link = screen.getByRole('link', {name: 'Disabled link'});
107
107
  expect(link).toHaveAttribute('aria-disabled', 'true');
108
108
  });
109
+
110
+ describe('elevation', () => {
111
+ it('forwards a distinct elevation class to the card for each level', () => {
112
+ const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
113
+ const {container} = render(
114
+ <ClickableCard label="Card" elevation={elevation}>
115
+ Content
116
+ </ClickableCard>,
117
+ );
118
+ return container.firstElementChild!.className;
119
+ };
120
+ const classes = new Set([
121
+ classFor('none'),
122
+ classFor('low'),
123
+ classFor('med'),
124
+ classFor('high'),
125
+ ]);
126
+ expect(classes.size).toBe(4);
127
+ });
128
+
129
+ it('defaults to flat (elevation none)', () => {
130
+ const {container: def} = render(
131
+ <ClickableCard label="Card">Content</ClickableCard>,
132
+ );
133
+ const {container: none} = render(
134
+ <ClickableCard label="Card" elevation="none">
135
+ Content
136
+ </ClickableCard>,
137
+ );
138
+ expect(def.firstElementChild!.className).toBe(
139
+ none.firstElementChild!.className,
140
+ );
141
+ });
142
+ });
109
143
  });
@@ -14,6 +14,7 @@
14
14
  * - /apps/storybook/stories/ClickableCard.stories.tsx (storybook stories)
15
15
  * - /packages/cli/templates/blocks/components/Card/ClickableCardShowcase.tsx (showcase block)
16
16
  * - /packages/cli/templates/blocks/components/Card/ClickableCardWithNestedButton.tsx (block)
17
+ * - /packages/cli/templates/blocks/components/Card/ClickableCardElevated.tsx (block)
17
18
  *
18
19
  * Composes Card for all visual styling (radius, padding, variants,
19
20
  * container tokens, theming). Adds an interactive wrapper with
@@ -37,7 +38,7 @@ import {
37
38
  durationVars,
38
39
  easeVars,
39
40
  } from '../theme/tokens.stylex';
40
- import type {SizeValue, SpacingStep} from '../utils/types';
41
+ import type {SizeValue, SpacingStep, Elevation} from '../utils/types';
41
42
  import {mergeProps, mergeRefs} from '../utils';
42
43
  import {Card} from '../Card/Card';
43
44
  import type {CardVariant} from '../Card/Card';
@@ -78,13 +79,13 @@ const styles = stylex.create({
78
79
  backgroundColor: 'transparent',
79
80
  },
80
81
  ':active::after': {
81
- backgroundColor: 'color-mix(in srgb, currentColor 10%, transparent)',
82
+ backgroundColor: colorVars['--color-overlay-pressed'],
82
83
  },
83
84
  },
84
85
  hoverOnPointer: {
85
86
  '@media (hover: hover)': {
86
87
  ':hover::after': {
87
- backgroundColor: 'color-mix(in srgb, currentColor 5%, transparent)',
88
+ backgroundColor: colorVars['--color-overlay-hover'],
88
89
  },
89
90
  },
90
91
  },
@@ -197,6 +198,13 @@ export interface ClickableCardProps extends BaseProps {
197
198
  */
198
199
  variant?: CardVariant;
199
200
 
201
+ /**
202
+ * Resting elevation — the shadow depth the card sits at. Often raised to
203
+ * signal that the whole card is clickable.
204
+ * @default 'none'
205
+ */
206
+ elevation?: Elevation;
207
+
200
208
  /** Width of the card. */
201
209
  width?: SizeValue;
202
210
 
@@ -253,6 +261,7 @@ export function ClickableCard({
253
261
  children,
254
262
  padding,
255
263
  variant = 'default',
264
+ elevation = 'none',
256
265
  width,
257
266
  height,
258
267
  maxWidth,
@@ -297,6 +306,7 @@ export function ClickableCard({
297
306
  maxWidth={maxWidth}
298
307
  padding={padding}
299
308
  variant={variant}
309
+ elevation={elevation}
300
310
  {...mergeProps(themeProps('clickable-card', {variant}), {
301
311
  className: classNameProp,
302
312
  style,
@@ -210,6 +210,62 @@ describe('CodeBlock', () => {
210
210
  expect(document.getElementById(controlsId as string)).not.toBeNull();
211
211
  });
212
212
 
213
+ it('makes the collapsed region inert so the scroll container is unreachable', () => {
214
+ render(
215
+ <CodeBlock
216
+ code={LONG_CODE}
217
+ language="javascript"
218
+ title="example"
219
+ isCollapsible
220
+ />,
221
+ );
222
+ const header = screen
223
+ .getAllByRole('button')
224
+ .find(el => el.hasAttribute('aria-expanded'))!;
225
+ const region = document.getElementById(
226
+ header.getAttribute('aria-controls') as string,
227
+ )!;
228
+ // Expanded: the region is not inert and the scroll container is reachable.
229
+ expect(region).not.toHaveAttribute('inert');
230
+
231
+ fireEvent.click(header);
232
+ expect(header).toHaveAttribute('aria-expanded', 'false');
233
+ // Collapsed: the wrapper is inert, so the keyboard-focusable scroll
234
+ // container (tabIndex=0) inside it drops out of the tab order and the
235
+ // accessibility tree instead of remaining an invisible tab stop.
236
+ expect(region).toHaveAttribute('inert');
237
+ const scrollContainer = screen.getByRole('group');
238
+ expect(scrollContainer.closest('[inert]')).toBe(region);
239
+ });
240
+
241
+ it('restores focusability of the scroll container after expanding again', () => {
242
+ render(
243
+ <CodeBlock
244
+ code={LONG_CODE}
245
+ language="javascript"
246
+ title="example"
247
+ isCollapsible
248
+ />,
249
+ );
250
+ const header = screen
251
+ .getAllByRole('button')
252
+ .find(el => el.hasAttribute('aria-expanded'))!;
253
+ const region = document.getElementById(
254
+ header.getAttribute('aria-controls') as string,
255
+ )!;
256
+ // Collapse, then expand again.
257
+ fireEvent.click(header);
258
+ expect(region).toHaveAttribute('inert');
259
+ fireEvent.click(header);
260
+ expect(header).toHaveAttribute('aria-expanded', 'true');
261
+ // Expanded again: inert is removed and the scroll container is a
262
+ // keyboard-focusable group once more.
263
+ expect(region).not.toHaveAttribute('inert');
264
+ const scrollContainer = screen.getByRole('group');
265
+ expect(scrollContainer.closest('[inert]')).toBeNull();
266
+ expect(scrollContainer).toHaveAttribute('tabindex', '0');
267
+ });
268
+
213
269
  it('applies a per-instance syntax theme via the syntaxTheme prop', () => {
214
270
  const {container} = render(
215
271
  <CodeBlock
@@ -296,7 +296,7 @@ const styles = stylex.create({
296
296
  copyButtonAbsolute: {
297
297
  position: 'absolute',
298
298
  top: spacingVars['--spacing-2'],
299
- right: spacingVars['--spacing-2'],
299
+ insetInlineEnd: spacingVars['--spacing-2'],
300
300
  },
301
301
  });
302
302
 
@@ -807,7 +807,9 @@ export function CodeBlock({
807
807
  e.stopPropagation();
808
808
  void handleCopy();
809
809
  }}
810
- aria-label={copied ? t('@astryx.codeBlock.copied') : t('@astryx.codeBlock.copyCode')}
810
+ aria-label={
811
+ copied ? t('@astryx.codeBlock.copied') : t('@astryx.codeBlock.copyCode')
812
+ }
811
813
  {...stylex.props(
812
814
  styles.copyButton,
813
815
  !showHeader && styles.copyButtonAbsolute,
@@ -923,6 +925,12 @@ export function CodeBlock({
923
925
  {canCollapse ? (
924
926
  <div
925
927
  id={regionId}
928
+ // While collapsed, the region is only hidden visually (0fr grid
929
+ // row); inert also removes it from the tab order and accessibility
930
+ // tree so keyboard users cannot Tab into the invisible scroll
931
+ // container (tabIndex=0). aria-controls pointing at an inert
932
+ // element remains a valid, resolvable reference.
933
+ inert={isCollapsed ? true : undefined}
926
934
  {...stylex.props(
927
935
  styles.collapseGrid,
928
936
  isCollapsed && styles.collapseGridCollapsed,
@@ -145,6 +145,7 @@ export const docs = {
145
145
  {className: 'astryx-command-palette-empty'},
146
146
  {className: 'astryx-command-palette-footer'},
147
147
  {className: 'astryx-command-palette-group'},
148
+ {className: 'astryx-command-palette-group-heading'},
148
149
  {className: 'astryx-command-palette-input'},
149
150
  {className: 'astryx-command-palette-item'},
150
151
  {className: 'astryx-command-palette-list'},
@@ -268,6 +268,7 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
268
268
  label: labelFromProps,
269
269
  width = 640,
270
270
  maxHeight = 480,
271
+ ...rest
271
272
  }: CommandPaletteProps<T>) {
272
273
  const t = useTranslator();
273
274
  const label = labelFromProps ?? t('@astryx.commandPalette.label');
@@ -527,7 +528,8 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
527
528
  width={width}
528
529
  maxHeight={maxHeight}
529
530
  purpose="info"
530
- aria-label={label}>
531
+ aria-label={label}
532
+ {...rest}>
531
533
  <CommandPaletteContext value={contextValue}>
532
534
  <Layout
533
535
  defaultHasDividers
@@ -9,6 +9,8 @@
9
9
  import {describe, it, expect} from 'vitest';
10
10
  import {render, screen} from '@testing-library/react';
11
11
  import {CommandPaletteGroup} from './CommandPaletteGroup';
12
+ import {defineTheme} from '../theme/defineTheme';
13
+ import {generateThemeCSSFlat} from '../theme/generateThemeRules';
12
14
 
13
15
  describe('CommandPaletteGroup', () => {
14
16
  it('renders heading', () => {
@@ -51,4 +53,73 @@ describe('CommandPaletteGroup', () => {
51
53
  'true',
52
54
  );
53
55
  });
56
+
57
+ // ===========================================================================
58
+ // Heading theme target
59
+ // ===========================================================================
60
+
61
+ describe('heading theme target', () => {
62
+ it('renders the astryx-command-palette-group-heading target on the heading', () => {
63
+ render(
64
+ <CommandPaletteGroup heading="Suggestions">
65
+ <div>Item</div>
66
+ </CommandPaletteGroup>,
67
+ );
68
+ const heading = screen.getByText('Suggestions');
69
+
70
+ // The root carries `astryx-command-palette-group`; this is the stable
71
+ // handle on the heading itself, so a theme can style just the heading
72
+ // without a fragile structural selector.
73
+ expect(heading).toHaveClass('astryx-command-palette-group-heading');
74
+ });
75
+
76
+ it('keeps the heading target distinct from the group root target', () => {
77
+ render(
78
+ <CommandPaletteGroup heading="Suggestions">
79
+ <div>Item</div>
80
+ </CommandPaletteGroup>,
81
+ );
82
+ const root = screen.getByRole('group');
83
+ const heading = screen.getByText('Suggestions');
84
+
85
+ expect(root).toHaveClass('astryx-command-palette-group');
86
+ expect(root).not.toHaveClass('astryx-command-palette-group-heading');
87
+ expect(heading).not.toHaveClass('astryx-command-palette-group');
88
+ });
89
+
90
+ it('leaves the heading decorative (additive target only)', () => {
91
+ // The target adds a class and nothing else — the heading stays
92
+ // aria-hidden so grouping remains announced via the root's aria-label.
93
+ render(
94
+ <CommandPaletteGroup heading="Suggestions">
95
+ <div>Item</div>
96
+ </CommandPaletteGroup>,
97
+ );
98
+ expect(screen.getByText('Suggestions')).toHaveAttribute(
99
+ 'aria-hidden',
100
+ 'true',
101
+ );
102
+ });
103
+
104
+ it('exposes command-palette-group-heading as a themeable defineTheme target', () => {
105
+ // The generated CSS proves the target is reachable by a theme: jsdom
106
+ // cannot resolve the @layer cascade, so the DOM-class assertions above
107
+ // and this generation assertion together cover the seam.
108
+ const theme = defineTheme({
109
+ name: 'command-palette-group-heading-test',
110
+ components: {
111
+ 'command-palette-group-heading': {
112
+ base: {
113
+ paddingBlock: 'var(--spacing-2)',
114
+ fontWeight: 'var(--font-weight-bold)',
115
+ },
116
+ },
117
+ },
118
+ });
119
+ const css = generateThemeCSSFlat(theme);
120
+ expect(css).toContain('.astryx-command-palette-group-heading {');
121
+ expect(css).toContain('padding-block: var(--spacing-2)');
122
+ expect(css).toContain('font-weight: var(--font-weight-bold)');
123
+ });
124
+ });
54
125
  });
@@ -90,7 +90,18 @@ export function CommandPaletteGroup({
90
90
  style,
91
91
  )}
92
92
  {...props}>
93
- <div aria-hidden="true" {...stylex.props(styles.heading)}>
93
+ <div
94
+ aria-hidden="true"
95
+ {...mergeProps(
96
+ // Stable theme target for the group heading text. The root carries
97
+ // `astryx-command-palette-group`, but the heading itself had no
98
+ // handle, so a theme could only reach it through a fragile structural
99
+ // selector. This adds an `astryx-command-palette-group-heading` class
100
+ // so `defineTheme` can scope overrides (e.g. heading typography) to
101
+ // the heading alone.
102
+ themeProps('command-palette-group-heading'),
103
+ stylex.props(styles.heading),
104
+ )}>
94
105
  {heading}
95
106
  </div>
96
107
  {children}