@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,403 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Collapsible.test.tsx
5
+ * @input Uses vitest, @testing-library/react, Collapsible + CollapsibleGroup
6
+ * @output Characterization coverage for Collapsible behavior
7
+ * @position Testing; validates Collapsible.tsx (disclosure primitive)
8
+ *
9
+ * SYNC: When Collapsible.tsx changes, update tests to match new behavior
10
+ */
11
+
12
+ import {describe, it, expect, vi} from 'vitest';
13
+ import {render, screen, within} from '@testing-library/react';
14
+ import userEvent from '@testing-library/user-event';
15
+ import {Collapsible} from './Collapsible';
16
+ import {CollapsibleGroup} from './CollapsibleGroup';
17
+
18
+ /**
19
+ * Resolves the content region a trigger controls via aria-controls, so tests
20
+ * assert the real disclosure linkage rather than guessing at DOM structure.
21
+ */
22
+ function contentFor(trigger: HTMLElement): HTMLElement {
23
+ const id = trigger.getAttribute('aria-controls');
24
+ expect(id).toBeTruthy();
25
+ const el = document.getElementById(id as string);
26
+ expect(el).not.toBeNull();
27
+ return el as HTMLElement;
28
+ }
29
+
30
+ describe('Collapsible', () => {
31
+ describe('structure and rendering', () => {
32
+ it('renders the trigger content inside a button', () => {
33
+ render(
34
+ <Collapsible trigger="Details">
35
+ <p>Body</p>
36
+ </Collapsible>,
37
+ );
38
+ const button = screen.getByRole('button');
39
+ expect(button).toHaveTextContent('Details');
40
+ expect(button.tagName).toBe('BUTTON');
41
+ });
42
+
43
+ it('renders the trigger button with an explicit type="button"', () => {
44
+ // Prevents implicit form submission when used inside a <form>.
45
+ render(<Collapsible trigger="T">c</Collapsible>);
46
+ expect(screen.getByRole('button')).toHaveAttribute('type', 'button');
47
+ });
48
+
49
+ it('renders children inside the controlled content region', () => {
50
+ render(
51
+ <Collapsible trigger="Section">
52
+ <span data-testid="child">Hello</span>
53
+ </Collapsible>,
54
+ );
55
+ const content = contentFor(screen.getByRole('button'));
56
+ expect(within(content).getByTestId('child')).toBeInTheDocument();
57
+ });
58
+
59
+ it('links the trigger to its content via aria-controls', () => {
60
+ render(<Collapsible trigger="T">Body</Collapsible>);
61
+ const button = screen.getByRole('button');
62
+ const content = contentFor(button);
63
+ expect(button.getAttribute('aria-controls')).toBe(content.id);
64
+ });
65
+
66
+ it('renders the stable astryx-collapsible class on the root', () => {
67
+ render(
68
+ <Collapsible trigger="T" data-testid="root">
69
+ c
70
+ </Collapsible>,
71
+ );
72
+ expect(screen.getByTestId('root')).toHaveClass('astryx-collapsible');
73
+ });
74
+
75
+ it('renders a ReactNode trigger, not just a string', () => {
76
+ render(
77
+ <Collapsible trigger={<span data-testid="rich">Rich</span>}>
78
+ c
79
+ </Collapsible>,
80
+ );
81
+ expect(screen.getByTestId('rich')).toBeInTheDocument();
82
+ });
83
+ });
84
+
85
+ describe('uncontrolled open state', () => {
86
+ it('is open by default (aria-expanded="true")', () => {
87
+ render(<Collapsible trigger="T">Body</Collapsible>);
88
+ expect(screen.getByRole('button')).toHaveAttribute(
89
+ 'aria-expanded',
90
+ 'true',
91
+ );
92
+ });
93
+
94
+ it('honors defaultIsOpen={false} (starts collapsed)', () => {
95
+ render(
96
+ <Collapsible trigger="T" defaultIsOpen={false}>
97
+ Body
98
+ </Collapsible>,
99
+ );
100
+ expect(screen.getByRole('button')).toHaveAttribute(
101
+ 'aria-expanded',
102
+ 'false',
103
+ );
104
+ });
105
+
106
+ it('toggles open/closed when the trigger is clicked', async () => {
107
+ const user = userEvent.setup();
108
+ render(<Collapsible trigger="T">Body</Collapsible>);
109
+ const button = screen.getByRole('button');
110
+
111
+ expect(button).toHaveAttribute('aria-expanded', 'true');
112
+ await user.click(button);
113
+ expect(button).toHaveAttribute('aria-expanded', 'false');
114
+ await user.click(button);
115
+ expect(button).toHaveAttribute('aria-expanded', 'true');
116
+ });
117
+
118
+ it('opens a default-collapsed instance on click', async () => {
119
+ const user = userEvent.setup();
120
+ render(
121
+ <Collapsible trigger="T" defaultIsOpen={false}>
122
+ Body
123
+ </Collapsible>,
124
+ );
125
+ const button = screen.getByRole('button');
126
+ await user.click(button);
127
+ expect(button).toHaveAttribute('aria-expanded', 'true');
128
+ });
129
+
130
+ it('toggles via keyboard activation (Enter and Space)', async () => {
131
+ const user = userEvent.setup();
132
+ render(<Collapsible trigger="T">Body</Collapsible>);
133
+ const button = screen.getByRole('button');
134
+
135
+ button.focus();
136
+ expect(button).toHaveFocus();
137
+
138
+ await user.keyboard('{Enter}');
139
+ expect(button).toHaveAttribute('aria-expanded', 'false');
140
+ await user.keyboard(' ');
141
+ expect(button).toHaveAttribute('aria-expanded', 'true');
142
+ });
143
+
144
+ it('hides the content region (display:none) only when collapsed', async () => {
145
+ const user = userEvent.setup();
146
+ render(<Collapsible trigger="T">Body</Collapsible>);
147
+ const button = screen.getByRole('button');
148
+ const content = contentFor(button);
149
+
150
+ // Open: not display:none.
151
+ expect(content).not.toHaveStyle({display: 'none'});
152
+ await user.click(button);
153
+ // Collapsed: hidden via the contentHidden style.
154
+ expect(content).toHaveStyle({display: 'none'});
155
+ });
156
+
157
+ it('rotates the chevron indicator between open and closed states', async () => {
158
+ const user = userEvent.setup();
159
+ render(<Collapsible trigger="T">Body</Collapsible>);
160
+ const button = screen.getByRole('button');
161
+ // The chevron lives in the last span of the trigger button.
162
+ const chevron = button.querySelectorAll('span')[1];
163
+ const openClass = chevron.getAttribute('class');
164
+
165
+ await user.click(button);
166
+ const closedClass = chevron.getAttribute('class');
167
+ expect(closedClass).not.toEqual(openClass);
168
+ });
169
+ });
170
+
171
+ describe('controlled open state', () => {
172
+ it('reflects the isOpen prop', () => {
173
+ const {rerender} = render(
174
+ <Collapsible trigger="T" isOpen={false}>
175
+ Body
176
+ </Collapsible>,
177
+ );
178
+ expect(screen.getByRole('button')).toHaveAttribute(
179
+ 'aria-expanded',
180
+ 'false',
181
+ );
182
+
183
+ rerender(
184
+ <Collapsible trigger="T" isOpen={true}>
185
+ Body
186
+ </Collapsible>,
187
+ );
188
+ expect(screen.getByRole('button')).toHaveAttribute(
189
+ 'aria-expanded',
190
+ 'true',
191
+ );
192
+ });
193
+
194
+ it('calls onOpenChange with the negated state on click', async () => {
195
+ const user = userEvent.setup();
196
+ const onOpenChange = vi.fn();
197
+ render(
198
+ <Collapsible trigger="T" isOpen={false} onOpenChange={onOpenChange}>
199
+ Body
200
+ </Collapsible>,
201
+ );
202
+ await user.click(screen.getByRole('button'));
203
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
204
+ expect(onOpenChange).toHaveBeenCalledWith(true);
205
+ });
206
+
207
+ it('does not self-update when controlled without onOpenChange', async () => {
208
+ // A controlled instance is driven entirely by the isOpen prop; a click
209
+ // must not flip the visual state on its own.
210
+ const user = userEvent.setup();
211
+ render(
212
+ <Collapsible trigger="T" isOpen={false}>
213
+ Body
214
+ </Collapsible>,
215
+ );
216
+ const button = screen.getByRole('button');
217
+ await user.click(button);
218
+ expect(button).toHaveAttribute('aria-expanded', 'false');
219
+ });
220
+
221
+ it('stays put until the parent updates isOpen', async () => {
222
+ const user = userEvent.setup();
223
+ const onOpenChange = vi.fn();
224
+ const {rerender} = render(
225
+ <Collapsible trigger="T" isOpen={false} onOpenChange={onOpenChange}>
226
+ Body
227
+ </Collapsible>,
228
+ );
229
+ const button = screen.getByRole('button');
230
+ await user.click(button);
231
+ // Still closed — parent hasn't re-rendered with the new value yet.
232
+ expect(button).toHaveAttribute('aria-expanded', 'false');
233
+
234
+ rerender(
235
+ <Collapsible trigger="T" isOpen={true} onOpenChange={onOpenChange}>
236
+ Body
237
+ </Collapsible>,
238
+ );
239
+ expect(button).toHaveAttribute('aria-expanded', 'true');
240
+ });
241
+ });
242
+
243
+ describe('prop forwarding', () => {
244
+ it('forwards a ref to the root element', () => {
245
+ const ref = vi.fn();
246
+ render(
247
+ <Collapsible ref={ref} trigger="T">
248
+ c
249
+ </Collapsible>,
250
+ );
251
+ expect(ref).toHaveBeenCalledWith(expect.any(HTMLDivElement));
252
+ });
253
+
254
+ it('passes through data-testid and other DOM props to the root', () => {
255
+ render(
256
+ <Collapsible trigger="T" data-testid="root" data-custom="x">
257
+ c
258
+ </Collapsible>,
259
+ );
260
+ const root = screen.getByTestId('root');
261
+ expect(root).toHaveAttribute('data-custom', 'x');
262
+ });
263
+
264
+ it('exposes a displayName for devtools', () => {
265
+ expect(Collapsible.displayName).toBe('Collapsible');
266
+ });
267
+ });
268
+
269
+ describe('inside CollapsibleGroup (single mode)', () => {
270
+ it('opens the item matching defaultValue and closes the rest', () => {
271
+ render(
272
+ <CollapsibleGroup type="single" defaultValue="b">
273
+ <Collapsible trigger="A" value="a">
274
+ Body A
275
+ </Collapsible>
276
+ <Collapsible trigger="B" value="b">
277
+ Body B
278
+ </Collapsible>
279
+ </CollapsibleGroup>,
280
+ );
281
+ const [a, b] = screen.getAllByRole('button');
282
+ expect(a).toHaveAttribute('aria-expanded', 'false');
283
+ expect(b).toHaveAttribute('aria-expanded', 'true');
284
+ });
285
+
286
+ it('opening one item closes the previously open item', async () => {
287
+ const user = userEvent.setup();
288
+ render(
289
+ <CollapsibleGroup type="single" defaultValue="a">
290
+ <Collapsible trigger="A" value="a">
291
+ Body A
292
+ </Collapsible>
293
+ <Collapsible trigger="B" value="b">
294
+ Body B
295
+ </Collapsible>
296
+ </CollapsibleGroup>,
297
+ );
298
+ const [a, b] = screen.getAllByRole('button');
299
+ expect(a).toHaveAttribute('aria-expanded', 'true');
300
+
301
+ await user.click(b);
302
+ expect(a).toHaveAttribute('aria-expanded', 'false');
303
+ expect(b).toHaveAttribute('aria-expanded', 'true');
304
+ });
305
+
306
+ it('clicking the open item closes it (single mode allows all-closed)', async () => {
307
+ const user = userEvent.setup();
308
+ render(
309
+ <CollapsibleGroup type="single" defaultValue="a">
310
+ <Collapsible trigger="A" value="a">
311
+ Body A
312
+ </Collapsible>
313
+ </CollapsibleGroup>,
314
+ );
315
+ const a = screen.getByRole('button');
316
+ await user.click(a);
317
+ expect(a).toHaveAttribute('aria-expanded', 'false');
318
+ });
319
+
320
+ it('fires the group onChange with the newly opened value', async () => {
321
+ const user = userEvent.setup();
322
+ const onChange = vi.fn();
323
+ render(
324
+ <CollapsibleGroup type="single" onChange={onChange}>
325
+ <Collapsible trigger="A" value="a">
326
+ Body A
327
+ </Collapsible>
328
+ </CollapsibleGroup>,
329
+ );
330
+ await user.click(screen.getByRole('button'));
331
+ expect(onChange).toHaveBeenCalledWith('a');
332
+ });
333
+ });
334
+
335
+ describe('inside CollapsibleGroup (multiple mode)', () => {
336
+ it('allows several items open at once', async () => {
337
+ const user = userEvent.setup();
338
+ render(
339
+ <CollapsibleGroup type="multiple" defaultValue={['a']}>
340
+ <Collapsible trigger="A" value="a">
341
+ Body A
342
+ </Collapsible>
343
+ <Collapsible trigger="B" value="b">
344
+ Body B
345
+ </Collapsible>
346
+ </CollapsibleGroup>,
347
+ );
348
+ const [a, b] = screen.getAllByRole('button');
349
+ expect(a).toHaveAttribute('aria-expanded', 'true');
350
+ expect(b).toHaveAttribute('aria-expanded', 'false');
351
+
352
+ await user.click(b);
353
+ // Opening B does not close A in multiple mode.
354
+ expect(a).toHaveAttribute('aria-expanded', 'true');
355
+ expect(b).toHaveAttribute('aria-expanded', 'true');
356
+ });
357
+
358
+ it('fires onChange with the full array of open values', async () => {
359
+ const user = userEvent.setup();
360
+ const onChange = vi.fn();
361
+ render(
362
+ <CollapsibleGroup
363
+ type="multiple"
364
+ defaultValue={['a']}
365
+ onChange={onChange}>
366
+ <Collapsible trigger="A" value="a">
367
+ Body A
368
+ </Collapsible>
369
+ <Collapsible trigger="B" value="b">
370
+ Body B
371
+ </Collapsible>
372
+ </CollapsibleGroup>,
373
+ );
374
+ const [, b] = screen.getAllByRole('button');
375
+ await user.click(b);
376
+ expect(onChange).toHaveBeenCalledWith(['a', 'b']);
377
+ });
378
+ });
379
+
380
+ describe('group presentation (dividers + density)', () => {
381
+ it('reflects group density as a data attribute on items when dividers are enabled', () => {
382
+ render(
383
+ <CollapsibleGroup type="single" hasDividers density="compact">
384
+ <Collapsible trigger="A" value="a" data-testid="item-a">
385
+ Body A
386
+ </Collapsible>
387
+ </CollapsibleGroup>,
388
+ );
389
+ const item = screen.getByTestId('item-a');
390
+ expect(item).toHaveAttribute('data-density', 'compact');
391
+ });
392
+
393
+ it('omits density data attribute when standalone (no group)', () => {
394
+ render(
395
+ <Collapsible trigger="A" data-testid="item">
396
+ Body
397
+ </Collapsible>,
398
+ );
399
+ const item = screen.getByTestId('item');
400
+ expect(item).not.toHaveAttribute('data-density');
401
+ });
402
+ });
403
+ });
@@ -4,15 +4,21 @@
4
4
 
