@astryxdesign/core 0.1.8 → 0.1.9-canary.09e9ddd

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 -4
  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
@@ -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}
@@ -7,7 +7,8 @@ export const docs = {
7
7
  subComponentOf: 'CommandPalette',
8
8
  displayName: 'Command Palette Input',
9
9
  isHiddenFromOverview: true,
10
- description: 'Search input slot. Auto-focuses on mount. Wires to command palette context when used inside CommandPalette.',
10
+ description:
11
+ 'Search input slot. Auto-focuses on mount. Wires to command palette context when used inside CommandPalette.',
11
12
  props: [
12
13
  {
13
14
  name: 'placeholder',
@@ -15,16 +16,24 @@ export const docs = {
15
16
  description: 'Placeholder text for the input.',
16
17
  default: "'Search...'",
17
18
  },
19
+ {
20
+ name: 'label',
21
+ type: 'string',
22
+ description:
23
+ 'Accessible label for the combobox input, announced by screen readers. Falls back to the placeholder text when omitted.',
24
+ },
18
25
  {
19
26
  name: 'hasAutoFocus',
20
27
  type: 'boolean',
21
- description: 'Auto-focus the input when mounted. Automatically disabled when inside an inline command palette.',
28
+ description:
29
+ 'Auto-focus the input when mounted. Automatically disabled when inside an inline command palette.',
22
30
  default: 'true',
23
31
  },
24
32
  {
25
33
  name: 'endContent',
26
34
  type: 'ReactNode',
27
- description: 'Content rendered at the trailing end of the input, after the spinner. Use for clear buttons or keyboard shortcut hints.',
35
+ description:
36
+ 'Content rendered at the trailing end of the input, after the spinner. Use for clear buttons or keyboard shortcut hints.',
28
37
  slotElements: [
29
38
  {
30
39
  __element: 'Icon',
@@ -44,17 +53,20 @@ export const docs = {
44
53
  {
45
54
  name: 'value',
46
55
  type: 'string',
47
- description: 'Search value. When omitted inside CommandPalette, reads from context.',
56
+ description:
57
+ 'Search value. When omitted inside CommandPalette, reads from context.',
48
58
  },
49
59
  {
50
60
  name: 'onValueChange',
51
61
  type: '(value: string) => void',
52
- description: 'Called when search value changes. When omitted inside CommandPalette, writes to context.',
62
+ description:
63
+ 'Called when search value changes. When omitted inside CommandPalette, writes to context.',
53
64
  },
54
65
  {
55
66
  name: 'xstyle',
56
67
  type: 'StyleXStyles',
57
- description: 'StyleX styles for layout customization. Must be a stylex.create() value.',
68
+ description:
69
+ 'StyleX styles for layout customization. Must be a stylex.create() value.',
58
70
  },
59
71
  ],
60
72
  playground: {
@@ -69,9 +81,11 @@ export const docsZh = {
69
81
  name: 'CommandPaletteInput',
70
82
  isHiddenFromOverview: true,
71
83
  displayName: 'Command Palette Input',
72
- description: '搜索输入插槽。挂载时自动聚焦。在 CommandPalette 内使用时连接到上下文。',
84
+ description:
85
+ '搜索输入插槽。挂载时自动聚焦。在 CommandPalette 内使用时连接到上下文。',
73
86
  propDescriptions: {
74
87
  placeholder: '输入框的占位文本。',
88
+ label: '组合框输入的无障碍标签,供屏幕阅读器朗读。省略时回退到占位文本。',
75
89
  hasAutoFocus: '挂载时自动聚焦输入框。内联命令面板中自动禁用。',
76
90
  endContent: '渲染在输入框末尾的内容,位于加载指示器之后。',
77
91
  value: '搜索值。在 CommandPalette 内省略时从上下文读取。',
@@ -84,13 +98,16 @@ export const docsDense = {
84
98
  name: 'CommandPaletteInput',
85
99
  isHiddenFromOverview: true,
86
100
  displayName: 'Command Palette Input',
87
- description: 'search input; auto-focus on mount; wires to context inside CommandPalette',
101
+ description:
102
+ 'search input; auto-focus on mount; wires to context inside CommandPalette',
88
103
  propDescriptions: {
89
104
  placeholder: 'input placeholder text',
105
+ label: 'accessible label for the combobox; falls back to placeholder',
90
106
  hasAutoFocus: 'auto-focus on mount; auto-disabled in inline mode',
91
107
  endContent: 'trailing content after spinner',
92
108
  value: 'search value; reads context when omitted inside palette',
93
- onValueChange: 'called on change; writes context when omitted inside palette',
109
+ onValueChange:
110
+ 'called on change; writes context when omitted inside palette',
94
111
  xstyle: 'StyleX layout styles; must be stylex.create() value',
95
112
  },
96
113
  };
@@ -32,6 +32,40 @@ describe('CommandPaletteInput', () => {
32
32
  expect(screen.getByRole('combobox')).toBeInTheDocument();
33
33
  });
34
34
 
35
+ it('has an accessible name by default', () => {
36
+ render(<CommandPaletteInput />);
37
+ expect(screen.getByRole('combobox')).toHaveAttribute(
38
+ 'aria-label',
39
+ 'Search…',
40
+ );
41
+ });
42
+
43
+ it('uses the label prop as the accessible name', () => {
44
+ render(<CommandPaletteInput label="Search commands" />);
45
+ const input = screen.getByRole('combobox');
46
+ expect(input).toHaveAttribute('aria-label', 'Search commands');
47
+ // The label prop does not affect the visible placeholder
48
+ expect(input).toHaveAttribute('placeholder', 'Search…');
49
+ });
50
+
51
+ it('falls back to a custom placeholder for the accessible name', () => {
52
+ render(<CommandPaletteInput placeholder="Type a command..." />);
53
+ expect(screen.getByRole('combobox')).toHaveAttribute(
54
+ 'aria-label',
55
+ 'Type a command...',
56
+ );
57
+ });
58
+
59
+ it('lets a consumer-passed aria-label override the default', () => {
60
+ render(
61
+ <CommandPaletteInput label="Search commands" aria-label="Custom name" />,
62
+ );
63
+ expect(screen.getByRole('combobox')).toHaveAttribute(
64
+ 'aria-label',
65
+ 'Custom name',
66
+ );
67
+ });
68
+
35
69
  it('calls onValueChange when typing', () => {
36
70
  const handleChange = vi.fn();
37
71
  render(<CommandPaletteInput onValueChange={handleChange} />);
@@ -109,6 +109,13 @@ export interface CommandPaletteInputProps extends Omit<
109
109
  */
110
110
  placeholder?: string;
111
111
 
112
+ /**
113
+ * Accessible label for the combobox input, announced by screen readers.
114
+ * Falls back to the placeholder text (`'Search…'` by default), since a
115
+ * placeholder alone is not a reliable accessible name.
116
+ */
117
+ label?: string;
118
+
112
119
  /**
113
120
  * Whether to auto-focus the input when mounted.
114
121
  * @default true
@@ -149,6 +156,7 @@ export function CommandPaletteInput({
149
156
  value: controlledValue,
150
157
  onValueChange,
151
158
  placeholder: placeholderFromProps,
159
+ label,
152
160
  hasAutoFocus = true,
153
161
  endContent,
154
162
  onChange,
@@ -215,6 +223,9 @@ export function CommandPaletteInput({
215
223
  ? ctx.getItemId(ctx.highlightedIndex)
216
224
  : undefined
217
225
  }
226
+ // A placeholder alone is not a reliable accessible name; give the
227
+ // combobox an explicit one (consumer aria-label via rest props wins).
228
+ aria-label={label ?? placeholder}
218
229
  placeholder={placeholder}
219
230
  value={value}
220
231
  data-autofocus={effectiveAutoFocus || undefined}
@@ -43,7 +43,7 @@ const styles = stylex.create({
43
43
  backgroundColor: 'transparent',
44
44
  border: 'none',
45
45
  cursor: 'pointer',
46
- textAlign: 'left' as const,
46
+ textAlign: 'start' as const,
47
47
  outline: 'none',
48
48
  userSelect: 'none',
49
49
  },
@@ -611,3 +611,196 @@ describe('ContextMenu selectable items', () => {
611
611
  expect(onToggle).toHaveBeenCalledWith(true);
612
612
  });
613
613
  });
614
+
615
+ describe('ContextMenu keyboard access for menuitemradio/menuitemcheckbox (#3829)', () => {
616
+ it('arrow navigation reaches consumer-rendered menuitemradio and menuitemcheckbox items', () => {
617
+ render(
618
+ <ContextMenu
619
+ menuContent={
620
+ <>
621
+ <DropdownMenuItem label="Cut" onClick={() => {}} />
622
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
623
+ Newest
624
+ </div>
625
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
626
+ Archived
627
+ </div>
628
+ </>
629
+ }>
630
+ <div>Right-click me</div>
631
+ </ContextMenu>,
632
+ );
633
+
634
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
635
+ const menu = screen.getByRole('menu', {hidden: true});
636
+ screen.getByRole('menuitem', {name: 'Cut', hidden: true}).focus();
637
+
638
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
639
+ expect(
640
+ screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}),
641
+ ).toHaveFocus();
642
+
643
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
644
+ expect(
645
+ screen.getByRole('menuitemcheckbox', {name: 'Archived', hidden: true}),
646
+ ).toHaveFocus();
647
+ });
648
+
649
+ it('activates a focused menuitemradio with Enter and a menuitemcheckbox with Space', () => {
650
+ const onSelect = vi.fn();
651
+ const onToggle = vi.fn();
652
+ render(
653
+ <ContextMenu
654
+ menuContent={
655
+ <>
656
+ <DropdownMenuItem label="Cut" onClick={() => {}} />
657
+ <div
658
+ role="menuitemradio"
659
+ tabIndex={-1}
660
+ aria-checked="false"
661
+ onClick={onSelect}>
662
+ Newest
663
+ </div>
664
+ <div
665
+ role="menuitemcheckbox"
666
+ tabIndex={-1}
667
+ aria-checked="false"
668
+ onClick={onToggle}>
669
+ Archived
670
+ </div>
671
+ </>
672
+ }>
673
+ <div>Right-click me</div>
674
+ </ContextMenu>,
675
+ );
676
+
677
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
678
+ const menu = screen.getByRole('menu', {hidden: true});
679
+
680
+ screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}).focus();
681
+ fireEvent.keyDown(menu, {key: 'Enter'});
682
+ expect(onSelect).toHaveBeenCalledTimes(1);
683
+
684
+ screen
685
+ .getByRole('menuitemcheckbox', {name: 'Archived', hidden: true})
686
+ .focus();
687
+ fireEvent.keyDown(menu, {key: ' '});
688
+ expect(onToggle).toHaveBeenCalledTimes(1);
689
+ });
690
+
691
+ it('typeahead matches a menuitemradio label', () => {
692
+ render(
693
+ <ContextMenu
694
+ menuContent={
695
+ <>
696
+ <DropdownMenuItem label="Cut" onClick={() => {}} />
697
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
698
+ Newest
699
+ </div>
700
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
701
+ Archived
702
+ </div>
703
+ </>
704
+ }>
705
+ <div>Right-click me</div>
706
+ </ContextMenu>,
707
+ );
708
+
709
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
710
+ fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'n'});
711
+ expect(
712
+ screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}),
713
+ ).toHaveFocus();
714
+ });
715
+
716
+ it('typeahead matches a menuitemcheckbox label', () => {
717
+ render(
718
+ <ContextMenu
719
+ menuContent={
720
+ <>
721
+ <DropdownMenuItem label="Cut" onClick={() => {}} />
722
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
723
+ Newest
724
+ </div>
725
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
726
+ Archived
727
+ </div>
728
+ </>
729
+ }>
730
+ <div>Right-click me</div>
731
+ </ContextMenu>,
732
+ );
733
+
734
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
735
+ fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'a'});
736
+ expect(
737
+ screen.getByRole('menuitemcheckbox', {name: 'Archived', hidden: true}),
738
+ ).toHaveFocus();
739
+ });
740
+
741
+ it('typeahead skips an aria-disabled item and matches the next enabled label', () => {
742
+ render(
743
+ <ContextMenu
744
+ menuContent={
745
+ <>
746
+ <DropdownMenuItem label="Cut" onClick={() => {}} />
747
+ <div role="menuitemradio" tabIndex={-1} aria-disabled="true">
748
+ Newest
749
+ </div>
750
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
751
+ Nightly
752
+ </div>
753
+ </>
754
+ }>
755
+ <div>Right-click me</div>
756
+ </ContextMenu>,
757
+ );
758
+
759
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
760
+ // Anchor the search on 'Cut' so typeahead scans forward and meets the
761
+ // disabled 'Newest' (also an 'n' match) before the enabled 'Nightly'.
762
+ // This pins the `:not([aria-disabled="true"])` in MENU_ITEM_SELECTOR: the
763
+ // menus never pass useTypeahead's `isDisabled` option, so that clause is
764
+ // the only thing keeping disabled rows out of the typeahead list. An
765
+ // arrow-key test cannot cover it — useListFocus re-filters disabled items
766
+ // independently, so arrow navigation is guarded twice over.
767
+ // The disabled row keeps tabIndex={-1} on purpose: it stays focusable, so
768
+ // the selector clause is the sole reason focus skips it.
769
+ screen.getByRole('menuitem', {name: 'Cut', hidden: true}).focus();
770
+ fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'n'});
771
+ expect(
772
+ screen.getByRole('menuitemcheckbox', {name: 'Nightly', hidden: true}),
773
+ ).toHaveFocus();
774
+ });
775
+
776
+ it('skips aria-disabled menuitemradio and menuitemcheckbox items during arrow navigation', () => {
777
+ render(
778
+ <ContextMenu
779
+ menuContent={
780
+ <>
781
+ <DropdownMenuItem label="Cut" onClick={() => {}} />
782
+ <div role="menuitemradio" tabIndex={-1} aria-disabled="true">
783
+ Newest
784
+ </div>
785
+ <div role="menuitemcheckbox" tabIndex={-1} aria-disabled="true">
786
+ Archived
787
+ </div>
788
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
789
+ Oldest
790
+ </div>
791
+ </>
792
+ }>
793
+ <div>Right-click me</div>
794
+ </ContextMenu>,
795
+ );
796
+
797
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
798
+ const menu = screen.getByRole('menu', {hidden: true});
799
+ screen.getByRole('menuitem', {name: 'Cut', hidden: true}).focus();
800
+
801
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
802
+ expect(
803
+ screen.getByRole('menuitemradio', {name: 'Oldest', hidden: true}),
804
+ ).toHaveFocus();
805
+ });
806
+ });
@@ -115,6 +115,13 @@ export const docs = {
115
115
  description:
116
116
  'Status indicator object for error, warning, or success states with a message.',
117
117
  },
118
+ {
119
+ name: 'statusVariant',
120
+ type: "'attached' | 'detached'",
121
+ description:
122
+ 'How the status message is placed relative to the input. attached overlaps directly below the input (bordered treatment); detached floats below as a separate element with spacing.',
123
+ default: "'attached'",
124
+ },
118
125
  {
119
126
  name: 'labelTooltip',
120
127
  type: 'string',
@@ -135,6 +142,13 @@ export const docs = {
135
142
  'Number of months displayed simultaneously in the calendar popover.',
136
143
  default: '1',
137
144
  },
145
+ {
146
+ name: 'format',
147
+ type: "'date' | 'date_long' | 'date_weekday' | 'system_date' | ((value: ISODateString) => string)",
148
+ description:
149
+ "How the committed date value is displayed. Named values are reused from Timestamp's format vocabulary: 'date' shows 'Mar 21, 2026', 'date_long' shows 'March 21, 2026', 'date_weekday' shows 'Wed, Mar 21, 2026', 'system_date' shows '2026-03-21'. A function receives the ISO value and returns a custom string. Applies only to the committed value, never to text being typed.",
150
+ default: "'date_long'",
151
+ },
138
152
  {
139
153
  name: 'xstyle',
140
154
  type: 'StyleXStyles',
@@ -377,6 +391,13 @@ export const docsZh = {
377
391
  type: "{type: 'warning' | 'error' | 'success', message?: string}",
378
392
  description: '错误、警告或成功状态的状态指示对象,附带消息。',
379
393
  },
394
+ {
395
+ name: 'statusVariant',
396
+ type: "'attached' | 'detached'",
397
+ description:
398
+ '状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
399
+ default: "'attached'",
400
+ },
380
401
  {
381
402
  name: 'labelTooltip',
382
403
  type: 'string',
@@ -388,6 +409,13 @@ export const docsZh = {
388
409
  description: '日历弹出层中同时显示的月份数量。',
389
410
  default: '1',
390
411
  },
412
+ {
413
+ name: 'format',
414
+ type: "'date' | 'date_long' | 'date_weekday' | 'system_date' | ((value: ISODateString) => string)",
415
+ description:
416
+ "已选日期的显示格式。命名值复用 Timestamp 的格式词汇:'date' 显示 'Mar 21, 2026','date_long' 显示 'March 21, 2026','date_weekday' 显示 'Wed, Mar 21, 2026','system_date' 显示 '2026-03-21'。函数接收 ISO 值并返回自定义字符串。仅作用于已提交的值,不影响正在输入的文本。",
417
+ default: "'date_long'",
418
+ },
391
419
  {
392
420
  name: 'xstyle',
393
421
  type: 'StyleXStyles',
@@ -478,9 +506,12 @@ export const docsDense = {
478
506
  placeholder: 'placeholder text in input',
479
507
  size: 'input control size',
480
508
  status: 'error/warning/success status w/ message',
509
+ statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
481
510
  labelTooltip: 'tooltip text via info icon at label end',
482
511
  hasClear: 'Shows clear button when date is set. Clears value on click.',
483
512
  numberOfMonths: 'months shown simultaneously in calendar popover',
513
+ format:
514
+ "committed-value display: 'date_long' (default, March 21, 2026), 'date' (Mar 21, 2026), 'date_weekday' (Wed, Mar 21, 2026), 'system_date' (2026-03-21), or (iso)=>string; reuses Timestamp vocabulary. Committed value only, not while typing.",
484
515
  xstyle: 'StyleX styles for layout; must be stylex.create() value',
485
516
  },
486
517
  };