@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
package/src/Link/Link.tsx CHANGED
@@ -274,8 +274,6 @@ export interface LinkProps extends BaseProps<
274
274
  * <Link href="/settings" color="secondary">Settings</Link>
275
275
  * <Link href="/privacy" hasUnderline>Privacy Policy</Link>
276
276
  * <Link label="Close dialog" href="/home"><Icon icon="x" /></Link>
277
- *
278
- * // Inline link inside text — inherits the surrounding type/size:
279
277
  * <Text type="large">
280
278
  * Read our <Link href="/terms" type="inherit">terms</Link> first.
281
279
  * </Text>
@@ -425,7 +425,14 @@ const streamingStyles = stylex.create({
425
425
  fadeIn: {
426
426
  opacity: 1,
427
427
  transitionProperty: 'opacity',
428
- transitionDuration: durationVars['--duration-medium'],
428
+ // Collapse the entry fade to an instant swap under reduced motion. The
429
+ // 0s duration makes the @starting-style opacity jump non-animated (the
430
+ // media query can't nest inside @starting-style), mirroring the
431
+ // conditional-duration form in Spinner (Spinner.tsx).
432
+ transitionDuration: {
433
+ default: durationVars['--duration-medium'],
434
+ '@media (prefers-reduced-motion: reduce)': '0s',
435
+ },
429
436
  transitionTimingFunction: easeVars['--ease-standard'],
430
437
  '@starting-style': {
431
438
  opacity: 0,
@@ -1049,12 +1056,7 @@ function renderBlock(
1049
1056
  switch (node.type) {
1050
1057
  case 'heading': {
1051
1058
  const level = Math.min(node.level + headingLevelStart - 1, 6) as
1052
- | 1
1053
- | 2
1054
- | 3
1055
- | 4
1056
- | 5
1057
- | 6;
1059
+ 1 | 2 | 3 | 4 | 5 | 6;
1058
1060
  const headingChildren = node.children.map((c, i) =>
1059
1061
  renderInline(
1060
1062
  c,
@@ -69,6 +69,31 @@ function simulateStreamingIncremental(
69
69
  return parseMarkdownIncremental(fullText, state);
70
70
  }
71
71
 
72
+ // A single wall-clock measurement is flaky when the whole suite runs in
73
+ // parallel forks: scheduler contention can inflate a millisecond-scale
74
+ // sample well past a tight budget (observed 30.9ms against the 20ms Small
75
+ // budget). The fastest of a few runs approximates the un-contended cost —
76
+ // a real regression raises the minimum too — so budgets stay tight without
77
+ // flapping. The streaming budget tests below keep a single run: their
78
+ // budgets carry 10x+ headroom, which contention cannot realistically eat.
79
+ function measureBest<T>(
80
+ runs: number,
81
+ fn: () => T,
82
+ ): {elapsed: number; result: T} {
83
+ let elapsed = Infinity;
84
+ let result!: T;
85
+ for (let i = 0; i < runs; i++) {
86
+ const start = performance.now();
87
+ const r = fn();
88
+ const t = performance.now() - start;
89
+ if (t < elapsed) {
90
+ elapsed = t;
91
+ result = r;
92
+ }
93
+ }
94
+ return {elapsed, result};
95
+ }
96
+
72
97
  describe('parseMarkdown performance', () => {
73
98
  const sizes = [
74
99
  {name: 'Small', paragraphs: 10, maxMs: 20},
@@ -93,9 +118,7 @@ describe('parseMarkdown performance', () => {
93
118
  for (const size of sizes) {
94
119
  it(`full re-parse ${size.name} (${size.paragraphs} paragraphs) under ${size.maxMs}ms`, () => {
95
120
  const text = generateAIResponse(size.paragraphs);
96
- const start = performance.now();
97
- const result = parseMarkdown(text);
98
- const elapsed = performance.now() - start;
121
+ const {elapsed, result} = measureBest(3, () => parseMarkdown(text));
99
122
  console.log(
100
123
  ` ${size.name} full parse: ${elapsed.toFixed(2)}ms → ${result.length} blocks`,
101
124
  );
@@ -149,15 +172,14 @@ describe('parseMarkdown performance', () => {
149
172
  const text = generateAIResponse(200);
150
173
  const chunkSize = 50;
151
174
 
152
- // Full re-parse timing
153
- const fullStart = performance.now();
154
- simulateStreamingFullReparse(text, chunkSize);
155
- const fullElapsed = performance.now() - fullStart;
156
-
157
- // Incremental timing
158
- const incrStart = performance.now();
159
- simulateStreamingIncremental(text, chunkSize);
160
- const incrElapsed = performance.now() - incrStart;
175
+ // The assertion below compares a ratio of two measurements, so noise on
176
+ // either side can flip it — measure both as best-of-3.
177
+ const {elapsed: fullElapsed} = measureBest(3, () =>
178
+ simulateStreamingFullReparse(text, chunkSize),
179
+ );
180
+ const {elapsed: incrElapsed} = measureBest(3, () =>
181
+ simulateStreamingIncremental(text, chunkSize),
182
+ );
161
183
 
162
184
  const speedup = fullElapsed / incrElapsed;
163
185
  console.log(`\n === Incremental vs Full Re-parse Speedup ===`);
@@ -144,6 +144,62 @@ describe('MobileNav', () => {
144
144
  expect(screen.getByTestId('custom-nav')).toBeInTheDocument();
145
145
  });
146
146
 
147
+ it('forwards arbitrary pass-through attributes to the dialog', () => {
148
+ render(
149
+ <MobileNav
150
+ isOpen={true}
151
+ onOpenChange={() => {}}
152
+ data-testid="nav"
153
+ id="main-nav"
154
+ data-custom="x"
155
+ aria-describedby="nav-desc">
156
+ <span>Content</span>
157
+ </MobileNav>,
158
+ );
159
+
160
+ const dialog = screen.getByTestId('nav');
161
+ expect(dialog).toHaveAttribute('id', 'main-nav');
162
+ expect(dialog).toHaveAttribute('data-custom', 'x');
163
+ expect(dialog).toHaveAttribute('aria-describedby', 'nav-desc');
164
+ });
165
+
166
+ it('applies a consumer className and style to the dialog', () => {
167
+ render(
168
+ <MobileNav
169
+ isOpen={true}
170
+ onOpenChange={() => {}}
171
+ data-testid="nav"
172
+ className="consumer-class"
173
+ style={{zIndex: 42}}>
174
+ <span>Content</span>
175
+ </MobileNav>,
176
+ );
177
+
178
+ const dialog = screen.getByTestId('nav');
179
+ expect(dialog.className).toContain('consumer-class');
180
+ expect(dialog.style.zIndex).toBe('42');
181
+ });
182
+
183
+ it('composes a consumer onClick with the backdrop-dismiss handler', () => {
184
+ const onClick = vi.fn();
185
+ const onOpenChange = vi.fn();
186
+ render(
187
+ <MobileNav
188
+ isOpen={true}
189
+ onOpenChange={onOpenChange}
190
+ data-testid="nav"
191
+ onClick={onClick}>
192
+ <span>Content</span>
193
+ </MobileNav>,
194
+ );
195
+
196
+ // Clicking the dialog element itself (the backdrop) dismisses AND calls the
197
+ // consumer handler.
198
+ fireEvent.click(screen.getByTestId('nav'));
199
+ expect(onClick).toHaveBeenCalledTimes(1);
200
+ expect(onOpenChange).toHaveBeenCalledWith(false);
201
+ });
202
+
147
203
  it('uses native dialog element', () => {
148
204
  render(
149
205
  <MobileNav
@@ -46,7 +46,7 @@ import {Button} from '../Button';
46
46
  import {Icon} from '../Icon';
47
47
  import {Heading} from '../Heading/Heading';
48
48
  import {useAppShellMobile} from '../AppShell/AppShellMobileContext';
49
- import {mergeProps, mergeRefs} from '../utils';
49
+ import {mergeProps, mergeRefs, composeEventHandlers} from '../utils';
50
50
  import type {BaseProps} from '../BaseProps';
51
51
  import {themeProps} from '../utils/themeProps';
52
52
 
@@ -284,9 +284,11 @@ export function MobileNav({
284
284
  label,
285
285
  'data-testid': testId,
286
286
  xstyle,
287
- className: _className,
288
- style: _style,
287
+ className,
288
+ style,
289
+ onClick: onClickProp,
289
290
  ref,
291
+ ...rest
290
292
  }: MobileNavProps) {
291
293
  // Read from AppShell context as fallback
292
294
  const appShellMobile = useAppShellMobile();
@@ -407,10 +409,6 @@ export function MobileNav({
407
409
  return (
408
410
  <dialog
409
411
  ref={mergeRefs(ref, dialogRef)}
410
- data-testid={testId}
411
- aria-label={label ?? (typeof header === 'string' ? header : 'Navigation')}
412
- onClick={handleDialogClick}
413
- onCancel={handleCancel}
414
412
  {...mergeProps(
415
413
  themeProps('mobile-nav', {side: resolvedSide}),
416
414
  stylex.props(
@@ -420,7 +418,14 @@ export function MobileNav({
420
418
  isOpen && styles.backdropOpen,
421
419
  xstyle,
422
420
  ),
423
- )}>
421
+ className,
422
+ style,
423
+ )}
424
+ {...rest}
425
+ data-testid={testId}
426
+ aria-label={label ?? (typeof header === 'string' ? header : 'Navigation')}
427
+ onClick={composeEventHandlers(onClickProp, handleDialogClick)}
428
+ onCancel={handleCancel}>
424
429
  {/* Drawer panel — tabIndex so showModal() focuses the drawer, not the close button */}
425
430
  <div
426
431
  tabIndex={-1}
@@ -17,12 +17,27 @@ export const docs = {
17
17
  'NavHeadingMenuItem renders individual selectable items. ' +
18
18
  'Pass as the menu prop of SideNavHeading or TopNavHeading.',
19
19
  },
20
+ playground: {
21
+ defaults: {
22
+ children: [
23
+ {__element: 'NavHeadingMenuItem', props: {label: 'Dashboard', href: '#'}},
24
+ {__element: 'NavHeadingMenuItem', props: {label: 'Analytics', href: '#'}},
25
+ {__element: 'NavHeadingMenuItem', props: {label: 'Settings', href: '#'}},
26
+ ],
27
+ },
28
+ },
20
29
  props: [
21
30
  {name: 'children', type: 'ReactNode', required: true, description: 'Menu items.'},
22
31
  {name: 'size', type: "'sm' | 'md' | 'lg'", default: "'md'", description: 'Controls min-width and item padding.'},
23
32
  {name: 'minWidth', type: 'number | string', description: 'Minimum width override.'},
24
33
  {name: 'xstyle', type: 'StyleXStyles', description: 'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value, not an inline style object like style={{}}.'},
25
34
  ],
35
+ theming: {
36
+ targets: [
37
+ {className: 'astryx-nav-heading-menu', visualProps: ['size']},
38
+ {className: 'astryx-nav-heading-menu-item', visualProps: ['size']},
39
+ ],
40
+ },
26
41
  };
27
42
 
28
43
  /** @type {import('../docs-types').TranslationDoc} */
@@ -12,7 +12,7 @@
12
12
  import {describe, it, expect, vi, beforeEach} from 'vitest';
13
13
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
- import {HashtagIcon} from '@heroicons/react/24/outline';
15
+ import {TestIcon} from '../__tests__/TestIcon';
16
16
  import {NumberInput} from './NumberInput';
17
17
 
18
18
  // Mock showPopover/hidePopover since jsdom does not implement them. Used by the
@@ -174,7 +174,7 @@ describe('NumberInput', () => {
174
174
  label="Count"
175
175
  value={null}
176
176
  onChange={() => {}}
177
- startIcon={HashtagIcon}
177
+ startIcon={TestIcon}
178
178
  />,
179
179
  );
180
180
  expect(screen.getByRole('spinbutton')).toBeInTheDocument();
@@ -707,7 +707,7 @@ describe('NumberInput', () => {
707
707
  label="Qty"
708
708
  value={0}
709
709
  onChange={() => {}}
710
- startIcon={<HashtagIcon />}
710
+ startIcon={<TestIcon />}
711
711
  />,
712
712
  );
713
713
 
@@ -867,3 +867,48 @@ describe('NumberInput', () => {
867
867
  });
868
868
  });
869
869
  });
870
+
871
+ describe('keyboard clearing with hasClear (#3599)', () => {
872
+ it('commits null when the input is emptied and blurred', () => {
873
+ const onChange = vi.fn();
874
+ render(
875
+ <NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
876
+ );
877
+ const input = screen.getByLabelText('Qty');
878
+ fireEvent.change(input, {target: {value: ''}});
879
+ fireEvent.blur(input);
880
+ expect(onChange).toHaveBeenCalledWith(null);
881
+ });
882
+
883
+ it('commits null when the input is emptied and Enter is pressed', () => {
884
+ const onChange = vi.fn();
885
+ render(
886
+ <NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
887
+ );
888
+ const input = screen.getByLabelText('Qty');
889
+ fireEvent.change(input, {target: {value: ''}});
890
+ fireEvent.keyDown(input, {key: 'Enter'});
891
+ expect(onChange).toHaveBeenCalledWith(null);
892
+ });
893
+
894
+ it('does not fire when emptied and blurred with no prior value', () => {
895
+ const onChange = vi.fn();
896
+ render(
897
+ <NumberInput label="Qty" hasClear value={null} onChange={onChange} />,
898
+ );
899
+ const input = screen.getByLabelText('Qty');
900
+ fireEvent.change(input, {target: {value: ''}});
901
+ fireEvent.blur(input);
902
+ expect(onChange).not.toHaveBeenCalled();
903
+ });
904
+
905
+ it('still reverts on blur when hasClear is not set', () => {
906
+ const onChange = vi.fn();
907
+ render(<NumberInput label="Qty" value={42} onChange={onChange} />);
908
+ const input = screen.getByLabelText('Qty');
909
+ fireEvent.change(input, {target: {value: ''}});
910
+ fireEvent.blur(input);
911
+ expect(onChange).not.toHaveBeenCalled();
912
+ expect((input as HTMLInputElement).value).toBe('42');
913
+ });
914
+ });
@@ -503,13 +503,21 @@ export function NumberInput({
503
503
  const handleBlur = useCallback(
504
504
  (e: FocusEvent<HTMLInputElement>) => {
505
505
  if (pendingInput !== null) {
506
- const parsed = parseNumberInput(pendingInput, {
507
- min,
508
- max,
509
- isIntegerOnly,
510
- });
511
- if (parsed !== null && parsed !== value) {
512
- onChange(parsed);
506
+ if (hasClear && pendingInput.trim() === '') {
507
+ // Keyboard clearing honors the clearable contract: an emptied
508
+ // input commits null instead of silently reverting on blur.
509
+ if (value != null) {
510
+ onChange(null);
511
+ }
512
+ } else {
513
+ const parsed = parseNumberInput(pendingInput, {
514
+ min,
515
+ max,
516
+ isIntegerOnly,
517
+ });
518
+ if (parsed !== null && parsed !== value) {
519
+ onChange(parsed);
520
+ }
513
521
  }
514
522
  }
515
523
 
@@ -517,7 +525,7 @@ export function NumberInput({
517
525
  setPendingInput(null);
518
526
  onBlur?.(e);
519
527
  },
520
- [pendingInput, value, onChange, min, max, isIntegerOnly, onBlur],
528
+ [pendingInput, value, onChange, min, max, isIntegerOnly, onBlur, hasClear],
521
529
  );
522
530
 
523
531
  // Handle keyboard events
@@ -526,13 +534,21 @@ export function NumberInput({
526
534
  if (e.key === 'Enter') {
527
535
  // Validate and commit on Enter
528
536
  if (pendingInput !== null) {
529
- const parsed = parseNumberInput(pendingInput, {
530
- min,
531
- max,
532
- isIntegerOnly,
533
- });
534
- if (parsed !== null && parsed !== value) {
535
- onChange(parsed);
537
+ if (hasClear && pendingInput.trim() === '') {
538
+ // Same clearable contract as blur: Enter on an emptied input
539
+ // commits null instead of reverting.
540
+ if (value != null) {
541
+ onChange(null);
542
+ }
543
+ } else {
544
+ const parsed = parseNumberInput(pendingInput, {
545
+ min,
546
+ max,
547
+ isIntegerOnly,
548
+ });
549
+ if (parsed !== null && parsed !== value) {
550
+ onChange(parsed);
551
+ }
536
552
  }
537
553
  }
538
554
  onEnter?.();
@@ -548,6 +564,7 @@ export function NumberInput({
548
564
  isIntegerOnly,
549
565
  onEnter,
550
566
  onKeyDown,
567
+ hasClear,
551
568
  ],
552
569
  );
553
570
 
@@ -30,6 +30,7 @@ export const docs = {
30
30
  theming: {
31
31
  targets: [
32
32
  {className: 'astryx-outline', visualProps: ['density']},
33
+ {className: 'astryx-outline-indicator'},
33
34
  {className: 'astryx-outline-item', visualProps: ['level'], states: ['active']},
34
35
  ],
35
36
  },
@@ -163,6 +164,7 @@ export const docsZh = {
163
164
  theming: {
164
165
  targets: [
165
166
  {className: 'astryx-outline', visualProps: ['density']},
167
+ {className: 'astryx-outline-indicator'},
166
168
  {className: 'astryx-outline-item', visualProps: ['level'], states: ['active']},
167
169
  ],
168
170
  },
@@ -0,0 +1,80 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import {parseOutlineFromMarkdown} from './parseOutlineFromMarkdown';
5
+
6
+ describe('parseOutlineFromMarkdown', () => {
7
+ it('returns an empty outline for content with no headings', () => {
8
+ expect(parseOutlineFromMarkdown('just a paragraph of text')).toEqual([]);
9
+ expect(parseOutlineFromMarkdown('')).toEqual([]);
10
+ });
11
+
12
+ it('extracts headings with their level and slugified id', () => {
13
+ const outline = parseOutlineFromMarkdown('# Getting Started');
14
+ expect(outline).toEqual([
15
+ {id: 'getting-started', label: 'Getting Started', level: 1},
16
+ ]);
17
+ });
18
+
19
+ it('captures heading levels distinctly', () => {
20
+ const outline = parseOutlineFromMarkdown(
21
+ ['# One', '## Two', '### Three'].join('\n\n'),
22
+ );
23
+ expect(outline.map(i => i.level)).toEqual([1, 2, 3]);
24
+ expect(outline.map(i => i.label)).toEqual(['One', 'Two', 'Three']);
25
+ });
26
+
27
+ it('slugifies punctuation and spaces into single hyphens', () => {
28
+ const outline = parseOutlineFromMarkdown('# Hello, World! Again');
29
+ expect(outline[0].id).toBe('hello-world-again');
30
+ });
31
+
32
+ it('strips quotes rather than converting them to hyphens', () => {
33
+ const outline = parseOutlineFromMarkdown(`# The "Best" Way`);
34
+ expect(outline[0].id).toBe('the-best-way');
35
+ });
36
+
37
+ it('trims leading and trailing hyphens from the slug', () => {
38
+ const outline = parseOutlineFromMarkdown('# ...leading and trailing...');
39
+ expect(outline[0].id).not.toMatch(/^-/);
40
+ expect(outline[0].id).not.toMatch(/-$/);
41
+ });
42
+
43
+ it('deduplicates repeated slugs with a numeric suffix', () => {
44
+ const outline = parseOutlineFromMarkdown(
45
+ ['# Setup', '# Setup', '# Setup'].join('\n\n'),
46
+ );
47
+ expect(outline.map(i => i.id)).toEqual(['setup', 'setup-1', 'setup-2']);
48
+ // labels stay unchanged even as ids are disambiguated
49
+ expect(outline.every(i => i.label === 'Setup')).toBe(true);
50
+ });
51
+
52
+ it('falls back to "section" when a heading slugifies to empty', () => {
53
+ const outline = parseOutlineFromMarkdown(['# !!!', '# @@@'].join('\n\n'));
54
+ expect(outline.map(i => i.id)).toEqual(['section', 'section-1']);
55
+ });
56
+
57
+ it('flattens inline formatting into the label text', () => {
58
+ const outline = parseOutlineFromMarkdown('# **Bold** and _italic_ text');
59
+ expect(outline[0].label).toBe('Bold and italic text');
60
+ expect(outline[0].id).toBe('bold-and-italic-text');
61
+ });
62
+
63
+ it('includes inline code content in the label', () => {
64
+ const outline = parseOutlineFromMarkdown('# The `useState` hook');
65
+ expect(outline[0].label).toBe('The useState hook');
66
+ });
67
+
68
+ it('does not treat fenced code block content as headings', () => {
69
+ const md = ['# Real Heading', '', '```', '# not a heading', '```'].join(
70
+ '\n',
71
+ );
72
+ const outline = parseOutlineFromMarkdown(md);
73
+ expect(outline.map(i => i.label)).toEqual(['Real Heading']);
74
+ });
75
+
76
+ it('trims surrounding whitespace from labels', () => {
77
+ const outline = parseOutlineFromMarkdown('# Spaced Out ');
78
+ expect(outline[0].label).toBe('Spaced Out');
79
+ });
80
+ });