5
5
  /**
6
6
  * @file Collapsible.tsx
7
- * @input Uses React, StyleX, useCollapsible hook, getIcon, theme tokens
7
+ * @input Uses React, StyleX, useCollapsible hook, CollapsibleGroupPresentationContext, getIcon, theme tokens
8
8
  * @output Exports Collapsible component and CollapsibleProps
9
9
  * @position Collapsible content primitive — trigger toggles visibility of children
10
10
  *
11
11
  * Collapsible is a standalone primitive that makes any content collapsible.
12
12
  * It renders a trigger area (always visible) and a content area that toggles.
13
- * Handles state management, accessibility (aria-expanded), and chevron indicator.
13
+ * Handles state management, accessibility (aria-expanded + aria-controls linking
14
+ * the trigger to its content region), and chevron indicator.
14
15
  *
15
16
  * Works standalone or coordinated by CollapsibleGroup via the `value` prop.
17
+ * When the surrounding CollapsibleGroup sets `hasDividers`, each Collapsible
18
+ * draws its own row chrome (borderBlockStart suppressed on :first-child, plus
19
+ * density padding) from CollapsibleGroupPresentationContext — StyleX has no
20
+ * child selectors, so the group cannot draw it from outside. The presentation
21
+ * context is reset around children so nested collapsibles stay chrome-free.
16
22
  *
17
23
  * SYNC: When modified, update these files to stay in sync:
18
24
  * - /packages/core/src/Collapsible/index.ts (exports)
@@ -21,9 +27,10 @@
21
27
  * - /packages/cli/templates/blocks/components/Collapsible/ (showcase blocks)
22
28
  */
