@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697

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 (635) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.d.ts +0 -2
  6. package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
  7. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
  8. package/dist/AppShell/AppShell.d.ts +1 -1
  9. package/dist/AppShell/AppShell.d.ts.map +1 -1
  10. package/dist/AppShell/AppShell.js +55 -53
  11. package/dist/AspectRatio/AspectRatio.d.ts +48 -10
  12. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  13. package/dist/AspectRatio/AspectRatio.js +33 -12
  14. package/dist/AspectRatio/index.d.ts +1 -1
  15. package/dist/AspectRatio/index.d.ts.map +1 -1
  16. package/dist/Avatar/Avatar.d.ts.map +1 -1
  17. package/dist/Avatar/Avatar.js +28 -26
  18. package/dist/Avatar/AvatarStatusDot.js +6 -6
  19. package/dist/AvatarGroup/AvatarGroup.js +6 -6
  20. package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
  21. package/dist/Badge/Badge.js +3 -3
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +32 -25
  24. package/dist/Blockquote/Blockquote.js +7 -7
  25. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  26. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  27. package/dist/Button/Button.js +19 -19
  28. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  29. package/dist/Calendar/Calendar.d.ts.map +1 -1
  30. package/dist/Calendar/Calendar.js +68 -48
  31. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  32. package/dist/Calendar/styles.d.ts +2 -2
  33. package/dist/Calendar/styles.d.ts.map +1 -1
  34. package/dist/Calendar/styles.js +2 -2
  35. package/dist/Card/Card.d.ts +4 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +18 -10
  38. package/dist/Carousel/Carousel.d.ts.map +1 -1
  39. package/dist/Carousel/Carousel.js +24 -21
  40. package/dist/Center/Center.js +3 -3
  41. package/dist/Chat/ChatComposer.js +23 -23
  42. package/dist/Chat/ChatComposerDrawer.js +14 -14
  43. package/dist/Chat/ChatComposerInput.d.ts +1 -1
  44. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  45. package/dist/Chat/ChatComposerInput.js +27 -15
  46. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  47. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatDictationButton.js +13 -11
  49. package/dist/Chat/ChatLayout.js +17 -17
  50. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  51. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  52. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  53. package/dist/Chat/ChatMessage.js +12 -12
  54. package/dist/Chat/ChatMessageBubble.js +7 -7
  55. package/dist/Chat/ChatMessageList.js +14 -14
  56. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  57. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  58. package/dist/Chat/ChatMessageMetadata.js +14 -12
  59. package/dist/Chat/ChatPastedTextToken.js +13 -13
  60. package/dist/Chat/ChatSendButton.js +3 -3
  61. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  62. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  63. package/dist/Chat/ChatSystemMessage.js +17 -17
  64. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  65. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  66. package/dist/Chat/ChatTokenizedText.js +24 -15
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +81 -74
  69. package/dist/Chat/index.d.ts +1 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  72. package/dist/Chat/useTriggerMenu.js +15 -15
  73. package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
  74. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  75. package/dist/CheckboxInput/CheckboxInput.js +25 -23
  76. package/dist/CheckboxList/CheckboxList.js +9 -9
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  80. package/dist/Citation/Citation.js +10 -10
  81. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  82. package/dist/ClickableCard/ClickableCard.js +32 -9
  83. package/dist/Code/Code.js +3 -3
  84. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  85. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  86. package/dist/CodeBlock/CodeBlock.js +88 -52
  87. package/dist/Collapsible/Collapsible.d.ts +9 -3
  88. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  89. package/dist/Collapsible/Collapsible.js +109 -22
  90. package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
  91. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  92. package/dist/Collapsible/CollapsibleGroup.js +64 -12
  93. package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  95. package/dist/Collapsible/CollapsibleGroupContext.js +26 -3
  96. package/dist/Collapsible/index.d.ts +1 -0
  97. package/dist/Collapsible/index.d.ts.map +1 -1
  98. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  99. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  100. package/dist/Collapsible/useCollapsible.js +20 -6
  101. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  102. package/dist/CommandPalette/CommandPalette.js +36 -34
  103. package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
  104. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  105. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  106. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  107. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  108. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  109. package/dist/ContextMenu/ContextMenu.d.ts +7 -2
  110. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  111. package/dist/ContextMenu/ContextMenu.js +76 -43
  112. package/dist/DateInput/DateInput.js +18 -18
  113. package/dist/DateRangeInput/DateRangeInput.js +21 -21
  114. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  115. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  116. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  117. package/dist/DateTimeInput/index.d.ts +1 -1
  118. package/dist/DateTimeInput/index.d.ts.map +1 -1
  119. package/dist/Dialog/Dialog.js +9 -9
  120. package/dist/Dialog/DialogHeader.js +16 -16
  121. package/dist/Dialog/useImperativeDialog.js +3 -3
  122. package/dist/Divider/Divider.js +7 -7
  123. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  124. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  125. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  126. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  127. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  128. package/dist/EmptyState/EmptyState.js +9 -9
  129. package/dist/Field/Field.js +17 -17
  130. package/dist/Field/FieldLabel.js +15 -15
  131. package/dist/Field/InputClearButton.js +5 -5
  132. package/dist/FieldStatus/FieldStatus.js +3 -3
  133. package/dist/FileInput/FileInput.js +29 -29
  134. package/dist/FormLayout/FormLayout.js +5 -5
  135. package/dist/Grid/Grid.d.ts +4 -3
  136. package/dist/Grid/Grid.d.ts.map +1 -1
  137. package/dist/Grid/Grid.js +29 -12
  138. package/dist/Grid/GridSpan.js +3 -3
  139. package/dist/HStack/HStack.js +3 -3
  140. package/dist/Heading/Heading.js +10 -10
  141. package/dist/HoverCard/HoverCard.js +9 -9
  142. package/dist/HoverCard/useHoverCard.d.ts +5 -1
  143. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  144. package/dist/HoverCard/useHoverCard.js +3 -3
  145. package/dist/Icon/Icon.d.ts.map +1 -1
  146. package/dist/Icon/Icon.js +16 -12
  147. package/dist/Icon/defaultIcons.js +116 -116
  148. package/dist/IconButton/IconButton.js +3 -3
  149. package/dist/InputGroup/InputGroup.js +11 -11
  150. package/dist/InputGroup/InputGroupText.js +3 -3
  151. package/dist/Item/Item.js +18 -18
  152. package/dist/Kbd/Kbd.js +5 -5
  153. package/dist/Layer/LayerProvider.js +7 -7
  154. package/dist/Layer/useLayer.d.ts +29 -2
  155. package/dist/Layer/useLayer.d.ts.map +1 -1
  156. package/dist/Layer/useLayer.js +44 -31
  157. package/dist/Layout/Layout.js +21 -21
  158. package/dist/Layout/LayoutContent.js +3 -3
  159. package/dist/Layout/LayoutFooter.js +5 -5
  160. package/dist/Layout/LayoutHeader.js +5 -5
  161. package/dist/Layout/LayoutPanel.js +3 -3
  162. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  163. package/dist/Lightbox/Lightbox.js +55 -31
  164. package/dist/Lightbox/useLightbox.d.ts +0 -1
  165. package/dist/Lightbox/useLightbox.d.ts.map +1 -1
  166. package/dist/Lightbox/useLightbox.js +3 -4
  167. package/dist/Link/Link.d.ts +0 -2
  168. package/dist/Link/Link.d.ts.map +1 -1
  169. package/dist/Link/Link.js +15 -17
  170. package/dist/Link/LinkProvider.js +3 -3
  171. package/dist/Link/useLinkify.js +3 -3
  172. package/dist/List/List.js +11 -11
  173. package/dist/List/ListItem.js +11 -11
  174. package/dist/Markdown/Markdown.d.ts.map +1 -1
  175. package/dist/Markdown/Markdown.js +102 -102
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.d.ts +1 -1
  179. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  180. package/dist/MobileNav/MobileNav.js +26 -23
  181. package/dist/MobileNav/MobileNavToggle.js +5 -5
  182. package/dist/MoreMenu/MoreMenu.js +3 -3
  183. package/dist/MultiSelector/MultiSelector.js +56 -56
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.d.ts +0 -3
  194. package/dist/Overlay/useOverlay.d.ts.map +1 -1
  195. package/dist/Overlay/useOverlay.js +3 -6
  196. package/dist/Pagination/Pagination.d.ts +1 -1
  197. package/dist/Pagination/Pagination.d.ts.map +1 -1
  198. package/dist/Pagination/Pagination.js +125 -72
  199. package/dist/Popover/Popover.js +16 -16
  200. package/dist/Popover/usePopover.js +7 -7
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +110 -92
  203. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  204. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  205. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  206. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  207. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  208. package/dist/ProgressBar/ProgressBar.js +25 -18
  209. package/dist/RadioList/RadioList.js +7 -7
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +24 -21
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.js +46 -46
  224. package/dist/Selector/SelectorOption.js +3 -3
  225. package/dist/SideNav/SideNav.d.ts.map +1 -1
  226. package/dist/SideNav/SideNav.js +38 -34
  227. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  228. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  229. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  230. package/dist/SideNav/SideNavHeading.js +87 -87
  231. package/dist/SideNav/SideNavItem.js +42 -42
  232. package/dist/SideNav/SideNavSection.d.ts +1 -1
  233. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  234. package/dist/SideNav/SideNavSection.js +18 -16
  235. package/dist/Skeleton/Skeleton.js +3 -3
  236. package/dist/Slider/Slider.js +23 -23
  237. package/dist/Spinner/Spinner.js +9 -9
  238. package/dist/StatusDot/StatusDot.js +5 -5
  239. package/dist/Switch/Switch.d.ts +8 -4
  240. package/dist/Switch/Switch.d.ts.map +1 -1
  241. package/dist/Switch/Switch.js +34 -29
  242. package/dist/TabList/Tab.js +18 -18
  243. package/dist/TabList/TabList.js +5 -5
  244. package/dist/TabList/TabMenu.d.ts.map +1 -1
  245. package/dist/TabList/TabMenu.js +57 -30
  246. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  247. package/dist/Table/BaseTable.d.ts.map +1 -1
  248. package/dist/Table/BaseTable.js +50 -39
  249. package/dist/Table/Table.js +7 -7
  250. package/dist/Table/TableBody.d.ts +1 -1
  251. package/dist/Table/TableBody.d.ts.map +1 -1
  252. package/dist/Table/TableBody.js +9 -5
  253. package/dist/Table/TableCell.js +3 -3
  254. package/dist/Table/TableFooter.d.ts +1 -1
  255. package/dist/Table/TableFooter.d.ts.map +1 -1
  256. package/dist/Table/TableFooter.js +9 -5
  257. package/dist/Table/TableHeader.d.ts +1 -1
  258. package/dist/Table/TableHeader.d.ts.map +1 -1
  259. package/dist/Table/TableHeader.js +9 -5
  260. package/dist/Table/TableHeaderCell.js +3 -3
  261. package/dist/Table/TableRow.js +5 -5
  262. package/dist/Table/index.d.ts +2 -0
  263. package/dist/Table/index.d.ts.map +1 -1
  264. package/dist/Table/index.js +1 -0
  265. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  266. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  267. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  268. package/dist/Table/plugins/groupedRows/index.d.ts +3 -0
  269. package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
  270. package/dist/Table/plugins/groupedRows/index.js +3 -0
  271. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
  272. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
  273. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
  278. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
  279. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  280. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  281. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  282. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  283. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  284. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  285. package/dist/Table/tableContextMenu.js +9 -9
  286. package/dist/Text/Text.js +10 -10
  287. package/dist/TextArea/TextArea.js +14 -14
  288. package/dist/TextInput/TextInput.js +15 -15
  289. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  290. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  291. package/dist/Thumbnail/Thumbnail.js +30 -29
  292. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  293. package/dist/TimeInput/TimeInput.js +26 -21
  294. package/dist/Timestamp/Timestamp.d.ts +1 -1
  295. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  296. package/dist/Timestamp/Timestamp.js +37 -26
  297. package/dist/Toast/Toast.d.ts.map +1 -1
  298. package/dist/Toast/Toast.js +25 -17
  299. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  300. package/dist/Toast/ToastViewport.js +23 -11
  301. package/dist/Toast/useToast.d.ts.map +1 -1
  302. package/dist/Toast/useToast.js +44 -4
  303. package/dist/ToggleButton/ToggleButton.js +12 -12
  304. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  305. package/dist/Token/Token.js +21 -21
  306. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  307. package/dist/Tokenizer/Tokenizer.js +36 -34
  308. package/dist/Toolbar/Toolbar.js +18 -18
  309. package/dist/Tooltip/Tooltip.js +11 -11
  310. package/dist/Tooltip/useTooltip.d.ts +5 -1
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +3 -3
  313. package/dist/TopNav/TopNav.js +32 -32
  314. package/dist/TopNav/TopNavHeading.js +67 -67
  315. package/dist/TopNav/TopNavItem.js +5 -5
  316. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  319. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  320. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  321. package/dist/TopNav/TopNavMenu.js +32 -32
  322. package/dist/TreeList/TreeList.js +8 -8
  323. package/dist/TreeList/TreeListBranches.js +11 -11
  324. package/dist/TreeList/TreeListItem.js +30 -30
  325. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  326. package/dist/Typeahead/BaseTypeahead.js +23 -20
  327. package/dist/Typeahead/Typeahead.js +12 -12
  328. package/dist/Typeahead/TypeaheadItem.js +10 -10
  329. package/dist/VStack/VStack.js +3 -3
  330. package/dist/VisuallyHidden/VisuallyHidden.d.ts +0 -3
  331. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  332. package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
  333. package/dist/astryx.css +7 -0
  334. package/dist/astryx.umd.js +63 -63
  335. package/dist/astryx.umd.js.map +4 -4
  336. package/dist/docs-types.d.ts +8 -2
  337. package/dist/docs-types.d.ts.map +1 -1
  338. package/dist/hooks/focusableSelector.d.ts +1 -1
  339. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  340. package/dist/hooks/focusableSelector.js +1 -1
  341. package/dist/hooks/index.d.ts +2 -0
  342. package/dist/hooks/index.d.ts.map +1 -1
  343. package/dist/hooks/index.js +1 -0
  344. package/dist/hooks/useFocusTrap.d.ts +3 -0
  345. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  346. package/dist/hooks/useFocusTrap.js +38 -1
  347. package/dist/hooks/useHotkeys.d.ts +51 -0
  348. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  349. package/dist/hooks/useHotkeys.js +160 -0
  350. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  351. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  352. package/dist/hooks/useInteractiveRole.js +6 -2
  353. package/dist/hooks/useKeyboardHint.js +9 -9
  354. package/dist/hooks/useStreamingText.d.ts +3 -1
  355. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  356. package/dist/hooks/useStreamingText.js +14 -5
  357. package/dist/theme/MediaTheme.js +3 -3
  358. package/dist/theme/Theme.js +7 -7
  359. package/dist/theme/defineTheme.d.ts +1 -1
  360. package/dist/theme/defineTheme.d.ts.map +1 -1
  361. package/dist/theme/expandColorScale.d.ts.map +1 -1
  362. package/dist/theme/expandColorScale.js +10 -3
  363. package/dist/theme/hct.d.ts +0 -15
  364. package/dist/theme/hct.d.ts.map +1 -1
  365. package/dist/theme/hct.js +9 -9
  366. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  367. package/dist/theme/tokens.d.ts +10 -2
  368. package/dist/theme/tokens.d.ts.map +1 -1
  369. package/dist/theme/tokens.js +220 -4
  370. package/dist/theme/useTheme.d.ts +3 -2
  371. package/dist/theme/useTheme.d.ts.map +1 -1
  372. package/dist/theme/useTheme.js +73 -6
  373. package/dist/utils/color.d.ts +42 -0
  374. package/dist/utils/color.d.ts.map +1 -0
  375. package/dist/utils/color.js +150 -0
  376. package/dist/utils/composeEventHandlers.d.ts +30 -0
  377. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  378. package/dist/utils/composeEventHandlers.js +40 -0
  379. package/dist/utils/index.d.ts +3 -0
  380. package/dist/utils/index.d.ts.map +1 -1
  381. package/dist/utils/index.js +3 -1
  382. package/dist/utils/timeParser.d.ts.map +1 -1
  383. package/dist/utils/timeParser.js +8 -5
  384. package/package.json +4 -4
  385. package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
  386. package/src/AlertDialog/AlertDialog.tsx +2 -0
  387. package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
  388. package/src/AppShell/AppShell.tsx +2 -0
  389. package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
  390. package/src/AspectRatio/AspectRatio.test.tsx +142 -1
  391. package/src/AspectRatio/AspectRatio.tsx +70 -10
  392. package/src/AspectRatio/index.ts +5 -1
  393. package/src/Avatar/Avatar.doc.mjs +11 -0
  394. package/src/Avatar/Avatar.test.tsx +32 -1
  395. package/src/Avatar/Avatar.tsx +14 -22
  396. package/src/Avatar/AvatarStatusDot.tsx +2 -2
  397. package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
  398. package/src/AvatarGroup/AvatarGroup.tsx +2 -2
  399. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
  400. package/src/Banner/Banner.doc.mjs +8 -0
  401. package/src/Banner/Banner.test.tsx +38 -0
  402. package/src/Banner/Banner.tsx +8 -1
  403. package/src/Calendar/Calendar.doc.mjs +1 -1
  404. package/src/Calendar/Calendar.test.tsx +122 -17
  405. package/src/Calendar/Calendar.tsx +26 -5
  406. package/src/Calendar/dayCellUtils.ts +3 -1
  407. package/src/Calendar/styles.ts +12 -2
  408. package/src/Card/Card.doc.mjs +1 -1
  409. package/src/Card/Card.tsx +16 -6
  410. package/src/Carousel/Carousel.doc.mjs +12 -12
  411. package/src/Carousel/Carousel.test.tsx +13 -0
  412. package/src/Carousel/Carousel.tsx +4 -2
  413. package/src/Chat/Chat.doc.mjs +1 -1
  414. package/src/Chat/ChatComposerInput.test.tsx +27 -1
  415. package/src/Chat/ChatComposerInput.tsx +20 -15
  416. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  417. package/src/Chat/ChatDictationButton.tsx +4 -4
  418. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  419. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  420. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  421. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  422. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  423. package/src/Chat/ChatSystemMessage.tsx +7 -7
  424. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  425. package/src/Chat/ChatTokenizedText.tsx +15 -8
  426. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  427. package/src/Chat/ChatToolCalls.tsx +10 -12
  428. package/src/Chat/index.ts +1 -4
  429. package/src/Chat/useTriggerMenu.tsx +1 -4
  430. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
  431. package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
  432. package/src/CheckboxInput/CheckboxInput.tsx +2 -0
  433. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  434. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  435. package/src/Citation/Citation.doc.mjs +5 -0
  436. package/src/ClickableCard/ClickableCard.tsx +45 -2
  437. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  438. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  439. package/src/CodeBlock/CodeBlock.tsx +62 -4
  440. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  441. package/src/Collapsible/Collapsible.test.tsx +403 -0
  442. package/src/Collapsible/Collapsible.tsx +85 -10
  443. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  444. package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
  445. package/src/Collapsible/CollapsibleGroup.tsx +97 -9
  446. package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
  447. package/src/Collapsible/index.ts +1 -0
  448. package/src/Collapsible/useCollapsible.ts +20 -6
  449. package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
  450. package/src/CommandPalette/CommandPalette.tsx +5 -3
  451. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  452. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  453. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  454. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  455. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  456. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  457. package/src/ContextMenu/ContextMenu.test.tsx +87 -0
  458. package/src/ContextMenu/ContextMenu.tsx +87 -28
  459. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  460. package/src/DateInput/DateInput.test.tsx +11 -20
  461. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
  462. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  463. package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
  464. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  465. package/src/DateTimeInput/DateTimeInput.tsx +8 -2
  466. package/src/DateTimeInput/index.ts +1 -0
  467. package/src/Dialog/Dialog.doc.mjs +4 -0
  468. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  469. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  470. package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
  471. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  472. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  473. package/src/Field/Field.test.tsx +1 -4
  474. package/src/Field/FieldLabel.test.tsx +2 -2
  475. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  476. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  477. package/src/Grid/Grid.test.tsx +43 -18
  478. package/src/Grid/Grid.tsx +26 -9
  479. package/src/HoverCard/HoverCard.doc.mjs +6 -6
  480. package/src/HoverCard/useHoverCard.doc.mjs +5 -5
  481. package/src/HoverCard/useHoverCard.tsx +9 -2
  482. package/src/Icon/Icon.test.tsx +41 -29
  483. package/src/Icon/Icon.tsx +6 -2
  484. package/src/InputGroup/InputGroup.doc.mjs +1 -0
  485. package/src/InputGroup/InputGroup.tsx +2 -2
  486. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  487. package/src/Item/Item.tsx +1 -1
  488. package/src/Layer/useLayer.doc.mjs +2 -2
  489. package/src/Layer/useLayer.test.tsx +221 -2
  490. package/src/Layer/useLayer.tsx +69 -30
  491. package/src/Layout/Layout.test.tsx +285 -0
  492. package/src/Layout/LayoutContent.doc.mjs +12 -0
  493. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  494. package/src/Layout/LayoutSlots.test.tsx +364 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Lightbox/useLightbox.tsx +0 -1
  499. package/src/Link/Link.tsx +0 -2
  500. package/src/Markdown/Markdown.tsx +9 -7
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/MobileNav/MobileNav.test.tsx +56 -0
  503. package/src/MobileNav/MobileNav.tsx +13 -8
  504. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  505. package/src/NumberInput/NumberInput.test.tsx +48 -3
  506. package/src/NumberInput/NumberInput.tsx +32 -15
  507. package/src/Outline/Outline.doc.mjs +2 -0
  508. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  509. package/src/OverflowList/OverflowList.test.tsx +416 -0
  510. package/src/Overlay/Overlay.doc.mjs +6 -0
  511. package/src/Overlay/Overlay.test.tsx +356 -0
  512. package/src/Overlay/useOverlay.tsx +0 -3
  513. package/src/Pagination/Pagination.test.tsx +162 -0
  514. package/src/Pagination/Pagination.tsx +80 -26
  515. package/src/Popover/Popover.doc.mjs +6 -6
  516. package/src/Popover/Popover.test.tsx +65 -0
  517. package/src/Popover/usePopover.doc.mjs +1 -1
  518. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
  522. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  523. package/src/ProgressBar/ProgressBar.tsx +12 -5
  524. package/src/RadioList/RadioList.test.tsx +19 -0
  525. package/src/RadioList/RadioListItem.tsx +9 -4
  526. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  527. package/src/Resizable/ResizeHandle.tsx +22 -4
  528. package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
  529. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  530. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  531. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  532. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  533. package/src/Selector/Selector.test.tsx +27 -1
  534. package/src/SideNav/SideNav.doc.mjs +7 -1
  535. package/src/SideNav/SideNav.test.tsx +66 -0
  536. package/src/SideNav/SideNav.tsx +6 -2
  537. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  538. package/src/SideNav/SideNavSection.tsx +6 -4
  539. package/src/SizeContext/SizeContext.test.tsx +226 -0
  540. package/src/Switch/Switch.doc.mjs +7 -7
  541. package/src/Switch/Switch.test.tsx +102 -3
  542. package/src/Switch/Switch.tsx +20 -7
  543. package/src/TabList/TabList.test.tsx +185 -1
  544. package/src/TabList/TabMenu.tsx +45 -9
  545. package/src/Table/BaseTable.tsx +13 -2
  546. package/src/Table/Table.doc.mjs +6 -1
  547. package/src/Table/Table.test.tsx +87 -0
  548. package/src/Table/TableBody.tsx +15 -2
  549. package/src/Table/TableFooter.tsx +15 -2
  550. package/src/Table/TableHeader.tsx +15 -2
  551. package/src/Table/index.ts +5 -0
  552. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  553. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  554. package/src/Table/plugins/groupedRows/index.ts +7 -0
  555. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
  556. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
  557. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  558. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  559. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
  560. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  561. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  562. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  563. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  564. package/src/Table/useTableGroupedRows.doc.mjs +71 -0
  565. package/src/TextArea/TextArea.test.tsx +3 -3
  566. package/src/TextInput/TextInput.test.tsx +3 -3
  567. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  568. package/src/Thumbnail/Thumbnail.tsx +4 -2
  569. package/src/TimeInput/TimeInput.test.tsx +37 -0
  570. package/src/TimeInput/TimeInput.tsx +11 -1
  571. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  572. package/src/Timestamp/Timestamp.test.tsx +52 -0
  573. package/src/Timestamp/Timestamp.tsx +30 -16
  574. package/src/Toast/Toast.tsx +11 -3
  575. package/src/Toast/ToastViewport.test.tsx +64 -0
  576. package/src/Toast/ToastViewport.tsx +12 -0
  577. package/src/Toast/useToast.test.tsx +258 -0
  578. package/src/Toast/useToast.tsx +41 -0
  579. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  580. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  581. package/src/Tokenizer/Tokenizer.test.tsx +54 -0
  582. package/src/Tokenizer/Tokenizer.tsx +5 -4
  583. package/src/Tooltip/Tooltip.doc.mjs +6 -6
  584. package/src/Tooltip/useTooltip.doc.mjs +5 -5
  585. package/src/Tooltip/useTooltip.tsx +12 -2
  586. package/src/TopNav/TopNav.doc.mjs +1 -1
  587. package/src/TopNav/TopNav.test.tsx +23 -7
  588. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  589. package/src/TreeList/TreeList.doc.mjs +2 -2
  590. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  591. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  592. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  593. package/src/Typeahead/Typeahead.test.tsx +45 -1
  594. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
  595. package/src/__tests__/TestIcon.tsx +26 -0
  596. package/src/__tests__/fastRoleQueries.ts +66 -0
  597. package/src/docPropReferences.test.ts +178 -0
  598. package/src/docs-types.ts +9 -1
  599. package/src/hooks/focusableSelector.ts +1 -1
  600. package/src/hooks/index.ts +3 -0
  601. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  602. package/src/hooks/useFocusTrap.test.tsx +149 -1
  603. package/src/hooks/useFocusTrap.ts +50 -1
  604. package/src/hooks/useHotkeys.doc.mjs +52 -0
  605. package/src/hooks/useHotkeys.test.ts +245 -0
  606. package/src/hooks/useHotkeys.ts +203 -0
  607. package/src/hooks/useInteractiveRole.ts +12 -4
  608. package/src/hooks/useStreamingText.test.ts +54 -19
  609. package/src/hooks/useStreamingText.ts +16 -5
  610. package/src/hooks/useTreeFocus.test.tsx +1 -3
  611. package/src/reset.css +29 -0
  612. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  613. package/src/theme/defineTheme.ts +4 -13
  614. package/src/theme/derivedVarRegistry.test.ts +2 -2
  615. package/src/theme/expandColorScale.test.ts +29 -0
  616. package/src/theme/expandColorScale.ts +11 -6
  617. package/src/theme/hct.ts +9 -17
  618. package/src/theme/themingTargets.test.ts +353 -0
  619. package/src/theme/tokens.test.ts +182 -9
  620. package/src/theme/tokens.ts +239 -4
  621. package/src/theme/useTheme.test.tsx +126 -2
  622. package/src/theme/useTheme.ts +87 -6
  623. package/src/utils/color.test.ts +133 -0
  624. package/src/utils/color.ts +148 -0
  625. package/src/utils/composeEventHandlers.test.ts +71 -0
  626. package/src/utils/composeEventHandlers.ts +44 -0
  627. package/src/utils/index.ts +4 -0
  628. package/src/utils/mergeProps.test.ts +166 -0
  629. package/src/utils/sharedResizeObserver.test.ts +2 -2
  630. package/src/utils/timeParser.test.ts +13 -0
  631. package/src/utils/timeParser.ts +8 -5
  632. package/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
  633. package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
  634. package/dist/Carousel/carousel.markers.stylex.js +0 -12
  635. package/src/Carousel/carousel.markers.stylex.ts +0 -10
