@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3

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 (730) 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 +49 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +62 -20
  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 +7 -3
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +21 -23
  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 +12 -12
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +17 -9
  49. package/dist/Card/index.d.ts +35 -1
  50. package/dist/Card/index.d.ts.map +1 -1
  51. package/dist/Card/index.js +21 -1
  52. package/dist/Carousel/Carousel.d.ts.map +1 -1
  53. package/dist/Carousel/Carousel.js +3 -3
  54. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  55. package/dist/Chat/ChatComposerInput.js +2 -3
  56. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  57. package/dist/Chat/ChatLayout.js +3 -3
  58. package/dist/Chat/ChatMessageList.d.ts +22 -3
  59. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  60. package/dist/Chat/ChatMessageList.js +6 -3
  61. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  62. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  63. package/dist/Chat/ChatTokenizedText.js +11 -6
  64. package/dist/Chat/useChatComposerTokens.js +1 -1
  65. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  66. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  67. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  68. package/dist/ClickableCard/ClickableCard.js +3 -3
  69. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  70. package/dist/CodeBlock/CodeBlock.js +15 -4
  71. package/dist/CodeBlock/highlightRanges.js +1 -1
  72. package/dist/CodeBlock/highlightStyles.js +13 -13
  73. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  75. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  76. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +1 -3
  79. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  80. package/dist/ContextMenu/ContextMenu.js +4 -3
  81. package/dist/DateInput/DateInput.d.ts +43 -0
  82. package/dist/DateInput/DateInput.d.ts.map +1 -1
  83. package/dist/DateInput/DateInput.js +22 -2
  84. package/dist/DateInput/NativeDateField.d.ts +10 -0
  85. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  86. package/dist/DateInput/NativeDateField.js +494 -0
  87. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  88. package/dist/DateInput/TouchDateField.js +82 -23
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  92. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  93. package/dist/DateInput/nativeDateSegments.js +111 -0
  94. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  95. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  96. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  97. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  98. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  99. package/dist/DateTimeInput/index.d.ts +1 -1
  100. package/dist/DateTimeInput/index.d.ts.map +1 -1
  101. package/dist/Dialog/Dialog.d.ts +21 -1
  102. package/dist/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/Dialog/Dialog.js +110 -58
  104. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  106. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  108. package/dist/Field/FieldLabel.d.ts.map +1 -1
  109. package/dist/Field/FieldLabel.js +9 -1
  110. package/dist/Field/InputClearButton.d.ts +9 -3
  111. package/dist/Field/InputClearButton.d.ts.map +1 -1
  112. package/dist/Field/InputClearButton.js +14 -3
  113. package/dist/FileInput/FileInput.d.ts.map +1 -1
  114. package/dist/FileInput/FileInput.js +3 -2
  115. package/dist/Heading/Heading.d.ts.map +1 -1
  116. package/dist/Heading/Heading.js +6 -3
  117. package/dist/HoverCard/HoverCard.d.ts +6 -0
  118. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/HoverCard.js +104 -3
  120. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  121. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  122. package/dist/HoverCard/useHoverCard.js +74 -26
  123. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  124. package/dist/Indicator/CheckboxIndicator.js +6 -2
  125. package/dist/Item/Item.d.ts.map +1 -1
  126. package/dist/Item/Item.js +4 -2
  127. package/dist/Kbd/Kbd.d.ts.map +1 -1
  128. package/dist/Kbd/Kbd.js +2 -19
  129. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  130. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  131. package/dist/Layer/LayerDepthContext.js +66 -0
  132. package/dist/Layer/gestureCounter.d.ts +8 -0
  133. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  134. package/dist/Layer/gestureCounter.js +53 -0
  135. package/dist/Layer/index.d.ts +3 -0
  136. package/dist/Layer/index.d.ts.map +1 -1
  137. package/dist/Layer/index.js +4 -0
  138. package/dist/Layer/layerStack.d.ts +98 -0
  139. package/dist/Layer/layerStack.d.ts.map +1 -0
  140. package/dist/Layer/layerStack.js +306 -0
  141. package/dist/Layer/useLayer.d.ts +23 -13
  142. package/dist/Layer/useLayer.d.ts.map +1 -1
  143. package/dist/Layer/useLayer.js +128 -8
  144. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  145. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  146. package/dist/Layer/useLayerDismissal.js +91 -0
  147. package/dist/Lightbox/Lightbox.d.ts +1 -0
  148. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  149. package/dist/Lightbox/Lightbox.js +103 -81
  150. package/dist/List/List.d.ts +1 -1
  151. package/dist/List/List.d.ts.map +1 -1
  152. package/dist/List/List.js +15 -4
  153. package/dist/Markdown/Markdown.d.ts +1 -1
  154. package/dist/Markdown/Markdown.d.ts.map +1 -1
  155. package/dist/Markdown/Markdown.js +20 -7
  156. package/dist/Markdown/index.d.ts +1 -1
  157. package/dist/Markdown/index.d.ts.map +1 -1
  158. package/dist/Markdown/parser.d.ts +38 -1
  159. package/dist/Markdown/parser.d.ts.map +1 -1
  160. package/dist/Markdown/parser.js +182 -32
  161. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  162. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  163. package/dist/MetadataList/MetadataListItem.js +4 -1
  164. package/dist/MobileNav/MobileNav.d.ts +6 -1
  165. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  166. package/dist/MobileNav/MobileNav.js +61 -36
  167. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  168. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  169. package/dist/MultiSelector/MultiSelector.js +73 -15
  170. package/dist/MultiSelector/hooks.d.ts +7 -1
  171. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  172. package/dist/MultiSelector/hooks.js +3 -2
  173. package/dist/MultiSelector/index.d.ts +1 -1
  174. package/dist/MultiSelector/index.d.ts.map +1 -1
  175. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  176. package/dist/NavIcon/NavIcon.js +5 -1
  177. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  178. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  179. package/dist/NavMenu/NavHeadingMenu.js +9 -5
  180. package/dist/NumberInput/NumberInput.d.ts +6 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +54 -104
  183. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  184. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  185. package/dist/NumberInput/numberInputCommit.js +71 -0
  186. package/dist/NumberInput/numberParser.d.ts +64 -0
  187. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  188. package/dist/NumberInput/numberParser.js +350 -0
  189. package/dist/Outline/Outline.d.ts.map +1 -1
  190. package/dist/Outline/Outline.js +3 -2
  191. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  192. package/dist/OverflowList/OverflowList.js +3 -2
  193. package/dist/Overlay/Overlay.d.ts.map +1 -1
  194. package/dist/Overlay/Overlay.js +3 -2
  195. package/dist/Popover/Popover.d.ts.map +1 -1
  196. package/dist/Popover/Popover.js +1 -9
  197. package/dist/Popover/usePopover.d.ts +7 -41
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +40 -21
  200. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +19 -6
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  206. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  207. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  209. package/dist/PowerSearch/types.d.ts +2 -0
  210. package/dist/PowerSearch/types.d.ts.map +1 -1
  211. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  212. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  213. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  214. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  215. package/dist/ProgressBar/ProgressBar.js +18 -5
  216. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  217. package/dist/Resizable/ResizeHandle.js +3 -2
  218. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  219. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  220. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  221. package/dist/SelectableCard/SelectableCard.js +12 -3
  222. package/dist/Selector/Selector.d.ts +18 -1
  223. package/dist/Selector/Selector.d.ts.map +1 -1
  224. package/dist/Selector/Selector.js +91 -18
  225. package/dist/Selector/hooks.d.ts +7 -1
  226. package/dist/Selector/hooks.d.ts.map +1 -1
  227. package/dist/Selector/hooks.js +3 -2
  228. package/dist/SideNav/SideNav.d.ts.map +1 -1
  229. package/dist/SideNav/SideNav.js +4 -3
  230. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavHeading.js +8 -7
  232. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  233. package/dist/SideNav/SideNavItem.js +4 -3
  234. package/dist/Slider/Slider.d.ts.map +1 -1
  235. package/dist/Slider/Slider.js +37 -5
  236. package/dist/Spinner/Spinner.d.ts +3 -3
  237. package/dist/Spinner/Spinner.d.ts.map +1 -1
  238. package/dist/Spinner/Spinner.js +130 -78
  239. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  240. package/dist/StatusDot/StatusDot.js +6 -1
  241. package/dist/Stepper/Step.d.ts +140 -0
  242. package/dist/Stepper/Step.d.ts.map +1 -0
  243. package/dist/Stepper/Step.js +1045 -0
  244. package/dist/Stepper/StepStatus.d.ts +24 -0
  245. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  246. package/dist/Stepper/StepStatus.js +1 -0
  247. package/dist/Stepper/Stepper.d.ts +93 -0
  248. package/dist/Stepper/Stepper.d.ts.map +1 -0
  249. package/dist/Stepper/Stepper.js +184 -0
  250. package/dist/Stepper/StepperContext.d.ts +41 -0
  251. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  252. package/dist/Stepper/StepperContext.js +34 -0
  253. package/dist/Stepper/index.d.ts +8 -0
  254. package/dist/Stepper/index.d.ts.map +1 -0
  255. package/dist/Stepper/index.js +7 -0
  256. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  257. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  258. package/dist/Stepper/stepper.stylex.js +20 -0
  259. package/dist/Switch/Switch.d.ts.map +1 -1
  260. package/dist/Switch/Switch.js +8 -3
  261. package/dist/TabList/Tab.d.ts +15 -2
  262. package/dist/TabList/Tab.d.ts.map +1 -1
  263. package/dist/TabList/Tab.js +32 -7
  264. package/dist/TabList/TabList.d.ts +46 -7
  265. package/dist/TabList/TabList.d.ts.map +1 -1
  266. package/dist/TabList/TabList.js +353 -23
  267. package/dist/TabList/TabListContext.d.ts +11 -1
  268. package/dist/TabList/TabListContext.d.ts.map +1 -1
  269. package/dist/TabList/TabListContext.js +11 -2
  270. package/dist/TabList/TabMenu.d.ts.map +1 -1
  271. package/dist/TabList/TabMenu.js +3 -2
  272. package/dist/TabList/index.d.ts +2 -2
  273. package/dist/TabList/index.d.ts.map +1 -1
  274. package/dist/Table/BaseTable.d.ts.map +1 -1
  275. package/dist/Table/BaseTable.js +10 -2
  276. package/dist/Table/Table.d.ts.map +1 -1
  277. package/dist/Table/Table.js +3 -6
  278. package/dist/Table/TableRow.d.ts +16 -5
  279. package/dist/Table/TableRow.d.ts.map +1 -1
  280. package/dist/Table/TableRow.js +16 -5
  281. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  282. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  283. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  284. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  285. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
  286. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  287. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  288. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  289. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  290. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  291. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  292. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  293. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  294. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  295. package/dist/Table/plugins/selection/useTableSelection.js +43 -5
  296. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  297. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  298. package/dist/Table/types.d.ts +22 -4
  299. package/dist/Table/types.d.ts.map +1 -1
  300. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  301. package/dist/Table/useBaseTablePlugins.js +5 -0
  302. package/dist/Text/Text.d.ts.map +1 -1
  303. package/dist/Text/Text.js +6 -3
  304. package/dist/TextArea/TextArea.d.ts.map +1 -1
  305. package/dist/TextArea/TextArea.js +16 -10
  306. package/dist/TextInput/TextInput.d.ts.map +1 -1
  307. package/dist/TextInput/TextInput.js +3 -2
  308. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  309. package/dist/TimeInput/TimeInput.js +3 -2
  310. package/dist/Timestamp/Timestamp.d.ts +1 -1
  311. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  312. package/dist/Timestamp/Timestamp.js +15 -21
  313. package/dist/Toast/Toast.d.ts.map +1 -1
  314. package/dist/Toast/Toast.js +22 -7
  315. package/dist/Toast/ToastViewport.d.ts +1 -0
  316. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  317. package/dist/Toast/ToastViewport.js +71 -18
  318. package/dist/Token/Token.d.ts +1 -1
  319. package/dist/Token/Token.d.ts.map +1 -1
  320. package/dist/Token/Token.js +20 -9
  321. package/dist/Token/TokenLink.d.ts +1 -1
  322. package/dist/Token/TokenLink.d.ts.map +1 -1
  323. package/dist/Token/TokenLink.js +7 -4
  324. package/dist/Tokenizer/Tokenizer.d.ts +14 -1
  325. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  326. package/dist/Tokenizer/Tokenizer.js +33 -21
  327. package/dist/Tooltip/Tooltip.d.ts +5 -0
  328. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  329. package/dist/Tooltip/useTooltip.d.ts +5 -0
  330. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  331. package/dist/Tooltip/useTooltip.js +39 -24
  332. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  333. package/dist/TopNav/TopNavHeading.js +5 -4
  334. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  335. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  336. package/dist/TopNav/TopNavMegaMenu.js +31 -11
  337. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  338. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  339. package/dist/TopNav/TopNavMenu.js +22 -7
  340. package/dist/TreeList/TreeList.d.ts +1 -1
  341. package/dist/TreeList/TreeList.d.ts.map +1 -1
  342. package/dist/TreeList/TreeList.js +7 -2
  343. package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
  344. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  345. package/dist/Typeahead/BaseTypeahead.js +119 -37
  346. package/dist/Typeahead/Typeahead.d.ts +8 -1
  347. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  348. package/dist/Typeahead/Typeahead.js +5 -2
  349. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  350. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  351. package/dist/Typeahead/TypeaheadItem.js +7 -2
  352. package/dist/astryx.css +113 -11
  353. package/dist/hooks/index.d.ts +1 -0
  354. package/dist/hooks/index.d.ts.map +1 -1
  355. package/dist/hooks/index.js +1 -0
  356. package/dist/hooks/useFocusTrap.d.ts +7 -4
  357. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  358. package/dist/hooks/useFocusTrap.js +60 -95
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -18
  361. package/dist/hooks/useMergedRefs.d.ts +18 -0
  362. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  363. package/dist/hooks/useMergedRefs.js +25 -0
  364. package/dist/index.d.ts +1 -0
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +1 -0
  367. package/dist/theme/Theme.d.ts.map +1 -1
  368. package/dist/theme/Theme.js +46 -10
  369. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  370. package/dist/theme/derivedVarRegistry.js +24 -4
  371. package/dist/theme/generateThemeRules.d.ts +21 -0
  372. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  373. package/dist/theme/generateThemeRules.js +26 -0
  374. package/dist/theme/syntax/tokens.d.ts +1 -1
  375. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  376. package/dist/theme/syntax/tokens.js +5 -2
  377. package/dist/utils/groupItems.d.ts +5 -1
  378. package/dist/utils/groupItems.d.ts.map +1 -1
  379. package/dist/utils/groupItems.js +9 -9
  380. package/dist/utils/index.d.ts +1 -1
  381. package/dist/utils/index.d.ts.map +1 -1
  382. package/dist/utils/isApplePlatform.d.ts +18 -0
  383. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  384. package/dist/utils/isApplePlatform.js +37 -0
  385. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  386. package/dist/utils/sharedResizeObserver.js +10 -1
  387. package/dist/utils/timeParser.d.ts +1 -1
  388. package/dist/utils/timeParser.d.ts.map +1 -1
  389. package/dist/utils/timeParser.js +26 -12
  390. package/locales/af-ZA.json +6 -6
  391. package/locales/ar-SA.json +6 -6
  392. package/locales/ca-ES.json +5 -5
  393. package/locales/cs-CZ.json +6 -6
  394. package/locales/da-DK.json +6 -6
  395. package/locales/de-DE.json +6 -6
  396. package/locales/el-GR.json +6 -6
  397. package/locales/en.json +163 -11
  398. package/locales/es-ES.json +5 -5
  399. package/locales/fi-FI.json +6 -6
  400. package/locales/fr-FR.json +6 -6
  401. package/locales/he-IL.json +6 -6
  402. package/locales/hu-HU.json +6 -6
  403. package/locales/it-IT.json +6 -6
  404. package/locales/ja-JP.json +6 -6
  405. package/locales/ko-KR.json +6 -6
  406. package/locales/nl-NL.json +6 -6
  407. package/locales/no-NO.json +6 -6
  408. package/locales/pl-PL.json +6 -6
  409. package/locales/pseudo.json +114 -0
  410. package/locales/pt-BR.json +6 -6
  411. package/locales/pt-PT.json +6 -6
  412. package/locales/ro-RO.json +6 -6
  413. package/locales/ru-RU.json +6 -6
  414. package/locales/sr-SP.json +6 -6
  415. package/locales/sv-SE.json +6 -6
  416. package/locales/tr-TR.json +6 -6
  417. package/locales/uk-UA.json +6 -6
  418. package/locales/vi-VN.json +6 -6
  419. package/locales/zh-CN.json +6 -6
  420. package/locales/zh-TW.json +6 -6
  421. package/package.json +8 -3
  422. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  423. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  424. package/src/AlertDialog/AlertDialog.tsx +62 -20
  425. package/src/AppShell/AppShell.tsx +3 -2
  426. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  427. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  428. package/src/AspectRatio/AspectRatio.tsx +40 -1
  429. package/src/Avatar/Avatar.doc.mjs +14 -3
  430. package/src/Avatar/Avatar.test.tsx +97 -0
  431. package/src/Avatar/Avatar.tsx +125 -52
  432. package/src/Avatar/index.ts +2 -2
  433. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  434. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  435. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  436. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  437. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  438. package/src/Banner/Banner.doc.mjs +22 -11
  439. package/src/Banner/Banner.test.tsx +177 -25
  440. package/src/Banner/Banner.tsx +93 -27
  441. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  442. package/src/BottomSheet/BottomSheet.tsx +17 -4
  443. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  444. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  445. package/src/Button/Button.doc.mjs +24 -1
  446. package/src/Button/Button.test.tsx +32 -4
  447. package/src/Button/Button.tsx +12 -5
  448. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  449. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  450. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  451. package/src/Calendar/Calendar.doc.mjs +7 -6
  452. package/src/Calendar/Calendar.test.tsx +143 -0
  453. package/src/Calendar/Calendar.tsx +30 -26
  454. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  455. package/src/Calendar/getInitialFocusDate.ts +93 -0
  456. package/src/Calendar/styles.ts +49 -31
  457. package/src/Card/Card.doc.mjs +10 -7
  458. package/src/Card/Card.test.tsx +113 -19
  459. package/src/Card/Card.tsx +67 -89
  460. package/src/Card/index.ts +36 -1
  461. package/src/Carousel/Carousel.tsx +3 -2
  462. package/src/Chat/ChatComposerInput.tsx +5 -1
  463. package/src/Chat/ChatLayout.tsx +3 -2
  464. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  465. package/src/Chat/ChatMessageList.test.tsx +46 -0
  466. package/src/Chat/ChatMessageList.tsx +28 -4
  467. package/src/Chat/ChatTokenizedText.tsx +17 -10
  468. package/src/Chat/useChatComposerTokens.ts +1 -1
  469. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  470. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  471. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  472. package/src/ClickableCard/ClickableCard.tsx +3 -2
  473. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  474. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  475. package/src/CodeBlock/CodeBlock.tsx +20 -4
  476. package/src/CodeBlock/highlightRanges.ts +1 -1
  477. package/src/CodeBlock/highlightStyles.ts +13 -13
  478. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  479. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  480. package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
  481. package/src/ComplexSelector/ComplexSelector.tsx +1 -3
  482. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  483. package/src/ContextMenu/ContextMenu.tsx +4 -3
  484. package/src/DateInput/DateInput.doc.mjs +16 -0
  485. package/src/DateInput/DateInput.tsx +55 -2
  486. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  487. package/src/DateInput/NativeDateField.test.tsx +635 -0
  488. package/src/DateInput/NativeDateField.tsx +641 -0
  489. package/src/DateInput/TouchDateField.tsx +108 -24
  490. package/src/DateInput/index.ts +1 -0
  491. package/src/DateInput/nativeDateSegments.ts +127 -0
  492. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  493. package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
  494. package/src/DateRangeInput/DateRangeInput.tsx +4 -2
  495. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  496. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  497. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  498. package/src/DateTimeInput/index.ts +1 -0
  499. package/src/Dialog/Dialog.doc.mjs +8 -3
  500. package/src/Dialog/Dialog.test.tsx +429 -2
  501. package/src/Dialog/Dialog.tsx +133 -58
  502. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  503. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  504. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  505. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  506. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  507. package/src/Field/Field.doc.mjs +13 -2
  508. package/src/Field/FieldLabel.test.tsx +29 -0
  509. package/src/Field/FieldLabel.tsx +7 -0
  510. package/src/Field/InputClearButton.test.tsx +15 -1
  511. package/src/Field/InputClearButton.tsx +28 -4
  512. package/src/FileInput/FileInput.tsx +3 -2
  513. package/src/Heading/Heading.test.tsx +23 -1
  514. package/src/Heading/Heading.tsx +6 -3
  515. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  516. package/src/HoverCard/HoverCard.test.tsx +154 -4
  517. package/src/HoverCard/HoverCard.tsx +143 -3
  518. package/src/HoverCard/useHoverCard.tsx +104 -33
  519. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  520. package/src/Indicator/Indicator.doc.mjs +2 -0
  521. package/src/Item/Item.tsx +5 -4
  522. package/src/Kbd/Kbd.tsx +2 -19
  523. package/src/Layer/LayerDepthContext.tsx +62 -0
  524. package/src/Layer/gestureCounter.ts +57 -0
  525. package/src/Layer/index.ts +9 -0
  526. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  527. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  528. package/src/Layer/layerStack.ts +362 -0
  529. package/src/Layer/useLayer.test.tsx +324 -15
  530. package/src/Layer/useLayer.tsx +164 -8
  531. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  532. package/src/Layer/useLayerDismissal.ts +173 -0
  533. package/src/Layout/Layout.doc.mjs +2 -2
  534. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  535. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  536. package/src/Lightbox/Lightbox.tsx +124 -102
  537. package/src/Link/Link.doc.mjs +39 -0
  538. package/src/List/List.test.tsx +38 -0
  539. package/src/List/List.tsx +8 -1
  540. package/src/Markdown/Markdown.doc.mjs +5 -0
  541. package/src/Markdown/Markdown.test.tsx +37 -0
  542. package/src/Markdown/Markdown.tsx +16 -5
  543. package/src/Markdown/incremental.test.ts +16 -2
  544. package/src/Markdown/index.ts +1 -0
  545. package/src/Markdown/parser.perf.test.ts +96 -1
  546. package/src/Markdown/parser.test.ts +178 -2
  547. package/src/Markdown/parser.ts +253 -32
  548. package/src/MetadataList/MetadataList.test.tsx +75 -2
  549. package/src/MetadataList/MetadataListItem.tsx +5 -2
  550. package/src/MobileNav/MobileNav.tsx +62 -36
  551. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  552. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  553. package/src/MultiSelector/MultiSelector.test.tsx +311 -0
  554. package/src/MultiSelector/MultiSelector.tsx +151 -15
  555. package/src/MultiSelector/hooks.ts +9 -2
  556. package/src/MultiSelector/index.ts +1 -0
  557. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  558. package/src/NavIcon/NavIcon.test.tsx +9 -0
  559. package/src/NavIcon/NavIcon.tsx +5 -1
  560. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  561. package/src/NavMenu/NavHeadingMenu.tsx +9 -5
  562. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  563. package/src/NumberInput/NumberInput.test.tsx +436 -8
  564. package/src/NumberInput/NumberInput.tsx +62 -114
  565. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  566. package/src/NumberInput/numberInputCommit.ts +103 -0
  567. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  568. package/src/NumberInput/numberParser.test.ts +222 -0
  569. package/src/NumberInput/numberParser.ts +403 -0
  570. package/src/Outline/Outline.tsx +3 -2
  571. package/src/OverflowList/OverflowList.tsx +3 -2
  572. package/src/Overlay/Overlay.tsx +3 -2
  573. package/src/Pagination/Pagination.test.tsx +3 -2
  574. package/src/Popover/Popover.test.tsx +14 -0
  575. package/src/Popover/Popover.tsx +1 -9
  576. package/src/Popover/usePopover.tsx +57 -32
  577. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  578. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  579. package/src/PowerSearch/PowerSearch.tsx +34 -5
  580. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  581. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  582. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  583. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  584. package/src/PowerSearch/types.ts +2 -0
  585. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  586. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  587. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  588. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  589. package/src/ProgressBar/ProgressBar.tsx +28 -8
  590. package/src/Resizable/ResizeHandle.tsx +3 -2
  591. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  592. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  593. package/src/SelectableCard/SelectableCard.tsx +19 -2
  594. package/src/Selector/Selector.doc.mjs +26 -1
  595. package/src/Selector/Selector.test.tsx +346 -1
  596. package/src/Selector/Selector.tsx +148 -21
  597. package/src/Selector/hooks.ts +17 -2
  598. package/src/SideNav/SideNav.doc.mjs +6 -6
  599. package/src/SideNav/SideNav.tsx +4 -2
  600. package/src/SideNav/SideNavHeading.tsx +12 -12
  601. package/src/SideNav/SideNavItem.tsx +4 -2
  602. package/src/Slider/Slider.test.tsx +106 -1
  603. package/src/Slider/Slider.tsx +55 -3
  604. package/src/Spinner/Spinner.test.tsx +147 -1
  605. package/src/Spinner/Spinner.tsx +120 -101
  606. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  607. package/src/StatusDot/StatusDot.test.tsx +9 -0
  608. package/src/StatusDot/StatusDot.tsx +7 -1
  609. package/src/Stepper/Step.doc.mjs +98 -0
  610. package/src/Stepper/Step.tsx +1638 -0
  611. package/src/Stepper/StepStatus.ts +26 -0
  612. package/src/Stepper/Stepper.doc.mjs +370 -0
  613. package/src/Stepper/Stepper.test.tsx +1024 -0
  614. package/src/Stepper/Stepper.tsx +258 -0
  615. package/src/Stepper/StepperContext.ts +71 -0
  616. package/src/Stepper/index.ts +18 -0
  617. package/src/Stepper/stepper.stylex.ts +19 -0
  618. package/src/Switch/Switch.doc.mjs +2 -0
  619. package/src/Switch/Switch.test.tsx +10 -0
  620. package/src/Switch/Switch.tsx +6 -2
  621. package/src/TabList/Tab.doc.mjs +13 -1
  622. package/src/TabList/Tab.tsx +67 -7
  623. package/src/TabList/TabList.doc.mjs +22 -6
  624. package/src/TabList/TabList.test.tsx +559 -0
  625. package/src/TabList/TabList.tsx +490 -22
  626. package/src/TabList/TabListContext.ts +13 -2
  627. package/src/TabList/TabMenu.tsx +3 -2
  628. package/src/TabList/index.ts +6 -2
  629. package/src/Table/BaseTable.tsx +12 -4
  630. package/src/Table/Table.doc.mjs +9 -2
  631. package/src/Table/Table.test.tsx +132 -14
  632. package/src/Table/Table.tsx +3 -8
  633. package/src/Table/TableBody.doc.mjs +40 -0
  634. package/src/Table/TableFooter.doc.mjs +40 -0
  635. package/src/Table/TableHeader.doc.mjs +40 -0
  636. package/src/Table/TableRow.tsx +16 -5
  637. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  638. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  639. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  640. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  641. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
  642. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  643. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  644. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  645. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  646. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  647. package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
  648. package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
  649. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  650. package/src/Table/types.ts +22 -4
  651. package/src/Table/useBaseTablePlugins.ts +5 -0
  652. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  653. package/src/Table/useTablePagination.doc.mjs +7 -0
  654. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  655. package/src/Table/useTableSelection.doc.mjs +31 -0
  656. package/src/Text/Text.test.tsx +67 -1
  657. package/src/Text/Text.tsx +6 -3
  658. package/src/TextArea/TextArea.doc.mjs +12 -2
  659. package/src/TextArea/TextArea.test.tsx +11 -0
  660. package/src/TextArea/TextArea.tsx +37 -24
  661. package/src/TextInput/TextInput.doc.mjs +10 -0
  662. package/src/TextInput/TextInput.tsx +3 -2
  663. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  664. package/src/TimeInput/TimeInput.tsx +2 -2
  665. package/src/Timestamp/Timestamp.test.tsx +58 -0
  666. package/src/Timestamp/Timestamp.tsx +12 -10
  667. package/src/Toast/Toast.doc.mjs +26 -12
  668. package/src/Toast/Toast.tsx +28 -4
  669. package/src/Toast/ToastViewport.test.tsx +536 -8
  670. package/src/Toast/ToastViewport.tsx +81 -12
  671. package/src/Token/Token.test.tsx +95 -0
  672. package/src/Token/Token.tsx +15 -10
  673. package/src/Token/TokenLink.tsx +14 -5
  674. package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
  675. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  676. package/src/Tokenizer/Tokenizer.tsx +53 -24
  677. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  678. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  679. package/src/Tooltip/Tooltip.test.tsx +32 -0
  680. package/src/Tooltip/Tooltip.tsx +5 -0
  681. package/src/Tooltip/useTooltip.tsx +47 -24
  682. package/src/TopNav/TopNavHeading.tsx +5 -4
  683. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  684. package/src/TopNav/TopNavMegaMenu.tsx +47 -5
  685. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  686. package/src/TopNav/TopNavMenu.tsx +38 -7
  687. package/src/TreeList/TreeList.test.tsx +49 -0
  688. package/src/TreeList/TreeList.tsx +7 -2
  689. package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
  690. package/src/Typeahead/BaseTypeahead.tsx +181 -39
  691. package/src/Typeahead/Typeahead.doc.mjs +11 -0
  692. package/src/Typeahead/Typeahead.test.tsx +203 -0
  693. package/src/Typeahead/Typeahead.tsx +12 -2
  694. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  695. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  696. package/src/hooks/index.ts +2 -0
  697. package/src/hooks/useAnnounce.doc.mjs +96 -0
  698. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  699. package/src/hooks/useDevWarning.doc.mjs +96 -0
  700. package/src/hooks/useFocusTrap.test.tsx +14 -0
  701. package/src/hooks/useFocusTrap.ts +62 -111
  702. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  703. package/src/hooks/useHotkeys.ts +3 -18
  704. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  705. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  706. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  707. package/src/hooks/useLongPress.doc.mjs +123 -0
  708. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  709. package/src/hooks/useMergedRefs.test.tsx +62 -0
  710. package/src/hooks/useMergedRefs.ts +36 -0
  711. package/src/hooks/useTypeahead.doc.mjs +153 -0
  712. package/src/index.ts +1 -0
  713. package/src/raw-import.d.ts +14 -0
  714. package/src/theme/MediaTheme.doc.mjs +5 -5
  715. package/src/theme/Theme.test.tsx +104 -2
  716. package/src/theme/Theme.tsx +49 -14
  717. package/src/theme/defineTheme.test.ts +23 -0
  718. package/src/theme/derivedVarRegistry.test.ts +26 -3
  719. package/src/theme/derivedVarRegistry.ts +23 -4
  720. package/src/theme/generateThemeRules.test.ts +99 -1
  721. package/src/theme/generateThemeRules.ts +28 -0
  722. package/src/theme/syntax/tokens.ts +5 -2
  723. package/src/utils/groupItems.ts +12 -6
  724. package/src/utils/index.ts +1 -1
  725. package/src/utils/isApplePlatform.test.ts +61 -0
  726. package/src/utils/isApplePlatform.ts +37 -0
  727. package/src/utils/sharedResizeObserver.ts +10 -2
  728. package/src/utils/timeParser.test.ts +6 -1
  729. package/src/utils/timeParser.ts +35 -13
  730. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -32,13 +32,23 @@ import type {
32
32
  OperatorValue,
33
33
  } from './types';
