@astryxdesign/core 0.5.0 → 0.5.1-canary.046f6ea

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 (622) hide show
  1. package/CHANGELOG.md +222 -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 +45 -20
  5. package/dist/AspectRatio/AspectRatio.d.ts +6 -6
  6. package/dist/Avatar/Avatar.d.ts +25 -1
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +43 -9
  9. package/dist/Avatar/index.d.ts +2 -2
  10. package/dist/Avatar/index.d.ts.map +1 -1
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +5 -2
  15. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  16. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  17. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroupOverflow.js +11 -7
  19. package/dist/Badge/Badge.d.ts.map +1 -1
  20. package/dist/Badge/Badge.js +26 -2
  21. package/dist/Banner/Banner.d.ts +10 -1
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +11 -2
  24. package/dist/Button/Button.d.ts.map +1 -1
  25. package/dist/Button/Button.js +8 -7
  26. package/dist/Calendar/Calendar.d.ts +4 -2
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +15 -21
  29. package/dist/Calendar/hooks/useCalendarDays.js +4 -6
  30. package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
  31. package/dist/Calendar/styles.d.ts +5 -20
  32. package/dist/Calendar/styles.d.ts.map +1 -1
  33. package/dist/Calendar/styles.js +15 -17
  34. package/dist/Card/Card.d.ts +12 -12
  35. package/dist/Card/Card.d.ts.map +1 -1
  36. package/dist/Card/Card.js +17 -9
  37. package/dist/Card/index.d.ts +35 -1
  38. package/dist/Card/index.d.ts.map +1 -1
  39. package/dist/Card/index.js +21 -1
  40. package/dist/Carousel/Carousel.d.ts.map +1 -1
  41. package/dist/Carousel/Carousel.js +108 -7
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +7 -1
  44. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  45. package/dist/CodeBlock/CodeBlock.js +15 -4
  46. package/dist/CodeBlock/highlightRanges.js +1 -1
  47. package/dist/CodeBlock/highlightStyles.js +13 -13
  48. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  49. package/dist/CommandPalette/CommandPaletteItem.js +2 -7
  50. package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +14 -7
  53. package/dist/DateInput/DateInput.d.ts +43 -0
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +22 -5
  56. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  57. package/dist/DateInput/MonthScroller.js +5 -3
  58. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  59. package/dist/DateInput/MonthYearWheels.js +6 -4
  60. package/dist/DateInput/NativeDateField.d.ts +10 -0
  61. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  62. package/dist/DateInput/NativeDateField.js +494 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +52 -25
  65. package/dist/DateInput/Wheel.d.ts.map +1 -1
  66. package/dist/DateInput/Wheel.js +1 -0
  67. package/dist/DateInput/index.d.ts +1 -1
  68. package/dist/DateInput/index.d.ts.map +1 -1
  69. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  70. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  71. package/dist/DateInput/nativeDateSegments.js +111 -0
  72. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  73. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  74. package/dist/DateRangeInput/DateRangeInput.js +3 -5
  75. package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
  76. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  77. package/dist/DateTimeInput/DateTimeInput.js +35 -10
  78. package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
  79. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
  80. package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
  81. package/dist/Dialog/Dialog.d.ts +16 -2
  82. package/dist/Dialog/Dialog.d.ts.map +1 -1
  83. package/dist/Dialog/Dialog.js +28 -7
  84. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  86. package/dist/Field/FieldLabel.d.ts.map +1 -1
  87. package/dist/Field/FieldLabel.js +9 -1
  88. package/dist/Field/InputClearButton.d.ts +9 -3
  89. package/dist/Field/InputClearButton.d.ts.map +1 -1
  90. package/dist/Field/InputClearButton.js +14 -3
  91. package/dist/Heading/Heading.d.ts.map +1 -1
  92. package/dist/Heading/Heading.js +0 -1
  93. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/HoverCard.js +104 -3
  95. package/dist/HoverCard/useHoverCard.d.ts +14 -2
  96. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  97. package/dist/HoverCard/useHoverCard.js +7 -1
  98. package/dist/Icon/Icon.d.ts +4 -2
  99. package/dist/Icon/Icon.d.ts.map +1 -1
  100. package/dist/Icon/defaultIcons.d.ts +3 -2
  101. package/dist/Icon/defaultIcons.d.ts.map +1 -1
  102. package/dist/Icon/defaultIcons.js +7 -0
  103. package/dist/Icon/globalIconRegistry.d.ts +13 -0
  104. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  105. package/dist/Icon/globalIconRegistry.js +34 -6
  106. package/dist/Icon/index.d.ts +1 -1
  107. package/dist/Icon/index.d.ts.map +1 -1
  108. package/dist/Icon/useIcon.d.ts +5 -2
  109. package/dist/Icon/useIcon.d.ts.map +1 -1
  110. package/dist/Icon/useIcon.js +3 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  112. package/dist/Indicator/CheckboxIndicator.js +6 -2
  113. package/dist/Item/Item.d.ts.map +1 -1
  114. package/dist/Item/Item.js +2 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -26
  117. package/dist/Layer/gestureCounter.d.ts +8 -0
  118. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  119. package/dist/Layer/gestureCounter.js +53 -0
  120. package/dist/Layer/useLayer.d.ts +23 -13
  121. package/dist/Layer/useLayer.d.ts.map +1 -1
  122. package/dist/Layer/useLayer.js +146 -24
  123. package/dist/List/List.d.ts +1 -1
  124. package/dist/List/List.d.ts.map +1 -1
  125. package/dist/List/List.js +15 -4
  126. package/dist/Markdown/Markdown.d.ts +1 -1
  127. package/dist/Markdown/Markdown.d.ts.map +1 -1
  128. package/dist/Markdown/Markdown.js +20 -7
  129. package/dist/Markdown/parser.d.ts.map +1 -1
  130. package/dist/Markdown/parser.js +5 -3
  131. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  132. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  133. package/dist/MetadataList/MetadataListItem.js +4 -1
  134. package/dist/MultiSelector/MultiSelector.d.ts +18 -1
  135. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  136. package/dist/MultiSelector/MultiSelector.js +58 -11
  137. package/dist/MultiSelector/hooks.d.ts +7 -1
  138. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  139. package/dist/MultiSelector/hooks.js +3 -2
  140. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  141. package/dist/NavIcon/NavIcon.js +5 -1
  142. package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
  143. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  144. package/dist/NavItem/navItemStyles.stylex.js +0 -2
  145. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  146. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  147. package/dist/NavMenu/NavHeadingMenu.js +7 -4
  148. package/dist/NumberInput/NumberInput.d.ts +6 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +95 -126
  151. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  152. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  153. package/dist/NumberInput/numberInputCommit.js +71 -0
  154. package/dist/NumberInput/numberParser.d.ts +64 -0
  155. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  156. package/dist/NumberInput/numberParser.js +350 -0
  157. package/dist/Outline/Outline.d.ts.map +1 -1
  158. package/dist/Outline/Outline.js +2 -3
  159. package/dist/OverflowList/OverflowList.d.ts +41 -1
  160. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  161. package/dist/OverflowList/OverflowList.js +43 -2
  162. package/dist/Popover/Popover.d.ts.map +1 -1
  163. package/dist/Popover/Popover.js +8 -14
  164. package/dist/Popover/usePopover.d.ts +15 -41
  165. package/dist/Popover/usePopover.d.ts.map +1 -1
  166. package/dist/Popover/usePopover.js +26 -7
  167. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
  169. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  170. package/dist/PowerSearch/formatFilterValue.js +4 -2
  171. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  172. package/dist/ProgressBar/ProgressBar.js +18 -5
  173. package/dist/Resizable/useResizable.d.ts +19 -1
  174. package/dist/Resizable/useResizable.d.ts.map +1 -1
  175. package/dist/Resizable/useResizable.js +104 -38
  176. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.js +9 -0
  178. package/dist/Selector/Selector.d.ts +18 -1
  179. package/dist/Selector/Selector.d.ts.map +1 -1
  180. package/dist/Selector/Selector.js +92 -21
  181. package/dist/Selector/hooks.d.ts +7 -1
  182. package/dist/Selector/hooks.d.ts.map +1 -1
  183. package/dist/Selector/hooks.js +3 -2
  184. package/dist/SideNav/SideNav.d.ts +6 -1
  185. package/dist/SideNav/SideNav.d.ts.map +1 -1
  186. package/dist/SideNav/SideNav.js +57 -27
  187. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  188. package/dist/SideNav/SideNavHeading.js +5 -4
  189. package/dist/SideNav/SideNavItem.d.ts +29 -4
  190. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  191. package/dist/SideNav/SideNavItem.js +75 -20
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +34 -2
  194. package/dist/Spinner/Spinner.d.ts +3 -1
  195. package/dist/Spinner/Spinner.d.ts.map +1 -1
  196. package/dist/Spinner/Spinner.js +199 -20
  197. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  198. package/dist/StatusDot/StatusDot.js +6 -1
  199. package/dist/Stepper/Step.d.ts.map +1 -1
  200. package/dist/Stepper/Step.js +7 -6
  201. package/dist/Switch/Switch.d.ts.map +1 -1
  202. package/dist/Switch/Switch.js +5 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +6 -1
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +3 -6
  207. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  208. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  210. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  211. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +34 -3
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +25 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  215. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  216. package/dist/Text/Text.d.ts.map +1 -1
  217. package/dist/Text/Text.js +0 -1
  218. package/dist/TextArea/TextArea.d.ts.map +1 -1
  219. package/dist/TextArea/TextArea.js +13 -8
  220. package/dist/Timestamp/Timestamp.d.ts +1 -1
  221. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  222. package/dist/Timestamp/Timestamp.js +10 -18
  223. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  224. package/dist/Timestamp/formatInstant.js +10 -5
  225. package/dist/Toast/Toast.d.ts +17 -2
  226. package/dist/Toast/Toast.d.ts.map +1 -1
  227. package/dist/Toast/Toast.js +77 -11
  228. package/dist/Toast/ToastViewport.d.ts +1 -0
  229. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  230. package/dist/Toast/ToastViewport.js +76 -21
  231. package/dist/Toast/index.d.ts +1 -1
  232. package/dist/Toast/index.d.ts.map +1 -1
  233. package/dist/Toast/types.d.ts +38 -0
  234. package/dist/Toast/types.d.ts.map +1 -1
  235. package/dist/Toast/useToastGesture.d.ts +26 -0
  236. package/dist/Toast/useToastGesture.d.ts.map +1 -0
  237. package/dist/Toast/useToastGesture.js +223 -0
  238. package/dist/Token/Token.d.ts +1 -1
  239. package/dist/Token/Token.d.ts.map +1 -1
  240. package/dist/Token/Token.js +23 -12
  241. package/dist/Token/TokenLink.d.ts +1 -1
  242. package/dist/Token/TokenLink.d.ts.map +1 -1
  243. package/dist/Token/TokenLink.js +5 -2
  244. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  245. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  246. package/dist/Tokenizer/Tokenizer.js +31 -21
  247. package/dist/TopNav/TopNavHeading.js +2 -2
  248. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  249. package/dist/TopNav/TopNavItem.js +3 -3
  250. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  251. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavMegaMenu.js +30 -9
  253. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
  255. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +21 -6
  258. package/dist/TreeList/TreeList.d.ts +1 -1
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +7 -2
  261. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  262. package/dist/TreeList/TreeListItem.js +2 -2
  263. package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
  264. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  265. package/dist/Typeahead/BaseTypeahead.js +51 -8
  266. package/dist/Typeahead/Typeahead.d.ts +8 -1
  267. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  268. package/dist/Typeahead/Typeahead.js +2 -0
  269. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  270. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  271. package/dist/Typeahead/TypeaheadItem.js +7 -2
  272. package/dist/astryx.css +87 -22
  273. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  274. package/dist/hooks/useHotkeys.js +3 -25
  275. package/dist/hooks/useOverflow.d.ts.map +1 -1
  276. package/dist/hooks/useOverflow.js +14 -4
  277. package/dist/i18n/InternationalizationContext.d.ts +2 -0
  278. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  279. package/dist/i18n/InternationalizationContext.js +3 -1
  280. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  281. package/dist/i18n/InternationalizationProvider.js +3 -1
  282. package/dist/i18n/resolve.d.ts +1 -1
  283. package/dist/i18n/resolve.d.ts.map +1 -1
  284. package/dist/i18n/resolve.js +37 -38
  285. package/dist/i18n/useTranslator.d.ts.map +1 -1
  286. package/dist/i18n/useTranslator.js +2 -3
  287. package/dist/index.d.ts +1 -1
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/theme/Theme.d.ts.map +1 -1
  290. package/dist/theme/Theme.js +46 -10
  291. package/dist/theme/defineTheme.d.ts +9 -3
  292. package/dist/theme/defineTheme.d.ts.map +1 -1
  293. package/dist/theme/defineTheme.js +5 -0
  294. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  295. package/dist/theme/derivedVarRegistry.js +24 -4
  296. package/dist/theme/generateThemeRules.d.ts +21 -0
  297. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  298. package/dist/theme/generateThemeRules.js +26 -0
  299. package/dist/theme/syntax/tokens.d.ts +1 -1
  300. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  301. package/dist/theme/syntax/tokens.js +5 -2
  302. package/dist/theme/useTheme.d.ts.map +1 -1
  303. package/dist/theme/useTheme.js +6 -7
  304. package/dist/utils/dateParser.d.ts +5 -8
  305. package/dist/utils/dateParser.d.ts.map +1 -1
  306. package/dist/utils/dateParser.js +10 -11
  307. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  308. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  309. package/dist/utils/focusOutline.stylex.js +15 -0
  310. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  311. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  312. package/dist/utils/interactionOverlay.stylex.js +42 -0
  313. package/dist/utils/isApplePlatform.d.ts +18 -0
  314. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  315. package/dist/utils/isApplePlatform.js +37 -0
  316. package/dist/utils/plainDate.d.ts +11 -0
  317. package/dist/utils/plainDate.d.ts.map +1 -1
  318. package/dist/utils/plainDate.js +20 -4
  319. package/locales/af-ZA.json +7 -7
  320. package/locales/ar-SA.json +7 -7
  321. package/locales/ca-ES.json +6 -6
  322. package/locales/cs-CZ.json +7 -7
  323. package/locales/da-DK.json +7 -7
  324. package/locales/de-DE.json +7 -7
  325. package/locales/el-GR.json +7 -7
  326. package/locales/en.json +178 -6
  327. package/locales/es-ES.json +6 -6
  328. package/locales/fi-FI.json +7 -7
  329. package/locales/fr-FR.json +7 -7
  330. package/locales/he-IL.json +7 -7
  331. package/locales/hu-HU.json +7 -7
  332. package/locales/it-IT.json +7 -7
  333. package/locales/ja-JP.json +7 -7
  334. package/locales/ko-KR.json +7 -7
  335. package/locales/nl-NL.json +7 -7
  336. package/locales/no-NO.json +7 -7
  337. package/locales/pl-PL.json +7 -7
  338. package/locales/pseudo.json +130 -1
  339. package/locales/pt-BR.json +7 -7
  340. package/locales/pt-PT.json +7 -7
  341. package/locales/ro-RO.json +7 -7
  342. package/locales/ru-RU.json +7 -7
  343. package/locales/sr-SP.json +7 -7
  344. package/locales/sv-SE.json +7 -7
  345. package/locales/tr-TR.json +7 -7
  346. package/locales/uk-UA.json +7 -7
  347. package/locales/vi-VN.json +7 -7
  348. package/locales/zh-CN.json +7 -7
  349. package/locales/zh-TW.json +7 -7
  350. package/package.json +4 -5
  351. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  352. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  353. package/src/AlertDialog/AlertDialog.tsx +62 -20
  354. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  355. package/src/AspectRatio/AspectRatio.tsx +6 -6
  356. package/src/Avatar/Avatar.doc.mjs +12 -2
  357. package/src/Avatar/Avatar.test.tsx +80 -0
  358. package/src/Avatar/Avatar.tsx +64 -14
  359. package/src/Avatar/index.ts +2 -2
  360. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  361. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  362. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  363. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  364. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  365. package/src/Badge/Badge.doc.mjs +3 -2
  366. package/src/Badge/Badge.test.tsx +32 -3
  367. package/src/Badge/Badge.tsx +42 -1
  368. package/src/Banner/Banner.doc.mjs +9 -0
  369. package/src/Banner/Banner.test.tsx +76 -11
  370. package/src/Banner/Banner.tsx +21 -2
  371. package/src/Button/Button.doc.mjs +2 -1
  372. package/src/Button/Button.test.tsx +19 -4
  373. package/src/Button/Button.tsx +9 -29
  374. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  375. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  376. package/src/Calendar/Calendar.doc.mjs +4 -4
  377. package/src/Calendar/Calendar.test.tsx +112 -0
  378. package/src/Calendar/Calendar.tsx +18 -16
  379. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  380. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  381. package/src/Calendar/styles.ts +48 -42
  382. package/src/Card/Card.doc.mjs +10 -7
  383. package/src/Card/Card.test.tsx +113 -19
  384. package/src/Card/Card.tsx +67 -89
  385. package/src/Card/index.ts +36 -1
  386. package/src/Carousel/Carousel.doc.mjs +3 -0
  387. package/src/Carousel/Carousel.test.tsx +360 -0
  388. package/src/Carousel/Carousel.tsx +116 -15
  389. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -1
  390. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  391. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  392. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  393. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  394. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  395. package/src/CodeBlock/CodeBlock.tsx +20 -4
  396. package/src/CodeBlock/highlightRanges.ts +1 -1
  397. package/src/CodeBlock/highlightStyles.ts +13 -13
  398. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  399. package/src/ComplexSelector/ComplexSelector.doc.mjs +9 -2
  400. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  401. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  402. package/src/DateInput/DateInput.doc.mjs +17 -1
  403. package/src/DateInput/DateInput.test.tsx +9 -4
  404. package/src/DateInput/DateInput.tsx +54 -3
  405. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  406. package/src/DateInput/MonthScroller.tsx +5 -1
  407. package/src/DateInput/MonthYearWheels.tsx +7 -4
  408. package/src/DateInput/NativeDateField.test.tsx +635 -0
  409. package/src/DateInput/NativeDateField.tsx +641 -0
  410. package/src/DateInput/TouchDateField.tsx +83 -33
  411. package/src/DateInput/Wheel.tsx +1 -0
  412. package/src/DateInput/index.ts +1 -0
  413. package/src/DateInput/nativeDateSegments.ts +127 -0
  414. package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -3
  415. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  416. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  417. package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
  418. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  419. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  420. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  421. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  422. package/src/Dialog/Dialog.test.tsx +185 -18
  423. package/src/Dialog/Dialog.tsx +35 -11
  424. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  425. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  426. package/src/Field/Field.doc.mjs +1 -1
  427. package/src/Field/FieldLabel.test.tsx +29 -0
  428. package/src/Field/FieldLabel.tsx +7 -0
  429. package/src/Field/InputClearButton.test.tsx +15 -1
  430. package/src/Field/InputClearButton.tsx +28 -4
  431. package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
  432. package/src/FileInput/FileInput.doc.mjs +1 -1
  433. package/src/Heading/Heading.tsx +0 -1
  434. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  435. package/src/HoverCard/HoverCard.test.tsx +154 -4
  436. package/src/HoverCard/HoverCard.tsx +137 -3
  437. package/src/HoverCard/useHoverCard.tsx +23 -3
  438. package/src/Icon/Icon.test.tsx +55 -1
  439. package/src/Icon/Icon.tsx +5 -3
  440. package/src/Icon/defaultIcons.tsx +11 -2
  441. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  442. package/src/Icon/globalIconRegistry.tsx +37 -6
  443. package/src/Icon/index.ts +1 -0
  444. package/src/Icon/useIcon.ts +9 -2
  445. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  446. package/src/Indicator/Indicator.doc.mjs +3 -1
  447. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  448. package/src/Item/Item.tsx +2 -7
  449. package/src/Kbd/Kbd.test.tsx +0 -17
  450. package/src/Kbd/Kbd.tsx +2 -26
  451. package/src/Layer/gestureCounter.ts +57 -0
  452. package/src/Layer/useLayer.test.tsx +368 -16
  453. package/src/Layer/useLayer.tsx +208 -35
  454. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  455. package/src/List/List.test.tsx +38 -0
  456. package/src/List/List.tsx +8 -1
  457. package/src/Markdown/Markdown.test.tsx +37 -0
  458. package/src/Markdown/Markdown.tsx +16 -5
  459. package/src/Markdown/parser.test.ts +33 -0
  460. package/src/Markdown/parser.ts +9 -3
  461. package/src/MetadataList/MetadataList.test.tsx +75 -2
  462. package/src/MetadataList/MetadataListItem.tsx +5 -2
  463. package/src/MultiSelector/MultiSelector.doc.mjs +23 -2
  464. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  465. package/src/MultiSelector/MultiSelector.tsx +103 -16
  466. package/src/MultiSelector/hooks.ts +9 -2
  467. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  468. package/src/NavIcon/NavIcon.test.tsx +9 -0
  469. package/src/NavIcon/NavIcon.tsx +5 -1
  470. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  471. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  472. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  473. package/src/NumberInput/NumberInput.doc.mjs +27 -8
  474. package/src/NumberInput/NumberInput.test.tsx +563 -8
  475. package/src/NumberInput/NumberInput.tsx +77 -131
  476. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  477. package/src/NumberInput/numberInputCommit.ts +103 -0
  478. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  479. package/src/NumberInput/numberParser.test.ts +222 -0
  480. package/src/NumberInput/numberParser.ts +403 -0
  481. package/src/Outline/Outline.tsx +2 -4
  482. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  483. package/src/OverflowList/OverflowList.test.tsx +550 -4
  484. package/src/OverflowList/OverflowList.tsx +100 -2
  485. package/src/Pagination/Pagination.test.tsx +3 -2
  486. package/src/Popover/Popover.doc.mjs +2 -2
  487. package/src/Popover/Popover.test.tsx +38 -0
  488. package/src/Popover/Popover.tsx +28 -66
  489. package/src/Popover/usePopover.tsx +44 -5
  490. package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
  491. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  492. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  493. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  494. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  495. package/src/PowerSearch/formatFilterValue.ts +2 -0
  496. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  497. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  498. package/src/ProgressBar/ProgressBar.tsx +28 -8
  499. package/src/RadioList/RadioList.doc.mjs +1 -1
  500. package/src/Resizable/Resizable.doc.mjs +2 -2
  501. package/src/Resizable/useResizable.doc.mjs +21 -2
  502. package/src/Resizable/useResizable.test.ts +421 -0
  503. package/src/Resizable/useResizable.ts +133 -48
  504. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  505. package/src/SelectableCard/SelectableCard.tsx +16 -0
  506. package/src/Selector/Selector.doc.mjs +15 -1
  507. package/src/Selector/Selector.source-build.test.mjs +65 -0
  508. package/src/Selector/Selector.test.tsx +301 -0
  509. package/src/Selector/Selector.tsx +145 -32
  510. package/src/Selector/hooks.ts +17 -2
  511. package/src/SideNav/SideNav.doc.mjs +2 -2
  512. package/src/SideNav/SideNav.test.tsx +1069 -6
  513. package/src/SideNav/SideNav.tsx +109 -38
  514. package/src/SideNav/SideNavHeading.tsx +5 -2
  515. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  516. package/src/SideNav/SideNavItem.tsx +134 -44
  517. package/src/Slider/Slider.doc.mjs +2 -2
  518. package/src/Slider/Slider.test.tsx +106 -1
  519. package/src/Slider/Slider.tsx +52 -1
  520. package/src/Spinner/Spinner.doc.mjs +17 -5
  521. package/src/Spinner/Spinner.test.tsx +164 -0
  522. package/src/Spinner/Spinner.tsx +252 -22
  523. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  524. package/src/StatusDot/StatusDot.test.tsx +9 -0
  525. package/src/StatusDot/StatusDot.tsx +7 -1
  526. package/src/Stepper/Step.doc.mjs +1 -1
  527. package/src/Stepper/Step.tsx +7 -14
  528. package/src/Switch/Switch.doc.mjs +3 -1
  529. package/src/Switch/Switch.test.tsx +10 -0
  530. package/src/Switch/Switch.tsx +3 -0
  531. package/src/Table/BaseTable.tsx +6 -1
  532. package/src/Table/Table.doc.mjs +5 -3
  533. package/src/Table/Table.tsx +3 -8
  534. package/src/Table/TableBody.doc.mjs +2 -2
  535. package/src/Table/TableFooter.doc.mjs +1 -1
  536. package/src/Table/TableHeader.doc.mjs +1 -1
  537. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  538. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  539. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  540. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  541. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  542. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  543. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  544. package/src/Table/useTablePagination.doc.mjs +1 -1
  545. package/src/Table/useTableSelection.doc.mjs +1 -1
  546. package/src/Text/Text.test.tsx +44 -0
  547. package/src/Text/Text.tsx +0 -1
  548. package/src/TextArea/TextArea.doc.mjs +13 -3
  549. package/src/TextArea/TextArea.test.tsx +11 -0
  550. package/src/TextArea/TextArea.tsx +34 -22
  551. package/src/TextInput/TextInput.doc.mjs +1 -1
  552. package/src/TimeInput/TimeInput.doc.mjs +1 -1
  553. package/src/Timestamp/Timestamp.test.tsx +89 -0
  554. package/src/Timestamp/Timestamp.tsx +8 -8
  555. package/src/Timestamp/formatInstant.ts +5 -0
  556. package/src/Toast/Toast.doc.mjs +213 -44
  557. package/src/Toast/Toast.tsx +118 -23
  558. package/src/Toast/ToastViewport.test.tsx +1434 -8
  559. package/src/Toast/ToastViewport.tsx +85 -14
  560. package/src/Toast/index.ts +2 -0
  561. package/src/Toast/types.ts +43 -5
  562. package/src/Toast/useToastGesture.ts +361 -0
  563. package/src/Token/Token.test.tsx +95 -0
  564. package/src/Token/Token.tsx +19 -17
  565. package/src/Token/TokenLink.tsx +12 -3
  566. package/src/Tokenizer/Tokenizer.doc.mjs +17 -4
  567. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  568. package/src/Tokenizer/Tokenizer.tsx +49 -24
  569. package/src/TopNav/TopNavHeading.tsx +2 -2
  570. package/src/TopNav/TopNavItem.tsx +3 -7
  571. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  572. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  573. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  574. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  575. package/src/TopNav/TopNavMenu.tsx +38 -5
  576. package/src/TreeList/TreeList.test.tsx +49 -0
  577. package/src/TreeList/TreeList.tsx +7 -2
  578. package/src/TreeList/TreeListItem.tsx +2 -7
  579. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  580. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  581. package/src/Typeahead/Typeahead.doc.mjs +7 -1
  582. package/src/Typeahead/Typeahead.test.tsx +154 -0
  583. package/src/Typeahead/Typeahead.tsx +9 -0
  584. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  585. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  586. package/src/hooks/useAnnounce.doc.mjs +96 -0
  587. package/src/hooks/useDevWarning.doc.mjs +96 -0
  588. package/src/hooks/useHotkeys.test.ts +0 -18
  589. package/src/hooks/useHotkeys.ts +3 -25
  590. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  591. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  592. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  593. package/src/hooks/useLongPress.doc.mjs +123 -0
  594. package/src/hooks/useOverflow.doc.mjs +58 -17
  595. package/src/hooks/useOverflow.ts +16 -4
  596. package/src/hooks/useTypeahead.doc.mjs +153 -0
  597. package/src/i18n/InternationalizationContext.ts +3 -0
  598. package/src/i18n/InternationalizationProvider.tsx +8 -1
  599. package/src/i18n/__tests__/resolve.test.ts +23 -1
  600. package/src/i18n/resolve.ts +46 -49
  601. package/src/i18n/useTranslator.ts +2 -7
  602. package/src/index.ts +2 -0
  603. package/src/raw-import.d.ts +14 -0
  604. package/src/theme/Theme.test.tsx +104 -2
  605. package/src/theme/Theme.tsx +49 -14
  606. package/src/theme/defineTheme.test.ts +23 -0
  607. package/src/theme/defineTheme.ts +12 -3
  608. package/src/theme/derivedVarRegistry.test.ts +87 -3
  609. package/src/theme/derivedVarRegistry.ts +23 -4
  610. package/src/theme/generateThemeRules.test.ts +99 -1
  611. package/src/theme/generateThemeRules.ts +28 -0
  612. package/src/theme/syntax/tokens.ts +5 -2
  613. package/src/theme/useTheme.test.tsx +10 -0
  614. package/src/theme/useTheme.ts +16 -10
  615. package/src/utils/dateParser.test.ts +34 -2
  616. package/src/utils/dateParser.ts +11 -14
  617. package/src/utils/focusOutline.stylex.ts +50 -0
  618. package/src/utils/interactionOverlay.stylex.ts +74 -0
  619. package/src/utils/isApplePlatform.test.ts +61 -0
  620. package/src/utils/isApplePlatform.ts +37 -0
  621. package/src/utils/plainDate.test.ts +46 -0
  622. package/src/utils/plainDate.ts +18 -3