@@ -0,0 +1,43 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect} from 'vitest';
4
+ import {render, screen} from '@testing-library/react';
5
+ import {ChatDictationButton} from './ChatDictationButton';
6
+ import type {UseSpeechRecognitionReturn} from './useSpeechRecognition';
7
+
8
+ const dictation: UseSpeechRecognitionReturn = {
9
+ isSupported: true,
10
+ isListening: false,
11
+ isSpeaking: false,
12
+ volume: 0,
13
+ bands: [0, 0, 0, 0, 0],
14
+ rawBands: [0, 0, 0, 0, 0],
15
+ interimTranscript: '',
16
+ start: () => {},
17
+ stop: () => {},
18
+ abort: () => {},
19
+ toggle: () => {},
20
+ };
21
+
22
+ describe('ChatDictationButton', () => {
23
+ it('renders a dictation button', () => {
24
+ render(
25
+ <ChatDictationButton dictation={dictation} data-testid="dictation" />,
26
+ );
27
+ expect(screen.getByTestId('dictation')).toBeTruthy();
28
+ });
29
+
30
+ it('forwards rest props (data-*, aria-*, id) to the root element', () => {
31
+ render(
32
+ <ChatDictationButton
33
+ dictation={dictation}
34
+ data-testid="dictation"
35
+ data-custom="x"
36
+ id="dictate-1"
37
+ />,
38
+ );
39
+ const root = screen.getByTestId('dictation');
40
+ expect(root).toHaveAttribute('data-custom', 'x');
41
+ expect(root).toHaveAttribute('id', 'dictate-1');
42
+ });
43
+ });
@@ -105,6 +105,7 @@ export function ChatDictationButton({
105
105
  xstyle,
106
106
  className,
107
107
  style,
108
+ ...rest
108
109
  }: ChatDictationButtonProps) {
109
110
  if (isHiddenWhenUnsupported && !dictation.isSupported) {
110
111
  return null;
@@ -130,7 +131,8 @@ export function ChatDictationButton({
130
131
  return (
131
132
  <span
132
133
  ref={ref}
133
- {...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}>
134
+ {...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}
135
+ {...rest}>
134
136
  {isListening && (
135
137
  <span
136
138
  aria-hidden
@@ -161,9 +163,7 @@ export function ChatDictationButton({
161
163
  aria-label={accessibleLabel}
162
164
  variant="ghost"
163
165
  size={size}
164
- icon={
165
- isListening ? undefined : <Icon icon="microphone" size={size} />
166
- }
166
+ icon={isListening ? undefined : <Icon icon="microphone" size={size} />}
167
167
  isIconOnly
168
168
  onClick={dictation.toggle}
169
169
  />
@@ -0,0 +1,33 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect} from 'vitest';
4
+ import {render, screen} from '@testing-library/react';
5
+ import {ChatLayoutScrollButton} from './ChatLayoutScrollButton';
6
+
7
+ describe('ChatLayoutScrollButton', () => {
8
+ it('renders a scroll button', () => {
9
+ render(
10
+ <ChatLayoutScrollButton
11
+ isVisible
12
+ onClick={() => {}}
13
+ data-testid="scroll"
14
+ />,
15
+ );
16
+ expect(screen.getByTestId('scroll')).toBeTruthy();
17
+ });
18
+
19
+ it('forwards rest props (data-*, aria-*, id) to the root element', () => {
20
+ render(
21
+ <ChatLayoutScrollButton
22
+ isVisible
23
+ onClick={() => {}}
24
+ data-testid="scroll"
25
+ data-custom="x"
26
+ id="scroll-1"
27
+ />,
28
+ );
29
+ const root = screen.getByTestId('scroll');
30
+ expect(root).toHaveAttribute('data-custom', 'x');
31
+ expect(root).toHaveAttribute('id', 'scroll-1');
32
+ });
33
+ });
@@ -118,11 +118,13 @@ export function ChatLayoutScrollButton({
118
118
  xstyle,
119
119
  className,
120
120
  style,
121
+ ...rest
121
122
  }: ChatLayoutScrollButtonProps) {
122
123
  return (
123
124
  <div
124
125
  ref={ref}
125
- {...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}>
126
+ {...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}
127
+ {...rest}>
126
128
  <div
127
129
  {...stylex.props(
128
130
  styles.container,
@@ -0,0 +1,32 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect} from 'vitest';
4
+ import {render, screen} from '@testing-library/react';
5
+ import {ChatMessageMetadata} from './ChatMessageMetadata';
6
+
7
+ describe('ChatMessageMetadata', () => {
8
+ it('renders metadata content', () => {
9
+ render(
10
+ <ChatMessageMetadata
11
+ timestamp="12:00"
12
+ status="read"
13
+ data-testid="meta"
14
+ />,
15
+ );
16
+ expect(screen.getByTestId('meta')).toBeTruthy();
17
+ });
18
+
19
+ it('forwards rest props (data-*, aria-*, id) to the root element', () => {
20
+ render(
21
+ <ChatMessageMetadata
22
+ timestamp="12:00"
23
+ data-testid="meta"
24
+ data-custom="x"
25
+ id="meta-1"
26
+ />,
27
+ );
28
+ const root = screen.getByTestId('meta');
29
+ expect(root).toHaveAttribute('data-custom', 'x');
30
+ expect(root).toHaveAttribute('id', 'meta-1');
31
+ });
32
+ });
@@ -28,11 +28,7 @@ import type {BaseProps} from '../BaseProps';
28
28
  import {themeProps} from '../utils/themeProps';
29
29
 
30
30
  export type ChatMessageStatus =
31
- | 'sending'
32
- | 'sent'
33
- | 'delivered'
34
- | 'read'
35
- | 'error';
31
+ 'sending' | 'sent' | 'delivered' | 'read' | 'error';
36
32
 
37
33
  const STATUS_CONFIG: Record<
38
34
  ChatMessageStatus,
@@ -118,6 +114,7 @@ export function ChatMessageMetadata({
118
114
  xstyle,
119
115
  className,
120
116
  style,
117
+ ...rest
121
118
  }: ChatMessageMetadataProps) {
122
119
  const msgContext = useChatMessageContext();
123
120
  const sender = msgContext?.sender ?? 'assistant';
@@ -142,7 +139,8 @@ export function ChatMessageMetadata({
142
139
  ),
143
140
  className,
144
141
  style,
145
- )}>
142
+ )}
143
+ {...rest}>
146
144
  {timestamp != null && <span>{timestamp}</span>}
147
145
  {timestamp != null && (footer != null || statusConfig != null) && (
148
146
  <span>·</span>
@@ -11,26 +11,20 @@ describe('ChatSystemMessage', () => {
11
11
  });
12
12
 
13
13
  it('has role="status"', () => {
14
- render(
15
- <ChatSystemMessage data-testid="sys">Notice</ChatSystemMessage>,
16
- );
14
+ render(<ChatSystemMessage data-testid="sys">Notice</ChatSystemMessage>);
17
15
  const el = screen.getByTestId('sys');
18
16
  expect(el.getAttribute('role')).toBe('status');
19
17
  });
20
18
 
21
19
  it('renders default variant without divider lines', () => {
22
- const {container} = render(
23
- <ChatSystemMessage>Hello</ChatSystemMessage>,
24
- );
20
+ const {container} = render(<ChatSystemMessage>Hello</ChatSystemMessage>);
25
21
  // Divider lines have aria-hidden, so check there are none
26
22
  const hiddenElements = container.querySelectorAll('[aria-hidden]');
27
23
  expect(hiddenElements.length).toBe(0);
28
24
  });
29
25
 
30
26
  it('renders divider variant with Divider', () => {
31
- render(
32
- <ChatSystemMessage variant="divider">Today</ChatSystemMessage>,
33
- );
27
+ render(<ChatSystemMessage variant="divider">Today</ChatSystemMessage>);
34
28
  expect(screen.getByText('Today')).toBeTruthy();
35
29
  });
36
30
 
@@ -54,9 +48,30 @@ describe('ChatSystemMessage', () => {
54
48
  });
55
49
 
56
50
  it('applies data-testid', () => {
51
+ render(<ChatSystemMessage data-testid="my-sys">Hello</ChatSystemMessage>);
52
+ expect(screen.getByTestId('my-sys')).toBeTruthy();
53
+ });
54
+
55
+ it('forwards rest props (data-*, id) while keeping its own role', () => {
57
56
  render(
58
- <ChatSystemMessage data-testid="my-sys">Hello</ChatSystemMessage>,
57
+ <ChatSystemMessage data-testid="sys" data-custom="x" id="sys-1">
58
+ Hello
59
+ </ChatSystemMessage>,
59
60
  );
60
- expect(screen.getByTestId('my-sys')).toBeTruthy();
61
+ const el = screen.getByTestId('sys');
62
+ expect(el).toHaveAttribute('data-custom', 'x');
63
+ expect(el).toHaveAttribute('id', 'sys-1');
64
+ expect(el.getAttribute('role')).toBe('status');
65
+ });
66
+
67
+ it('forwards rest props in the divider variant', () => {
68
+ render(
69
+ <ChatSystemMessage variant="divider" data-testid="sys" data-custom="x">
70
+ Today
71
+ </ChatSystemMessage>,
72
+ );
73
+ const el = screen.getByTestId('sys');
74
+ expect(el).toHaveAttribute('data-custom', 'x');
75
+ expect(el.getAttribute('role')).toBe('status');
61
76
  });
62
77
  });
@@ -120,21 +120,21 @@ export function ChatSystemMessage({
120
120
  xstyle,
121
121
  className,
122
122
  style: styleProp,
123
- 'data-testid': testId,
124
123
  ref,
124
+ ...rest
125
125
  }: ChatSystemMessageProps) {
126
126
  if (variant === 'divider') {
127
127
  return (
128
128
  <div
129
129
  ref={ref}
130
- role="status"
131
- data-testid={testId}
132
130
  {...mergeProps(
133
131
  themeProps('chat-system-message', {variant}),
134
132
  stylex.props(styles.dividerWrap, xstyle),
135
133
  className,
136
134
  styleProp,
137
- )}>
135
+ )}
136
+ {...rest}
137
+ role="status">
138
138
  <Divider label={children} />
139
139
  </div>
140
140
  );
@@ -143,14 +143,14 @@ export function ChatSystemMessage({
143
143
  return (
144
144
  <div
145
145
  ref={ref}
146
- role="status"
147
- data-testid={testId}
148
146
  {...mergeProps(
149
147
  themeProps('chat-system-message', {variant}),
150
148
  stylex.props(styles.root, xstyle),
151
149
  className,
152
150
  styleProp,
153
- )}>
151
+ )}
152
+ {...rest}
153
+ role="status">
154
154
  <span {...stylex.props(styles.content)}>
155
155
  {icon != null && <span {...stylex.props(styles.icon)}>{icon}</span>}
156
156
  {children}
@@ -6,18 +6,12 @@ import {ChatTokenizedText} from './ChatTokenizedText';
6
6
 
7
7
  describe('ChatTokenizedText', () => {
8
8
  it('renders plain text when no tokens provided', () => {
9
- render(
10
- <ChatTokenizedText>Hello world</ChatTokenizedText>,
11
- );
9
+ render(<ChatTokenizedText>Hello world</ChatTokenizedText>);
12
10
  expect(screen.getByText('Hello world')).toBeInTheDocument();
13
11
  });
14
12
 
15
13
  it('renders plain text when tokens array is empty', () => {
16
- render(
17
- <ChatTokenizedText tokens={[]}>
18
- Hello world
19
- </ChatTokenizedText>,
20
- );
14
+ render(<ChatTokenizedText tokens={[]}>Hello world</ChatTokenizedText>);
21
15
  expect(screen.getByText('Hello world')).toBeInTheDocument();
22
16
  });
23
17
 
@@ -48,8 +42,7 @@ describe('ChatTokenizedText', () => {
48
42
 
49
43
  it('handles repeated occurrences of the same token', () => {
50
44
  render(
51
- <ChatTokenizedText
52
- tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
45
+ <ChatTokenizedText tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
53
46
  @cindy and @cindy again
54
47
  </ChatTokenizedText>,
55
48
  );
@@ -58,8 +51,7 @@ describe('ChatTokenizedText', () => {
58
51
 
59
52
  it('renders text with no matching tokens as plain text', () => {
60
53
  render(
61
- <ChatTokenizedText
62
- tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
54
+ <ChatTokenizedText tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
63
55
  Hello world
64
56
  </ChatTokenizedText>,
65
57
  );
@@ -68,8 +60,7 @@ describe('ChatTokenizedText', () => {
68
60
 
69
61
  it('handles tokens with special regex characters in pattern', () => {
70
62
  render(
71
- <ChatTokenizedText
72
- tokens={[{value: '/search', label: '/search'}]}>
63
+ <ChatTokenizedText tokens={[{value: '/search', label: '/search'}]}>
73
64
  Run /search now
74
65
  </ChatTokenizedText>,
75
66
  );
@@ -79,8 +70,7 @@ describe('ChatTokenizedText', () => {
79
70
 
80
71
  it('preserves surrounding text', () => {
81
72
  const {container} = render(
82
- <ChatTokenizedText
83
- tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
73
+ <ChatTokenizedText tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
84
74
  Before @cindy after
85
75
  </ChatTokenizedText>,
86
76
  );
@@ -88,4 +78,27 @@ describe('ChatTokenizedText', () => {
88
78
  expect(container.textContent).toContain('after');
89
79
  expect(container.textContent).toContain('@Cindy Zhang');
90
80
  });
81
+
82
+ it('forwards rest props (data-*, id) to the root element', () => {
83
+ render(
84
+ <ChatTokenizedText data-testid="tokenized" data-custom="x" id="tok-1">
85
+ Plain text
86
+ </ChatTokenizedText>,
87
+ );
88
+ const root = screen.getByTestId('tokenized');
89
+ expect(root).toHaveAttribute('data-custom', 'x');
90
+ expect(root).toHaveAttribute('id', 'tok-1');
91
+ });
92
+
93
+ it('forwards rest props when rendering tokens', () => {
94
+ render(
95
+ <ChatTokenizedText
96
+ tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}
97
+ data-testid="tokenized"
98
+ data-custom="x">
99
+ Hi @cindy
100
+ </ChatTokenizedText>,
101
+ );
102
+ expect(screen.getByTestId('tokenized')).toHaveAttribute('data-custom', 'x');
103
+ });
91
104
  });
@@ -91,6 +91,10 @@ export function ChatTokenizedText({
91
91
  ref,
92
92
  children,
93
93
  tokens,
94
+ xstyle,
95
+ className,
96
+ style,
97
+ ...rest
94
98
  }: ChatTokenizedTextProps) {
95
99
  if (!children || !tokens || tokens.length === 0) {
96
100
  return (
@@ -98,8 +102,11 @@ export function ChatTokenizedText({
98
102
  ref={ref}
99
103
  {...mergeProps(
100
104
  themeProps('chat-tokenized-text'),
101
- stylex.props(styles.root),
102
- )}>
105
+ stylex.props(styles.root, xstyle),
106
+ className,
107
+ style,
108
+ )}
109
+ {...rest}>
103
110
  {children ?? ''}
104
111
  </span>
105
112
  );
@@ -111,8 +118,11 @@ export function ChatTokenizedText({
111
118
  ref={ref}
112
119
  {...mergeProps(
113
120
  themeProps('chat-tokenized-text'),
114
- stylex.props(styles.root),
115
- )}>
121
+ stylex.props(styles.root, xstyle),
122
+ className,
123
+ style,
124
+ )}
125
+ {...rest}>
116
126
  {parts}
117
127
  </span>
118
128
  );
@@ -124,10 +134,7 @@ ChatTokenizedText.displayName = 'ChatTokenizedText';
124
134
  // Render
125
135
  // =============================================================================
126
136
 
127
- function renderTokens(
128
- text: string,
129
- tokens: ChatComposerToken[],
130
- ): ReactNode[] {
137
+ function renderTokens(text: string, tokens: ChatComposerToken[]): ReactNode[] {
131
138
  const pattern = tokens.map(t => escapeRegExp(t.value)).join('|');
132
139
  const regex = new RegExp(`(${pattern})`, 'g');
133
140
 
@@ -97,4 +97,59 @@ describe('ChatToolCalls', () => {
97
97
  );
98
98
  expect(screen.getByText('git status')).toBeInTheDocument();
99
99
  });
100
+
101
+ it('exposes no aria-expanded on a call row without resultDetail', () => {
102
+ const {container} = render(
103
+ <ChatToolCalls calls={[{name: 'bash', status: 'complete'}]} />,
104
+ );
105
+ expect(container.querySelector('[aria-expanded]')).toBeNull();
106
+ });
107
+
108
+ it('wires disclosure semantics on an expandable call row', () => {
109
+ render(
110
+ <ChatToolCalls
111
+ calls={[
112
+ {
113
+ name: 'readFile',
114
+ status: 'complete',
115
+ resultDetail: <div>file contents here</div>,
116
+ },
117
+ ]}
118
+ />,
119
+ );
120
+ const row = screen.getByRole('button');
121
+ expect(row).toHaveAttribute('aria-expanded', 'false');
122
+ // Detail panel is conditionally mounted, so no aria-controls while closed.
123
+ expect(row).not.toHaveAttribute('aria-controls');
124
+ expect(screen.queryByText('file contents here')).not.toBeInTheDocument();
125
+
126
+ fireEvent.click(row);
127
+
128
+ expect(row).toHaveAttribute('aria-expanded', 'true');
129
+ const detailId = row.getAttribute('aria-controls');
130
+ expect(detailId).toBeTruthy();
131
+ const panel = document.getElementById(detailId as string);
132
+ expect(panel).not.toBeNull();
133
+ expect(panel).toHaveTextContent('file contents here');
134
+ });
135
+
136
+ it('points the group header aria-controls at the content region', () => {
137
+ render(
138
+ <ChatToolCalls
139
+ defaultIsExpanded={true}
140
+ calls={[
141
+ {name: 'searchCode', status: 'complete'},
142
+ {name: 'readFile', status: 'complete'},
143
+ ]}
144
+ />,
145
+ );
146
+ const header = screen.getByRole('button');
147
+ expect(header).toHaveAttribute('aria-expanded', 'true');
148
+ const regionId = header.getAttribute('aria-controls');
149
+ expect(regionId).toBeTruthy();
150
+ const region = document.getElementById(regionId as string);
151
+ expect(region).not.toBeNull();
152
+ expect(region).toHaveTextContent('searchCode');
153
+ expect(region).toHaveTextContent('readFile');
154
+ });
100
155
  });
@@ -18,7 +18,7 @@
18
18
  * for builders to wire up.
19
19
  */
20
20
 
21
- import React, {useState, useCallback, type ReactNode} from 'react';
21
+ import React, {useState, useCallback, useId, type ReactNode} from 'react';
22
22
  import type {BaseProps} from '../BaseProps';
23
23
  import * as stylex from '@stylexjs/stylex';
24
24
  import {
@@ -41,11 +41,7 @@ import {themeProps} from '../utils/themeProps';
41
41
  // Types
42
42
  // =============================================================================
43
43
 
44
- export type ChatToolCallStatus =
45
- | 'pending'
46
- | 'running'
47
- | 'complete'
48
- | 'error';
44
+ export type ChatToolCallStatus = 'pending' | 'running' | 'complete' | 'error';
49
45
 
50
46
  export interface ChatToolCallItem {
51
47
  /** Tool/function name. */
@@ -356,6 +352,7 @@ function CallRow({call}: {call: ChatToolCallItem}) {
356
352
  const status = call.status ?? 'complete';
357
353
  const hasDetail = call.resultDetail != null;
358
354
  const [isDetailOpen, setIsDetailOpen] = useState(false);
355
+ const detailId = useId();
359
356
 
360
357
  const toggleDetail = hasDetail
361
358
  ? () => setIsDetailOpen(prev => !prev)
@@ -365,6 +362,8 @@ function CallRow({call}: {call: ChatToolCallItem}) {
365
362
  <div
366
363
  role={hasDetail ? 'button' : undefined}
367
364
  tabIndex={hasDetail ? 0 : undefined}
365
+ aria-expanded={hasDetail ? isDetailOpen : undefined}
366
+ aria-controls={hasDetail && isDetailOpen ? detailId : undefined}
368
367
  onClick={toggleDetail}
369
368
  onKeyDown={
370
369
  hasDetail
@@ -399,11 +398,7 @@ function CallRow({call}: {call: ChatToolCallItem}) {
399
398
  </span>
400
399
  <span {...stylex.props(styles.callName)}>{call.name}</span>
401
400
  {call.node != null && (
402
- <Badge
403
- label={call.node}
404
- variant="neutral"
405
- xstyle={styles.nodePill}
406
- />
401
+ <Badge label={call.node} variant="neutral" xstyle={styles.nodePill} />
407
402
  )}
408
403
  {call.target != null && (
409
404
  <span {...stylex.props(styles.callLabel)}>{call.target}</span>
@@ -448,7 +443,7 @@ function CallRow({call}: {call: ChatToolCallItem}) {
448
443
  <div>
449
444
  {row}
450
445
  {isDetailOpen && (
451
- <div {...stylex.props(styles.callDetailContent)}>
446
+ <div id={detailId} {...stylex.props(styles.callDetailContent)}>
452
447
  {call.resultDetail}
453
448
  </div>
454
449
  )}
@@ -497,6 +492,7 @@ export function ChatToolCalls(props: ChatToolCallsProps) {
497
492
 
498
493
  const autoDefault = defaultIsExpanded ?? false;
499
494
  const [internalExpanded, setInternalExpanded] = useState(autoDefault);
495
+ const contentId = useId();
500
496
  const isControlled = controlledExpanded !== undefined;
501
497
  const isExpanded = isControlled ? controlledExpanded : internalExpanded;
502
498
 
@@ -548,6 +544,7 @@ export function ChatToolCalls(props: ChatToolCallsProps) {
548
544
  role="button"
549
545
  tabIndex={0}
550
546
  aria-expanded={isExpanded}
547
+ aria-controls={contentId}
551
548
  onClick={toggle}
552
549
  onKeyDown={e => {
553
550
  if (e.key === 'Enter' || e.key === ' ') {
@@ -613,6 +610,7 @@ export function ChatToolCalls(props: ChatToolCallsProps) {
613
610
 
614
611
  {/* Expanded: all calls with full metadata */}
615
612
  <div
613
+ id={contentId}
616
614
  {...stylex.props(
617
615
  styles.groupContent,
618
616
  isExpanded && styles.groupContentExpanded,
package/src/Chat/index.ts CHANGED
@@ -21,10 +21,7 @@ export type {ChatSendButtonProps} from './ChatSendButton';
21
21
  export {ChatComposerDrawer} from './ChatComposerDrawer';
22
22
  export type {ChatComposerDrawerProps} from './ChatComposerDrawer';
23
23
 
24
- export {
25
- ChatComposerInput,
26
- ChatComposerTokenElement,
27
- } from './ChatComposerInput';
24
+ export {ChatComposerInput, ChatComposerTokenElement} from './ChatComposerInput';
28
25
  export type {
29
26
  ChatComposerInputProps,
30
27
  ChatComposerInputHandle,
@@ -40,10 +40,7 @@ import {
40
40
  import {mergeProps, groupItems} from '../utils';
41
41
  import type {SearchableItem} from '../Typeahead/types';
42
42
  import {themeProps} from '../utils/themeProps';
43
- import type {
44
- ChatComposerTrigger,
45
- ChatComposerToken,
46
- } from './ChatComposerInput';
43
+ import type {ChatComposerTrigger, ChatComposerToken} from './ChatComposerInput';
47
44
 
48
45
  // =============================================================================
49
46
  // Types
@@ -125,7 +125,7 @@ export const docs = {
125
125
  theming: {
126
126
  targets: [
127
127
  {className: 'astryx-checkbox-input', visualProps: ['size']},
128
- {className: 'astryx-checkbox'},
128
+ {className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled']},
129
129
  ],
130
130
  },
131
131
  usage: {
@@ -178,7 +178,7 @@ export const docsZh = {
178
178
  {name: 'isLoading', type: 'boolean', description: '复选框是否处于加载状态。显示旋转器并阻止交互。', default: 'false'},
179
179
  {name: 'isDisabled', type: 'boolean', description: '复选框是否禁用。', default: 'false'},
180
180
  {name: 'htmlName', type: 'string', description: '底层复选框输入的 HTML name 属性,用于表单提交(勾选时提交 "on")。'},
181
- {name: 'disabledMessage', type: 'string', description: 'Explains why the checkbox is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the checkbox focusable via aria-disabled (toggling stays blocked). Use this instead of wrapping a disabled CheckboxInput in Tooltip disabled controls swallow the hover events an external Tooltip needs.'},
181
+ {name: 'disabledMessage', type: 'string', description: 'Explains why the checkbox is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the checkbox focusable via aria-disabled (toggling stays blocked). Use this instead of wrapping a disabled CheckboxInput in Tooltip: disabled controls swallow the hover events an external Tooltip needs.'},
182
182
  {name: 'isReadOnly', type: 'boolean', description: '复选框是否为只读。以完整不透明度显示当前状态但阻止交互。与 isDisabled 不同,只读复选框不会变暗。', default: 'false'},
183
183
  {name: 'isOptional', type: 'boolean', description: '字段是否可选。与 isRequired 互斥。', default: 'false'},
184
184
  {name: 'isRequired', type: 'boolean', description: '复选框是否必填。与 isOptional 互斥。', default: 'false'},
@@ -200,7 +200,7 @@ export const docsZh = {
200
200
  'size',
201
201
  ],
202
202
  },
203
- {className: 'astryx-checkbox'},
203
+ {className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled']},
204
204
  ],
205
205
  },
206
206
  };