@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.d.ts +0 -2
  6. package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
  7. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
  8. package/dist/AppShell/AppShell.d.ts +1 -1
  9. package/dist/AppShell/AppShell.d.ts.map +1 -1
  10. package/dist/AppShell/AppShell.js +55 -53
  11. package/dist/AspectRatio/AspectRatio.d.ts +48 -10
  12. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  13. package/dist/AspectRatio/AspectRatio.js +33 -12
  14. package/dist/AspectRatio/index.d.ts +1 -1
  15. package/dist/AspectRatio/index.d.ts.map +1 -1
  16. package/dist/Avatar/Avatar.d.ts.map +1 -1
  17. package/dist/Avatar/Avatar.js +28 -26
  18. package/dist/Avatar/AvatarStatusDot.js +6 -6
  19. package/dist/AvatarGroup/AvatarGroup.js +6 -6
  20. package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
  21. package/dist/Badge/Badge.js +3 -3
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +32 -25
  24. package/dist/Blockquote/Blockquote.js +7 -7
  25. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  26. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  27. package/dist/Button/Button.js +19 -19
  28. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  29. package/dist/Calendar/Calendar.d.ts.map +1 -1
  30. package/dist/Calendar/Calendar.js +68 -48
  31. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  32. package/dist/Calendar/styles.d.ts +2 -2
  33. package/dist/Calendar/styles.d.ts.map +1 -1
  34. package/dist/Calendar/styles.js +2 -2
  35. package/dist/Card/Card.d.ts +4 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +18 -10
  38. package/dist/Carousel/Carousel.d.ts.map +1 -1
  39. package/dist/Carousel/Carousel.js +24 -21
  40. package/dist/Center/Center.js +3 -3
  41. package/dist/Chat/ChatComposer.js +23 -23
  42. package/dist/Chat/ChatComposerDrawer.js +14 -14
  43. package/dist/Chat/ChatComposerInput.d.ts +1 -1
  44. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  45. package/dist/Chat/ChatComposerInput.js +27 -15
  46. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  47. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatDictationButton.js +13 -11
  49. package/dist/Chat/ChatLayout.js +17 -17
  50. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  51. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  52. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  53. package/dist/Chat/ChatMessage.js +12 -12
  54. package/dist/Chat/ChatMessageBubble.js +7 -7
  55. package/dist/Chat/ChatMessageList.js +14 -14
  56. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  57. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  58. package/dist/Chat/ChatMessageMetadata.js +14 -12
  59. package/dist/Chat/ChatPastedTextToken.js +13 -13
  60. package/dist/Chat/ChatSendButton.js +3 -3
  61. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  62. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  63. package/dist/Chat/ChatSystemMessage.js +17 -17
  64. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  65. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  66. package/dist/Chat/ChatTokenizedText.js +24 -15
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +81 -74
  69. package/dist/Chat/index.d.ts +1 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  72. package/dist/Chat/useTriggerMenu.js +15 -15
  73. package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
  74. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  75. package/dist/CheckboxInput/CheckboxInput.js +25 -23
  76. package/dist/CheckboxList/CheckboxList.js +9 -9
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  80. package/dist/Citation/Citation.js +10 -10
  81. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  82. package/dist/ClickableCard/ClickableCard.js +32 -9
  83. package/dist/Code/Code.js +3 -3
  84. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  85. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  86. package/dist/CodeBlock/CodeBlock.js +88 -52
  87. package/dist/Collapsible/Collapsible.d.ts +9 -3
  88. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  89. package/dist/Collapsible/Collapsible.js +109 -22
  90. package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
  91. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  92. package/dist/Collapsible/CollapsibleGroup.js +64 -12
  93. package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  95. package/dist/Collapsible/CollapsibleGroupContext.js +26 -3
  96. package/dist/Collapsible/index.d.ts +1 -0
  97. package/dist/Collapsible/index.d.ts.map +1 -1
  98. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  99. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  100. package/dist/Collapsible/useCollapsible.js +20 -6
  101. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  102. package/dist/CommandPalette/CommandPalette.js +36 -34
  103. package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
  104. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  105. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  106. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  107. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  108. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  109. package/dist/ContextMenu/ContextMenu.d.ts +7 -2
  110. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  111. package/dist/ContextMenu/ContextMenu.js +76 -43
  112. package/dist/DateInput/DateInput.js +18 -18
  113. package/dist/DateRangeInput/DateRangeInput.js +21 -21
  114. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  115. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  116. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  117. package/dist/DateTimeInput/index.d.ts +1 -1
  118. package/dist/DateTimeInput/index.d.ts.map +1 -1
  119. package/dist/Dialog/Dialog.js +9 -9
  120. package/dist/Dialog/DialogHeader.js +16 -16
  121. package/dist/Dialog/useImperativeDialog.js +3 -3
  122. package/dist/Divider/Divider.js +7 -7
  123. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  124. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  125. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  126. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  127. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  128. package/dist/EmptyState/EmptyState.js +9 -9
  129. package/dist/Field/Field.js +17 -17
  130. package/dist/Field/FieldLabel.js +15 -15
  131. package/dist/Field/InputClearButton.js +5 -5
  132. package/dist/FieldStatus/FieldStatus.js +3 -3
  133. package/dist/FileInput/FileInput.js +29 -29
  134. package/dist/FormLayout/FormLayout.js +5 -5
  135. package/dist/Grid/Grid.d.ts +4 -3
  136. package/dist/Grid/Grid.d.ts.map +1 -1
  137. package/dist/Grid/Grid.js +29 -12
  138. package/dist/Grid/GridSpan.js +3 -3
  139. package/dist/HStack/HStack.js +3 -3
  140. package/dist/Heading/Heading.js +10 -10
  141. package/dist/HoverCard/HoverCard.js +9 -9
  142. package/dist/HoverCard/useHoverCard.d.ts +5 -1
  143. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  144. package/dist/HoverCard/useHoverCard.js +3 -3
  145. package/dist/Icon/Icon.d.ts.map +1 -1
  146. package/dist/Icon/Icon.js +16 -12
  147. package/dist/Icon/defaultIcons.js +116 -116
  148. package/dist/IconButton/IconButton.js +3 -3
  149. package/dist/InputGroup/InputGroup.js +11 -11
  150. package/dist/InputGroup/InputGroupText.js +3 -3
  151. package/dist/Item/Item.js +18 -18
  152. package/dist/Kbd/Kbd.js +5 -5
  153. package/dist/Layer/LayerProvider.js +7 -7
  154. package/dist/Layer/useLayer.d.ts +29 -2
  155. package/dist/Layer/useLayer.d.ts.map +1 -1
  156. package/dist/Layer/useLayer.js +44 -31
  157. package/dist/Layout/Layout.js +21 -21
  158. package/dist/Layout/LayoutContent.js +3 -3
  159. package/dist/Layout/LayoutFooter.js +5 -5
  160. package/dist/Layout/LayoutHeader.js +5 -5
  161. package/dist/Layout/LayoutPanel.js +3 -3
  162. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  163. package/dist/Lightbox/Lightbox.js +55 -31
  164. package/dist/Lightbox/useLightbox.d.ts +0 -1
  165. package/dist/Lightbox/useLightbox.d.ts.map +1 -1
  166. package/dist/Lightbox/useLightbox.js +3 -4
  167. package/dist/Link/Link.d.ts +0 -2
  168. package/dist/Link/Link.d.ts.map +1 -1
  169. package/dist/Link/Link.js +15 -17
  170. package/dist/Link/LinkProvider.js +3 -3
  171. package/dist/Link/useLinkify.js +3 -3
  172. package/dist/List/List.js +11 -11
  173. package/dist/List/ListItem.js +11 -11
  174. package/dist/Markdown/Markdown.d.ts.map +1 -1
  175. package/dist/Markdown/Markdown.js +102 -102
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.d.ts +1 -1
  179. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  180. package/dist/MobileNav/MobileNav.js +26 -23
  181. package/dist/MobileNav/MobileNavToggle.js +5 -5
  182. package/dist/MoreMenu/MoreMenu.js +3 -3
  183. package/dist/MultiSelector/MultiSelector.js +56 -56
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.d.ts +0 -3
  194. package/dist/Overlay/useOverlay.d.ts.map +1 -1
  195. package/dist/Overlay/useOverlay.js +3 -6
  196. package/dist/Pagination/Pagination.d.ts +1 -1
  197. package/dist/Pagination/Pagination.d.ts.map +1 -1
  198. package/dist/Pagination/Pagination.js +125 -72
  199. package/dist/Popover/Popover.js +16 -16
  200. package/dist/Popover/usePopover.js +7 -7
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +110 -92
  203. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  204. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  205. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  206. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  207. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  208. package/dist/ProgressBar/ProgressBar.js +25 -18
  209. package/dist/RadioList/RadioList.js +7 -7
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +24 -21
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.js +46 -46
  224. package/dist/Selector/SelectorOption.js +3 -3
  225. package/dist/SideNav/SideNav.d.ts.map +1 -1
  226. package/dist/SideNav/SideNav.js +38 -34
  227. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  228. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  229. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  230. package/dist/SideNav/SideNavHeading.js +87 -87
  231. package/dist/SideNav/SideNavItem.js +42 -42
  232. package/dist/SideNav/SideNavSection.d.ts +1 -1
  233. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  234. package/dist/SideNav/SideNavSection.js +18 -16
  235. package/dist/Skeleton/Skeleton.js +3 -3
  236. package/dist/Slider/Slider.js +23 -23
  237. package/dist/Spinner/Spinner.js +9 -9
  238. package/dist/StatusDot/StatusDot.js +5 -5
  239. package/dist/Switch/Switch.d.ts +8 -4
  240. package/dist/Switch/Switch.d.ts.map +1 -1
  241. package/dist/Switch/Switch.js +34 -29
  242. package/dist/TabList/Tab.js +18 -18
  243. package/dist/TabList/TabList.js +5 -5
  244. package/dist/TabList/TabMenu.d.ts.map +1 -1
  245. package/dist/TabList/TabMenu.js +57 -30
  246. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  247. package/dist/Table/BaseTable.d.ts.map +1 -1
  248. package/dist/Table/BaseTable.js +50 -39
  249. package/dist/Table/Table.js +7 -7
  250. package/dist/Table/TableBody.d.ts +1 -1
  251. package/dist/Table/TableBody.d.ts.map +1 -1
  252. package/dist/Table/TableBody.js +9 -5
  253. package/dist/Table/TableCell.js +3 -3
  254. package/dist/Table/TableFooter.d.ts +1 -1
  255. package/dist/Table/TableFooter.d.ts.map +1 -1
  256. package/dist/Table/TableFooter.js +9 -5
  257. package/dist/Table/TableHeader.d.ts +1 -1
  258. package/dist/Table/TableHeader.d.ts.map +1 -1
  259. package/dist/Table/TableHeader.js +9 -5
  260. package/dist/Table/TableHeaderCell.js +3 -3
  261. package/dist/Table/TableRow.js +5 -5
  262. package/dist/Table/index.d.ts +2 -0
  263. package/dist/Table/index.d.ts.map +1 -1
  264. package/dist/Table/index.js +1 -0
  265. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  266. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  267. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  268. package/dist/Table/plugins/groupedRows/index.d.ts +3 -0
  269. package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
  270. package/dist/Table/plugins/groupedRows/index.js +3 -0
  271. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
  272. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
  273. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
  278. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
  279. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  280. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  281. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  282. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  283. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  284. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  285. package/dist/Table/tableContextMenu.js +9 -9
  286. package/dist/Text/Text.js +10 -10
  287. package/dist/TextArea/TextArea.js +14 -14
  288. package/dist/TextInput/TextInput.js +15 -15
  289. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  290. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  291. package/dist/Thumbnail/Thumbnail.js +30 -29
  292. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  293. package/dist/TimeInput/TimeInput.js +26 -21
  294. package/dist/Timestamp/Timestamp.d.ts +1 -1
  295. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  296. package/dist/Timestamp/Timestamp.js +37 -26
  297. package/dist/Toast/Toast.d.ts.map +1 -1
  298. package/dist/Toast/Toast.js +25 -17
  299. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  300. package/dist/Toast/ToastViewport.js +23 -11
  301. package/dist/Toast/useToast.d.ts.map +1 -1
  302. package/dist/Toast/useToast.js +44 -4
  303. package/dist/ToggleButton/ToggleButton.js +12 -12
  304. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  305. package/dist/Token/Token.js +21 -21
  306. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  307. package/dist/Tokenizer/Tokenizer.js +36 -34
  308. package/dist/Toolbar/Toolbar.js +18 -18
  309. package/dist/Tooltip/Tooltip.js +11 -11
  310. package/dist/Tooltip/useTooltip.d.ts +5 -1
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +3 -3
  313. package/dist/TopNav/TopNav.js +32 -32
  314. package/dist/TopNav/TopNavHeading.js +67 -67
  315. package/dist/TopNav/TopNavItem.js +5 -5
  316. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  319. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  320. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  321. package/dist/TopNav/TopNavMenu.js +32 -32
  322. package/dist/TreeList/TreeList.js +8 -8
  323. package/dist/TreeList/TreeListBranches.js +11 -11
  324. package/dist/TreeList/TreeListItem.js +30 -30
  325. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  326. package/dist/Typeahead/BaseTypeahead.js +23 -20
  327. package/dist/Typeahead/Typeahead.js +12 -12
  328. package/dist/Typeahead/TypeaheadItem.js +10 -10
  329. package/dist/VStack/VStack.js +3 -3
  330. package/dist/VisuallyHidden/VisuallyHidden.d.ts +0 -3
  331. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  332. package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
  333. package/dist/astryx.css +7 -0
  334. package/dist/astryx.umd.js +63 -63
  335. package/dist/astryx.umd.js.map +4 -4
  336. package/dist/docs-types.d.ts +8 -2
  337. package/dist/docs-types.d.ts.map +1 -1
  338. package/dist/hooks/focusableSelector.d.ts +1 -1
  339. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  340. package/dist/hooks/focusableSelector.js +1 -1
  341. package/dist/hooks/index.d.ts +2 -0
  342. package/dist/hooks/index.d.ts.map +1 -1
  343. package/dist/hooks/index.js +1 -0
  344. package/dist/hooks/useFocusTrap.d.ts +3 -0
  345. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  346. package/dist/hooks/useFocusTrap.js +38 -1
  347. package/dist/hooks/useHotkeys.d.ts +51 -0
  348. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  349. package/dist/hooks/useHotkeys.js +160 -0
  350. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  351. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  352. package/dist/hooks/useInteractiveRole.js +6 -2
  353. package/dist/hooks/useKeyboardHint.js +9 -9
  354. package/dist/hooks/useStreamingText.d.ts +3 -1
  355. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  356. package/dist/hooks/useStreamingText.js +14 -5
  357. package/dist/theme/MediaTheme.js +3 -3
  358. package/dist/theme/Theme.js +7 -7
  359. package/dist/theme/defineTheme.d.ts +1 -1
  360. package/dist/theme/defineTheme.d.ts.map +1 -1
  361. package/dist/theme/expandColorScale.d.ts.map +1 -1
  362. package/dist/theme/expandColorScale.js +10 -3
  363. package/dist/theme/hct.d.ts +0 -15
  364. package/dist/theme/hct.d.ts.map +1 -1
  365. package/dist/theme/hct.js +9 -9
  366. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  367. package/dist/theme/tokens.d.ts +10 -2
  368. package/dist/theme/tokens.d.ts.map +1 -1
  369. package/dist/theme/tokens.js +220 -4
  370. package/dist/theme/useTheme.d.ts +3 -2
  371. package/dist/theme/useTheme.d.ts.map +1 -1
  372. package/dist/theme/useTheme.js +73 -6
  373. package/dist/utils/color.d.ts +42 -0
  374. package/dist/utils/color.d.ts.map +1 -0
  375. package/dist/utils/color.js +150 -0
  376. package/dist/utils/composeEventHandlers.d.ts +30 -0
  377. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  378. package/dist/utils/composeEventHandlers.js +40 -0
  379. package/dist/utils/index.d.ts +3 -0
  380. package/dist/utils/index.d.ts.map +1 -1
  381. package/dist/utils/index.js +3 -1
  382. package/dist/utils/timeParser.d.ts.map +1 -1
  383. package/dist/utils/timeParser.js +8 -5
  384. package/package.json +4 -4
  385. package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
  386. package/src/AlertDialog/AlertDialog.tsx +2 -0
  387. package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
  388. package/src/AppShell/AppShell.tsx +2 -0
  389. package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
  390. package/src/AspectRatio/AspectRatio.test.tsx +142 -1
  391. package/src/AspectRatio/AspectRatio.tsx +70 -10
  392. package/src/AspectRatio/index.ts +5 -1
  393. package/src/Avatar/Avatar.doc.mjs +11 -0
  394. package/src/Avatar/Avatar.test.tsx +32 -1
  395. package/src/Avatar/Avatar.tsx +14 -22
  396. package/src/Avatar/AvatarStatusDot.tsx +2 -2
  397. package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
  398. package/src/AvatarGroup/AvatarGroup.tsx +2 -2
  399. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
  400. package/src/Banner/Banner.doc.mjs +8 -0
  401. package/src/Banner/Banner.test.tsx +38 -0
  402. package/src/Banner/Banner.tsx +8 -1
  403. package/src/Calendar/Calendar.doc.mjs +1 -1
  404. package/src/Calendar/Calendar.test.tsx +122 -17
  405. package/src/Calendar/Calendar.tsx +26 -5
  406. package/src/Calendar/dayCellUtils.ts +3 -1
  407. package/src/Calendar/styles.ts +12 -2
  408. package/src/Card/Card.doc.mjs +1 -1
  409. package/src/Card/Card.tsx +16 -6
  410. package/src/Carousel/Carousel.doc.mjs +12 -12
  411. package/src/Carousel/Carousel.test.tsx +13 -0
  412. package/src/Carousel/Carousel.tsx +4 -2
  413. package/src/Chat/Chat.doc.mjs +1 -1
  414. package/src/Chat/ChatComposerInput.test.tsx +27 -1
  415. package/src/Chat/ChatComposerInput.tsx +20 -15
  416. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  417. package/src/Chat/ChatDictationButton.tsx +4 -4
  418. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  419. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  420. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  421. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  422. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  423. package/src/Chat/ChatSystemMessage.tsx +7 -7
  424. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  425. package/src/Chat/ChatTokenizedText.tsx +15 -8
  426. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  427. package/src/Chat/ChatToolCalls.tsx +10 -12
  428. package/src/Chat/index.ts +1 -4
  429. package/src/Chat/useTriggerMenu.tsx +1 -4
  430. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
  431. package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
  432. package/src/CheckboxInput/CheckboxInput.tsx +2 -0
  433. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  434. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  435. package/src/Citation/Citation.doc.mjs +5 -0
  436. package/src/ClickableCard/ClickableCard.tsx +45 -2
  437. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  438. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  439. package/src/CodeBlock/CodeBlock.tsx +62 -4
  440. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  441. package/src/Collapsible/Collapsible.test.tsx +403 -0
  442. package/src/Collapsible/Collapsible.tsx +85 -10
  443. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  444. package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
  445. package/src/Collapsible/CollapsibleGroup.tsx +97 -9
  446. package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
  447. package/src/Collapsible/index.ts +1 -0
  448. package/src/Collapsible/useCollapsible.ts +20 -6
  449. package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
  450. package/src/CommandPalette/CommandPalette.tsx +5 -3
  451. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  452. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  453. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  454. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  455. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  456. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  457. package/src/ContextMenu/ContextMenu.test.tsx +87 -0
  458. package/src/ContextMenu/ContextMenu.tsx +87 -28
  459. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  460. package/src/DateInput/DateInput.test.tsx +11 -20
  461. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
  462. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  463. package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
  464. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  465. package/src/DateTimeInput/DateTimeInput.tsx +8 -2
  466. package/src/DateTimeInput/index.ts +1 -0
  467. package/src/Dialog/Dialog.doc.mjs +4 -0
  468. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  469. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  470. package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
  471. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  472. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  473. package/src/Field/Field.test.tsx +1 -4
  474. package/src/Field/FieldLabel.test.tsx +2 -2
  475. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  476. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  477. package/src/Grid/Grid.test.tsx +43 -18
  478. package/src/Grid/Grid.tsx +26 -9
  479. package/src/HoverCard/HoverCard.doc.mjs +6 -6
  480. package/src/HoverCard/useHoverCard.doc.mjs +5 -5
  481. package/src/HoverCard/useHoverCard.tsx +9 -2
  482. package/src/Icon/Icon.test.tsx +41 -29
  483. package/src/Icon/Icon.tsx +6 -2
  484. package/src/InputGroup/InputGroup.doc.mjs +1 -0
  485. package/src/InputGroup/InputGroup.tsx +2 -2
  486. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  487. package/src/Item/Item.tsx +1 -1
  488. package/src/Layer/useLayer.doc.mjs +2 -2
  489. package/src/Layer/useLayer.test.tsx +221 -2
  490. package/src/Layer/useLayer.tsx +69 -30
  491. package/src/Layout/Layout.test.tsx +285 -0
  492. package/src/Layout/LayoutContent.doc.mjs +12 -0
  493. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  494. package/src/Layout/LayoutSlots.test.tsx +364 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Lightbox/useLightbox.tsx +0 -1
  499. package/src/Link/Link.tsx +0 -2
  500. package/src/Markdown/Markdown.tsx +9 -7
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/MobileNav/MobileNav.test.tsx +56 -0
  503. package/src/MobileNav/MobileNav.tsx +13 -8
  504. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  505. package/src/NumberInput/NumberInput.test.tsx +48 -3
  506. package/src/NumberInput/NumberInput.tsx +32 -15
  507. package/src/Outline/Outline.doc.mjs +2 -0
  508. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  509. package/src/OverflowList/OverflowList.test.tsx +416 -0
  510. package/src/Overlay/Overlay.doc.mjs +6 -0
  511. package/src/Overlay/Overlay.test.tsx +356 -0
  512. package/src/Overlay/useOverlay.tsx +0 -3
  513. package/src/Pagination/Pagination.test.tsx +162 -0
  514. package/src/Pagination/Pagination.tsx +80 -26
  515. package/src/Popover/Popover.doc.mjs +6 -6
  516. package/src/Popover/Popover.test.tsx +65 -0
  517. package/src/Popover/usePopover.doc.mjs +1 -1
  518. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
  522. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  523. package/src/ProgressBar/ProgressBar.tsx +12 -5
  524. package/src/RadioList/RadioList.test.tsx +19 -0
  525. package/src/RadioList/RadioListItem.tsx +9 -4
  526. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  527. package/src/Resizable/ResizeHandle.tsx +22 -4
  528. package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
  529. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  530. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  531. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  532. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  533. package/src/Selector/Selector.test.tsx +27 -1
  534. package/src/SideNav/SideNav.doc.mjs +7 -1
  535. package/src/SideNav/SideNav.test.tsx +66 -0
  536. package/src/SideNav/SideNav.tsx +6 -2
  537. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  538. package/src/SideNav/SideNavSection.tsx +6 -4
  539. package/src/SizeContext/SizeContext.test.tsx +226 -0
  540. package/src/Switch/Switch.doc.mjs +7 -7
  541. package/src/Switch/Switch.test.tsx +102 -3
  542. package/src/Switch/Switch.tsx +20 -7
  543. package/src/TabList/TabList.test.tsx +185 -1
  544. package/src/TabList/TabMenu.tsx +45 -9
  545. package/src/Table/BaseTable.tsx +13 -2
  546. package/src/Table/Table.doc.mjs +6 -1
  547. package/src/Table/Table.test.tsx +87 -0
  548. package/src/Table/TableBody.tsx +15 -2
  549. package/src/Table/TableFooter.tsx +15 -2
  550. package/src/Table/TableHeader.tsx +15 -2
  551. package/src/Table/index.ts +5 -0
  552. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  553. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  554. package/src/Table/plugins/groupedRows/index.ts +7 -0
  555. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
  556. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
  557. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  558. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  559. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
  560. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  561. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  562. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  563. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  564. package/src/Table/useTableGroupedRows.doc.mjs +71 -0
  565. package/src/TextArea/TextArea.test.tsx +3 -3
  566. package/src/TextInput/TextInput.test.tsx +3 -3
  567. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  568. package/src/Thumbnail/Thumbnail.tsx +4 -2
  569. package/src/TimeInput/TimeInput.test.tsx +37 -0
  570. package/src/TimeInput/TimeInput.tsx +11 -1
  571. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  572. package/src/Timestamp/Timestamp.test.tsx +52 -0
  573. package/src/Timestamp/Timestamp.tsx +30 -16
  574. package/src/Toast/Toast.tsx +11 -3
  575. package/src/Toast/ToastViewport.test.tsx +64 -0
  576. package/src/Toast/ToastViewport.tsx +12 -0
  577. package/src/Toast/useToast.test.tsx +258 -0
  578. package/src/Toast/useToast.tsx +41 -0
  579. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  580. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  581. package/src/Tokenizer/Tokenizer.test.tsx +54 -0
  582. package/src/Tokenizer/Tokenizer.tsx +5 -4
  583. package/src/Tooltip/Tooltip.doc.mjs +6 -6
  584. package/src/Tooltip/useTooltip.doc.mjs +5 -5
  585. package/src/Tooltip/useTooltip.tsx +12 -2
  586. package/src/TopNav/TopNav.doc.mjs +1 -1
  587. package/src/TopNav/TopNav.test.tsx +23 -7
  588. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  589. package/src/TreeList/TreeList.doc.mjs +2 -2
  590. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  591. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  592. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  593. package/src/Typeahead/Typeahead.test.tsx +45 -1
  594. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
  595. package/src/__tests__/TestIcon.tsx +26 -0
  596. package/src/__tests__/fastRoleQueries.ts +66 -0
  597. package/src/docPropReferences.test.ts +178 -0
  598. package/src/docs-types.ts +9 -1
  599. package/src/hooks/focusableSelector.ts +1 -1
  600. package/src/hooks/index.ts +3 -0
  601. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  602. package/src/hooks/useFocusTrap.test.tsx +149 -1
  603. package/src/hooks/useFocusTrap.ts +50 -1
  604. package/src/hooks/useHotkeys.doc.mjs +52 -0
  605. package/src/hooks/useHotkeys.test.ts +245 -0
  606. package/src/hooks/useHotkeys.ts +203 -0
  607. package/src/hooks/useInteractiveRole.ts +12 -4
  608. package/src/hooks/useStreamingText.test.ts +54 -19
  609. package/src/hooks/useStreamingText.ts +16 -5
  610. package/src/hooks/useTreeFocus.test.tsx +1 -3
  611. package/src/reset.css +29 -0
  612. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  613. package/src/theme/defineTheme.ts +4 -13
  614. package/src/theme/derivedVarRegistry.test.ts +2 -2
  615. package/src/theme/expandColorScale.test.ts +29 -0
  616. package/src/theme/expandColorScale.ts +11 -6
  617. package/src/theme/hct.ts +9 -17
  618. package/src/theme/themingTargets.test.ts +353 -0
  619. package/src/theme/tokens.test.ts +182 -9
  620. package/src/theme/tokens.ts +239 -4
  621. package/src/theme/useTheme.test.tsx +126 -2
  622. package/src/theme/useTheme.ts +87 -6
  623. package/src/utils/color.test.ts +133 -0
  624. package/src/utils/color.ts +148 -0
  625. package/src/utils/composeEventHandlers.test.ts +71 -0
  626. package/src/utils/composeEventHandlers.ts +44 -0
  627. package/src/utils/index.ts +4 -0
  628. package/src/utils/mergeProps.test.ts +166 -0
  629. package/src/utils/sharedResizeObserver.test.ts +2 -2
  630. package/src/utils/timeParser.test.ts +13 -0
  631. package/src/utils/timeParser.ts +8 -5
  632. package/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
  633. package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
  634. package/dist/Carousel/carousel.markers.stylex.js +0 -12
  635. package/src/Carousel/carousel.markers.stylex.ts +0 -10
