@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
@@ -1,245 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- /**
4
- * @file useHotkeys.test.ts
5
- * @input Uses vitest, @testing-library/react, useHotkeys hook
6
- * @output Unit tests for useHotkeys hook
7
- * @position Testing; validates useHotkeys.ts implementation
8
- *
9
- * SYNC: When useHotkeys.ts changes, update tests to match new behavior
10
- */
11
-
12
- import {describe, it, expect, vi, afterEach} from 'vitest';
13
- import {renderHook} from '@testing-library/react';
14
- import {useHotkeys, type Hotkey} from './useHotkeys';
15
-
16
- function stubApplePlatform() {
17
- // jsdom's navigator has no userAgentData; platform drives detection.
18
- vi.stubGlobal('navigator', {platform: 'MacIntel'});
19
- }
20
-
21
- function stubOtherPlatform() {
22
- vi.stubGlobal('navigator', {platform: 'Win32'});
23
- }
24
-
25
- function press(
26
- key: string,
27
- init: KeyboardEventInit & {target?: HTMLElement} = {},
28
- ): KeyboardEvent {
29
- const {target, ...eventInit} = init;
30
- const event = new KeyboardEvent('keydown', {
31
- key,
32
- bubbles: true,
33
- cancelable: true,
34
- ...eventInit,
35
- });
36
- (target ?? window).dispatchEvent(event);
37
- return event;
38
- }
39
-
40
- afterEach(() => {
41
- vi.unstubAllGlobals();
42
- vi.restoreAllMocks();
43
- document.body.innerHTML = '';
44
- });
45
-
46
- describe('useHotkeys', () => {
47
- it('fires on mod+k via metaKey on Apple platforms', () => {
48
- stubApplePlatform();
49
- const onPress = vi.fn();
50
- renderHook(() => useHotkeys([{keys: 'mod+k', onPress}]));
51
-
52
- const event = press('k', {metaKey: true});
53
- expect(onPress).toHaveBeenCalledTimes(1);
54
- expect(onPress).toHaveBeenCalledWith(event);
55
- expect(event.defaultPrevented).toBe(true);
56
- });
57
-
58
- it('maps mod to ctrlKey on non-Apple platforms', () => {
59
- stubOtherPlatform();
60
- const onPress = vi.fn();
61
- renderHook(() => useHotkeys([{keys: 'mod+k', onPress}]));
62
-
63
- press('k', {metaKey: true});
64
- expect(onPress).not.toHaveBeenCalled();
65
-
66
- press('k', {ctrlKey: true});
67
- expect(onPress).toHaveBeenCalledTimes(1);
68
- });
69
-
70
- it('does not fire a bare key when modifiers are held', () => {
71
- stubApplePlatform();
72
- const onPress = vi.fn();
73
- renderHook(() => useHotkeys([{keys: 'k', onPress}]));
74
-
75
- press('k', {metaKey: true});
76
- press('k', {ctrlKey: true});
77
- press('k', {altKey: true});
78
- expect(onPress).not.toHaveBeenCalled();
79
-
80
- press('k');
81
- expect(onPress).toHaveBeenCalledTimes(1);
82
- });
83
-
84
- it('matches named keys: escape, enter, space, arrows', () => {
85
- stubApplePlatform();
86
- const onEscape = vi.fn();
87
- const onEnter = vi.fn();
88
- const onSpace = vi.fn();
89
- const onDown = vi.fn();
90
- renderHook(() =>
91
- useHotkeys([
92
- {keys: 'escape', onPress: onEscape},
93
- {keys: 'enter', onPress: onEnter},
94
- {keys: 'space', onPress: onSpace},
95
- {keys: 'down', onPress: onDown},
96
- ]),
97
- );
98
-
99
- press('Escape');
100
- press('Enter');
101
- press(' ');
102
- press('ArrowDown');
103
- expect(onEscape).toHaveBeenCalledTimes(1);
104
- expect(onEnter).toHaveBeenCalledTimes(1);
105
- expect(onSpace).toHaveBeenCalledTimes(1);
106
- expect(onDown).toHaveBeenCalledTimes(1);
107
- });
108
-
109
- it('requires shift when specified and ignores shift otherwise', () => {
110
- stubApplePlatform();
111
- const onSlash = vi.fn();
112
- const onLetter = vi.fn();
113
- renderHook(() =>
114
- useHotkeys([
115
- {keys: 'shift+/', onPress: onSlash},
116
- {keys: 'c', onPress: onLetter},
117
- ]),
118
- );
119
-
120
- press('/');
121
- expect(onSlash).not.toHaveBeenCalled();
122
- press('/', {shiftKey: true});
123
- expect(onSlash).toHaveBeenCalledTimes(1);
124
-
125
- // Shift not specified → matches regardless of shift state.
126
- press('C', {shiftKey: true});
127
- press('c');
128
- expect(onLetter).toHaveBeenCalledTimes(2);
129
- });
130
-
131
- it('skips typing targets by default', () => {
132
- stubApplePlatform();
133
- const onPress = vi.fn();
134
- renderHook(() => useHotkeys([{keys: 'mod+k', onPress}]));
135
-
136
- const input = document.createElement('input');
137
- document.body.appendChild(input);
138
- press('k', {metaKey: true, target: input});
139
- expect(onPress).not.toHaveBeenCalled();
140
-
141
- const textarea = document.createElement('textarea');
142
- document.body.appendChild(textarea);
143
- press('k', {metaKey: true, target: textarea});
144
- expect(onPress).not.toHaveBeenCalled();
145
- });
146
-
147
- it('fires in typing targets when allowInInputs is true', () => {
148
- stubApplePlatform();
149
- const onPress = vi.fn();
150
- renderHook(() =>
151
- useHotkeys([{keys: 'escape', onPress, allowInInputs: true}]),
152
- );
153
-
154
- const input = document.createElement('input');
155
- document.body.appendChild(input);
156
- press('Escape', {target: input});
157
- expect(onPress).toHaveBeenCalledTimes(1);
158
- });
159
-
160
- it('respects isDisabled', () => {
161
- stubApplePlatform();
162
- const onPress = vi.fn();
163
- const {rerender} = renderHook(
164
- ({isDisabled}: {isDisabled: boolean}) =>
165
- useHotkeys([{keys: 'mod+k', onPress, isDisabled}]),
166
- {initialProps: {isDisabled: true}},
167
- );
168
-
169
- press('k', {metaKey: true});
170
- expect(onPress).not.toHaveBeenCalled();
171
-
172
- rerender({isDisabled: false});
173
- press('k', {metaKey: true});
174
- expect(onPress).toHaveBeenCalledTimes(1);
175
- });
176
-
177
- it('skips events that are already defaultPrevented', () => {
178
- stubApplePlatform();
179
- const onPress = vi.fn();
180
- renderHook(() => useHotkeys([{keys: 'mod+k', onPress}]));
181
-
182
- const event = new KeyboardEvent('keydown', {
183
- key: 'k',
184
- metaKey: true,
185
- bubbles: true,
186
- cancelable: true,
187
- });
188
- event.preventDefault();
189
- window.dispatchEvent(event);
190
- expect(onPress).not.toHaveBeenCalled();
191
- });
192
-
193
- it('unsubscribes on unmount', () => {
194
- stubApplePlatform();
195
- const onPress = vi.fn();
196
- const removeSpy = vi.spyOn(window, 'removeEventListener');
197
- const {unmount} = renderHook(() => useHotkeys([{keys: 'mod+k', onPress}]));
198
-
199
- unmount();
200
- expect(removeSpy).toHaveBeenCalledWith('keydown', expect.any(Function));
201
-
202
- press('k', {metaKey: true});
203
- expect(onPress).not.toHaveBeenCalled();
204
- });
205
-
206
- it('does not re-subscribe on re-render, but uses latest handlers', () => {
207
- stubApplePlatform();
208
- const addSpy = vi.spyOn(window, 'addEventListener');
209
- const first = vi.fn();
210
- const second = vi.fn();
211
-
212
- const {rerender} = renderHook(
213
- ({hotkeys}: {hotkeys: Hotkey[]}) => useHotkeys(hotkeys),
214
- {initialProps: {hotkeys: [{keys: 'mod+k', onPress: first}]}},
215
- );
216
-
217
- const keydownSubscriptions = () =>
218
- addSpy.mock.calls.filter(([type]) => type === 'keydown').length;
219
- const initialCount = keydownSubscriptions();
220
-
221
- rerender({hotkeys: [{keys: 'mod+k', onPress: second}]});
222
- rerender({hotkeys: [{keys: 'mod+k', onPress: second}]});
223
- expect(keydownSubscriptions()).toBe(initialCount);
224
-
225
- press('k', {metaKey: true});
226
- expect(first).not.toHaveBeenCalled();
227
- expect(second).toHaveBeenCalledTimes(1);
228
- });
229
-
230
- it('only fires the first matching hotkey per event', () => {
231
- stubApplePlatform();
232
- const first = vi.fn();
233
- const second = vi.fn();
234
- renderHook(() =>
235
- useHotkeys([
236
- {keys: 'mod+k', onPress: first},
237
- {keys: 'mod+k', onPress: second},
238
- ]),
239
- );
240
-
241
- press('k', {metaKey: true});
242
- expect(first).toHaveBeenCalledTimes(1);
243
- expect(second).not.toHaveBeenCalled();
244
- });
245
- });
@@ -1,203 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- 'use client';
4
-
5
- /**
6
- * @file useHotkeys.ts
7
- * @input Uses React useEffect, useRef
8
- * @output Exports useHotkeys hook and Hotkey interface for global keyboard shortcuts
9
- * @position Core hook; used by consumers for app-level keyboard shortcuts
10
- *
11
- * Registers a single window keydown listener per hook instance. Handlers
12
- * are kept in a ref so re-renders never re-subscribe (subscribe once on
13
- * mount, unsubscribe on unmount). SSR-safe — window is only touched
14
- * inside the effect.
15
- *
16
- * Skips events that are already handled (defaultPrevented) and events
17
- * targeting typing surfaces (input, textarea, select, contenteditable)
18
- * unless a hotkey opts in via `allowInInputs`.
19
- *
20
- * Platform-aware: `mod` maps to metaKey (⌘) on Apple platforms and
21
- * ctrlKey elsewhere — mirrors the detection used by Kbd.
22
- *
23
- * SYNC: When modified, update:
24
- * - /packages/core/src/hooks/index.ts
25
- * - /packages/core/src/hooks/useHotkeys.doc.mjs
26
- */
27
-
28
- import {useEffect, useRef} from 'react';
29
-
30
- /**
31
- * A single keyboard shortcut registration.
32
- */
33
- export interface Hotkey {
34
- /**
35
- * Key combo, e.g. 'mod+k', 'shift+/', 'c', 'escape'.
36
- * 'mod' = ⌘ on macOS, Ctrl elsewhere.
37
- *
38
- * Format: '+'-separated modifiers (mod, ctrl, meta, shift, alt) followed
39
- * by a final key compared case-insensitively against event.key.
40
- * Named keys: 'escape', 'enter', 'space', 'up', 'down', 'left', 'right'
41
- * (arrow names map to ArrowUp/ArrowDown/ArrowLeft/ArrowRight).
42
- * Use 'plus' for a literal '+' key.
43
- *
44
- * Shift semantics: when 'shift' is not specified, shift state is ignored,
45
- * so single letters match regardless of shift. When 'shift' is specified,
46
- * shiftKey must be pressed and the final key is still compared against
47
- * event.key — for punctuation that shift transforms (e.g. shift+/ produces
48
- * '?' on US layouts), prefer registering the produced character instead.
49
- */
50
- keys: string;
51
- /** Called when the combo matches. The event has preventDefault() applied. */
52
- onPress: (event: KeyboardEvent) => void;
53
- /**
54
- * Fire even when focus is in an input/textarea/select/contenteditable.
55
- * @default false
56
- */
57
- allowInInputs?: boolean;
58
- /** Temporarily disable this hotkey without unregistering it. */
59
- isDisabled?: boolean;
60
- }
61
-
62
- /** Aliases for the final key of a combo, normalized to event.key values. */
63
- const KEY_ALIASES: Record<string, string> = {
64
- esc: 'escape',
65
- space: ' ',
66
- up: 'arrowup',
67
- down: 'arrowdown',
68
- left: 'arrowleft',
69
- right: 'arrowright',
70
- return: 'enter',
71
- plus: '+',
72
- };
73
-
74
- /**
75
- * Detects whether the current platform is macOS/iOS.
76
- * Prefers the User-Agent Client Hints API when available (modern Chrome/Edge),
77
- * falls back to navigator.platform (deprecated but universally supported).
78
- * Mirrors the detection used by Kbd so displayed and handled shortcuts agree.
79
- */
80
- function isApplePlatform(): boolean {
81
- if (typeof navigator === 'undefined') {
82
- return false;
83
- }
84
- const uaData = 'userAgentData' in navigator ? navigator.userAgentData : null;
85
- if (uaData && typeof uaData === 'object' && 'platform' in uaData) {
86
- return /mac/i.test((uaData as {platform: string}).platform ?? '');
87
- }
88
- return /Mac|iPhone|iPad|iPod/.test(navigator.platform ?? '');
89
- }
90
-
91
- /**
92
- * Whether the event target is a typing surface where global shortcuts
93
- * should stay silent by default.
94
- */
95
- function isTypingTarget(target: EventTarget | null): boolean {
96
- if (!(target instanceof HTMLElement)) {
97
- return false;
98
- }
99
- if (target.isContentEditable) {
100
- return true;
101
- }
102
- const tag = target.tagName;
103
- return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';
104
- }
105
-
106
- /**
107
- * Whether a keydown event matches a '+'-separated combo string.
108
- */
109
- function matchesCombo(
110
- keys: string,
111
- event: KeyboardEvent,
112
- isApple: boolean,
113
- ): boolean {
114
- const parts = keys
115
- .toLowerCase()
116
- .split('+')
117
- .map(part => part.trim())
118
- .filter(Boolean);
119
- if (parts.length === 0) {
120
- return false;
121
- }
122
-
123
- const key = parts[parts.length - 1];
124
- const mods = new Set(parts.slice(0, -1));
125
-
126
- const wantsMod = mods.has('mod');
127
- const wantsCtrl = mods.has('ctrl') || (wantsMod && !isApple);
128
- const wantsMeta = mods.has('meta') || (wantsMod && isApple);
129
- const wantsAlt = mods.has('alt');
130
- const wantsShift = mods.has('shift');
131
-
132
- // Non-shift modifiers must match exactly so 'k' doesn't fire on 'mod+k'.
133
- if (event.ctrlKey !== wantsCtrl) {
134
- return false;
135
- }
136
- if (event.metaKey !== wantsMeta) {
137
- return false;
138
- }
139
- if (event.altKey !== wantsAlt) {
140
- return false;
141
- }
142
- // Shift is only enforced when specified — see Hotkey.keys docs.
143
- if (wantsShift && !event.shiftKey) {
144
- return false;
145
- }
146
-
147
- const expected = KEY_ALIASES[key] ?? key;
148
- return event.key.toLowerCase() === expected;
149
- }
150
-
151
- /**
152
- * Registers global keyboard shortcuts on window.
153
- *
154
- * A single keydown listener is attached per hook instance; the hotkey
155
- * definitions live in a ref, so re-renders update behavior without
156
- * re-subscribing. First matching hotkey wins per event.
157
- *
158
- * @param hotkeys - Shortcut registrations to listen for.
159
- *
160
- * @example
161
- * ```
162
- * useHotkeys([
163
- * { keys: 'mod+k', onPress: () => openCommandPalette() },
164
- * { keys: 'escape', onPress: () => closePanel(), allowInInputs: true },
165
- * { keys: 'c', onPress: () => compose(), isDisabled: isModalOpen },
166
- * ]);
167
- * ```
168
- */
169
- export function useHotkeys(hotkeys: Hotkey[]): void {
170
- const hotkeysRef = useRef(hotkeys);
171
-
172
- // Keep the latest definitions available to the stable listener.
173
- useEffect(() => {
174
- hotkeysRef.current = hotkeys;
175
- });
176
-
177
- useEffect(() => {
178
- const isApple = isApplePlatform();
179
-
180
- const handleKeyDown = (event: KeyboardEvent) => {
181
- if (event.defaultPrevented) {
182
- return;
183
- }
184
- const isTyping = isTypingTarget(event.target);
185
- for (const hotkey of hotkeysRef.current) {
186
- if (hotkey.isDisabled) {
187
- continue;
188
- }
189
- if (isTyping && !hotkey.allowInInputs) {
190
- continue;
191
- }
192
- if (matchesCombo(hotkey.keys, event, isApple)) {
193
- event.preventDefault();
194
- hotkey.onPress(event);
195
- return;
196
- }
197
- }
198
- };
199
-
200
- window.addEventListener('keydown', handleKeyDown);
201
- return () => window.removeEventListener('keydown', handleKeyDown);
202
- }, []);
203
- }
@@ -1,133 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- import {describe, expect, it} from 'vitest';
4
- import {parseHex, parseRgb, parseColor, formatHex, formatColor} from './color';
5
-
6
- describe('parseHex', () => {
7
- it('parses #rrggbb', () => {
8
- expect(parseHex('#0064E0')).toEqual({r: 0, g: 100, b: 224, a: 1});
9
- });
10
-
11
- it('parses without a leading #', () => {
12
- expect(parseHex('0064E0')).toEqual({r: 0, g: 100, b: 224, a: 1});
13
- });
14
-
15
- it('expands #rgb shorthand', () => {
16
- expect(parseHex('#abc')).toEqual({r: 0xaa, g: 0xbb, b: 0xcc, a: 1});
17
- });
18
-
19
- it('parses #rrggbbaa alpha', () => {
20
- expect(parseHex('#00000080')).toEqual({r: 0, g: 0, b: 0, a: 128 / 255});
21
- });
22
-
23
- it('expands #rgba shorthand alpha', () => {
24
- expect(parseHex('#f008')).toEqual({
25
- r: 0xff,
26
- g: 0,
27
- b: 0,
28
- a: 0x88 / 255,
29
- });
30
- });
31
-
32
- it('returns null for non-hex input', () => {
33
- expect(parseHex('rgb(0,0,0)')).toBeNull();
34
- expect(parseHex('#12')).toBeNull();
35
- expect(parseHex('#zzzzzz')).toBeNull();
36
- // @ts-expect-error runtime guard for non-string input
37
- expect(parseHex(null)).toBeNull();
38
- });
39
- });
40
-
41
- describe('parseRgb', () => {
42
- it('parses comma-separated rgb()', () => {
43
- expect(parseRgb('rgb(0, 100, 224)')).toEqual({
44
- r: 0,
45
- g: 100,
46
- b: 224,
47
- a: 1,
48
- });
49
- });
50
-
51
- it('parses rgba() with alpha', () => {
52
- expect(parseRgb('rgba(0, 0, 0, 0.5)')).toEqual({r: 0, g: 0, b: 0, a: 0.5});
53
- });
54
-
55
- it('parses space-separated with slash alpha', () => {
56
- expect(parseRgb('rgb(0 100 224 / 0.25)')).toEqual({
57
- r: 0,
58
- g: 100,
59
- b: 224,
60
- a: 0.25,
61
- });
62
- });
63
-
64
- it('parses percentage channels', () => {
65
- expect(parseRgb('rgb(100%, 0%, 0%)')).toEqual({
66
- r: 255,
67
- g: 0,
68
- b: 0,
69
- a: 1,
70
- });
71
- });
72
-
73
- it('clamps alpha and channels into range', () => {
74
- expect(parseRgb('rgba(300, -20, 10, 2)')).toEqual({
75
- r: 255,
76
- g: 0,
77
- b: 10,
78
- a: 1,
79
- });
80
- });
81
-
82
- it('returns null when it cannot parse', () => {
83
- expect(parseRgb('rgb(0, 0)')).toBeNull();
84
- expect(parseRgb('#000000')).toBeNull();
85
- });
86
- });
87
-
88
- describe('parseColor', () => {
89
- it('routes hex and rgb strings to the right parser', () => {
90
- expect(parseColor('#FFFFFF')).toEqual({r: 255, g: 255, b: 255, a: 1});
91
- expect(parseColor('rgb(1, 2, 3)')).toEqual({r: 1, g: 2, b: 3, a: 1});
92
- });
93
-
94
- it('resolves the named colors used in token expressions', () => {
95
- expect(parseColor('transparent')).toEqual({r: 0, g: 0, b: 0, a: 0});
96
- expect(parseColor('BLACK')).toEqual({r: 0, g: 0, b: 0, a: 1});
97
- expect(parseColor('white')).toEqual({r: 255, g: 255, b: 255, a: 1});
98
- });
99
-
100
- it('returns null for unsupported colors so callers can preserve them', () => {
101
- expect(parseColor('var(--color-accent)')).toBeNull();
102
- expect(parseColor('oklch(0.5 0.1 200)')).toBeNull();
103
- expect(parseColor('rebeccapurple')).toBeNull();
104
- });
105
- });
106
-
107
- describe('formatHex', () => {
108
- it('formats channels as uppercase #RRGGBB', () => {
109
- expect(formatHex(0, 100, 224)).toBe('#0064E0');
110
- });
111
-
112
- it('rounds and clamps out-of-range channels', () => {
113
- expect(formatHex(-5, 300, 127.6)).toBe('#00FF80');
114
- });
115
- });
116
-
117
- describe('formatColor', () => {
118
- it('formats opaque colors as hex', () => {
119
- expect(formatColor({r: 0, g: 100, b: 224, a: 1})).toBe('#0064E0');
120
- });
121
-
122
- it('formats translucent colors as rgba()', () => {
123
- expect(formatColor({r: 0, g: 100, b: 224, a: 0.2})).toBe(
124
- 'rgba(0, 100, 224, 0.2)',
125
- );
126
- });
127
-
128
- it('round-trips through parseColor', () => {
129
- const parsed = parseColor('rgba(10, 20, 30, 0.5)');
130
- expect(parsed).not.toBeNull();
131
- expect(formatColor(parsed!)).toBe('rgba(10, 20, 30, 0.5)');
132
- });
133
- });