@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f

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 (597) hide show
  1. package/CHANGELOG.md +161 -1
  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/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +40 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +51 -18
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +3 -1
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +14 -15
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +6 -9
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +6 -6
  49. package/dist/Carousel/Carousel.d.ts.map +1 -1
  50. package/dist/Carousel/Carousel.js +3 -3
  51. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  52. package/dist/Chat/ChatComposerInput.js +2 -3
  53. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  54. package/dist/Chat/ChatLayout.js +3 -3
  55. package/dist/Chat/ChatMessageList.d.ts +22 -3
  56. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  57. package/dist/Chat/ChatMessageList.js +6 -3
  58. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  59. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  60. package/dist/Chat/ChatTokenizedText.js +11 -6
  61. package/dist/Chat/useChatComposerTokens.js +1 -1
  62. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  63. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  64. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  65. package/dist/ClickableCard/ClickableCard.js +3 -3
  66. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  67. package/dist/CodeBlock/CodeBlock.js +15 -4
  68. package/dist/CodeBlock/highlightRanges.js +1 -1
  69. package/dist/CodeBlock/highlightStyles.js +13 -13
  70. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  71. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  72. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  73. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  74. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  75. package/dist/ContextMenu/ContextMenu.js +4 -3
  76. package/dist/DateInput/DateInput.d.ts +43 -0
  77. package/dist/DateInput/DateInput.d.ts.map +1 -1
  78. package/dist/DateInput/DateInput.js +22 -2
  79. package/dist/DateInput/NativeDateField.d.ts +10 -0
  80. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  81. package/dist/DateInput/NativeDateField.js +494 -0
  82. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  83. package/dist/DateInput/TouchDateField.js +82 -23
  84. package/dist/DateInput/index.d.ts +1 -1
  85. package/dist/DateInput/index.d.ts.map +1 -1
  86. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  87. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  88. package/dist/DateInput/nativeDateSegments.js +111 -0
  89. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  90. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  91. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  92. package/dist/DateTimeInput/index.d.ts +1 -1
  93. package/dist/DateTimeInput/index.d.ts.map +1 -1
  94. package/dist/Dialog/Dialog.d.ts +21 -1
  95. package/dist/Dialog/Dialog.d.ts.map +1 -1
  96. package/dist/Dialog/Dialog.js +110 -58
  97. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  98. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  99. package/dist/Field/FieldLabel.d.ts.map +1 -1
  100. package/dist/Field/FieldLabel.js +9 -1
  101. package/dist/FileInput/FileInput.d.ts.map +1 -1
  102. package/dist/FileInput/FileInput.js +3 -2
  103. package/dist/Heading/Heading.d.ts.map +1 -1
  104. package/dist/Heading/Heading.js +6 -2
  105. package/dist/HoverCard/HoverCard.d.ts +6 -0
  106. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  107. package/dist/HoverCard/HoverCard.js +104 -3
  108. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  109. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  110. package/dist/HoverCard/useHoverCard.js +74 -26
  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 +4 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -19
  117. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  118. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  119. package/dist/Layer/LayerDepthContext.js +66 -0
  120. package/dist/Layer/index.d.ts +3 -0
  121. package/dist/Layer/index.d.ts.map +1 -1
  122. package/dist/Layer/index.js +4 -0
  123. package/dist/Layer/layerStack.d.ts +98 -0
  124. package/dist/Layer/layerStack.d.ts.map +1 -0
  125. package/dist/Layer/layerStack.js +306 -0
  126. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  127. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  128. package/dist/Layer/useLayerDismissal.js +91 -0
  129. package/dist/Lightbox/Lightbox.d.ts +1 -0
  130. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  131. package/dist/Lightbox/Lightbox.js +103 -81
  132. package/dist/Markdown/Markdown.d.ts.map +1 -1
  133. package/dist/Markdown/Markdown.js +9 -4
  134. package/dist/Markdown/index.d.ts +1 -1
  135. package/dist/Markdown/index.d.ts.map +1 -1
  136. package/dist/Markdown/parser.d.ts +38 -1
  137. package/dist/Markdown/parser.d.ts.map +1 -1
  138. package/dist/Markdown/parser.js +182 -32
  139. package/dist/MobileNav/MobileNav.d.ts +6 -1
  140. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  141. package/dist/MobileNav/MobileNav.js +61 -36
  142. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  143. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  144. package/dist/MultiSelector/MultiSelector.js +63 -11
  145. package/dist/MultiSelector/index.d.ts +1 -1
  146. package/dist/MultiSelector/index.d.ts.map +1 -1
  147. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  148. package/dist/NavIcon/NavIcon.js +5 -1
  149. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  150. package/dist/NavMenu/NavHeadingMenu.js +3 -2
  151. package/dist/NumberInput/NumberInput.d.ts +6 -1
  152. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  153. package/dist/NumberInput/NumberInput.js +54 -104
  154. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  155. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  156. package/dist/NumberInput/numberInputCommit.js +71 -0
  157. package/dist/NumberInput/numberParser.d.ts +64 -0
  158. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  159. package/dist/NumberInput/numberParser.js +350 -0
  160. package/dist/Outline/Outline.d.ts.map +1 -1
  161. package/dist/Outline/Outline.js +3 -2
  162. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  163. package/dist/OverflowList/OverflowList.js +3 -2
  164. package/dist/Overlay/Overlay.d.ts.map +1 -1
  165. package/dist/Overlay/Overlay.js +3 -2
  166. package/dist/Popover/usePopover.d.ts.map +1 -1
  167. package/dist/Popover/usePopover.js +20 -17
  168. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  169. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearch.js +19 -6
  171. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  172. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  174. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  175. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  176. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  177. package/dist/PowerSearch/types.d.ts +2 -0
  178. package/dist/PowerSearch/types.d.ts.map +1 -1
  179. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  180. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  181. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  182. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  183. package/dist/ProgressBar/ProgressBar.js +18 -5
  184. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  185. package/dist/Resizable/ResizeHandle.js +3 -2
  186. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  187. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  188. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  189. package/dist/SelectableCard/SelectableCard.js +3 -3
  190. package/dist/Selector/Selector.d.ts +17 -0
  191. package/dist/Selector/Selector.d.ts.map +1 -1
  192. package/dist/Selector/Selector.js +81 -14
  193. package/dist/SideNav/SideNav.d.ts.map +1 -1
  194. package/dist/SideNav/SideNav.js +4 -3
  195. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  196. package/dist/SideNav/SideNavHeading.js +8 -7
  197. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  198. package/dist/SideNav/SideNavItem.js +4 -3
  199. package/dist/Slider/Slider.d.ts.map +1 -1
  200. package/dist/Slider/Slider.js +37 -5
  201. package/dist/Spinner/Spinner.d.ts +3 -3
  202. package/dist/Spinner/Spinner.d.ts.map +1 -1
  203. package/dist/Spinner/Spinner.js +130 -78
  204. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  205. package/dist/StatusDot/StatusDot.js +6 -1
  206. package/dist/Stepper/Step.d.ts +140 -0
  207. package/dist/Stepper/Step.d.ts.map +1 -0
  208. package/dist/Stepper/Step.js +1045 -0
  209. package/dist/Stepper/StepStatus.d.ts +24 -0
  210. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  211. package/dist/Stepper/StepStatus.js +1 -0
  212. package/dist/Stepper/Stepper.d.ts +93 -0
  213. package/dist/Stepper/Stepper.d.ts.map +1 -0
  214. package/dist/Stepper/Stepper.js +184 -0
  215. package/dist/Stepper/StepperContext.d.ts +41 -0
  216. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  217. package/dist/Stepper/StepperContext.js +34 -0
  218. package/dist/Stepper/index.d.ts +8 -0
  219. package/dist/Stepper/index.d.ts.map +1 -0
  220. package/dist/Stepper/index.js +7 -0
  221. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  222. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  223. package/dist/Stepper/stepper.stylex.js +20 -0
  224. package/dist/Switch/Switch.d.ts.map +1 -1
  225. package/dist/Switch/Switch.js +8 -3
  226. package/dist/TabList/Tab.d.ts +15 -2
  227. package/dist/TabList/Tab.d.ts.map +1 -1
  228. package/dist/TabList/Tab.js +32 -7
  229. package/dist/TabList/TabList.d.ts +46 -7
  230. package/dist/TabList/TabList.d.ts.map +1 -1
  231. package/dist/TabList/TabList.js +353 -23
  232. package/dist/TabList/TabListContext.d.ts +11 -1
  233. package/dist/TabList/TabListContext.d.ts.map +1 -1
  234. package/dist/TabList/TabListContext.js +11 -2
  235. package/dist/TabList/TabMenu.d.ts.map +1 -1
  236. package/dist/TabList/TabMenu.js +3 -2
  237. package/dist/TabList/index.d.ts +2 -2
  238. package/dist/TabList/index.d.ts.map +1 -1
  239. package/dist/Table/BaseTable.d.ts.map +1 -1
  240. package/dist/Table/BaseTable.js +10 -2
  241. package/dist/Table/Table.d.ts.map +1 -1
  242. package/dist/Table/Table.js +3 -6
  243. package/dist/Table/TableRow.d.ts +16 -5
  244. package/dist/Table/TableRow.d.ts.map +1 -1
  245. package/dist/Table/TableRow.js +16 -5
  246. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  247. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  248. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  249. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
  250. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  251. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  252. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  255. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  256. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  257. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  258. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  259. package/dist/Table/plugins/selection/useTableSelection.js +19 -5
  260. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  261. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  262. package/dist/Table/types.d.ts +22 -4
  263. package/dist/Table/types.d.ts.map +1 -1
  264. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  265. package/dist/Table/useBaseTablePlugins.js +5 -0
  266. package/dist/Text/Text.d.ts.map +1 -1
  267. package/dist/Text/Text.js +6 -2
  268. package/dist/TextArea/TextArea.d.ts.map +1 -1
  269. package/dist/TextArea/TextArea.js +9 -3
  270. package/dist/TextInput/TextInput.d.ts.map +1 -1
  271. package/dist/TextInput/TextInput.js +3 -2
  272. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  273. package/dist/TimeInput/TimeInput.js +3 -2
  274. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  275. package/dist/Timestamp/Timestamp.js +5 -3
  276. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  277. package/dist/Toast/ToastViewport.js +27 -8
  278. package/dist/Token/TokenLink.d.ts.map +1 -1
  279. package/dist/Token/TokenLink.js +2 -2
  280. package/dist/Tokenizer/Tokenizer.d.ts +3 -1
  281. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  282. package/dist/Tokenizer/Tokenizer.js +2 -0
  283. package/dist/Tooltip/Tooltip.d.ts +5 -0
  284. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  285. package/dist/Tooltip/useTooltip.d.ts +5 -0
  286. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  287. package/dist/Tooltip/useTooltip.js +39 -24
  288. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  289. package/dist/TopNav/TopNavHeading.js +5 -4
  290. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  291. package/dist/TopNav/TopNavMegaMenu.js +3 -3
  292. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  293. package/dist/TopNav/TopNavMenu.js +4 -3
  294. package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
  295. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  296. package/dist/Typeahead/BaseTypeahead.js +68 -29
  297. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  298. package/dist/Typeahead/Typeahead.js +3 -2
  299. package/dist/astryx.css +98 -7
  300. package/dist/hooks/index.d.ts +1 -0
  301. package/dist/hooks/index.d.ts.map +1 -1
  302. package/dist/hooks/index.js +1 -0
  303. package/dist/hooks/useFocusTrap.d.ts +7 -4
  304. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  305. package/dist/hooks/useFocusTrap.js +60 -95
  306. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  307. package/dist/hooks/useHotkeys.js +3 -18
  308. package/dist/hooks/useMergedRefs.d.ts +18 -0
  309. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  310. package/dist/hooks/useMergedRefs.js +25 -0
  311. package/dist/index.d.ts +1 -0
  312. package/dist/index.d.ts.map +1 -1
  313. package/dist/index.js +1 -0
  314. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  315. package/dist/theme/derivedVarRegistry.js +24 -4
  316. package/dist/theme/syntax/tokens.d.ts +1 -1
  317. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  318. package/dist/theme/syntax/tokens.js +5 -2
  319. package/dist/utils/groupItems.d.ts +5 -1
  320. package/dist/utils/groupItems.d.ts.map +1 -1
  321. package/dist/utils/groupItems.js +9 -9
  322. package/dist/utils/index.d.ts +1 -1
  323. package/dist/utils/index.d.ts.map +1 -1
  324. package/dist/utils/isApplePlatform.d.ts +18 -0
  325. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  326. package/dist/utils/isApplePlatform.js +37 -0
  327. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  328. package/dist/utils/sharedResizeObserver.js +10 -1
  329. package/dist/utils/timeParser.d.ts +1 -1
  330. package/dist/utils/timeParser.d.ts.map +1 -1
  331. package/dist/utils/timeParser.js +26 -12
  332. package/locales/en.json +154 -10
  333. package/locales/pseudo.json +108 -0
  334. package/package.json +8 -3
  335. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  336. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  337. package/src/AlertDialog/AlertDialog.tsx +62 -20
  338. package/src/AppShell/AppShell.tsx +3 -2
  339. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  340. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  341. package/src/AspectRatio/AspectRatio.tsx +40 -1
  342. package/src/Avatar/Avatar.doc.mjs +14 -3
  343. package/src/Avatar/Avatar.test.tsx +97 -0
  344. package/src/Avatar/Avatar.tsx +125 -52
  345. package/src/Avatar/index.ts +2 -2
  346. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  347. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  348. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  349. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  350. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  351. package/src/Banner/Banner.doc.mjs +13 -11
  352. package/src/Banner/Banner.test.tsx +102 -15
  353. package/src/Banner/Banner.tsx +72 -25
  354. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  355. package/src/BottomSheet/BottomSheet.tsx +17 -4
  356. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  357. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  358. package/src/Button/Button.doc.mjs +24 -1
  359. package/src/Button/Button.test.tsx +32 -4
  360. package/src/Button/Button.tsx +12 -5
  361. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  362. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  363. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  364. package/src/Calendar/Calendar.doc.mjs +4 -3
  365. package/src/Calendar/Calendar.test.tsx +103 -0
  366. package/src/Calendar/Calendar.tsx +19 -16
  367. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  368. package/src/Calendar/getInitialFocusDate.ts +93 -0
  369. package/src/Calendar/styles.ts +49 -31
  370. package/src/Card/Card.doc.mjs +10 -7
  371. package/src/Card/Card.test.tsx +44 -19
  372. package/src/Card/Card.tsx +12 -32
  373. package/src/Carousel/Carousel.tsx +3 -2
  374. package/src/Chat/ChatComposerInput.tsx +5 -1
  375. package/src/Chat/ChatLayout.tsx +3 -2
  376. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  377. package/src/Chat/ChatMessageList.test.tsx +46 -0
  378. package/src/Chat/ChatMessageList.tsx +28 -4
  379. package/src/Chat/ChatTokenizedText.tsx +17 -10
  380. package/src/Chat/useChatComposerTokens.ts +1 -1
  381. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  382. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  383. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  384. package/src/ClickableCard/ClickableCard.tsx +3 -2
  385. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  386. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  387. package/src/CodeBlock/CodeBlock.tsx +20 -4
  388. package/src/CodeBlock/highlightRanges.ts +1 -1
  389. package/src/CodeBlock/highlightStyles.ts +13 -13
  390. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  391. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  392. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  393. package/src/ContextMenu/ContextMenu.tsx +4 -3
  394. package/src/DateInput/DateInput.doc.mjs +16 -0
  395. package/src/DateInput/DateInput.tsx +55 -2
  396. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  397. package/src/DateInput/NativeDateField.test.tsx +635 -0
  398. package/src/DateInput/NativeDateField.tsx +641 -0
  399. package/src/DateInput/TouchDateField.tsx +108 -24
  400. package/src/DateInput/index.ts +1 -0
  401. package/src/DateInput/nativeDateSegments.ts +127 -0
  402. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  403. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  404. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  405. package/src/DateTimeInput/index.ts +1 -0
  406. package/src/Dialog/Dialog.doc.mjs +8 -3
  407. package/src/Dialog/Dialog.test.tsx +429 -2
  408. package/src/Dialog/Dialog.tsx +133 -58
  409. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  410. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  411. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  412. package/src/Field/Field.doc.mjs +13 -2
  413. package/src/Field/FieldLabel.test.tsx +29 -0
  414. package/src/Field/FieldLabel.tsx +7 -0
  415. package/src/FileInput/FileInput.tsx +3 -2
  416. package/src/Heading/Heading.test.tsx +23 -1
  417. package/src/Heading/Heading.tsx +6 -2
  418. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  419. package/src/HoverCard/HoverCard.test.tsx +154 -4
  420. package/src/HoverCard/HoverCard.tsx +143 -3
  421. package/src/HoverCard/useHoverCard.tsx +104 -33
  422. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  423. package/src/Indicator/Indicator.doc.mjs +2 -0
  424. package/src/Item/Item.tsx +5 -4
  425. package/src/Kbd/Kbd.tsx +2 -19
  426. package/src/Layer/LayerDepthContext.tsx +62 -0
  427. package/src/Layer/index.ts +9 -0
  428. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  429. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  430. package/src/Layer/layerStack.ts +362 -0
  431. package/src/Layer/useLayer.test.tsx +62 -14
  432. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  433. package/src/Layer/useLayerDismissal.ts +173 -0
  434. package/src/Layout/Layout.doc.mjs +2 -2
  435. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  436. package/src/Lightbox/Lightbox.tsx +124 -102
  437. package/src/Link/Link.doc.mjs +39 -0
  438. package/src/Markdown/Markdown.doc.mjs +5 -0
  439. package/src/Markdown/Markdown.tsx +9 -4
  440. package/src/Markdown/incremental.test.ts +16 -2
  441. package/src/Markdown/index.ts +1 -0
  442. package/src/Markdown/parser.perf.test.ts +96 -1
  443. package/src/Markdown/parser.test.ts +178 -2
  444. package/src/Markdown/parser.ts +253 -32
  445. package/src/MobileNav/MobileNav.tsx +62 -36
  446. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  447. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  448. package/src/MultiSelector/MultiSelector.test.tsx +277 -0
  449. package/src/MultiSelector/MultiSelector.tsx +142 -11
  450. package/src/MultiSelector/index.ts +1 -0
  451. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  452. package/src/NavIcon/NavIcon.test.tsx +9 -0
  453. package/src/NavIcon/NavIcon.tsx +5 -1
  454. package/src/NavMenu/NavHeadingMenu.tsx +3 -2
  455. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  456. package/src/NumberInput/NumberInput.test.tsx +436 -8
  457. package/src/NumberInput/NumberInput.tsx +62 -114
  458. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  459. package/src/NumberInput/numberInputCommit.ts +103 -0
  460. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  461. package/src/NumberInput/numberParser.test.ts +222 -0
  462. package/src/NumberInput/numberParser.ts +403 -0
  463. package/src/Outline/Outline.tsx +3 -2
  464. package/src/OverflowList/OverflowList.tsx +3 -2
  465. package/src/Overlay/Overlay.tsx +3 -2
  466. package/src/Pagination/Pagination.test.tsx +3 -2
  467. package/src/Popover/usePopover.tsx +31 -28
  468. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  469. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  470. package/src/PowerSearch/PowerSearch.tsx +34 -5
  471. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  472. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  473. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  474. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  475. package/src/PowerSearch/types.ts +2 -0
  476. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  477. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  478. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  479. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  480. package/src/ProgressBar/ProgressBar.tsx +28 -8
  481. package/src/Resizable/ResizeHandle.tsx +3 -2
  482. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  483. package/src/SelectableCard/SelectableCard.tsx +3 -2
  484. package/src/Selector/Selector.doc.mjs +26 -1
  485. package/src/Selector/Selector.test.tsx +311 -1
  486. package/src/Selector/Selector.tsx +139 -16
  487. package/src/SideNav/SideNav.doc.mjs +6 -6
  488. package/src/SideNav/SideNav.tsx +4 -2
  489. package/src/SideNav/SideNavHeading.tsx +12 -12
  490. package/src/SideNav/SideNavItem.tsx +4 -2
  491. package/src/Slider/Slider.test.tsx +106 -1
  492. package/src/Slider/Slider.tsx +55 -3
  493. package/src/Spinner/Spinner.test.tsx +147 -1
  494. package/src/Spinner/Spinner.tsx +120 -101
  495. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  496. package/src/StatusDot/StatusDot.test.tsx +9 -0
  497. package/src/StatusDot/StatusDot.tsx +7 -1
  498. package/src/Stepper/Step.doc.mjs +98 -0
  499. package/src/Stepper/Step.tsx +1638 -0
  500. package/src/Stepper/StepStatus.ts +26 -0
  501. package/src/Stepper/Stepper.doc.mjs +370 -0
  502. package/src/Stepper/Stepper.test.tsx +1024 -0
  503. package/src/Stepper/Stepper.tsx +258 -0
  504. package/src/Stepper/StepperContext.ts +71 -0
  505. package/src/Stepper/index.ts +18 -0
  506. package/src/Stepper/stepper.stylex.ts +19 -0
  507. package/src/Switch/Switch.doc.mjs +2 -0
  508. package/src/Switch/Switch.test.tsx +10 -0
  509. package/src/Switch/Switch.tsx +6 -2
  510. package/src/TabList/Tab.doc.mjs +13 -1
  511. package/src/TabList/Tab.tsx +67 -7
  512. package/src/TabList/TabList.doc.mjs +22 -6
  513. package/src/TabList/TabList.test.tsx +559 -0
  514. package/src/TabList/TabList.tsx +490 -22
  515. package/src/TabList/TabListContext.ts +13 -2
  516. package/src/TabList/TabMenu.tsx +3 -2
  517. package/src/TabList/index.ts +6 -2
  518. package/src/Table/BaseTable.tsx +12 -4
  519. package/src/Table/Table.doc.mjs +9 -2
  520. package/src/Table/Table.test.tsx +132 -14
  521. package/src/Table/Table.tsx +3 -8
  522. package/src/Table/TableBody.doc.mjs +40 -0
  523. package/src/Table/TableFooter.doc.mjs +40 -0
  524. package/src/Table/TableHeader.doc.mjs +40 -0
  525. package/src/Table/TableRow.tsx +16 -5
  526. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  527. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  528. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  529. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  530. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
  531. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  532. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  533. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  534. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  535. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  536. package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
  537. package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
  538. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  539. package/src/Table/types.ts +22 -4
  540. package/src/Table/useBaseTablePlugins.ts +5 -0
  541. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  542. package/src/Table/useTablePagination.doc.mjs +7 -0
  543. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  544. package/src/Table/useTableSelection.doc.mjs +31 -0
  545. package/src/Text/Text.test.tsx +23 -1
  546. package/src/Text/Text.tsx +6 -2
  547. package/src/TextArea/TextArea.doc.mjs +8 -2
  548. package/src/TextArea/TextArea.test.tsx +11 -0
  549. package/src/TextArea/TextArea.tsx +15 -8
  550. package/src/TextInput/TextInput.doc.mjs +10 -0
  551. package/src/TextInput/TextInput.tsx +3 -2
  552. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  553. package/src/TimeInput/TimeInput.tsx +2 -2
  554. package/src/Timestamp/Timestamp.test.tsx +18 -0
  555. package/src/Timestamp/Timestamp.tsx +4 -2
  556. package/src/Toast/Toast.doc.mjs +6 -0
  557. package/src/Toast/ToastViewport.tsx +17 -1
  558. package/src/Token/TokenLink.tsx +2 -2
  559. package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
  560. package/src/Tokenizer/Tokenizer.tsx +4 -0
  561. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  562. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  563. package/src/Tooltip/Tooltip.test.tsx +32 -0
  564. package/src/Tooltip/Tooltip.tsx +5 -0
  565. package/src/Tooltip/useTooltip.tsx +47 -24
  566. package/src/TopNav/TopNavHeading.tsx +5 -4
  567. package/src/TopNav/TopNavMegaMenu.tsx +3 -2
  568. package/src/TopNav/TopNavMenu.tsx +4 -3
  569. package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
  570. package/src/Typeahead/BaseTypeahead.tsx +85 -33
  571. package/src/Typeahead/Typeahead.doc.mjs +5 -0
  572. package/src/Typeahead/Typeahead.test.tsx +49 -0
  573. package/src/Typeahead/Typeahead.tsx +3 -2
  574. package/src/hooks/index.ts +2 -0
  575. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  576. package/src/hooks/useFocusTrap.test.tsx +14 -0
  577. package/src/hooks/useFocusTrap.ts +62 -111
  578. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  579. package/src/hooks/useHotkeys.ts +3 -18
  580. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  581. package/src/hooks/useMergedRefs.test.tsx +62 -0
  582. package/src/hooks/useMergedRefs.ts +36 -0
  583. package/src/index.ts +1 -0
  584. package/src/raw-import.d.ts +14 -0
  585. package/src/theme/MediaTheme.doc.mjs +5 -5
  586. package/src/theme/derivedVarRegistry.test.ts +19 -3
  587. package/src/theme/derivedVarRegistry.ts +23 -4
  588. package/src/theme/generateThemeRules.test.ts +37 -0
  589. package/src/theme/syntax/tokens.ts +5 -2
  590. package/src/utils/groupItems.ts +12 -6
  591. package/src/utils/index.ts +1 -1
  592. package/src/utils/isApplePlatform.test.ts +61 -0
  593. package/src/utils/isApplePlatform.ts +37 -0
  594. package/src/utils/sharedResizeObserver.ts +10 -2
  595. package/src/utils/timeParser.test.ts +6 -1
  596. package/src/utils/timeParser.ts +35 -13
  597. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -17,7 +17,7 @@