@@ -0,0 +1,148 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file color.ts
5
+ * @input CSS color strings (hex, rgb()/rgba(), a small set of named colors)
6
+ * @output Shared color parsing/formatting primitives used across the design system
7
+ * @position Package utility; backs theme token resolution, HCT color math, and chart rendering
8
+ *
9
+ * A single home for the color parsers that were previously duplicated across
10
+ * the theme layer, charts, and lab. Consumers get one well-tested definition of
11
+ * "parse this color" rather than several subtly different regexes.
12
+ */
13
+
14
+ /** A color decomposed into 0-255 RGB channels and a 0-1 alpha. */
15
+ export interface RGBA {
16
+ r: number;
17
+ g: number;
18
+ b: number;
19
+ a: number;
20
+ }
21
+
22
+ /** The named colors the design system relies on in token expressions. */
23
+ const NAMED_COLORS: Record<string, RGBA> = {
24
+ transparent: {r: 0, g: 0, b: 0, a: 0},
25
+ black: {r: 0, g: 0, b: 0, a: 1},
26
+ white: {r: 255, g: 255, b: 255, a: 1},
27
+ };
28
+
29
+ const clamp = (value: number, min: number, max: number): number =>
30
+ Math.max(min, Math.min(max, value));
31
+
32
+ /** Expand a shorthand hex body (`rgb`/`rgba`) to its full form (`rrggbb`/`rrggbbaa`). */
33
+ function expandShorthand(body: string): string {
34
+ return body
35
+ .split('')
36
+ .map(c => c + c)
37
+ .join('');
38
+ }
39
+
40
+ /**
41
+ * Parse a hex color into {@link RGBA}. Accepts `#rgb`, `#rgba`, `#rrggbb`, and
42
+ * `#rrggbbaa`, with or without the leading `#`. Returns null for anything else.
43
+ */
44
+ export function parseHex(hex: string): RGBA | null {
45
+ if (typeof hex !== 'string') {
46
+ return null;
47
+ }
48
+ const body = hex.trim().replace(/^#/, '');
49
+ const normalized =
50
+ body.length === 3 || body.length === 4 ? expandShorthand(body) : body;
51
+
52
+ if (
53
+ (normalized.length !== 6 && normalized.length !== 8) ||
54
+ !/^[0-9a-fA-F]+$/.test(normalized)
55
+ ) {
56
+ return null;
57
+ }
58
+
59
+ return {
60
+ r: parseInt(normalized.slice(0, 2), 16),
61
+ g: parseInt(normalized.slice(2, 4), 16),
62
+ b: parseInt(normalized.slice(4, 6), 16),
63
+ a: normalized.length === 8 ? parseInt(normalized.slice(6, 8), 16) / 255 : 1,
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Parse an `rgb()`/`rgba()` color into {@link RGBA}. Accepts comma- or
69
+ * space-separated channels, an optional `/ alpha`, and percentage channels.
70
+ */
71
+ export function parseRgb(value: string): RGBA | null {
72
+ const open = value.indexOf('(');
73
+ if (open === -1 || !value.trim().endsWith(')')) {
74
+ return null;
75
+ }
76
+ const body = value
77
+ .slice(open + 1, value.lastIndexOf(')'))
78
+ .replace(/\//g, ' ');
79
+ const parts = body
80
+ .split(/[\s,]+/)
81
+ .map(p => p.trim())
82
+ .filter(Boolean);
83
+ if (parts.length < 3) {
84
+ return null;
85
+ }
86
+
87
+ const channel = (p: string): number => {
88
+ const n = p.endsWith('%') ? (parseFloat(p) / 100) * 255 : parseFloat(p);
89
+ return clamp(n, 0, 255);
90
+ };
91
+ const r = channel(parts[0]);
92
+ const g = channel(parts[1]);
93
+ const b = channel(parts[2]);
94
+ if ([r, g, b].some(Number.isNaN)) {
95
+ return null;
96
+ }
97
+
98
+ let a = 1;
99
+ if (parts.length >= 4) {
100
+ const raw = parts[3];
101
+ a = raw.endsWith('%') ? parseFloat(raw) / 100 : parseFloat(raw);
102
+ if (Number.isNaN(a)) {
103
+ return null;
104
+ }
105
+ a = clamp(a, 0, 1);
106
+ }
107
+ return {r, g, b, a};
108
+ }
109
+
110
+ /**
111
+ * Parse a concrete CSS color string into {@link RGBA}. Supports hex,
112
+ * `rgb()`/`rgba()`, and the named colors used in token expressions. Returns
113
+ * null for anything it can't evaluate (e.g. `var()`, `oklch()`, unknown names)
114
+ * so callers can preserve the original expression rather than guessing.
115
+ */
116
+ export function parseColor(value: string): RGBA | null {
117
+ const trimmed = value.trim();
118
+ const named = NAMED_COLORS[trimmed.toLowerCase()];
119
+ if (named) {
120
+ return {...named};
121
+ }
122
+ if (trimmed.startsWith('#')) {
123
+ return parseHex(trimmed);
124
+ }
125
+ if (/^rgba?\(/i.test(trimmed)) {
126
+ return parseRgb(trimmed);
127
+ }
128
+ return null;
129
+ }
130
+
131
+ /** Format RGB channels (0-255) as an uppercase `#RRGGBB` string. */
132
+ export function formatHex(r: number, g: number, b: number): string {
133
+ const channel = (c: number): string =>
134
+ clamp(Math.round(c), 0, 255).toString(16).padStart(2, '0').toUpperCase();
135
+ return `#${channel(r)}${channel(g)}${channel(b)}`;
136
+ }
137
+
138
+ /**
139
+ * Serialize {@link RGBA} to a compact, JS-usable CSS color: `#RRGGBB` when
140
+ * fully opaque, otherwise `rgba(r, g, b, a)`.
141
+ */
142
+ export function formatColor({r, g, b, a}: RGBA): string {
143
+ if (a >= 1) {
144
+ return formatHex(r, g, b);
145
+ }
146
+ const round = (n: number): number => clamp(Math.round(n), 0, 255);
147
+ return `rgba(${round(r)}, ${round(g)}, ${round(b)}, ${parseFloat(a.toFixed(4))})`;
148
+ }
@@ -0,0 +1,71 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it, vi} from 'vitest';
4
+ import type {SyntheticEvent} from 'react';
5
+ import {composeEventHandlers} from './composeEventHandlers';
6
+
7
+ function fakeEvent(): SyntheticEvent {
8
+ const event = {
9
+ defaultPrevented: false,
10
+ preventDefault() {
11
+ event.defaultPrevented = true;
12
+ },
13
+ };
14
+ return event as unknown as SyntheticEvent;
15
+ }
16
+
17
+ describe('composeEventHandlers', () => {
18
+ it('calls every handler in argument order', () => {
19
+ const calls: string[] = [];
20
+ const composed = composeEventHandlers(
21
+ () => calls.push('first'),
22
+ () => calls.push('second'),
23
+ );
24
+ composed(fakeEvent());
25
+ expect(calls).toEqual(['first', 'second']);
26
+ });
27
+
28
+ it('skips undefined handlers', () => {
29
+ const handler = vi.fn();
30
+ const composed = composeEventHandlers(undefined, handler, undefined);
31
+ composed(fakeEvent());
32
+ expect(handler).toHaveBeenCalledTimes(1);
33
+ });
34
+
35
+ it('passes the same event to each handler', () => {
36
+ const event = fakeEvent();
37
+ const a = vi.fn();
38
+ const b = vi.fn();
39
+ composeEventHandlers(a, b)(event);
40
+ expect(a).toHaveBeenCalledWith(event);
41
+ expect(b).toHaveBeenCalledWith(event);
42
+ });
43
+
44
+ it('stops after a handler prevents default', () => {
45
+ const first = vi.fn((e: SyntheticEvent) => e.preventDefault());
46
+ const second = vi.fn();
47
+ composeEventHandlers(first, second)(fakeEvent());
48
+ expect(first).toHaveBeenCalledTimes(1);
49
+ expect(second).not.toHaveBeenCalled();
50
+ });
51
+
52
+ it('lets a consumer handler opt out of later behavior (consumer-first order)', () => {
53
+ const consumer = vi.fn((e: SyntheticEvent) => e.preventDefault());
54
+ const ownBehavior = vi.fn();
55
+ composeEventHandlers(consumer, ownBehavior)(fakeEvent());
56
+ expect(ownBehavior).not.toHaveBeenCalled();
57
+ });
58
+
59
+ it('runs later handlers when default is not prevented', () => {
60
+ const consumer = vi.fn();
61
+ const ownBehavior = vi.fn();
62
+ composeEventHandlers(consumer, ownBehavior)(fakeEvent());
63
+ expect(ownBehavior).toHaveBeenCalledTimes(1);
64
+ });
65
+
66
+ it('returns a no-op-safe function when all handlers are undefined', () => {
67
+ expect(() =>
68
+ composeEventHandlers(undefined, undefined)(fakeEvent()),
69
+ ).not.toThrow();
70
+ });
71
+ });
@@ -0,0 +1,44 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file composeEventHandlers.ts
5
+ * @input Multiple React event handlers (or undefined)
6
+ * @output A single handler that calls each in order, stopping if one prevents default
7
+ * @position Utility; used by components that own an interaction (a click that
8
+ * selects, a keydown that drives arrow navigation) but also accept a consumer
9
+ * handler for the same event through {...rest}. Composes them instead of
10
+ * letting one clobber the other.
11
+ *
12
+ * Order is call order: the first argument runs first. Put the consumer handler
13
+ * first so it can opt out of the component's built-in behavior via
14
+ * `event.preventDefault()`; put the component's handler first when its behavior
15
+ * must always run regardless of the consumer.
16
+ */
17
+
18
+ import type {SyntheticEvent} from 'react';
19
+
20
+ /**
21
+ * Compose event handlers into one. Each handler runs in argument order; if any
22
+ * calls `event.preventDefault()`, the remaining handlers are skipped.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * // Consumer first: a consumer onClick can preventDefault to block selection.
27
+ * <button onClick={composeEventHandlers(onClickProp, handleSelect)} />
28
+ *
29
+ * // Component first: built-in keyboard nav always runs.
30
+ * <div onKeyDown={composeEventHandlers(handleArrowKeys, onKeyDownProp)} />
31
+ * ```
32
+ */
33
+ export function composeEventHandlers<E extends SyntheticEvent>(
34
+ ...handlers: (((event: E) => void) | undefined)[]
35
+ ): (event: E) => void {
36
+ return (event: E) => {
37
+ for (const handler of handlers) {
38
+ handler?.(event);
39
+ if (event.defaultPrevented) {
40
+ return;
41
+ }
42
+ }
43
+ };
44
+ }
@@ -68,6 +68,7 @@ export {getKey, type Key, type KeyFallback} from './getKey';
68
68
 
69
69
  export {mergeProps} from './mergeProps';
70
70
  export {mergeRefs} from './mergeRefs';
71
+ export {composeEventHandlers} from './composeEventHandlers';
71
72
  export {themeProps, themeDataAttributes} from './themeProps';
72
73
  export type {
73
74
  ClassValue,
@@ -81,3 +82,6 @@ export {observeResize, unobserveResize} from './sharedResizeObserver';
81
82
  export {isRenderable} from './isRenderable';
82
83
  export {getInputARIA} from './inputAria';
83
84
  export type {InputARIA, InputARIAInputGroup} from './inputAria';
85
+
86
+ export {parseHex, parseRgb, parseColor, formatHex, formatColor} from './color';
87
+ export type {RGBA} from './color';
@@ -0,0 +1,166 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import {mergeProps} from './mergeProps';
5
+
6
+ describe('mergeProps', () => {
7
+ describe('string-first form (xdsClass, stylexResult, className?, style?)', () => {
8
+ it('returns the xds class alone when the stylex result has no class', () => {
9
+ expect(mergeProps('astryx-button', {className: ''})).toEqual({
10
+ className: 'astryx-button',
11
+ style: undefined,
12
+ });
13
+ });
14
+
15
+ it('prefixes the xds class before the stylex class name', () => {
16
+ expect(mergeProps('astryx-button', {className: 'x1 x2'})).toEqual({
17
+ className: 'astryx-button x1 x2',
18
+ style: undefined,
19
+ });
20
+ });
21
+
22
+ it('appends a consumer className after the stylex classes', () => {
23
+ expect(
24
+ mergeProps('astryx-button', {className: 'x1'}, 'consumer'),
25
+ ).toEqual({
26
+ className: 'astryx-button x1 consumer',
27
+ style: undefined,
28
+ });
29
+ });
30
+
31
+ it('omits the consumer className when it is falsy', () => {
32
+ expect(mergeProps('astryx-button', {className: 'x1'}, undefined)).toEqual(
33
+ {
34
+ className: 'astryx-button x1',
35
+ style: undefined,
36
+ },
37
+ );
38
+ expect(mergeProps('astryx-button', {className: 'x1'}, '')).toEqual({
39
+ className: 'astryx-button x1',
40
+ style: undefined,
41
+ });
42
+ });
43
+
44
+ it('defaults the stylex result to an empty class when omitted', () => {
45
+ expect(mergeProps('astryx-button')).toEqual({
46
+ className: 'astryx-button',
47
+ style: undefined,
48
+ });
49
+ });
50
+
51
+ it('lets the consumer style override the stylex style key-by-key', () => {
52
+ const result = mergeProps(
53
+ 'astryx-button',
54
+ {className: 'x1', style: {color: 'red', margin: 0}},
55
+ undefined,
56
+ {color: 'blue'},
57
+ );
58
+ expect(result.style).toEqual({color: 'blue', margin: 0});
59
+ });
60
+
61
+ it('uses only the stylex style when no consumer style is given', () => {
62
+ const result = mergeProps('astryx-button', {
63
+ className: 'x1',
64
+ style: {color: 'red'},
65
+ });
66
+ expect(result.style).toEqual({color: 'red'});
67
+ });
68
+
69
+ it('uses only the consumer style when the stylex result has none', () => {
70
+ const result = mergeProps('astryx-button', {className: 'x1'}, undefined, {
71
+ color: 'blue',
72
+ });
73
+ expect(result.style).toEqual({color: 'blue'});
74
+ });
75
+
76
+ it('preserves extra keys from the stylex result via spread', () => {
77
+ const result = mergeProps('astryx-button', {
78
+ className: 'x1',
79
+ 'data-style-src': 'stylex',
80
+ });
81
+ expect(result['data-style-src']).toBe('stylex');
82
+ });
83
+ });
84
+
85
+ describe('object-first form (arbitrary prop merge)', () => {
86
+ it('space-joins class names from both objects', () => {
87
+ expect(mergeProps({className: 'a'}, {className: 'b'})).toEqual({
88
+ className: 'a b',
89
+ });
90
+ });
91
+
92
+ it('keeps the single class name when only one side has one', () => {
93
+ expect(mergeProps({className: 'a'}, {})).toEqual({className: 'a'});
94
+ expect(mergeProps({}, {className: 'b'})).toEqual({className: 'b'});
95
+ });
96
+
97
+ it('drops className entirely when neither side has one', () => {
98
+ const result = mergeProps({id: 'x'}, {role: 'button'});
99
+ expect('className' in result).toBe(false);
100
+ expect(result).toEqual({id: 'x', role: 'button'});
101
+ });
102
+
103
+ it('lets override props win over base props', () => {
104
+ expect(mergeProps({role: 'button', id: 'a'}, {id: 'b'})).toEqual({
105
+ role: 'button',
106
+ id: 'b',
107
+ });
108
+ });
109
+
110
+ it('merges styles with the override winning per key', () => {
111
+ const result = mergeProps(
112
+ {style: {color: 'red', margin: 0}},
113
+ {style: {color: 'green'}},
114
+ );
115
+ expect(result.style).toEqual({color: 'green', margin: 0});
116
+ });
117
+
118
+ it('drops style entirely when neither side has one', () => {
119
+ const result = mergeProps({id: 'x'}, {id: 'y'});
120
+ expect('style' in result).toBe(false);
121
+ });
122
+
123
+ it('treats a string third argument as an appended className', () => {
124
+ expect(mergeProps({className: 'a'}, {className: 'b'}, 'c')).toEqual({
125
+ className: 'a b c',
126
+ });
127
+ });
128
+
129
+ it('treats an object third argument as a style', () => {
130
+ const result = mergeProps({className: 'a'}, {}, {color: 'red'});
131
+ expect(result).toEqual({className: 'a', style: {color: 'red'}});
132
+ });
133
+
134
+ it('applies the fourth argument as an overriding style', () => {
135
+ const result = mergeProps({style: {color: 'red'}}, {}, undefined, {
136
+ color: 'blue',
137
+ });
138
+ expect(result.style).toEqual({color: 'blue'});
139
+ });
140
+
141
+ it('accepts a string second argument as a className', () => {
142
+ expect(mergeProps({className: 'a'}, 'b')).toEqual({className: 'a b'});
143
+ });
144
+
145
+ it('merges arbitrary data attributes, override winning', () => {
146
+ const result = mergeProps(
147
+ {'data-variant': 'primary', 'data-size': 'md'},
148
+ {'data-size': 'lg'},
149
+ );
150
+ expect(result).toEqual({'data-variant': 'primary', 'data-size': 'lg'});
151
+ });
152
+
153
+ it('does not mutate the input objects', () => {
154
+ const base = {className: 'a', style: {color: 'red'}};
155
+ const overrides = {className: 'b', style: {color: 'blue'}};
156
+ mergeProps(base, overrides);
157
+ expect(base).toEqual({className: 'a', style: {color: 'red'}});
158
+ expect(overrides).toEqual({className: 'b', style: {color: 'blue'}});
159
+ });
160
+
161
+ it('ignores a null third argument (no style, no class added)', () => {
162
+ const result = mergeProps({className: 'a'}, {className: 'b'}, undefined);
163
+ expect(result).toEqual({className: 'a b'});
164
+ });
165
+ });
166
+ });
@@ -15,7 +15,7 @@ describe('sharedResizeObserver', () => {
15
15
  mockDisconnect = vi.fn();
16
16
  constructorCalls = 0;
17
17
 
18
- global.ResizeObserver = vi.fn((cb: ResizeObserverCallback) => {
18
+ global.ResizeObserver = vi.fn(function (cb: ResizeObserverCallback) {
19
19
  constructorCalls++;
20
20
  capturedCallback = cb;
21
21
  return {
@@ -23,7 +23,7 @@ describe('sharedResizeObserver', () => {
23
23
  unobserve: mockUnobserve,
24
24
  disconnect: mockDisconnect,
25
25
  };
26
- });
26
+ }) as unknown as typeof ResizeObserver;
27
27
  });
28
28
 
29
29
  afterEach(() => {
@@ -249,6 +249,19 @@ describe('isTimeInRange', () => {
249
249
  });
250
250
 
251
251
  describe('adjustTime', () => {
252
+ it('returns the input unchanged for non-finite deltas', () => {
253
+ // -Infinity previously spun the wrap-around loop forever;
254
+ // NaN previously produced the corrupt string "NaN:NaN".
255
+ expect(adjustTime('10:00' as ISOTimeString, -Infinity)).toBe('10:00');
256
+ expect(adjustTime('10:00' as ISOTimeString, Infinity)).toBe('10:00');
257
+ expect(adjustTime('10:00' as ISOTimeString, NaN)).toBe('10:00');
258
+ });
259
+
260
+ it('wraps large negative deltas in constant time', () => {
261
+ expect(adjustTime('10:00' as ISOTimeString, -1440 * 1e7)).toBe('10:00');
262
+ expect(adjustTime('10:00' as ISOTimeString, -1440 * 1e7 - 30)).toBe('09:30');
263
+ });
264
+
252
265
  it('adds minutes', () => {
253
266
  expect(adjustTime('14:30' as ISOTimeString, 15)).toBe('14:45');
254
267
  expect(adjustTime('14:30' as ISOTimeString, 30)).toBe('15:00');
@@ -361,13 +361,16 @@ export function adjustTime(
361
361
  return time;
362
362
  }
363
363
 
364
+ // A non-finite delta would spin the wrap-around forever (-Infinity) or
365
+ // produce "NaN:NaN" (NaN) — return the input unchanged instead.
366
+ if (!Number.isFinite(deltaMinutes)) {
367
+ return time;
368
+ }
369
+
364
370
  let totalMinutes = parsed.hour * 60 + parsed.minute + deltaMinutes;
365
371
 
366
- // Wrap around midnight
367
- while (totalMinutes < 0) {
368
- totalMinutes += 24 * 60;
369
- }
370
- totalMinutes = totalMinutes % (24 * 60);
372
+ // Wrap around midnight (double-modulo handles negatives in O(1))
373
+ totalMinutes = ((totalMinutes % (24 * 60)) + 24 * 60) % (24 * 60);
371
374
 
372
375
  const newHour = Math.floor(totalMinutes / 60);
373
376
  const newMinute = totalMinutes % 60;
@@ -1,7 +0,0 @@
1
- import * as stylex from '@stylexjs/stylex';
2
- /**
3
- * Scoped marker for Carousel ancestor selectors.
4
- * Prevents hover styles from leaking from parent containers.
5
- */
6
- export declare const carouselScope: ReturnType<typeof stylex.defineMarker>;
7
- //# sourceMappingURL=carousel.markers.stylex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"carousel.markers.stylex.d.ts","sourceRoot":"","sources":["../../src/Carousel/carousel.markers.stylex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,YAAY,CAC1C,CAAC"}
@@ -1,12 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- import * as stylex from '@stylexjs/stylex';
4
-
5
- /**
6
- * Scoped marker for Carousel ancestor selectors.
7
- * Prevents hover styles from leaking from parent containers.
8
- */
9
- export const carouselScope = {
10
- xrkij8s: "xrkij8s",
11
- $$css: true
12
- };
@@ -1,10 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- import * as stylex from '@stylexjs/stylex';
4
-
5
- /**
6
- * Scoped marker for Carousel ancestor selectors.
7
- * Prevents hover styles from leaking from parent containers.
8
- */
9
- export const carouselScope: ReturnType<typeof stylex.defineMarker> =
10
- stylex.defineMarker();