@@ -860,3 +860,107 @@ describe('TopNavMegaMenu — drawer focus ring', () => {
860
860
  expectSharedFocusRing(screen.getByRole('link', {name: /Analytics/}));
861
861
  });
862
862
  });
863
+
864
+ describe('TopNavMegaMenu pass-through props', () => {
865
+ it('forwards pass-through props to the trigger button', () => {
866
+ render(
867
+ <TopNavMegaMenu
868
+ label="Products"
869
+ aria-label="Products mega menu"
870
+ id="mega-trigger"
871
+ data-source="nav"
872
+ />,
873
+ );
874
+ const trigger = screen.getByRole('button', {name: 'Products mega menu'});
875
+ expect(trigger).toHaveAttribute('id', 'mega-trigger');
876
+ expect(trigger).toHaveAttribute('data-source', 'nav');
877
+ });
878
+
879
+ it('forwards pass-through props to the drawer trigger', () => {
880
+ render(
881
+ <TopNavRenderContext value="drawer">
882
+ <TopNavMegaMenu label="Products" id="mega-drawer" data-source="nav" />
883
+ </TopNavRenderContext>,
884
+ );
885
+ const trigger = screen.getByRole('button', {name: /Products/});
886
+ expect(trigger).toHaveAttribute('id', 'mega-drawer');
887
+ expect(trigger).toHaveAttribute('data-source', 'nav');
888
+ });
889
+ });
890
+
891
+ describe('TopNavMegaMenu — owned handlers on the trigger', () => {
892
+ beforeAll(installPopoverApiMock);
893
+ afterAll(restorePopoverApiMock);
894
+ afterEach(() => {
895
+ vi.useRealTimers();
896
+ });
897
+
898
+ it("composes a caller's onClick with the trigger's own open behavior", async () => {
899
+ const user = userEvent.setup();
900
+ const handleClick = vi.fn();
901
+ render(
902
+ <TopNavMegaMenu
903
+ label="Products"
904
+ items={<TopNavMegaMenuItem title="Analytics" href="/analytics" />}
905
+ onClick={handleClick}
906
+ />,
907
+ );
908
+
909
+ const trigger = screen.getByRole('button', {name: 'Products'});
910
+ await user.click(trigger);
911
+
912
+ expect(handleClick).toHaveBeenCalledOnce();
913
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
914
+ });
915
+
916
+ it("composes a caller's hover handlers with the trigger's hover-open behavior", async () => {
917
+ vi.useFakeTimers({shouldAdvanceTime: true});
918
+ const user = userEvent.setup({advanceTimers: vi.advanceTimersByTime});
919
+ const handleMouseEnter = vi.fn();
920
+ const handleMouseLeave = vi.fn();
921
+ render(
922
+ <TopNavMegaMenu
923
+ label="Products"
924
+ items={<TopNavMegaMenuItem title="Analytics" href="/analytics" />}
925
+ onMouseEnter={handleMouseEnter}
926
+ onMouseLeave={handleMouseLeave}
927
+ />,
928
+ );
929
+
930
+ const trigger = screen.getByRole('button', {name: 'Products'});
931
+ await user.hover(trigger);
932
+ act(() => {
933
+ vi.advanceTimersByTime(200);
934
+ });
935
+ expect(handleMouseEnter).toHaveBeenCalledOnce();
936
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
937
+
938
+ await user.unhover(trigger);
939
+ act(() => {
940
+ vi.advanceTimersByTime(400);
941
+ });
942
+ expect(handleMouseLeave).toHaveBeenCalledOnce();
943
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
944
+ });
945
+
946
+ it("composes a caller's onClick with the drawer section toggle", async () => {
947
+ const user = userEvent.setup();
948
+ const handleClick = vi.fn();
949
+ render(
950
+ <TopNavRenderContext value="drawer">
951
+ <TopNavMegaMenu
952
+ label="Products"
953
+ items={<TopNavMegaMenuItem title="Analytics" href="/analytics" />}
954
+ onClick={handleClick}
955
+ />
956
+ </TopNavRenderContext>,
957
+ );
958
+
959
+ const trigger = screen.getByRole('button', {name: /Products/});
960
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
961
+
962
+ await user.click(trigger);
963
+ expect(handleClick).toHaveBeenCalledOnce();
964
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
965
+ });
966
+ });
@@ -53,13 +53,14 @@ import {usePopover} from '../Popover/usePopover';
53
53
  import {useMenuHover} from '../hooks/useMenuHover';
