@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
@@ -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
+ });
@@ -14,13 +14,20 @@
14
14
 
15
15
  import {useMemo} from 'react';
16
16
  import type {SearchSource} from '../Typeahead/types';
17
+ import {groupItems} from '../utils';
17
18
  import {useTranslator} from '../i18n';
18
19
  import {resolveOperatorLabel} from './resolveOperatorLabel';
19
20
  import type {InternalConfig} from './useInternalConfig';
20
21
  import type {PowerSearchItem, PowerSearchOperator, FilterValue} from './types';
21
22
 
23
+ /**
24
+ * @param maxTypedResults Cap applied to ranked results for a non-empty query.
25
+ * The source never truncates empty-query browsing; PowerSearch's view applies
26
+ * a separate 1,000-row safety ceiling.
27
+ */
22
28
  export function usePowerSearchSource(
23
29
  config: InternalConfig,
30
+ maxTypedResults: number,
24
31
  ): SearchSource<PowerSearchItem> {
25
32
  const t = useTranslator();
26
33
  return useMemo(() => {
@@ -198,14 +205,14 @@ export function usePowerSearchSource(
198
205
  }
199
206
  }
200
207
 
201
- return results;
208
+ return results.slice(0, maxTypedResults);
202
209
  },
203
210
 
204
211
  bootstrap(): PowerSearchItem[] {
205
212
  return allItems;
206
213
  },
207
214
  };
208
- }, [config, t]);
215
+ }, [config, t, maxTypedResults]);
209
216
  }
210
217
 
211
218
  interface ValueMatch {
@@ -282,9 +289,12 @@ function buildFieldItems(config: InternalConfig): PowerSearchItem[] {
282
289
  auxiliaryData: {
283
290
  fieldKey: field.key,
284
291
  operatorKey: defaultOp?.key,
292
+ group: field.group,
285
293
  },
286
294
  });
287
295
  }
288
296
 
289
- return items;
297
+ return groupItems(items, {ungroupedFirst: true}).flatMap(
298
+ group => group.items,
299
+ );
290
300
  }
@@ -77,12 +77,30 @@ export const docs = {
77
77
  ],
78
78
  theming: {
79
79
  targets: [
80
- {className: 'astryx-progressbar', visualProps: ['variant']},
81
- {className: 'astryx-progressbar-fill', visualProps: ['variant']},
82
- {className: 'astryx-progressbar-track'},
80
+ {className: 'astryx-progress-bar', visualProps: ['variant']},
81
+ {className: 'astryx-progress-bar-fill', visualProps: ['variant']},
82
+ {className: 'astryx-progress-bar-track'},
83
+ {
84
+ className: 'astryx-progress-bar-mark',
85
+ visualProps: ['variant', 'placement'],
86
+ },
87
+ // Still emitted beside the names above, so themes written against
88
+ // them keep working. Drop in the next major.
89
+ {
90
+ className: 'astryx-progressbar',
91
+ visualProps: ['variant'],
92
+ deprecatedFor: 'progress-bar',
93
+ },
94
+ {
95
+ className: 'astryx-progressbar-fill',
96
+ visualProps: ['variant'],
97
+ deprecatedFor: 'progress-bar-fill',
98
+ },
99
+ {className: 'astryx-progressbar-track', deprecatedFor: 'progress-bar-track'},
83
100
  {
84
101
  className: 'astryx-progressbar-mark',
85
102
  visualProps: ['variant', 'placement'],
103
+ deprecatedFor: 'progress-bar-mark',
86
104
  },
87
105
  ],
88
106
  vars: [
@@ -182,12 +200,30 @@ export const docsZh = {
182
200
  ],
183
201
  theming: {
184
202
  targets: [
185
- {className: 'astryx-progressbar', visualProps: ['variant']},
186
- {className: 'astryx-progressbar-fill', visualProps: ['variant']},
187
- {className: 'astryx-progressbar-track'},
203
+ {className: 'astryx-progress-bar', visualProps: ['variant']},
204
+ {className: 'astryx-progress-bar-fill', visualProps: ['variant']},
205
+ {className: 'astryx-progress-bar-track'},
206
+ {
207
+ className: 'astryx-progress-bar-mark',
208
+ visualProps: ['variant', 'placement'],
209
+ },
210
+ // Still emitted beside the names above, so themes written against
211
+ // them keep working. Drop in the next major.
212
+ {
213
+ className: 'astryx-progressbar',
214
+ visualProps: ['variant'],
215
+ deprecatedFor: 'progress-bar',
216
+ },
217
+ {
218
+ className: 'astryx-progressbar-fill',
219
+ visualProps: ['variant'],
220
+ deprecatedFor: 'progress-bar-fill',
221
+ },
222
+ {className: 'astryx-progressbar-track', deprecatedFor: 'progress-bar-track'},
188
223
  {
189
224
  className: 'astryx-progressbar-mark',
190
225
  visualProps: ['variant', 'placement'],
226
+ deprecatedFor: 'progress-bar-mark',
191
227
  },
192
228
  ],
193
229
  vars: [
@@ -839,3 +839,27 @@ describe('ProgressBar', () => {
839
839
  });
840
840
  });
841
841
  });
