@astryxdesign/core 0.4.6 → 0.4.7-canary.20bae6c

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 (377) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +3 -2
  4. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  5. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  6. package/dist/AspectRatio/AspectRatio.js +23 -4
  7. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  8. package/dist/AvatarGroup/AvatarGroup.js +3 -2
  9. package/dist/BottomSheet/BottomSheet.d.ts +1 -0
  10. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  11. package/dist/BottomSheet/BottomSheet.js +54 -15
  12. package/dist/BottomSheet/BottomSheetEdgeTint.d.ts +6 -0
  13. package/dist/BottomSheet/BottomSheetEdgeTint.d.ts.map +1 -0
  14. package/dist/BottomSheet/BottomSheetEdgeTint.js +62 -0
  15. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  16. package/dist/BottomSheet/BottomSheetPanel.js +1 -0
  17. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +1 -0
  18. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  19. package/dist/BottomSheet/BottomSheetSwitcher.js +13 -6
  20. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  21. package/dist/BottomSheet/useSheetGestures.js +23 -5
  22. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  23. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  24. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  25. package/dist/ButtonGroup/ButtonGroup.js +12 -4
  26. package/dist/Calendar/Calendar.d.ts +3 -1
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +13 -14
  29. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  30. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  31. package/dist/Calendar/getInitialFocusDate.js +62 -0
  32. package/dist/Carousel/Carousel.d.ts.map +1 -1
  33. package/dist/Carousel/Carousel.js +3 -3
  34. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  35. package/dist/Chat/ChatLayout.js +3 -3
  36. package/dist/Chat/ChatMessageList.d.ts +22 -3
  37. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  38. package/dist/Chat/ChatMessageList.js +6 -3
  39. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  40. package/dist/CheckboxInput/CheckboxInput.js +3 -2
  41. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  42. package/dist/ClickableCard/ClickableCard.js +3 -3
  43. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  44. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  45. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  46. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  47. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  48. package/dist/ContextMenu/ContextMenu.js +4 -3
  49. package/dist/DateInput/DateInput.d.ts.map +1 -1
  50. package/dist/DateInput/DateInput.js +3 -2
  51. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  52. package/dist/DateInput/TouchDateField.js +34 -1
  53. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  54. package/dist/DateTimeInput/DateTimeInput.js +3 -2
  55. package/dist/Dialog/Dialog.d.ts +7 -1
  56. package/dist/Dialog/Dialog.d.ts.map +1 -1
  57. package/dist/Dialog/Dialog.js +89 -58
  58. package/dist/FileInput/FileInput.d.ts.map +1 -1
  59. package/dist/FileInput/FileInput.js +3 -2
  60. package/dist/Heading/Heading.d.ts.map +1 -1
  61. package/dist/Heading/Heading.js +6 -2
  62. package/dist/HoverCard/HoverCard.d.ts +6 -0
  63. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  64. package/dist/HoverCard/useHoverCard.d.ts +5 -0
  65. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  66. package/dist/HoverCard/useHoverCard.js +67 -25
  67. package/dist/Item/Item.d.ts.map +1 -1
  68. package/dist/Item/Item.js +4 -2
  69. package/dist/Kbd/Kbd.d.ts.map +1 -1
  70. package/dist/Kbd/Kbd.js +10 -3
  71. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  72. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  73. package/dist/Layer/LayerDepthContext.js +66 -0
  74. package/dist/Layer/index.d.ts +3 -0
  75. package/dist/Layer/index.d.ts.map +1 -1
  76. package/dist/Layer/index.js +4 -0
  77. package/dist/Layer/layerStack.d.ts +98 -0
  78. package/dist/Layer/layerStack.d.ts.map +1 -0
  79. package/dist/Layer/layerStack.js +306 -0
  80. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  81. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  82. package/dist/Layer/useLayerDismissal.js +91 -0
  83. package/dist/Lightbox/Lightbox.d.ts +1 -0
  84. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  85. package/dist/Lightbox/Lightbox.js +103 -81
  86. package/dist/Markdown/index.d.ts +1 -1
  87. package/dist/Markdown/index.d.ts.map +1 -1
  88. package/dist/Markdown/parser.d.ts +38 -1
  89. package/dist/Markdown/parser.d.ts.map +1 -1
  90. package/dist/Markdown/parser.js +149 -23
  91. package/dist/MobileNav/MobileNav.d.ts +6 -1
  92. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  93. package/dist/MobileNav/MobileNav.js +61 -36
  94. package/dist/MultiSelector/MultiSelector.d.ts +15 -1
  95. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  96. package/dist/MultiSelector/MultiSelector.js +17 -6
  97. package/dist/MultiSelector/index.d.ts +1 -1
  98. package/dist/MultiSelector/index.d.ts.map +1 -1
  99. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  100. package/dist/NavMenu/NavHeadingMenu.js +3 -2
  101. package/dist/Outline/Outline.d.ts.map +1 -1
  102. package/dist/Outline/Outline.js +3 -2
  103. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  104. package/dist/OverflowList/OverflowList.js +3 -2
  105. package/dist/Overlay/Overlay.d.ts.map +1 -1
  106. package/dist/Overlay/Overlay.js +3 -2
  107. package/dist/Popover/usePopover.d.ts.map +1 -1
  108. package/dist/Popover/usePopover.js +20 -17
  109. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  110. package/dist/PowerSearch/PowerSearch.js +3 -4
  111. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  112. package/dist/Resizable/ResizeHandle.js +3 -2
  113. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  114. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  115. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  116. package/dist/SelectableCard/SelectableCard.js +3 -3
  117. package/dist/Selector/Selector.d.ts.map +1 -1
  118. package/dist/Selector/Selector.js +5 -0
  119. package/dist/SideNav/SideNav.d.ts.map +1 -1
  120. package/dist/SideNav/SideNav.js +4 -3
  121. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  122. package/dist/SideNav/SideNavItem.js +4 -3
  123. package/dist/Slider/Slider.d.ts.map +1 -1
  124. package/dist/Slider/Slider.js +3 -3
  125. package/dist/Stepper/Step.d.ts +140 -0
  126. package/dist/Stepper/Step.d.ts.map +1 -0
  127. package/dist/Stepper/Step.js +1045 -0
  128. package/dist/Stepper/StepStatus.d.ts +24 -0
  129. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  130. package/dist/Stepper/StepStatus.js +1 -0
  131. package/dist/Stepper/Stepper.d.ts +93 -0
  132. package/dist/Stepper/Stepper.d.ts.map +1 -0
  133. package/dist/Stepper/Stepper.js +184 -0
  134. package/dist/Stepper/StepperContext.d.ts +41 -0
  135. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  136. package/dist/Stepper/StepperContext.js +34 -0
  137. package/dist/Stepper/index.d.ts +8 -0
  138. package/dist/Stepper/index.d.ts.map +1 -0
  139. package/dist/Stepper/index.js +7 -0
  140. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  141. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  142. package/dist/Stepper/stepper.stylex.js +20 -0
  143. package/dist/Switch/Switch.d.ts.map +1 -1
  144. package/dist/Switch/Switch.js +3 -2
  145. package/dist/TabList/Tab.d.ts.map +1 -1
  146. package/dist/TabList/Tab.js +5 -1
  147. package/dist/TabList/TabList.d.ts.map +1 -1
  148. package/dist/TabList/TabList.js +3 -3
  149. package/dist/Table/BaseTable.d.ts.map +1 -1
  150. package/dist/Table/BaseTable.js +4 -1
  151. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  152. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
  153. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  154. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  155. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  156. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  157. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  158. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  159. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  160. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  161. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  162. package/dist/Table/plugins/selection/useTableSelection.js +19 -5
  163. package/dist/Table/types.d.ts +22 -4
  164. package/dist/Table/types.d.ts.map +1 -1
  165. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  166. package/dist/Table/useBaseTablePlugins.js +5 -0
  167. package/dist/Text/Text.d.ts.map +1 -1
  168. package/dist/Text/Text.js +6 -2
  169. package/dist/TextArea/TextArea.d.ts.map +1 -1
  170. package/dist/TextArea/TextArea.js +3 -2
  171. package/dist/TextInput/TextInput.d.ts.map +1 -1
  172. package/dist/TextInput/TextInput.js +3 -2
  173. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  174. package/dist/TimeInput/TimeInput.js +3 -2
  175. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  176. package/dist/Timestamp/Timestamp.js +5 -3
  177. package/dist/Token/TokenLink.d.ts.map +1 -1
  178. package/dist/Token/TokenLink.js +2 -2
  179. package/dist/Tooltip/Tooltip.d.ts +5 -0
  180. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  181. package/dist/Tooltip/useTooltip.d.ts +5 -0
  182. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  183. package/dist/Tooltip/useTooltip.js +39 -24
  184. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  185. package/dist/TopNav/TopNavMegaMenu.js +3 -3
  186. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  187. package/dist/Typeahead/BaseTypeahead.js +3 -3
  188. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  189. package/dist/Typeahead/Typeahead.js +3 -2
  190. package/dist/astryx.css +43 -1
  191. package/dist/hooks/index.d.ts +1 -0
  192. package/dist/hooks/index.d.ts.map +1 -1
  193. package/dist/hooks/index.js +1 -0
  194. package/dist/hooks/useFocusTrap.d.ts +7 -4
  195. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  196. package/dist/hooks/useFocusTrap.js +52 -91
  197. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  198. package/dist/hooks/useHotkeys.js +10 -3
  199. package/dist/hooks/useListFocus.d.ts +5 -2
  200. package/dist/hooks/useListFocus.d.ts.map +1 -1
  201. package/dist/hooks/useListFocus.js +12 -6
  202. package/dist/hooks/useMergedRefs.d.ts +18 -0
  203. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  204. package/dist/hooks/useMergedRefs.js +25 -0
  205. package/dist/index.d.ts +1 -0
  206. package/dist/index.d.ts.map +1 -1
  207. package/dist/index.js +1 -0
  208. package/dist/utils/timeParser.d.ts +1 -1
  209. package/dist/utils/timeParser.d.ts.map +1 -1
  210. package/dist/utils/timeParser.js +26 -12
  211. package/locales/en.json +27 -7
  212. package/locales/pseudo.json +15 -0
  213. package/package.json +8 -3
  214. package/src/AppShell/AppShell.tsx +3 -2
  215. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  216. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  217. package/src/AspectRatio/AspectRatio.tsx +40 -1
  218. package/src/Avatar/Avatar.doc.mjs +2 -1
  219. package/src/AvatarGroup/AvatarGroup.tsx +3 -2
  220. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  221. package/src/BottomSheet/BottomSheet.tsx +36 -4
  222. package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +225 -0
  223. package/src/BottomSheet/BottomSheetEdgeTint.tsx +82 -0
  224. package/src/BottomSheet/BottomSheetPanel.test.tsx +66 -0
  225. package/src/BottomSheet/BottomSheetPanel.tsx +19 -0
  226. package/src/BottomSheet/BottomSheetSwitcher.tsx +16 -2
  227. package/src/BottomSheet/useSheetGestures.test.ts +27 -0
  228. package/src/BottomSheet/useSheetGestures.ts +25 -5
  229. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  230. package/src/Button/Button.doc.mjs +22 -0
  231. package/src/ButtonGroup/ButtonGroup.doc.mjs +7 -1
  232. package/src/ButtonGroup/ButtonGroup.test.tsx +185 -1
  233. package/src/ButtonGroup/ButtonGroup.tsx +11 -3
  234. package/src/Calendar/Calendar.doc.mjs +4 -3
  235. package/src/Calendar/Calendar.test.tsx +52 -0
  236. package/src/Calendar/Calendar.tsx +18 -15
  237. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  238. package/src/Calendar/getInitialFocusDate.ts +93 -0
  239. package/src/Carousel/Carousel.tsx +3 -2
  240. package/src/Chat/ChatLayout.tsx +3 -2
  241. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  242. package/src/Chat/ChatMessageList.test.tsx +46 -0
  243. package/src/Chat/ChatMessageList.tsx +28 -4
  244. package/src/CheckboxInput/CheckboxInput.tsx +3 -2
  245. package/src/ClickableCard/ClickableCard.tsx +3 -2
  246. package/src/CodeBlock/CodeBlock.doc.mjs +6 -0
  247. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  248. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  249. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  250. package/src/ContextMenu/ContextMenu.tsx +4 -3
  251. package/src/DateInput/DateInput.tsx +3 -2
  252. package/src/DateInput/DateInputTouch.test.tsx +36 -0
  253. package/src/DateInput/TouchDateField.tsx +35 -1
  254. package/src/DateTimeInput/DateTimeInput.tsx +2 -2
  255. package/src/Dialog/Dialog.doc.mjs +8 -3
  256. package/src/Dialog/Dialog.test.tsx +261 -1
  257. package/src/Dialog/Dialog.tsx +109 -58
  258. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  259. package/src/Field/Field.doc.mjs +13 -2
  260. package/src/FileInput/FileInput.tsx +3 -2
  261. package/src/Heading/Heading.test.tsx +23 -1
  262. package/src/Heading/Heading.tsx +6 -2
  263. package/src/HoverCard/HoverCard.doc.mjs +5 -0
  264. package/src/HoverCard/HoverCard.tsx +6 -0
  265. package/src/HoverCard/useHoverCard.tsx +81 -30
  266. package/src/Item/Item.tsx +5 -4
  267. package/src/Kbd/Kbd.test.tsx +17 -0
  268. package/src/Kbd/Kbd.tsx +10 -3
  269. package/src/Layer/LayerDepthContext.tsx +62 -0
  270. package/src/Layer/index.ts +9 -0
  271. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  272. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  273. package/src/Layer/layerStack.ts +362 -0
  274. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  275. package/src/Layer/useLayerDismissal.ts +173 -0
  276. package/src/Layout/Layout.doc.mjs +2 -2
  277. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  278. package/src/Lightbox/Lightbox.tsx +124 -102
  279. package/src/Link/Link.doc.mjs +39 -0
  280. package/src/Markdown/index.ts +1 -0
  281. package/src/Markdown/parser.perf.test.ts +71 -1
  282. package/src/Markdown/parser.test.ts +145 -2
  283. package/src/Markdown/parser.ts +208 -22
  284. package/src/MobileNav/MobileNav.tsx +62 -36
  285. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  286. package/src/MultiSelector/MultiSelector.doc.mjs +27 -0
  287. package/src/MultiSelector/MultiSelector.test.tsx +105 -0
  288. package/src/MultiSelector/MultiSelector.tsx +50 -6
  289. package/src/MultiSelector/index.ts +1 -0
  290. package/src/NavMenu/NavHeadingMenu.tsx +3 -2
  291. package/src/NumberInput/NumberInput.doc.mjs +5 -0
  292. package/src/Outline/Outline.tsx +3 -2
  293. package/src/OverflowList/OverflowList.tsx +3 -2
  294. package/src/Overlay/Overlay.tsx +3 -2
  295. package/src/Popover/Popover.test.tsx +27 -1
  296. package/src/Popover/usePopover.tsx +31 -28
  297. package/src/PowerSearch/PowerSearch.doc.mjs +26 -0
  298. package/src/PowerSearch/PowerSearch.tsx +5 -2
  299. package/src/Resizable/ResizeHandle.tsx +3 -2
  300. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  301. package/src/SelectableCard/SelectableCard.tsx +3 -2
  302. package/src/Selector/Selector.doc.mjs +12 -1
  303. package/src/Selector/Selector.test.tsx +21 -0
  304. package/src/Selector/Selector.tsx +11 -1
  305. package/src/SideNav/SideNav.doc.mjs +6 -6
  306. package/src/SideNav/SideNav.tsx +4 -2
  307. package/src/SideNav/SideNavItem.tsx +4 -2
  308. package/src/Slider/Slider.tsx +3 -2
  309. package/src/Stepper/Step.doc.mjs +98 -0
  310. package/src/Stepper/Step.tsx +1638 -0
  311. package/src/Stepper/StepStatus.ts +26 -0
  312. package/src/Stepper/Stepper.doc.mjs +370 -0
  313. package/src/Stepper/Stepper.test.tsx +1024 -0
  314. package/src/Stepper/Stepper.tsx +258 -0
  315. package/src/Stepper/StepperContext.ts +71 -0
  316. package/src/Stepper/index.ts +18 -0
  317. package/src/Stepper/stepper.stylex.ts +19 -0
  318. package/src/Switch/Switch.tsx +3 -2
  319. package/src/TabList/Tab.tsx +5 -1
  320. package/src/TabList/TabList.test.tsx +21 -4
  321. package/src/TabList/TabList.tsx +3 -2
  322. package/src/Table/BaseTable.tsx +6 -3
  323. package/src/Table/Table.test.tsx +35 -0
  324. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  325. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  326. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
  327. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  328. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  329. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  330. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  331. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  332. package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
  333. package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
  334. package/src/Table/types.ts +22 -4
  335. package/src/Table/useBaseTablePlugins.ts +5 -0
  336. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  337. package/src/Table/useTablePagination.doc.mjs +7 -0
  338. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  339. package/src/Table/useTableSelection.doc.mjs +31 -0
  340. package/src/Text/Text.test.tsx +23 -1
  341. package/src/Text/Text.tsx +6 -2
  342. package/src/TextArea/TextArea.tsx +3 -2
  343. package/src/TextInput/TextInput.doc.mjs +10 -0
  344. package/src/TextInput/TextInput.tsx +3 -2
  345. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  346. package/src/TimeInput/TimeInput.tsx +2 -2
  347. package/src/Timestamp/Timestamp.tsx +4 -2
  348. package/src/Toast/Toast.doc.mjs +6 -0
  349. package/src/Token/TokenLink.tsx +2 -2
  350. package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
  351. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  352. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  353. package/src/Tooltip/Tooltip.test.tsx +32 -0
  354. package/src/Tooltip/Tooltip.tsx +5 -0
  355. package/src/Tooltip/useTooltip.tsx +47 -24
  356. package/src/TopNav/TopNavMegaMenu.tsx +3 -2
  357. package/src/Typeahead/BaseTypeahead.tsx +3 -2
  358. package/src/Typeahead/Typeahead.doc.mjs +5 -0
  359. package/src/Typeahead/Typeahead.tsx +3 -2
  360. package/src/__tests__/complexComponentContract.test.tsx +81 -0
  361. package/src/hooks/index.ts +2 -0
  362. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  363. package/src/hooks/useFocusTrap.ts +54 -107
  364. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  365. package/src/hooks/useHotkeys.test.ts +18 -0
  366. package/src/hooks/useHotkeys.ts +10 -3
  367. package/src/hooks/useListFocus.doc.mjs +2 -2
  368. package/src/hooks/useListFocus.test.tsx +65 -3
  369. package/src/hooks/useListFocus.ts +15 -7
  370. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  371. package/src/hooks/useMergedRefs.test.tsx +62 -0
  372. package/src/hooks/useMergedRefs.ts +36 -0
  373. package/src/index.ts +1 -0
  374. package/src/theme/MediaTheme.doc.mjs +5 -5
  375. package/src/utils/timeParser.test.ts +6 -1
  376. package/src/utils/timeParser.ts +35 -13
  377. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -0,0 +1,359 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file layerDismissalFamilies.test.tsx
