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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
  6. package/dist/AppShell/AppShell.d.ts +1 -1
  7. package/dist/AppShell/AppShell.d.ts.map +1 -1
  8. package/dist/AppShell/AppShell.js +55 -53
  9. package/dist/AspectRatio/AspectRatio.js +5 -5
  10. package/dist/Avatar/Avatar.d.ts.map +1 -1
  11. package/dist/Avatar/Avatar.js +27 -25
  12. package/dist/Avatar/AvatarStatusDot.js +5 -5
  13. package/dist/AvatarGroup/AvatarGroup.js +5 -5
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
  15. package/dist/Badge/Badge.js +3 -3
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -25
  18. package/dist/Blockquote/Blockquote.js +7 -7
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  20. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  21. package/dist/Button/Button.d.ts.map +1 -1
  22. package/dist/Button/Button.js +47 -26
  23. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +108 -64
  26. package/dist/Calendar/dayCellUtils.d.ts +67 -5
  27. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  28. package/dist/Calendar/dayCellUtils.js +139 -18
  29. package/dist/Calendar/styles.d.ts +2 -2
  30. package/dist/Calendar/styles.d.ts.map +1 -1
  31. package/dist/Calendar/styles.js +2 -2
  32. package/dist/Card/Card.d.ts +4 -2
  33. package/dist/Card/Card.d.ts.map +1 -1
  34. package/dist/Card/Card.js +18 -10
  35. package/dist/Carousel/Carousel.d.ts.map +1 -1
  36. package/dist/Carousel/Carousel.js +20 -19
  37. package/dist/Center/Center.js +3 -3
  38. package/dist/Chat/ChatComposer.js +23 -23
  39. package/dist/Chat/ChatComposerDrawer.js +14 -14
  40. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  41. package/dist/Chat/ChatComposerInput.js +27 -15
  42. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  43. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  44. package/dist/Chat/ChatDictationButton.js +13 -11
  45. package/dist/Chat/ChatLayout.js +17 -17
  46. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  47. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  49. package/dist/Chat/ChatMessage.js +12 -12
  50. package/dist/Chat/ChatMessageBubble.js +7 -7
  51. package/dist/Chat/ChatMessageList.js +14 -14
  52. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  53. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  54. package/dist/Chat/ChatMessageMetadata.js +14 -12
  55. package/dist/Chat/ChatPastedTextToken.js +13 -13
  56. package/dist/Chat/ChatSendButton.js +3 -3
  57. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  58. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  59. package/dist/Chat/ChatSystemMessage.js +17 -17
  60. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  61. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  62. package/dist/Chat/ChatTokenizedText.js +24 -15
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +81 -74
  65. package/dist/Chat/index.d.ts +1 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/useTriggerMenu.js +15 -15
  68. package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
  69. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  70. package/dist/CheckboxInput/CheckboxInput.js +32 -24
  71. package/dist/CheckboxList/CheckboxList.js +9 -9
  72. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  73. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  74. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  75. package/dist/Citation/Citation.js +10 -10
  76. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  77. package/dist/ClickableCard/ClickableCard.js +32 -9
  78. package/dist/Code/Code.d.ts +15 -1
  79. package/dist/Code/Code.d.ts.map +1 -1
  80. package/dist/Code/Code.js +35 -5
  81. package/dist/Code/index.d.ts +1 -1
  82. package/dist/Code/index.d.ts.map +1 -1
  83. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  84. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  85. package/dist/CodeBlock/CodeBlock.js +88 -52
  86. package/dist/CodeBlock/index.d.ts +1 -1
  87. package/dist/CodeBlock/index.d.ts.map +1 -1
  88. package/dist/Collapsible/Collapsible.d.ts +9 -3
  89. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  90. package/dist/Collapsible/Collapsible.js +110 -22
  91. package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
  92. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  93. package/dist/Collapsible/CollapsibleGroup.js +73 -12
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
  95. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  96. package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
  97. package/dist/Collapsible/index.d.ts +1 -0
  98. package/dist/Collapsible/index.d.ts.map +1 -1
  99. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  100. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  101. package/dist/Collapsible/useCollapsible.js +20 -6
  102. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  103. package/dist/CommandPalette/CommandPalette.js +36 -34
  104. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
  105. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  106. package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
  107. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  108. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  109. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  110. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  111. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  112. package/dist/ContextMenu/ContextMenu.d.ts +9 -1
  113. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  114. package/dist/ContextMenu/ContextMenu.js +16 -11
  115. package/dist/DateInput/DateInput.js +18 -18
  116. package/dist/DateRangeInput/DateRangeInput.js +23 -23
  117. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
  118. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  119. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  120. package/dist/DateTimeInput/index.d.ts +1 -1
  121. package/dist/DateTimeInput/index.d.ts.map +1 -1
  122. package/dist/Dialog/Dialog.js +9 -9
  123. package/dist/Dialog/DialogHeader.js +16 -16
  124. package/dist/Dialog/useImperativeDialog.js +3 -3
  125. package/dist/Divider/Divider.d.ts +0 -22
  126. package/dist/Divider/Divider.d.ts.map +1 -1
  127. package/dist/Divider/Divider.js +7 -7
  128. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  129. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  130. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  131. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  132. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  133. package/dist/EmptyState/EmptyState.js +9 -9
  134. package/dist/Field/Field.js +17 -17
  135. package/dist/Field/FieldLabel.js +15 -15
  136. package/dist/Field/InputClearButton.js +5 -5
  137. package/dist/FieldStatus/FieldStatus.js +3 -3
  138. package/dist/FileInput/FileInput.js +29 -29
  139. package/dist/FormLayout/FormLayout.js +5 -5
  140. package/dist/Grid/Grid.d.ts +4 -3
  141. package/dist/Grid/Grid.d.ts.map +1 -1
  142. package/dist/Grid/Grid.js +29 -12
  143. package/dist/Grid/GridSpan.js +3 -3
  144. package/dist/HStack/HStack.js +3 -3
  145. package/dist/Heading/Heading.js +10 -10
  146. package/dist/HoverCard/HoverCard.js +9 -9
  147. package/dist/HoverCard/useHoverCard.js +3 -3
  148. package/dist/Icon/Icon.d.ts.map +1 -1
  149. package/dist/Icon/Icon.js +16 -12
  150. package/dist/Icon/defaultIcons.js +116 -116
  151. package/dist/IconButton/IconButton.js +3 -3
  152. package/dist/InputGroup/InputGroup.js +11 -11
  153. package/dist/InputGroup/InputGroupText.js +3 -3
  154. package/dist/Item/Item.js +18 -18
  155. package/dist/Kbd/Kbd.js +5 -5
  156. package/dist/Layer/LayerProvider.js +7 -7
  157. package/dist/Layer/useLayer.js +5 -5
  158. package/dist/Layout/Layout.js +21 -21
  159. package/dist/Layout/LayoutContent.js +3 -3
  160. package/dist/Layout/LayoutFooter.js +5 -5
  161. package/dist/Layout/LayoutHeader.js +5 -5
  162. package/dist/Layout/LayoutPanel.js +3 -3
  163. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  164. package/dist/Lightbox/Lightbox.js +55 -31
  165. package/dist/Lightbox/useLightbox.js +3 -3
  166. package/dist/Link/Link.js +15 -15
  167. package/dist/Link/LinkProvider.js +3 -3
  168. package/dist/Link/useLinkify.js +3 -3
  169. package/dist/List/List.js +11 -11
  170. package/dist/List/ListItem.js +11 -11
  171. package/dist/Markdown/Markdown.d.ts.map +1 -1
  172. package/dist/Markdown/Markdown.js +102 -102
  173. package/dist/Markdown/parser.d.ts +7 -0
  174. package/dist/Markdown/parser.d.ts.map +1 -1
  175. package/dist/Markdown/parser.js +300 -6
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.js +15 -15
  179. package/dist/MobileNav/MobileNavToggle.js +5 -5
  180. package/dist/MoreMenu/MoreMenu.js +3 -3
  181. package/dist/MultiSelector/MultiSelector.d.ts +7 -1
  182. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  183. package/dist/MultiSelector/MultiSelector.js +64 -55
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.js +3 -3
  194. package/dist/Pagination/Pagination.d.ts +1 -1
  195. package/dist/Pagination/Pagination.d.ts.map +1 -1
  196. package/dist/Pagination/Pagination.js +125 -72
  197. package/dist/Popover/Popover.js +16 -16
  198. package/dist/Popover/usePopover.js +7 -7
  199. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  200. package/dist/PowerSearch/PowerSearch.js +110 -92
  201. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  202. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  203. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  204. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  205. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  206. package/dist/ProgressBar/ProgressBar.js +25 -18
  207. package/dist/RadioList/RadioList.d.ts +7 -1
  208. package/dist/RadioList/RadioList.d.ts.map +1 -1
  209. package/dist/RadioList/RadioList.js +10 -8
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +30 -22
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.d.ts +6 -0
  224. package/dist/Selector/Selector.d.ts.map +1 -1
  225. package/dist/Selector/Selector.js +54 -45
  226. package/dist/Selector/SelectorOption.js +3 -3
  227. package/dist/SideNav/SideNav.d.ts.map +1 -1
  228. package/dist/SideNav/SideNav.js +38 -34
  229. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  230. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  232. package/dist/SideNav/SideNavHeading.js +87 -87
  233. package/dist/SideNav/SideNavItem.js +42 -42
  234. package/dist/SideNav/SideNavSection.d.ts +1 -1
  235. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  236. package/dist/SideNav/SideNavSection.js +18 -16
  237. package/dist/Skeleton/Skeleton.js +3 -3
  238. package/dist/Slider/Slider.d.ts +6 -0
  239. package/dist/Slider/Slider.d.ts.map +1 -1
  240. package/dist/Slider/Slider.js +31 -22
  241. package/dist/Spinner/Spinner.d.ts.map +1 -1
  242. package/dist/Spinner/Spinner.js +10 -10
  243. package/dist/StatusDot/StatusDot.js +5 -5
  244. package/dist/Switch/Switch.d.ts +13 -4
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +41 -30
  247. package/dist/TabList/Tab.js +18 -18
  248. package/dist/TabList/TabList.js +5 -5
  249. package/dist/TabList/TabMenu.d.ts.map +1 -1
  250. package/dist/TabList/TabMenu.js +57 -30
  251. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  252. package/dist/Table/BaseTable.d.ts.map +1 -1
  253. package/dist/Table/BaseTable.js +51 -39
  254. package/dist/Table/Table.js +7 -7
  255. package/dist/Table/TableBody.d.ts +1 -1
  256. package/dist/Table/TableBody.d.ts.map +1 -1
  257. package/dist/Table/TableBody.js +9 -5
  258. package/dist/Table/TableCell.d.ts.map +1 -1
  259. package/dist/Table/TableCell.js +76 -7
  260. package/dist/Table/TableFooter.d.ts +1 -1
  261. package/dist/Table/TableFooter.d.ts.map +1 -1
  262. package/dist/Table/TableFooter.js +9 -5
  263. package/dist/Table/TableHeader.d.ts +1 -1
  264. package/dist/Table/TableHeader.d.ts.map +1 -1
  265. package/dist/Table/TableHeader.js +9 -5
  266. package/dist/Table/TableHeaderCell.js +3 -3
  267. package/dist/Table/TableRow.js +5 -5
  268. package/dist/Table/index.d.ts +2 -0
  269. package/dist/Table/index.d.ts.map +1 -1
  270. package/dist/Table/index.js +1 -0
  271. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  272. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  273. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
  278. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
  279. package/dist/Table/plugins/rowExpansion/index.js +3 -0
  280. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
  281. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
  282. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
  283. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  284. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  285. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  286. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  287. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  288. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  289. package/dist/Table/tableContextMenu.d.ts +5 -1
  290. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  291. package/dist/Table/tableContextMenu.js +19 -12
  292. package/dist/Text/Text.d.ts +1 -1
  293. package/dist/Text/Text.d.ts.map +1 -1
  294. package/dist/Text/Text.js +14 -13
  295. package/dist/Text/text.stylex.d.ts +35 -0
  296. package/dist/Text/text.stylex.d.ts.map +1 -1
  297. package/dist/Text/text.stylex.js +52 -1
  298. package/dist/TextArea/TextArea.js +14 -14
  299. package/dist/TextInput/TextInput.js +15 -15
  300. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  301. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  302. package/dist/Thumbnail/Thumbnail.js +30 -29
  303. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  304. package/dist/TimeInput/TimeInput.js +26 -21
  305. package/dist/Timestamp/Timestamp.d.ts +1 -1
  306. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  307. package/dist/Timestamp/Timestamp.js +37 -26
  308. package/dist/Toast/Toast.d.ts.map +1 -1
  309. package/dist/Toast/Toast.js +25 -17
  310. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  311. package/dist/Toast/ToastViewport.js +23 -11
  312. package/dist/Toast/useToast.js +4 -4
  313. package/dist/ToggleButton/ToggleButton.js +12 -12
  314. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  315. package/dist/Token/Token.js +21 -21
  316. package/dist/Tokenizer/Tokenizer.d.ts +6 -1
  317. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  318. package/dist/Tokenizer/Tokenizer.js +38 -29
  319. package/dist/Toolbar/Toolbar.js +18 -18
  320. package/dist/Tooltip/Tooltip.js +11 -11
  321. package/dist/Tooltip/useTooltip.js +3 -3
  322. package/dist/TopNav/TopNav.js +32 -32
  323. package/dist/TopNav/TopNavHeading.js +67 -67
  324. package/dist/TopNav/TopNavItem.js +5 -5
  325. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  326. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  327. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  328. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  329. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  330. package/dist/TopNav/TopNavMenu.js +32 -32
  331. package/dist/TreeList/TreeList.js +8 -8
  332. package/dist/TreeList/TreeListBranches.js +11 -11
  333. package/dist/TreeList/TreeListItem.js +30 -30
  334. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.js +23 -20
  336. package/dist/Typeahead/Typeahead.js +12 -12
  337. package/dist/Typeahead/TypeaheadItem.js +10 -10
  338. package/dist/VStack/VStack.js +3 -3
  339. package/dist/astryx.css +23 -0
  340. package/dist/astryx.umd.js +60 -58
  341. package/dist/astryx.umd.js.map +4 -4
  342. package/dist/docs-types.d.ts +13 -1
  343. package/dist/docs-types.d.ts.map +1 -1
  344. package/dist/hooks/focusableSelector.d.ts +1 -1
  345. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  346. package/dist/hooks/focusableSelector.js +1 -1
  347. package/dist/hooks/index.d.ts +2 -0
  348. package/dist/hooks/index.d.ts.map +1 -1
  349. package/dist/hooks/index.js +1 -0
  350. package/dist/hooks/useFocusTrap.d.ts +3 -0
  351. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  352. package/dist/hooks/useFocusTrap.js +38 -1
  353. package/dist/hooks/useHotkeys.d.ts +51 -0
  354. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  355. package/dist/hooks/useHotkeys.js +160 -0
  356. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  357. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  358. package/dist/hooks/useInteractiveRole.js +6 -2
  359. package/dist/hooks/useKeyboardHint.js +9 -9
  360. package/dist/hooks/useStreamingText.d.ts +3 -1
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +14 -5
  363. package/dist/theme/MediaTheme.js +3 -3
  364. package/dist/theme/Theme.js +7 -7
  365. package/dist/theme/defineTheme.d.ts +1 -1
  366. package/dist/theme/defineTheme.d.ts.map +1 -1
  367. package/dist/theme/expandColorScale.d.ts.map +1 -1
  368. package/dist/theme/expandColorScale.js +10 -3
  369. package/dist/theme/hct.d.ts +0 -15
  370. package/dist/theme/hct.d.ts.map +1 -1
  371. package/dist/theme/hct.js +9 -9
  372. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  373. package/dist/theme/tokens.d.ts +10 -2
  374. package/dist/theme/tokens.d.ts.map +1 -1
  375. package/dist/theme/tokens.js +220 -4
  376. package/dist/utils/color.d.ts +42 -0
  377. package/dist/utils/color.d.ts.map +1 -0
  378. package/dist/utils/color.js +150 -0
  379. package/dist/utils/composeEventHandlers.d.ts +30 -0
  380. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  381. package/dist/utils/composeEventHandlers.js +40 -0
  382. package/dist/utils/index.d.ts +3 -0
  383. package/dist/utils/index.d.ts.map +1 -1
  384. package/dist/utils/index.js +3 -1
  385. package/dist/utils/timeParser.d.ts.map +1 -1
  386. package/dist/utils/timeParser.js +8 -5
  387. package/package.json +3 -3
  388. package/src/AlertDialog/AlertDialog.tsx +2 -0
  389. package/src/AppShell/AppShell.tsx +2 -0
  390. package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
  391. package/src/Avatar/Avatar.doc.mjs +13 -2
  392. package/src/Avatar/Avatar.test.tsx +32 -1
  393. package/src/Avatar/Avatar.tsx +12 -20
  394. package/src/Banner/Banner.doc.mjs +8 -0
  395. package/src/Banner/Banner.test.tsx +38 -0
  396. package/src/Banner/Banner.tsx +8 -1
  397. package/src/Button/Button.tsx +39 -6
  398. package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
  399. package/src/Calendar/Calendar.doc.mjs +1 -1
  400. package/src/Calendar/Calendar.test.tsx +201 -17
  401. package/src/Calendar/Calendar.tsx +79 -26
  402. package/src/Calendar/dayCellUtils.test.ts +306 -1
  403. package/src/Calendar/dayCellUtils.ts +206 -13
  404. package/src/Calendar/styles.ts +12 -2
  405. package/src/Card/Card.doc.mjs +1 -1
  406. package/src/Card/Card.tsx +16 -6
  407. package/src/Carousel/Carousel.doc.mjs +12 -12
  408. package/src/Carousel/Carousel.test.tsx +13 -0
  409. package/src/Carousel/Carousel.tsx +1 -0
  410. package/src/Chat/Chat.doc.mjs +1 -1
  411. package/src/Chat/ChatComposerInput.test.tsx +24 -0
  412. package/src/Chat/ChatComposerInput.tsx +17 -1
  413. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  414. package/src/Chat/ChatDictationButton.tsx +4 -4
  415. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  416. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  417. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  418. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  419. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  420. package/src/Chat/ChatSystemMessage.tsx +7 -7
  421. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  422. package/src/Chat/ChatTokenizedText.tsx +15 -8
  423. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  424. package/src/Chat/ChatToolCalls.tsx +10 -12
  425. package/src/Chat/index.ts +1 -4
  426. package/src/Chat/useChatNewMessages.test.tsx +4 -4
  427. package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
  428. package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
  429. package/src/CheckboxInput/CheckboxInput.tsx +13 -0
  430. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  431. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  432. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  433. package/src/Citation/Citation.doc.mjs +5 -0
  434. package/src/ClickableCard/ClickableCard.tsx +45 -2
  435. package/src/Code/Code.test.tsx +54 -0
  436. package/src/Code/Code.tsx +48 -4
  437. package/src/Code/index.ts +1 -1
  438. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  439. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  440. package/src/CodeBlock/CodeBlock.tsx +62 -4
  441. package/src/CodeBlock/index.ts +1 -1
  442. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  443. package/src/Collapsible/Collapsible.test.tsx +405 -0
  444. package/src/Collapsible/Collapsible.tsx +86 -10
  445. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  446. package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
  447. package/src/Collapsible/CollapsibleGroup.tsx +107 -9
  448. package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
  449. package/src/Collapsible/index.ts +4 -0
  450. package/src/Collapsible/useCollapsible.ts +20 -6
  451. package/src/CommandPalette/CommandPalette.tsx +5 -3
  452. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  453. package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
  454. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  455. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  456. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  457. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  458. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  459. package/src/ContextMenu/ContextMenu.test.tsx +15 -0
  460. package/src/ContextMenu/ContextMenu.tsx +19 -1
  461. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  462. package/src/DateInput/DateInput.doc.mjs +6 -1
  463. package/src/DateInput/DateInput.test.tsx +11 -20
  464. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  465. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  466. package/src/DateRangeInput/DateRangeInput.tsx +2 -2
  467. package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
  468. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  469. package/src/DateTimeInput/DateTimeInput.tsx +9 -8
  470. package/src/DateTimeInput/index.ts +1 -0
  471. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  472. package/src/Divider/Divider.tsx +1 -23
  473. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  474. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
  475. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  476. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  477. package/src/Field/Field.doc.mjs +1 -1
  478. package/src/Field/FieldLabel.test.tsx +2 -2
  479. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  480. package/src/FileInput/FileInput.doc.mjs +1 -1
  481. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  482. package/src/Grid/Grid.doc.mjs +3 -3
  483. package/src/Grid/Grid.test.tsx +43 -18
  484. package/src/Grid/Grid.tsx +26 -9
  485. package/src/Icon/Icon.test.tsx +41 -29
  486. package/src/Icon/Icon.tsx +6 -2
  487. package/src/InputGroup/InputGroup.tsx +2 -2
  488. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  489. package/src/Item/Item.tsx +1 -1
  490. package/src/Layout/Layout.test.tsx +285 -0
  491. package/src/Layout/LayoutContent.doc.mjs +12 -0
  492. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  493. package/src/Layout/LayoutSlots.test.tsx +364 -0
  494. package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Markdown/Markdown.test.tsx +23 -0
  499. package/src/Markdown/Markdown.tsx +9 -7
  500. package/src/Markdown/incremental.test.ts +36 -0
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/Markdown/parser.test.ts +210 -0
  503. package/src/Markdown/parser.ts +301 -6
  504. package/src/MobileNav/MobileNav.doc.mjs +20 -0
  505. package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
  506. package/src/MultiSelector/MultiSelector.test.tsx +33 -0
  507. package/src/MultiSelector/MultiSelector.tsx +20 -0
  508. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  509. package/src/NumberInput/NumberInput.test.tsx +48 -3
  510. package/src/NumberInput/NumberInput.tsx +32 -15
  511. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  512. package/src/OverflowList/OverflowList.test.tsx +416 -0
  513. package/src/Overlay/Overlay.doc.mjs +6 -0
  514. package/src/Overlay/Overlay.test.tsx +356 -0
  515. package/src/Pagination/Pagination.test.tsx +162 -0
  516. package/src/Pagination/Pagination.tsx +80 -26
  517. package/src/Popover/Popover.test.tsx +65 -0
  518. package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  522. package/src/ProgressBar/ProgressBar.tsx +12 -5
  523. package/src/RadioList/RadioList.doc.mjs +7 -1
  524. package/src/RadioList/RadioList.test.tsx +65 -0
  525. package/src/RadioList/RadioList.tsx +10 -1
  526. package/src/RadioList/RadioListItem.tsx +13 -4
  527. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  528. package/src/Resizable/ResizeHandle.tsx +22 -4
  529. package/src/Section/Section.test.tsx +4 -10
  530. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  531. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  532. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  533. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  534. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  535. package/src/Selector/Selector.doc.mjs +12 -1
  536. package/src/Selector/Selector.test.tsx +30 -0
  537. package/src/Selector/Selector.tsx +18 -0
  538. package/src/SideNav/SideNav.doc.mjs +7 -1
  539. package/src/SideNav/SideNav.test.tsx +66 -0
  540. package/src/SideNav/SideNav.tsx +6 -2
  541. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  542. package/src/SideNav/SideNavSection.tsx +6 -4
  543. package/src/SizeContext/SizeContext.test.tsx +226 -0
  544. package/src/Slider/Slider.doc.mjs +14 -2
  545. package/src/Slider/Slider.test.tsx +30 -0
  546. package/src/Slider/Slider.tsx +20 -0
  547. package/src/Spinner/Spinner.tsx +1 -0
  548. package/src/Switch/Switch.doc.mjs +21 -9
  549. package/src/Switch/Switch.test.tsx +137 -0
  550. package/src/Switch/Switch.tsx +32 -7
  551. package/src/TabList/TabList.doc.mjs +3 -3
  552. package/src/TabList/TabList.test.tsx +185 -1
  553. package/src/TabList/TabMenu.tsx +45 -9
  554. package/src/Table/BaseTable.tsx +16 -3
  555. package/src/Table/Table.test.tsx +87 -0
  556. package/src/Table/TableBody.tsx +15 -2
  557. package/src/Table/TableCell.tsx +87 -8
  558. package/src/Table/TableFooter.tsx +15 -2
  559. package/src/Table/TableHeader.tsx +15 -2
  560. package/src/Table/index.ts +5 -0
  561. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  562. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  563. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  564. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  565. package/src/Table/plugins/rowExpansion/index.ts +7 -0
  566. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
  567. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
  568. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  569. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  570. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  571. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  572. package/src/Table/tableContextMenu.test.tsx +27 -3
  573. package/src/Table/tableContextMenu.tsx +20 -2
  574. package/src/Table/useTablePagination.doc.mjs +4 -1
  575. package/src/Table/useTableRowExpansion.doc.mjs +80 -0
  576. package/src/Table/useTableSortable.doc.mjs +4 -1
  577. package/src/Text/Text.doc.mjs +2 -2
  578. package/src/Text/Text.test.tsx +11 -0
  579. package/src/Text/Text.tsx +4 -2
  580. package/src/Text/text.stylex.ts +41 -0
  581. package/src/TextArea/TextArea.doc.mjs +1 -1
  582. package/src/TextArea/TextArea.test.tsx +3 -3
  583. package/src/TextInput/TextInput.doc.mjs +1 -1
  584. package/src/TextInput/TextInput.test.tsx +3 -3
  585. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  586. package/src/Thumbnail/Thumbnail.tsx +4 -2
  587. package/src/TimeInput/TimeInput.doc.mjs +11 -6
  588. package/src/TimeInput/TimeInput.test.tsx +37 -0
  589. package/src/TimeInput/TimeInput.tsx +11 -1
  590. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  591. package/src/Timestamp/Timestamp.test.tsx +52 -0
  592. package/src/Timestamp/Timestamp.tsx +30 -16
  593. package/src/Toast/Toast.tsx +11 -3
  594. package/src/Toast/ToastViewport.test.tsx +64 -0
  595. package/src/Toast/ToastViewport.tsx +12 -0
  596. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  597. package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
  598. package/src/Tokenizer/Tokenizer.test.tsx +33 -0
  599. package/src/Tokenizer/Tokenizer.tsx +19 -0
  600. package/src/Toolbar/Toolbar.test.tsx +1 -1
  601. package/src/TopNav/TopNav.doc.mjs +1 -1
  602. package/src/TopNav/TopNav.test.tsx +18 -0
  603. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  604. package/src/TreeList/TreeList.doc.mjs +2 -2
  605. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  606. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  607. package/src/Typeahead/Typeahead.doc.mjs +7 -2
  608. package/src/Typeahead/Typeahead.test.tsx +45 -1
  609. package/src/__tests__/TestIcon.tsx +26 -0
  610. package/src/__tests__/fastRoleQueries.ts +66 -0
  611. package/src/docPropReferences.test.ts +178 -0
  612. package/src/docs-types.ts +14 -0
  613. package/src/hooks/focusableSelector.ts +1 -1
  614. package/src/hooks/index.ts +3 -0
  615. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  616. package/src/hooks/useFocusTrap.test.tsx +149 -1
  617. package/src/hooks/useFocusTrap.ts +50 -1
  618. package/src/hooks/useHotkeys.doc.mjs +52 -0
  619. package/src/hooks/useHotkeys.test.ts +245 -0
  620. package/src/hooks/useHotkeys.ts +203 -0
  621. package/src/hooks/useInteractiveRole.ts +12 -4
  622. package/src/hooks/useKeyboardHint.doc.mjs +6 -6
  623. package/src/hooks/useStreamingText.test.ts +54 -19
  624. package/src/hooks/useStreamingText.ts +16 -5
  625. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  626. package/src/theme/defineTheme.ts +4 -13
  627. package/src/theme/derivedVarRegistry.test.ts +2 -2
  628. package/src/theme/expandColorScale.test.ts +29 -0
  629. package/src/theme/expandColorScale.ts +11 -6
  630. package/src/theme/hct.ts +9 -17
  631. package/src/theme/tokens.test.ts +182 -9
  632. package/src/theme/tokens.ts +239 -4
  633. package/src/theme/useTheme.test.tsx +20 -0
  634. package/src/utils/color.test.ts +133 -0
  635. package/src/utils/color.ts +148 -0
  636. package/src/utils/composeEventHandlers.test.ts +71 -0
  637. package/src/utils/composeEventHandlers.ts +44 -0
  638. package/src/utils/index.ts +4 -0
  639. package/src/utils/mergeProps.test.ts +166 -0
  640. package/src/utils/sharedResizeObserver.test.ts +2 -2
  641. package/src/utils/timeParser.test.ts +13 -0
  642. package/src/utils/timeParser.ts +8 -5