842
+
843
+ describe('ProgressBar theme target names', () => {
844
+ it('renders the deprecated classes beside the current ones', () => {
845
+ const {container} = render(
846
+ <ProgressBar
847
+ value={50}
848
+ label="Progress"
849
+ marks={[{value: 80, label: 'M'}]}
850
+ />,
851
+ );
852
+ expect(container.querySelector('.astryx-progress-bar')).toHaveClass(
853
+ 'astryx-progressbar',
854
+ );
855
+ expect(container.querySelector('.astryx-progress-bar-track')).toHaveClass(
856
+ 'astryx-progressbar-track',
857
+ );
858
+ expect(container.querySelector('.astryx-progress-bar-fill')).toHaveClass(
859
+ 'astryx-progressbar-fill',
860
+ );
861
+ expect(container.querySelector('.astryx-progress-bar-mark')).toHaveClass(
862
+ 'astryx-progressbar-mark',
863
+ );
864
+ });
865
+ });
@@ -479,7 +479,13 @@ export function ProgressBar({
479
479
  <div
480
480
  ref={ref}
481
481
  {...mergeProps(
482
- themeProps('progressbar', {variant}),
482
+ themeProps(
483
+ 'progress-bar',
484
+ {variant},
485
+ // `progressbar` ran the compound name together; themes styling it
486
+ // keep working until the next major.
487
+ {legacyNames: ['progressbar']},
488
+ ),
483
489
  stylex.props(styles.container, xstyle),
484
490
  className,
485
491
  style,
@@ -524,13 +530,19 @@ export function ProgressBar({
524
530
  aria-labelledby={labelId}
525
531
  aria-valuetext={isIndeterminate ? undefined : valueText}
526
532
  {...mergeProps(
527
- themeProps('progressbar-track'),
533
+ themeProps('progress-bar-track', undefined, {
534
+ legacyNames: ['progressbar-track'],
535
+ }),
528
536
  stylex.props(styles.track, isIndeterminate && styles.trackClipped),
529
537
  )}>
530
538
  {isIndeterminate ? (
531
539
  <div
532
540
  {...mergeProps(
533
- themeProps('progressbar-fill', {variant: fillVariant}),
541
+ themeProps(
542
+ 'progress-bar-fill',
543
+ {variant: fillVariant},
544
+ {legacyNames: ['progressbar-fill']},
545
+ ),
534
546
  stylex.props(
535
547
  styles.indeterminateFill,
536
548
  variantStyles[fillVariant],
@@ -540,7 +552,11 @@ export function ProgressBar({
540
552
  ) : (
541
553
  <div
542
554
  {...mergeProps(
543
- themeProps('progressbar-fill', {variant: fillVariant}),
555
+ themeProps(
556
+ 'progress-bar-fill',
557
+ {variant: fillVariant},
558
+ {legacyNames: ['progressbar-fill']},
559
+ ),
544
560
  stylex.props(styles.fill, variantStyles[fillVariant]),
545
561
  )}
546
562
  style={{width: `${percentage}%`}}
@@ -569,10 +585,14 @@ export function ProgressBar({
569
585
  <span
570
586
  tabIndex={0}
571
587
  {...mergeProps(
572
- themeProps('progressbar-mark', {
573
- variant: fillVariant,
574
- placement: mark.isOnFill ? 'fill' : 'track',
575
- }),
588
+ themeProps(
589
+ 'progress-bar-mark',
590
+ {
591
+ variant: fillVariant,
592
+ placement: mark.isOnFill ? 'fill' : 'track',
593
+ },
594
+ {legacyNames: ['progressbar-mark']},
595
+ ),
576
596
  stylex.props(
577
597
  focusOutlineStyles.focusVisible,
578
598
  styles.mark,
@@ -35,11 +35,12 @@ import {
35
35
  spacingVars,
36
36
  } from '../theme/tokens.stylex';
37
37
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
38
- import {mergeProps, mergeRefs, rtlStyles} from '../utils';
38
+ import {mergeProps, rtlStyles} from '../utils';
39
39
  import type {ResizableProps} from './useResizable';
40
40
  import {themeProps} from '../utils/themeProps';
41
41
  import {useTranslator} from '../i18n';
42
42
 
43
+ import {useMergedRefs} from '../hooks/useMergedRefs';
43
44
  const KEYBOARD_STEP = 10;
44
45
  const KEYBOARD_LARGE_STEP = 50;
45
46
 
@@ -549,7 +550,7 @@ export function ResizeHandle({
549
550
 
550
551
  return (
551
552
  <div
552
- ref={mergeRefs(ref, handleRef)}
553
+ ref={useMergedRefs(ref, handleRef)}
553
554
  role="separator"
554
555
  aria-orientation={isHorizontal ? 'vertical' : 'horizontal'}
555
556
  aria-valuenow={ariaValueNow}
@@ -26,11 +26,12 @@ import type {
26
26
  SegmentedControlSize,
27
27
  SegmentedControlLayout,
28
28
  } from './SegmentedControlContext';
29
- import {mergeProps, mergeRefs, composeEventHandlers} from '../utils';
29
+ import {mergeProps, composeEventHandlers} from '../utils';
30
30
  import {useSize} from '../SizeContext/SizeContext';
31
31
  import type {BaseProps} from '../BaseProps';
32
32
  import {themeProps} from '../utils/themeProps';
33
33
 
34
+ import {useMergedRefs} from '../hooks/useMergedRefs';
34
35
  export interface SegmentedControlProps extends Omit<
35
36
  BaseProps<HTMLDivElement>,
36
37
  'onChange'
@@ -258,7 +259,7 @@ export function SegmentedControl({
258
259
  return (
259
260
  <SegmentedControlContext value={contextValue}>
260
261
  <div
261
- ref={mergeRefs(ref, listRef, disabledMessageTooltip.ref)}
262
+ ref={useMergedRefs(ref, listRef, disabledMessageTooltip.ref)}
262
263
  {...rest}
263
264
  role="radiogroup"
264
265
  aria-label={label}