@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
@@ -11,48 +11,48 @@
11
11
 
12
12
  import {describe, it, expect, vi} from 'vitest';
13
13
  import {render, screen} from '@testing-library/react';
14
- import {HomeIcon} from '@heroicons/react/24/outline';
14
+ import {TestIcon} from '../__tests__/TestIcon';
15
15
  import {Icon} from './Icon';
16
16
 
17
17
  describe('Icon', () => {
18
18
  it('renders the icon component', () => {
19
- render(<Icon icon={HomeIcon} data-testid="icon" />);
19
+ render(<Icon icon={TestIcon} data-testid="icon" />);
20
20
  expect(screen.getByTestId('icon')).toBeInTheDocument();
21
21
  });
22
22
 
23
23
  it('renders as an SVG element', () => {
24
- render(<Icon icon={HomeIcon} data-testid="icon" />);
24
+ render(<Icon icon={TestIcon} data-testid="icon" />);
25
25
  const icon = screen.getByTestId('icon');
26
26
  expect(icon.tagName.toLowerCase()).toBe('svg');
27
27
  });
28
28
 
29
29
  it('applies aria-hidden by default', () => {
30
- render(<Icon icon={HomeIcon} data-testid="icon" />);
30
+ render(<Icon icon={TestIcon} data-testid="icon" />);
31
31
  expect(screen.getByTestId('icon')).toHaveAttribute('aria-hidden', 'true');
32
32
  });
33
33
 
34
34
  it('renders with different color variants', () => {
35
35
  const {rerender} = render(
36
- <Icon icon={HomeIcon} color="primary" data-testid="icon" />,
36
+ <Icon icon={TestIcon} color="primary" data-testid="icon" />,
37
37
  );
38
38
  expect(screen.getByTestId('icon')).toBeInTheDocument();
39
39
 
40
- rerender(<Icon icon={HomeIcon} color="secondary" data-testid="icon" />);
40
+ rerender(<Icon icon={TestIcon} color="secondary" data-testid="icon" />);
41
41
  expect(screen.getByTestId('icon')).toBeInTheDocument();
42
42
 
43
- rerender(<Icon icon={HomeIcon} color="accent" data-testid="icon" />);
43
+ rerender(<Icon icon={TestIcon} color="accent" data-testid="icon" />);
44
44
  expect(screen.getByTestId('icon')).toBeInTheDocument();
45
45
 
46
- rerender(<Icon icon={HomeIcon} color="success" data-testid="icon" />);
46
+ rerender(<Icon icon={TestIcon} color="success" data-testid="icon" />);
47
47
  expect(screen.getByTestId('icon')).toBeInTheDocument();
48
48
 
49
- rerender(<Icon icon={HomeIcon} color="error" data-testid="icon" />);
49
+ rerender(<Icon icon={TestIcon} color="error" data-testid="icon" />);
50
50
  expect(screen.getByTestId('icon')).toBeInTheDocument();
51
51
 
52
- rerender(<Icon icon={HomeIcon} color="warning" data-testid="icon" />);
52
+ rerender(<Icon icon={TestIcon} color="warning" data-testid="icon" />);
53
53
  expect(screen.getByTestId('icon')).toBeInTheDocument();
54
54
 
55
- rerender(<Icon icon={HomeIcon} color="inherit" data-testid="icon" />);
55
+ rerender(<Icon icon={TestIcon} color="inherit" data-testid="icon" />);
56
56
  expect(screen.getByTestId('icon')).toBeInTheDocument();
57
57
  });
58
58
 
@@ -70,50 +70,41 @@ describe('Icon', () => {
70
70
  'purple',
71
71
  ] as const;
72
72
  const {rerender} = render(
73
- <Icon
74
- icon={HomeIcon}
75
- color={nonSemanticColors[0]}
76
- data-testid="icon"
77
- />,
73
+ <Icon icon={TestIcon} color={nonSemanticColors[0]} data-testid="icon" />,
78
74
  );
79
75
  expect(screen.getByTestId('icon')).toBeInTheDocument();
80
76
 
81
77
  for (const c of nonSemanticColors.slice(1)) {
82
- rerender(<Icon icon={HomeIcon} color={c} data-testid="icon" />);
78
+ rerender(<Icon icon={TestIcon} color={c} data-testid="icon" />);
83
79
  expect(screen.getByTestId('icon')).toBeInTheDocument();
84
80
  }
85
81
  });
86
82
 
87
83
  it('renders with different size variants', () => {
88
84
  const {rerender} = render(
89
- <Icon icon={HomeIcon} size="xsm" data-testid="icon" />,
85
+ <Icon icon={TestIcon} size="xsm" data-testid="icon" />,
90
86
  );
91
87
  expect(screen.getByTestId('icon')).toBeInTheDocument();
92
88
 
93
- rerender(<Icon icon={HomeIcon} size="sm" data-testid="icon" />);
89
+ rerender(<Icon icon={TestIcon} size="sm" data-testid="icon" />);
94
90
  expect(screen.getByTestId('icon')).toBeInTheDocument();
95
91
 
96
- rerender(<Icon icon={HomeIcon} size="md" data-testid="icon" />);
92
+ rerender(<Icon icon={TestIcon} size="md" data-testid="icon" />);
97
93
  expect(screen.getByTestId('icon')).toBeInTheDocument();
98
94
 
99
- rerender(<Icon icon={HomeIcon} size="lg" data-testid="icon" />);
95
+ rerender(<Icon icon={TestIcon} size="lg" data-testid="icon" />);
100
96
  expect(screen.getByTestId('icon')).toBeInTheDocument();
101
97
  });
102
98
 
103
99
  it('forwards ref correctly', () => {
104
100
  const ref = vi.fn();
105
- render(<Icon icon={HomeIcon} ref={ref} />);
101
+ render(<Icon icon={TestIcon} ref={ref} />);
106
102
  expect(ref).toHaveBeenCalledWith(expect.any(SVGSVGElement));
107
103
  });
108
104
 
109
105
  it('passes additional SVG props', () => {
110
106
  render(
111
- <Icon
112
- icon={HomeIcon}
113
- data-testid="icon"
114
- role="img"
115
- aria-label="Home"
116
- />,
107
+ <Icon icon={TestIcon} data-testid="icon" role="img" aria-label="Home" />,
117
108
  );
118
109
  const icon = screen.getByTestId('icon');
119
110
  expect(icon).toHaveAttribute('role', 'img');
@@ -121,8 +112,29 @@ describe('Icon', () => {
121
112
  });
122
113
 
123
114
  it('uses default color and size when not specified', () => {
124
- render(<Icon icon={HomeIcon} data-testid="icon" />);
115
+ render(<Icon icon={TestIcon} data-testid="icon" />);
125
116
  // The component should render without errors with defaults
126
117
  expect(screen.getByTestId('icon')).toBeInTheDocument();
127
118
  });
119
+
120
+ it('applies aria-hidden by default in string (registry) mode', () => {
121
+ render(<Icon icon="check" data-testid="icon" />);
122
+ expect(screen.getByTestId('icon')).toHaveAttribute('aria-hidden', 'true');
123
+ });
124
+
125
+ it('lets a string-mode icon be made meaningful by overriding aria-hidden', () => {
126
+ render(
127
+ <Icon
128
+ icon="check"
129
+ data-testid="icon"
130
+ role="img"
131
+ aria-label="Done"
132
+ aria-hidden={false}
133
+ />,
134
+ );
135
+ const icon = screen.getByTestId('icon');
136
+ expect(icon).toHaveAttribute('role', 'img');
137
+ expect(icon).toHaveAttribute('aria-label', 'Done');
138
+ expect(icon).toHaveAttribute('aria-hidden', 'false');
139
+ });
128
140
  });
package/src/Icon/Icon.tsx CHANGED
@@ -281,12 +281,16 @@ function IconFromRegistry({
281
281
 
282
282
  return (
283
283
  <span
284
+ // Decorative by default, but placed BEFORE the prop spread so consumers
285
+ // can override it (e.g. `aria-hidden={false}` + `role="img"` +
286
+ // `aria-label`) to expose a meaningful standalone icon. This matches
287
+ // component-mode Icon, which already sets aria-hidden before its spread.
288
+ aria-hidden="true"
284
289
  {...(spanProps as React.HTMLAttributes<HTMLSpanElement>)}
285
290
  {...mergeProps(
286
291
  themeProps('icon', {size, color}),
287
292
  stylex.props(styles.span, colorStyles[color], spanSizeStyles[size]),
288
- )}
289
- aria-hidden="true">
293
+ )}>
290
294
  {resolvedIcon}
291
295
  </span>
292
296
  );
@@ -201,11 +201,11 @@ export function InputGroup({
201
201
  labelTooltip={labelTooltip}>
202
202
  <div
203
203
  ref={ref}
204
+ data-testid={testId}
205
+ {...rest}
204
206
  role="group"
205
207
  aria-labelledby={labelID}
206
208
  aria-describedby={describedByIDs}
207
- data-testid={testId}
208
- {...rest}
209
209
  {...mergeProps(
210
210
  themeProps('input-group', {
211
211
  size,
@@ -0,0 +1,185 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file InteractiveRoleContext.test.tsx
5
+ * @input Uses vitest, @testing-library/react, InteractiveRoleContext + useInteractiveRole
6
+ * @output Characterization tests for the interactive-role override context
7
+ * @position Testing; validates the role-override contract and its consumption
8
+ * by useInteractiveRole
9
+ *
10
+ * SYNC: When InteractiveRoleContext.ts changes, update tests to match new behavior
11
+ */
12
+
13
+ import {describe, it, expect} from 'vitest';
14
+ import {renderHook} from '@testing-library/react';
15
+ import {createElement, type ReactNode} from 'react';
16
+ import {
17
+ InteractiveRoleContext,
18
+ useInteractiveRoleContext,
19
+ } from './InteractiveRoleContext';
20
+ import {
21
+ useInteractiveRole,
22
+ type InteractiveRole,
23
+ } from '../hooks/useInteractiveRole';
24
+
25
+ /** Wrap children in an InteractiveRoleContext provider set to `role`. */
26
+ function withRole(role: InteractiveRole | null) {
27
+ return function Wrapper({children}: {children: ReactNode}) {
28
+ return (
29
+ <InteractiveRoleContext value={role}>{children}</InteractiveRoleContext>
30
+ );
31
+ };
32
+ }
33
+
34
+ describe('InteractiveRoleContext', () => {
35
+ describe('context primitive', () => {
36
+ it('defaults to null when read with no provider', () => {
37
+ const {result} = renderHook(() => useInteractiveRoleContext());
38
+ expect(result.current).toBeNull();
39
+ });
40
+
41
+ it('exposes a displayName for devtools', () => {
42
+ expect(InteractiveRoleContext.displayName).toBe('InteractiveRoleContext');
43
+ });
44
+
45
+ it('returns the provided role override', () => {
46
+ const {result} = renderHook(() => useInteractiveRoleContext(), {
47
+ wrapper: withRole('button'),
48
+ });
49
+ expect(result.current).toBe('button');
50
+ });
51
+
52
+ it('returns null when a provider explicitly supplies null', () => {
53
+ const {result} = renderHook(() => useInteractiveRoleContext(), {
54
+ wrapper: withRole(null),
55
+ });
56
+ expect(result.current).toBeNull();
57
+ });
58
+
59
+ it.each(['link', 'button', 'inert'] as const)(
60
+ 'passes through the "%s" override verbatim',
61
+ role => {
62
+ const {result} = renderHook(() => useInteractiveRoleContext(), {
63
+ wrapper: withRole(role),
64
+ });
65
+ expect(result.current).toBe(role);
66
+ },
67
+ );
68
+
69
+ it('resolves to the nearest provider when nested', () => {
70
+ function Nested({children}: {children: ReactNode}) {
71
+ return (
72
+ <InteractiveRoleContext value="link">
73
+ <InteractiveRoleContext value="button">
74
+ {children}
75
+ </InteractiveRoleContext>
76
+ </InteractiveRoleContext>
77
+ );
78
+ }
79
+ const {result} = renderHook(() => useInteractiveRoleContext(), {
80
+ wrapper: Nested,
81
+ });
82
+ expect(result.current).toBe('button');
83
+ });
84
+
85
+ it('supports the createElement (no-JSX) provider form', () => {
86
+ const {result} = renderHook(() => useInteractiveRoleContext(), {
87
+ wrapper: ({children}: {children: ReactNode}) =>
88
+ createElement(InteractiveRoleContext, {value: 'button'}, children),
89
+ });
90
+ expect(result.current).toBe('button');
91
+ });
92
+ });
93
+
94
+ // useInteractiveRole is the real consumer of this context; these tests pin
95
+ // down how the context signal participates in the role-resolution priority.
96
+ describe('consumption via useInteractiveRole', () => {
97
+ it('href alone resolves to "link"', () => {
98
+ const {result} = renderHook(() =>
99
+ useInteractiveRole({href: '/somewhere'}),
100
+ );
101
+ expect(result.current).toBe('link');
102
+ });
103
+
104
+ it('onClick alone resolves to "button"', () => {
105
+ const {result} = renderHook(() =>
106
+ useInteractiveRole({onClick: () => {}}),
107
+ );
108
+ expect(result.current).toBe('button');
109
+ });
110
+
111
+ it('nothing interactive resolves to "inert"', () => {
112
+ const {result} = renderHook(() => useInteractiveRole({}));
113
+ expect(result.current).toBe('inert');
114
+ });
115
+
116
+ it('context override is used when neither href nor onClick is set', () => {
117
+ const {result} = renderHook(() => useInteractiveRole({}), {
118
+ wrapper: withRole('button'),
119
+ });
120
+ expect(result.current).toBe('button');
121
+ });
122
+
123
+ it('href wins over a context override (navigation has top priority)', () => {
124
+ const {result} = renderHook(() => useInteractiveRole({href: '/x'}), {
125
+ wrapper: withRole('button'),
126
+ });
127
+ expect(result.current).toBe('link');
128
+ });
129
+
130
+ it('onClick wins over a context override', () => {
131
+ const {result} = renderHook(
132
+ () => useInteractiveRole({onClick: () => {}}),
133
+ {wrapper: withRole('link')},
134
+ );
135
+ expect(result.current).toBe('button');
136
+ });
137
+
138
+ // NOTE — documents current behavior. The `isDisabled` JSDoc says a disabled
139
+ // href "falls back to button", but the implementation only *skips* the link
140
+ // branch when disabled — it does not force a button. With no onClick and no
141
+ // context override, a disabled href therefore resolves to "inert", not
142
+ // "button". (The doc-promised "button" fallback only holds when an onClick
143
+ // or a context override is also present — see the two tests below.)
144
+ it('a disabled href with nothing else resolves to "inert" (not "button" as the JSDoc implies)', () => {
145
+ const {result} = renderHook(() =>
146
+ useInteractiveRole({href: '/x', isDisabled: true}),
147
+ );
148
+ expect(result.current).toBe('inert');
149
+ });
150
+
151
+ it('a disabled href with an onClick resolves to "button" via the onClick branch', () => {
152
+ const {result} = renderHook(() =>
153
+ useInteractiveRole({href: '/x', isDisabled: true, onClick: () => {}}),
154
+ );
155
+ expect(result.current).toBe('button');
156
+ });
157
+
158
+ it('a disabled href with a context override falls through to that override', () => {
159
+ const {result} = renderHook(
160
+ () => useInteractiveRole({href: '/x', isDisabled: true}),
161
+ {wrapper: withRole('button')},
162
+ );
163
+ expect(result.current).toBe('button');
164
+ });
165
+
166
+ it('an "inert" context override is honored when nothing else is interactive', () => {
167
+ const {result} = renderHook(() => useInteractiveRole({}), {
168
+ wrapper: withRole('inert'),
169
+ });
170
+ expect(result.current).toBe('inert');
171
+ });
172
+
173
+ it('a null onClick is treated as absent (falls through to inert)', () => {
174
+ const {result} = renderHook(() => useInteractiveRole({onClick: null}));
175
+ expect(result.current).toBe('inert');
176
+ });
177
+
178
+ it('a null onClick still yields to a context override', () => {
179
+ const {result} = renderHook(() => useInteractiveRole({onClick: null}), {
180
+ wrapper: withRole('button'),
181
+ });
182
+ expect(result.current).toBe('button');
183
+ });
184
+ });
185
+ });
package/src/Item/Item.tsx CHANGED
@@ -470,9 +470,9 @@ export function Item({
470
470
  return (
471
471
  <Component
472
472
  ref={ref as React.Ref<never>}
473
+ {...restProps}
473
474
  aria-selected={isSelected || undefined}
474
475
  aria-disabled={isDisabled || undefined}
475
- {...restProps}
476
476
  {...mergeProps(
477
477
  themeProps('item', {density, align}),
478
478
  stylex.props(
@@ -0,0 +1,285 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Layout.test.tsx
5
+ * @input Uses vitest, @testing-library/react, Layout + layout contexts
6
+ * @output Characterization tests for the Layout page-shell component
7
+ * @position Testing; validates slot rendering, context provisioning, and
8
+ * divider/padding/height wiring
9
+ *
10
+ * SYNC: When Layout.tsx changes, update tests to match new behavior
11
+ */
12
+
13
+ import {describe, it, expect} from 'vitest';
14
+ import {render, screen} from '@testing-library/react';
15
+ import {use, createRef} from 'react';
16
+ import {Layout} from './Layout';
17
+ import {LayoutHeader} from './LayoutHeader';
18
+ import {LayoutFooter} from './LayoutFooter';
19
+ import {LayoutAreaContext} from './LayoutAreaContext';
20
+ import {LayoutSlotsContext} from './LayoutSlotsContext';
21
+
22
+ /** Reports which layout area it is rendered inside. */
23
+ function AreaProbe({testid}: {testid: string}) {
24
+ const area = use(LayoutAreaContext);
25
+ return <span data-testid={testid}>{String(area)}</span>;
26
+ }
27
+
28
+ /** Reports the current LayoutSlots record as JSON. */
29
+ function SlotsProbe() {
30
+ const slots = use(LayoutSlotsContext);
31
+ return <span data-testid="slots">{JSON.stringify(slots)}</span>;
32
+ }
33
+
34
+ /** The Layout root is the outermost element rendered by the component. */
35
+ function root(container: HTMLElement): HTMLElement {
36
+ return container.firstElementChild as HTMLElement;
37
+ }
38
+
39
+ describe('Layout', () => {
40
+ describe('content / children resolution', () => {
41
+ it('renders the content prop', () => {
42
+ render(<Layout content={<div>main body</div>} />);
43
+ expect(screen.getByText('main body')).toBeInTheDocument();
44
+ });
45
+
46
+ it('renders children as a shorthand for the content slot', () => {
47
+ render(
48
+ <Layout>
49
+ <div>child body</div>
50
+ </Layout>,
51
+ );
52
+ expect(screen.getByText('child body')).toBeInTheDocument();
53
+ });
54
+
55
+ it('content wins when both content and children are provided', () => {
56
+ render(
57
+ <Layout content={<div>from-content</div>}>
58
+ <div>from-children</div>
59
+ </Layout>,
60
+ );
61
+ expect(screen.getByText('from-content')).toBeInTheDocument();
62
+ expect(screen.queryByText('from-children')).not.toBeInTheDocument();
63
+ });
64
+
65
+ it('renders an empty shell without crashing when no slots are given', () => {
66
+ const {container} = render(<Layout />);
67
+ expect(root(container)).toBeInTheDocument();
68
+ });
69
+ });
70
+
71
+ describe('slots', () => {
72
+ it('renders all four surrounding slots plus content', () => {
73
+ render(
74
+ <Layout
75
+ header={<div>the-header</div>}
76
+ start={<div>the-start</div>}
77
+ end={<div>the-end</div>}
78
+ footer={<div>the-footer</div>}
79
+ content={<div>the-content</div>}
80
+ />,
81
+ );
82
+ expect(screen.getByText('the-header')).toBeInTheDocument();
83
+ expect(screen.getByText('the-start')).toBeInTheDocument();
84
+ expect(screen.getByText('the-end')).toBeInTheDocument();
85
+ expect(screen.getByText('the-footer')).toBeInTheDocument();
86
+ expect(screen.getByText('the-content')).toBeInTheDocument();
87
+ });
88
+
89
+ it('does not render an area wrapper for an omitted slot', () => {
90
+ render(<Layout content={<AreaProbe testid="content" />} />);
91
+ // Only the content probe exists; header/start/end/footer probes absent.
92
+ expect(screen.getByTestId('content')).toHaveTextContent('content');
93
+ });
94
+ });
95
+
96
+ describe('LayoutAreaContext provisioning', () => {
97
+ it('tags each slot with its area name', () => {
98
+ render(
99
+ <Layout
100
+ header={<AreaProbe testid="h" />}
101
+ start={<AreaProbe testid="s" />}
102
+ end={<AreaProbe testid="e" />}
103
+ footer={<AreaProbe testid="f" />}
104
+ content={<AreaProbe testid="c" />}
105
+ />,
106
+ );
107
+ expect(screen.getByTestId('h')).toHaveTextContent('header');
108
+ expect(screen.getByTestId('s')).toHaveTextContent('start');
109
+ expect(screen.getByTestId('e')).toHaveTextContent('end');
110
+ expect(screen.getByTestId('f')).toHaveTextContent('footer');
111
+ expect(screen.getByTestId('c')).toHaveTextContent('content');
112
+ });
113
+ });
114
+
115
+ describe('LayoutSlotsContext provisioning', () => {
116
+ it('reports which slots are filled to descendants', () => {
117
+ render(
118
+ <Layout
119
+ header={<div>h</div>}
120
+ start={<div>s</div>}
121
+ content={<SlotsProbe />}
122
+ />,
123
+ );
124
+ const slots = JSON.parse(screen.getByTestId('slots').textContent ?? '{}');
125
+ expect(slots).toEqual({
126
+ hasHeader: true,
127
+ hasFooter: false,
128
+ hasStart: true,
129
+ hasEnd: false,
130
+ });
131
+ });
132
+
133
+ it('reports all-false when only content is present', () => {
134
+ render(<Layout content={<SlotsProbe />} />);
135
+ const slots = JSON.parse(screen.getByTestId('slots').textContent ?? '{}');
136
+ expect(slots).toEqual({
137
+ hasHeader: false,
138
+ hasFooter: false,
139
+ hasStart: false,
140
+ hasEnd: false,
141
+ });
142
+ });
143
+
144
+ it('reports every slot filled', () => {
145
+ render(
146
+ <Layout
147
+ header={<div>h</div>}
148
+ footer={<div>f</div>}
149
+ start={<div>s</div>}
150
+ end={<div>e</div>}
151
+ content={<SlotsProbe />}
152
+ />,
153
+ );
154
+ const slots = JSON.parse(screen.getByTestId('slots').textContent ?? '{}');
155
+ expect(slots).toEqual({
156
+ hasHeader: true,
157
+ hasFooter: true,
158
+ hasStart: true,
159
+ hasEnd: true,
160
+ });
161
+ });
162
+ });
163
+
164
+ describe('theme props (class + data attributes)', () => {
165
+ it('renders the astryx-layout class on the root', () => {
166
+ const {container} = render(<Layout content={<div>x</div>} />);
167
+ expect(root(container).className).toContain('astryx-layout');
168
+ });
169
+
170
+ it('defaults data-height to "fill"', () => {
171
+ const {container} = render(<Layout content={<div>x</div>} />);
172
+ expect(root(container).getAttribute('data-height')).toBe('fill');
173
+ });
174
+
175
+ it('reflects height="auto" as data-height', () => {
176
+ const {container} = render(
177
+ <Layout height="auto" content={<div>x</div>} />,
178
+ );
179
+ expect(root(container).getAttribute('data-height')).toBe('auto');
180
+ });
181
+ });
182
+
183
+ describe('defaultHasDividers → LayoutDividerContext', () => {
184
+ it('makes headers default to having a divider', () => {
185
+ render(
186
+ <Layout
187
+ defaultHasDividers
188
+ header={<LayoutHeader>H</LayoutHeader>}
189
+ content={<div>c</div>}
190
+ />,
191
+ );
192
+ const header = screen.getByText('H').closest('[data-divider]');
193
+ expect(header).not.toBeNull();
194
+ expect(header?.getAttribute('data-divider')).toBe('true');
195
+ });
196
+
197
+ it('makes footers default to having a divider', () => {
198
+ const {container} = render(
199
+ <Layout
200
+ defaultHasDividers
201
+ footer={<LayoutFooter>F</LayoutFooter>}
202
+ content={<div>c</div>}
203
+ />,
204
+ );
205
+ expect(
206
+ container.querySelector('.astryx-layout-footer[data-divider]'),
207
+ ).not.toBeNull();
208
+ });
209
+
210
+ it('does not force dividers when defaultHasDividers is unset', () => {
211
+ const {container} = render(
212
+ <Layout
213
+ header={<LayoutHeader>H</LayoutHeader>}
214
+ content={<div>c</div>}
215
+ />,
216
+ );
217
+ expect(
218
+ container.querySelector('.astryx-layout-header[data-divider]'),
219
+ ).toBeNull();
220
+ });
221
+
222
+ it('an explicit hasDivider={false} on a header overrides the context default', () => {
223
+ const {container} = render(
224
+ <Layout
225
+ defaultHasDividers
226
+ header={<LayoutHeader hasDivider={false}>H</LayoutHeader>}
227
+ content={<div>c</div>}
228
+ />,
229
+ );
230
+ expect(
231
+ container.querySelector('.astryx-layout-header[data-divider]'),
232
+ ).toBeNull();
233
+ });
234
+ });
235
+
236
+ describe('padding / contentWidth', () => {
237
+ it('accepts a numeric padding step without crashing', () => {
238
+ const {container} = render(<Layout padding={4} content={<div>c</div>} />);
239
+ expect(root(container)).toBeInTheDocument();
240
+ });
241
+
242
+ it('accepts padding={0} (full bleed) without crashing', () => {
243
+ const {container} = render(<Layout padding={0} content={<div>c</div>} />);
244
+ expect(root(container)).toBeInTheDocument();
245
+ });
246
+
247
+ it('accepts a numeric contentWidth without crashing', () => {
248
+ const {container} = render(
249
+ <Layout contentWidth={640} content={<div>c</div>} />,
250
+ );
251
+ expect(root(container)).toBeInTheDocument();
252
+ });
253
+
254
+ it('accepts a string contentWidth without crashing', () => {
255
+ const {container} = render(
256
+ <Layout contentWidth="60ch" content={<div>c</div>} />,
257
+ );
258
+ expect(root(container)).toBeInTheDocument();
259
+ });
260
+ });
261
+
262
+ describe('styling & ref', () => {
263
+ it('forwards ref to the root div', () => {
264
+ const ref = createRef<HTMLDivElement>();
265
+ render(<Layout ref={ref} content={<div>c</div>} />);
266
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
267
+ expect(ref.current?.className).toContain('astryx-layout');
268
+ });
269
+
270
+ it('merges a caller className onto the root', () => {
271
+ const {container} = render(
272
+ <Layout className="my-layout" content={<div>c</div>} />,
273
+ );
274
+ expect(root(container).className).toContain('my-layout');
275
+ expect(root(container).className).toContain('astryx-layout');
276
+ });
277
+
278
+ it('merges a caller inline style onto the root', () => {
279
+ const {container} = render(
280
+ <Layout style={{outline: '1px solid red'}} content={<div>c</div>} />,
281
+ );
282
+ expect(root(container).style.outline).toBe('1px solid red');
283
+ });
284
+ });
285
+ });