@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
@@ -21,7 +21,7 @@ export const docs = {
21
21
  targets: [
22
22
  {className: 'astryx-side-nav', visualProps: ['mode']},
23
23
  {className: 'astryx-side-nav-heading'},
24
- {className: 'astryx-side-nav-item'},
24
+ {className: 'astryx-side-nav-item', visualProps: ['size'], states: ['selected']},
25
25
  {className: 'astryx-side-nav-section'},
26
26
  ],
27
27
  },
@@ -102,6 +102,12 @@ export const docs = {
102
102
  description: 'Enables collapse behavior. true for uncontrolled with default toggle button, or an object for controlled mode and advanced config (defaultIsCollapsed, isCollapsed + onCollapsedChange, hasButton, buttonLabel).',
103
103
  default: 'false',
104
104
  },
105
+ {
106
+ name: 'resizable',
107
+ type: 'boolean | { defaultWidth?: number; minWidth?: number; maxWidth?: number; autoSaveId?: string; onWidthChange?: (width: number) => void }',
108
+ description: 'Enables a resize handle at the inline-end edge. true for defaults (260px initial, 180-480px range), or a ResizableConfig object (defaultWidth, minWidth, maxWidth, autoSaveId for localStorage persistence, onWidthChange). The handle is hidden while collapsed.',
109
+ default: 'false',
110
+ },
105
111
  {
106
112
  name: 'handleRef',
107
113
  type: 'Ref<SideNavImperativeCollapseHandle>',
@@ -162,6 +162,61 @@ describe('SideNav', () => {
162
162
  screen.getByRole('button', {name: 'Expand sidebar'}),
163
163
  ).toBeInTheDocument();
164
164
  });
165
+
166
+ it('does not render an empty footer container when collapsible.hasButton is false', () => {
167
+ render(
168
+ <SideNav data-testid="nav" collapsible={{hasButton: false}}>
169
+ Content
170
+ </SideNav>,
171
+ );
172
+
173
+ // The built-in collapse button is opted out (consumers render their own
174
+ // SideNavCollapseButton in the header), so it must not appear...
175
+ expect(
176
+ screen.queryByRole('button', {name: 'Collapse sidebar'}),
177
+ ).not.toBeInTheDocument();
178
+
179
+ // ...and no empty sticky-bottom container should be left behind. With no
180
+ // footer/footerIcons and no built-in button, the scrollable content region
181
+ // is the nav's only child.
182
+ const nav = screen.getByTestId('nav');
183
+ expect(nav.children).toHaveLength(1);
184
+ });
185
+
186
+ it('fires a consumer onClick on the collapse button in addition to toggling', async () => {
187
+ const user = userEvent.setup();
188
+ const onClick = vi.fn();
189
+
190
+ function Example() {
191
+ const [isCollapsed, setIsCollapsed] = useState(false);
192
+ const handleRef = useRef<SideNavImperativeCollapseHandle>(null);
193
+ return (
194
+ <>
195
+ <SideNavCollapseButton handleRef={handleRef} onClick={onClick} />
196
+ <SideNav
197
+ handleRef={handleRef}
198
+ collapsible={{
199
+ isCollapsed,
200
+ onCollapsedChange: setIsCollapsed,
201
+ hasButton: false,
202
+ }}>
203
+ <SideNavSection title="Main">
204
+ <SideNavItem label="Dashboard" icon={StubIcon} />
205
+ </SideNavSection>
206
+ </SideNav>
207
+ </>
208
+ );
209
+ }
210
+
211
+ render(<Example />);
212
+ await user.click(screen.getByRole('button', {name: 'Collapse sidebar'}));
213
+
214
+ expect(onClick).toHaveBeenCalledTimes(1);
215
+ // Toggle still ran: the label flipped to "Expand sidebar".
216
+ expect(
217
+ screen.getByRole('button', {name: 'Expand sidebar'}),
218
+ ).toBeInTheDocument();
219
+ });
165
220
  });
166
221
 
167
222
  // =============================================================================
