@astryxdesign/core 0.1.8 → 0.1.9-canary.08c278e

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 (603) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +6 -2
  4. package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
  5. package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
  6. package/dist/Avatar/Avatar.d.ts +53 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +203 -49
  9. package/dist/Avatar/AvatarStatusDot.d.ts +33 -5
  10. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  11. package/dist/Avatar/AvatarStatusDot.js +144 -19
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +58 -6
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
  17. package/dist/Banner/Banner.d.ts +9 -1
  18. package/dist/Banner/Banner.d.ts.map +1 -1
  19. package/dist/Banner/Banner.js +33 -4
  20. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
  21. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +208 -6
  23. package/dist/Breadcrumbs/index.d.ts +5 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +9 -1
  26. package/dist/Button/Button.d.ts +8 -2
  27. package/dist/Button/Button.d.ts.map +1 -1
  28. package/dist/Button/Button.js +33 -4
  29. package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
  30. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  31. package/dist/ButtonGroup/ButtonGroup.js +30 -1
  32. package/dist/Calendar/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar/Calendar.js +30 -2
  34. package/dist/Calendar/dayCellUtils.js +1 -1
  35. package/dist/Card/Card.d.ts +8 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +28 -2
  38. package/dist/Carousel/Carousel.d.ts +4 -1
  39. package/dist/Carousel/Carousel.d.ts.map +1 -1
  40. package/dist/Carousel/Carousel.js +24 -4
  41. package/dist/Chat/ChatComposer.d.ts +8 -0
  42. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  43. package/dist/Chat/ChatComposer.js +46 -7
  44. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  45. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  46. package/dist/Chat/ChatComposerDrawer.js +11 -1
  47. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  48. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  49. package/dist/Chat/ChatComposerInput.js +36 -4
  50. package/dist/Chat/ChatContext.d.ts +33 -0
  51. package/dist/Chat/ChatContext.d.ts.map +1 -1
  52. package/dist/Chat/ChatContext.js +16 -2
  53. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  54. package/dist/Chat/ChatDictationButton.js +1 -1
  55. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  56. package/dist/Chat/ChatLayout.js +4 -4
  57. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  59. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  60. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  61. package/dist/Chat/ChatSendButton.js +7 -1
  62. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +18 -9
  65. package/dist/Chat/index.d.ts +2 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/index.js +1 -1
  68. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  69. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  70. package/dist/Chat/useChatStreamScroll.js +22 -8
  71. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  72. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  73. package/dist/Chat/useSpeechRecognition.js +1 -1
  74. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  75. package/dist/Chat/useTriggerMenu.js +2 -2
  76. package/dist/CheckboxInput/CheckboxInput.js +1 -1
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  80. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  81. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  82. package/dist/ClickableCard/ClickableCard.js +5 -2
  83. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  84. package/dist/CodeBlock/CodeBlock.js +9 -2
  85. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  86. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  87. package/dist/CommandPalette/CommandPalette.js +3 -1
  88. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  89. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  90. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  91. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  92. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  93. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  94. package/dist/DateInput/DateInput.d.ts +55 -2
  95. package/dist/DateInput/DateInput.d.ts.map +1 -1
  96. package/dist/DateInput/DateInput.js +28 -2
  97. package/dist/DateInput/index.d.ts +1 -1
  98. package/dist/DateInput/index.d.ts.map +1 -1
  99. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  100. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  101. package/dist/DateRangeInput/DateRangeInput.js +3 -1
  102. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  103. package/dist/DateTimeInput/DateTimeInput.js +18 -3
  104. package/dist/Dialog/Dialog.d.ts +3 -0
  105. package/dist/Dialog/Dialog.d.ts.map +1 -1
  106. package/dist/Dialog/Dialog.js +57 -6
  107. package/dist/Dialog/DialogContext.d.ts +7 -0
  108. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  109. package/dist/Dialog/DialogContext.js +2 -2
  110. package/dist/Dialog/DialogHeader.d.ts +5 -2
  111. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  112. package/dist/Dialog/DialogHeader.js +6 -1
  113. package/dist/Divider/Divider.js +1 -1
  114. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  115. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  116. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
  117. package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
  118. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  119. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  120. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  121. package/dist/Field/Field.d.ts.map +1 -1
  122. package/dist/Field/Field.js +2 -3
  123. package/dist/Field/FieldLabel.d.ts +1 -1
  124. package/dist/Field/FieldLabel.d.ts.map +1 -1
  125. package/dist/Field/FieldLabel.js +43 -16
  126. package/dist/FieldStatus/FieldStatus.d.ts +15 -0
  127. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  128. package/dist/FieldStatus/FieldStatus.js +58 -6
  129. package/dist/FileInput/FileInput.d.ts +9 -2
  130. package/dist/FileInput/FileInput.d.ts.map +1 -1
  131. package/dist/FileInput/FileInput.js +42 -20
  132. package/dist/HoverCard/HoverCard.d.ts +9 -1
  133. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  134. package/dist/HoverCard/HoverCard.js +2 -0
  135. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  136. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  137. package/dist/HoverCard/useHoverCard.js +7 -2
  138. package/dist/Icon/Icon.d.ts +7 -2
  139. package/dist/Icon/Icon.d.ts.map +1 -1
  140. package/dist/Item/Item.d.ts +6 -1
  141. package/dist/Item/Item.d.ts.map +1 -1
  142. package/dist/Item/Item.js +22 -1
  143. package/dist/Layer/useLayer.d.ts +6 -0
  144. package/dist/Layer/useLayer.d.ts.map +1 -1
  145. package/dist/Layer/useLayer.js +2 -0
  146. package/dist/Lightbox/Lightbox.js +4 -4
  147. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  148. package/dist/MobileNav/MobileNav.js +6 -1
  149. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  150. package/dist/MobileNav/MobileNavToggle.js +4 -0
  151. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  152. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  153. package/dist/MultiSelector/MultiSelector.js +41 -12
  154. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  155. package/dist/MultiSelector/hooks.js +16 -0
  156. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  157. package/dist/NumberInput/NumberInput.d.ts +9 -2
  158. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  159. package/dist/NumberInput/NumberInput.js +8 -1
  160. package/dist/Outline/Outline.d.ts +0 -1
  161. package/dist/Outline/Outline.d.ts.map +1 -1
  162. package/dist/Outline/Outline.js +0 -1
  163. package/dist/OverflowList/OverflowList.d.ts +20 -3
  164. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  165. package/dist/OverflowList/OverflowList.js +29 -4
  166. package/dist/Pagination/Pagination.d.ts.map +1 -1
  167. package/dist/Pagination/Pagination.js +11 -3
  168. package/dist/Popover/Popover.d.ts.map +1 -1
  169. package/dist/Popover/Popover.js +3 -2
  170. package/dist/Popover/usePopover.d.ts.map +1 -1
  171. package/dist/Popover/usePopover.js +3 -9
  172. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  173. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  174. package/dist/PowerSearch/PowerSearch.js +2 -0
  175. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  176. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  178. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  179. package/dist/SelectableCard/SelectableCard.js +16 -13
  180. package/dist/Selector/Selector.d.ts +8 -0
  181. package/dist/Selector/Selector.d.ts.map +1 -1
  182. package/dist/Selector/Selector.js +7 -3
  183. package/dist/Selector/hooks.d.ts.map +1 -1
  184. package/dist/Selector/hooks.js +16 -0
  185. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  186. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  187. package/dist/SideNav/SideNavHeading.js +21 -8
  188. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  189. package/dist/Slider/Slider.d.ts.map +1 -1
  190. package/dist/Slider/Slider.js +19 -2
  191. package/dist/Stack/stack.stylex.d.ts +9 -9
  192. package/dist/TabList/Tab.js +2 -2
  193. package/dist/TabList/TabMenu.js +1 -1
  194. package/dist/Table/BaseTable.d.ts.map +1 -1
  195. package/dist/Table/BaseTable.js +3 -2
  196. package/dist/Table/TableCell.js +3 -3
  197. package/dist/Table/TableHeaderCell.js +3 -3
  198. package/dist/Table/index.d.ts +2 -0
  199. package/dist/Table/index.d.ts.map +1 -1
  200. package/dist/Table/index.js +1 -0
  201. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  202. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  203. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  204. package/dist/Table/plugins/rowStatus/index.js +3 -0
  205. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  206. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  207. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  208. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  209. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  210. package/dist/Table/plugins/selection/useTableSelection.js +4 -1
  211. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  212. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  213. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  214. package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
  215. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  216. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  217. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  218. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  219. package/dist/Table/useBaseTablePlugins.js +5 -3
  220. package/dist/TextArea/TextArea.d.ts +9 -1
  221. package/dist/TextArea/TextArea.d.ts.map +1 -1
  222. package/dist/TextArea/TextArea.js +2 -0
  223. package/dist/TextInput/TextInput.d.ts +9 -2
  224. package/dist/TextInput/TextInput.d.ts.map +1 -1
  225. package/dist/TextInput/TextInput.js +6 -1
  226. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  227. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  228. package/dist/Thumbnail/Thumbnail.js +97 -54
  229. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  230. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  231. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  232. package/dist/TimeInput/TimeInput.d.ts +9 -2
  233. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  234. package/dist/TimeInput/TimeInput.js +17 -4
  235. package/dist/Timestamp/Timestamp.d.ts +3 -1
  236. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  237. package/dist/Timestamp/Timestamp.js +8 -6
  238. package/dist/Toast/useToast.d.ts.map +1 -1
  239. package/dist/Toast/useToast.js +2 -5
  240. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  241. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  242. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  243. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  244. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  245. package/dist/Tokenizer/Tokenizer.js +18 -4
  246. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  247. package/dist/TopNav/TopNavHeading.js +18 -8
  248. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  249. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  250. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  251. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  252. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  253. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMenu.js +68 -6
  255. package/dist/TreeList/TreeList.d.ts +12 -3
  256. package/dist/TreeList/TreeList.d.ts.map +1 -1
  257. package/dist/TreeList/TreeList.js +2 -0
  258. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  259. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  260. package/dist/TreeList/TreeListBranches.js +10 -4
  261. package/dist/TreeList/TreeListItem.d.ts +8 -2
  262. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  263. package/dist/TreeList/TreeListItem.js +28 -8
  264. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  265. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  266. package/dist/TreeList/index.d.ts +2 -2
  267. package/dist/TreeList/index.d.ts.map +1 -1
  268. package/dist/Typeahead/BaseTypeahead.js +1 -1
  269. package/dist/Typeahead/Typeahead.d.ts +9 -2
  270. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  271. package/dist/Typeahead/Typeahead.js +2 -0
  272. package/dist/astryx.css +41 -31
  273. package/dist/astryx.umd.js +51 -51
  274. package/dist/astryx.umd.js.map +4 -4
  275. package/dist/authoring/doc.d.ts.map +1 -1
  276. package/dist/docs-types.d.ts +8 -0
  277. package/dist/docs-types.d.ts.map +1 -1
  278. package/dist/hooks/computeOverflow.d.ts +47 -0
  279. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  280. package/dist/hooks/computeOverflow.js +213 -0
  281. package/dist/hooks/index.d.ts +1 -0
  282. package/dist/hooks/index.d.ts.map +1 -1
  283. package/dist/hooks/index.js +2 -1
  284. package/dist/hooks/isRtlElement.d.ts +18 -0
  285. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  286. package/dist/hooks/isRtlElement.js +27 -0
  287. package/dist/hooks/useDevWarning.d.ts +18 -0
  288. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  289. package/dist/hooks/useDevWarning.js +49 -0
  290. package/dist/hooks/useGridFocus.d.ts +6 -1
  291. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  292. package/dist/hooks/useGridFocus.js +12 -9
  293. package/dist/hooks/useListFocus.d.ts +6 -1
  294. package/dist/hooks/useListFocus.d.ts.map +1 -1
  295. package/dist/hooks/useListFocus.js +12 -4
  296. package/dist/hooks/useOverflow.d.ts +19 -0
  297. package/dist/hooks/useOverflow.d.ts.map +1 -1
  298. package/dist/hooks/useOverflow.js +36 -25
  299. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  300. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  301. package/dist/i18n/InternationalizationContext.js +3 -0
  302. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  303. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  304. package/dist/i18n/InternationalizationProvider.js +5 -1
  305. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  306. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  307. package/dist/i18n/getLocaleDirection.js +29 -0
  308. package/dist/i18n/index.d.ts +6 -0
  309. package/dist/i18n/index.d.ts.map +1 -1
  310. package/dist/i18n/index.js +7 -1
  311. package/dist/i18n/resolve.d.ts.map +1 -1
  312. package/dist/i18n/resolve.js +7 -18
  313. package/dist/i18n/useDirection.d.ts +2 -0
  314. package/dist/i18n/useDirection.d.ts.map +1 -0
  315. package/dist/i18n/useDirection.js +27 -0
  316. package/dist/theme/Theme.d.ts.map +1 -1
  317. package/dist/theme/Theme.js +2 -7
  318. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  319. package/dist/theme/derivedVarRegistry.js +13 -0
  320. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  321. package/dist/theme/generateThemeRules.js +51 -0
  322. package/dist/theme/hct.d.ts +0 -1
  323. package/dist/theme/hct.d.ts.map +1 -1
  324. package/dist/theme/hct.js +1 -1
  325. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  326. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  327. package/dist/utils/devWarning.d.ts +42 -0
  328. package/dist/utils/devWarning.d.ts.map +1 -0
  329. package/dist/utils/devWarning.js +88 -0
  330. package/dist/utils/index.d.ts +3 -1
  331. package/dist/utils/index.d.ts.map +1 -1
  332. package/dist/utils/index.js +3 -2
  333. package/dist/utils/plainDate.d.ts +30 -0
  334. package/dist/utils/plainDate.d.ts.map +1 -1
  335. package/dist/utils/plainDate.js +53 -0
  336. package/dist/utils/types.d.ts +13 -0
  337. package/dist/utils/types.d.ts.map +1 -1
  338. package/locales/en.json +32 -0
  339. package/locales/fr-FR.json +14 -0
  340. package/locales/pseudo.json +24 -0
  341. package/package.json +1 -1
  342. package/src/AppShell/AppShell.tsx +6 -0
  343. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  344. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  345. package/src/Avatar/Avatar.doc.mjs +60 -3
  346. package/src/Avatar/Avatar.test.tsx +281 -1
  347. package/src/Avatar/Avatar.tsx +324 -64
  348. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  349. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  350. package/src/Avatar/AvatarStatusDot.tsx +178 -21
  351. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  352. package/src/AvatarGroup/AvatarGroup.test.tsx +125 -0
  353. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  354. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  355. package/src/Banner/Banner.doc.mjs +9 -0
  356. package/src/Banner/Banner.test.tsx +30 -0
  357. package/src/Banner/Banner.tsx +53 -9
  358. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  359. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  360. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  361. package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
  362. package/src/Breadcrumbs/index.ts +27 -0
  363. package/src/Button/Button.doc.mjs +9 -0
  364. package/src/Button/Button.test.tsx +49 -0
  365. package/src/Button/Button.tsx +27 -3
  366. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  367. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  368. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  369. package/src/Calendar/Calendar.doc.mjs +12 -1
  370. package/src/Calendar/Calendar.test.tsx +193 -0
  371. package/src/Calendar/Calendar.tsx +38 -16
  372. package/src/Calendar/dayCellUtils.test.ts +5 -0
  373. package/src/Calendar/dayCellUtils.ts +1 -1
  374. package/src/Card/Card.doc.mjs +9 -0
  375. package/src/Card/Card.test.tsx +21 -3
  376. package/src/Card/Card.tsx +35 -2
  377. package/src/Carousel/Carousel.doc.mjs +1 -0
  378. package/src/Carousel/Carousel.test.tsx +53 -0
  379. package/src/Carousel/Carousel.tsx +34 -4
  380. package/src/Chat/ChatComposer.doc.mjs +12 -3
  381. package/src/Chat/ChatComposer.test.tsx +115 -0
  382. package/src/Chat/ChatComposer.tsx +73 -9
  383. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  384. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  385. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  386. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  387. package/src/Chat/ChatComposerInput.tsx +51 -5
  388. package/src/Chat/ChatContext.tsx +37 -10
  389. package/src/Chat/ChatDictationButton.tsx +4 -1
  390. package/src/Chat/ChatLayout.tsx +7 -5
  391. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  392. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  393. package/src/Chat/ChatSendButton.tsx +11 -1
  394. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  395. package/src/Chat/ChatToolCalls.tsx +25 -4
  396. package/src/Chat/index.ts +5 -1
  397. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  398. package/src/Chat/useChatStreamScroll.ts +27 -10
  399. package/src/Chat/useSpeechRecognition.ts +1 -1
  400. package/src/Chat/useTriggerMenu.tsx +4 -2
  401. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  402. package/src/CheckboxInput/CheckboxInput.tsx +1 -1
  403. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  404. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  405. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  406. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  407. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  408. package/src/ClickableCard/ClickableCard.tsx +13 -3
  409. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  410. package/src/CodeBlock/CodeBlock.tsx +10 -2
  411. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  412. package/src/CommandPalette/CommandPalette.tsx +3 -1
  413. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  414. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  415. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  416. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  417. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  418. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  419. package/src/ContextMenu/ContextMenu.test.tsx +193 -0
  420. package/src/DateInput/DateInput.doc.mjs +31 -0
  421. package/src/DateInput/DateInput.test.tsx +131 -0
  422. package/src/DateInput/DateInput.tsx +78 -3
  423. package/src/DateInput/index.ts +1 -0
  424. package/src/DateRangeInput/DateRangeInput.doc.mjs +8 -0
  425. package/src/DateRangeInput/DateRangeInput.test.tsx +23 -0
  426. package/src/DateRangeInput/DateRangeInput.tsx +13 -3
  427. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -1
  428. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  429. package/src/DateTimeInput/DateTimeInput.tsx +42 -18
  430. package/src/Dialog/Dialog.doc.mjs +2 -2
  431. package/src/Dialog/Dialog.test.tsx +77 -4
  432. package/src/Dialog/Dialog.tsx +89 -5
  433. package/src/Dialog/DialogContext.ts +9 -2
  434. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  435. package/src/Dialog/DialogHeader.tsx +9 -2
  436. package/src/Divider/Divider.tsx +2 -2
  437. package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
  438. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
  439. package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
  440. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  441. package/src/Field/Field.test.tsx +57 -12
  442. package/src/Field/Field.tsx +6 -5
  443. package/src/Field/FieldLabel.tsx +9 -1
  444. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  445. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  446. package/src/FieldStatus/FieldStatus.tsx +63 -5
  447. package/src/FileInput/FileInput.doc.mjs +17 -2
  448. package/src/FileInput/FileInput.test.tsx +135 -12
  449. package/src/FileInput/FileInput.tsx +53 -28
  450. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  451. package/src/HoverCard/HoverCard.test.tsx +21 -2
  452. package/src/HoverCard/HoverCard.tsx +11 -0
  453. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  454. package/src/HoverCard/useHoverCard.tsx +24 -2
  455. package/src/Icon/Icon.doc.mjs +3 -2
  456. package/src/Icon/Icon.tsx +7 -2
  457. package/src/IconButton/IconButton.doc.mjs +8 -0
  458. package/src/IconButton/IconButton.test.tsx +15 -18
  459. package/src/Item/Item.test.tsx +40 -18
  460. package/src/Item/Item.tsx +38 -2
  461. package/src/Layer/useLayer.tsx +8 -0
  462. package/src/Lightbox/Lightbox.tsx +4 -4
  463. package/src/List/List.test.tsx +9 -8
  464. package/src/MobileNav/MobileNav.tsx +12 -1
  465. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  466. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  467. package/src/MultiSelector/MultiSelector.doc.mjs +13 -2
  468. package/src/MultiSelector/MultiSelector.test.tsx +195 -3
  469. package/src/MultiSelector/MultiSelector.tsx +65 -12
  470. package/src/MultiSelector/hooks.ts +17 -0
  471. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  472. package/src/NumberInput/NumberInput.doc.mjs +15 -0
  473. package/src/NumberInput/NumberInput.test.tsx +82 -7
  474. package/src/NumberInput/NumberInput.tsx +21 -4
  475. package/src/Outline/Outline.tsx +0 -1
  476. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  477. package/src/OverflowList/OverflowList.test.tsx +111 -0
  478. package/src/OverflowList/OverflowList.tsx +48 -8
  479. package/src/Pagination/Pagination.tsx +11 -3
  480. package/src/Popover/Popover.tsx +7 -4
  481. package/src/Popover/usePopover.tsx +9 -13
  482. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  483. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  484. package/src/PowerSearch/PowerSearch.tsx +10 -1
  485. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  486. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  487. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  488. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  489. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  490. package/src/SelectableCard/SelectableCard.tsx +29 -16
  491. package/src/Selector/Selector.doc.mjs +7 -0
  492. package/src/Selector/Selector.test.tsx +92 -0
  493. package/src/Selector/Selector.tsx +16 -2
  494. package/src/Selector/hooks.ts +17 -0
  495. package/src/SideNav/SideNav.test.tsx +119 -3
  496. package/src/SideNav/SideNavCollapseButton.tsx +6 -1
  497. package/src/SideNav/SideNavHeading.tsx +24 -8
  498. package/src/SideNav/SideNavItem.tsx +5 -1
  499. package/src/Slider/Slider.test.tsx +75 -2
  500. package/src/Slider/Slider.tsx +21 -5
  501. package/src/Switch/Switch.test.tsx +32 -1
  502. package/src/TabList/Tab.tsx +2 -2
  503. package/src/TabList/TabMenu.tsx +2 -2
  504. package/src/Table/BaseTable.tsx +3 -5
  505. package/src/Table/TableCell.tsx +3 -3
  506. package/src/Table/TableHeaderCell.tsx +3 -3
  507. package/src/Table/index.ts +5 -0
  508. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
  509. package/src/Table/plugins/rowStatus/index.ts +7 -0
  510. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  511. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  512. package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
  513. package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
  514. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  515. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  516. package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
  517. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  518. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  519. package/src/Table/useBaseTablePlugins.ts +10 -6
  520. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  521. package/src/Table/useTableSelection.doc.mjs +65 -14
  522. package/src/Table/useTableTreeData.doc.mjs +29 -0
  523. package/src/Table/useTableTreeState.doc.mjs +2 -2
  524. package/src/TextArea/TextArea.doc.mjs +15 -0
  525. package/src/TextArea/TextArea.test.tsx +32 -1
  526. package/src/TextArea/TextArea.tsx +10 -0
  527. package/src/TextInput/TextInput.doc.mjs +15 -0
  528. package/src/TextInput/TextInput.test.tsx +44 -0
  529. package/src/TextInput/TextInput.tsx +13 -1
  530. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  531. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  532. package/src/Thumbnail/Thumbnail.tsx +142 -42
  533. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  534. package/src/TimeInput/TimeInput.doc.mjs +15 -0
  535. package/src/TimeInput/TimeInput.test.tsx +99 -1
  536. package/src/TimeInput/TimeInput.tsx +29 -6
  537. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  538. package/src/Timestamp/Timestamp.test.tsx +32 -0
  539. package/src/Timestamp/Timestamp.tsx +28 -8
  540. package/src/Toast/useToast.tsx +7 -8
  541. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  542. package/src/Tokenizer/Tokenizer.doc.mjs +30 -1
  543. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  544. package/src/Tokenizer/Tokenizer.tsx +26 -4
  545. package/src/TopNav/TopNav.test.tsx +125 -1
  546. package/src/TopNav/TopNavHeading.tsx +24 -8
  547. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  548. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  549. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  550. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  551. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  552. package/src/TopNav/TopNavMenu.tsx +83 -5
  553. package/src/TreeList/TreeList.doc.mjs +22 -0
  554. package/src/TreeList/TreeList.test.tsx +232 -0
  555. package/src/TreeList/TreeList.tsx +18 -2
  556. package/src/TreeList/TreeListBranches.tsx +16 -2
  557. package/src/TreeList/TreeListItem.tsx +52 -12
  558. package/src/TreeList/TreeListTypes.ts +27 -1
  559. package/src/TreeList/index.ts +2 -2
  560. package/src/Typeahead/BaseTypeahead.tsx +1 -1
  561. package/src/Typeahead/Typeahead.doc.mjs +7 -0
  562. package/src/Typeahead/Typeahead.test.tsx +23 -0
  563. package/src/Typeahead/Typeahead.tsx +10 -0
  564. package/src/authoring/doc.ts +1 -3
  565. package/src/docs-types.ts +5 -0
  566. package/src/hooks/computeOverflow.test.ts +422 -0
  567. package/src/hooks/computeOverflow.ts +290 -0
  568. package/src/hooks/index.ts +2 -0
  569. package/src/hooks/isRtlElement.ts +27 -0
  570. package/src/hooks/useDevWarning.test.tsx +45 -0
  571. package/src/hooks/useDevWarning.ts +54 -0
  572. package/src/hooks/useGridFocus.doc.mjs +3 -3
  573. package/src/hooks/useGridFocus.test.tsx +41 -0
  574. package/src/hooks/useGridFocus.ts +21 -10
  575. package/src/hooks/useListFocus.doc.mjs +3 -3
  576. package/src/hooks/useListFocus.test.tsx +67 -1
  577. package/src/hooks/useListFocus.ts +21 -5
  578. package/src/hooks/useOverflow.test.ts +96 -4
  579. package/src/hooks/useOverflow.ts +74 -33
  580. package/src/i18n/InternationalizationContext.ts +4 -0
  581. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  582. package/src/i18n/InternationalizationProvider.tsx +12 -2
  583. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  584. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  585. package/src/i18n/getLocaleDirection.ts +29 -0
  586. package/src/i18n/index.ts +6 -0
  587. package/src/i18n/resolve.ts +9 -21
  588. package/src/i18n/useDirection.ts +29 -0
  589. package/src/reset.css +0 -26
  590. package/src/reset.test.ts +60 -0
  591. package/src/theme/Theme.tsx +11 -14
  592. package/src/theme/derivedVarRegistry.test.ts +1 -0
  593. package/src/theme/derivedVarRegistry.ts +6 -0
  594. package/src/theme/generateThemeRules.test.ts +107 -0
  595. package/src/theme/generateThemeRules.ts +56 -0
  596. package/src/theme/hct.ts +1 -1
  597. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  598. package/src/utils/devWarning.test.ts +56 -0
  599. package/src/utils/devWarning.ts +102 -0
  600. package/src/utils/index.ts +6 -0
  601. package/src/utils/plainDate.test.ts +22 -0
  602. package/src/utils/plainDate.ts +61 -0
  603. package/src/utils/types.ts +14 -0