23
29
 
24
- import type {ReactNode} from 'react';
30
+ import {use, useId, type ReactNode} from 'react';
25
31
  import * as stylex from '@stylexjs/stylex';
26
32
  import {
33
+ borderVars,
27
34
  colorVars,
28
35
  typographyVars,
29
36
  fontWeightVars,
@@ -33,6 +40,7 @@ import {
33
40
  easeVars,
34
41
  } from '../theme/tokens.stylex';
35
42
  import {useCollapsible} from './useCollapsible';
43
+ import {CollapsibleGroupPresentationContext} from './CollapsibleGroupContext';
36
44
  import {getIcon} from '../Icon/globalIconRegistry';
37
45
  import {mergeProps} from '../utils';
38
46
  import type {BaseProps} from '../BaseProps';
@@ -57,6 +65,16 @@ const styles = stylex.create({
57
65
  color: colorVars['--color-text-primary'],
58
66
  textAlign: 'start',
59
67
  paddingBlock: 0,
68
+ // `all: unset` above wipes the UA focus outline; restore a keyboard-only
69
+ // focus ring using the standard token/offset (WCAG 2.4.7).
70
+ outline: {
71
+ default: null,
72
+ ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
73
+ },
74
+ outlineOffset: {
75
+ default: '0',
76
+ ':focus-visible': '2px',
77
+ },
60
78
  },
61
79
  // Capsize: trim leading from text triggers
62
80
  triggerLabel: {
@@ -87,8 +105,42 @@ const styles = stylex.create({
87
105
  content: {
88
106
  paddingBlockStart: spacingVars['--spacing-1'],
89
107
  },
108
+ // Group divider chrome — a hairline above every item except the first.
109
+ // The group's wrapper (or 'all' mode) owns the outer edges.
110
+ divided: {
111
+ borderBlockStartWidth: {
112
+ default: borderVars['--border-width'],
113
+ ':first-child': '0',
114
+ },
115
+ borderBlockStartStyle: 'solid',
116
+ borderBlockStartColor: colorVars['--color-border'],
117
+ },
118
+ });
119
+
120
+ // Density padding for divided/padded accordion rows. paddingBlock mapping
121
+ // follows Table's density scale (spacing-1/2/3); content only pads its end
122
+ // so text doesn't sit on the divider below (block-start stays spacing-1).
123
+ const densityStyles = stylex.create({
124
+ triggerCompact: {paddingBlock: spacingVars['--spacing-1']},
125
+ triggerBalanced: {paddingBlock: spacingVars['--spacing-2']},
126
+ triggerSpacious: {paddingBlock: spacingVars['--spacing-3']},
127
+ contentCompact: {paddingBlockEnd: spacingVars['--spacing-1']},
128
+ contentBalanced: {paddingBlockEnd: spacingVars['--spacing-2']},
129
+ contentSpacious: {paddingBlockEnd: spacingVars['--spacing-3']},
90
130
  });
91
131
 
132
+ const triggerDensity = {
133
+ compact: densityStyles.triggerCompact,
134
+ balanced: densityStyles.triggerBalanced,
135
+ spacious: densityStyles.triggerSpacious,
136
+ } as const;
137
+
138
+ const contentDensity = {
139
+ compact: densityStyles.contentCompact,
140
+ balanced: densityStyles.contentBalanced,
141
+ spacious: densityStyles.contentSpacious,
142
+ } as const;
143
+
92
144
  export interface CollapsibleProps extends BaseProps {
93
145
  /** Ref forwarded to the root element */
94
146
  ref?: React.Ref<HTMLDivElement>;
@@ -192,14 +244,24 @@ export function Collapsible({
192
244
  value,
193
245
  });
194
246
 
247
+ const presentation = use(CollapsibleGroupPresentationContext);
248
+ const isDivided = presentation?.hasDividers ?? false;
249
+ const density = presentation?.density ?? null;
250
+
195
251
  const chevronIcon = getIcon('chevronDown');
196
252
 
253
+ // Links the trigger to the region it shows/hides so assistive tech can move
254
+ // from the button to its controlled content (disclosure pattern).
255
+ const contentId = useId();
256
+
197
257
  return (
198
258
  <div
199
259
  ref={ref}
200
260
  {...mergeProps(
201
- themeProps('collapsible'),
202
- stylex.props(styles.root, xstyle),
261
+ themeProps('collapsible', {
262
+ density: density ?? undefined,
263
+ }),
264
+ stylex.props(styles.root, isDivided && styles.divided, xstyle),
203
265
  className,
204
266
  style,
205
267
  )}
@@ -208,7 +270,11 @@ export function Collapsible({
208
270
  type="button"
209
271
  onClick={toggle}
210
272
  aria-expanded={isOpen}
211
- {...stylex.props(styles.trigger)}>
273
+ aria-controls={contentId}
274
+ {...stylex.props(
275
+ styles.trigger,
276
+ density != null && triggerDensity[density],
277
+ )}>
212
278
  <span {...stylex.props(styles.triggerLabel)}>{trigger}</span>
213
279
  <span
214
280
  {...stylex.props(
@@ -219,10 +285,19 @@ export function Collapsible({
219
285
  </span>
220
286
  </button>
221
287
  <div
222
- {...(isOpen
223
- ? stylex.props(styles.content)
224
- : stylex.props(styles.content, styles.contentHidden))}>
225
- {children}
288
+ id={contentId}
289
+ {...stylex.props(
290
+ styles.content,
291
+ density != null && contentDensity[density],
292
+ !isOpen && styles.contentHidden,
293
+ )}>
294
+ {presentation != null ? (
295
+ <CollapsibleGroupPresentationContext value={null}>
296
+ {children}
297
+ </CollapsibleGroupPresentationContext>
298
+ ) : (
299
+ children
300
+ )}
226
301
  </div>
227
302
  </div>
228
303
  );
@@ -7,7 +7,7 @@ export const docs = {
7
7
  subComponentOf: 'Collapsible',
8
8
  displayName: 'Collapsible Group',
9
9
  isHiddenFromOverview: true,
10
- description: 'Coordinates multiple Collapsible instances so only one (single mode) or any number (multiple mode) can be open at a time. Renders no wrapper DOM element.',
10
+ description: 'Coordinates multiple Collapsible instances so only one (single mode) or any number (multiple mode) can be open at a time. Renders no wrapper DOM element unless dividers are enabled.',
11
11
  props: [
12
12
  {
13
13
  name: 'type',
@@ -30,6 +30,17 @@ export const docs = {
30
30
  type: '(value: string | string[]) => void',
31
31
  description: 'Callback invoked when the set of open items changes.',
32
32
  },
33
+ {
34
+ name: 'hasDividers',
35
+ type: 'boolean',
36
+ description: "Whether to draw hairline dividers between the group's items. When set, the group renders a wrapper div and items default to 'balanced' density. Pair with bare Collapsible children; Card-wrapped items provide their own separation.",
37
+ default: 'false',
38
+ },
39
+ {
40
+ name: 'density',
41
+ type: "'compact' | 'balanced' | 'spacious'",
42
+ description: "Row density controlling trigger and content block padding on the group's items. Defaults to 'balanced' when dividers are shown; otherwise items keep their default unpadded look.",
43
+ },
33
44
  {
34
45
  name: 'children',
35
46
  type: 'ReactNode',
@@ -52,7 +63,7 @@ export const docsZh = {
52
63
  name: 'CollapsibleGroup',
53
64
  isHiddenFromOverview: true,
54
65
  displayName: 'Collapsible Group',
55
- description: '协调多个 Collapsible 实例,使同一时间只有一个(single 模式)或任意数量(multiple 模式)可以展开。不渲染包裹 DOM 元素。',
66
+ description: '协调多个 Collapsible 实例,使同一时间只有一个(single 模式)或任意数量(multiple 模式)可以展开。除非启用 dividers,否则不渲染包裹 DOM 元素。',
56
67
  props: [
57
68
  {
58
69
  name: 'type',
@@ -75,6 +86,17 @@ export const docsZh = {
75
86
  type: '(value: string | string[]) => void',
76
87
  description: '展开项目集合变更时调用的回调。',
77
88
  },
89
+ {
90
+ name: 'hasDividers',
91
+ type: 'boolean',
92
+ description: "是否在组项目之间绘制细线分隔线。启用后组会渲染一个包裹 div,且项目默认使用 'balanced' 密度。适合搭配裸 Collapsible 子项使用;用 Card 包裹的项目自带视觉分隔。",
93
+ default: 'false',
94
+ },
95
+ {
96
+ name: 'density',
97
+ type: "'compact' | 'balanced' | 'spacious'",
98
+ description: "控制组内项目触发器和内容块内边距的行密度。显示分隔线时默认为 'balanced';否则项目保持默认的无内边距外观。",
99
+ },
78
100
  {
79
101
  name: 'children',
80
102
  type: 'ReactNode',
@@ -88,12 +110,14 @@ export const docsDense = {
88
110
  name: 'CollapsibleGroup',
89
111
  isHiddenFromOverview: true,
90
112
  displayName: 'Collapsible Group',
91
- description: 'coordinates multiple Collapsible instances; single or multiple open. no wrapper DOM.',
113
+ description: 'coordinates multiple Collapsible instances; single or multiple open. no wrapper DOM unless dividers enabled.',
92
114
  propDescriptions: {
93
115
  type: 'one or many items open simultaneously',
94
116
  defaultValue: 'default open item(s) (uncontrolled); string for single, array for multiple',
95
117
  value: 'controlled open item(s)',
96
118
  onChange: 'callback on open items change',
119
+ hasDividers: "draw hairline dividers between items; enables wrapper div + 'balanced' density; use bare Collapsible children",
120
+ density: "row padding 'compact' | 'balanced' | 'spacious'; defaults 'balanced' with dividers, else unpadded",
97
121
  children: 'Collapsible instances to coordinate',
98
122
  },
99
123
  };