@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
@@ -77,6 +77,22 @@ describe('Collapsible', () => {
77
77
  expect(screen.getByText('Hidden content')).not.toBeVisible();
78
78
  });
79
79
 
80
+ it('links the trigger to its content region via aria-controls', () => {
81
+ render(
82
+ <Collapsible trigger="Details">
83
+ <p>Region content</p>
84
+ </Collapsible>,
85
+ );
86
+
87
+ const trigger = screen.getByRole('button', {name: /Details/});
88
+ const controlsId = trigger.getAttribute('aria-controls');
89
+ // aria-controls must be present and point at the real content region.
90
+ expect(controlsId).toBeTruthy();
91
+ const region = document.getElementById(controlsId as string);
92
+ expect(region).not.toBeNull();
93
+ expect(region).toContainElement(screen.getByText('Region content'));
94
+ });
95
+
80
96
  it('respects controlled isOpen/onOpenChange', async () => {
81
97
  const onOpenChange = vi.fn();
82
98
  const user = userEvent.setup();
@@ -111,6 +127,36 @@ describe('Collapsible', () => {
111
127
  expect(screen.getByText('Controlled content')).not.toBeVisible();
112
128
  });
113
129
 
130
+ it('self-toggles in uncontrolled mode even when onOpenChange is supplied', async () => {
131
+ // Regression: passing onOpenChange without isOpen must NOT make the
132
+ // component behave as controlled. Internal state should still drive
133
+ // visibility, and the callback should fire in addition.
134
+ const onOpenChange = vi.fn();
135
+ const user = userEvent.setup();
136
+ render(
137
+ <Collapsible trigger="Uncontrolled" onOpenChange={onOpenChange}>
138
+ <p>Uncontrolled content</p>
139
+ </Collapsible>,
140
+ );
141
+
142
+ const trigger = screen.getByRole('button', {name: /Uncontrolled/});
143
+ // Starts open (defaultIsOpen defaults to true).
144
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
145
+ expect(screen.getByText('Uncontrolled content')).toBeVisible();
146
+
147
+ // Click collapses via internal state AND notifies.
148
+ await user.click(trigger);
149
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
150
+ expect(screen.getByText('Uncontrolled content')).not.toBeVisible();
151
+ expect(onOpenChange).toHaveBeenNthCalledWith(1, false);
152
+
153
+ // Click again re-expands — proving the component isn't stuck.
154
+ await user.click(trigger);
155
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
156
+ expect(screen.getByText('Uncontrolled content')).toBeVisible();
157
+ expect(onOpenChange).toHaveBeenNthCalledWith(2, true);
158
+ });
159
+
114
160
  it('renders chevron indicator', () => {
115
161
  render(
116
162
  <Collapsible trigger="With Chevron">
@@ -397,4 +443,272 @@ describe('CollapsibleGroup', () => {
397
443
  expect(trigger).toHaveAttribute('aria-expanded', 'true');
398
444
  });
399
445
  });
446
+
447
+ describe('dividers', () => {
448
+ function getItem(name: RegExp): HTMLElement {
449
+ const root = screen
450
+ .getByRole('button', {name})
451
+ .closest('.astryx-collapsible');
452
+ expect(root).not.toBeNull();
453
+ return root as HTMLElement;
454
+ }
455
+
456
+ it('renders no wrapper DOM by default and with hasDividers={false}', () => {
457
+ const {container, rerender} = render(
458
+ <CollapsibleGroup>
459
+ <Collapsible trigger="Item A" value="a">
460
+ <p>Content A</p>
461
+ </Collapsible>
462
+ </CollapsibleGroup>,
463
+ );
464
+ expect(container.querySelector('.astryx-collapsible-group')).toBeNull();
465
+
466
+ rerender(
467
+ <CollapsibleGroup hasDividers={false}>
468
+ <Collapsible trigger="Item A" value="a">
469
+ <p>Content A</p>
470
+ </Collapsible>
471
+ </CollapsibleGroup>,
472
+ );
473
+ expect(container.querySelector('.astryx-collapsible-group')).toBeNull();
474
+ });
475
+
476
+ it('renders a wrapper with default density when dividers are enabled', () => {
477
+ const {container} = render(
478
+ <CollapsibleGroup hasDividers>
479
+ <Collapsible trigger="Item A" value="a">
480
+ <p>Content A</p>
481
+ </Collapsible>
482
+ <Collapsible trigger="Item B" value="b">
483
+ <p>Content B</p>
484
+ </Collapsible>
485
+ </CollapsibleGroup>,
486
+ );
487
+
488
+ const wrapper = container.querySelector('.astryx-collapsible-group');
489
+ expect(wrapper).not.toBeNull();
490
+ // Divided groups default to balanced density
491
+ expect(wrapper).toHaveAttribute('data-density', 'balanced');
492
+ expect(wrapper).toContainElement(getItem(/Item A/));
493
+ expect(wrapper).toContainElement(getItem(/Item B/));
494
+ });
495
+
496
+ it('reflects density on each item when dividers are enabled', () => {
497
+ render(
498
+ <CollapsibleGroup hasDividers density="compact">
499
+ <Collapsible trigger="Item A" value="a">
500
+ <p>Content A</p>
501
+ </Collapsible>
502
+ </CollapsibleGroup>,
503
+ );
504
+
505
+ expect(getItem(/Item A/)).toHaveAttribute('data-density', 'compact');
506
+ });
507
+
508
+ it('does not reflect divider chrome on items without dividers', () => {
509
+ render(
510
+ <CollapsibleGroup>
511
+ <Collapsible trigger="Item A" value="a">
512
+ <p>Content A</p>
513
+ </Collapsible>
514
+ </CollapsibleGroup>,
515
+ );
516
+
517
+ expect(getItem(/Item A/)).not.toHaveAttribute('data-density');
518
+ });
519
+
520
+ it('applies density without dividers (and without a wrapper)', () => {
521
+ const {container} = render(
522
+ <CollapsibleGroup density="spacious">
523
+ <Collapsible trigger="Item A" value="a">
524
+ <p>Content A</p>
525
+ </Collapsible>
526
+ </CollapsibleGroup>,
527
+ );
528
+
529
+ expect(container.querySelector('.astryx-collapsible-group')).toBeNull();
530
+ expect(getItem(/Item A/)).toHaveAttribute('data-density', 'spacious');
531
+ });
532
+
533
+ it('does not leak divider chrome into nested collapsibles', () => {
534
+ render(
535
+ <CollapsibleGroup hasDividers defaultValue="outer">
536
+ <Collapsible trigger="Outer" value="outer">
537
+ <Collapsible trigger="Nested">
538
+ <p>Nested content</p>
539
+ </Collapsible>
540
+ </Collapsible>
541
+ </CollapsibleGroup>,
542
+ );
543
+
544
+ expect(getItem(/Outer/)).toHaveAttribute('data-density', 'balanced');
545
+ expect(getItem(/Nested/)).not.toHaveAttribute('data-density');
546
+ });
547
+
548
+ it('keeps group coordination working with dividers enabled', async () => {
549
+ const user = userEvent.setup();
550
+ render(
551
+ <CollapsibleGroup type="single" hasDividers defaultValue="a">
552
+ <Collapsible trigger="Item A" value="a">
553
+ <p>Content A</p>
554
+ </Collapsible>
555
+ <Collapsible trigger="Item B" value="b">
556
+ <p>Content B</p>
557
+ </Collapsible>
558
+ </CollapsibleGroup>,
559
+ );
560
+
561
+ expect(screen.getByText('Content A')).toBeVisible();
562
+ await user.click(screen.getByRole('button', {name: /Item B/}));
563
+ expect(screen.getByText('Content A')).not.toBeVisible();
564
+ expect(screen.getByText('Content B')).toBeVisible();
565
+ });
566
+
567
+ it('applies xstyle/className/style to the wrapper in divider mode', () => {
568
+ const {container} = render(
569
+ <CollapsibleGroup
570
+ hasDividers
571
+ className="custom-class"
572
+ data-testid="group">
573
+ <Collapsible trigger="Item A" value="a">
574
+ <p>Content A</p>
575
+ </Collapsible>
576
+ </CollapsibleGroup>,
577
+ );
578
+
579
+ const wrapper = container.querySelector('.astryx-collapsible-group');
580
+ expect(wrapper).toHaveClass('custom-class');
581
+ expect(wrapper).toHaveAttribute('data-testid', 'group');
582
+ });
583
+
584
+ it('forwards ref to the wrapper in divider mode', () => {
585
+ const ref = {current: null as HTMLElement | null};
586
+ const {container} = render(
587
+ <CollapsibleGroup hasDividers ref={ref}>
588
+ <Collapsible trigger="Item A" value="a">
589
+ <p>Content A</p>
590
+ </Collapsible>
591
+ </CollapsibleGroup>,
592
+ );
593
+
594
+ expect(ref.current).toBe(
595
+ container.querySelector('.astryx-collapsible-group'),
596
+ );
597
+ });
598
+
599
+ it('explicit density overrides the divider default', () => {
600
+ const {container} = render(
601
+ <CollapsibleGroup hasDividers density="spacious">
602
+ <Collapsible trigger="Item A" value="a">
603
+ <p>Content A</p>
604
+ </Collapsible>
605
+ </CollapsibleGroup>,
606
+ );
607
+
608
+ const wrapper = container.querySelector('.astryx-collapsible-group');
609
+ expect(wrapper).toHaveAttribute('data-density', 'spacious');
610
+ expect(getItem(/Item A/)).toHaveAttribute('data-density', 'spacious');
611
+ });
612
+
613
+ it('tolerates interleaved non-Collapsible children', async () => {
614
+ const user = userEvent.setup();
615
+ render(
616
+ <CollapsibleGroup type="single" hasDividers defaultValue="a">
617
+ <Collapsible trigger="Item A" value="a">
618
+ <p>Content A</p>
619
+ </Collapsible>
620
+ <hr data-testid="separator" />
621
+ <Collapsible trigger="Item B" value="b">
622
+ <p>Content B</p>
623
+ </Collapsible>
624
+ </CollapsibleGroup>,
625
+ );
626
+
627
+ expect(screen.getByTestId('separator')).toBeInTheDocument();
628
+ expect(getItem(/Item A/)).toHaveAttribute('data-density', 'balanced');
629
+ expect(getItem(/Item B/)).toHaveAttribute('data-density', 'balanced');
630
+ await user.click(screen.getByRole('button', {name: /Item B/}));
631
+ expect(screen.getByText('Content A')).not.toBeVisible();
632
+ expect(screen.getByText('Content B')).toBeVisible();
633
+ });
634
+
635
+ it('lets a nested group define its own chrome instead of inheriting', () => {
636
+ render(
637
+ <CollapsibleGroup hasDividers defaultValue="outer">
638
+ <Collapsible trigger="Outer" value="outer">
639
+ <CollapsibleGroup type="multiple" hasDividers density="compact">
640
+ <Collapsible trigger="Inner divided" value="in-a">
641
+ <p>Inner content</p>
642
+ </Collapsible>
643
+ </CollapsibleGroup>
644
+ <CollapsibleGroup type="multiple">
645
+ <Collapsible trigger="Inner plain" value="in-b">
646
+ <p>Inner content</p>
647
+ </Collapsible>
648
+ </CollapsibleGroup>
649
+ </Collapsible>
650
+ </CollapsibleGroup>,
651
+ );
652
+
653
+ expect(getItem(/Outer/)).toHaveAttribute('data-density', 'balanced');
654
+ expect(getItem(/Inner divided/)).toHaveAttribute(
655
+ 'data-density',
656
+ 'compact',
657
+ );
658
+ expect(getItem(/Inner plain/)).not.toHaveAttribute('data-density');
659
+ });
660
+
661
+ it('keeps controlled coordination and onChange shape with dividers', async () => {
662
+ const user = userEvent.setup();
663
+ const onChange = vi.fn();
664
+ const {rerender} = render(
665
+ <CollapsibleGroup
666
+ type="single"
667
+ hasDividers
668
+ value="a"
669
+ onChange={onChange}>
670
+ <Collapsible trigger="Item A" value="a">
671
+ <p>Content A</p>
672
+ </Collapsible>
673
+ <Collapsible trigger="Item B" value="b">
674
+ <p>Content B</p>
675
+ </Collapsible>
676
+ </CollapsibleGroup>,
677
+ );
678
+
679
+ await user.click(screen.getByRole('button', {name: /Item B/}));
680
+ expect(onChange).toHaveBeenCalledWith('b');
681
+ // Controlled: nothing opens until the parent passes the new value
682
+ expect(screen.getByText('Content B')).not.toBeVisible();
683
+
684
+ rerender(
685
+ <CollapsibleGroup
686
+ type="single"
687
+ hasDividers
688
+ value="b"
689
+ onChange={onChange}>
690
+ <Collapsible trigger="Item A" value="a">
691
+ <p>Content A</p>
692
+ </Collapsible>
693
+ <Collapsible trigger="Item B" value="b">
694
+ <p>Content B</p>
695
+ </Collapsible>
696
+ </CollapsibleGroup>,
697
+ );
698
+ expect(screen.getByText('Content A')).not.toBeVisible();
699
+ expect(screen.getByText('Content B')).toBeVisible();
700
+ });
701
+
702
+ it('renders standalone Collapsible without any group chrome', () => {
703
+ render(
704
+ <Collapsible trigger="Alone">
705
+ <p>Standalone content</p>
706
+ </Collapsible>,
707
+ );
708
+
709
+ const item = getItem(/Alone/);
710
+ expect(item).not.toHaveAttribute('data-density');
711
+ expect(item.querySelector('.astryx-collapsible-group')).toBeNull();
712
+ });
713
+ });
400
714
  });
@@ -4,13 +4,17 @@
4
4
 
5
5
  /**
6
6
  * @file CollapsibleGroup.tsx
7
- * @input Uses React useState, useCallback, CollapsibleGroupContext
7
+ * @input Uses React useState, useCallback, CollapsibleGroupContext, StyleX, theme tokens
8
8
  * @output Exports CollapsibleGroup component and CollapsibleGroupProps
9
- * @position Core collapsible group coordination provider — renders no wrapper DOM
9
+ * @position Core collapsible group coordination provider — renders no wrapper
10
+ * DOM unless `hasDividers` is set
10
11
  *
11
12
  * CollapsibleGroup groups collapsible components (Card, etc.) with
12
- * coordinated open/close behavior. It renders only `{children}` — no wrapper
13
- * DOM element.
13
+ * coordinated open/close behavior. By default it renders only `{children}` —
14
+ * no wrapper DOM element. When `hasDividers` is set it renders a wrapper div
15
+ * that anchors reliable :first-child divider suppression and provides
16
+ * hasDividers/density to items via CollapsibleGroupPresentationContext — each
17
+ * Collapsible draws its own borders since StyleX has no child selectors.
14
18
  *
15
19
  * In "single" mode (default), only one item can be open at a time.
16
20
  * In "multiple" mode, any number of items can be open simultaneously.
@@ -24,10 +28,29 @@
24
28
  */
25
29
 
26
30
  import React, {useCallback, useMemo, useState, type ReactNode} from 'react';
27
- import {CollapsibleGroupContext} from './CollapsibleGroupContext';
28
- import type {CollapsibleGroupContextValue} from './CollapsibleGroupContext';
31
+ import * as stylex from '@stylexjs/stylex';
32
+ import {
33
+ CollapsibleGroupContext,
34
+ CollapsibleGroupPresentationContext,
35
+ } from './CollapsibleGroupContext';
36
+ import type {
37
+ CollapsibleGroupContextValue,
38
+ CollapsibleGroupDensity,
39
+ CollapsibleGroupPresentationValue,
40
+ } from './CollapsibleGroupContext';
41
+ import {mergeProps} from '../utils';
42
+ import {themeProps} from '../utils/themeProps';
29
43
  import type {BaseProps} from '../BaseProps';
30
44
 
45
+ const styles = stylex.create({
46
+ // The wrapper lays items out in a column; between-item hairlines are drawn
47
+ // by each Collapsible (borderBlockStart, suppressed on :first-child).
48
+ wrapper: {
49
+ display: 'flex',
50
+ flexDirection: 'column',
51
+ },
52
+ });
53
+
31
54
  export interface CollapsibleGroupProps extends Omit<
32
55
  BaseProps<HTMLElement>,
33
56
  'onChange'
@@ -56,6 +79,23 @@ export interface CollapsibleGroupProps extends Omit<
56
79
  */
57
80
  onChange?: (value: string | string[]) => void;
58
81
 
82
+ /**
83
+ * Whether to draw hairline dividers between the group's items — the
84
+ * accordion row chrome. When set, the group renders a wrapper div (it
85
+ * otherwise renders no DOM) and items get 'balanced' density unless
86
+ * `density` says otherwise. Pair with bare Collapsible children; Card-wrapped
87
+ * items provide their own separation.
88
+ * @default false
89
+ */
90
+ hasDividers?: boolean;
91
+
92
+ /**
93
+ * Row density controlling trigger and content block padding on the group's
94
+ * items. Defaults to 'balanced' when dividers are shown; otherwise items
95
+ * keep their default unpadded look.
96
+ */
97
+ density?: CollapsibleGroupDensity;
98
+
59
99
  /**
60
100
  * Children — any components that support isCollapsible + value.
61
101
  *
@@ -92,16 +132,26 @@ function normalizeToArray(value: string | string[] | undefined): string[] {
92
132
 
93
133
  /**
94
134
  * Groups collapsible components with coordinated open/close behavior.
95
- * Renders no wrapper DOM.
135
+ * Renders no wrapper DOM unless `hasDividers` is set.
96
136
  *
97
137
  * In "single" mode (default), opening one item closes the others.
98
138
  * In "multiple" mode, items toggle independently.
99
139
  *
100
140
  * @compositionHint Wrap Collapsible instances to coordinate their open/close state.
101
- * Each Collapsible needs a `value` prop to participate.
141
+ * Each Collapsible needs a `value` prop to participate. For FAQ-style lists,
142
+ * use `hasDividers` with bare Collapsible children instead of wrapping each
143
+ * item in Card.
102
144
  *
103
145
  * @example
104
146
  * ```
147
+ * <CollapsibleGroup type="single" hasDividers defaultValue="faq1">
148
+ * <Collapsible trigger="What is Astryx?" value="faq1">
149
+ * Astryx is a design system for building internal tools.
150
+ * </Collapsible>
151
+ * <Collapsible trigger="How do I start?" value="faq2">
152
+ * Install the package and import components.
153
+ * </Collapsible>
154
+ * </CollapsibleGroup>
105
155
  * <CollapsibleGroup type="single" defaultValue="faq1">
106
156
  * <VStack gap={2}>
107
157
  * <Card>
@@ -123,7 +173,14 @@ export function CollapsibleGroup({
123
173
  defaultValue,
124
174
  value: controlledValue,
125
175
  onChange,
176
+ hasDividers = false,
177
+ density,
126
178
  children,
179
+ ref,
180
+ xstyle,
181
+ className,
182
+ style,
183
+ ...props
127
184
  }: CollapsibleGroupProps) {
128
185
  const isControlled = controlledValue !== undefined;
129
186
  const [internalValue, setInternalValue] = useState<string[]>(() =>
@@ -174,9 +231,40 @@ export function CollapsibleGroup({
174
231
  [isOpen, toggle],
175
232
  );
176
233
 
234
+ const resolvedDensity = density ?? (hasDividers ? 'balanced' : null);
235
+
236
+ const presentationValue = useMemo<CollapsibleGroupPresentationValue>(
237
+ () => ({hasDividers, density: resolvedDensity}),
238
+ [hasDividers, resolvedDensity],
239
+ );
240
+
241
+ // The wrapper anchors divider chrome: it makes the items' :first-child
242
+ // suppression independent of surrounding siblings. Without dividers the
243
+ // group stays DOM-less (documented contract), so ref/xstyle/className/style
244
+ // only take effect in wrapper mode.
245
+ const content = hasDividers ? (
246
+ <div
247
+ ref={ref as React.Ref<HTMLDivElement>}
248
+ {...mergeProps(
249
+ themeProps('collapsible-group', {
250
+ density: resolvedDensity ?? undefined,
251
+ }),
252
+ stylex.props(styles.wrapper, xstyle),
253
+ className,
254
+ style,
255
+ )}
256
+ {...props}>
257
+ {children}
258
+ </div>
259
+ ) : (
260
+ children
261
+ );
262
+
177
263
  return (
178
264
  <CollapsibleGroupContext value={contextValue}>
179
- {children}
265
+ <CollapsibleGroupPresentationContext value={presentationValue}>
266
+ {content}
267
+ </CollapsibleGroupPresentationContext>
180
268
  </CollapsibleGroupContext>
181
269
  );
182
270
  }
@@ -5,8 +5,10 @@
5
5
  /**
6
6
  * @file CollapsibleGroupContext.tsx
7
7
  * @input Uses React createContext
8
- * @output Exports CollapsibleGroupContext and CollapsibleGroupContextValue type
9
- * @position Context definition for collapsible group coordination
8
+ * @output Exports CollapsibleGroupContext, CollapsibleGroupContextValue,
9
+ * CollapsibleGroupPresentationContext, CollapsibleGroupPresentationValue,
10
+ * and CollapsibleGroupDensity types
11
+ * @position Context definitions for collapsible group coordination and presentation
10
12
  *
11
13
  * SYNC: When modified, update these files to stay in sync:
12
14
  * - /packages/core/src/Collapsible/CollapsibleGroup.tsx (provider)
@@ -33,3 +35,33 @@ export interface CollapsibleGroupContextValue {
33
35
  export const CollapsibleGroupContext =
34
36
  createContext<CollapsibleGroupContextValue | null>(null);
35
37
  CollapsibleGroupContext.displayName = 'CollapsibleGroupContext';
38
+
39
+ /**
40
+ * Row density for the items of a CollapsibleGroup, controlling trigger and
41
+ * content block padding. Shares the repo-wide density vocabulary
42
+ * (Table, List, Item).
43
+ */
44
+ export type CollapsibleGroupDensity = 'compact' | 'balanced' | 'spacious';
45
+
46
+ /**
47
+ * Presentation value provided by CollapsibleGroup so each Collapsible can
48
+ * draw its own group chrome (StyleX has no child selectors, so the group
49
+ * cannot style items from the outside).
50
+ */
51
+ export interface CollapsibleGroupPresentationValue {
52
+ /** Whether the group's items draw hairline dividers between one another. */
53
+ hasDividers: boolean;
54
+ /** Resolved row density, or null to keep the default (unpadded) look. */
55
+ density: CollapsibleGroupDensity | null;
56
+ }
57
+
58
+ /**
59
+ * Context for collapsible group presentation (dividers, density).
60
+ * Kept separate from CollapsibleGroupContext so the public useCollapsible
61
+ * state API is unaffected. Collapsible resets this context around its
62
+ * children so nested collapsibles never inherit row chrome.
63
+ */
64
+ export const CollapsibleGroupPresentationContext =
65
+ createContext<CollapsibleGroupPresentationValue | null>(null);
66
+ CollapsibleGroupPresentationContext.displayName =
67
+ 'CollapsibleGroupPresentationContext';
@@ -16,6 +16,7 @@ export type {CollapsibleProps} from './Collapsible';
16
16
 
17
17
  export {CollapsibleGroup} from './CollapsibleGroup';
18
18
  export type {CollapsibleGroupProps} from './CollapsibleGroup';
19
+ export type {CollapsibleGroupDensity} from './CollapsibleGroupContext';
19
20
 
20
21
  export {useCollapsible} from './useCollapsible';
21
22
  export type {
@@ -65,8 +65,11 @@ export interface UseCollapsibleReturn {
65
65
  *
66
66
  * Supports three modes:
67
67
  * 1. **Group-controlled**: When inside a CollapsibleGroup with a `value`, defers to group.
68
- * 2. **Controlled**: When `isOpen` and `onOpenChange` are provided in config.
68
+ * 2. **Controlled**: When `isOpen` is provided in config, the parent owns state;
69
+ * `toggle` only calls `onOpenChange` and never mutates internal state.
69
70
  * 3. **Uncontrolled**: Self-managed internal state with optional `defaultIsOpen`.
71
+ * `onOpenChange`, if supplied, is invoked in addition to the internal update —
72
+ * it is a notification callback, not a signal that the component is controlled.
70
73
  *
71
74
  * @example
72
75
  * ```
@@ -111,15 +114,26 @@ export function useCollapsible(
111
114
  isOpen = internalIsOpen;
112
115
  }
113
116
 
114
- // Toggle handler dispatches to the appropriate controller
117
+ // Toggle handler dispatches to the appropriate controller.
118
+ //
119
+ // Controlled vs uncontrolled is decided by whether `isOpen` was provided —
120
+ // mirroring how `isOpen` is derived above. `onOpenChange` is a notification
121
+ // callback, not a signal of control: an uncontrolled component may still want
122
+ // to observe changes. So in uncontrolled mode we drive internal state AND
123
+ // fire the callback; only in controlled mode do we defer entirely to the
124
+ // parent via the callback.
115
125
  const toggle = () => {
116
126
  if (isControlledByGroup && value != null) {
117
127
  group.toggle(value);
118
- } else if (config?.onOpenChange) {
119
- config.onOpenChange(!isOpen);
120
- } else {
121
- setInternalIsOpen(prev => !prev);
128
+ return;
122
129
  }
130
+ const next = !isOpen;
131
+ // Uncontrolled: internal state is the source of truth, so update it.
132
+ if (config?.isOpen === undefined) {
133
+ setInternalIsOpen(next);
134
+ }
135
+ // Always notify — for both controlled and uncontrolled usage.
136
+ config?.onOpenChange?.(next);
123
137
  };
124
138
 
125
139
  return {isEnabled, isOpen, toggle};
@@ -20,6 +20,10 @@ export const docs = {
20
20
  'navigation',
21
21
  ],
22
22
  description: 'Root component. Manages open state, search, keyboard navigation, and composition slots.',
23
+ // Intentionally a contained isInline preview, not playground.overlay: the
24
+ // component stays visible on load and knobs stay live, whereas a real
25
+ // showModal() overlay makes the page inert — see PlaygroundConfig.overlay
26
+ // in docs-types.ts (#3657).
23
27
  playground: {
24
28
  defaults: {
25
29
  isOpen: true,
@@ -138,6 +142,7 @@ export const docs = {
138
142
  ],
139
143
  theming: {
140
144
  targets: [
145
+ {className: 'astryx-command-palette-empty'},
141
146
  {className: 'astryx-command-palette-footer'},
142
147
  {className: 'astryx-command-palette-group'},
143
148
  {className: 'astryx-command-palette-input'},
@@ -438,11 +438,13 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
438
438
  const contextValue = useMemo(
439
439
  () => ({
440
440
  // Input uses optimisticSearch — reflects keystrokes immediately.
441
- // setSearch calls setOptimisticSearch for instant feedback then
442
- // triggers the async search directly (no effect indirection).
441
+ // setSearch calls setOptimisticSearch inside a transition for instant
442
+ // feedback then triggers the async search directly (no effect indirection).
443
443
  search: optimisticSearch,
444
444
  setSearch: (query: string) => {
445
- setOptimisticSearch(query);
445
+ startTransition(() => {
446
+ setOptimisticSearch(query);
447
+ });
446
448
  runSearch(query);
447
449
  },
448
450
  value,
@@ -16,6 +16,11 @@ export const docs = {
16
16
  required: true,
17
17
  },
18
18
  ],
19
+ playground: {
20
+ defaults: {
21
+ children: 'No results found. Try a different search.',
22
+ },
23
+ },
19
24
  };
20
25
 
21
26
  export const docsZh = {
@@ -27,6 +27,16 @@ export const docs = {
27
27
  description: 'StyleX styles for layout customization. Must be a stylex.create() value.',
28
28
  },
29
29
  ],
30
+ playground: {
31
+ defaults: {
32
+ heading: 'Navigation',
33
+ children: [
34
+ {__element: 'CommandPaletteItem', props: {value: 'home', onSelect: undefined}, children: 'Go Home'},
35
+ {__element: 'CommandPaletteItem', props: {value: 'settings', onSelect: undefined}, children: 'Open Settings'},
36
+ {__element: 'CommandPaletteItem', props: {value: 'profile', onSelect: undefined}, children: 'View Profile'},
37
+ ],
38
+ },
39
+ },
30
40
  };
31
41
 
32
42
  export const docsZh = {
@@ -57,6 +57,12 @@ export const docs = {
57
57
  description: 'StyleX styles for layout customization. Must be a stylex.create() value.',
58
58
  },
59
59
  ],
60
+ playground: {
61
+ defaults: {
62
+ placeholder: 'Search commands, files, or actions...',
63
+ hasAutoFocus: false,
64
+ },
65
+ },
60
66
  };
61
67
 
62
68
  export const docsZh = {