54
54
  import {Grid} from '../Grid/Grid';
55
55
  import {Icon} from '../Icon';
56
- import {mergeProps} from '../utils';
56
+ import {mergeProps, composeEventHandlers} from '../utils';
57
57
  import type {BaseProps} from '../BaseProps';
58
58
  import {navItemStyles} from '../NavItem/navItemStyles.stylex';
59
59
  import {useTopNavSlot} from './TopNavContext';
60
60
  import {useTopNavRenderMode} from './TopNavRenderContext';
61
61
  import {themeProps} from '../utils/themeProps';
62
62
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
63
+ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
63
64
 
64
65
  import {useMergedRefs} from '../hooks/useMergedRefs';
65
66
  // =============================================================================
@@ -336,6 +337,7 @@ export function TopNavMegaMenu({
336
337
  delay = 150,
337
338
  hideDelay = 250,
338
339
  onOpenChange,
340
+ ...rest
339
341
  }: TopNavMegaMenuProps) {
340
342
  const renderMode = useTopNavRenderMode();
341
343
 
@@ -350,7 +352,14 @@ export function TopNavMegaMenu({
350
352
  // Drawer mode — inline collapsible
351
353
  // =========================================================================
352
354
  if (renderMode === 'drawer') {
353
- return <DrawerMegaMenu label={label} items={items} featured={featured} />;
355
+ return (
356
+ <DrawerMegaMenu
357
+ label={label}
358
+ items={items}
359
+ featured={featured}
360
+ {...rest}
361
+ />
362
+ );
354
363
  }
355
364
 
356
365
  // =========================================================================
@@ -365,6 +374,7 @@ export function TopNavMegaMenu({
365
374
  delay={delay}
366
375
  hideDelay={hideDelay}
367
376
  onOpenChange={onOpenChange}
377
+ {...rest}
368
378
  />
369
379
  );
370
380
  }
@@ -387,6 +397,13 @@ function DefaultMegaMenu({
387
397
  delay = 150,
388
398
  hideDelay = 250,
389
399
  onOpenChange,
400
+ xstyle,
401
+ className,
402
+ style,
403
+ onClick: onClickProp,
404
+ onMouseEnter: onMouseEnterProp,
405
+ onMouseLeave: onMouseLeaveProp,
406
+ ...rest
390
407
  }: TopNavMegaMenuProps) {
391
408
  const slot = useTopNavSlot();
392
409
  const triggerButtonRef = useRef<HTMLButtonElement | null>(null);
@@ -454,14 +471,27 @@ function DefaultMegaMenu({
454
471
  <button
455
472
  ref={useMergedRefs(triggerButtonRef, setTriggerEl, ref)}
456
473
  type="button"
474
+ {...rest}
457
475
  {...popover.triggerProps}
458
476
  {...hoverTriggerProps}
477
+ onClick={composeEventHandlers(onClickProp, hoverTriggerProps.onClick)}
478
+ onMouseEnter={composeEventHandlers(
479
+ onMouseEnterProp,
480
+ hoverTriggerProps.onMouseEnter,
481
+ )}
482
+ onMouseLeave={composeEventHandlers(
483
+ onMouseLeaveProp,
484
+ hoverTriggerProps.onMouseLeave,
485
+ )}
459
486
  {...mergeProps(
460
487
  themeProps('top-nav-mega-menu'),
461
488
  focusOutlineProps.focusVisible(
462
489
  styles.trigger,
463
490
  popover.isOpen && styles.triggerOpen,
491
+ xstyle,
464
492
  ),
493
+ className,
494
+ style,
465
495
  )}>
466
496
  {label}
467
497
  <Icon
@@ -513,7 +543,13 @@ function DrawerMegaMenu({
513
543
  label,
514
544
  items,
515
545
  featured,
516
- }: Pick<TopNavMegaMenuProps, 'label' | 'items' | 'featured'>) {
546
+ xstyle,
547
+ className,
548
+ style,
549
+ onClick: onClickProp,
550
+ ...rest
551
+ }: Pick<TopNavMegaMenuProps, 'label' | 'items' | 'featured'> &
552
+ BaseProps<HTMLButtonElement>) {
517
553
  const [isExpanded, setIsExpanded] = useState(false);
518
554
  const menuId = `mega-menu-${label.toLowerCase().replace(/\s+/g, '-')}`;
519
555
 
@@ -522,15 +558,22 @@ function DrawerMegaMenu({
522
558
  {/* Header toggle — same pattern as TopNavMenu drawer */}
523
559
  <button
524
560
  type="button"
525
- onClick={() => setIsExpanded(v => !v)}
561
+ {...rest}
562
+ onClick={composeEventHandlers(onClickProp, () =>
563
+ setIsExpanded(v => !v),
564
+ )}
526
565
  aria-expanded={isExpanded}
527
566
  aria-controls={`${menuId}-items`}
528
567
  {...mergeProps(
529
568
  themeProps('top-nav-mega-menu', {mode: 'drawer'}),
530
569
  focusOutlineProps.focusVisible(
531
570
  navItemStyles.item,
571
+ interactionOverlayStyles.backgroundColor,
532
572
  styles.drawerHeader,
573
+ xstyle,
533
574
  ),
575
+ className,
576
+ style,
534
577
  )}>
535
578
  {label}
536
579
  <Icon
@@ -35,6 +35,7 @@ import type {BaseProps} from '../BaseProps';
35
35
  import {useAppShellMobile} from '../AppShell/AppShellMobileContext';
36
36
  import {themeProps} from '../utils/themeProps';
37
37
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
38
+ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
38
39
 
39
40
  // =============================================================================
40
41
  // Styles
@@ -57,13 +58,6 @@ const styles = stylex.create({
57
58
  transitionProperty: 'background-color',
58
59
  transitionDuration: durationVars['--duration-fast'],
59
60
  transitionTimingFunction: easeVars['--ease-standard'],
60
- backgroundColor: {
61
- default: 'transparent',
62
- ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
63
- '@media (hover: hover)': colorVars['--color-overlay-hover'],
64
- },
65
- ':active': colorVars['--color-overlay-pressed'],
66
- },
67
61
  border: 'none',
68
62
  color: 'inherit',
69
63
  fontFamily: 'inherit',
@@ -218,7 +212,11 @@ export function TopNavMegaMenuItem({
218
212
  {...elementProps}
219
213
  {...mergeProps(
220
214
  themeProps('top-nav-mega-menu-item', {mode: 'drawer'}),
221
- focusOutlineProps.focusVisible(navItemStyles.item, styles.drawerItem),
215
+ focusOutlineProps.focusVisible(
216
+ navItemStyles.item,
217
+ interactionOverlayStyles.backgroundColor,
218
+ styles.drawerItem,
219
+ ),
222
220
  )}>
223
221
  {icon && <div {...stylex.props(styles.drawerItemIcon)}>{icon}</div>}
224
222
  <div {...stylex.props(styles.drawerItemContent)}>
@@ -245,7 +243,10 @@ export function TopNavMegaMenuItem({
245
243
  tabIndex={tabIndex}
246
244
  {...mergeProps(
247
245
  themeProps('top-nav-mega-menu-item'),
248
- focusOutlineProps.focusVisible(styles.desktop),
246
+ focusOutlineProps.focusVisible(
247
+ styles.desktop,
248
+ interactionOverlayStyles.backgroundColor,
249
+ ),
249
250
  )}>
250
251
  {icon && <div {...stylex.props(styles.desktopIcon)}>{icon}</div>}
251
252
  <div {...stylex.props(styles.desktopContent)}>
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import {describe, it, expect, vi} from 'vitest';
13
- import {render, screen, fireEvent} from '@testing-library/react';
13
+ import {render, screen, fireEvent, act} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import * as stylex from '@stylexjs/stylex';
16
16
  import {focusOutlineStyles} from '../utils/focusOutline.stylex';
@@ -212,3 +212,135 @@ describe('TopNavMenu — drawer focus ring', () => {
212
212
  expectSharedFocusRing(screen.getByRole('link', {name: /Analytics/}));
213
213
  });
214
214
  });
215
+
216
+ describe('TopNavMenu pass-through props', () => {
217
+ it('forwards pass-through props to the trigger button', () => {
218
+ render(
219
+ <TopNavMenu
220
+ label="Products"
221
+ items={mockItems}
222
+ aria-label="Products menu"
223
+ id="products-trigger"
224
+ data-source="nav"
225
+ />,
226
+ );
227
+ const trigger = screen.getByRole('button', {name: 'Products menu'});
228
+ expect(trigger).toHaveAttribute('id', 'products-trigger');
229
+ expect(trigger).toHaveAttribute('data-source', 'nav');
230
+ });
231
+
232
+ it('forwards pass-through props to the drawer trigger', () => {
233
+ render(
234
+ <TopNavRenderContext value="drawer">
235
+ <TopNavMenu
236
+ label="Products"
237
+ items={mockItems}
238
+ id="products-drawer"
239
+ data-source="nav"
240
+ />
241
+ </TopNavRenderContext>,
242
+ );
243
+ const trigger = screen.getByRole('button', {name: /Products/});
244
+ expect(trigger).toHaveAttribute('id', 'products-drawer');
245
+ expect(trigger).toHaveAttribute('data-source', 'nav');
246
+ });
247
+
248
+ it('keeps its own popup wiring when a caller passes the same attributes', () => {
249
+ render(
250
+ <TopNavMenu
251
+ label="Products"
252
+ items={mockItems}
253
+ aria-haspopup="dialog"
254
+ aria-expanded
255
+ data-source="nav"
256
+ />,
257
+ );
258
+ const trigger = screen.getByRole('button', {name: 'Products'});
259
+ expect({
260
+ hasPopup: trigger.getAttribute('aria-haspopup'),
261
+ isExpanded: trigger.getAttribute('aria-expanded'),
262
+ dataSource: trigger.getAttribute('data-source'),
263
+ }).toEqual({hasPopup: 'true', isExpanded: 'false', dataSource: 'nav'});
264
+ });
265
+ });
266
+
267
+ describe('TopNavMenu — owned handlers on the trigger', () => {
268
+ it("composes a caller's onClick with the trigger's own open behavior", async () => {
269
+ const user = userEvent.setup();
270
+ const handleClick = vi.fn();
271
+ render(
272
+ <TopNavMenu label="Products" items={mockItems} onClick={handleClick} />,
273
+ );
274
+
275
+ const trigger = screen.getByRole('button', {name: 'Products'});
276
+ await user.click(trigger);
277
+
278
+ expect(handleClick).toHaveBeenCalledOnce();
279
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
280
+ });
281
+
282
+ it("composes a caller's hover handlers with the trigger's hover wiring", async () => {
283
+ vi.useFakeTimers({shouldAdvanceTime: true});
284
+ const user = userEvent.setup({advanceTimers: vi.advanceTimersByTime});
285
+ const handleMouseEnter = vi.fn();
286
+ const handleMouseLeave = vi.fn();
287
+ render(
288
+ <TopNavMenu
289
+ label="Products"
290
+ items={mockItems}
291
+ onMouseEnter={handleMouseEnter}
292
+ onMouseLeave={handleMouseLeave}
293
+ />,
294
+ );
295
+
296
+ const trigger = screen.getByRole('button', {name: 'Products'});
297
+ await user.hover(trigger);
298
+ act(() => {
299
+ vi.advanceTimersByTime(200);
300
+ });
301
+ expect(handleMouseEnter).toHaveBeenCalledOnce();
302
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
303
+
304
+ await user.unhover(trigger);
305
+ act(() => {
306
+ vi.advanceTimersByTime(400);
307
+ });
308
+ expect(handleMouseLeave).toHaveBeenCalledOnce();
309
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
310
+ vi.useRealTimers();
311
+ });
312
+
313
+ it("composes a caller's onClick with the drawer section toggle", async () => {
314
+ const user = userEvent.setup();
315
+ const handleClick = vi.fn();
316
+ render(
317
+ <TopNavRenderContext value="drawer">
318
+ <TopNavMenu label="Products" items={mockItems} onClick={handleClick} />
319
+ </TopNavRenderContext>,
320
+ );
321
+
322
+ const trigger = screen.getByRole('button', {name: /Products/});
323
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
324
+
325
+ await user.click(trigger);
326
+ expect(handleClick).toHaveBeenCalledOnce();
327
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
328
+ });
329
+
330
+ it('still forwards hover handlers the drawer trigger does not own', async () => {
331
+ const user = userEvent.setup();
332
+ const handleMouseEnter = vi.fn();
333
+ render(
334
+ <TopNavRenderContext value="drawer">
335
+ <TopNavMenu
336
+ label="Products"
337
+ items={mockItems}
338
+ onMouseEnter={handleMouseEnter}
339
+ />
340
+ </TopNavRenderContext>,
341
+ );
342
+
343
+ await user.hover(screen.getByRole('button', {name: /Products/}));
344
+ expect(handleMouseEnter).toHaveBeenCalledOnce();
345
+ });
346
+ });
@@ -29,7 +29,7 @@ import {useMenuHover} from '../hooks/useMenuHover';
29
29
  import {useListFocus} from '../hooks/useListFocus';
30
30
  import {useTypeahead} from '../hooks/useTypeahead';
31
31
  import {Icon} from '../Icon';
32
- import {mergeProps} from '../utils';
32
+ import {mergeProps, composeEventHandlers} from '../utils';
33
33
  import {useMergedRefs} from '../hooks/useMergedRefs';
34
34
  import type {BaseProps} from '../BaseProps';
35
35
  import {navItemStyles} from '../NavItem/navItemStyles.stylex';
@@ -39,6 +39,7 @@ import {useAppShellMobile} from '../AppShell/AppShellMobileContext';
39
39
  import {useLinkComponent} from '../Link/useLinkComponent';
40
40
  import {themeProps} from '../utils/themeProps';
41
41
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
42
+ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
42
43
  import {
43
44
  colorVars,
44
45
  spacingVars,
@@ -332,6 +333,13 @@ export function TopNavMenu({
332
333
  items,
333
334
  delay = 150,
334
335
  hideDelay = 200,
336
+ xstyle,
337
+ className,
338
+ style,
339
+ onClick: onClickProp,
340
+ onMouseEnter: onMouseEnterProp,
341
+ onMouseLeave: onMouseLeaveProp,
342
+ ...rest
335
343
  }: TopNavMenuProps) {
336
344
  const renderMode = useTopNavRenderMode();
337
345
  const {closeMobileNav} = useAppShellMobile();
@@ -440,12 +448,23 @@ export function TopNavMenu({
440
448
  <div {...stylex.props(drawerStyles.section)}>
441
449
  <button
442
450
  type="button"
443
- onClick={() => setDrawerExpanded(v => !v)}
451
+ {...rest}
452
+ onMouseEnter={onMouseEnterProp}
453
+ onMouseLeave={onMouseLeaveProp}
454
+ onClick={composeEventHandlers(onClickProp, () =>
455
+ setDrawerExpanded(v => !v),
456
+ )}
444
457
  aria-expanded={drawerExpanded}
445
458
  aria-controls={`${menuId}-items`}
446
- {...focusOutlineProps.focusVisible(
447
- navItemStyles.item,
448
- drawerStyles.header,
459
+ {...mergeProps(
460
+ focusOutlineProps.focusVisible(
461
+ navItemStyles.item,
462
+ interactionOverlayStyles.backgroundColor,
463
+ drawerStyles.header,
464
+ xstyle,
465
+ ),
466
+ className,
467
+ style,
449
468
  )}>
450
469
  {label}
451
470
  <Icon
@@ -475,6 +494,7 @@ export function TopNavMenu({
475
494
  }}
476
495
  {...focusOutlineProps.focusVisible(
477
496
  navItemStyles.item,
497
+ interactionOverlayStyles.backgroundColor,
478
498
  drawerStyles.item,
479
499
  )}>
480
500
  {item.icon && (
@@ -504,14 +524,27 @@ export function TopNavMenu({
504
524
  <button
505
525
  ref={setTriggerRef}
506
526
  type="button"
527
+ {...rest}
507
528
  {...popover.triggerProps}
508
529
  {...triggerProps}
530
+ onClick={composeEventHandlers(onClickProp, triggerProps.onClick)}
531
+ onMouseEnter={composeEventHandlers(
532
+ onMouseEnterProp,
533
+ triggerProps.onMouseEnter,
534
+ )}
535
+ onMouseLeave={composeEventHandlers(
536
+ onMouseLeaveProp,
537
+ triggerProps.onMouseLeave,
538
+ )}
509
539
  {...mergeProps(
510
540
  themeProps('top-nav-menu'),
511
541
  focusOutlineProps.focusVisible(
512
542
  styles.trigger,
513
543
  popover.isOpen && styles.triggerOpen,
544
+ xstyle,
514
545
  ),
546
+ className,
547
+ style,
515
548
  )}>
516
549
  {label}
517
550
  <Icon
@@ -145,6 +145,18 @@ describe('TreeList', () => {
145
145
  expect(screen.getByTestId('tree')).toBeInTheDocument();
146
146
  });
147
147
 
148
+ it('forwards aria-label to the tree element', () => {
149
+ render(<TreeList items={simpleItems} aria-label="File tree" />);
150
+ const tree = screen.getByRole('tree');
151
+ expect(tree).toHaveAttribute('aria-label', 'File tree');
152
+ });
153
+
154
+ it('forwards id to the root element', () => {
155
+ render(<TreeList items={simpleItems} id="file-tree" />);
156
+ const root = screen.getByRole('tree').parentElement;
157
+ expect(root).toHaveAttribute('id', 'file-tree');
158
+ });
159
+
148
160
  it('renders description text', () => {
149
161
  const items: TreeListItemData[] = [
150
162
  {id: 'a', label: 'Label', description: 'Description text'},
@@ -194,6 +206,43 @@ describe('TreeList', () => {
194
206
  expect(tree).not.toHaveAttribute('aria-labelledby');
195
207
  });
196
208
 
209
+ it('prefers the visible header id over caller aria-labelledby when header exists', () => {
210
+ render(
211
+ <TreeList
212
+ items={simpleItems}
213
+ header={<span>File Tree</span>}
214
+ aria-labelledby="external-label"
215
+ />,
216
+ );
217
+ const tree = screen.getByRole('tree');
218
+ const headerId = tree.getAttribute('aria-labelledby');
219
+ expect(headerId).toBeTruthy();
220
+ expect(headerId).not.toBe('external-label');
221
+ const headerEl = document.getElementById(headerId!);
222
+ expect(headerEl?.textContent).toBe('File Tree');
223
+ });
224
+
225
+ it('uses caller aria-labelledby on the headerless path', () => {
226
+ render(<TreeList items={simpleItems} aria-labelledby="external-label" />);
227
+ const tree = screen.getByRole('tree');
228
+ expect(tree).toHaveAttribute('aria-labelledby', 'external-label');
229
+ });
230
+
231
+ it('ignores caller aria-label when a header names the tree', () => {
232
+ render(
233
+ <TreeList
234
+ items={simpleItems}
235
+ header={<span>File Tree</span>}
236
+ aria-label="External name"
237
+ />,
238
+ );
239
+ const tree = screen.getByRole('tree');
240
+ expect(tree).not.toHaveAttribute('aria-label');
241
+ const headerId = tree.getAttribute('aria-labelledby');
242
+ const headerEl = document.getElementById(headerId!);
243
+ expect(headerEl?.textContent).toBe('File Tree');
244
+ });
245
+
197
246
  // ===========================================================================
198
247
  // Expansion (internal state)
199
248
  // ===========================================================================
@@ -188,7 +188,10 @@ export function TreeList({
188
188
  className,
189
189
  style,
190
190
  'data-testid': testId,
191
+ 'aria-label': ariaLabel,
192
+ 'aria-labelledby': ariaLabelledby,
191
193
  ref,
194
+ ...restProps
192
195
  }: TreeListProps) {
193
196
  const headerId = useId();
194
197
 
@@ -336,7 +339,8 @@ export function TreeList({
336
339
  stylex.props(styles.root, xstyle),
337
340
  className,
338
341
  style,
339
- )}>
342
+ )}
343
+ {...restProps}>
340
344
  {header != null && (
341
345
  <div id={headerId} {...stylex.props(styles.header)}>
342
346
  {header}
@@ -345,7 +349,8 @@ export function TreeList({
345
349
  <ul
346
350
  ref={treeRef}
347
351
  role="tree"
348
- aria-labelledby={header != null ? headerId : undefined}
352
+ aria-label={header != null ? undefined : ariaLabel}
353
+ aria-labelledby={header != null ? headerId : ariaLabelledby}
349
354
  onKeyDown={handleKeyDown}
350
355
  onFocus={handleFocus}
351
356
  {...stylex.props(styles.list)}>
@@ -25,6 +25,7 @@ import {
25
25
  typeScaleVars,
26
26
  } from '../theme/tokens.stylex';
27
27
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
28
+ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
28
29
  import {Icon} from '../Icon';
29
30
  import {mergeProps} from '../utils';
30
31
  import {useLinkComponent} from '../Link/useLinkComponent';
@@ -102,13 +103,6 @@ const styles = stylex.create({
102
103
  transitionProperty: 'background-image',
103
104
  transitionDuration: durationVars['--duration-fast'],
104
105
  transitionTimingFunction: easeVars['--ease-standard'],
105
- backgroundImage: {
106
- default: null,
107
- ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
108
- '@media (hover: hover)': `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`,
109
- },
110
- ':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
111
- },
112
106
  },
113
107
  disabled: {
114
108
  cursor: 'default',
@@ -592,6 +586,7 @@ export function TreeListItem({
592
586
  styles.contentWrapper,
593
587
  densityStyles[density],
594
588
  styles.interactive,
589
+ interactionOverlayStyles.backgroundImage,
595
590
  isDisabled && styles.disabled,
596
591
  isSelected && styles.selected,
597
592
  )
@@ -65,6 +65,12 @@ export const docs = {
65
65
  type: 'number',
66
66
  description: 'Fixed dropdown width in pixels. The menu never shrinks below its anchor width.',
67
67
  },
68
+ {
69
+ name: 'minQueryLength',
70
+ type: 'number',
71
+ description: 'Minimum query length before the search source is queried. Below it no search runs and the menu stays closed.',
72
+ default: '1',
73
+ },
68
74
  {
69
75
  name: 'emptySearchResultsText',
70
76
  type: 'string',
@@ -179,6 +185,12 @@ export const docsZh = {
179
185
  type: 'number',
180
186
  description: '下拉菜单的固定像素宽度。菜单不会小于其锚点宽度。',
181
187
  },
188
+ {
189
+ name: 'minQueryLength',
190
+ type: 'number',
191
+ description: '查询搜索源前的最小查询长度。低于该长度不会发起搜索,菜单保持关闭。',
192
+ default: '1',
193
+ },
182
194
  {
183
195
  name: 'emptySearchResultsText',
184
196
  type: 'string',
@@ -264,6 +276,7 @@ export const docsDense = {
264
276
  hasEntriesOnFocus: 'Bootstrap results on focus.',
265
277
  maxMenuItems: 'Max dropdown items.',
266
278
  menuWidth: 'Fixed dropdown width in pixels.',
279
+ minQueryLength: 'Min query length before searching. Menu stays closed below it.',
267
280
  emptySearchResultsText: 'Text when no results.',
268
281
  isDisabled: 'Whether input disabled.',
269
282
  hasAutoFocus: 'Auto-focus on mount.',