@@ -9,8 +9,9 @@
9
9
  * @position Core implementation; consumed by index.ts
10
10
  *
11
11
  * Renders a horizontal list of items, hiding those that don't fit in the
12
- * available width and optionally showing an overflow indicator.
13
- * Uses a hidden measurement container to avoid flickering.
12
+ * available width and optionally showing an overflow indicator. Supports an
13
+ * optional item cap (`maxVisibleItems`) and bounded multi-row wrapping
14
+ * (`maxRows`). Uses a hidden measurement container to avoid flickering.
14
15
  *
15
16
  * SYNC: When modified, update these files to stay in sync:
16
17
  * - /packages/core/src/OverflowList/index.ts (exports if types change)
@@ -34,6 +35,14 @@ const styles = stylex.create({
34
35
  whiteSpace: 'nowrap',
35
36
  minWidth: 0,
36
37
  },
38
+ containerMultiRow: {
39
+ display: 'flex',
40
+ flexWrap: 'wrap',
41
+ alignContent: 'flex-start',
42
+ overflow: 'hidden',
43
+ whiteSpace: 'normal',
44
+ minWidth: 0,
45
+ },
37
46
  fillParent: {
38
47
  width: '100%',
39
48
  },
@@ -52,6 +61,12 @@ const styles = stylex.create({
52
61
  },
53
62
  });