17
17
 
18
18
  import type {ReactNode, Ref} from 'react';
19
19
  import * as stylex from '@stylexjs/stylex';
20
- import {mergeProps, mergeRefs} from '../utils';
20
+ import {mergeProps} from '../utils';
21
21
  import {useOverlay} from './useOverlay';
22
22
  import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
23
23
  import {overlayScope, overlayContainerStyles} from './overlay.markers.stylex';
@@ -30,6 +30,7 @@ import type {
30
30
  OverlayShowOn,
31
31
  } from './OverlayScrim';
32
32
 
33
+ import {useMergedRefs} from '../hooks/useMergedRefs';
33
34
  export interface OverlayProps extends Pick<
34
35
  BaseProps<HTMLDivElement>,
35
36
  'xstyle' | 'className' | 'style'
@@ -113,7 +114,7 @@ export function Overlay({
113
114
 
114
115
  return (
115
116
  <div
116
- ref={mergeRefs(ref, overlay.containerRef)}
117
+ ref={useMergedRefs(ref, overlay.containerRef)}
117
118
  {...mergeProps(
118
119
  themeProps('overlay'),
119
120
  stylex.props(overlayScope, overlayContainerStyles.root, xstyle),
@@ -613,7 +613,7 @@ describe('Pagination', () => {
613
613
  expect(box).toHaveAttribute('aria-valuemax', '10');
614
614
  });
615
615
 
616
- it('commits a typed page on Enter and rejects an over-range entry', async () => {
616
+ it('commits a typed page on Enter and clamps an over-range entry', async () => {
617
617
  const user = userEvent.setup();
618
618
  const onChange = vi.fn();
619
619
  render(
@@ -633,9 +633,10 @@ describe('Pagination', () => {
633
633
  onChange.mockClear();
634
634
  await user.clear(box);
635
635
  // The box is a NumberInput bounded to [1, totalPages]: an over-max entry
636
- // is rejected and never navigates past the last page.
636
+ // lands on the last page rather than navigating past it.
637
637
  await user.type(box, '99{Enter}');
638
638
  expect(onChange).not.toHaveBeenCalledWith(99);
639
+ expect(onChange).toHaveBeenCalledWith(10);
639
640
  });
640
641
 
641
642
  it('commits on blur', async () => {
@@ -19,6 +19,7 @@ import React, {useCallback, useEffect, useRef, type ReactNode} from 'react';
19
19
  import * as stylex from '@stylexjs/stylex';
20
20
  import {useLayer, type ContextRenderProps} from '../Layer/useLayer';
21
21
  import {useFocusTrap} from '../hooks/useFocusTrap';
22
+ import {LayerDepthProvider} from '../Layer/LayerDepthContext';
22
23
  import type {StyleXStyles} from '@stylexjs/stylex';
23
24
  import {
24
25
  colorVars,
@@ -436,34 +437,36 @@ export function usePopover(options: UsePopoverOptions = {}): UsePopoverReturn {
436
437
  : surfaceProps.className;
437
438
 
438
439
  return layer.render(
439
- <div
440
- ref={contentRef}
441
- role={role === 'dialog' ? 'dialog' : undefined}
442
- aria-modal={role === 'dialog' && isModal ? true : undefined}
443
- aria-label={role === 'dialog' ? dialogLabel : undefined}
444
- {...mergeProps(
445
- {...surfaceProps, className: surfaceClassName},
446
- stylex.props(
447
- styles.contentWrapper,
448
- hasSurface && styles.surface,
449
- xstyle,
450
- ),
451
- )}>
452
- {children}
453
- {hasCloseButton && (
454
- <div
455
- {...stylex.props(
456
- styles.closeButtonWrapper,
457
- rtlStyles.centerInline('100%'),
458
- )}>
459
- <Button
460
- variant="secondary"
461
- label={closeButtonLabel}
462
- onClick={layer.hide}
463
- />
464
- </div>
465
- )}
466
- </div>,
440
+ <LayerDepthProvider>
441
+ <div
442
+ ref={contentRef}
443
+ role={role === 'dialog' ? 'dialog' : undefined}
444
+ aria-modal={role === 'dialog' && isModal ? true : undefined}
445
+ aria-label={role === 'dialog' ? dialogLabel : undefined}
446
+ {...mergeProps(
447
+ {...surfaceProps, className: surfaceClassName},
448
+ stylex.props(
449
+ styles.contentWrapper,
450
+ hasSurface && styles.surface,
451
+ xstyle,
452
+ ),
453
+ )}>
454
+ {children}
455
+ {hasCloseButton && (
456
+ <div
457
+ {...stylex.props(
458
+ styles.closeButtonWrapper,
459
+ rtlStyles.centerInline('100%'),
460
+ )}>
461
+ <Button
462
+ variant="secondary"
463
+ label={closeButtonLabel}
464
+ onClick={layer.hide}
465
+ />
466
+ </div>
467
+ )}
468
+ </div>
469
+ </LayerDepthProvider>,
467
470
  {...props, xstyle: props?.xstyle},
468
471
  );
469
472
  },
@@ -6,7 +6,17 @@ export const docs = {
6
6
  name: 'PowerSearch',
7
7
  displayName: 'Power Search',
8
8
  category: 'Data Input',
9
- keywords: ["powersearch","search","searchbar","filter","filterbar","faceted","querybuilder","structured","omnibar"],
9
+ keywords: [
10
+ 'powersearch',
11
+ 'search',
12
+ 'searchbar',
13
+ 'filter',
14
+ 'filterbar',
15
+ 'faceted',
16
+ 'querybuilder',
17
+ 'structured',
18
+ 'omnibar',
19
+ ],
10
20
  props: [
11
21
  {
12
22
  name: 'config',
@@ -43,8 +53,7 @@ export const docs = {
43
53
  {
44
54
  name: 'placeholder',
45
55
  type: 'string',
46
- description:
47
- 'Placeholder text shown when no filters are selected.',
56
+ description: 'Placeholder text shown when no filters are selected.',
48
57
  default: "'Search...'",
49
58
  },
50
59
  {
@@ -80,8 +89,7 @@ export const docs = {
80
89
  {
81
90
  name: 'status',
82
91
  type: "{type: 'warning' | 'error' | 'success', message?: string}",
83
- description:
84
- 'Validation status object with type and optional message.',
92
+ description: 'Validation status object with type and optional message.',
85
93
  },
86
94
  {
87
95
  name: 'startIcon',
@@ -103,6 +111,26 @@ export const docs = {
103
111
  description: 'Max character length for filter value display in tokens.',
104
112
  default: '40',
105
113
  },
114
+ {
115
+ name: 'maxOperatorMenuItems',
116
+ type: 'number',
117
+ description:
118
+ 'Maximum suggestions shown in string and entity value typeaheads. Does not affect the main field search menu or enum value menus.',
119
+ default: '10',
120
+ },
121
+ {
122
+ name: 'maxSearchResults',
123
+ type: 'number',
124
+ description:
125
+ 'Max ranked results for a non-empty query. Does not affect a field value editor. Browsing with an empty query shows up to 1,000 fields.',
126
+ default: '10',
127
+ },
128
+ {
129
+ name: 'menuWidth',
130
+ type: 'number',
131
+ description:
132
+ 'Width in pixels for the main field/search menu. Does not affect field value editors.',
133
+ },
106
134
  {
107
135
  name: 'popoverSaveButtonLabel',
108
136
  type: 'string',
@@ -142,6 +170,32 @@ export const docs = {
142
170
  description: 'Size of the search input and tokens.',
143
171
  default: "'md'",
144
172
  },
173
+ {
174
+ name: 'menuWidth',
175
+ type: 'number',
176
+ description: 'Maximum width for the operator/value dropdown menu in pixels.',
177
+ },
178
+ {
179
+ name: 'maxOperatorMenuItems',
180
+ type: 'number',
181
+ description: 'Maximum number of items displayed in the operator dropdown.',
182
+ },
183
+ {
184
+ name: 'tokenOverflowBehavior',
185
+ type: "'none' | 'unfocusedInline' | 'unfocusedLayer'",
186
+ description: 'Controls how tokens overflow when the container is too narrow. Forwarded to Tokenizer.',
187
+ default: "'none'",
188
+ },
189
+ {
190
+ name: 'onFocus',
191
+ type: '(e: FocusEvent<HTMLInputElement>) => void',
192
+ description: 'Fires when focus enters the search input.',
193
+ },
194
+ {
195
+ name: 'onBlur',
196
+ type: '(e: FocusEvent<HTMLInputElement>) => void',
197
+ description: 'Fires when focus leaves the search input.',
198
+ },
145
199
  {
146
200
  name: 'xstyle',
147
201
  type: 'StyleXStyles',
@@ -153,16 +207,30 @@ export const docs = {
153
207
  description:
154
208
  'PowerSearch is a structured filter bar where each token represents a field, operator, and value. Use it for complex multi-dimensional filtering when users need to combine multiple search criteria. For simple single-field search, use a text input instead.',
155
209
  bestPractices: [
156
- { guidance: true, description: 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.' },
157
- { guidance: true, description: 'Provide a result count to give users feedback on how their filters affect the data set.' },
158
- { guidance: false, description: 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.' },
159
- { guidance: false, description: 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
210
+ {
211
+ guidance: true,
212
+ description:
213
+ 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.',
214
+ },
215
+ {
216
+ guidance: true,
217
+ description:
218
+ 'Provide a result count to give users feedback on how their filters affect the data set.',
219
+ },
220
+ {
221
+ guidance: false,
222
+ description:
223
+ 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.',
224
+ },
225
+ {
226
+ guidance: false,
227
+ description:
228
+ 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.',
229
+ },
160
230
  ],
161
231
  },
162
232
  theming: {
163
- targets: [
164
- {className: 'astryx-power-search'},
165
- ],
233
+ targets: [{className: 'astryx-power-search'}],
166
234
  },
167
235
  };
168
236
 
@@ -268,6 +336,25 @@ export const docsZh = {
268
336
  description: '令牌中过滤器值显示的最大字符长度。',
269
337
  default: '40',
270
338
  },
339
+ {
340
+ name: 'maxOperatorMenuItems',
341
+ type: 'number',
342
+ description:
343
+ '字符串和实体值预输入菜单中显示的最大建议数。不影响主字段搜索菜单或枚举值菜单。',
344
+ default: '10',
345
+ },
346
+ {
347
+ name: 'maxSearchResults',
348
+ type: 'number',
349
+ description:
350
+ '非空查询的最大排名结果数。不影响字段值编辑器。使用空查询浏览时最多显示 1,000 个字段。',
351
+ default: '10',
352
+ },
353
+ {
354
+ name: 'menuWidth',
355
+ type: 'number',
356
+ description: '主字段/搜索菜单的像素宽度。不影响字段值编辑器。',
357
+ },
271
358
  {
272
359
  name: 'popoverSaveButtonLabel',
273
360
  type: 'string',
@@ -282,7 +369,8 @@ export const docsZh = {
282
369
  {
283
370
  name: 'handleRef',
284
371
  type: 'Ref<PowerSearchHandle>',
285
- description: '提供 focusTypeahead() 和 blurTypeahead() 方法的命令式句柄。',
372
+ description:
373
+ '提供 focusTypeahead() 和 blurTypeahead() 方法的命令式句柄。',
286
374
  },
287
375
  {
288
376
  name: 'endContent',
@@ -311,10 +399,26 @@ export const docsZh = {
311
399
  description:
312
400
  'PowerSearch is a structured filter bar where each token represents a field, operator, and value. Use it for complex multi-dimensional filtering when users need to combine multiple search criteria. For simple single-field search, use a text input instead.',
313
401
  bestPractices: [
314
- { guidance: true, description: 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.' },
315
- { guidance: true, description: 'Provide a result count to give users feedback on how their filters affect the data set.' },
316
- { guidance: false, description: 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.' },
317
- { guidance: false, description: 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
402
+ {
403
+ guidance: true,
404
+ description:
405
+ 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.',
406
+ },
407
+ {
408
+ guidance: true,
409
+ description:
410
+ 'Provide a result count to give users feedback on how their filters affect the data set.',
411
+ },
412
+ {
413
+ guidance: false,
414
+ description:
415
+ 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.',
416
+ },
417
+ {
418
+ guidance: false,
419
+ description:
420
+ 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.',
421
+ },
318
422
  ],
319
423
  },
320
424
  };
@@ -327,16 +431,33 @@ export const docsDense = {
327
431
  description:
328
432
  'PowerSearch is a structured filter bar where each token represents a field, operator, and value. Use it for complex multi-dimensional filtering when users need to combine multiple search criteria. For simple single-field search, use a text input instead.',
329
433
  bestPractices: [
330
- { guidance: true, description: 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.' },
331
- { guidance: true, description: 'Provide a result count to give users feedback on how their filters affect the data set.' },
332
- { guidance: false, description: 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.' },
333
- { guidance: false, description: 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
434
+ {
435
+ guidance: true,
436
+ description:
437
+ 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.',
438
+ },
439
+ {
440
+ guidance: true,
441
+ description:
442
+ 'Provide a result count to give users feedback on how their filters affect the data set.',
443
+ },
444
+ {
445
+ guidance: false,
446
+ description:
447
+ 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.',
448
+ },
449
+ {
450
+ guidance: false,
451
+ description:
452
+ 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.',
453
+ },
334
454
  ],
335
455
  },
336
456
  propDescriptions: {
337
457
  config: 'Configuration defining available fields, operators, value types.',
338
458
  filters: 'Currently active filters.',
339
- onChange: "Called on filter change. changeType is 'add', 'edit', or 'remove'. index is affected filter position.",
459
+ onChange:
460
+ "Called on filter change. changeType is 'add', 'edit', or 'remove'. index is affected filter position.",
340
461
  label: 'Accessible label for search input.',
341
462
  isLabelHidden: 'Visually hides label while keeping accessible.',
342
463
  placeholder: 'Text shown when no filters selected.',
@@ -345,15 +466,26 @@ export const docsDense = {
345
466
  isReadOnly: 'Prevent adding, editing, or removing filters.',
346
467
  isDisabled: 'Disables entire component.',
347
468
  status: 'Validation status object w/ type + optional message.',
348
- startIcon: 'Icon at input start, before filter tokens. Forwarded to internal Tokenizer.',
349
- statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
469
+ startIcon:
470
+ 'Icon at input start, before filter tokens. Forwarded to internal Tokenizer.',
471
+ statusVariant:
472
+ 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
350
473
  maxTokenLength: 'Max char length for filter value display in tokens.',
474
+ maxOperatorMenuItems:
475
+ 'Max suggestions in string/entity value typeaheads; excludes main field search + enum menus.',
476
+ maxSearchResults:
477
+ 'Max ranked results for a non-empty query; excludes value editors.',
478
+ menuWidth: 'Main field/search menu width in pixels.',
351
479
  popoverSaveButtonLabel: 'Label for save button in edit popover.',
352
480
  timezoneID: 'Timezone ID for date formatting (e.g. "America/New_York").',
353
- handleRef: 'Imperative handle w/ focusTypeahead() + blurTypeahead() methods.',
354
- endContent: 'Content at end of input row. Useful for action buttons or controls.',
355
- resultCount: 'Result count matching current filters. Number formatted as "N results"; string displayed as-is.',
481
+ handleRef:
482
+ 'Imperative handle w/ focusTypeahead() + blurTypeahead() methods.',
483
+ endContent:
484
+ 'Content at end of input row. Useful for action buttons or controls.',
485
+ resultCount:
486
+ 'Result count matching current filters. Number formatted as "N results"; string displayed as-is.',
356
487
  size: 'Search input+token size.',
357
- xstyle: 'StyleX styles for layout customization. Must be stylex.create() value.',
488
+ xstyle:
489
+ 'StyleX styles for layout customization. Must be stylex.create() value.',
358
490
  },
359
491
  };
@@ -11,7 +11,14 @@
11
11
 
12
12
  import {useState} from 'react';
13
13
  import {describe, it, expect, vi, beforeAll, afterAll, afterEach} from 'vitest';
14
- import {render, screen, act, fireEvent, waitFor} from '@testing-library/react';
14
+ import {
15
+ render,
16
+ screen,
17
+ act,
18
+ fireEvent,
19
+ waitFor,
20
+ within,
21
+ } from '@testing-library/react';
15
22
  import userEvent from '@testing-library/user-event';
16
23
  import {PowerSearch} from './PowerSearch';
17
24
  import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
@@ -492,3 +499,235 @@ describe('PowerSearch statusVariant forwarding', () => {
492
499
  );
493
500
  });
494
501
  });
502
+
503
+ describe('maxOperatorMenuItems', () => {
504
+ it('caps entity suggestions after selecting a field', async () => {
505
+ const people = Array.from({length: 6}, (_, index) => ({
506
+ id: `person-${index}`,
507
+ label: `Person ${index}`,
508
+ }));
509
+ const config: PowerSearchConfig = {
510
+ name: 'PeopleSearch',
511
+ fields: [
512
+ {
513
+ key: 'person',
514
+ label: 'Person',
515
+ defaultOperator: 'is_any_of',
516
+ operators: [
517
+ {
518
+ key: 'is_any_of',
519
+ label: 'is any of',
520
+ value: {
521
+ type: 'entity_list',
522
+ searchSource: {
523
+ search: query =>
524
+ people.filter(person => person.label.includes(query)),
525
+ bootstrap: () => people,
526
+ },
527
+ },
528
+ },
529
+ ],
530
+ },
531
+ ],
532
+ };
533
+ const user = userEvent.setup();
534
+ render(
535
+ <PowerSearch
536
+ config={config}
537
+ filters={[
538
+ {
539
+ field: 'person',
540
+ operator: 'is_any_of',
541
+ value: {type: 'entity_list', value: [people[0]]},
542
+ },
543
+ ]}
544
+ onChange={() => {}}
545
+ maxOperatorMenuItems={2}
546
+ />,
547
+ );
548
+
549
+ await user.click(screen.getByRole('button', {name: 'Person: is any of'}));
550
+ const inputs = screen.getAllByRole('combobox', {hidden: true});
551
+ const valueInput = inputs[inputs.length - 1];
552
+ await user.type(valueInput, 'Person');
553
+
554
+ const listboxID = valueInput.getAttribute('aria-controls');
555
+ expect(listboxID).not.toBeNull();
556
+ const listbox = document.getElementById(listboxID!);
557
+ expect(listbox).not.toBeNull();
558
+ await waitFor(() => {
559
+ expect(
560
+ within(listbox!).getAllByRole('option', {hidden: true}),
561
+ ).toHaveLength(2);
562
+ });
563
+ });
564
+ });
565
+
566
+ describe('field menu sizing', () => {
567
+ const FIELD_COUNT = 25;
568
+ const manyFields: PowerSearchConfig = {
569
+ name: 'ManyFields',
570
+ fields: Array.from({length: FIELD_COUNT}, (_, i) => ({
571
+ key: `field_${i}`,
572
+ label: `Zebra ${String(i).padStart(2, '0')}`,
573
+ defaultOperator: 'is',
574
+ operators: [{key: 'is', label: 'is', value: {type: 'string'} as const}],
575
+ })),
576
+ };
577
+
578
+ async function openMenu(
579
+ props?: {maxSearchResults?: number; menuWidth?: number},
580
+ config: PowerSearchConfig = manyFields,
581
+ ) {
582
+ const user = userEvent.setup();
583
+ render(
584
+ <PowerSearch
585
+ config={config}
586
+ filters={[]}
587
+ onChange={() => {}}
588
+ {...props}
589
+ />,
590
+ );
591
+ await user.click(screen.getByRole('combobox'));
592
+ await waitFor(() => {
593
+ expect(screen.getByRole('listbox', {hidden: true})).toBeInTheDocument();
594
+ });
595
+ return user;
596
+ }
597
+
598
+ const optionCount = () =>
599
+ screen.getAllByRole('option', {hidden: true}).length;
600
+
601
+ it('shows every field in a normal field list while browsing', async () => {
602
+ await openMenu();
603
+ expect(optionCount()).toBe(FIELD_COUNT);
604
+ });
605
+
606
+ it('caps an extreme field list at the 1,000-row browsing ceiling', async () => {
607
+ const extremeConfig: PowerSearchConfig = {
608
+ name: 'ExtremeFields',
609
+ fields: Array.from({length: 1001}, (_, i) => ({
610
+ key: `extreme_${i}`,
611
+ label: `Extreme ${i}`,
612
+ defaultOperator: 'is',
613
+ operators: [{key: 'is', label: 'is', value: {type: 'string'} as const}],
614
+ })),
615
+ };
616
+
617
+ await openMenu(undefined, extremeConfig);
618
+ expect(optionCount()).toBe(1000);
619
+ });
620
+
621
+ it('caps ranked results while typing', async () => {
622
+ const user = await openMenu();
623
+ // "zebra" matches every field label.
624
+ await user.type(screen.getByRole('combobox'), 'zebra');
625
+ await waitFor(() => {
626
+ expect(optionCount()).toBe(10);
627
+ });
628
+ });
629
+
630
+ it('caps ranked results at maxSearchResults while typing', async () => {
631
+ const user = await openMenu({maxSearchResults: 3});
632
+ await user.type(screen.getByRole('combobox'), 'zebra');
633
+ await waitFor(() => {
634
+ expect(optionCount()).toBe(3);
635
+ });
636
+ });
637
+
638
+ it('does not apply maxSearchResults while browsing', async () => {
639
+ await openMenu({maxSearchResults: 3});
640
+ expect(optionCount()).toBe(FIELD_COUNT);
641
+ });
642
+
643
+ it('applies menuWidth to the main field menu', async () => {
644
+ await openMenu({menuWidth: 480});
645
+ const listbox = screen.getByRole('listbox', {hidden: true});
646
+ const popover = listbox.closest('[popover]');
647
+ expect(popover).not.toBeNull();
648
+ expect((popover as HTMLElement).style.getPropertyValue('--x-width')).toBe(
649
+ '480px',
650
+ );
651
+ });
652
+ });
653
+
654
+ describe('field menu grouping', () => {
655
+ const groupedConfig: PowerSearchConfig = {
656
+ name: 'GroupedSearch',
657
+ fields: [
658
+ field('team_a', 'Field Team A', 'Team'),
659
+ field('plain_a', 'Field Plain A'),
660
+ field('time_a', 'Field Time A', 'Time'),
661
+ field('team_b', 'Field Team B', 'Team'),
662
+ field('plain_b', 'Field Plain B'),
663
+ field('time_b', 'Field Time B', 'Time'),
664
+ ],
665
+ };
666
+
667
+ function field(key: string, label: string, group?: string) {
668
+ return {
669
+ key,
670
+ label,
671
+ group,
672
+ operators: [{key: 'is', label: 'is', value: {type: 'string'} as const}],
673
+ };
674
+ }
675
+
676
+ async function openMenu() {
677
+ const user = userEvent.setup();
678
+ render(
679
+ <PowerSearch config={groupedConfig} filters={[]} onChange={() => {}} />,
680
+ );
681
+ await user.click(screen.getByRole('combobox'));
682
+ await waitFor(() => {
683
+ expect(screen.getByRole('listbox', {hidden: true})).toBeInTheDocument();
684
+ });
685
+ return user;
686
+ }
687
+
688
+ it('renders ungrouped fields first and named sections after them', async () => {
689
+ await openMenu();
690
+ const listbox = screen.getByRole('listbox', {hidden: true});
691
+ expect(
692
+ within(listbox)
693
+ .getAllByRole('option', {hidden: true})
694
+ .map(option => option.textContent),
695
+ ).toEqual([
696
+ 'Field Plain A',
697
+ 'Field Plain B',
698
+ 'Field Team A',
699
+ 'Field Team B',
700
+ 'Field Time A',
701
+ 'Field Time B',
702
+ ]);
703
+ expect(
704
+ within(listbox)
705
+ .getAllByRole('group', {hidden: true})
706
+ .map(group => group.getAttribute('aria-label')),
707
+ ).toEqual(['Team', 'Time']);
708
+ });
709
+
710
+ it('keeps keyboard navigation flat across section boundaries', async () => {
711
+ const user = await openMenu();
712
+ const input = screen.getByRole('combobox');
713
+ await user.keyboard('{ArrowDown}{ArrowDown}');
714
+ const activeId = input.getAttribute('aria-activedescendant');
715
+ expect(activeId).not.toBeNull();
716
+ expect(document.getElementById(activeId!)?.textContent).toBe(
717
+ 'Field Team A',
718
+ );
719
+ });
720
+
721
+ it('keeps ranked results flat while typing', async () => {
722
+ const user = await openMenu();
723
+ await user.type(screen.getByRole('combobox'), 'field');
724
+ await waitFor(() => {
725
+ expect(
726
+ within(screen.getByRole('listbox', {hidden: true})).queryAllByRole(
727
+ 'group',
728
+ {hidden: true},
729
+ ),
730
+ ).toHaveLength(0);
731
+ });
732
+ });
733
+ });