5
+ * @input Uses vitest, @testing-library/react, Dialog, Lightbox, MobileNav,
6
+ * HoverCard, Tooltip
7
+ * @output Tests that every overlay family shares the one dismissal stack
8
+ * @position Colocated with layerStack; the families' own behavior is tested in
9
+ * their own files, this one only asks who takes the press
10
+ *
11
+ * The stack routes an Escape press to the top-most REGISTERED layer and
12
+ * preventDefault()s it, so a family that is not on the stack cannot be reached
13
+ * once anything else is. Lightbox and MobileNav were that gap: both closed via
14
+ * the native `cancel` event alone, and a `required` Dialog underneath swallowed
15
+ * every press before it got there.
16
+ *
17
+ * SYNC: When a new overlay family joins the stack, add it here.
18
+ */
19
+
20
+ import {
21
+ describe,
22
+ it,
23
+ expect,
24
+ vi,
25
+ beforeAll,
26
+ beforeEach,
27
+ afterAll,
28
+ afterEach,
29
+ } from 'vitest';
30
+ import {render, screen} from '@testing-library/react';
31
+
32
+ import {Dialog} from '../Dialog/Dialog';
33
+ import {HoverCard} from '../HoverCard/HoverCard';
34
+ import {Lightbox} from '../Lightbox/Lightbox';
35
+ import {MobileNav} from '../MobileNav/MobileNav';
36
+ import {Tooltip} from '../Tooltip/Tooltip';
37
+ import {resetLayerStackForTests} from './layerStack';
38
+
39
+ const originalMatches = HTMLElement.prototype.matches;
40
+ const popoverOpenState = new WeakMap<HTMLElement, boolean>();
41
+
42
+ // jsdom implements no Popover API, and the hover layers answer `isPresent`
43
+ // from `:popover-open`.
44
+ beforeAll(() => {
45
+ HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
46
+ popoverOpenState.set(this, true);
47
+ });
48
+ HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
49
+ popoverOpenState.set(this, false);
50
+ });
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ (HTMLElement.prototype as any).matches = function (
53
+ selector: string,
54
+ ): boolean {
55
+ if (selector === ':popover-open') {
56
+ return popoverOpenState.get(this) ?? false;
57
+ }
58
+ return originalMatches.call(this, selector);
59
+ };
60
+ });
61
+
62
+ afterAll(() => {
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ (HTMLElement.prototype as any).matches = originalMatches;
65
+ });
66
+
67
+ // jsdom does not implement showModal/close.
68
+ beforeEach(() => {
69
+ vi.mocked(HTMLElement.prototype.showPopover).mockClear();
70
+ vi.mocked(HTMLElement.prototype.hidePopover).mockClear();
71
+ HTMLDialogElement.prototype.showModal = vi.fn(function (
72
+ this: HTMLDialogElement,
73
+ ) {
74
+ this.setAttribute('open', '');
75
+ });
76
+ HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
77
+ this.removeAttribute('open');
78
+ });
79
+ });
80
+
81
+ afterEach(() => {
82
+ resetLayerStackForTests();
83
+ });
84
+
85
+ function pressEscape(): KeyboardEvent {
86
+ const event = new KeyboardEvent('keydown', {
87
+ key: 'Escape',
88
+ bubbles: true,
89
+ cancelable: true,
90
+ });
91
+ document.dispatchEvent(event);
92
+ return event;
93
+ }
94
+
95
+ function fireCancel(dialog: Element): Event {
96
+ const event = new Event('cancel', {bubbles: false, cancelable: true});
97
+ dialog.dispatchEvent(event);
98
+ return event;
99
+ }
100
+
101
+ const getDialog = (label: string) =>
102
+ screen
103
+ .getAllByRole('dialog', {hidden: true})
104
+ .find(d => d.getAttribute('aria-label') === label)!;
105
+
106
+ const MEDIA = {src: '/photo.jpg', alt: 'A photo'};
107
+
108
+ describe('overlay families on the shared dismissal stack', () => {
109
+ describe('Lightbox', () => {
110
+ it('takes the Escape when it is open over a required Dialog', () => {
111
+ const onLightboxChange = vi.fn();
112
+ const onDialogChange = vi.fn();
113
+
114
+ render(
115
+ <Dialog
116
+ isOpen={true}
117
+ onOpenChange={onDialogChange}
118
+ purpose="required"
119
+ aria-label="Required">
120
+ Choose one
121
+ <Lightbox
122
+ isOpen={true}
123
+ onOpenChange={onLightboxChange}
124
+ media={MEDIA}
125
+ />
126
+ </Dialog>,
127
+ );
128
+
129
+ const event = pressEscape();
130
+
131
+ expect(onLightboxChange).toHaveBeenCalledWith(false);
132
+ expect(onDialogChange).not.toHaveBeenCalled();
133
+ expect(event.defaultPrevented).toBe(true);
134
+ });
135
+
136
+ it('closes on a browser-initiated cancel when it is top-most', () => {
137
+ const onOpenChange = vi.fn();
138
+ render(
139
+ <Lightbox isOpen={true} onOpenChange={onOpenChange} media={MEDIA} />,
140
+ );
141
+
142
+ const event = fireCancel(screen.getByRole('dialog', {hidden: true}));
143
+
144
+ expect(event.defaultPrevented).toBe(true);
145
+ expect(onOpenChange).toHaveBeenCalledWith(false);
146
+ });
147
+
148
+ it('stays open on a browser-initiated cancel when it is not top-most', () => {
149
+ const onLightboxChange = vi.fn();
150
+
151
+ render(
152
+ <>
153
+ <Lightbox
154
+ isOpen={true}
155
+ onOpenChange={onLightboxChange}
156
+ media={MEDIA}
157
+ />
158
+ <Dialog isOpen={true} onOpenChange={() => {}} aria-label="Above">
159
+ Above
160
+ </Dialog>
161
+ </>,
162
+ );
163
+
164
+ const event = fireCancel(getDialog('A photo'));
165
+
166
+ expect(event.defaultPrevented).toBe(true);
167
+ expect(onLightboxChange).not.toHaveBeenCalled();
168
+ });
169
+ });
170
+
171
+ describe('MobileNav', () => {
172
+ it('takes the Escape when it opens over a required Dialog', () => {
173
+ const onNavChange = vi.fn();
174
+ const onDialogChange = vi.fn();
175
+
176
+ render(
177
+ <>
178
+ <Dialog
179
+ isOpen={true}
180
+ onOpenChange={onDialogChange}
181
+ purpose="required"
182
+ aria-label="Required">
183
+ Choose one
184
+ </Dialog>
185
+ <MobileNav isOpen={true} onOpenChange={onNavChange} label="Drawer">
186
+ <span>Nav content</span>
187
+ </MobileNav>
188
+ </>,
189
+ );
190
+
191
+ const event = pressEscape();
192
+
193
+ expect(onNavChange).toHaveBeenCalledWith(false);
194
+ expect(onDialogChange).not.toHaveBeenCalled();
195
+ expect(event.defaultPrevented).toBe(true);
196
+ });
197
+
198
+ it('closes on a browser-initiated cancel when it is top-most', () => {
199
+ const onOpenChange = vi.fn();
200
+ render(
201
+ <MobileNav isOpen={true} onOpenChange={onOpenChange} label="Drawer">
202
+ <span>Nav content</span>
203
+ </MobileNav>,
204
+ );
205
+
206
+ const event = fireCancel(getDialog('Drawer'));
207
+
208
+ expect(event.defaultPrevented).toBe(true);
209
+ expect(onOpenChange).toHaveBeenCalledWith(false);
210
+ });
211
+
212
+ it('stays open on a browser-initiated cancel when it is not top-most', () => {
213
+ const onNavChange = vi.fn();
214
+
215
+ render(
216
+ <MobileNav isOpen={true} onOpenChange={onNavChange} label="Drawer">
217
+ <span>Nav content</span>
218
+ <Dialog isOpen={true} onOpenChange={() => {}} aria-label="Above">
219
+ Above
220
+ </Dialog>
221
+ </MobileNav>,
222
+ );
223
+
224
+ const event = fireCancel(getDialog('Drawer'));
225
+
226
+ expect(event.defaultPrevented).toBe(true);
227
+ expect(onNavChange).not.toHaveBeenCalled();
228
+ });
229
+ });
230
+
231
+ describe('required Dialog', () => {
232
+ it('still swallows an Escape when it is alone', () => {
233
+ const onDialogChange = vi.fn();
234
+
235
+ render(
236
+ <Dialog
237
+ isOpen={true}
238
+ onOpenChange={onDialogChange}
239
+ purpose="required"
240
+ aria-label="Required">
241
+ Choose one
242
+ </Dialog>,
243
+ );
244
+
245
+ const event = pressEscape();
246
+
247
+ expect(onDialogChange).not.toHaveBeenCalled();
248
+ expect(event.defaultPrevented).toBe(true);
249
+ });
250
+
251
+ it('still swallows an Escape with a Lightbox open UNDER it', () => {
252
+ const onLightboxChange = vi.fn();
253
+ const onDialogChange = vi.fn();
254
+
255
+ render(
256
+ <>
257
+ <Lightbox
258
+ isOpen={true}
259
+ onOpenChange={onLightboxChange}
260
+ media={MEDIA}
261
+ />
262
+ <Dialog
263
+ isOpen={true}
264
+ onOpenChange={onDialogChange}
265
+ purpose="required"
266
+ aria-label="Required">
267
+ Choose one
268
+ </Dialog>
269
+ </>,
270
+ );
271
+
272
+ pressEscape();
273
+
274
+ expect(onDialogChange).not.toHaveBeenCalled();
275
+ expect(onLightboxChange).not.toHaveBeenCalled();
276
+ });
277
+ });
278
+
279
+ // Controlled follows control state for `isOpen`: Escape still attempts the
280
+ // close, but only the caller's update function may perform it. Dialog has
281
+ // always worked this way; these two now do too.
282
+ describe('controlled hover layers', () => {
283
+ it('a controlled HoverCard takes the press and reports instead of hiding', () => {
284
+ const onCardChange = vi.fn();
285
+ const onDialogChange = vi.fn();
286
+
287
+ render(
288
+ <Dialog isOpen={true} onOpenChange={onDialogChange} aria-label="Host">
289
+ <HoverCard
290
+ isOpen={true}
291
+ onOpenChange={onCardChange}
292
+ content={<span>Pinned card</span>}>
293
+ <button type="button">Trigger</button>
294
+ </HoverCard>
295
+ </Dialog>,
296
+ );
297
+ onCardChange.mockClear();
298
+ vi.mocked(HTMLElement.prototype.hidePopover).mockClear();
299
+
300
+ const event = pressEscape();
301
+
302
+ expect(onCardChange).toHaveBeenCalledWith(false);
303
+ expect(HTMLElement.prototype.hidePopover).not.toHaveBeenCalled();
304
+ expect(onDialogChange).not.toHaveBeenCalled();
305
+ expect(event.defaultPrevented).toBe(true);
306
+ });
307
+
308
+ it('a controlled Tooltip takes the press and reports instead of hiding', () => {
309
+ const onTipChange = vi.fn();
310
+ const onDialogChange = vi.fn();
311
+
312
+ render(
313
+ <Dialog isOpen={true} onOpenChange={onDialogChange} aria-label="Host">
314
+ <Tooltip
315
+ isOpen={true}
316
+ onOpenChange={onTipChange}
317
+ content="Pinned tip">
318
+ <button type="button">Trigger</button>
319
+ </Tooltip>
320
+ </Dialog>,
321
+ );
322
+ onTipChange.mockClear();
323
+ vi.mocked(HTMLElement.prototype.hidePopover).mockClear();
324
+
325
+ const event = pressEscape();
326
+
327
+ expect(onTipChange).toHaveBeenCalledWith(false);
328
+ expect(HTMLElement.prototype.hidePopover).not.toHaveBeenCalled();
329
+ expect(onDialogChange).not.toHaveBeenCalled();
330
+ expect(event.defaultPrevented).toBe(true);
331
+ });
332
+
333
+ it('leaves the Dialog unclosable when the consumer discards the request', () => {
334
+ // The round-6 regression, now by consumer choice rather than by ours: a
335
+ // layer that holds itself open and ignores its own change handler keeps
336
+ // taking the press, and nothing behind it can be reached.
337
+ const onCardChange = vi.fn();
338
+ const onDialogChange = vi.fn();
339
+
340
+ render(
341
+ <Dialog isOpen={true} onOpenChange={onDialogChange} aria-label="Host">
342
+ <HoverCard
343
+ isOpen={true}
344
+ onOpenChange={onCardChange}
345
+ content={<span>Stuck card</span>}>
346
+ <button type="button">Trigger</button>
347
+ </HoverCard>
348
+ </Dialog>,
349
+ );
350
+ onCardChange.mockClear();
351
+
352
+ pressEscape();
353
+ pressEscape();
354
+
355
+ expect(onCardChange).toHaveBeenCalledTimes(2);
356
+ expect(onDialogChange).not.toHaveBeenCalled();
357
+ });
358
+ });
359
+ });