54
63
 
64
+ const multiRowHeight = stylex.create({
65
+ height: (maxRows: number, rowHeight: number, gapPx: number) => ({
66
+ maxHeight: `calc(${rowHeight}px * ${maxRows} + ${gapPx}px * ${maxRows - 1})`,
67
+ }),
68
+ });
69
+
55
70
  const gapStyles = stylex.create({
56
71
  0: {gap: spacingVars['--spacing-0']},
57
72
  0.5: {gap: spacingVars['--spacing-0-5']},
@@ -112,6 +127,24 @@ export interface OverflowListProps extends BaseProps<HTMLDivElement> {
112
127
  */
113
128
  minVisibleItems?: number;
114
129
 
130
+ /**
131
+ * Maximum number of items to ever show, even when they all fit. The ceiling
132
+ * partner to `minVisibleItems`; extra items collapse into the overflow
133
+ * indicator. Leave undefined for no cap. If it is less than
134
+ * `minVisibleItems`, the floor wins (and a dev-only warning is logged).
135
+ * @default undefined
136
+ */
137
+ maxVisibleItems?: number;
138
+
139
+ /**
140
+ * Wrap items across up to this many rows before collapsing the remainder
141
+ * into the overflow indicator. Leave undefined (or set `1`) for the default
142
+ * single-line behavior. A number, not a boolean — unbounded wrapping is a
143
+ * plain flex-wrap layout, not overflow collapse. Assumes uniform row height.
144
+ * @default undefined
145
+ */
146
+ maxRows?: number;
147
+
115
148
  /**
116
149
  * Which end to collapse items from.
117
150
  * @default 'end'
@@ -180,6 +213,8 @@ export function OverflowList({
180
213
  children,
181
214
  gap = 2,
182
215
  minVisibleItems = 0,
216
+ maxVisibleItems,
217
+ maxRows,
183
218
  collapseFrom = 'end',
184
219
  behavior = 'observeSelf',
185
220
  overflowRenderer,
@@ -195,16 +230,17 @@ export function OverflowList({
195
230
  const gapPx = spacingToPx[gap];
196
231
 
197
232
  const observeParent = behavior === 'observeParent';
233
+ const isMultiRow = maxRows != null && maxRows > 1;
198
234
 
199
- const {containerRef, measureRef, visibleCount, hasOverflow} = useOverflow(
200
- itemCount,
201
- {
235
+ const {containerRef, measureRef, visibleCount, hasOverflow, rowHeight} =
236
+ useOverflow(itemCount, {
202
237
  gap: gapPx,
203
238
  minVisibleItems,
239
+ maxVisibleItems,
240
+ maxRows,
204
241
  collapseFrom,
205
242
  behavior,
206
- },
207
- );
243
+ });
208
244
 
209
245
  const allItems: OverflowItem[] = childArray.map((child, index) => ({
210
246
  child,
@@ -248,8 +284,12 @@ export function OverflowList({
248
284
  {...mergeProps(
249
285
  themeProps('overflow-list'),
250
286
  stylex.props(
251
- styles.container,
287
+ isMultiRow ? styles.containerMultiRow : styles.container,
252
288
  gapStyles[gap],
289
+ isMultiRow &&
290
+ rowHeight > 0 &&
291
+ maxRows != null &&
292
+ multiRowHeight.height(maxRows, rowHeight, gapPx),
253
293
  observeParent && hasOverflow && styles.fillParent,
254
294
  xstyle,
255
295
  ),
@@ -4,7 +4,8 @@
4
4
 
5
5
  /**
6
6
  * @file Pagination.tsx
7
- * @input Uses React, StyleX, Button, Icon, Selector, Text; page number buttons delegate to Button
7
+ * @input Uses React, StyleX, Button, Icon, Selector, Text; page number buttons delegate to Button.
8
+ * Reads i18n direction via useDirection() to flip the prev/next chevrons under RTL.
8
9
  * @output Exports Pagination component, PaginationProps, PaginationVariant, PaginationSize types
9
10
  * @position Core implementation; consumed by index.ts, tested by Pagination.test.tsx
10
11
  *
@@ -40,6 +41,7 @@ import {mergeProps} from '../utils';
40
41
  import type {BaseProps} from '../BaseProps';
41
42
  import {themeProps} from '../utils/themeProps';
42
43
  import {useTranslator} from '../i18n/useTranslator';
44
+ import {useDirection} from '../i18n/useDirection';
43
45
 
44
46
  // =============================================================================
45
47
  // Types
@@ -360,6 +362,12 @@ export function Pagination({
360
362
  const label = labelFromProps ?? t('@astryx.pagination.label');
361
363
  const previousLabel = t('@astryx.pagination.previous');
362
364
  const nextLabel = t('@astryx.pagination.next');
365
+
366
+ // Directional icons: under RTL, the "previous" control points right and the
367
+ // "next" control points left. aria-labels stay semantic (unchanged).
368
+ const direction = useDirection();
369
+ const previousIcon = direction === 'rtl' ? 'chevronRight' : 'chevronLeft';
370
+ const nextIcon = direction === 'rtl' ? 'chevronLeft' : 'chevronRight';
363
371
  const pageIndicatorsLabel = t('@astryx.pagination.pageIndicators');
364
372
  const itemsPerPageLabel = t('@astryx.pagination.itemsPerPage');
365
373
 
@@ -663,7 +671,7 @@ export function Pagination({
663
671
  label={previousLabel}
664
672
  variant="ghost"
665
673
  size={buttonSize}
666
- icon={<Icon icon="chevronLeft" size={isSm ? 'sm' : 'md'} />}
674
+ icon={<Icon icon={previousIcon} size={isSm ? 'sm' : 'md'} />}
667
675
  onClick={handlePrevious}
668
676
  isDisabled={isDisabled || !hasPrevious}
669
677
  isIconOnly
@@ -675,7 +683,7 @@ export function Pagination({
675
683
  label={nextLabel}
676
684
  variant="ghost"
677
685
  size={buttonSize}
678
- icon={<Icon icon="chevronRight" size={isSm ? 'sm' : 'md'} />}
686
+ icon={<Icon icon={nextIcon} size={isSm ? 'sm' : 'md'} />}
679
687
  onClick={handleNext}
680
688
  isDisabled={isDisabled || !hasNext}
681
689
  isIconOnly
@@ -26,6 +26,7 @@ import React, {
26
26
  import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
27
27
  import * as stylex from '@stylexjs/stylex';
28
28
  import {mergeProps} from '../utils';
29
+ import {devWarn} from '../utils/devWarning';
29
30
  import type {BaseProps} from '../BaseProps';
30
31
  import {usePopover} from './usePopover';
31
32
  import type {LayerAlignment, LayerPlacement} from '../Layer/useLayer';
@@ -410,8 +411,9 @@ export function Popover({
410
411
 
411
412
  const button = findTriggerButton(el);
412
413
  if (!button) {
413
- console.warn(
414
- 'Popover: anchorRef must reference a <button> or [role="button"] element. ' +
414
+ devWarn(
415
+ 'Popover',
416
+ 'anchorRef must reference a <button> or [role="button"] element. ' +
415
417
  'The popover trigger implements the button + dialog ARIA pattern.',
416
418
  );
417
419
  }
@@ -453,8 +455,9 @@ export function Popover({
453
455
  // Find the button inside the wrapper
454
456
  const button = findTriggerButton(wrapper);
455
457
  if (!button) {
456
- console.warn(
457
- 'Popover: children must contain a <button> or [role="button"] element. ' +
458
+ devWarn(
459
+ 'Popover',
460
+ 'children must contain a <button> or [role="button"] element. ' +
458
461
  'The popover trigger implements the button + dialog ARIA pattern.',
459
462
  );
460
463
  }
@@ -28,6 +28,7 @@ import {
28
28
  } from '../theme/tokens.stylex';
29
29
  import {Button} from '../Button';
30
30
  import {useTranslator} from '../i18n';
31
+ import {useDevWarning} from '../hooks/useDevWarning';
31
32
 
32
33
  const styles = stylex.create({
33
34
  // Default popover surface — background, radius, shadow.
@@ -391,19 +392,14 @@ export function usePopover(options: UsePopoverOptions = {}): UsePopoverReturn {
391
392
  'aria-controls': layer.id,
392
393
  };
393
394
 
394
- // Dev-time guardrail: a dialog popover should always be labeled. Warn once
395
- // per hook instance (in an effect) rather than on every render.
396
- const warnedUnnamedDialogRef = useRef(false);
397
- useEffect(() => {
398
- if (role === 'dialog' && !dialogLabel && !warnedUnnamedDialogRef.current) {
399
- warnedUnnamedDialogRef.current = true;
400
- console.warn(
401
- 'usePopover: role="dialog" without a `dialogLabel` renders an unnamed ' +
402
- 'dialog. Pass `dialogLabel`, or use `role: "none"` for listbox/menu ' +
403
- 'popups whose content already carries its own role.',
404
- );
405
- }
406
- }, [role, dialogLabel]);
395
+ // Dev-time guardrail: a dialog popover should always be labeled.
396
+ useDevWarning(
397
+ 'usePopover',
398
+ 'role="dialog" without a `dialogLabel` renders an unnamed ' +
399
+ 'dialog. Pass `dialogLabel`, or use `role: "none"` for listbox/menu ' +
400
+ 'popups whose content already carries its own role.',
401
+ role === 'dialog' && !dialogLabel,
402
+ );
407
403
 
408
404
  // Wrapped render function that includes surface styles and optional hidden close button
409
405
  const render = useCallback(
@@ -83,6 +83,20 @@ export const docs = {
83
83
  description:
84
84
  'Validation status object with type and optional message.',
85
85
  },
86
+ {
87
+ name: 'startIcon',
88
+ type: 'ReactNode | IconType',
89
+ description:
90
+ 'Icon to display at the start of the input, before any filter tokens. Forwarded to the internal Tokenizer. Accepts a semantic icon name, an SVG icon component, or a ReactNode directly.',
91
+ slotElements: [{__element: 'Icon', props: {icon: 'search', size: 'sm'}}],
92
+ },
93
+ {
94
+ name: 'statusVariant',
95
+ type: "'attached' | 'detached'",
96
+ description:
97
+ 'How the status message is placed relative to the input. attached overlaps directly below the input (bordered treatment); detached floats below as a separate element with spacing.',
98
+ default: "'attached'",
99
+ },
86
100
  {
87
101
  name: 'maxTokenLength',
88
102
  type: 'number',
@@ -235,6 +249,19 @@ export const docsZh = {
235
249
  type: "{type: 'warning' | 'error' | 'success', message?: string}",
236
250
  description: '带有类型和可选消息的验证状态对象。',
237
251
  },
252
+ {
253
+ name: 'startIcon',
254
+ type: 'ReactNode | IconType',
255
+ description:
256
+ '在输入框开头(筛选 token 之前)显示的图标,转发给内部的 Tokenizer。接受语义图标名称、SVG 图标组件或直接传入 ReactNode。',
257
+ },
258
+ {
259
+ name: 'statusVariant',
260
+ type: "'attached' | 'detached'",
261
+ description:
262
+ '状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
263
+ default: "'attached'",
264
+ },
238
265
  {
239
266
  name: 'maxTokenLength',
240
267
  type: 'number',
@@ -318,6 +345,8 @@ export const docsDense = {
318
345
  isReadOnly: 'Prevent adding, editing, or removing filters.',
319
346
  isDisabled: 'Disables entire component.',
320
347
  status: 'Validation status object w/ type + optional message.',
348
+ startIcon: 'Icon at input start, before filter tokens. Forwarded to internal Tokenizer.',
349
+ statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
321
350
  maxTokenLength: 'Max char length for filter value display in tokens.',
322
351
  popoverSaveButtonLabel: 'Label for save button in edit popover.',
323
352
  timezoneID: 'Timezone ID for date formatting (e.g. "America/New_York").',
@@ -16,6 +16,7 @@ import userEvent from '@testing-library/user-event';
16
16
  import {PowerSearch} from './PowerSearch';
17
17
  import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
18
18
  import type {PowerSearchConfig, PowerSearchFilter} from './types';
19
+ import {TestIcon} from '../__tests__/TestIcon';
19
20
 
20
21
  // =============================================================================
21
22
  // Test infrastructure
@@ -157,6 +158,25 @@ describe('PowerSearch', () => {
157
158
  expect(screen.getByRole('combobox')).toHaveFocus();
158
159
  });
159
160
 
161
+ describe('startIcon', () => {
162
+ it('does not render a start icon when omitted', () => {
163
+ render(<PowerSearch config={config} filters={[]} onChange={() => {}} />);
164
+ expect(document.querySelector('svg')).not.toBeInTheDocument();
165
+ });
166
+
167
+ it('forwards startIcon to the internal Tokenizer', () => {
168
+ render(
169
+ <PowerSearch
170
+ config={config}
171
+ filters={[]}
172
+ onChange={() => {}}
173
+ startIcon={<TestIcon data-testid="start-icon" />}
174
+ />,
175
+ );
176
+ expect(screen.getByTestId('start-icon')).toBeInTheDocument();
177
+ });
178
+ });
179
+
160
180
  describe('paste behavior', () => {
161
181
  it('pasting a field name shows matching field suggestions', async () => {
162
182
  const user = userEvent.setup();
@@ -404,3 +424,26 @@ describe('PowerSearch', () => {
404
424
  });
405
425
  });
406
426
  });
427
+
428
+
429
+ describe('PowerSearch statusVariant forwarding', () => {
430
+ it('defaults to attached (status renders with data-variant="attached")', () => {
431
+ const {container} = render(
432
+ <PowerSearch config={config} filters={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} />,
433
+ );
434
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
435
+ 'data-variant',
436
+ 'attached',
437
+ );
438
+ });
439
+
440
+ it('forwards statusVariant="detached" to the underlying Field status', () => {
441
+ const {container} = render(
442
+ <PowerSearch config={config} filters={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} statusVariant="detached" />,
443
+ );
444
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
445
+ 'data-variant',
446
+ 'detached',
447
+ );
448
+ });
449
+ });
@@ -37,7 +37,7 @@ import {layerAnimations} from '../Layer/layerAnimations.stylex';
37
37
  import {Icon} from '../Icon';
38
38
  import type {IconType} from '../Icon';
39
39
  import type {IconName} from '../Icon/globalIconRegistry';
40
- import type {InputStatus} from '../Field';
40
+ import type {InputStatus, FieldStatusVariant} from '../Field';
41
41
  import {usePopover} from '../Popover/usePopover';
42
42
  import {useAnnounce} from '../hooks/useAnnounce';
43
43
  import {
@@ -383,6 +383,13 @@ export interface PowerSearchProps extends Omit<
383
383
  onBlur?: (e: React.FocusEvent) => void;
384
384
  /** Validation status. */
385
385
  status?: InputStatus;
386
+ /**
387
+ * How the status message is placed relative to the input.
388
+ * - 'attached': message overlaps directly below the input (bordered treatment)
389
+ * - 'detached': message floats below as a separate element with spacing
390
+ * @default 'attached'
391
+ */
392
+ statusVariant?: FieldStatusVariant;
386
393
  /** Max width for dropdown menu. */
387
394
  menuWidth?: number;
388
395
  /** Max display length for filter token values. @default 40 */
@@ -527,6 +534,7 @@ export function PowerSearch({
527
534
  onFocus,
528
535
  onBlur,
529
536
  status,
537
+ statusVariant = 'attached',
530
538
  maxTokenLength = 40,
531
539
  popoverSaveButtonLabel: popoverSaveButtonLabelFromProps,
532
540
  timezoneID,
@@ -1033,6 +1041,7 @@ export function PowerSearch({
1033
1041
  hasEntriesOnFocus
1034
1042
  debounceMs={0}
1035
1043
  status={status}
1044
+ statusVariant={statusVariant}
1036
1045
  onFocus={onFocus}
1037
1046
  onBlur={onBlur}
1038
1047
  xstyle={xstyle}
@@ -13,6 +13,8 @@ import {
13
13
  import {render, screen, fireEvent, act} from '@testing-library/react';
14
14
  import React, {useState} from 'react';
15
15
  import {PowerSearch} from './PowerSearch';
16
+ import {PowerSearchEditPopover} from './PowerSearchEditPopover';
17
+ import {useInternalConfig} from './useInternalConfig';
16
18
  import type {PowerSearchConfig, PowerSearchFilter} from './types';
17
19
 
18
20
  // =============================================================================
@@ -216,4 +218,69 @@ describe('PowerSearch', () => {
216
218
  expect(popoverText).toContain('Priority');
217
219
  expect(popoverText).toContain('equals');
218
220
  });
221
+
222
+ it('does not save/close edit popover when Enter is consumed by child listbox option selection', () => {
223
+ const multiConfig: PowerSearchConfig = {
224
+ name: 'test-multi',
225
+ fields: [
226
+ {
227
+ key: 'status',
228
+ label: 'Status',
229
+ operators: [
230
+ {
231
+ key: 'any_of',
232
+ label: 'is any of',
233
+ value: {
234
+ type: 'enum_list',
235
+ values: [
236
+ {value: 'open', label: 'Open'},
237
+ {value: 'closed', label: 'Closed'},
238
+ ],
239
+ },
240
+ },
241
+ ],
242
+ },
243
+ ],
244
+ };
245
+
246
+ const onSave = vi.fn();
247
+ const onCancel = vi.fn();
248
+
249
+ function MultiSelectHarness() {
250
+ const internalConfig = useInternalConfig(multiConfig);
251
+ return (
252
+ <PowerSearchEditPopover
253
+ config={internalConfig}
254
+ filter={{
255
+ field: 'status',
256
+ operator: 'any_of',
257
+ value: {type: 'enum_list', value: ['open']},
258
+ }}
259
+ mode="edit"
260
+ onSave={onSave}
261
+ onCancel={onCancel}
262
+ />
263
+ );
264
+ }
265
+
266
+ const {container} = render(<MultiSelectHarness />);
267
+
268
+ const input = container.querySelector('input');
269
+ expect(input).not.toBeNull();
270
+
271
+ // Fire an Enter event that has been defaultPrevented (e.g. child typeahead option selection)
272
+ const enterEvent = new KeyboardEvent('keydown', {
273
+ key: 'Enter',
274
+ bubbles: true,
275
+ cancelable: true,
276
+ });
277
+ enterEvent.preventDefault();
278
+
279
+ act(() => {
280
+ input?.dispatchEvent(enterEvent);
281
+ });
282
+
283
+ // onSave should NOT be called because the event was already consumed (defaultPrevented)
284
+ expect(onSave).not.toHaveBeenCalled();
285
+ });
219
286
  });
@@ -702,7 +702,7 @@ export function PowerSearchEditPopover({
702
702
  // Handle Enter to save, Escape to cancel
703
703
  const handleKeyDown = useCallback(
704
704
  (e: React.KeyboardEvent) => {
705
- if (e.key === 'Enter' && !isSaveDisabled) {
705
+ if (e.key === 'Enter' && !isSaveDisabled && !e.defaultPrevented) {
706
706
  e.preventDefault();
707
707
  handleSave();
708
708
  } else if (e.key === 'Escape' && !e.defaultPrevented) {
@@ -76,8 +76,7 @@ export function usePowerSearchSource(
76
76
 
77
77
  // Check each field+operator combo against the query
78
78
  for (const op of field.operators) {
79
- const combinedLabel =
80
- `${field.label} ${opLabel(op)}`.toLowerCase();
79
+ const combinedLabel = `${field.label} ${opLabel(op)}`.toLowerCase();
81
80
  if (combinedLabel.includes(lower)) {
82
81
  const id = `${field.key}:${op.key}`;
83
82
  if (!seen.has(id)) {
@@ -27,6 +27,7 @@ export const docs = {
27
27
  {name: 'children', type: 'ReactNode', description: 'Card content.'},
28
28
  {name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inner padding.', default: '4'},
29
29
  {name: 'variant', type: "'default' | 'transparent' | 'muted' | 'blue' | 'cyan' | 'gray' | 'green' | 'orange' | 'pink' | 'purple' | 'red' | 'teal' | 'yellow'", description: 'Background color variant.', default: "'default'"},
30
+ {name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: 'Resting shadow depth. The selection ring composes on top, so a selected card keeps its shadow.', default: "'none'"},
30
31
  {name: 'width', type: 'SizeValue', description: 'Card width.'},
31
32
  {name: 'height', type: 'SizeValue', description: 'Card height.'},
32
33
  {name: 'maxWidth', type: 'SizeValue', description: 'Maximum card width.'},
@@ -71,6 +72,7 @@ export const docsDense = {
71
72
  isDisabled: 'disables card',
72
73
  padding: 'inner padding',
73
74
  variant: 'background color variant',
75
+ elevation: 'resting shadow depth: none|low|med|high; selection ring composes on top',
74
76
  width: 'card width',
75
77
  height: 'card height',
76
78
  maxWidth: 'max card width',
@@ -85,8 +85,7 @@ describe('SelectableCard', () => {
85
85
  label="Disabled"
86
86
  isSelected={false}
87
87
  onChange={handleChange}
88
- isDisabled
89
- >
88
+ isDisabled>
90
89
  Content
91
90
  </SelectableCard>,
92
91
  );
@@ -101,12 +100,55 @@ describe('SelectableCard', () => {
101
100
  label="Disabled"
102
101
  isSelected={false}
103
102
  onChange={handleChange}
104
- isDisabled
105
- >
103
+ isDisabled>
106
104
  <span>Content</span>
107
105
  </SelectableCard>,
108
106
  );
109
107
  fireEvent.click(screen.getByText('Content'));
110
108
  expect(handleChange).not.toHaveBeenCalled();
111
109
  });
110
+
111
+ describe('elevation', () => {
112
+ const noop = () => {};
113
+
114
+ it('forwards a distinct elevation class to the card for each level', () => {
115
+ const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
116
+ const {container} = render(
117
+ <SelectableCard
118
+ label="Card"
119
+ isSelected={false}
120
+ onChange={noop}
121
+ elevation={elevation}>
122
+ Content
123
+ </SelectableCard>,
124
+ );
125
+ return container.firstElementChild!.className;
126
+ };
127
+ const classes = new Set([
128
+ classFor('none'),
129
+ classFor('low'),
130
+ classFor('med'),
131
+ classFor('high'),
132
+ ]);
133
+ expect(classes.size).toBe(4);
134
+ });
135
+
136
+ it('still varies elevation while selected (ring composes with elevation)', () => {
137
+ const selectedClassFor = (elevation: 'none' | 'med') => {
138
+ const {container} = render(
139
+ <SelectableCard
140
+ label="Card"
141
+ isSelected
142
+ onChange={noop}
143
+ elevation={elevation}>
144
+ Content
145
+ </SelectableCard>,
146
+ );
147
+ return container.firstElementChild!.className;
148
+ };
149
+ // A selected card at 'med' must differ from a selected card at 'none' —
150
+ // proving the selection ring does not clobber the elevation shadow.
151
+ expect(selectedClassFor('med')).not.toBe(selectedClassFor('none'));
152
+ });
153
+ });
112
154
  });