@astryxdesign/core 0.1.4-canary.fd7ab46 → 0.1.4

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 (579) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +18 -20
  4. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
  5. package/dist/AppShell/AppShell.d.ts +1 -1
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +53 -55
  8. package/dist/AspectRatio/AspectRatio.d.ts +10 -48
  9. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js +12 -33
  11. package/dist/AspectRatio/index.d.ts +1 -1
  12. package/dist/AspectRatio/index.d.ts.map +1 -1
  13. package/dist/Avatar/Avatar.d.ts.map +1 -1
  14. package/dist/Avatar/Avatar.js +25 -27
  15. package/dist/Avatar/AvatarStatusDot.js +5 -5
  16. package/dist/AvatarGroup/AvatarGroup.js +5 -5
  17. package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
  18. package/dist/Badge/Badge.js +3 -3
  19. package/dist/Banner/Banner.d.ts.map +1 -1
  20. package/dist/Banner/Banner.js +25 -32
  21. package/dist/Blockquote/Blockquote.js +7 -7
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  23. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  24. package/dist/Button/Button.js +19 -19
  25. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  26. package/dist/Calendar/Calendar.d.ts.map +1 -1
  27. package/dist/Calendar/Calendar.js +48 -68
  28. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  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 +2 -4
  33. package/dist/Card/Card.d.ts.map +1 -1
  34. package/dist/Card/Card.js +10 -18
  35. package/dist/Carousel/Carousel.d.ts.map +1 -1
  36. package/dist/Carousel/Carousel.js +21 -24
  37. package/dist/Carousel/carousel.markers.stylex.d.ts +7 -0
  38. package/dist/Carousel/carousel.markers.stylex.d.ts.map +1 -0
  39. package/dist/Carousel/carousel.markers.stylex.js +12 -0
  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 +15 -27
  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 +11 -13
  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 +10 -12
  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 +12 -14
  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 +15 -24
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +74 -81
  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 +23 -25
  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 +6 -8
  80. package/dist/Citation/Citation.js +10 -10
  81. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  82. package/dist/ClickableCard/ClickableCard.js +9 -32
  83. package/dist/Code/Code.js +3 -3
  84. package/dist/CodeBlock/CodeBlock.d.ts +1 -10
  85. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  86. package/dist/CodeBlock/CodeBlock.js +52 -88
  87. package/dist/Collapsible/Collapsible.d.ts +3 -9
  88. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  89. package/dist/Collapsible/Collapsible.js +22 -110
  90. package/dist/Collapsible/CollapsibleGroup.d.ts +7 -39
  91. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  92. package/dist/Collapsible/CollapsibleGroup.js +12 -73
  93. package/dist/Collapsible/CollapsibleGroupContext.d.ts +0 -31
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  95. package/dist/Collapsible/CollapsibleGroupContext.js +3 -33
  96. package/dist/Collapsible/index.d.ts +0 -1
  97. package/dist/Collapsible/index.d.ts.map +1 -1
  98. package/dist/Collapsible/useCollapsible.d.ts +1 -4
  99. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  100. package/dist/Collapsible/useCollapsible.js +6 -20
  101. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  102. package/dist/CommandPalette/CommandPalette.js +34 -36
  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 +2 -7
  110. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  111. package/dist/ContextMenu/ContextMenu.js +43 -76
  112. package/dist/DateInput/DateInput.js +18 -18
  113. package/dist/DateRangeInput/DateRangeInput.js +21 -21
  114. package/dist/DateTimeInput/DateTimeInput.d.ts +2 -5
  115. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  116. package/dist/DateTimeInput/DateTimeInput.js +26 -30
  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 +17 -2
  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 +3 -4
  136. package/dist/Grid/Grid.d.ts.map +1 -1
  137. package/dist/Grid/Grid.js +12 -29
  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 +1 -5
  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 +12 -16
  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 +2 -29
  155. package/dist/Layer/useLayer.d.ts.map +1 -1
  156. package/dist/Layer/useLayer.js +31 -44
  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 +31 -55
  164. package/dist/Lightbox/useLightbox.js +3 -3
  165. package/dist/Link/Link.js +15 -15
  166. package/dist/Link/LinkProvider.js +3 -3
  167. package/dist/Link/useLinkify.js +3 -3
  168. package/dist/List/List.js +11 -11
  169. package/dist/List/ListItem.js +11 -11
  170. package/dist/Markdown/Markdown.d.ts.map +1 -1
  171. package/dist/Markdown/Markdown.js +102 -102
  172. package/dist/MetadataList/MetadataList.js +10 -10
  173. package/dist/MetadataList/MetadataListItem.js +15 -15
  174. package/dist/MobileNav/MobileNav.js +15 -15
  175. package/dist/MobileNav/MobileNavToggle.js +5 -5
  176. package/dist/MoreMenu/MoreMenu.js +3 -3
  177. package/dist/MultiSelector/MultiSelector.js +56 -56
  178. package/dist/NavIcon/NavIcon.js +3 -3
  179. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  180. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +32 -48
  183. package/dist/Outline/Outline.js +15 -15
  184. package/dist/OverflowList/OverflowList.js +8 -8
  185. package/dist/Overlay/Overlay.js +3 -3
  186. package/dist/Overlay/OverlayScrim.js +5 -5
  187. package/dist/Overlay/useOverlay.js +3 -3
  188. package/dist/Pagination/Pagination.d.ts +1 -1
  189. package/dist/Pagination/Pagination.d.ts.map +1 -1
  190. package/dist/Pagination/Pagination.js +72 -125
  191. package/dist/Popover/Popover.js +16 -16
  192. package/dist/Popover/usePopover.js +7 -7
  193. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  194. package/dist/PowerSearch/PowerSearch.js +92 -110
  195. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  196. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  197. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  198. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  199. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  200. package/dist/ProgressBar/ProgressBar.js +18 -25
  201. package/dist/RadioList/RadioList.js +7 -7
  202. package/dist/RadioList/RadioListItem.d.ts +1 -1
  203. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  204. package/dist/RadioList/RadioListItem.js +21 -24
  205. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  206. package/dist/Resizable/ResizeHandle.js +10 -28
  207. package/dist/Section/Section.js +5 -5
  208. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  209. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  210. package/dist/SegmentedControl/SegmentedControl.js +10 -32
  211. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  212. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  213. package/dist/SegmentedControl/SegmentedControlItem.js +12 -18
  214. package/dist/SelectableCard/SelectableCard.js +5 -5
  215. package/dist/Selector/Selector.js +46 -46
  216. package/dist/Selector/SelectorOption.js +3 -3
  217. package/dist/SideNav/SideNav.d.ts.map +1 -1
  218. package/dist/SideNav/SideNav.js +34 -38
  219. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  220. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  221. package/dist/SideNav/SideNavCollapseButton.js +6 -8
  222. package/dist/SideNav/SideNavHeading.js +87 -87
  223. package/dist/SideNav/SideNavItem.js +42 -42
  224. package/dist/SideNav/SideNavSection.d.ts +1 -1
  225. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  226. package/dist/SideNav/SideNavSection.js +16 -18
  227. package/dist/Skeleton/Skeleton.js +3 -3
  228. package/dist/Slider/Slider.js +23 -23
  229. package/dist/Spinner/Spinner.js +9 -9
  230. package/dist/StatusDot/StatusDot.js +5 -5
  231. package/dist/Switch/Switch.d.ts +4 -8
  232. package/dist/Switch/Switch.d.ts.map +1 -1
  233. package/dist/Switch/Switch.js +29 -34
  234. package/dist/TabList/Tab.js +18 -18
  235. package/dist/TabList/TabList.js +5 -5
  236. package/dist/TabList/TabMenu.d.ts.map +1 -1
  237. package/dist/TabList/TabMenu.js +30 -57
  238. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  239. package/dist/Table/BaseTable.d.ts.map +1 -1
  240. package/dist/Table/BaseTable.js +39 -50
  241. package/dist/Table/Table.js +7 -7
  242. package/dist/Table/TableBody.d.ts +1 -1
  243. package/dist/Table/TableBody.d.ts.map +1 -1
  244. package/dist/Table/TableBody.js +5 -9
  245. package/dist/Table/TableCell.js +3 -3
  246. package/dist/Table/TableFooter.d.ts +1 -1
  247. package/dist/Table/TableFooter.d.ts.map +1 -1
  248. package/dist/Table/TableFooter.js +5 -9
  249. package/dist/Table/TableHeader.d.ts +1 -1
  250. package/dist/Table/TableHeader.d.ts.map +1 -1
  251. package/dist/Table/TableHeader.js +5 -9
  252. package/dist/Table/TableHeaderCell.js +3 -3
  253. package/dist/Table/TableRow.js +5 -5
  254. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  255. package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -14
  256. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  257. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  258. package/dist/Table/plugins/pagination/paginateData.js +1 -5
  259. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  260. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +22 -22
  261. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  262. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  263. package/dist/Table/plugins/selection/useTableSelectionState.js +1 -11
  264. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  265. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  266. package/dist/Table/plugins/sortable/useTableSortableState.js +4 -8
  267. package/dist/Table/tableContextMenu.js +9 -9
  268. package/dist/Text/Text.js +10 -10
  269. package/dist/TextArea/TextArea.js +14 -14
  270. package/dist/TextInput/TextInput.js +15 -15
  271. package/dist/Thumbnail/Thumbnail.d.ts +2 -3
  272. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  273. package/dist/Thumbnail/Thumbnail.js +29 -30
  274. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  275. package/dist/TimeInput/TimeInput.js +21 -26
  276. package/dist/Timestamp/Timestamp.d.ts +1 -1
  277. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  278. package/dist/Timestamp/Timestamp.js +26 -37
  279. package/dist/Toast/Toast.d.ts.map +1 -1
  280. package/dist/Toast/Toast.js +17 -25
  281. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  282. package/dist/Toast/ToastViewport.js +11 -23
  283. package/dist/Toast/useToast.js +4 -4
  284. package/dist/ToggleButton/ToggleButton.js +12 -12
  285. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  286. package/dist/Token/Token.js +21 -21
  287. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  288. package/dist/Tokenizer/Tokenizer.js +34 -36
  289. package/dist/Toolbar/Toolbar.js +18 -18
  290. package/dist/Tooltip/Tooltip.js +11 -11
  291. package/dist/Tooltip/useTooltip.d.ts +1 -5
  292. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  293. package/dist/Tooltip/useTooltip.js +3 -3
  294. package/dist/TopNav/TopNav.js +32 -32
  295. package/dist/TopNav/TopNavHeading.js +67 -67
  296. package/dist/TopNav/TopNavItem.js +5 -5
  297. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  298. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  299. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  300. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +14 -25
  301. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  302. package/dist/TopNav/TopNavMenu.js +32 -32
  303. package/dist/TreeList/TreeList.js +8 -8
  304. package/dist/TreeList/TreeListBranches.js +11 -11
  305. package/dist/TreeList/TreeListItem.js +30 -30
  306. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  307. package/dist/Typeahead/BaseTypeahead.js +20 -23
  308. package/dist/Typeahead/Typeahead.js +12 -12
  309. package/dist/Typeahead/TypeaheadItem.js +10 -10
  310. package/dist/VStack/VStack.js +3 -3
  311. package/dist/astryx.css +0 -7
  312. package/dist/astryx.umd.js +60 -60
  313. package/dist/astryx.umd.js.map +4 -4
  314. package/dist/docs-types.d.ts +2 -8
  315. package/dist/docs-types.d.ts.map +1 -1
  316. package/dist/hooks/focusableSelector.d.ts +1 -1
  317. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  318. package/dist/hooks/focusableSelector.js +1 -1
  319. package/dist/hooks/index.d.ts +0 -2
  320. package/dist/hooks/index.d.ts.map +1 -1
  321. package/dist/hooks/index.js +0 -1
  322. package/dist/hooks/useFocusTrap.d.ts +0 -3
  323. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  324. package/dist/hooks/useFocusTrap.js +1 -38
  325. package/dist/hooks/useInteractiveRole.d.ts +2 -6
  326. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  327. package/dist/hooks/useInteractiveRole.js +2 -6
  328. package/dist/hooks/useKeyboardHint.js +9 -9
  329. package/dist/hooks/useStreamingText.d.ts +1 -3
  330. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  331. package/dist/hooks/useStreamingText.js +5 -14
  332. package/dist/theme/MediaTheme.js +3 -3
  333. package/dist/theme/Theme.js +7 -7
  334. package/dist/theme/defineTheme.d.ts +1 -1
  335. package/dist/theme/defineTheme.d.ts.map +1 -1
  336. package/dist/theme/expandColorScale.d.ts.map +1 -1
  337. package/dist/theme/expandColorScale.js +3 -10
  338. package/dist/theme/hct.d.ts +15 -0
  339. package/dist/theme/hct.d.ts.map +1 -1
  340. package/dist/theme/hct.js +9 -9
  341. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  342. package/dist/theme/tokens.d.ts +2 -10
  343. package/dist/theme/tokens.d.ts.map +1 -1
  344. package/dist/theme/tokens.js +4 -220
  345. package/dist/utils/index.d.ts +0 -3
  346. package/dist/utils/index.d.ts.map +1 -1
  347. package/dist/utils/index.js +1 -3
  348. package/dist/utils/timeParser.d.ts.map +1 -1
  349. package/dist/utils/timeParser.js +5 -8
  350. package/package.json +3 -3
  351. package/src/AlertDialog/AlertDialog.doc.mjs +0 -4
  352. package/src/AlertDialog/AlertDialog.tsx +0 -2
  353. package/src/AppShell/AppShell.tsx +0 -2
  354. package/src/AspectRatio/AspectRatio.doc.mjs +1 -28
  355. package/src/AspectRatio/AspectRatio.test.tsx +1 -142
  356. package/src/AspectRatio/AspectRatio.tsx +10 -70
  357. package/src/AspectRatio/index.ts +1 -5
  358. package/src/Avatar/Avatar.doc.mjs +0 -11
  359. package/src/Avatar/Avatar.test.tsx +1 -32
  360. package/src/Avatar/Avatar.tsx +20 -12
  361. package/src/Banner/Banner.doc.mjs +0 -8
  362. package/src/Banner/Banner.test.tsx +0 -38
  363. package/src/Banner/Banner.tsx +1 -8
  364. package/src/Calendar/Calendar.doc.mjs +1 -1
  365. package/src/Calendar/Calendar.test.tsx +17 -122
  366. package/src/Calendar/Calendar.tsx +5 -26
  367. package/src/Calendar/dayCellUtils.ts +1 -3
  368. package/src/Calendar/styles.ts +2 -12
  369. package/src/Card/Card.tsx +6 -16
  370. package/src/Carousel/Carousel.doc.mjs +12 -12
  371. package/src/Carousel/Carousel.test.tsx +0 -13
  372. package/src/Carousel/Carousel.tsx +2 -4
  373. package/src/Carousel/carousel.markers.stylex.ts +10 -0
  374. package/src/Chat/Chat.doc.mjs +1 -1
  375. package/src/Chat/ChatComposerInput.test.tsx +1 -27
  376. package/src/Chat/ChatComposerInput.tsx +15 -20
  377. package/src/Chat/ChatDictationButton.tsx +4 -4
  378. package/src/Chat/ChatLayoutScrollButton.tsx +1 -3
  379. package/src/Chat/ChatMessageMetadata.tsx +6 -4
  380. package/src/Chat/ChatSystemMessage.test.tsx +11 -26
  381. package/src/Chat/ChatSystemMessage.tsx +7 -7
  382. package/src/Chat/ChatTokenizedText.test.tsx +16 -29
  383. package/src/Chat/ChatTokenizedText.tsx +8 -15
  384. package/src/Chat/ChatToolCalls.test.tsx +0 -55
  385. package/src/Chat/ChatToolCalls.tsx +12 -10
  386. package/src/Chat/index.ts +4 -1
  387. package/src/Chat/useTriggerMenu.tsx +4 -1
  388. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
  389. package/src/CheckboxInput/CheckboxInput.test.tsx +4 -71
  390. package/src/CheckboxInput/CheckboxInput.tsx +0 -2
  391. package/src/CheckboxList/CheckboxList.test.tsx +0 -19
  392. package/src/CheckboxList/CheckboxListItem.tsx +2 -11
  393. package/src/Citation/Citation.doc.mjs +0 -5
  394. package/src/ClickableCard/ClickableCard.tsx +2 -45
  395. package/src/CodeBlock/CodeBlock.doc.mjs +2 -7
  396. package/src/CodeBlock/CodeBlock.test.tsx +3 -122
  397. package/src/CodeBlock/CodeBlock.tsx +4 -62
  398. package/src/Collapsible/Collapsible.doc.mjs +4 -8
  399. package/src/Collapsible/Collapsible.tsx +10 -86
  400. package/src/Collapsible/CollapsibleGroup.doc.mjs +3 -27
  401. package/src/Collapsible/CollapsibleGroup.test.tsx +0 -318
  402. package/src/Collapsible/CollapsibleGroup.tsx +9 -107
  403. package/src/Collapsible/CollapsibleGroupContext.tsx +2 -42
  404. package/src/Collapsible/index.ts +0 -4
  405. package/src/Collapsible/useCollapsible.ts +6 -20
  406. package/src/CommandPalette/CommandPalette.doc.mjs +0 -4
  407. package/src/CommandPalette/CommandPalette.tsx +3 -5
  408. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +0 -5
  409. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +0 -10
  410. package/src/CommandPalette/CommandPaletteInput.doc.mjs +0 -6
  411. package/src/CommandPalette/CommandPaletteItem.doc.mjs +0 -6
  412. package/src/CommandPalette/CommandPaletteList.doc.mjs +0 -9
  413. package/src/ContextMenu/ContextMenu.doc.mjs +0 -15
  414. package/src/ContextMenu/ContextMenu.test.tsx +0 -87
  415. package/src/ContextMenu/ContextMenu.tsx +28 -87
  416. package/src/ContextMenu/ContextMenuItem.doc.mjs +0 -6
  417. package/src/DateInput/DateInput.test.tsx +20 -11
  418. package/src/DateRangeInput/DateRangeInput.test.tsx +44 -31
  419. package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -3
  420. package/src/DateTimeInput/DateTimeInput.test.tsx +16 -118
  421. package/src/DateTimeInput/DateTimeInput.tsx +2 -8
  422. package/src/DateTimeInput/index.ts +0 -1
  423. package/src/Dialog/Dialog.doc.mjs +0 -4
  424. package/src/Dialog/DialogHeader.doc.mjs +0 -45
  425. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  426. package/src/DropdownMenu/DropdownMenu.test.tsx +2 -22
  427. package/src/DropdownMenu/DropdownMenuItem.tsx +17 -5
  428. package/src/Field/Field.test.tsx +4 -1
  429. package/src/Field/FieldLabel.test.tsx +2 -2
  430. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +3 -0
  431. package/src/Grid/Grid.test.tsx +18 -43
  432. package/src/Grid/Grid.tsx +9 -26
  433. package/src/HoverCard/HoverCard.doc.mjs +6 -6
  434. package/src/HoverCard/useHoverCard.doc.mjs +5 -5
  435. package/src/HoverCard/useHoverCard.tsx +2 -9
  436. package/src/Icon/Icon.test.tsx +29 -41
  437. package/src/Icon/Icon.tsx +2 -6
  438. package/src/InputGroup/InputGroup.tsx +2 -2
  439. package/src/Item/Item.tsx +1 -1
  440. package/src/Layer/useLayer.doc.mjs +2 -2
  441. package/src/Layer/useLayer.test.tsx +2 -221
  442. package/src/Layer/useLayer.tsx +30 -69
  443. package/src/Layout/LayoutContent.doc.mjs +0 -12
  444. package/src/Layout/LayoutPanel.doc.mjs +0 -40
  445. package/src/Lightbox/Lightbox.doc.mjs +0 -5
  446. package/src/Lightbox/Lightbox.test.tsx +2 -123
  447. package/src/Lightbox/Lightbox.tsx +1 -29
  448. package/src/Markdown/Markdown.tsx +7 -9
  449. package/src/Markdown/parser.perf.test.ts +12 -34
  450. package/src/NavMenu/NavMenu.doc.mjs +0 -15
  451. package/src/NumberInput/NumberInput.test.tsx +3 -48
  452. package/src/NumberInput/NumberInput.tsx +15 -32
  453. package/src/Overlay/Overlay.doc.mjs +0 -6
  454. package/src/Pagination/Pagination.test.tsx +0 -162
  455. package/src/Pagination/Pagination.tsx +26 -80
  456. package/src/Popover/Popover.doc.mjs +6 -6
  457. package/src/Popover/Popover.test.tsx +0 -65
  458. package/src/Popover/usePopover.doc.mjs +1 -1
  459. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  460. package/src/PowerSearch/PowerSearch.test.tsx +1 -109
  461. package/src/PowerSearch/PowerSearch.tsx +16 -37
  462. package/src/ProgressBar/ProgressBar.test.tsx +0 -30
  463. package/src/ProgressBar/ProgressBar.tsx +5 -12
  464. package/src/RadioList/RadioList.test.tsx +0 -19
  465. package/src/RadioList/RadioListItem.tsx +4 -9
  466. package/src/Resizable/ResizeHandle.tsx +4 -22
  467. package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
  468. package/src/SegmentedControl/SegmentedControl.test.tsx +0 -192
  469. package/src/SegmentedControl/SegmentedControl.tsx +5 -27
  470. package/src/SegmentedControl/SegmentedControlItem.tsx +4 -9
  471. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  472. package/src/Selector/Selector.test.tsx +1 -27
  473. package/src/SideNav/SideNav.doc.mjs +1 -7
  474. package/src/SideNav/SideNav.test.tsx +0 -66
  475. package/src/SideNav/SideNav.tsx +2 -6
  476. package/src/SideNav/SideNavCollapseButton.tsx +3 -4
  477. package/src/SideNav/SideNavSection.tsx +4 -6
  478. package/src/Switch/Switch.doc.mjs +7 -7
  479. package/src/Switch/Switch.test.tsx +3 -102
  480. package/src/Switch/Switch.tsx +7 -20
  481. package/src/TabList/TabList.test.tsx +1 -185
  482. package/src/TabList/TabMenu.tsx +9 -45
  483. package/src/Table/BaseTable.tsx +2 -13
  484. package/src/Table/Table.test.tsx +0 -87
  485. package/src/Table/TableBody.tsx +2 -15
  486. package/src/Table/TableFooter.tsx +2 -15
  487. package/src/Table/TableHeader.tsx +2 -15
  488. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +0 -13
  489. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -3
  490. package/src/Table/plugins/pagination/paginateData.ts +1 -5
  491. package/src/Table/plugins/pagination/useTablePagination.test.tsx +0 -13
  492. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +0 -23
  493. package/src/Table/plugins/selection/useTableSelectionState.tsx +6 -11
  494. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +1 -35
  495. package/src/Table/plugins/sortable/useTableSortableState.tsx +4 -8
  496. package/src/TextArea/TextArea.test.tsx +3 -3
  497. package/src/TextInput/TextInput.test.tsx +3 -3
  498. package/src/Thumbnail/Thumbnail.test.tsx +2 -36
  499. package/src/Thumbnail/Thumbnail.tsx +2 -4
  500. package/src/TimeInput/TimeInput.test.tsx +0 -37
  501. package/src/TimeInput/TimeInput.tsx +1 -11
  502. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  503. package/src/Timestamp/Timestamp.test.tsx +0 -52
  504. package/src/Timestamp/Timestamp.tsx +16 -30
  505. package/src/Toast/Toast.tsx +3 -11
  506. package/src/Toast/ToastViewport.test.tsx +0 -64
  507. package/src/Toast/ToastViewport.tsx +0 -12
  508. package/src/ToggleButton/ToggleButton.doc.mjs +0 -1
  509. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  510. package/src/Tokenizer/Tokenizer.test.tsx +0 -54
  511. package/src/Tokenizer/Tokenizer.tsx +4 -5
  512. package/src/Tooltip/Tooltip.doc.mjs +6 -6
  513. package/src/Tooltip/useTooltip.doc.mjs +5 -5
  514. package/src/Tooltip/useTooltip.tsx +2 -12
  515. package/src/TopNav/TopNav.doc.mjs +1 -1
  516. package/src/TopNav/TopNav.test.tsx +7 -23
  517. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +2 -9
  518. package/src/TreeList/TreeList.doc.mjs +2 -2
  519. package/src/Typeahead/BaseTypeahead.doc.mjs +0 -19
  520. package/src/Typeahead/BaseTypeahead.tsx +2 -5
  521. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  522. package/src/Typeahead/Typeahead.test.tsx +1 -45
  523. package/src/docs-types.ts +1 -9
  524. package/src/hooks/focusableSelector.ts +1 -1
  525. package/src/hooks/index.ts +0 -3
  526. package/src/hooks/useFocusTrap.doc.mjs +2 -4
  527. package/src/hooks/useFocusTrap.test.tsx +1 -149
  528. package/src/hooks/useFocusTrap.ts +1 -50
  529. package/src/hooks/useInteractiveRole.ts +4 -12
  530. package/src/hooks/useStreamingText.test.ts +19 -54
  531. package/src/hooks/useStreamingText.ts +5 -16
  532. package/src/hooks/useTreeFocus.test.tsx +3 -1
  533. package/src/reset.css +0 -29
  534. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  535. package/src/theme/defineTheme.ts +13 -4
  536. package/src/theme/derivedVarRegistry.test.ts +2 -2
  537. package/src/theme/expandColorScale.test.ts +0 -29
  538. package/src/theme/expandColorScale.ts +6 -11
  539. package/src/theme/hct.ts +17 -9
  540. package/src/theme/tokens.test.ts +9 -182
  541. package/src/theme/tokens.ts +4 -239
  542. package/src/theme/useTheme.test.tsx +0 -20
  543. package/src/utils/index.ts +0 -4
  544. package/src/utils/sharedResizeObserver.test.ts +2 -2
  545. package/src/utils/timeParser.test.ts +0 -13
  546. package/src/utils/timeParser.ts +5 -8
  547. package/dist/hooks/useHotkeys.d.ts +0 -51
  548. package/dist/hooks/useHotkeys.d.ts.map +0 -1
  549. package/dist/hooks/useHotkeys.js +0 -160
  550. package/dist/utils/color.d.ts +0 -42
  551. package/dist/utils/color.d.ts.map +0 -1
  552. package/dist/utils/color.js +0 -150
  553. package/dist/utils/composeEventHandlers.d.ts +0 -30
  554. package/dist/utils/composeEventHandlers.d.ts.map +0 -1
  555. package/dist/utils/composeEventHandlers.js +0 -40
  556. package/src/Chat/ChatDictationButton.test.tsx +0 -43
  557. package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -33
  558. package/src/Chat/ChatMessageMetadata.test.tsx +0 -32
  559. package/src/Collapsible/Collapsible.test.tsx +0 -405
  560. package/src/FieldStatus/FieldStatus.test.tsx +0 -282
  561. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
  562. package/src/Layout/Layout.test.tsx +0 -285
  563. package/src/Layout/LayoutSlots.test.tsx +0 -364
  564. package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -80
  565. package/src/OverflowList/OverflowList.test.tsx +0 -416
  566. package/src/Overlay/Overlay.test.tsx +0 -356
  567. package/src/Resizable/ResizeHandle.test.tsx +0 -218
  568. package/src/SizeContext/SizeContext.test.tsx +0 -226
  569. package/src/__tests__/TestIcon.tsx +0 -26
  570. package/src/__tests__/fastRoleQueries.ts +0 -66
  571. package/src/docPropReferences.test.ts +0 -178
  572. package/src/hooks/useHotkeys.doc.mjs +0 -52
  573. package/src/hooks/useHotkeys.test.ts +0 -245
  574. package/src/hooks/useHotkeys.ts +0 -203
  575. package/src/utils/color.test.ts +0 -133
  576. package/src/utils/color.ts +0 -148
  577. package/src/utils/composeEventHandlers.test.ts +0 -71
  578. package/src/utils/composeEventHandlers.ts +0 -44
  579. package/src/utils/mergeProps.test.ts +0 -166
