@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29

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 (642) hide show
  1. package/CHANGELOG.md +51 -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.js +3 -3
  6. package/dist/AppShell/AppShell.d.ts +1 -1
  7. package/dist/AppShell/AppShell.d.ts.map +1 -1
  8. package/dist/AppShell/AppShell.js +55 -53
  9. package/dist/AspectRatio/AspectRatio.js +5 -5
  10. package/dist/Avatar/Avatar.d.ts.map +1 -1
  11. package/dist/Avatar/Avatar.js +27 -25
  12. package/dist/Avatar/AvatarStatusDot.js +5 -5
  13. package/dist/AvatarGroup/AvatarGroup.js +5 -5
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
  15. package/dist/Badge/Badge.js +3 -3
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -25
  18. package/dist/Blockquote/Blockquote.js +7 -7
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  20. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  21. package/dist/Button/Button.d.ts.map +1 -1
  22. package/dist/Button/Button.js +47 -26
  23. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +108 -64
  26. package/dist/Calendar/dayCellUtils.d.ts +67 -5
  27. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  28. package/dist/Calendar/dayCellUtils.js +139 -18
  29. package/dist/Calendar/styles.d.ts +2 -2
  30. package/dist/Calendar/styles.d.ts.map +1 -1
  31. package/dist/Calendar/styles.js +2 -2
  32. package/dist/Card/Card.d.ts +4 -2
  33. package/dist/Card/Card.d.ts.map +1 -1
  34. package/dist/Card/Card.js +18 -10
  35. package/dist/Carousel/Carousel.d.ts.map +1 -1
  36. package/dist/Carousel/Carousel.js +20 -19
  37. package/dist/Center/Center.js +3 -3
  38. package/dist/Chat/ChatComposer.js +23 -23
  39. package/dist/Chat/ChatComposerDrawer.js +14 -14
  40. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  41. package/dist/Chat/ChatComposerInput.js +27 -15
  42. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  43. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  44. package/dist/Chat/ChatDictationButton.js +13 -11
  45. package/dist/Chat/ChatLayout.js +17 -17
  46. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  47. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  49. package/dist/Chat/ChatMessage.js +12 -12
  50. package/dist/Chat/ChatMessageBubble.js +7 -7
  51. package/dist/Chat/ChatMessageList.js +14 -14
  52. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  53. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  54. package/dist/Chat/ChatMessageMetadata.js +14 -12
  55. package/dist/Chat/ChatPastedTextToken.js +13 -13
  56. package/dist/Chat/ChatSendButton.js +3 -3
  57. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  58. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  59. package/dist/Chat/ChatSystemMessage.js +17 -17
  60. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  61. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  62. package/dist/Chat/ChatTokenizedText.js +24 -15
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +81 -74
  65. package/dist/Chat/index.d.ts +1 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/useTriggerMenu.js +15 -15
  68. package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
  69. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  70. package/dist/CheckboxInput/CheckboxInput.js +32 -24
  71. package/dist/CheckboxList/CheckboxList.js +9 -9
  72. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  73. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  74. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  75. package/dist/Citation/Citation.js +10 -10
  76. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  77. package/dist/ClickableCard/ClickableCard.js +32 -9
  78. package/dist/Code/Code.d.ts +15 -1
  79. package/dist/Code/Code.d.ts.map +1 -1
  80. package/dist/Code/Code.js +35 -5
  81. package/dist/Code/index.d.ts +1 -1
  82. package/dist/Code/index.d.ts.map +1 -1
  83. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  84. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  85. package/dist/CodeBlock/CodeBlock.js +88 -52
  86. package/dist/CodeBlock/index.d.ts +1 -1
  87. package/dist/CodeBlock/index.d.ts.map +1 -1
  88. package/dist/Collapsible/Collapsible.d.ts +9 -3
  89. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  90. package/dist/Collapsible/Collapsible.js +110 -22
  91. package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
  92. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  93. package/dist/Collapsible/CollapsibleGroup.js +73 -12
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
  95. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  96. package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
  97. package/dist/Collapsible/index.d.ts +1 -0
  98. package/dist/Collapsible/index.d.ts.map +1 -1
  99. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  100. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  101. package/dist/Collapsible/useCollapsible.js +20 -6
  102. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  103. package/dist/CommandPalette/CommandPalette.js +36 -34
  104. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
  105. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  106. package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
  107. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  108. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  109. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  110. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  111. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  112. package/dist/ContextMenu/ContextMenu.d.ts +9 -1
  113. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  114. package/dist/ContextMenu/ContextMenu.js +16 -11
  115. package/dist/DateInput/DateInput.js +18 -18
  116. package/dist/DateRangeInput/DateRangeInput.js +23 -23
  117. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
  118. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  119. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  120. package/dist/DateTimeInput/index.d.ts +1 -1
  121. package/dist/DateTimeInput/index.d.ts.map +1 -1
  122. package/dist/Dialog/Dialog.js +9 -9
  123. package/dist/Dialog/DialogHeader.js +16 -16
  124. package/dist/Dialog/useImperativeDialog.js +3 -3
  125. package/dist/Divider/Divider.d.ts +0 -22
  126. package/dist/Divider/Divider.d.ts.map +1 -1
  127. package/dist/Divider/Divider.js +7 -7
  128. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  129. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  130. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  131. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  132. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  133. package/dist/EmptyState/EmptyState.js +9 -9
  134. package/dist/Field/Field.js +17 -17
  135. package/dist/Field/FieldLabel.js +15 -15
  136. package/dist/Field/InputClearButton.js +5 -5
  137. package/dist/FieldStatus/FieldStatus.js +3 -3
  138. package/dist/FileInput/FileInput.js +29 -29
  139. package/dist/FormLayout/FormLayout.js +5 -5
  140. package/dist/Grid/Grid.d.ts +4 -3
  141. package/dist/Grid/Grid.d.ts.map +1 -1
  142. package/dist/Grid/Grid.js +29 -12
  143. package/dist/Grid/GridSpan.js +3 -3
  144. package/dist/HStack/HStack.js +3 -3
  145. package/dist/Heading/Heading.js +10 -10
  146. package/dist/HoverCard/HoverCard.js +9 -9
  147. package/dist/HoverCard/useHoverCard.js +3 -3
  148. package/dist/Icon/Icon.d.ts.map +1 -1
  149. package/dist/Icon/Icon.js +16 -12
  150. package/dist/Icon/defaultIcons.js +116 -116
  151. package/dist/IconButton/IconButton.js +3 -3
  152. package/dist/InputGroup/InputGroup.js +11 -11
  153. package/dist/InputGroup/InputGroupText.js +3 -3
  154. package/dist/Item/Item.js +18 -18
  155. package/dist/Kbd/Kbd.js +5 -5
  156. package/dist/Layer/LayerProvider.js +7 -7
  157. package/dist/Layer/useLayer.js +5 -5
  158. package/dist/Layout/Layout.js +21 -21
  159. package/dist/Layout/LayoutContent.js +3 -3
  160. package/dist/Layout/LayoutFooter.js +5 -5
  161. package/dist/Layout/LayoutHeader.js +5 -5
  162. package/dist/Layout/LayoutPanel.js +3 -3
  163. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  164. package/dist/Lightbox/Lightbox.js +55 -31
  165. package/dist/Lightbox/useLightbox.js +3 -3
  166. package/dist/Link/Link.js +15 -15
  167. package/dist/Link/LinkProvider.js +3 -3
  168. package/dist/Link/useLinkify.js +3 -3
  169. package/dist/List/List.js +11 -11
  170. package/dist/List/ListItem.js +11 -11
  171. package/dist/Markdown/Markdown.d.ts.map +1 -1
  172. package/dist/Markdown/Markdown.js +102 -102
  173. package/dist/Markdown/parser.d.ts +7 -0
  174. package/dist/Markdown/parser.d.ts.map +1 -1
  175. package/dist/Markdown/parser.js +300 -6
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.js +15 -15
  179. package/dist/MobileNav/MobileNavToggle.js +5 -5
  180. package/dist/MoreMenu/MoreMenu.js +3 -3
  181. package/dist/MultiSelector/MultiSelector.d.ts +7 -1
  182. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  183. package/dist/MultiSelector/MultiSelector.js +64 -55
  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.js +3 -3
  194. package/dist/Pagination/Pagination.d.ts +1 -1
  195. package/dist/Pagination/Pagination.d.ts.map +1 -1
  196. package/dist/Pagination/Pagination.js +125 -72
  197. package/dist/Popover/Popover.js +16 -16
  198. package/dist/Popover/usePopover.js +7 -7
  199. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  200. package/dist/PowerSearch/PowerSearch.js +110 -92
  201. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  202. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  203. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  204. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  205. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  206. package/dist/ProgressBar/ProgressBar.js +25 -18
  207. package/dist/RadioList/RadioList.d.ts +7 -1
  208. package/dist/RadioList/RadioList.d.ts.map +1 -1
  209. package/dist/RadioList/RadioList.js +10 -8
  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 +30 -22
  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.d.ts +6 -0
  224. package/dist/Selector/Selector.d.ts.map +1 -1
  225. package/dist/Selector/Selector.js +54 -45
  226. package/dist/Selector/SelectorOption.js +3 -3
  227. package/dist/SideNav/SideNav.d.ts.map +1 -1
  228. package/dist/SideNav/SideNav.js +38 -34
  229. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  230. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  232. package/dist/SideNav/SideNavHeading.js +87 -87
  233. package/dist/SideNav/SideNavItem.js +42 -42
  234. package/dist/SideNav/SideNavSection.d.ts +1 -1
  235. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  236. package/dist/SideNav/SideNavSection.js +18 -16
  237. package/dist/Skeleton/Skeleton.js +3 -3
  238. package/dist/Slider/Slider.d.ts +6 -0
  239. package/dist/Slider/Slider.d.ts.map +1 -1
  240. package/dist/Slider/Slider.js +31 -22
  241. package/dist/Spinner/Spinner.d.ts.map +1 -1
  242. package/dist/Spinner/Spinner.js +10 -10
  243. package/dist/StatusDot/StatusDot.js +5 -5
  244. package/dist/Switch/Switch.d.ts +13 -4
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +41 -30
  247. package/dist/TabList/Tab.js +18 -18
  248. package/dist/TabList/TabList.js +5 -5
  249. package/dist/TabList/TabMenu.d.ts.map +1 -1
  250. package/dist/TabList/TabMenu.js +57 -30
  251. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  252. package/dist/Table/BaseTable.d.ts.map +1 -1
  253. package/dist/Table/BaseTable.js +51 -39
  254. package/dist/Table/Table.js +7 -7
  255. package/dist/Table/TableBody.d.ts +1 -1
  256. package/dist/Table/TableBody.d.ts.map +1 -1
  257. package/dist/Table/TableBody.js +9 -5
  258. package/dist/Table/TableCell.d.ts.map +1 -1
  259. package/dist/Table/TableCell.js +76 -7
  260. package/dist/Table/TableFooter.d.ts +1 -1
  261. package/dist/Table/TableFooter.d.ts.map +1 -1
  262. package/dist/Table/TableFooter.js +9 -5
  263. package/dist/Table/TableHeader.d.ts +1 -1
  264. package/dist/Table/TableHeader.d.ts.map +1 -1
  265. package/dist/Table/TableHeader.js +9 -5
  266. package/dist/Table/TableHeaderCell.js +3 -3
  267. package/dist/Table/TableRow.js +5 -5
  268. package/dist/Table/index.d.ts +2 -0
  269. package/dist/Table/index.d.ts.map +1 -1
  270. package/dist/Table/index.js +1 -0
  271. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  272. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  273. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  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/index.d.ts +3 -0
  278. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
  279. package/dist/Table/plugins/rowExpansion/index.js +3 -0
  280. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
  281. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
  282. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
  283. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  284. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  285. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  286. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  287. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  288. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  289. package/dist/Table/tableContextMenu.d.ts +5 -1
  290. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  291. package/dist/Table/tableContextMenu.js +19 -12
  292. package/dist/Text/Text.d.ts +1 -1
  293. package/dist/Text/Text.d.ts.map +1 -1
  294. package/dist/Text/Text.js +14 -13
  295. package/dist/Text/text.stylex.d.ts +35 -0
  296. package/dist/Text/text.stylex.d.ts.map +1 -1
  297. package/dist/Text/text.stylex.js +52 -1
  298. package/dist/TextArea/TextArea.js +14 -14
  299. package/dist/TextInput/TextInput.js +15 -15
  300. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  301. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  302. package/dist/Thumbnail/Thumbnail.js +30 -29
  303. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  304. package/dist/TimeInput/TimeInput.js +26 -21
  305. package/dist/Timestamp/Timestamp.d.ts +1 -1
  306. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  307. package/dist/Timestamp/Timestamp.js +37 -26
  308. package/dist/Toast/Toast.d.ts.map +1 -1
  309. package/dist/Toast/Toast.js +25 -17
  310. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  311. package/dist/Toast/ToastViewport.js +23 -11
  312. package/dist/Toast/useToast.js +4 -4
  313. package/dist/ToggleButton/ToggleButton.js +12 -12
  314. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  315. package/dist/Token/Token.js +21 -21
  316. package/dist/Tokenizer/Tokenizer.d.ts +6 -1
  317. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  318. package/dist/Tokenizer/Tokenizer.js +38 -29
  319. package/dist/Toolbar/Toolbar.js +18 -18
  320. package/dist/Tooltip/Tooltip.js +11 -11
  321. package/dist/Tooltip/useTooltip.js +3 -3
  322. package/dist/TopNav/TopNav.js +32 -32
  323. package/dist/TopNav/TopNavHeading.js +67 -67
  324. package/dist/TopNav/TopNavItem.js +5 -5
  325. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  326. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  327. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  328. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  329. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  330. package/dist/TopNav/TopNavMenu.js +32 -32
  331. package/dist/TreeList/TreeList.js +8 -8
  332. package/dist/TreeList/TreeListBranches.js +11 -11
  333. package/dist/TreeList/TreeListItem.js +30 -30
  334. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.js +23 -20
  336. package/dist/Typeahead/Typeahead.js +12 -12
  337. package/dist/Typeahead/TypeaheadItem.js +10 -10
  338. package/dist/VStack/VStack.js +3 -3
  339. package/dist/astryx.css +23 -0
  340. package/dist/astryx.umd.js +60 -58
  341. package/dist/astryx.umd.js.map +4 -4
  342. package/dist/docs-types.d.ts +13 -1
  343. package/dist/docs-types.d.ts.map +1 -1
  344. package/dist/hooks/focusableSelector.d.ts +1 -1
  345. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  346. package/dist/hooks/focusableSelector.js +1 -1
  347. package/dist/hooks/index.d.ts +2 -0
  348. package/dist/hooks/index.d.ts.map +1 -1
  349. package/dist/hooks/index.js +1 -0
  350. package/dist/hooks/useFocusTrap.d.ts +3 -0
  351. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  352. package/dist/hooks/useFocusTrap.js +38 -1
  353. package/dist/hooks/useHotkeys.d.ts +51 -0
  354. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  355. package/dist/hooks/useHotkeys.js +160 -0
  356. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  357. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  358. package/dist/hooks/useInteractiveRole.js +6 -2
  359. package/dist/hooks/useKeyboardHint.js +9 -9
  360. package/dist/hooks/useStreamingText.d.ts +3 -1
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +14 -5
  363. package/dist/theme/MediaTheme.js +3 -3
  364. package/dist/theme/Theme.js +7 -7
  365. package/dist/theme/defineTheme.d.ts +1 -1
  366. package/dist/theme/defineTheme.d.ts.map +1 -1
  367. package/dist/theme/expandColorScale.d.ts.map +1 -1
  368. package/dist/theme/expandColorScale.js +10 -3
  369. package/dist/theme/hct.d.ts +0 -15
  370. package/dist/theme/hct.d.ts.map +1 -1
  371. package/dist/theme/hct.js +9 -9
  372. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  373. package/dist/theme/tokens.d.ts +10 -2
  374. package/dist/theme/tokens.d.ts.map +1 -1
  375. package/dist/theme/tokens.js +220 -4
  376. package/dist/utils/color.d.ts +42 -0
  377. package/dist/utils/color.d.ts.map +1 -0
  378. package/dist/utils/color.js +150 -0
  379. package/dist/utils/composeEventHandlers.d.ts +30 -0
  380. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  381. package/dist/utils/composeEventHandlers.js +40 -0
  382. package/dist/utils/index.d.ts +3 -0
  383. package/dist/utils/index.d.ts.map +1 -1
  384. package/dist/utils/index.js +3 -1
  385. package/dist/utils/timeParser.d.ts.map +1 -1
  386. package/dist/utils/timeParser.js +8 -5
  387. package/package.json +3 -3
  388. package/src/AlertDialog/AlertDialog.tsx +2 -0
  389. package/src/AppShell/AppShell.tsx +2 -0
  390. package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
  391. package/src/Avatar/Avatar.doc.mjs +13 -2
  392. package/src/Avatar/Avatar.test.tsx +32 -1
  393. package/src/Avatar/Avatar.tsx +12 -20
  394. package/src/Banner/Banner.doc.mjs +8 -0
  395. package/src/Banner/Banner.test.tsx +38 -0
  396. package/src/Banner/Banner.tsx +8 -1
  397. package/src/Button/Button.tsx +39 -6
  398. package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
  399. package/src/Calendar/Calendar.doc.mjs +1 -1
  400. package/src/Calendar/Calendar.test.tsx +201 -17
  401. package/src/Calendar/Calendar.tsx +79 -26
  402. package/src/Calendar/dayCellUtils.test.ts +306 -1
  403. package/src/Calendar/dayCellUtils.ts +206 -13
  404. package/src/Calendar/styles.ts +12 -2
  405. package/src/Card/Card.doc.mjs +1 -1
  406. package/src/Card/Card.tsx +16 -6
  407. package/src/Carousel/Carousel.doc.mjs +12 -12
  408. package/src/Carousel/Carousel.test.tsx +13 -0
  409. package/src/Carousel/Carousel.tsx +1 -0
  410. package/src/Chat/Chat.doc.mjs +1 -1
  411. package/src/Chat/ChatComposerInput.test.tsx +24 -0
  412. package/src/Chat/ChatComposerInput.tsx +17 -1
  413. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  414. package/src/Chat/ChatDictationButton.tsx +4 -4
  415. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  416. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  417. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  418. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  419. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  420. package/src/Chat/ChatSystemMessage.tsx +7 -7
  421. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  422. package/src/Chat/ChatTokenizedText.tsx +15 -8
  423. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  424. package/src/Chat/ChatToolCalls.tsx +10 -12
  425. package/src/Chat/index.ts +1 -4
  426. package/src/Chat/useChatNewMessages.test.tsx +4 -4
  427. package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
  428. package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
  429. package/src/CheckboxInput/CheckboxInput.tsx +13 -0
  430. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  431. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  432. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  433. package/src/Citation/Citation.doc.mjs +5 -0
  434. package/src/ClickableCard/ClickableCard.tsx +45 -2
  435. package/src/Code/Code.test.tsx +54 -0
  436. package/src/Code/Code.tsx +48 -4
  437. package/src/Code/index.ts +1 -1
  438. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  439. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  440. package/src/CodeBlock/CodeBlock.tsx +62 -4
  441. package/src/CodeBlock/index.ts +1 -1
  442. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  443. package/src/Collapsible/Collapsible.test.tsx +405 -0
  444. package/src/Collapsible/Collapsible.tsx +86 -10
  445. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  446. package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
  447. package/src/Collapsible/CollapsibleGroup.tsx +107 -9
  448. package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
  449. package/src/Collapsible/index.ts +4 -0
  450. package/src/Collapsible/useCollapsible.ts +20 -6
  451. package/src/CommandPalette/CommandPalette.tsx +5 -3
  452. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  453. package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
  454. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  455. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  456. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  457. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  458. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  459. package/src/ContextMenu/ContextMenu.test.tsx +15 -0
  460. package/src/ContextMenu/ContextMenu.tsx +19 -1
  461. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  462. package/src/DateInput/DateInput.doc.mjs +6 -1
  463. package/src/DateInput/DateInput.test.tsx +11 -20
  464. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  465. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  466. package/src/DateRangeInput/DateRangeInput.tsx +2 -2
  467. package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
  468. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  469. package/src/DateTimeInput/DateTimeInput.tsx +9 -8
  470. package/src/DateTimeInput/index.ts +1 -0
  471. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  472. package/src/Divider/Divider.tsx +1 -23
  473. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  474. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
  475. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  476. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  477. package/src/Field/Field.doc.mjs +1 -1
  478. package/src/Field/FieldLabel.test.tsx +2 -2
  479. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  480. package/src/FileInput/FileInput.doc.mjs +1 -1
  481. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  482. package/src/Grid/Grid.doc.mjs +3 -3
  483. package/src/Grid/Grid.test.tsx +43 -18
  484. package/src/Grid/Grid.tsx +26 -9
  485. package/src/Icon/Icon.test.tsx +41 -29
  486. package/src/Icon/Icon.tsx +6 -2
  487. package/src/InputGroup/InputGroup.tsx +2 -2
  488. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  489. package/src/Item/Item.tsx +1 -1
  490. package/src/Layout/Layout.test.tsx +285 -0
  491. package/src/Layout/LayoutContent.doc.mjs +12 -0
  492. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  493. package/src/Layout/LayoutSlots.test.tsx +364 -0
  494. package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -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/Markdown/Markdown.test.tsx +23 -0
  499. package/src/Markdown/Markdown.tsx +9 -7
  500. package/src/Markdown/incremental.test.ts +36 -0
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/Markdown/parser.test.ts +210 -0
  503. package/src/Markdown/parser.ts +301 -6
  504. package/src/MobileNav/MobileNav.doc.mjs +20 -0
  505. package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
  506. package/src/MultiSelector/MultiSelector.test.tsx +33 -0
  507. package/src/MultiSelector/MultiSelector.tsx +20 -0
  508. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  509. package/src/NumberInput/NumberInput.test.tsx +48 -3
  510. package/src/NumberInput/NumberInput.tsx +32 -15
  511. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  512. package/src/OverflowList/OverflowList.test.tsx +416 -0
  513. package/src/Overlay/Overlay.doc.mjs +6 -0
  514. package/src/Overlay/Overlay.test.tsx +356 -0
  515. package/src/Pagination/Pagination.test.tsx +162 -0
  516. package/src/Pagination/Pagination.tsx +80 -26
  517. package/src/Popover/Popover.test.tsx +65 -0
  518. package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  522. package/src/ProgressBar/ProgressBar.tsx +12 -5
  523. package/src/RadioList/RadioList.doc.mjs +7 -1
  524. package/src/RadioList/RadioList.test.tsx +65 -0
  525. package/src/RadioList/RadioList.tsx +10 -1
  526. package/src/RadioList/RadioListItem.tsx +13 -4
  527. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  528. package/src/Resizable/ResizeHandle.tsx +22 -4
  529. package/src/Section/Section.test.tsx +4 -10
  530. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  531. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  532. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  533. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  534. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  535. package/src/Selector/Selector.doc.mjs +12 -1
  536. package/src/Selector/Selector.test.tsx +30 -0
  537. package/src/Selector/Selector.tsx +18 -0
  538. package/src/SideNav/SideNav.doc.mjs +7 -1
  539. package/src/SideNav/SideNav.test.tsx +66 -0
  540. package/src/SideNav/SideNav.tsx +6 -2
  541. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  542. package/src/SideNav/SideNavSection.tsx +6 -4
  543. package/src/SizeContext/SizeContext.test.tsx +226 -0
  544. package/src/Slider/Slider.doc.mjs +14 -2
  545. package/src/Slider/Slider.test.tsx +30 -0
  546. package/src/Slider/Slider.tsx +20 -0
  547. package/src/Spinner/Spinner.tsx +1 -0
  548. package/src/Switch/Switch.doc.mjs +21 -9
  549. package/src/Switch/Switch.test.tsx +137 -0
  550. package/src/Switch/Switch.tsx +32 -7
  551. package/src/TabList/TabList.doc.mjs +3 -3
  552. package/src/TabList/TabList.test.tsx +185 -1
  553. package/src/TabList/TabMenu.tsx +45 -9
  554. package/src/Table/BaseTable.tsx +16 -3
  555. package/src/Table/Table.test.tsx +87 -0
  556. package/src/Table/TableBody.tsx +15 -2
  557. package/src/Table/TableCell.tsx +87 -8
  558. package/src/Table/TableFooter.tsx +15 -2
  559. package/src/Table/TableHeader.tsx +15 -2
  560. package/src/Table/index.ts +5 -0
  561. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  562. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  563. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  564. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  565. package/src/Table/plugins/rowExpansion/index.ts +7 -0
  566. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
  567. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
  568. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  569. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  570. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  571. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  572. package/src/Table/tableContextMenu.test.tsx +27 -3
  573. package/src/Table/tableContextMenu.tsx +20 -2
  574. package/src/Table/useTablePagination.doc.mjs +4 -1
  575. package/src/Table/useTableRowExpansion.doc.mjs +80 -0
  576. package/src/Table/useTableSortable.doc.mjs +4 -1
  577. package/src/Text/Text.doc.mjs +2 -2
  578. package/src/Text/Text.test.tsx +11 -0
  579. package/src/Text/Text.tsx +4 -2
  580. package/src/Text/text.stylex.ts +41 -0
  581. package/src/TextArea/TextArea.doc.mjs +1 -1
  582. package/src/TextArea/TextArea.test.tsx +3 -3
  583. package/src/TextInput/TextInput.doc.mjs +1 -1
  584. package/src/TextInput/TextInput.test.tsx +3 -3
  585. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  586. package/src/Thumbnail/Thumbnail.tsx +4 -2
  587. package/src/TimeInput/TimeInput.doc.mjs +11 -6
  588. package/src/TimeInput/TimeInput.test.tsx +37 -0
  589. package/src/TimeInput/TimeInput.tsx +11 -1
  590. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  591. package/src/Timestamp/Timestamp.test.tsx +52 -0
  592. package/src/Timestamp/Timestamp.tsx +30 -16
  593. package/src/Toast/Toast.tsx +11 -3
  594. package/src/Toast/ToastViewport.test.tsx +64 -0
  595. package/src/Toast/ToastViewport.tsx +12 -0
  596. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  597. package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
  598. package/src/Tokenizer/Tokenizer.test.tsx +33 -0
  599. package/src/Tokenizer/Tokenizer.tsx +19 -0
  600. package/src/Toolbar/Toolbar.test.tsx +1 -1
  601. package/src/TopNav/TopNav.doc.mjs +1 -1
  602. package/src/TopNav/TopNav.test.tsx +18 -0
  603. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  604. package/src/TreeList/TreeList.doc.mjs +2 -2
  605. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  606. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  607. package/src/Typeahead/Typeahead.doc.mjs +7 -2
  608. package/src/Typeahead/Typeahead.test.tsx +45 -1
  609. package/src/__tests__/TestIcon.tsx +26 -0
  610. package/src/__tests__/fastRoleQueries.ts +66 -0
  611. package/src/docPropReferences.test.ts +178 -0
  612. package/src/docs-types.ts +14 -0
  613. package/src/hooks/focusableSelector.ts +1 -1
  614. package/src/hooks/index.ts +3 -0
  615. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  616. package/src/hooks/useFocusTrap.test.tsx +149 -1
  617. package/src/hooks/useFocusTrap.ts +50 -1
  618. package/src/hooks/useHotkeys.doc.mjs +52 -0
  619. package/src/hooks/useHotkeys.test.ts +245 -0
  620. package/src/hooks/useHotkeys.ts +203 -0
  621. package/src/hooks/useInteractiveRole.ts +12 -4
  622. package/src/hooks/useKeyboardHint.doc.mjs +6 -6
  623. package/src/hooks/useStreamingText.test.ts +54 -19
  624. package/src/hooks/useStreamingText.ts +16 -5
  625. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  626. package/src/theme/defineTheme.ts +4 -13
  627. package/src/theme/derivedVarRegistry.test.ts +2 -2
  628. package/src/theme/expandColorScale.test.ts +29 -0
  629. package/src/theme/expandColorScale.ts +11 -6
  630. package/src/theme/hct.ts +9 -17
  631. package/src/theme/tokens.test.ts +182 -9
  632. package/src/theme/tokens.ts +239 -4
  633. package/src/theme/useTheme.test.tsx +20 -0
  634. package/src/utils/color.test.ts +133 -0
  635. package/src/utils/color.ts +148 -0
  636. package/src/utils/composeEventHandlers.test.ts +71 -0
  637. package/src/utils/composeEventHandlers.ts +44 -0
  638. package/src/utils/index.ts +4 -0
  639. package/src/utils/mergeProps.test.ts +166 -0
  640. package/src/utils/sharedResizeObserver.test.ts +2 -2
  641. package/src/utils/timeParser.test.ts +13 -0
  642. package/src/utils/timeParser.ts +8 -5