34
34
 
35
+ // Below the popover layer's 400px floor (see popoverLayerStyles in
36
+ // PowerSearch.tsx) the chip rows collapse from one line to wrapped lines.
37
+ // A container query, not a viewport one, so the rows track the width the
38
+ // popover actually got (#4761).
39
+ const CHIP_ROW_COLLAPSE = '@container (max-width: 399px)';
40
+
35
41
  const styles = stylex.create({
36
42
  container: {
37
43
  overflow: 'hidden',
44
+ containerType: 'inline-size',
38
45
  },
39
46
  content: {
40
47
  padding: spacingVars['--spacing-4'],
41
48
  },
49
+ chipRow: {
50
+ flexWrap: {default: 'nowrap', [CHIP_ROW_COLLAPSE]: 'wrap'},
51
+ },
42
52
  footer: {
43
53
  padding: spacingVars['--spacing-3'],
44
54
  paddingTop: 0,
@@ -51,6 +61,9 @@ const styles = stylex.create({
51
61
  operatorSelector: {
52
62
  flexGrow: 1,
53
63
  flexShrink: 0,
64
+ // Long translated operator labels truncate in the Selector trigger
65
+ // instead of pushing the row wider than the popover (#4761).
66
+ maxWidth: '100%',
54
67
  },
55
68
  valueEditor: {
56
69
  flexGrow: 2,
@@ -63,10 +76,12 @@ const styles = stylex.create({
63
76
  nestedFieldSelector: {
64
77
  flexShrink: 0,
65
78
  width: 200,
79
+ maxWidth: '100%',
66
80
  },
67
81
  nestedOperatorSelector: {
68
82
  flexShrink: 0,
69
83
  width: 180,
84
+ maxWidth: '100%',
70
85
  },
71
86
  nestedRow: {
72
87
  width: '100%',
@@ -90,6 +105,8 @@ export interface PowerSearchEditPopoverProps {
90
105
  onCancel: () => void;
91
106
  /** Label for the save button. @default 'Apply' */
92
107
  saveButtonLabel?: string;
108
+ /** Max suggestions in string and entity value typeaheads. */
109
+ maxMenuItems?: number;
93
110
  /** Whether the filter is read-only. */
94
111
  isReadOnly?: boolean;
95
112
  }
@@ -232,6 +249,7 @@ interface NestedSubFilterRowProps {
232
249
  config: InternalConfig;
233
250
  subFilter: EditablePartialFilter;
234
251
  onChange: (subFilter: EditablePartialFilter) => void;
252
+ maxMenuItems?: number;
235
253
  isReadOnly: boolean;
236
254
  }
237
255
 
@@ -239,6 +257,7 @@ function NestedSubFilterRow({
239
257
  config,
240
258
  subFilter,
241
259
  onChange,
260
+ maxMenuItems,
242
261
  isReadOnly,
243
262
  }: NestedSubFilterRowProps) {
244
263
  const t = useTranslator();
@@ -309,7 +328,7 @@ function NestedSubFilterRow({
309
328
  );
310
329
 
311
330
  return (
312
- <HStack gap={2} vAlign="center">
331
+ <HStack gap={2} vAlign="center" xstyle={styles.chipRow}>
313
332
  <div {...stylex.props(styles.nestedFieldSelector)}>
314
333
  <Selector
315
334
  label={t('@astryx.powersearch.editor.field')}
@@ -341,6 +360,7 @@ function NestedSubFilterRow({
341
360
  filterValue={subFilter.value}
342
361
  onChange={handleValueChange}
343
362
  config={config}
363
+ maxMenuItems={maxMenuItems}
344
364
  isDisabled={isReadOnly}
345
365
  />
346
366
  </div>
@@ -359,6 +379,7 @@ interface NestedEditorProps {
359
379
  operatorOptions: {value: string; label: string}[];
360
380
  onOperatorChange: (operatorKey: string) => void;
361
381
  onPartialFilterChange: (filter: PartialFilter) => void;
382
+ maxMenuItems?: number;
362
383
  isReadOnly: boolean;
363
384
  }
364
385
 
@@ -368,6 +389,7 @@ function NestedEditor({
368
389
  operatorOptions,
369
390
  onOperatorChange,
370
391
  onPartialFilterChange,
392
+ maxMenuItems,
371
393
  isReadOnly,
372
394
  }: NestedEditorProps) {
373
395
  const t = useTranslator();
@@ -489,6 +511,7 @@ function NestedEditor({
489
511
  config={config}
490
512
  subFilter={sf}
491
513
  onChange={updated => handleUpdate(itemPath, updated)}
514
+ maxMenuItems={maxMenuItems}
492
515
  isReadOnly={isReadOnly}
493
516
  />
494
517
  ),
@@ -515,6 +538,7 @@ function NestedEditor({
515
538
  config={config}
516
539
  subFilter={sf}
517
540
  onChange={updated => handleUpdate(itemPath, updated)}
541
+ maxMenuItems={maxMenuItems}
518
542
  isReadOnly={isReadOnly}
519
543
  />
520
544
  ),
@@ -593,6 +617,7 @@ export function PowerSearchEditPopover({
593
617
  onSave,
594
618
  onCancel,
595
619
  saveButtonLabel: saveButtonLabelFromProps,
620
+ maxMenuItems,
596
621
  isReadOnly = false,
597
622
  }: PowerSearchEditPopoverProps) {
598
623
  const t = useTranslator();
@@ -762,6 +787,7 @@ export function PowerSearchEditPopover({
762
787
  operatorOptions={operatorOptions}
763
788
  onOperatorChange={handleOperatorChange}
764
789
  onPartialFilterChange={setPartialFilter}
790
+ maxMenuItems={maxMenuItems}
765
791
  isReadOnly={isReadOnly}
766
792
  />
767
793
  </VStack>
@@ -802,7 +828,7 @@ export function PowerSearchEditPopover({
802
828
  return (
803
829
  <div {...stylex.props(styles.container)} onKeyDown={handleKeyDown}>
804
830
  <div {...stylex.props(styles.content)}>
805
- <HStack gap={2}>
831
+ <HStack gap={2} xstyle={styles.chipRow}>
806
832
  <div {...stylex.props(styles.fieldSelector)}>
807
833
  <Selector
808
834
  label={t('@astryx.powersearch.editor.field')}
@@ -835,6 +861,7 @@ export function PowerSearchEditPopover({
835
861
  onChange={handleValueChange}
836
862
  onEnter={handleSave}
837
863
  config={config}
864
+ maxMenuItems={maxMenuItems}
838
865
  isDisabled={isReadOnly}
839
866
  />
840
867
  </div>
@@ -10,7 +10,11 @@
10
10
  import {describe, it, expect, vi, beforeAll, afterAll} from 'vitest';
11
11
  import {render, screen, fireEvent, act} from '@testing-library/react';
12
12
  import {PowerSearchValueEditor} from './PowerSearchValueEditor';
13
- import type {FilterValueEntityList, PowerSearchEntity} from './types';
13
+ import type {
14
+ FilterValueEntityList,
15
+ OperatorValue,
16
+ PowerSearchEntity,
17
+ } from './types';
14
18
  import type {InternalConfig} from './useInternalConfig';
15
19
  import type {SearchableItem, SearchSource} from '../Typeahead/types';
16
20
 
@@ -178,6 +182,70 @@ describe('StringEditor (#1103)', () => {
178
182
  });
179
183
  });
180
184
 
185
+ describe('numeric editor commit timing', () => {
186
+ it('saves the committed number when Enter finishes the edit', () => {
187
+ const onChange = vi.fn();
188
+ const onEnter = vi.fn();
189
+ render(
190
+ <PowerSearchValueEditor
191
+ operatorValue={{type: 'integer'}}
192
+ filterValue={{type: 'integer', value: 5}}
193
+ onChange={onChange}
194
+ onEnter={onEnter}
195
+ config={stubConfig}
196
+ />,
197
+ );
198
+ const input = screen.getByRole('spinbutton');
199
+ fireEvent.focus(input);
200
+ fireEvent.input(input, {target: {value: '42'}});
201
+ fireEvent.keyDown(input, {key: 'Enter'});
202
+
203
+ expect(onChange).toHaveBeenLastCalledWith(
204
+ {type: 'integer', value: 42},
205
+ true,
206
+ );
207
+ expect(onEnter).not.toHaveBeenCalled();
208
+ });
209
+
210
+ it('does not save an invalid numeric draft on Enter', () => {
211
+ const onChange = vi.fn();
212
+ const onEnter = vi.fn();
213
+ render(
214
+ <PowerSearchValueEditor
215
+ operatorValue={{type: 'integer'}}
216
+ filterValue={{type: 'integer', value: 5}}
217
+ onChange={onChange}
218
+ onEnter={onEnter}
219
+ config={stubConfig}
220
+ />,
221
+ );
222
+ const input = screen.getByRole('spinbutton');
223
+ fireEvent.focus(input);
224
+ fireEvent.input(input, {target: {value: '1·234'}});
225
+ fireEvent.keyDown(input, {key: 'Enter'});
226
+
227
+ expect(onChange).not.toHaveBeenCalled();
228
+ expect(onEnter).not.toHaveBeenCalled();
229
+ expect(input).toHaveValue('1·234');
230
+ });
231
+
232
+ it('keeps the existing Enter callback when there is no pending edit', () => {
233
+ const onEnter = vi.fn();
234
+ render(
235
+ <PowerSearchValueEditor
236
+ operatorValue={{type: 'float'}}
237
+ filterValue={{type: 'float', value: 1.5}}
238
+ onChange={() => {}}
239
+ onEnter={onEnter}
240
+ config={stubConfig}
241
+ />,
242
+ );
243
+
244
+ fireEvent.keyDown(screen.getByRole('spinbutton'), {key: 'Enter'});
245
+ expect(onEnter).toHaveBeenCalledTimes(1);
246
+ });
247
+ });
248
+
181
249
  // =============================================================================
182
250
  // #1106 — EntityListEditor drops photo, no renderItem
183
251
  // =============================================================================
@@ -404,3 +472,45 @@ describe('StringListEditor (#1107)', () => {
404
472
  expect(screen.getByRole('combobox')).toBeInTheDocument();
405
473
  });
406
474
  });
475
+
476
+ describe('maxMenuItems', () => {
477
+ const source = createSearchSource(
478
+ Array.from({length: 6}, (_, index) => ({
479
+ id: `option-${index}`,
480
+ label: `Option ${index}`,
481
+ })),
482
+ );
483
+
484
+ async function expectCapped(operatorValue: OperatorValue) {
485
+ render(
486
+ <PowerSearchValueEditor
487
+ operatorValue={operatorValue}
488
+ filterValue={undefined}
489
+ onChange={vi.fn()}
490
+ config={stubConfig}
491
+ maxMenuItems={2}
492
+ />,
493
+ );
494
+
495
+ await act(async () => {
496
+ fireEvent.change(screen.getByRole('combobox'), {
497
+ target: {value: 'Option'},
498
+ });
499
+ await new Promise(resolve => setTimeout(resolve, 200));
500
+ });
501
+
502
+ expect(screen.getAllByRole('option', {hidden: true})).toHaveLength(2);
503
+ }
504
+
505
+ it('caps string suggestions', async () => {
506
+ await expectCapped({type: 'string', searchSource: source});
507
+ });
508
+
509
+ it('caps string-list suggestions', async () => {
510
+ await expectCapped({type: 'string_list', searchSource: source});
511
+ });
512
+
513
+ it('caps entity-list suggestions', async () => {
514
+ await expectCapped({type: 'entity_list', searchSource: source});
515
+ });
516
+ });
@@ -12,7 +12,13 @@
12
12
  * - /packages/core/src/PowerSearch/index.ts
13
13
  */
14
14
 
15
- import React, {useCallback, useMemo} from 'react';
15
+ import React, {
16
+ useCallback,
17
+ useMemo,
18
+ useRef,
19
+ type FormEvent,
20
+ type KeyboardEvent,
21
+ } from 'react';
16
22
  import type {
17
23
  OperatorValue,
18
24
  FilterValue,
@@ -27,12 +33,16 @@ import type {ISOTimeString} from '../utils';
27
33
  // Lazy import to avoid circular deps — these are all from the same package
28
34
  import {TextInput} from '../TextInput';
29
35
  import {NumberInput} from '../NumberInput';
36
+ import {
37
+ resolveNumberInputCommit,
38
+ type NumberInputCommitDecision,
39
+ } from '../NumberInput/numberInputCommit';
30
40
  import {DateInput} from '../DateInput';
31
41
  import {TimeInput} from '../TimeInput';
32
42
  import {Selector} from '../Selector';
33
43
  import {Tokenizer} from '../Tokenizer';
34
44
  import {Typeahead} from '../Typeahead';
35
- import {useTranslator} from '../i18n';
45
+ import {useLocale, useTranslator} from '../i18n';
36
46
 
37
47
  export interface PowerSearchValueEditorProps {
38
48
  operatorValue: OperatorValue;
@@ -40,6 +50,8 @@ export interface PowerSearchValueEditorProps {
40
50
  onChange: (value: FilterValue, shouldSave?: boolean) => void;
41
51
  onEnter?: () => void;
42
52
  config: InternalConfig;
53
+ /** Max suggestions in string and entity value typeaheads. */
54
+ maxMenuItems?: number;
43
55
  isDisabled?: boolean;
44
56
  timezoneID?: string;
45
57
  }
@@ -80,11 +92,13 @@ function StringEditor({
80
92
  filterValue,
81
93
  onChange,
82
94
  onEnter: _onEnter,
95
+ maxMenuItems,
83
96
  }: {
84
97
  operatorValue: OperatorValue & {type: 'string'};
85
98
  filterValue: FilterValue | undefined;
86
99
  onChange: (value: FilterValue, shouldSave?: boolean) => void;
87
100
  onEnter?: () => void;
101
+ maxMenuItems?: number;
88
102
  }) {
89
103
  const t = useTranslator();
90
104
  const currentValue = filterValue?.type === 'string' ? filterValue.value : '';
@@ -111,6 +125,7 @@ function StringEditor({
111
125
  }}
112
126
  placeholder={t('@astryx.powersearch.valueEditor.searchPlaceholder')}
113
127
  debounceMs={150}
128
+ maxMenuItems={maxMenuItems}
114
129
  />
115
130
  );
116
131
  }
@@ -132,10 +147,12 @@ function StringListEditor({
132
147
  operatorValue,
133
148
  filterValue,
134
149
  onChange,
150
+ maxMenuItems,
135
151
  }: {
136
152
  operatorValue: OperatorValue & {type: 'string_list'};
137
153
  filterValue: FilterValue | undefined;
138
154
  onChange: (value: FilterValue) => void;
155
+ maxMenuItems?: number;
139
156
  }) {
140
157
  const t = useTranslator();
141
158
  const currentValue: SearchableItem[] = useMemo(() => {
@@ -176,31 +193,107 @@ function StringListEditor({
176
193
  placeholder={t('@astryx.powersearch.valueEditor.addValuesPlaceholder')}
177
194
  debounceMs={operatorValue.searchSource ? 150 : 0}
178
195
  hasCreate={hasCreate}
196
+ maxMenuItems={maxMenuItems}
179
197
  />
180
198
  );
181
199
  }
182
200
 
201
+ function useNumberEditorHandlers({
202
+ valueType,
203
+ min,
204
+ max,
205
+ isIntegerOnly,
206
+ onChange,
207
+ onEnter,
208
+ }: {
209
+ valueType: 'integer' | 'float';
210
+ min?: number;
211
+ max?: number;
212
+ isIntegerOnly: boolean;
213
+ onChange: (value: FilterValue, shouldSave?: boolean) => void;
214
+ onEnter?: () => void;
215
+ }) {
216
+ const locale = useLocale();
217
+ const pendingDecisionRef = useRef<NumberInputCommitDecision | null>(null);
218
+ const toFilterValue = useCallback(
219
+ (value: number): FilterValue =>
220
+ valueType === 'integer'
221
+ ? {type: 'integer', value}
222
+ : {type: 'float', value},
223
+ [valueType],
224
+ );
225
+ const handleChange = useCallback(
226
+ (value: number) => {
227
+ onChange(toFilterValue(value));
228
+ },
229
+ [onChange, toFilterValue],
230
+ );
231
+ const handleFocus = useCallback(() => {
232
+ pendingDecisionRef.current = null;
233
+ }, []);
234
+ const handleInput = useCallback(
235
+ (event: FormEvent<HTMLElement>) => {
236
+ pendingDecisionRef.current = resolveNumberInputCommit(
237
+ (event.currentTarget as HTMLInputElement).value,
238
+ {min, max, isIntegerOnly, locale, hasClear: false},
239
+ );
240
+ },
241
+ [isIntegerOnly, locale, max, min],
242
+ );
243
+ const handleEnter = useCallback(() => {
244
+ const decision = pendingDecisionRef.current;
245
+ pendingDecisionRef.current = null;
246
+ if (decision === null) {
247
+ onEnter?.();
248
+ } else if (decision.type === 'commit') {
249
+ onChange(toFilterValue(decision.value), true);
250
+ }
251
+ }, [onChange, onEnter, toFilterValue]);
252
+ const handleKeyDown = useCallback(
253
+ (event: KeyboardEvent<HTMLInputElement>) => {
254
+ if (event.key === 'Enter') {
255
+ event.stopPropagation();
256
+ }
257
+ },
258
+ [],
259
+ );
260
+
261
+ return {handleChange, handleEnter, handleFocus, handleInput, handleKeyDown};
262
+ }
263
+
183
264
  function IntegerEditor({
184
265
  operatorValue,
185
266
  filterValue,
186
267
  onChange,
268
+ onEnter,
187
269
  }: {
188
270
  operatorValue: OperatorValue & {type: 'integer'};
189
271
  filterValue: FilterValue | undefined;
190
- onChange: (value: FilterValue) => void;
272
+ onChange: (value: FilterValue, shouldSave?: boolean) => void;
273
+ onEnter?: () => void;
191
274
  }) {
192
275
  const t = useTranslator();
193
276
  const currentValue =
194
277
  filterValue?.type === 'integer' ? filterValue.value : undefined;
278
+ const handlers = useNumberEditorHandlers({
279
+ valueType: 'integer',
280
+ min: operatorValue.minValue,
281
+ max: operatorValue.maxValue,
282
+ isIntegerOnly: true,
283
+ onChange,
284
+ onEnter,
285
+ });
195
286
 
196
287
  return (
197
288
  <NumberInput
198
289
  label={t('@astryx.powersearch.valueEditor.value')}
199
290
  isLabelHidden
200
291
  value={currentValue ?? null}
201
- onChange={(value: number) => {
202
- onChange({type: 'integer', value});
203
- }}
292
+ onChange={handlers.handleChange}
293
+ onFocus={handlers.handleFocus}
294
+ onInput={handlers.handleInput}
295
+ onEnter={handlers.handleEnter}
296
+ onKeyDown={handlers.handleKeyDown}
204
297
  min={operatorValue.minValue}
205
298
  max={operatorValue.maxValue}
206
299
  units={operatorValue.units}
@@ -214,23 +307,35 @@ function FloatEditor({
214
307
  operatorValue,
215
308
  filterValue,
216
309
  onChange,
310
+ onEnter,
217
311
  }: {
218
312
  operatorValue: OperatorValue & {type: 'float'};
219
313
  filterValue: FilterValue | undefined;
220
- onChange: (value: FilterValue) => void;
314
+ onChange: (value: FilterValue, shouldSave?: boolean) => void;
315
+ onEnter?: () => void;
221
316
  }) {
222
317
  const t = useTranslator();
223
318
  const currentValue =
224
319
  filterValue?.type === 'float' ? filterValue.value : undefined;
320
+ const handlers = useNumberEditorHandlers({
321
+ valueType: 'float',
322
+ min: operatorValue.minValue,
323
+ max: operatorValue.maxValue,
324
+ isIntegerOnly: false,
325
+ onChange,
326
+ onEnter,
327
+ });
225
328
 
226
329
  return (
227
330
  <NumberInput
228
331
  label={t('@astryx.powersearch.valueEditor.value')}
229
332
  isLabelHidden
230
333
  value={currentValue ?? null}
231
- onChange={(value: number) => {
232
- onChange({type: 'float', value});
233
- }}
334
+ onChange={handlers.handleChange}
335
+ onFocus={handlers.handleFocus}
336
+ onInput={handlers.handleInput}
337
+ onEnter={handlers.handleEnter}
338
+ onKeyDown={handlers.handleKeyDown}
234
339
  min={operatorValue.minValue}
235
340
  max={operatorValue.maxValue}
236
341
  units={operatorValue.units}
@@ -537,10 +642,12 @@ function EntityListEditor({
537
642
  operatorValue,
538
643
  filterValue,
539
644
  onChange,
645
+ maxMenuItems,
540
646
  }: {
541
647
  operatorValue: OperatorValue & {type: 'entity_list'};
542
648
  filterValue: FilterValue | undefined;
543
649
  onChange: (value: FilterValue) => void;
650
+ maxMenuItems?: number;
544
651
  }) {
545
652
  const t = useTranslator();
546
653
  const source = useMemo<SearchSource<SearchableItem>>(() => {
@@ -588,6 +695,7 @@ function EntityListEditor({
588
695
  renderItem={operatorValue.renderItem}
589
696
  placeholder={t('@astryx.powersearch.valueEditor.searchPlaceholder')}
590
697
  debounceMs={operatorValue.searchSource ? 150 : 0}
698
+ maxMenuItems={maxMenuItems}
591
699
  />
592
700
  );
593
701
  }
@@ -631,6 +739,7 @@ export function PowerSearchValueEditor({
631
739
  filterValue,
632
740
  onChange,
633
741
  onEnter,
742
+ maxMenuItems,
634
743
  isDisabled,
635
744
  }: PowerSearchValueEditorProps) {
636
745
  switch (operatorValue.type) {
@@ -644,6 +753,7 @@ export function PowerSearchValueEditor({
644
753
  filterValue={filterValue}
645
754
  onChange={onChange}
646
755
  onEnter={onEnter}
756
+ maxMenuItems={maxMenuItems}
647
757
  />
648
758
  );
649
759
 
@@ -653,6 +763,7 @@ export function PowerSearchValueEditor({
653
763
  operatorValue={operatorValue}
654
764
  filterValue={filterValue}
655
765
  onChange={onChange}
766
+ maxMenuItems={maxMenuItems}
656
767
  />
657
768
  );
658
769
 
@@ -662,6 +773,7 @@ export function PowerSearchValueEditor({
662
773
  operatorValue={operatorValue}
663
774
  filterValue={filterValue}
664
775
  onChange={onChange}
776
+ onEnter={onEnter}
665
777
  />
666
778
  );
667
779
 
@@ -671,6 +783,7 @@ export function PowerSearchValueEditor({
671
783
  operatorValue={operatorValue}
672
784
  filterValue={filterValue}
673
785
  onChange={onChange}
786
+ onEnter={onEnter}
674
787
  />
675
788
  );
676
789
 
@@ -734,6 +847,7 @@ export function PowerSearchValueEditor({
734
847
  operatorValue={operatorValue}
735
848
  filterValue={filterValue}
736
849
  onChange={onChange}
850
+ maxMenuItems={maxMenuItems}
737
851
  />
738
852
  );
739
853
 
@@ -384,6 +384,8 @@ export interface PowerSearchAuxData {
384
384
  readonly filterValue?: FilterValue;
385
385
  /** Index in the filters array (for editing/removing). */
386
386
  readonly filterIndex?: number;
387
+ /** Section heading for field-browser entries. */
388
+ readonly group?: string;
387
389
  }
388
390
 
389
391
  export type PowerSearchItem = SearchableItem<PowerSearchAuxData>;
@@ -21,10 +21,15 @@ import type {
21
21
  // Helpers
22
22
  // =============================================================================
23
23
 
24
- function createSource(config: PowerSearchConfig) {
24
+ function createSource(
25
+ config: PowerSearchConfig,
26
+ // Uncapped by default so these tests exercise matching and ranking rather
27
+ // than the typed-result cap, which has its own test below.
28
+ maxTypedResults: number = Number.POSITIVE_INFINITY,
29
+ ) {
25
30
  const {result} = renderHook(() => {
26
31
  const internal = useInternalConfig(config);
27
- return usePowerSearchSource(internal);
32
+ return usePowerSearchSource(internal, maxTypedResults);
28
33
  });
29
34
  return result.current;
30
35
  }
@@ -92,6 +97,27 @@ const configWithContentSearch: PowerSearchConfig = {
92
97
  contentSearchFieldKey: 'title',
93
98
  };
94
99
 
100
+ const groupedConfig: PowerSearchConfig = {
101
+ name: 'GroupedSearch',
102
+ fields: [
103
+ field('team_a', 'Field Team A', 'Team'),
104
+ field('plain_a', 'Field Plain A'),
105
+ field('time_a', 'Field Time A', 'Time'),
106
+ field('team_b', 'Field Team B', 'Team'),
107
+ field('plain_b', 'Field Plain B'),
108
+ field('time_b', 'Field Time B', 'Time'),
109
+ ],
110
+ };
111
+
112
+ function field(key: string, label: string, group?: string) {
113
+ return {
114
+ key,
115
+ label,
116
+ group,
117
+ operators: [{key: 'is', label: 'is', value: {type: 'string'} as const}],
118
+ };
119
+ }
120
+
95
121
  // =============================================================================
96
122
  // Tests
97
123
  // =============================================================================
@@ -125,6 +151,21 @@ describe('usePowerSearchSource', () => {
125
151
  const source = createSource(baseConfig);
126
152
  expect(syncSearch(source, '')).toEqual(syncBootstrap(source));
127
153
  });
154
+
155
+ it('orders ungrouped fields before named groups', () => {
156
+ const items = syncBootstrap(createSource(groupedConfig));
157
+ expect(items.map(item => item.label)).toEqual([
158
+ 'Field Plain A',
159
+ 'Field Plain B',
160
+ 'Field Team A',
161
+ 'Field Team B',
162
+ 'Field Time A',
163
+ 'Field Time B',
164
+ ]);
165
+ expect(
166
+ items.map(item => (item.auxiliaryData as PowerSearchAuxData).group),
167
+ ).toEqual([undefined, undefined, 'Team', 'Team', 'Time', 'Time']);
168
+ });
128
169
  });
129
170
 
130
171
  describe('search (with query)', () => {
@@ -176,6 +217,23 @@ describe('usePowerSearchSource', () => {
176
217
  const aux = isItem?.auxiliaryData as PowerSearchAuxData;
177
218
  expect(aux.operatorKey).toBe('is');
178
219
  });
220
+
221
+ it('leaves ranked results flat and in relevance order', () => {
222
+ const results = syncSearch(createSource(groupedConfig), 'field');
223
+ expect(results.slice(0, 6).map(item => item.label)).toEqual([
224
+ 'Field Team A',
225
+ 'Field Team A is',
226
+ 'Field Plain A',
227
+ 'Field Plain A is',
228
+ 'Field Time A',
229
+ 'Field Time A is',
230
+ ]);
231
+ expect(
232
+ results.every(
233
+ item => (item.auxiliaryData as PowerSearchAuxData).group == null,
234
+ ),
235
+ ).toBe(true);
236
+ });
179
237
  });
180
238
 
181
239
  describe('contentSearchFieldKey', () => {
@@ -539,3 +597,25 @@ describe('usePowerSearchSource', () => {
539
597
  });
540
598
  });
541
599
  });
600
+
601
+ describe('typed-result cap', () => {
602
+ const manyFields: PowerSearchConfig = {
603
+ name: 'many',
604
+ fields: Array.from({length: 25}, (_, i) => ({
605
+ key: `field_${i}`,
606
+ label: `Zebra ${String(i).padStart(2, '0')}`,
607
+ operators: [{key: 'is', label: 'is', value: {type: 'string'} as const}],
608
+ })),
609
+ };
610
+
611
+ it('caps results for a typed query', () => {
612
+ const source = createSource(manyFields, 10);
613
+ expect(source.search('zebra')).toHaveLength(10);
614
+ });
615
+
616
+ it('never caps the field list for an empty query', () => {
617
+ const source = createSource(manyFields, 10);
618
+ expect(syncBootstrap(source)).toHaveLength(25);
619
+ expect(source.search('')).toHaveLength(25);
620
+ });
621
+ });