@@ -21,6 +21,7 @@
21
21
  import {useRef, useTransition, type ReactNode} from 'react';
22
22
  import type {BaseProps} from '../BaseProps';
23
23
  import * as stylex from '@stylexjs/stylex';
24
+ import {useTooltip} from '../Tooltip/useTooltip';
24
25
  import {
25
26
  colorVars,
26
27
  sizeVars,
@@ -32,14 +33,13 @@ import {
32
33
  fontWeightVars,
33
34
  typeScaleVars,
34
35
  } from '../theme/tokens.stylex';
35
- import {Tooltip} from '../Tooltip/Tooltip';
36
36
  import {Spinner} from '../Spinner';
37
37
  import {VisuallyHidden} from '../VisuallyHidden';
38
38
 
39
39
  import {EDGE_COMP_ATTR} from '../Layout/edgeCompensation.stylex';
40
40
  import {useSize} from '../SizeContext/SizeContext';
41
41
  import {useButtonGroup} from '../ButtonGroup/ButtonGroupContext';
42
- import {mergeProps} from '../utils';
42
+ import {mergeProps, mergeRefs} from '../utils';
43
43
  import {useLinkComponent} from '../Link/useLinkComponent';
44
44
  import type {LinkComponentType} from '../Link/types';
45
45
  import {themeProps} from '../utils/themeProps';
@@ -580,6 +580,16 @@ export function Button({
580
580
  // for keyboard users to reach the tooltip. Otherwise use native disabled.
581
581
  const useAriaDisabled = tooltip != null && buttonDisabled;
582
582
 
583
+ // Attach tooltip behavior via the hook rather than wrapping the button in a
584
+ // <Tooltip> element. The hook adds hover/focus triggers to the button itself,
585
+ // so no extra DOM node is inserted — the button stays a direct child of its
586
+ // container (no layout shift, and edge-compensation markers remain
587
+ // discoverable through the container's direct-child `:has()` selector).
588
+ const tooltipHook = useTooltip({
589
+ placement: 'above',
590
+ isEnabled: tooltip != null,
591
+ });
592
+
583
593
  const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
584
594
  // The ref guard dedupes fire-once actions. Interruptible callers skip it so
585
595
  // a re-click while pending starts a fresh action that interrupts the prior.
@@ -696,18 +706,39 @@ export function Button({
696
706
  (children != null && children !== label);
697
707
  const ariaLabelProp = needsAriaLabel ? {'aria-label': label} : null;
698
708
 
709
+ // When a tooltip is attached via the hook, point aria-describedby at the
710
+ // tooltip content (composing with any consumer-provided value).
711
+ const describedByProp =
712
+ tooltip != null
713
+ ? {
714
+ 'aria-describedby':
715
+ [props['aria-describedby'], tooltipHook.describedBy]
716
+ .filter(Boolean)
717
+ .join(' ') || undefined,
718
+ }
719
+ : null;
720
+
721
+ // Merge the consumer ref with the tooltip hook's trigger ref so both point at
722
+ // the same element. mergeRefs tolerates undefined, so this is a no-op for the
723
+ // tooltip side when no tooltip is set.
724
+ const mergedButtonRef = mergeRefs(
725
+ ref,
726
+ tooltip != null ? tooltipHook.ref : undefined,
727
+ );
728
+
699
729
  let element: ReactNode;
700
730
 
701
731
  if (renderAsLink) {
702
732
  element = (
703
733
  <LinkComponent
704
- ref={ref as React.Ref<HTMLAnchorElement>}
734
+ ref={mergedButtonRef as React.Ref<HTMLAnchorElement>}
705
735
  href={href}
706
736
  target={target}
707
737
  rel={rel}
708
738
  {...sharedMergedProps}
709
739
  {...props}
710
740
  {...ariaLabelProp}
741
+ {...describedByProp}
711
742
  {...edgeCompAttr}
712
743
  onClick={handleClick}>
713
744
  {buttonContent}
@@ -716,12 +747,13 @@ export function Button({
716
747
  } else {
717
748
  element = (
718
749
  <button
719
- ref={ref}
750
+ ref={mergedButtonRef}
720
751
  type={type}
721
752
  disabled={useAriaDisabled ? undefined : buttonDisabled}
722
753
  {...sharedMergedProps}
723
754
  {...props}
724
755
  {...ariaLabelProp}
756
+ {...describedByProp}
725
757
  {...edgeCompAttr}
726
758
  aria-busy={isLoadingState || undefined}
727
759
  aria-disabled={useAriaDisabled || undefined}
@@ -734,9 +766,10 @@ export function Button({
734
766
 
735
767
  if (tooltip) {
736
768
  return (
737
- <Tooltip content={tooltip} placement="above">
769
+ <>
738
770
  {element}
739
- </Tooltip>
771
+ {tooltipHook.renderTooltip(tooltip)}
772
+ </>
740
773
  );
741
774
  }
742
775
 
@@ -15,7 +15,7 @@ export const docs = {
15
15
  },
16
16
  theming: {
17
17
  targets: [
18
- {className: 'astryx-button-group'},
18
+ {className: 'astryx-button-group', visualProps: ['size', 'orientation']},
19
19
  ],
20
20
  },
21
21
  components: [
@@ -19,7 +19,7 @@ export const docs = {
19
19
  {guidance: false, description: 'Disable large blocks of dates without context. The user should understand why dates are unavailable.'},
20
20
  ],
21
21
  anatomy: [
22
- {name: 'Month header', required: true, description: 'The month name and year with navigation arrows to move between months.'},
22
+ {name: 'Month header', required: true, description: 'The month name and year with navigation arrows to move between months. The arrows mirror automatically under dir="rtl".'},
23
23
  {name: 'Day grid', required: true, description: 'A 7-column grid of days with column headers for the day names.'},
24
24
  {name: 'Selected day', required: false, description: 'The currently selected date, highlighted. In range mode, the start and end dates plus the days between them.'},
25
25
  {name: 'Today marker', required: false, description: 'A subtle indicator on the current date for orientation.'},
@@ -12,8 +12,11 @@
12
12
  import {describe, it, expect, vi} from 'vitest';
13
13
  import {act, render, screen, within} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
+ import {getButton} from '../__tests__/fastRoleQueries';
16
+ import * as stylex from '@stylexjs/stylex';
15
17
  import {Calendar} from './Calendar';
16
18
  import type {CalendarHandle} from './Calendar';
19
+ import {calendarStyles} from './styles';
17
20
 
18
21
  /**
19
22
  * Helper to find a day button by its day number.
@@ -24,7 +27,7 @@ import type {CalendarHandle} from './Calendar';
24
27
  function getDayButton(day: number, month = 'January', year = 2026) {
25
28
  // Match the full date pattern with the day number
26
29
  const pattern = new RegExp(`${month}\\s+${day},\\s+${year}`);
27
- return screen.getByRole('button', {name: pattern});
30
+ return getButton(pattern);
28
31
  }
29
32
 
30
33
  describe('Calendar', () => {
@@ -71,6 +74,24 @@ describe('Calendar', () => {
71
74
  expect(screen.getByText(expectedLabel)).toBeInTheDocument();
72
75
  });
73
76
 
77
+ it("marks today's cell with aria-current='date'", () => {
78
+ render(<Calendar />);
79
+
80
+ const now = new Date();
81
+ const iso = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
82
+
83
+ const todayCell = document.querySelector(`button[data-date="${iso}"]`);
84
+ expect(todayCell).not.toBeNull();
85
+ expect(todayCell).toHaveAttribute('aria-current', 'date');
86
+
87
+ // Only today's cell is marked current.
88
+ const others = Array.from(
89
+ document.querySelectorAll('button[data-date]'),
90
+ ).filter(el => el.getAttribute('data-date') !== iso);
91
+ expect(others.length).toBeGreaterThan(0);
92
+ others.forEach(el => expect(el).not.toHaveAttribute('aria-current'));
93
+ });
94
+
74
95
  it('displays day names', () => {
75
96
  render(<Calendar />);
76
97
 
@@ -97,7 +118,11 @@ describe('Calendar', () => {
97
118
  render(<Calendar value="2026-01-15" focusDate="2026-01-01" />);
98
119
 
99
120
  const day15 = getDayButton(15);
100
- expect(day15).toHaveAttribute('aria-selected', 'true');
121
+ // In an ARIA grid, selection state lives on the gridcell, not the button
122
+ // (a plain button role does not permit aria-selected).
123
+ const gridcell15 = day15.closest('[role="gridcell"]');
124
+ expect(gridcell15).toHaveAttribute('aria-selected', 'true');
125
+ expect(day15).not.toHaveAttribute('aria-selected');
101
126
  });
102
127
 
103
128
  it('calls onChange when date is selected', async () => {
@@ -123,7 +148,7 @@ describe('Calendar', () => {
123
148
  // Verify we start on February
124
149
  expect(screen.getByText('February 2026')).toBeInTheDocument();
125
150
 
126
- const prevButton = screen.getByRole('button', {name: 'Previous month'});
151
+ const prevButton = getButton('Previous month');
127
152
  await user.click(prevButton);
128
153
 
129
154
  expect(screen.getByText('January 2026')).toBeInTheDocument();
@@ -137,7 +162,7 @@ describe('Calendar', () => {
137
162
  // Verify we start on January
138
163
  expect(screen.getByText('January 2026')).toBeInTheDocument();
139
164
 
140
- const nextButton = screen.getByRole('button', {name: 'Next month'});
165
+ const nextButton = getButton('Next month');
141
166
  await user.click(nextButton);
142
167
 
143
168
  expect(screen.getByText('February 2026')).toBeInTheDocument();
@@ -151,7 +176,7 @@ describe('Calendar', () => {
151
176
  <Calendar focusDate="2026-01-01" onFocusDateChange={handleFocusChange} />,
152
177
  );
153
178
 
154
- const nextButton = screen.getByRole('button', {name: 'Next month'});
179
+ const nextButton = getButton('Next month');
155
180
  await user.click(nextButton);
156
181
 
157
182
  expect(handleFocusChange).toHaveBeenCalledWith('2026-02-01');
@@ -209,12 +234,39 @@ describe('Calendar', () => {
209
234
 
210
235
  render(<Calendar numberOfMonths={2} focusDate="2026-01-01" />);
211
236
 
212
- const nextButton = screen.getByRole('button', {name: 'Next month'});
237
+ const nextButton = getButton('Next month');
213
238
  await user.click(nextButton);
214
239
 
215
240
  expect(screen.getByText(/February 2026.*March 2026/)).toBeInTheDocument();
216
241
  });
217
242
 
243
+ it('clamps out-of-range numberOfMonths to a single month', () => {
244
+ // 1000 would otherwise try to render 1000 month grids and lock the page up.
245
+ render(
246
+ <Calendar
247
+ numberOfMonths={1000 as unknown as 1 | 2}
248
+ focusDate="2026-01-01"
249
+ />,
250
+ );
251
+
252
+ // Only the focused month renders — no second month, no range separator.
253
+ expect(screen.getByText('January 2026')).toBeInTheDocument();
254
+ expect(screen.queryByText(/February 2026/)).not.toBeInTheDocument();
255
+ });
256
+
257
+ it('clamps numberOfMonths={0} to a single month', () => {
258
+ render(
259
+ <Calendar
260
+ numberOfMonths={0 as unknown as 1 | 2}
261
+ focusDate="2026-01-01"
262
+ />,
263
+ );
264
+
265
+ // 0 previously rendered no months at all; now falls back to one.
266
+ expect(screen.getByText('January 2026')).toBeInTheDocument();
267
+ expect(screen.getAllByRole('gridcell').length).toBeGreaterThan(0);
268
+ });
269
+
218
270
  // ─── Display Options ─────────────────────────────────────────
219
271
 
220
272
  it('shows week numbers when hasWeekNumbers is true', () => {
@@ -310,9 +362,101 @@ describe('Calendar', () => {
310
362
  const day12 = getDayButton(12);
311
363
  const day15 = getDayButton(15);
312
364
 
313
- expect(day10).toHaveAttribute('aria-selected', 'true');
314
- expect(day12).toHaveAttribute('aria-selected', 'true');
315
- expect(day15).toHaveAttribute('aria-selected', 'true');
365
+ // Selection state lives on the gridcell wrapper, not the day button.
366
+ expect(day10.closest('[role="gridcell"]')).toHaveAttribute(
367
+ 'aria-selected',
368
+ 'true',
369
+ );
370
+ expect(day12.closest('[role="gridcell"]')).toHaveAttribute(
371
+ 'aria-selected',
372
+ 'true',
373
+ );
374
+ expect(day15.closest('[role="gridcell"]')).toHaveAttribute(
375
+ 'aria-selected',
376
+ 'true',
377
+ );
378
+ expect(day10).not.toHaveAttribute('aria-selected');
379
+ expect(day12).not.toHaveAttribute('aria-selected');
380
+ expect(day15).not.toHaveAttribute('aria-selected');
381
+ });
382
+
383
+ it('caps the range highlight next to a disabled mid-range day (#2715)', () => {
384
+ // Disable Jan 13. With Jan 10–15 selected, day 12 (immediately before the
385
+ // disabled day) should get a rounded end cap on its right edge, and day 14
386
+ // (immediately after) a rounded cap on its left edge — so the highlight
387
+ // reads as terminating at the disabled gap rather than running square-edged
388
+ // into it.
389
+ const disableJan13 = (d: Date) =>
390
+ !(d.getFullYear() === 2026 && d.getMonth() === 0 && d.getDate() === 13);
391
+ render(
392
+ <Calendar
393
+ mode="range"
394
+ value={{start: '2026-01-10', end: '2026-01-15'}}
395
+ focusDate="2026-01-01"
396
+ dateConstraints={[disableJan13]}
397
+ />,
398
+ );
399
+
400
+ // The range background is an absolutely-positioned sibling div inside the
401
+ // same gridcell as the day button.
402
+ const rangeBgFor = (day: number): HTMLElement => {
403
+ const button = getDayButton(day);
404
+ const cell = button.closest('[role="gridcell"]') as HTMLElement;
405
+ // First child div is the range background (rendered before the button).
406
+ return cell.firstElementChild as HTMLElement;
407
+ };
408
+
409
+ const day12Bg = rangeBgFor(12);
410
+ const day14Bg = rangeBgFor(14);
411
+
412
+ // Capped edges have a border radius; the un-capped edge stays square.
413
+ expect(getComputedStyle(day12Bg).borderTopRightRadius).not.toBe('');
414
+ expect(getComputedStyle(day12Bg).borderTopRightRadius).not.toBe('0px');
415
+ expect(getComputedStyle(day14Bg).borderTopLeftRadius).not.toBe('');
416
+ expect(getComputedStyle(day14Bg).borderTopLeftRadius).not.toBe('0px');
417
+ });
418
+
419
+ it('does not range-highlight adjacent-month spillover days in two-month view', () => {
420
+ // #2715: with July 1–31 selected and July+August visible, July 26–31 also
421
+ // render as outside days in the August pane. Those spillover copies must
422
+ // not carry the range-highlight state (data-in-range) even though their
423
+ // dates fall inside the selected range.
424
+ render(
425
+ <Calendar
426
+ mode="range"
427
+ numberOfMonths={2}
428
+ focusDate="2026-07-01"
429
+ value={{start: '2026-07-01', end: '2026-07-31'}}
430
+ />,
431
+ );
432
+
433
+ const spillover = [
434
+ '2026-07-26',
435
+ '2026-07-27',
436
+ '2026-07-28',
437
+ '2026-07-29',
438
+ '2026-07-30',
439
+ '2026-07-31',
440
+ ];
441
+
442
+ const allDayButtons = Array.from(
443
+ document.querySelectorAll<HTMLButtonElement>('button[data-date]'),
444
+ );
445
+
446
+ for (const iso of spillover) {
447
+ const matches = allDayButtons.filter(
448
+ b => b.getAttribute('data-date') === iso,
449
+ );
450
+ // Renders once in the July pane and once as a spillover in August.
451
+ expect(matches.length).toBeGreaterThanOrEqual(2);
452
+ const outsideCopies = matches.filter(
453
+ b => b.getAttribute('aria-disabled') === 'true',
454
+ );
455
+ expect(outsideCopies.length).toBeGreaterThanOrEqual(1);
456
+ for (const b of outsideCopies) {
457
+ expect(b).not.toHaveAttribute('data-in-range');
458
+ }
459
+ }
316
460
  });
317
461
 
318
462
  // ─── Accessibility ───────────────────────────────────────────
@@ -397,12 +541,8 @@ describe('Calendar', () => {
397
541
  it('has navigation buttons with accessible labels', () => {
398
542
  render(<Calendar />);
399
543
 
400
- expect(
401
- screen.getByRole('button', {name: 'Previous month'}),
402
- ).toBeInTheDocument();
403
- expect(
404
- screen.getByRole('button', {name: 'Next month'}),
405
- ).toBeInTheDocument();
544
+ expect(getButton('Previous month')).toBeInTheDocument();
545
+ expect(getButton('Next month')).toBeInTheDocument();
406
546
  });
407
547
 
408
548
  // ─── Bug Regression Tests ───────────────────────────────────
@@ -510,14 +650,14 @@ describe('Calendar', () => {
510
650
  it('prev button is disabled when focusDate month contains min', () => {
511
651
  render(<Calendar focusDate="2026-01-01" min="2026-01-15" />);
512
652
 
513
- const prevButton = screen.getByRole('button', {name: 'Previous month'});
653
+ const prevButton = getButton('Previous month');
514
654
  expect(prevButton).toBeDisabled();
515
655
  });
516
656
 
517
657
  it('next button is disabled when focusDate month contains max', () => {
518
658
  render(<Calendar focusDate="2026-01-01" max="2026-01-15" />);
519
659
 
520
- const nextButton = screen.getByRole('button', {name: 'Next month'});
660
+ const nextButton = getButton('Next month');
521
661
  expect(nextButton).toBeDisabled();
522
662
  });
523
663
 
@@ -596,4 +736,48 @@ describe('Calendar', () => {
596
736
  }
597
737
  }
598
738
  });
739
+
740
+ // ─── RTL (#3388) ─────────────────────────────────────────────
741
+
742
+ describe('RTL month navigation', () => {
743
+ // jsdom does not apply compiled StyleX CSS, so the scaleX(-1) mirror
744
+ // itself is only observable in a browser (see the dir="rtl" Storybook
745
+ // story). These tests pin the structure the fix depends on: both nav
746
+ // chevrons render inside the navIcon wrapper that carries the
747
+ // ':is([dir="rtl"] *)' conditional transform.
748
+ it('wraps both nav chevrons in the RTL-mirroring navIcon wrapper', () => {
749
+ render(<Calendar focusDate="2026-01-01" />);
750
+
751
+ const {className: navIconClass} = stylex.props(calendarStyles.navIcon);
752
+ expect(navIconClass).toBeTruthy();
753
+
754
+ for (const name of ['Previous month', 'Next month']) {
755
+ const button = getButton(name);
756
+ const wrappers = Array.from(button.querySelectorAll('span')).filter(
757
+ span => span.className === navIconClass,
758
+ );
759
+ expect(wrappers.length).toBe(1);
760
+ }
761
+ });
762
+
763
+ it('keeps navigation semantics unchanged under dir="rtl"', async () => {
764
+ const user = userEvent.setup();
765
+
766
+ render(
767
+ <div dir="rtl">
768
+ <Calendar focusDate="2026-02-01" />
769
+ </div>,
770
+ );
771
+
772
+ expect(screen.getByText('February 2026')).toBeInTheDocument();
773
+
774
+ // DOM order and handlers must not change in RTL: flexbox already
775
+ // places "Previous month" at the visual right; only the glyph mirrors.
776
+ await user.click(getButton('Previous month'));
777
+ expect(screen.getByText('January 2026')).toBeInTheDocument();
778
+
779
+ await user.click(getButton('Next month'));
780
+ expect(screen.getByText('February 2026')).toBeInTheDocument();
781
+ });
782
+ });
599
783
  });
@@ -61,7 +61,9 @@ import {
61
61
  computeDayCellState,
62
62
  computeRangeRounding,
63
63
  computePreviewRounding,
64
+ computeDayNeighborContinuity,
64
65
  isEndpoint,
66
+ type DayNeighborContinuity,
65
67
  } from './dayCellUtils';
66
68
 
67
69
  // =============================================================================
@@ -201,7 +203,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
201
203
  value,
202
204
  defaultValue,
203
205
  onChange,
204
- numberOfMonths = 1,
206
+ numberOfMonths: numberOfMonthsProp = 1,
205
207
  min,
206
208
  max,
207
209
  dateConstraints,
@@ -221,6 +223,11 @@ export function Calendar({ref, ...props}: CalendarProps) {
221
223
  // DayOfWeek so all downstream date math keeps working with an index.
222
224
  const weekStartsOn = normalizeDayOfWeek(weekStartsOnProp);
223
225
 
226
+ // `numberOfMonths` is typed `1 | 2`; defensively clamp anything else that
227
+ // slips through at runtime to 1 so `Array.from({length})` can't render an
228
+ // absurd number of month grids (e.g. `numberOfMonths={1000}`).
229
+ const numberOfMonths = numberOfMonthsProp === 2 ? 2 : 1;
230
+
224
231
  // Today's date (memoized)
225
232
  const today = useMemo(() => plainDateToday(), []);
226
233
 
@@ -424,7 +431,14 @@ export function Calendar({ref, ...props}: CalendarProps) {
424
431
  <Button
425
432
  label="Previous month"
426
433
  variant="ghost"
427
- icon={<Icon icon="chevronLeft" size="sm" color="inherit" />}
434
+ icon={
435
+ // Wrapper span (not Icon props): Icon's string mode clobbers
436
+ // caller classNames, so the RTL mirror must live on its own
437
+ // element.
438
+ <span {...stylex.props(calendarStyles.navIcon)}>
439
+ <Icon icon="chevronLeft" size="sm" color="inherit" />
440
+ </span>
441
+ }
428
442
  onClick={() => navigateMonth(-1)}
429
443
  isDisabled={!canNavigatePrevious}
430
444
  isIconOnly
@@ -437,7 +451,11 @@ export function Calendar({ref, ...props}: CalendarProps) {
437
451
  <Button
438
452
  label="Next month"
439
453
  variant="ghost"
440
- icon={<Icon icon="chevronRight" size="sm" color="inherit" />}
454
+ icon={
455
+ <span {...stylex.props(calendarStyles.navIcon)}>
456
+ <Icon icon="chevronRight" size="sm" color="inherit" />
457
+ </span>
458
+ }
441
459
  onClick={() => navigateMonth(1)}
442
460
  isDisabled={!canNavigateNext}
443
461
  isIconOnly
@@ -784,25 +802,42 @@ function MonthGrid({
784
802
  {weekNum}
785
803
  </div>
786
804
  )}
787
- {week.map((day, dayIndex) => (
788
- <DayCell
789
- key={day.iso}
790
- day={day}
791
- dayIndex={dayIndex}
792
- mode={mode}
793
- selectedDate={selectedDate}
794
- rangeStart={rangeStart}
795
- rangeEnd={rangeEnd}
796
- previewStart={previewStart}
797
- previewEnd={previewEnd}
798
- today={today}
799
- hasOutsideDays={hasOutsideDays}
800
- isDisabled={isDateDisabled(day.date)}
801
- isTabbable={day.iso === seedTabbableIso}
802
- onDayClick={onDayClick}
803
- onDayHover={onDayHover}
804
- />
805
- ))}
805
+ {week.map((day, dayIndex) => {
806
+ // Whether the previous/next day in this week row continues the
807
+ // highlighted run (range and preview). A disabled or
808
+ // adjacent-month neighbour breaks continuity, so this day gets
809
+ // an end cap on that side (#2715).
810
+ const neighbors = computeDayNeighborContinuity({
811
+ week,
812
+ dayIndex,
813
+ mode,
814
+ rangeStart,
815
+ rangeEnd,
816
+ previewStart,
817
+ previewEnd,
818
+ isDisabled: isDateDisabled,
819
+ });
820
+ return (
821
+ <DayCell
822
+ key={day.iso}
823
+ day={day}
824
+ dayIndex={dayIndex}
825
+ mode={mode}
826
+ selectedDate={selectedDate}
827
+ rangeStart={rangeStart}
828
+ rangeEnd={rangeEnd}
829
+ previewStart={previewStart}
830
+ previewEnd={previewEnd}
831
+ today={today}
832
+ hasOutsideDays={hasOutsideDays}
833
+ isDisabled={isDateDisabled(day.date)}
834
+ neighbors={neighbors}
835
+ isTabbable={day.iso === seedTabbableIso}
836
+ onDayClick={onDayClick}
837
+ onDayHover={onDayHover}
838
+ />
839
+ );
840
+ })}
806
841
  </div>
807
842
  );
808
843
  })}
@@ -827,6 +862,12 @@ interface DayCellProps {
827
862
  today: PlainDate;
828
863
  hasOutsideDays: boolean;
829
864
  isDisabled: boolean;
865
+ /**
866
+ * Whether the previous/next day in the same week continues the highlighted
867
+ * run (range and preview). When a neighbour is disabled or outside the month
868
+ * it breaks the run, so this day gets an end cap on that side (#2715).
869
+ */
870
+ neighbors: DayNeighborContinuity;
830
871
  /**
831
872
  * Whether this day seeds the initial roving tab stop. useGridFocus
832
873
  * (`hasRovingTabIndex`) owns the live tab stop thereafter — it honors an
@@ -849,6 +890,7 @@ function DayCell({
849
890
  today,
850
891
  hasOutsideDays,
851
892
  isDisabled,
893
+ neighbors,
852
894
  isTabbable: isTabbableDay,
853
895
  onDayClick,
854
896
  onDayHover,
@@ -876,11 +918,20 @@ function DayCell({
876
918
  });
877
919
 
878
920
  const endpoint = isEndpoint(state);
879
- const rangeRounding = computeRangeRounding(state);
880
- const previewRounding = computePreviewRounding(state);
921
+ const rangeRounding = computeRangeRounding(state, {
922
+ prevInRange: neighbors.prevInRange,
923
+ nextInRange: neighbors.nextInRange,
924
+ });
925
+ const previewRounding = computePreviewRounding(state, {
926
+ prevInPreview: neighbors.prevInPreview,
927
+ nextInPreview: neighbors.nextInPreview,
928
+ });
881
929
 
882
930
  return (
883
- <div role="gridcell" {...stylex.props(dayCellStyles.cell)}>
931
+ <div
932
+ role="gridcell"
933
+ aria-selected={state.isSelected || state.isInRange || undefined}
934
+ {...stylex.props(dayCellStyles.cell)}>
884
935
  {/* Range background */}
885
936
  {state.isInRange && (
886
937
  <div
@@ -920,8 +971,10 @@ function DayCell({
920
971
  type="button"
921
972
  data-date={day.iso}
922
973
  aria-label={plainDateFormat(date, DATE_FORMAT_WITH_WEEKDAY)}
923
- aria-selected={state.isSelected || state.isInRange || undefined}
924
974
  aria-disabled={state.effectivelyDisabled || undefined}
975
+ // Mark today's cell programmatically (APG date-picker pattern), not just
976
+ // visually, so screen-reader users can identify the current date.
977
+ aria-current={state.isToday ? 'date' : undefined}
925
978
  disabled={isDisabled}
926
979
  // Initial roving tab-stop seed; useGridFocus owns it after mount.
927
980
  tabIndex={isTabbableDay ? 0 : -1}