@@ -20,15 +20,15 @@ export const docs = {
20
20
  ],
21
21
  anatomy: [
22
22
  {name: 'Scroll container', required: true, description: 'The horizontal overflow area that holds all items.'},
23
- {name: 'Items', required: true, description: 'The children rendered in a row. Each item is animated with a scroll-driven scale effect.'},
23
+ {name: 'Items', required: true, description: 'The children rendered in a row inside the scroll container. With hasSnap, each item snaps to the start edge.'},
24
24
  {name: 'Fade edges', required: false, description: 'Gradient fades on the left and right edges that indicate more content is available. Enabled by default, disable with hasEdgeFade={false}.'},
25
- {name: 'Navigation buttons', required: false, description: 'Prev/next buttons that appear on hover. Enabled by default, disable with hasButtons={false}.'},
25
+ {name: 'Navigation buttons', required: false, description: 'Prev/next buttons that appear when the content can scroll in that direction. Enabled by default, disable with hasButtons={false}.'},
26
26
  ],
27
27
  },
28
28
  props: [
29
29
  {name: 'children', type: 'ReactNode', description: 'Carousel items rendered in a horizontal scroll container.', required: true},
30
30
  {name: 'gap', type: "0 | 0.5 | 1 | 1.5 | 2 | 3 | 4", description: 'Gap between items using the spacing token scale.', default: '1'},
31
- {name: 'hasButtons', type: 'boolean', description: 'Show prev/next navigation buttons on hover (desktop only).', default: 'true'},
31
+ {name: 'hasButtons', type: 'boolean', description: 'Show prev/next navigation buttons when content is scrollable.', default: 'true'},
32
32
  {name: 'hasEdgeFade', type: 'boolean', description: 'Show a gradient edge-fade mask when content overflows, signalling that more items exist off-screen.', default: 'true'},
33
33
  {name: 'hasSnap', type: 'boolean', description: 'Enable scroll-snap so each child snaps to the start edge.', default: 'false'},
34
34
  {name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inline padding inside the scroll container, with matching scroll-padding so snap points align to the content edge.'},
@@ -59,20 +59,20 @@ export const docs = {
59
59
  export const docsZh = {
60
60
  usage: {
61
61
  description:
62
- 'Carousel scrolls a row of items horizontally when they overflow the available width. Use it for card grids, image galleries, product lists, or any set of items that should be browsable without taking up the full page.',
62
+ 'Carousel 在项目超出可用宽度时将一行项目水平滚动。适用于卡片网格、图片画廊、产品列表,或任何希望无需占据整页即可浏览的项目集合。',
63
63
  bestPractices: [
64
- {guidance: true, description: 'Enable scroll-snap when each item should land precisely at the start edge, like a gallery or product list.'},
65
- {guidance: true, description: 'Always provide an aria-label that describes what the carousel contains, like "Featured products" or "Team members".'},
66
- {guidance: true, description: 'Use a consistent gap and item width so the carousel looks intentional, not like content overflowing by accident.'},
67
- {guidance: false, description: 'Use a carousel for content every user must see. Not everyone scrolls horizontally, so put critical content above the fold.'},
68
- {guidance: false, description: 'Auto-advance items. Let the user scroll at their own pace.'},
69
- {guidance: false, description: 'Nest carousels. A carousel inside a carousel is confusing and breaks keyboard navigation.'},
64
+ {guidance: true, description: '当每个项目应精确对齐到起始边缘时启用滚动吸附,例如画廊或产品列表。'},
65
+ {guidance: true, description: '始终提供描述轮播内容的 aria-label,例如"精选产品"或"团队成员"。'},
66
+ {guidance: true, description: '使用一致的间距和项目宽度,让轮播看起来是有意为之,而不是内容意外溢出。'},
67
+ {guidance: false, description: '将每位用户都必须看到的内容放入轮播。并非所有人都会水平滚动,关键内容应放在首屏。'},
68
+ {guidance: false, description: '自动轮播项目。让用户按自己的节奏滚动。'},
69
+ {guidance: false, description: '嵌套轮播。轮播中嵌套轮播会造成困惑并破坏键盘导航。'},
70
70
  ],
71
71
  },
72
72
  propDescriptions: {
73
73
  children: '在水平滚动容器中渲染的轮播项目。',
74
74
  gap: '使用间距令牌比例的项目间距。',
75
- hasButtons: '悬停时显示上一个/下一个导航按钮(仅桌面端)。',
75
+ hasButtons: '内容可滚动时显示上一个/下一个导航按钮。',
76
76
  hasEdgeFade: '内容溢出时显示渐变边缘遮罩,提示屏幕外还有更多项目。',
77
77
  hasSnap: '启用滚动吸附,使每个子元素吸附到起始边缘。',
78
78
  padding: '滚动容器内的内联内边距,并设置匹配的 scroll-padding,使吸附点与内容边缘对齐。',
@@ -98,7 +98,7 @@ export const docsDense = {
98
98
  propDescriptions: {
99
99
  children: 'carousel items in horizontal scroll',
100
100
  gap: 'item spacing via spacing token scale',
101
- hasButtons: 'prev/next buttons on hover (desktop)',
101
+ hasButtons: 'prev/next buttons when content is scrollable',
102
102
  hasEdgeFade: 'gradient edge-fade mask on overflow',
103
103
  hasSnap: 'scroll-snap; children snap to start edge',
104
104
  padding: 'inline padding; scroll-padding keeps snap points on content edge',
@@ -38,6 +38,19 @@ describe('Carousel', () => {
38
38
  expect(region).toHaveAttribute('aria-roledescription', 'carousel');
39
39
  });
40
40
 
41
+ it('makes the scroll container keyboard-focusable', () => {
42
+ render(
43
+ <Carousel aria-label="Photos">
44
+ <div>Item</div>
45
+ </Carousel>,
46
+ );
47
+ // The inner scroll container overflows, so it must be reachable by
48
+ // keyboard (axe: scrollable-region-focusable).
49
+ const region = screen.getByRole('region', {name: 'Photos'});
50
+ const scroller = region.firstElementChild;
51
+ expect(scroller).toHaveAttribute('tabindex', '0');
52
+ });
53
+
41
54
  it('applies data-testid', () => {
42
55
  render(
43
56
  <Carousel data-testid="my-carousel">
@@ -340,6 +340,7 @@ export function Carousel({
340
340
  {...htmlProps}>
341
341
  <div
342
342
  ref={composedRef}
343
+ tabIndex={0}
343
344
  {...stylex.props(
344
345
  styles.scroller,
345
346
  gapStyles[gap],
@@ -17,7 +17,7 @@ export const docs = {
17
17
  {className: 'astryx-chat-composer', visualProps: ['density']},
18
18
  {className: 'astryx-chat-composer-input'},
19
19
  {className: 'astryx-chat-composer-drawer', visualProps: ['collapsed']},
20
- {className: 'astryx-chat-message', visualProps: ['sender']},
20
+ {className: 'astryx-chat-message', visualProps: ['sender', 'density']},
21
21
  {
22
22
  className: 'astryx-chat-message-bubble',
23
23
  visualProps: ['sender', 'variant', 'density'],
@@ -2,6 +2,7 @@
2
2
 
3
3
  import {describe, it, expect, vi, afterEach} from 'vitest';
4
4
  import {render, screen, fireEvent} from '@testing-library/react';
5
+ import {ChatComposer} from './ChatComposer';
5
6
  import {ChatComposerInput} from './ChatComposerInput';
6
7
  import type {
7
8
  ChatComposerTrigger,
@@ -129,6 +130,29 @@ describe('ChatComposerInput', () => {
129
130
  fireEvent.keyDown(textbox, {key: 'Enter'});
130
131
  expect(onSubmit).not.toHaveBeenCalled();
131
132
  });
133
+
134
+ it('keeps parent submit flow when child onChange observes input changes', () => {
135
+ const onSubmit = vi.fn();
136
+ const onInputChange = vi.fn();
137
+ render(
138
+ <ChatComposer
139
+ onSubmit={onSubmit}
140
+ input={<ChatComposerInput onChange={onInputChange} />}
141
+ />,
142
+ );
143
+
144
+ const textbox = screen.getByRole('textbox');
145
+ textbox.textContent = 'hello world';
146
+ fireEvent.input(textbox);
147
+
148
+ expect(onInputChange).toHaveBeenLastCalledWith('hello world');
149
+
150
+ fireEvent.keyDown(textbox, {key: 'Enter'});
151
+
152
+ expect(onSubmit).toHaveBeenCalledWith('hello world');
153
+ expect(onInputChange).toHaveBeenLastCalledWith('');
154
+ expect(textbox.textContent).toBe('');
155
+ });
132
156
  });
133
157
 
134
158
  // Controlled-value sync used to overwrite `textContent` on every
@@ -283,12 +283,13 @@ function serialize(node: Node): string {
283
283
 
284
284
  export function ChatComposerInput(props: ChatComposerInputProps) {
285
285
  const composerCtx = useChatComposerContext();
286
+ const hasControlledValueProp = props.value !== undefined;
286
287
 
287
288
  const {
288
289
  ref,
289
290
  handleRef,
290
291
  value: controlledValue = composerCtx?.value,
291
- onChange = composerCtx?.onChange,
292
+ onChange: onChangeProp,
292
293
  placeholder = composerCtx?.placeholder ?? 'Type a message\u2026',
293
294
  maxRows = 8,
294
295
  triggers,
@@ -306,6 +307,21 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
306
307
  ...rest
307
308
  } = props;
308
309
 
310
+ const composerOnChange = composerCtx?.onChange;
311
+ const onChange = useCallback(
312
+ (nextValue: string) => {
313
+ if (hasControlledValueProp) {
314
+ onChangeProp?.(nextValue);
315
+ return;
316
+ }
317
+ composerOnChange?.(nextValue);
318
+ if (onChangeProp !== composerOnChange) {
319
+ onChangeProp?.(nextValue);
320
+ }
321
+ },
322
+ [composerOnChange, hasControlledValueProp, onChangeProp],
323
+ );
324
+
309
325
  const editableRef = useRef<HTMLDivElement>(null);
310
326
  const selfRef = useRef<ChatComposerInputHandle>(null);
311
327
  const [isEmpty, setIsEmpty] = useState(true);
@@ -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
  });