@@ -13,24 +13,11 @@ export interface TableFooterProps extends BaseProps<HTMLTableSectionElement> {
13
13
  children: ReactNode;
14
14
  }
15
15
 
16
- export function TableFooter({
17
- ref,
18
- children,
19
- xstyle,
20
- className,
21
- style,
22
- ...rest
23
- }: TableFooterProps) {
16
+ export function TableFooter({ref, children, xstyle}: TableFooterProps) {
24
17
  return (
25
18
  <tfoot
26
19
  ref={ref}
27
- {...mergeProps(
28
- themeProps('table-footer'),
29
- stylex.props(xstyle),
30
- className,
31
- style,
32
- )}
33
- {...rest}>
20
+ {...mergeProps(themeProps('table-footer'), stylex.props(xstyle))}>
34
21
  {children}
35
22
  </tfoot>
36
23
  );
@@ -13,24 +13,11 @@ export interface TableHeaderProps extends BaseProps<HTMLTableSectionElement> {
13
13
  children: ReactNode;
14
14
  }
15
15
 
16
- export function TableHeader({
17
- ref,
18
- children,
19
- xstyle,
20
- className,
21
- style,
22
- ...rest
23
- }: TableHeaderProps) {
16
+ export function TableHeader({ref, children, xstyle}: TableHeaderProps) {
24
17
  return (
25
18
  <thead
26
19
  ref={ref}
27
- {...mergeProps(
28
- themeProps('table-header'),
29
- stylex.props(xstyle),
30
- className,
31
- style,
32
- )}
33
- {...rest}>
20
+ {...mergeProps(themeProps('table-header'), stylex.props(xstyle))}>
34
21
  {children}
35
22
  </thead>
36
23
  );
@@ -551,19 +551,6 @@ describe('useTableColumnResize', () => {
551
551
  expect(handle).toHaveAttribute('aria-valuenow', '200');
552
552
  });
553
553
 
554
- it('handle has a numeric aria-valuenow on initial render (before any width is measured)', () => {
555
- // A focusable role="separator" requires aria-valuenow per the ARIA spec.
556
- // Before the column width has been measured there is no override width, so
557
- // the handle must fall back to a defined numeric value (the column
558
- // minWidth) rather than omitting the attribute.
559
- render(<ResizeTable minWidth={80} />);
560
- const handle = getResizeHandles()[0];
561
- const valueNow = handle.getAttribute('aria-valuenow');
562
- expect(valueNow).not.toBeNull();
563
- expect(Number.isNaN(Number(valueNow))).toBe(false);
564
- expect(valueNow).toBe('80');
565
- });
566
-
567
554
  it('handle has aria-label with column header text', () => {
568
555
  render(<ResizeTable />);
569
556
  const handle = getResizeHandles()[0];
@@ -676,9 +676,7 @@ function ResizeHandle({
676
676
  <div
677
677
  role="separator"
678
678
  aria-orientation="vertical"
679
- // A focusable role="separator" requires a numeric aria-valuenow, so fall
680
- // back to the column's minWidth before the width has been measured.
681
- aria-valuenow={currentWidth ?? minWidth}
679
+ aria-valuenow={currentWidth ?? undefined}
682
680
  aria-valuemin={minWidth}
683
681
  aria-valuemax={maxWidth === Infinity ? undefined : maxWidth}
684
682
  aria-label={ariaLabel}
@@ -38,10 +38,6 @@ export function paginateData<T>(
38
38
  const size = Number.isFinite(pageSize)
39
39
  ? Math.max(1, Math.floor(pageSize))
40
40
  : 10;
41
- // page needs the same coercion: a negative start index makes Array.slice
42
- // count from the END of the data (page -1 returns the tail dressed up as a
43
- // page), and a fractional page returns a slice straddling two pages.
44
- const p = Number.isFinite(page) ? Math.max(1, Math.floor(page)) : 1;
45
- const start = (p - 1) * size;
41
+ const start = (page - 1) * size;
46
42
  return data.slice(start, start + size);
47
43
  }
@@ -132,19 +132,6 @@ describe('paginateData', () => {
132
132
  expect(paginateData([], 1, 10)).toEqual([]);
133
133
  });
134
134
 
135
- it('clamps invalid page numbers to the first page (#3593)', () => {
136
- const data = generateItems(30);
137
- // Negative pages previously fed a negative index to Array.slice, which
138
- // counts from the END of the data — the tail dressed up as a page.
139
- expect(paginateData(data, -1, 10)[0].id).toBe('1');
140
- expect(paginateData(data, 0, 10)[0].id).toBe('1');
141
- expect(paginateData(data, NaN, 10)[0].id).toBe('1');
142
- // Fractional pages floor to the containing page instead of straddling two.
143
- expect(paginateData(data, 1.5, 10).map(i => i.id)).toEqual(
144
- paginateData(data, 1, 10).map(i => i.id),
145
- );
146
- });
147
-
148
135
  it('returns empty array when page exceeds data', () => {
149
136
  const data = generateItems(10);
150
137
  expect(paginateData(data, 5, 10)).toEqual([]);
@@ -302,29 +302,6 @@ describe('useTableSelectionState with filtered data', () => {
302
302
  expect(screen.getByTestId('selected-keys')).toHaveTextContent('1,3');
303
303
  });
304
304
 
305
- it('select-all is unchecked when the filter matches nothing (#3591)', async () => {
306
- const user = userEvent.setup();
307
- render(<FilteredSelectionTable />);
308
-
309
- // Select Bob, then filter to an empty result set.
310
- const checkboxes = screen.getAllByLabelText('Select row');
311
- await user.click(checkboxes[1]);
312
- expect(screen.getByTestId('selected-keys')).toHaveTextContent('2');
313
-
314
- const input = screen.getByTestId('filter-input');
315
- await user.clear(input);
316
- await user.type(input, 'zzz');
317
-
318
- // Zero visible rows must not read as "all selected" — previously the
319
- // header checkbox rendered checked here and deselect-all was a no-op.
320
- const selectAll = screen.getByLabelText('Select all rows');
321
- expect(selectAll).not.toBeChecked();
322
-
323
- // The hidden selection itself is preserved (frozen), as designed.
324
- await user.clear(input);
325
- expect(screen.getByTestId('selected-keys')).toHaveTextContent('2');
326
- });
327
-
328
305
  it('selections persist when filter changes', async () => {
329
306
  const user = userEvent.setup();
330
307
  render(<FilteredSelectionTable />);
@@ -125,17 +125,12 @@ export function useTableSelectionState<T extends Record<string, unknown>>(
125
125
  [selectedKeys, selectableIDs],
126
126
  );
127
127
 
128
- const getAllSelected = useCallback(() => {
129
- // Require at least one actionable row: with zero visible selectable
130
- // rows (e.g. a filter with no matches while a selection exists), the
131
- // union-based size comparison would read any non-empty selection as
132
- // "all selected" — a checked header checkbox over an empty table that
133
- // deselect-all can't clear, since the invisible keys count as frozen.
134
- if (selectableIDs.size === 0) {
135
- return false;
136
- }
137
- return allSelectableIDs.size === selectedKeys.size;
138
- }, [allSelectableIDs, selectableIDs, selectedKeys]);
128
+ const getAllSelected = useCallback(
129
+ () =>
130
+ allSelectableIDs.size === selectedKeys.size &&
131
+ allSelectableIDs.size !== 0,
132
+ [allSelectableIDs, selectedKeys],
133
+ );
139
134
 
140
135
  // Use refs to keep onSelectAll stable
141
136
  const frozenSelectedIDsRef = useRef(frozenSelectedIDs);
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import {describe, it, expect, vi} from 'vitest';
11
- import {render, renderHook, screen, within} from '@testing-library/react';
11
+ import {render, screen, within} from '@testing-library/react';
12
12
  import userEvent from '@testing-library/user-event';
13
13
  import {useState} from 'react';
14
14
  import {Table} from '../../Table';
@@ -421,40 +421,6 @@ describe('useTableSortableState', () => {
421
421
  });
422
422
  });
423
423
 
424
- describe('NaN handling', () => {
425
- it('keeps valid numbers sorted when a NaN cell is present', () => {
426
- const data: Employee[] = [
427
- {id: '1', name: 'A', age: 5, department: 'X', salary: 1},
428
- {id: '2', name: 'B', age: NaN, department: 'X', salary: 1},
429
- {id: '3', name: 'C', age: 1, department: 'X', salary: 1},
430
- {id: '4', name: 'D', age: 3, department: 'X', salary: 1},
431
- ];
432
- const {result} = renderHook(() =>
433
- useTableSortableState({
434
- data,
435
- defaultSort: [{sortKey: 'age', direction: 'ascending'}],
436
- }),
437
- );
438
- // NaN groups at the end like null; the valid numbers stay ordered.
439
- expect(result.current.sortedData.map(e => e.age)).toEqual([1, 3, 5, NaN]);
440
- });
441
-
442
- it('sorts NaN to the start in descending order, like null', () => {
443
- const data: Employee[] = [
444
- {id: '1', name: 'A', age: 5, department: 'X', salary: 1},
445
- {id: '2', name: 'B', age: NaN, department: 'X', salary: 1},
446
- {id: '3', name: 'C', age: 1, department: 'X', salary: 1},
447
- ];
448
- const {result} = renderHook(() =>
449
- useTableSortableState({
450
- data,
451
- defaultSort: [{sortKey: 'age', direction: 'descending'}],
452
- }),
453
- );
454
- expect(result.current.sortedData.map(e => e.age)).toEqual([NaN, 5, 1]);
455
- });
456
- });
457
-
458
424
  describe('null/undefined handling', () => {
459
425
  it('sorts null values to the end', () => {
460
426
  const data: Employee[] = [
@@ -168,18 +168,14 @@ function defaultCompare<T extends Record<string, unknown>>(
168
168
  const aVal = a[sortKey];
169
169
  const bVal = b[sortKey];
170
170
 
171
- // null/undefined/NaN sort to the end. NaN must not reach the numeric fast
172
- // path: a NaN comparator result reads as "equal" to Array.sort, which makes
173
- // the comparator inconsistent and corrupts the order of the other rows.
174
- const aMissing = aVal == null || (typeof aVal === 'number' && Number.isNaN(aVal));
175
- const bMissing = bVal == null || (typeof bVal === 'number' && Number.isNaN(bVal));
176
- if (aMissing && bMissing) {
171
+ // null/undefined sort to the end
172
+ if (aVal == null && bVal == null) {
177
173
  return 0;
178
174
  }
179
- if (aMissing) {
175
+ if (aVal == null) {
180
176
  return 1;
181
177
  }
182
- if (bMissing) {
178
+ if (bVal == null) {
183
179
  return -1;
184
180
  }
185
181
 
@@ -13,7 +13,7 @@ import {useState} from 'react';
13
13
  import {describe, it, expect, vi, beforeEach} from 'vitest';
14
14
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
15
15
  import userEvent from '@testing-library/user-event';
16
- import {TestIcon} from '../__tests__/TestIcon';
16
+ import {MagnifyingGlassIcon} from '@heroicons/react/24/outline';
17
17
  import {TextArea} from './TextArea';
18
18
 
19
19
  // Mock showPopover/hidePopover since jsdom does not implement them. Used by the
@@ -193,7 +193,7 @@ describe('TextArea', () => {
193
193
  label="Description"
194
194
  value=""
195
195
  onChange={() => {}}
196
- startIcon={TestIcon}
196
+ startIcon={MagnifyingGlassIcon}
197
197
  />,
198
198
  );
199
199
  expect(screen.getByRole('textbox')).toBeInTheDocument();
@@ -577,7 +577,7 @@ describe('TextArea', () => {
577
577
  label="Notes"
578
578
  value=""
579
579
  onChange={() => {}}
580
- startIcon={<TestIcon />}
580
+ startIcon={<MagnifyingGlassIcon />}
581
581
  />,
582
582
  );
583
583
 
@@ -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 {TestIcon} from '../__tests__/TestIcon';
15
+ import {MagnifyingGlassIcon} from '@heroicons/react/24/outline';
16
16
  import {TextInput} from './TextInput';
17
17
 
18
18
  // Mock showPopover/hidePopover since jsdom does not implement them. Used by the
@@ -163,7 +163,7 @@ describe('TextInput', () => {
163
163
  label="Search"
164
164
  value=""
165
165
  onChange={() => {}}
166
- startIcon={TestIcon}
166
+ startIcon={MagnifyingGlassIcon}
167
167
  />,
168
168
  );
169
169
  expect(screen.getByRole('textbox')).toBeInTheDocument();
@@ -482,7 +482,7 @@ describe('TextInput', () => {
482
482
  label="Search"
483
483
  value=""
484
484
  onChange={() => {}}
485
- startIcon={<TestIcon />}
485
+ startIcon={<MagnifyingGlassIcon />}
486
486
  />,
487
487
  );
488
488
 
@@ -37,45 +37,11 @@ describe('Thumbnail', () => {
37
37
  expect(screen.getByRole('status')).toBeInTheDocument();
38
38
  });
39
39
 
40
- it('exposes the label as an accessible name via a valid group role', () => {
40
+ it('uses label as accessible name on root', () => {
41
41
  render(<Thumbnail label="photo.png" data-testid="thumb" />);
42
- // The accessible name must be carried by a valid named role (group),
43
- // not by a bare aria-label on a generic div (aria-prohibited-attr).
44
- const group = screen.getByRole('group', {name: 'photo.png'});
45
- expect(group).toBe(screen.getByTestId('thumb'));
42
+ expect(screen.getByTestId('thumb')).toHaveAttribute('aria-label', 'photo.png');
46
43
  });
47
44
 
48
- it('does not put aria-label on a generic (roleless) element', () => {
49
- render(<Thumbnail label="photo.png" data-testid="thumb" />);
50
- const thumb = screen.getByTestId('thumb');
51
- // The labeled element must declare a role so the name is legitimate.
52
- expect(thumb).toHaveAttribute('role', 'group');
53
- });
54
-
55
- it('keeps interactive children accessible while exposing the group name', () => {
56
- const onRemove = vi.fn();
57
- render(
58
- <Thumbnail
59
- src="/img.jpg"
60
- alt="Clickable"
61
- label="file.png"
62
- onClick={vi.fn()}
63
- onRemove={onRemove}
64
- />,
65
- );
66
- // A group role (unlike img) must not hide descendant controls.
67
- expect(
68
- screen.getByRole('group', {name: 'file.png — Clickable'}),
69
- ).toBeInTheDocument();
70
- expect(
71
- screen.getByRole('button', {name: 'Open file.png — Clickable'}),
72
- ).toBeInTheDocument();
73
- expect(
74
- screen.getByRole('button', {name: 'Remove file.png — Clickable'}),
75
- ).toBeInTheDocument();
76
- });
77
-
78
-
79
45
  it('label is shown via tooltip, not as inline text', () => {
80
46
  render(<Thumbnail label="photo.png" data-testid="thumb" />);
81
47
  // Label should exist in DOM (tooltip) but not as a direct child text node
@@ -58,9 +58,8 @@ export interface ThumbnailProps extends BaseProps<HTMLDivElement> {
58
58
  alt?: string;
59
59
  /**
60
60
  * Accessible label for the thumbnail (e.g. file name).
61
- * Not rendered visually — shown in a tooltip on hover, exposed as the
62
- * accessible name of the thumbnail group, and used as the accessible
63
- * name for the remove button.
61
+ * Not rendered visually — shown in a tooltip on hover and used
62
+ * as accessible name for the remove button.
64
63
  */
65
64
  label?: string;
66
65
  /**
@@ -297,7 +296,6 @@ export function Thumbnail({
297
296
  <div
298
297
  ref={ref}
299
298
  data-testid={testId}
300
- role="group"
301
299
  aria-label={accessibleName}
302
300
  {...mergeProps(
303
301
  themeProps('thumbnail'),
@@ -160,43 +160,6 @@ describe('TimeInput', () => {
160
160
  expect(onChange).not.toHaveBeenCalled();
161
161
  });
162
162
 
163
- it('sets aria-invalid="true" when typed input is out of range', () => {
164
- render(<TimeInput label="Time" onChange={() => {}} />);
165
-
166
- const input = screen.getByRole('textbox');
167
- fireEvent.change(input, {target: {value: '25:99'}});
168
-
169
- expect(input).toHaveAttribute('aria-invalid', 'true');
170
- });
171
-
172
- it('does not set aria-invalid when typed input is a valid time', () => {
173
- render(<TimeInput label="Time" onChange={() => {}} />);
174
-
175
- const input = screen.getByRole('textbox');
176
- fireEvent.change(input, {target: {value: '3:45 pm'}});
177
-
178
- expect(input).not.toHaveAttribute('aria-invalid');
179
- });
180
-
181
- it('announces an alert message when typed input is invalid', () => {
182
- render(<TimeInput label="Time" onChange={() => {}} />);
183
-
184
- const input = screen.getByRole('textbox');
185
- fireEvent.change(input, {target: {value: '25:99'}});
186
-
187
- expect(screen.getByRole('alert')).toHaveTextContent('Invalid time');
188
- });
189
-
190
- it('does not announce an alert message when input is valid', () => {
191
- render(<TimeInput label="Time" onChange={() => {}} />);
192
-
193
- const input = screen.getByRole('textbox');
194
- fireEvent.change(input, {target: {value: '3:45 pm'}});
195
-
196
- expect(screen.getByRole('alert')).toHaveTextContent('');
197
- expect(screen.queryByText('Invalid time')).not.toBeInTheDocument();
198
- });
199
-
200
163
  it('calls onChange on blur when input is valid', async () => {
201
164
  const user = userEvent.setup();
202
165
  const onChange = vi.fn();
@@ -635,9 +635,7 @@ export function TimeInput({
635
635
  data-autofocus={hasAutoFocus || undefined}
636
636
  aria-describedby={ariaDescribedBy}
637
637
  aria-required={isRequired === true ? 'true' : undefined}
638
- aria-invalid={
639
- status?.type === 'error' || !isInputValid ? 'true' : undefined
640
- }
638
+ aria-invalid={status?.type === 'error' ? 'true' : undefined}
641
639
  aria-busy={isBusy || undefined}
642
640
  aria-labelledby={ariaLabelledBy}
643
641
  {...stylex.props(
@@ -646,14 +644,6 @@ export function TimeInput({
646
644
  !isInputValid && styles.inputInvalid,
647
645
  )}
648
646
  />
649
- {/*
650
- Live region announcing invalid typed input to assistive technology.
651
- The value silently reverts on blur, so without this a screen-reader
652
- user would get no feedback that their entry was rejected (WCAG 3.3.1).
653
- */}
654
- <VisuallyHidden as="div" role="alert" aria-live="assertive">
655
- {!isInputValid ? 'Invalid time' : ''}
656
- </VisuallyHidden>
657
647
  {isBusy && <Spinner size="sm" />}
658
648
  {hasClear && value && !isDisabled && (
659
649
  <button
@@ -84,7 +84,7 @@ export const docs = {
84
84
  ],
85
85
  theming: {
86
86
  targets: [
87
- {className: 'astryx-timestamp', visualProps: ['type', 'color', 'format']},
87
+ {className: 'astryx-timestamp', visualProps: ['type', 'color']},
88
88
  ],
89
89
  },
90
90
  usage: {
@@ -33,31 +33,6 @@ describe('Timestamp', () => {
33
33
  expect(screen.getByText('2 hours ago')).toBeInTheDocument();
34
34
  });
35
35
 
36
- it('does not round a tier up past its own boundary', () => {
37
- // Just under each threshold the count must stay within the tier, e.g.
38
- // 59.98 minutes is "59 minutes ago", never "60 minutes ago".
39
- const {rerender} = render(
40
- <Timestamp value={Date.now() / 1000 - 3599} format="relative" />,
41
- );
42
- expect(screen.getByText('59 minutes ago')).toBeInTheDocument();
43
-
44
- rerender(
45
- <Timestamp value={Date.now() / 1000 - 86399} format="relative" />,
46
- );
47
- expect(screen.getByText('23 hours ago')).toBeInTheDocument();
48
-
49
- rerender(
50
- <Timestamp value={Date.now() / 1000 - 2591999} format="relative" />,
51
- );
52
- expect(screen.getByText('29 days ago')).toBeInTheDocument();
53
-
54
- // Same guarantee on the future side.
55
- rerender(
56
- <Timestamp value={Date.now() / 1000 + 3599} format="relative" />,
57
- );
58
- expect(screen.getByText('in 59 minutes')).toBeInTheDocument();
59
- });
60
-
61
36
  it('renders "now" for very recent times', () => {
62
37
  const fiveSecondsAgo = Date.now() / 1000 - 5;
63
38
  render(<Timestamp value={fiveSecondsAgo} format="relative" />);
@@ -315,31 +290,4 @@ describe('Timestamp', () => {
315
290
  const el = screen.getByRole('time');
316
291
  expect(el.textContent).not.toContain('ago');
317
292
  });
318
-
319
- // --- Invalid values ---
320
-
321
- it('renders nothing instead of crashing on an unparseable string value', () => {
322
- const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
323
- try {
324
- const {container} = render(
325
- <Timestamp value="not-a-date" data-testid="ts" />,
326
- );
327
- expect(container).toBeEmptyDOMElement();
328
- expect(warn).toHaveBeenCalledWith(
329
- expect.stringContaining('could not parse value'),
330
- );
331
- } finally {
332
- warn.mockRestore();
333
- }
334
- });
335
-
336
- it('renders nothing instead of crashing on a NaN value', () => {
337
- const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
338
- try {
339
- const {container} = render(<Timestamp value={NaN} data-testid="ts" />);
340
- expect(container).toBeEmptyDOMElement();
341
- } finally {
342
- warn.mockRestore();
343
- }
344
- });
345
293
  });
@@ -180,22 +180,22 @@ function getRelativeTimeString(date: Date, now: Date): string {
180
180
  return 'in a few seconds';
181
181
  }
182
182
  if (absDiff < HOUR) {
183
- const mins = Math.floor(absDiff / MINUTE);
183
+ const mins = Math.round(absDiff / MINUTE);
184
184
  return `in ${mins} ${mins === 1 ? 'minute' : 'minutes'}`;
185
185
  }
186
186
  if (absDiff < DAY) {
187
- const hours = Math.floor(absDiff / HOUR);
187
+ const hours = Math.round(absDiff / HOUR);
188
188
  return `in ${hours} ${hours === 1 ? 'hour' : 'hours'}`;
189
189
  }
190
190
  if (absDiff < MONTH) {
191
- const days = Math.floor(absDiff / DAY);
191
+ const days = Math.round(absDiff / DAY);
192
192
  return `in ${days} ${days === 1 ? 'day' : 'days'}`;
193
193
  }
194
194
  if (absDiff < YEAR) {
195
- const months = Math.floor(absDiff / MONTH);
195
+ const months = Math.round(absDiff / MONTH);
196
196
  return `in ${months} ${months === 1 ? 'month' : 'months'}`;
197
197
  }
198
- const years = Math.floor(absDiff / YEAR);
198
+ const years = Math.round(absDiff / YEAR);
199
199
  return `in ${years} ${years === 1 ? 'year' : 'years'}`;
200
200
  }
201
201
 
@@ -203,25 +203,25 @@ function getRelativeTimeString(date: Date, now: Date): string {
203
203
  return `${diffSeconds} seconds ago`;
204
204
  }
205
205
  if (diffSeconds < HOUR) {
206
- const mins = Math.floor(diffSeconds / MINUTE);
206
+ const mins = Math.round(diffSeconds / MINUTE);
207
207
  return `${mins} ${mins === 1 ? 'minute' : 'minutes'} ago`;
208
208
  }
209
209
  if (diffSeconds < DAY) {
210
- const hours = Math.floor(diffSeconds / HOUR);
210
+ const hours = Math.round(diffSeconds / HOUR);
211
211
  return `${hours} ${hours === 1 ? 'hour' : 'hours'} ago`;
212
212
  }
213
213
  if (diffSeconds < 2 * DAY) {
214
214
  return 'yesterday';
215
215
  }
216
216
  if (diffSeconds < MONTH) {
217
- const days = Math.floor(diffSeconds / DAY);
217
+ const days = Math.round(diffSeconds / DAY);
218
218
  return `${days} days ago`;
219
219
  }
220
220
  if (diffSeconds < YEAR) {
221
- const months = Math.floor(diffSeconds / MONTH);
221
+ const months = Math.round(diffSeconds / MONTH);
222
222
  return `${months} ${months === 1 ? 'month' : 'months'} ago`;
223
223
  }
224
- const years = Math.floor(diffSeconds / YEAR);
224
+ const years = Math.round(diffSeconds / YEAR);
225
225
  return `${years} ${years === 1 ? 'year' : 'years'} ago`;
226
226
  }
227
227
 
@@ -360,12 +360,7 @@ export function Timestamp({
360
360
  const [now, setNow] = useState(() => new Date());
361
361
 
362
362
  const date = parseValue(value);
363
- // An unparseable value (a malformed date string, or a NaN timestamp from
364
- // missing data) yields an Invalid Date, and formatting one throws "Invalid
365
- // time value" — crashing the whole tree. Compute nothing from it here and
366
- // bail out below (after the hooks) instead.
367
- const isValidDate = !Number.isNaN(date.getTime());
368
- const isoString = isValidDate ? date.toISOString() : '';
363
+ const isoString = date.toISOString();
369
364
 
370
365
  // Determine effective format
371
366
  const diffSeconds = Math.round((now.getTime() - date.getTime()) / 1000);
@@ -377,20 +372,19 @@ export function Timestamp({
377
372
  : format;
378
373
 
379
374
  // Format the display text
380
- const displayText = !isValidDate
381
- ? ''
382
- : effectiveFormat === 'relative'
375
+ const displayText =
376
+ effectiveFormat === 'relative'
383
377
  ? getRelativeTimeString(date, now)
384
378
  : isAbsoluteFormat(effectiveFormat)
385
379
  ? formatTimestamp(date, effectiveFormat, isTimezoneShown)
386
380
  : '';
387
381
 
388
382
  // Full absolute text for tooltip and aria-label
389
- const fullAbsoluteText = isValidDate ? getFullAbsoluteString(date) : '';
383
+ const fullAbsoluteText = getFullAbsoluteString(date);
390
384
 
391
385
  // Live updates
392
386
  useEffect(() => {
393
- if (!isLive || !isValidDate || effectiveFormat !== 'relative') {
387
+ if (!isLive || effectiveFormat !== 'relative') {
394
388
  return;
395
389
  }
396
390
 
@@ -400,15 +394,7 @@ export function Timestamp({
400
394
  }, interval);
401
395
 
402
396
  return () => clearInterval(timer);
403
- }, [isLive, isValidDate, effectiveFormat, diffSeconds]);
404
-
405
- // Placed after all hooks so the hook order stays stable across renders.
406
- if (!isValidDate) {
407
- console.warn(
408
- `Timestamp: could not parse value ${JSON.stringify(value)} as a date. Rendering nothing.`,
409
- );
410
- return null;
411
- }
397
+ }, [isLive, effectiveFormat, diffSeconds]);
412
398
 
413
399
  const showTooltip = hasTooltip && effectiveFormat === 'relative';
414
400