@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
@@ -424,6 +424,11 @@ export type MultiSelectorStatusType = 'warning' | 'error' | 'success';
424
424
 
425
425
  export type {MultiSelectorStatus};
426
426
 
427
+ export interface MultiSelectorSelectedItem {
428
+ value: string;
429
+ label: string;
430
+ }
431
+
427
432
  export interface MultiSelectorProps<
428
433
  T extends MultiSelectorOptionType = MultiSelectorOptionType,
429
434
  > extends Omit<BaseProps, 'onChange' | 'defaultValue'> {
@@ -599,6 +604,25 @@ export interface MultiSelectorProps<
599
604
  */
600
605
  searchPlaceholder?: string;
601
606
 
607
+ /**
608
+ * Content shown in the panel when there are no options to show, and
609
+ * announced in a polite live region when the panel opens. Not shown while
610
+ * `isLoading` — the options have not arrived yet.
611
+ * @default 'No options'
612
+ */
613
+ emptyText?: ReactNode;
614
+
615
+ /**
616
+ * Content shown in the panel when a search query matches no options, and
617
+ * announced in a polite live region at the same time.
618
+ *
619
+ * The panel message is `role="presentation"`, so the live region is the only
620
+ * route to assistive tech: a string is announced verbatim, a richer node
621
+ * falls back to the default text since it cannot be spoken.
622
+ * @default 'No results found'
623
+ */
624
+ emptySearchText?: ReactNode;
625
+
602
626
  /**
603
627
  * How to display selected items in the trigger.
604
628
  * - 'count': "3 selected"
@@ -608,6 +632,17 @@ export interface MultiSelectorProps<
608
632
  */
609
633
  triggerDisplay?: 'count' | 'labels' | 'badges';
610
634
 
635
+ /**
636
+ * Formats the trigger text when triggerDisplay is 'count' or 'labels'.
637
+ * Receives the selected items (value plus resolved label, in selection
638
+ * order) and returns the full trigger text; the count is `items.length`.
639
+ * Not called when nothing is selected — the placeholder shows instead — and
640
+ * not called for triggerDisplay 'badges', which renders Badge elements
641
+ * rather than text.
642
+ * @default items => `${items.length} selected` for 'count', "A, B, C, +N" for 'labels'
643
+ */
644
+ formatValue?: (items: MultiSelectorSelectedItem[]) => string;
645
+
611
646
  /**
612
647
  * Maximum number of badges to show before showing "+N".
613
648
  * Only used when triggerDisplay is 'badges'.
@@ -710,7 +745,10 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
710
745
  selectAllLabel: selectAllLabelFromProps,
711
746
  hasSearch = false,
712
747
  searchPlaceholder: searchPlaceholderFromProps,
748
+ emptyText: emptyTextFromProps,
749
+ emptySearchText: emptySearchTextFromProps,
713
750
  triggerDisplay = 'count',
751
+ formatValue,
714
752
  maxBadges = 3,
715
753
  renderOption,
716
754
  indicatorPosition = 'start',
@@ -730,6 +768,9 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
730
768
  selectAllLabelFromProps ?? t('@astryx.multiSelector.selectAll');
731
769
  const searchPlaceholder =
732
770
  searchPlaceholderFromProps ?? t('@astryx.multiSelector.searchPlaceholder');
771
+ const emptyText = emptyTextFromProps ?? t('@astryx.multiSelector.empty');
772
+ const emptySearchText =
773
+ emptySearchTextFromProps ?? t('@astryx.multiSelector.emptySearchResults');
733
774
  const size = useSize(sizeProp, 'md');
734
775
  const effectiveStatusVariant =
735
776
  variant === 'ghost' && statusVariant === 'attached'
@@ -804,6 +845,19 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
804
845
  // Announce selection-count changes politely (comboboxes-7 announce path).
805
846
  // Toggling options / select-all previously produced no audible feedback.
806
847
  const announce = useAnnounce();
848
+
849
+ // The panel's empty message is role="presentation" and reaches assistive tech
850
+ // only through this live region, so the region has to speak whatever the
851
+ // panel shows. A ReactNode override cannot be spoken; fall back to the
852
+ // catalog copy for that case rather than announcing nothing.
853
+ const emptyAnnouncement =
854
+ typeof emptyText === 'string'
855
+ ? emptyText
856
+ : t('@astryx.multiSelector.empty');
857
+ const emptySearchAnnouncement =
858
+ typeof emptySearchText === 'string'
859
+ ? emptySearchText
860
+ : t('@astryx.multiSelector.emptySearchResults');
807
861
  const announceSelection = useCallback(
808
862
  (nextValue: string[]) => {
809
863
  const total = selectableItems.length;
@@ -923,16 +977,54 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
923
977
  announce('');
924
978
  return;
925
979
  }
980
+ // While isLoading the panel deliberately shows nothing, so announcing a
981
+ // result would put a claim in the one channel the screen has gone quiet
982
+ // for.
983
+ if (isLoading) {
984
+ announce('');
985
+ return;
986
+ }
926
987
  const count = filterOptionsByQuery(selectableItems, nextQuery).length;
927
988
  announce(
928
989
  count === 0
929
- ? t('@astryx.multiSelector.emptySearchResults')
990
+ ? emptySearchAnnouncement
930
991
  : t('@astryx.multiSelector.resultCount', {count}),
931
992
  );
932
993
  },
933
- [announce, selectableItems, t],
994
+ [announce, isLoading, selectableItems, emptySearchAnnouncement, t],
934
995
  );
935
996
 
997
+ // The panel's empty message is role="presentation", so this region is the
998
+ // only route to assistive tech. It has to watch the STATE rather than the
999
+ // open event: the panel can become empty either on open or when a fetch
1000
+ // lands with nothing in it, and an open-only announcement leaves the second
1001
+ // case silent while the message sits on screen. The ref makes it fire once
1002
+ // per arrival at that state rather than on every re-render.
1003
+ const announcedEmptyRef = useRef<string | null>(null);
1004
+ useEffect(() => {
1005
+ const isPanelEmpty =
1006
+ popover.isOpen &&
1007
+ !isLoading &&
1008
+ searchQuery === '' &&
1009
+ selectableItems.length === 0;
1010
+ if (!isPanelEmpty) {
1011
+ announcedEmptyRef.current = null;
1012
+ return;
1013
+ }
1014
+ if (announcedEmptyRef.current === emptyAnnouncement) {
1015
+ return;
1016
+ }
1017
+ announcedEmptyRef.current = emptyAnnouncement;
1018
+ announce(emptyAnnouncement);
1019
+ }, [
1020
+ popover.isOpen,
1021
+ isLoading,
1022
+ searchQuery,
1023
+ selectableItems.length,
1024
+ emptyAnnouncement,
1025
+ announce,
1026
+ ]);
1027
+
936
1028
  // Handle toggle
937
1029
  // Clear all selected values. Shared by the clear button and the keyboard
938
1030
  // Delete/Backspace path so clearing is reachable without a mouse.
@@ -1107,13 +1199,18 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1107
1199
  }, [popover.isOpen, highlightedIndex, getItemId]);
1108
1200
 
1109
1201
  // Build trigger display content
1110
- const selectedLabels = useMemo(() => {
1202
+ const selectedItems = useMemo(() => {
1111
1203
  return optimisticValue.map(v => {
1112
1204
  const item = selectableItems.find(i => i.value === v);
1113
- return item?.label ?? v;
1205
+ return {value: v, label: item?.label ?? v};
1114
1206
  });
1115
1207
  }, [optimisticValue, selectableItems]);
1116
1208
 
1209
+ const selectedLabels = useMemo(
1210
+ () => selectedItems.map(item => item.label),
1211
+ [selectedItems],
1212
+ );
1213
+
1117
1214
  const renderTriggerContent = useCallback(() => {
1118
1215
  if (optimisticValue.length === 0) {
1119
1216
  return <span {...stylex.props(styles.triggerText)}>{placeholder}</span>;
@@ -1123,7 +1220,8 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1123
1220
  case 'count':
1124
1221
  return (
1125
1222
  <span {...stylex.props(styles.triggerText)}>
1126
- {optimisticValue.length} selected
1223
+ {formatValue?.(selectedItems) ??
1224
+ `${optimisticValue.length} selected`}
1127
1225
  </span>
1128
1226
  );
1129
1227
 
@@ -1134,7 +1232,11 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1134
1232
  remaining > 0
1135
1233
  ? `${displayed.join(', ')}, +${remaining}`
1136
1234
  : displayed.join(', ');
1137
- return <span {...stylex.props(styles.triggerText)}>{text}</span>;
1235
+ return (
1236
+ <span {...stylex.props(styles.triggerText)}>
1237
+ {formatValue?.(selectedItems) ?? text}
1238
+ </span>
1239
+ );
1138
1240
  }
1139
1241
 
1140
1242
  case 'badges': {
@@ -1154,7 +1256,15 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1154
1256
  );
1155
1257
  }
1156
1258
  }
1157
- }, [optimisticValue, triggerDisplay, selectedLabels, placeholder, maxBadges]);
1259
+ }, [
1260
+ optimisticValue,
1261
+ triggerDisplay,
1262
+ selectedItems,
1263
+ selectedLabels,
1264
+ placeholder,
1265
+ formatValue,
1266
+ maxBadges,
1267
+ ]);
1158
1268
 
1159
1269
  // Render search input
1160
1270
  const renderSearch = useCallback(() => {
@@ -1381,7 +1491,10 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1381
1491
  // message out of the listbox's accessibility tree (role="listbox" only
1382
1492
  // permits option/group children); the no-results outcome is announced
1383
1493
  // via the result-count live region instead.
1384
- if (realItemCount === 0) {
1494
+ // While isLoading the options have not arrived yet, so asserting either
1495
+ // message would be a claim the component cannot make; the trigger's
1496
+ // spinner covers it.
1497
+ if (realItemCount === 0 && !isLoading) {
1385
1498
  elements.push(
1386
1499
  <div
1387
1500
  key="empty"
@@ -1390,7 +1503,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1390
1503
  themeProps('multi-selector-empty-state'),
1391
1504
  stylex.props(styles.emptyState),
1392
1505
  )}>
1393
- No results found
1506
+ {searchQuery ? emptySearchText : emptyText}
1394
1507
  </div>,
1395
1508
  );
1396
1509
  return elements;
@@ -1420,8 +1533,17 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1420
1533
  // A standalone divider between groups would orphan itself once its
1421
1534
  // neighbors are filtered out, so skip it while searching.
1422
1535
  if (!isSearching) {
1536
+ // role="listbox" only permits option/group children; the divider
1537
+ // carries no information the options don't, so it's hidden from
1538
+ // the accessibility tree entirely rather than exposing
1539
+ // role="separator" as a disallowed listbox child (axe
1540
+ // aria-required-children).
1423
1541
  elements.push(
1424
- <Divider key={`divider-${i}`} xstyle={styles.divider} />,
1542
+ <Divider
1543
+ key={`divider-${i}`}
1544
+ aria-hidden="true"
1545
+ xstyle={styles.divider}
1546
+ />,
1425
1547
  );
1426
1548
  }
1427
1549
  } else if (isSection(option)) {
@@ -1471,7 +1593,16 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1471
1593
  flushPending();
1472
1594
 
1473
1595
  return elements;
1474
- }, [options, renderItem, sortedItems, searchQuery, hasSelectAll]);
1596
+ }, [
1597
+ options,
1598
+ renderItem,
1599
+ sortedItems,
1600
+ searchQuery,
1601
+ hasSelectAll,
1602
+ isLoading,
1603
+ emptyText,
1604
+ emptySearchText,
1605
+ ]);
1475
1606
 
1476
1607
  // The detached message box renders its own leading status icon, so the
1477
1608
  // on-field icon would duplicate it — keep the chevron indicator instead.
@@ -13,6 +13,7 @@ export {
13
13
  type MultiSelectorProps,
14
14
  type MultiSelectorSize,
15
15
  type MultiSelectorStatusType,
16
+ type MultiSelectorSelectedItem,
16
17
  } from './MultiSelector';
17
18
  export type {
18
19
  MultiSelectorOptionType,
@@ -22,7 +22,10 @@ export const docs = {
22
22
  ],
23
23
  theming: {
24
24
  targets: [
25
- {className: 'astryx-navicon'},
25
+ {className: 'astryx-nav-icon'},
26
+ // Still emitted beside the names above, so themes written against
27
+ // them keep working. Drop in the next major.
28
+ {className: 'astryx-navicon', deprecatedFor: 'nav-icon'},
26
29
  ],
27
30
  },
28
31
  usage: {
@@ -51,7 +54,10 @@ export const docsZh = {
51
54
  ],
52
55
  theming: {
53
56
  targets: [
54
- {className: 'astryx-navicon'},
57
+ {className: 'astryx-nav-icon'},
58
+ // Still emitted beside the names above, so themes written against
59
+ // them keep working. Drop in the next major.
60
+ {className: 'astryx-navicon', deprecatedFor: 'nav-icon'},
55
61
  ],
56
62
  },
57
63
  usage: {
@@ -30,3 +30,12 @@ describe('NavIcon', () => {
30
30
  expect(screen.getByTestId('nav-icon')).toBeInTheDocument();
31
31
  });
32
32
  });
33
+
34
+ describe('NavIcon theme target names', () => {
35
+ it('renders the deprecated class beside the current one', () => {
36
+ render(<NavIcon icon={<span>Icon</span>} data-testid="nav-icon" />);
37
+ const root = screen.getByTestId('nav-icon');
38
+ expect(root).toHaveClass('astryx-nav-icon');
39
+ expect(root).toHaveClass('astryx-navicon');
40
+ });
41
+ });
@@ -79,7 +79,11 @@ export function NavIcon({
79
79
  <span
80
80
  ref={ref}
81
81
  {...mergeProps(
82
- themeProps('navicon'),
82
+ themeProps('nav-icon', undefined, {
83
+ // `navicon` ran the compound name together; themes styling it keep
84
+ // working until the next major.
85
+ legacyNames: ['navicon'],
86
+ }),
83
87
  stylex.props(styles.base, xstyle),
84
88
  className,
85
89
  style,
@@ -15,7 +15,7 @@
15
15
  import React, {useCallback, useMemo, type ReactNode} from 'react';
16
16
  import * as stylex from '@stylexjs/stylex';
17
17
  import {spacingVars} from '../theme/tokens.stylex';
18
- import {mergeProps, mergeRefs} from '../utils';
18
+ import {mergeProps} from '../utils';
19
19
  import type {BaseProps} from '../BaseProps';
20
20
  import {useListFocus} from '../hooks/useListFocus';
21
21
  import {useTypeahead} from '../hooks/useTypeahead';
@@ -26,6 +26,7 @@ import {
26
26
  type NavHeadingMenuSize,
27
27
  } from './NavMenuContext';
28
28
 
29
+ import {useMergedRefs} from '../hooks/useMergedRefs';
29
30
  const styles = stylex.create({
30
31
  root: {
31
32
  display: 'flex',
@@ -162,7 +163,7 @@ export function NavHeadingMenu({
162
163
  return (
163
164
  <NavHeadingMenuContext value={ctx}>
164
165
  <div
165
- ref={mergeRefs(ref, listRef)}
166
+ ref={useMergedRefs(ref, listRef)}
166
167
  role="menu"
167
168
  onKeyDown={listKeyDown}
168
169
  data-testid={testId}
@@ -35,7 +35,7 @@ export const docs = {
35
35
  name: 'onChange',
36
36
  type: '(value: number) => void',
37
37
  description:
38
- 'Callback fired when input value changes (only on valid input).',
38
+ 'Callback fired when a valid text edit commits on blur or Enter, or when a step or clear control changes the value.',
39
39
  required: true,
40
40
  },
41
41
  {
@@ -61,6 +61,11 @@ export const docs = {
61
61
  description:
62
62
  'Whether the field is optional (mutually exclusive with isRequired).',
63
63
  },
64
+ {
65
+ name: 'onKeyDown',
66
+ type: '(e: KeyboardEvent<HTMLInputElement>) => void',
67
+ description: 'Callback fired on keydown events on the input.',
68
+ },
64
69
  {
65
70
  name: 'isRequired',
66
71
  type: 'boolean',
@@ -123,12 +128,14 @@ export const docs = {
123
128
  {
124
129
  name: 'min',
125
130
  type: 'number | null',
126
- description: 'Minimum value allowed.',
131
+ description:
132
+ 'Minimum value allowed. A smaller entry commits at this value on blur or Enter.',
127
133
  },
128
134
  {
129
135
  name: 'max',
130
136
  type: 'number | null',
131
- description: 'Maximum value allowed.',
137
+ description:
138
+ 'Maximum value allowed. A larger entry commits at this value on blur or Enter.',
132
139
  },
133
140
  {
134
141
  name: 'step',
@@ -237,6 +244,11 @@ export const docs = {
237
244
  description:
238
245
  'A form input for numeric values with built-in validation, min/max constraints, and step controls. Use NumberInput for quantities, measurements, percentages, and similar inputs.',
239
246
  bestPractices: [
247
+ {
248
+ guidance: true,
249
+ description:
250
+ "Let people paste formatted numbers: a pasted 1,234,234,234 is read under the field's locale and commits as 1234234234 on blur. Typing is never intercepted.",
251
+ },
240
252
  {
241
253
  guidance: true,
242
254
  description:
@@ -318,7 +330,8 @@ export const docsZh = {
318
330
  {
319
331
  name: 'onChange',
320
332
  type: '(value: number) => void',
321
- description: '输入值变化时触发的回调(仅在输入有效时触发)。',
333
+ description:
334
+ '有效文本编辑在失焦或按 Enter 时提交;步进或清除控件更改值时也会触发回调。',
322
335
  required: true,
323
336
  },
324
337
  {
@@ -400,12 +413,12 @@ export const docsZh = {
400
413
  {
401
414
  name: 'min',
402
415
  type: 'number | null',
403
- description: '允许的最小值。',
416
+ description: '允许的最小值。更小的输入会在失焦或按 Enter 时提交为该值。',
404
417
  },
405
418
  {
406
419
  name: 'max',
407
420
  type: 'number | null',
408
- description: '允许的最大值。',
421
+ description: '允许的最大值。更大的输入会在失焦或按 Enter 时提交为该值。',
409
422
  },
410
423
  {
411
424
  name: 'step',
@@ -504,6 +517,11 @@ export const docsZh = {
504
517
  description:
505
518
  'A form input for numeric values with built-in validation, min/max constraints, and step controls. Use NumberInput for quantities, measurements, percentages, and similar inputs.',
506
519
  bestPractices: [
520
+ {
521
+ guidance: true,
522
+ description:
523
+ '可以直接粘贴带格式的数字:粘贴 1,234,234,234 会按字段所在区域设置解析,失去焦点时提交为 1234234234。输入过程中不会拦截按键。',
524
+ },
507
525
  {
508
526
  guidance: true,
509
527
  description:
@@ -573,6 +591,11 @@ export const docsDense = {
573
591
  description:
574
592
  'A form input for numeric values with built-in validation, min/max constraints, and step controls. Use NumberInput for quantities, measurements, percentages, and similar inputs.',
575
593
  bestPractices: [
594
+ {
595
+ guidance: true,
596
+ description:
597
+ "Pasted formatted numbers parse: 1,234,234,234 commits as 1234234234 under the field's locale. Typing is never intercepted.",
598
+ },
576
599
  {
577
600
  guidance: true,
578
601
  description:
@@ -635,7 +658,8 @@ export const docsDense = {
635
658
  propDescriptions: {
636
659
  label: 'Label text (always rendered for accessibility).',
637
660
  value: 'Current input value.',
638
- onChange: 'Callback on valid input change.',
661
+ onChange:
662
+ 'Callback when a valid text edit commits on blur/Enter, or a step/clear control changes the value.',
639
663
  size: 'Size variant.',
640
664
  isLabelHidden: 'Visually hide label (still accessible to screen readers).',
641
665
  description: 'Text between label + input.',