@@ -734,6 +789,17 @@ describe('SideNavSection', () => {
734
789
  const group = screen.getByRole('group');
735
790
  expect(group.style.marginTop).toBe('16px');
736
791
  });
792
+
793
+ it('forwards arbitrary pass-through attributes (id, aria-*) to root element', () => {
794
+ render(
795
+ <SideNavSection title="Main" id="section-1" aria-describedby="hint">
796
+ <SideNavItem label="Dashboard" />
797
+ </SideNavSection>,
798
+ );
799
+ const group = screen.getByRole('group');
800
+ expect(group).toHaveAttribute('id', 'section-1');
801
+ expect(group).toHaveAttribute('aria-describedby', 'hint');
802
+ });
737
803
  });
738
804
 
739
805
  // =============================================================================
@@ -490,6 +490,10 @@ export function SideNav({
490
490
  // =========================================================================
491
491
  const hasStickyTop = !!(header || topContent);
492
492
  const hasStickyBottom = !!(footer || footerIcons);
493
+ // The built-in collapse button only renders when collapse is enabled and it
494
+ // hasn't been opted out via `collapsible.hasButton: false` (e.g. when the
495
+ // consumer places a SideNavCollapseButton in the header instead).
496
+ const showCollapseButton = isCollapsible && hasCollapseButton;
493
497
 
494
498
  // When resizable, override the nav width via inline style
495
499
  const resizableNavStyle: React.CSSProperties | undefined = isResizable
@@ -532,7 +536,7 @@ export function SideNav({
532
536
  )}>
533
537
  {children}
534
538
  </div>
535
- {(hasStickyBottom || isCollapsible) && (
539
+ {(hasStickyBottom || showCollapseButton) && (
536
540
  <div
537
541
  {...stylex.props(
538
542
  styles.stickyBottom,
@@ -544,7 +548,7 @@ export function SideNav({
544
548
  styles.footerRow,
545
549
  collapsed && styles.footerRowCollapsed,
546
550
  )}>
547
- {isCollapsible && hasCollapseButton && <SideNavCollapseButton />}
551
+ {showCollapseButton && <SideNavCollapseButton />}
548
552
  {footerIcons}
549
553
  </div>
550
554
  </div>
@@ -23,6 +23,7 @@ import {durationVars, easeVars} from '../theme/tokens.stylex';
23
23
  import {getIcon} from '../Icon/globalIconRegistry';
24
24
  import {Button} from '../Button';
25
25
  import type {BaseProps} from '../BaseProps';
26
+ import {composeEventHandlers} from '../utils';
26
27
  import {
27
28
  useSideNavCollapse,
28
29
  type SideNavCollapseState,
@@ -101,6 +102,7 @@ export function SideNavCollapseButton({
101
102
  handleRef,
102
103
  label,
103
104
  children,
105
+ onClick: onClickProp,
104
106
  ...props
105
107
  }: SideNavCollapseButtonProps) {
106
108
  const {isCollapsed, toggle, isCollapsible} =
@@ -119,7 +121,7 @@ export function SideNavCollapseButton({
119
121
  label={label ?? (isCollapsed ? 'Expand sidebar' : 'Collapse sidebar')}
120
122
  variant="ghost"
121
123
  {...props}
122
- onClick={toggle}
124
+ onClick={composeEventHandlers(onClickProp, toggle)}
123
125
  icon={
124
126
  children ?? (
125
127
  <span
@@ -140,8 +142,7 @@ SideNavCollapseButton.displayName = 'SideNavCollapseButton';
140
142
 
141
143
  function useSideNavCollapseState(
142
144
  handleRef:
143
- | React.RefObject<SideNavImperativeCollapseHandle | null>
144
- | undefined,
145
+ React.RefObject<SideNavImperativeCollapseHandle | null> | undefined,
145
146
  ): SideNavCollapseState {
146
147
  const contextCollapseState = useSideNavCollapse();
147
148
 
@@ -145,6 +145,7 @@ export function SideNavSection({
145
145
  className,
146
146
  style,
147
147
  'data-testid': testId,
148
+ ...rest
148
149
  }: SideNavSectionProps) {
149
150
  const {isCollapsed} = useSideNavCollapse();
150
151
  const id = useId();
@@ -183,15 +184,16 @@ export function SideNavSection({
183
184
  return (
184
185
  <div
185
186
  ref={ref}
186
- role="group"
187
- aria-labelledby={titleId}
188
- data-testid={testId}
189
187
  {...mergeProps(
190
188
  themeProps('side-nav-section'),
191
189
  stylex.props(styles.root, xstyle),
192
190
  className,
193
191
  style,
194
- )}>
192
+ )}
193
+ {...rest}
194
+ role="group"
195
+ aria-labelledby={titleId}
196
+ data-testid={testId}>
195
197
  <div
196
198
  {...mergeProps(stylex.props(styles.header), {
197
199
  style: shouldHideHeader ? visuallyHiddenStyle : undefined,
@@ -0,0 +1,226 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SizeContext.test.tsx
5
+ * @input Uses vitest, @testing-library/react, SizeContext module
6
+ * @output Characterization tests for SizeContext / useSize / SizeProvider
7
+ * @position Testing; validates the size-cascade resolution contract
8
+ *
9
+ * SYNC: When SizeContext.ts changes, update tests to match new behavior
10
+ */
11
+
12
+ import {describe, it, expect} from 'vitest';
13
+ import {renderHook, render, screen} from '@testing-library/react';
14
+ import {createElement, type ReactNode} from 'react';
15
+ import {
16
+ SizeContext,
17
+ SizeProvider,
18
+ useSize,
19
+ type ElementSize,
20
+ } from './SizeContext';
21
+
22
+ /**
23
+ * Wrap children in a SizeProvider set to `size`. Passing `null` mimics
24
+ * "no container is providing a size".
25
+ */
26
+ function withProvider(size: ElementSize | null) {
27
+ return function Wrapper({children}: {children: ReactNode}) {
28
+ return <SizeProvider value={size}>{children}</SizeProvider>;
29
+ };
30
+ }
31
+
32
+ describe('SizeContext', () => {
33
+ describe('context identity', () => {
34
+ it('defaults to null when read outside any provider', () => {
35
+ const {result} = renderHook(() => useSize());
36
+ // No provider + no prop + no explicit default → the 'md' fallback.
37
+ expect(result.current).toBe('md');
38
+ });
39
+
40
+ it('exposes a displayName for devtools', () => {
41
+ expect(SizeContext.displayName).toBe('SizeContext');
42
+ });
43
+
44
+ it('SizeProvider is the context Provider itself', () => {
45
+ expect(SizeProvider).toBe(SizeContext.Provider);
46
+ });
47
+ });
48
+
49
+ describe('useSize — resolution priority', () => {
50
+ it('returns the default "md" with no prop and no provider', () => {
51
+ const {result} = renderHook(() => useSize());
52
+ expect(result.current).toBe('md');
53
+ });
54
+
55
+ it('honors an explicit defaultSize when neither prop nor context is set', () => {
56
+ const {result} = renderHook(() => useSize(undefined, 'lg'));
57
+ expect(result.current).toBe('lg');
58
+ });
59
+
60
+ it('returns the explicit size prop when provided', () => {
61
+ const {result} = renderHook(() => useSize('sm'));
62
+ expect(result.current).toBe('sm');
63
+ });
64
+
65
+ it('prop wins over the explicit default', () => {
66
+ const {result} = renderHook(() => useSize('sm', 'lg'));
67
+ expect(result.current).toBe('sm');
68
+ });
69
+
70
+ it('inherits the size from an enclosing provider when no prop is passed', () => {
71
+ const {result} = renderHook(() => useSize(), {
72
+ wrapper: withProvider('lg'),
73
+ });
74
+ expect(result.current).toBe('lg');
75
+ });
76
+
77
+ it('prop wins over the inherited provider size', () => {
78
+ const {result} = renderHook(() => useSize('sm'), {
79
+ wrapper: withProvider('lg'),
80
+ });
81
+ expect(result.current).toBe('sm');
82
+ });
83
+
84
+ it('inherited context wins over the explicit default fallback', () => {
85
+ const {result} = renderHook(() => useSize(undefined, 'sm'), {
86
+ wrapper: withProvider('lg'),
87
+ });
88
+ expect(result.current).toBe('lg');
89
+ });
90
+
91
+ it('falls back to default when the provider value is explicitly null', () => {
92
+ const {result} = renderHook(() => useSize(undefined, 'sm'), {
93
+ wrapper: withProvider(null),
94
+ });
95
+ expect(result.current).toBe('sm');
96
+ });
97
+
98
+ it('falls back to "md" when provider is null and no default is given', () => {
99
+ const {result} = renderHook(() => useSize(), {
100
+ wrapper: withProvider(null),
101
+ });
102
+ expect(result.current).toBe('md');
103
+ });
104
+ });
105
+
106
+ describe('useSize — every standard ElementSize resolves', () => {
107
+ const sizes: ElementSize[] = ['sm', 'md', 'lg'];
108
+
109
+ it.each(sizes)('resolves explicit prop "%s"', size => {
110
+ const {result} = renderHook(() => useSize(size));
111
+ expect(result.current).toBe(size);
112
+ });
113
+
114
+ it.each(sizes)('resolves inherited provider "%s"', size => {
115
+ const {result} = renderHook(() => useSize(), {
116
+ wrapper: withProvider(size),
117
+ });
118
+ expect(result.current).toBe(size);
119
+ });
120
+ });
121
+
122
+ describe('useSize — nested providers', () => {
123
+ it('resolves to the nearest provider', () => {
124
+ function Nested({children}: {children: ReactNode}) {
125
+ return (
126
+ <SizeProvider value="sm">
127
+ <SizeProvider value="lg">{children}</SizeProvider>
128
+ </SizeProvider>
129
+ );
130
+ }
131
+ const {result} = renderHook(() => useSize(), {wrapper: Nested});
132
+ expect(result.current).toBe('lg');
133
+ });
134
+
135
+ it('a prop still overrides the nearest provider', () => {
136
+ function Nested({children}: {children: ReactNode}) {
137
+ return (
138
+ <SizeProvider value="sm">
139
+ <SizeProvider value="lg">{children}</SizeProvider>
140
+ </SizeProvider>
141
+ );
142
+ }
143
+ const {result} = renderHook(() => useSize('md'), {wrapper: Nested});
144
+ expect(result.current).toBe('md');
145
+ });
146
+ });
147
+
148
+ describe('useSize — generic (non-ElementSize) values', () => {
149
+ it('supports a custom string union via the type parameter', () => {
150
+ type Custom = 'compact' | 'comfortable';
151
+ const {result} = renderHook(() =>
152
+ useSize<Custom>('compact', 'comfortable'),
153
+ );
154
+ expect(result.current).toBe('compact');
155
+ });
156
+
157
+ it('returns the custom default when no prop is given', () => {
158
+ type Custom = 'compact' | 'comfortable';
159
+ const {result} = renderHook(() =>
160
+ useSize<Custom>(undefined, 'comfortable'),
161
+ );
162
+ expect(result.current).toBe('comfortable');
163
+ });
164
+
165
+ it('empty-string prop is a real value and does NOT fall through to default', () => {
166
+ // '' ?? x === '' because nullish coalescing only catches null/undefined.
167
+ const {result} = renderHook(() => useSize('' as ElementSize, 'lg'));
168
+ expect(result.current).toBe('');
169
+ });
170
+ });
171
+
172
+ describe('integration — components consuming the cascade', () => {
173
+ function SizedProbe({size}: {size?: ElementSize}) {
174
+ const resolved = useSize(size);
175
+ return <span data-testid="probe">{resolved}</span>;
176
+ }
177
+
178
+ it('a child with no size prop reads the container size', () => {
179
+ render(
180
+ <SizeProvider value="lg">
181
+ <SizedProbe />
182
+ </SizeProvider>,
183
+ );
184
+ expect(screen.getByTestId('probe')).toHaveTextContent('lg');
185
+ });
186
+
187
+ it('sibling children resolve independently against the same provider', () => {
188
+ render(
189
+ <SizeProvider value="lg">
190
+ <span data-testid="a">
191
+ <SizedProbe />
192
+ </span>
193
+ <span data-testid="b">
194
+ <SizedProbe size="sm" />
195
+ </span>
196
+ </SizeProvider>,
197
+ );
198
+ expect(screen.getByTestId('a')).toHaveTextContent('lg');
199
+ expect(screen.getByTestId('b')).toHaveTextContent('sm');
200
+ });
201
+
202
+ it('re-renders with the new size when the provider value changes', () => {
203
+ const {rerender} = render(
204
+ <SizeProvider value="sm">
205
+ <SizedProbe />
206
+ </SizeProvider>,
207
+ );
208
+ expect(screen.getByTestId('probe')).toHaveTextContent('sm');
209
+
210
+ rerender(
211
+ <SizeProvider value="lg">
212
+ <SizedProbe />
213
+ </SizeProvider>,
214
+ );
215
+ expect(screen.getByTestId('probe')).toHaveTextContent('lg');
216
+ });
217
+
218
+ it('works with createElement (no JSX) call form', () => {
219
+ const {result} = renderHook(() => useSize(), {
220
+ wrapper: ({children}: {children: ReactNode}) =>
221
+ createElement(SizeProvider, {value: 'sm'}, children),
222
+ });
223
+ expect(result.current).toBe('sm');
224
+ });
225
+ });
226
+ });
@@ -124,10 +124,10 @@ export const docs = {
124
124
  },
125
125
  {
126
126
  name: 'labelSpacing',
127
- type: "'default' | 'spread'",
127
+ type: "'hug' | 'spread'",
128
128
  description:
129
- 'Spacing behavior between label and switch. "spread" pushes them to opposite ends of the container (full width).',
130
- default: "'default'",
129
+ 'Spacing behavior between label and switch. "hug" places them next to each other; "spread" pushes them to opposite ends of the container (full width). "default" is a deprecated alias for "hug".',
130
+ default: "'hug'",
131
131
  },
132
132
  ],
133
133
  theming: {
@@ -270,10 +270,10 @@ export const docsZh = {
270
270
  },
271
271
  {
272
272
  name: 'labelSpacing',
273
- type: "'default' | 'spread'",
273
+ type: "'hug' | 'spread'",
274
274
  description:
275
- '标签和开关之间的间距行为。"spread" 将它们推到容器的两端(全宽)。',
276
- default: "'default'",
275
+ '标签和开关之间的间距行为。"hug" 将它们并排放置;"spread" 将它们推到容器的两端(全宽)。"default" 是 "hug" 的已弃用别名。',
276
+ default: "'hug'",
277
277
  },
278
278
  ],
279
279
  theming: {
@@ -329,6 +329,6 @@ export const docsDense = {
329
329
  labelIcon: 'Icon before label text.',
330
330
  labelTooltip: 'Tooltip text in info icon at label end.',
331
331
  labelPosition: 'Which side label appears; "start" places before switch.',
332
- labelSpacing: 'Spacing behavior; "spread" pushes to opposite ends (full width).',
332
+ labelSpacing: 'Spacing behavior; "hug" places next to each other, "spread" pushes to opposite ends (full width). "default" is deprecated alias for "hug".',
333
333
  },
334
334
  };
@@ -470,11 +470,84 @@ describe('Switch', () => {
470
470
  expect(screen.getByRole('switch')).toBeDisabled();
471
471
  });
472
472
  });
473
+ describe('labelSpacing', () => {
474
+ const getField = (container: HTMLElement) =>
475
+ container.querySelector<HTMLElement>('.astryx-switch-field')!;
476
+
477
+ it('omits the data attribute for the default hug spacing', () => {
478
+ const {container} = render(
479
+ <Switch label="Notify" value={false} onChange={() => {}} />,
480
+ );
481
+ expect(getField(container)).not.toHaveAttribute('data-label-spacing');
482
+ });
483
+
484
+ it('reflects spread spacing as a data attribute and variant class', () => {
485
+ const {container} = render(
486
+ <Switch
487
+ label="Notify"
488
+ value={false}
489
+ onChange={() => {}}
490
+ labelSpacing="spread"
491
+ />,
492
+ );
493
+ expect(getField(container)).toHaveAttribute(
494
+ 'data-label-spacing',
495
+ 'spread',
496
+ );
497
+ expect(getField(container).className).toContain('spread');
498
+ });
499
+
500
+ it('renders explicit hug the same as the default', () => {
501
+ const {container: implicit} = render(
502
+ <Switch label="Notify" value={false} onChange={() => {}} />,
503
+ );
504
+ const {container: explicit} = render(
505
+ <Switch
506
+ label="Notify"
507
+ value={false}
508
+ onChange={() => {}}
509
+ labelSpacing="hug"
510
+ />,
511
+ );
512
+ expect(getField(explicit)).not.toHaveAttribute('data-label-spacing');
513
+ expect(getField(explicit).className).toBe(getField(implicit).className);
514
+ });
515
+
516
+ it("treats the deprecated 'default' value as an alias for hug", () => {
517
+ const {container: hug} = render(
518
+ <Switch
519
+ label="Notify"
520
+ value={false}
521
+ onChange={() => {}}
522
+ labelSpacing="hug"
523
+ />,
524
+ );
525
+ const {container: deprecated} = render(
526
+ <Switch
527
+ label="Notify"
528
+ value={false}
529
+ onChange={() => {}}
530
+ labelSpacing="default"
531
+ />,
532
+ );
533
+ expect(getField(deprecated)).not.toHaveAttribute('data-label-spacing');
534
+ expect(getField(deprecated).className).toBe(getField(hug).className);
535
+ // The switch row keeps the hug layout, not the spread justification.
536
+ expect(getField(deprecated).firstElementChild?.className).toBe(
537
+ getField(hug).firstElementChild?.className,
538
+ );
539
+ });
540
+ });
473
541
  describe('form participation', () => {
474
542
  it('submits under htmlName when on', () => {
475
543
  const {container} = render(
476
544
  <form>
477
- <Switch label="Notify" htmlName="notify" value={true} onChange={() => {}} />
545
+ <Switch
546
+ label="Notify"
547
+ htmlName="notify"
548
+ value={true}
549
+ onChange={() => {}}
550
+ />
478
551
  </form>,
479
552
  );
480
553
  const data = new FormData(container.querySelector('form')!);
@@ -494,13 +567,20 @@ describe('Switch', () => {
494
567
  />
495
568
  </form>,
496
569
  );
497
- expect([...new FormData(container.querySelector('form')!).keys()]).toEqual([]);
570
+ expect([
571
+ ...new FormData(container.querySelector('form')!).keys(),
572
+ ]).toEqual([]);
498
573
  });
499
574
 
500
575
  it('submits nothing when off or when htmlName is omitted', () => {
501
576
  const {container} = render(
502
577
  <form>
503
- <Switch label="Off" htmlName="off" value={false} onChange={() => {}} />
578
+ <Switch
579
+ label="Off"
580
+ htmlName="off"
581
+ value={false}
582
+ onChange={() => {}}
583
+ />
504
584
  <Switch label="Unnamed" value={true} onChange={() => {}} />
505
585
  </form>,
506
586
  );
@@ -508,4 +588,23 @@ describe('Switch', () => {
508
588
  expect([...data.keys()]).toEqual([]);
509
589
  });
510
590
  });
591
+
592
+ describe('rest forwarding', () => {
593
+ it('forwards data-testid, id, and aria-* to the root element', () => {
594
+ const {container} = render(
595
+ <Switch
596
+ label="Notifications"
597
+ value={false}
598
+ onChange={() => {}}
599
+ data-testid="my-switch"
600
+ id="switch-1"
601
+ aria-label="Toggle notifications"
602
+ />,
603
+ );
604
+ const root = container.querySelector('[data-testid="my-switch"]');
605
+ expect(root).not.toBeNull();
606
+ expect(root).toHaveAttribute('id', 'switch-1');
607
+ expect(root).toHaveAttribute('aria-label', 'Toggle notifications');
608
+ });
609
+ });
511
610
  });
@@ -185,7 +185,11 @@ const styles = stylex.create({
185
185
 
186
186
  export type SwitchLabelPosition = 'start' | 'end';
187
187
 
188
- export type SwitchLabelSpacing = 'default' | 'spread';
188
+ export type SwitchLabelSpacing =
189
+ | 'hug'
190
+ | 'spread'
191
+ /** @deprecated Use `'hug'` instead. */
192
+ | 'default';
189
193
 
190
194
  export interface SwitchProps extends Omit<BaseProps, 'onChange'> {
191
195
  /** Ref forwarded to the root element */
@@ -297,9 +301,11 @@ export interface SwitchProps extends Omit<BaseProps, 'onChange'> {
297
301
  labelPosition?: SwitchLabelPosition;
298
302
  /**
299
303
  * Spacing behavior between label and switch.
300
- * - 'default': Label and switch are positioned next to each other
304
+ * - 'hug': Label and switch are positioned next to each other
301
305
  * - 'spread': Label and switch are pushed to opposite ends
302
- * @default 'default'
306
+ *
307
+ * 'default' is a deprecated alias for 'hug'.
308
+ * @default 'hug'
303
309
  */
304
310
  labelSpacing?: SwitchLabelSpacing;
305
311
  /**
@@ -350,13 +356,14 @@ export function Switch({
350
356
  labelIcon,
351
357
  labelTooltip,
352
358
  labelPosition = 'end',
353
- labelSpacing = 'default',
359
+ labelSpacing = 'hug',
354
360
  status,
355
361
  width,
356
362
  xstyle,
357
363
  className,
358
364
  style,
359
365
  ref,
366
+ ...rest
360
367
  }: SwitchProps) {
361
368
  const id = useId();
362
369
  const descriptionID = useId();
@@ -368,6 +375,10 @@ export function Switch({
368
375
 
369
376
  const isOn = optimisticValue === true;
370
377
 
378
+ // 'default' is a deprecated alias for 'hug' (#2889).
379
+ const resolvedLabelSpacing: SwitchLabelSpacing =
380
+ labelSpacing === 'default' ? 'hug' : labelSpacing;
381
+
371
382
  // Disabled-reason tooltip. Disabled controls swallow pointer events, so the
372
383
  // tooltip listeners attach to the switch row (which already exists) and the
373
384
  // native checkbox stays perceivable via aria-disabled instead of the disabled
@@ -487,12 +498,14 @@ export function Switch({
487
498
  {...mergeProps(
488
499
  themeProps('switch-field', {
489
500
  labelPosition: labelPosition !== 'end' ? labelPosition : undefined,
490
- labelSpacing: labelSpacing !== 'default' ? labelSpacing : undefined,
501
+ labelSpacing:
502
+ resolvedLabelSpacing !== 'hug' ? resolvedLabelSpacing : undefined,
491
503
  }),
492
504
  stylex.props(width != null && dynamicWidthStyles.width(width), xstyle),
493
505
  className,
494
506
  style,
495
- )}>
507
+ )}
508
+ {...rest}>
496
509
  <div
497
510
  ref={el => {
498
511
  // Interaction (hover/focus) listeners for the disabled-message
@@ -505,7 +518,7 @@ export function Switch({
505
518
  }}
506
519
  {...stylex.props(
507
520
  styles.container,
508
- labelSpacing === 'spread' && styles.containerSpread,
521
+ resolvedLabelSpacing === 'spread' && styles.containerSpread,
509
522
  !isDisabled && switchScope,
510
523
  )}>
511
524
  {' '}