@astryxdesign/core 0.1.9 → 0.2.0-canary.136a00f

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 (560) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/dist/Avatar/Avatar.d.ts +42 -3
  3. package/dist/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/Avatar/Avatar.js +190 -59
  5. package/dist/Avatar/AvatarStatusDot.d.ts +6 -4
  6. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  7. package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
  8. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  9. package/dist/AvatarGroup/AvatarGroup.js +58 -6
  10. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
  11. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  12. package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -2
  13. package/dist/Banner/Banner.js +2 -2
  14. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  15. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -4
  16. package/dist/Breadcrumbs/index.d.ts +1 -0
  17. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  18. package/dist/Breadcrumbs/index.js +2 -1
  19. package/dist/Button/Button.d.ts +1 -1
  20. package/dist/Button/Button.d.ts.map +1 -1
  21. package/dist/Button/Button.js +6 -4
  22. package/dist/Calendar/Calendar.d.ts.map +1 -1
  23. package/dist/Calendar/Calendar.js +50 -9
  24. package/dist/Calendar/dayCellUtils.d.ts +4 -4
  25. package/dist/Calendar/dayCellUtils.js +2 -2
  26. package/dist/Calendar/styles.d.ts +30 -31
  27. package/dist/Calendar/styles.d.ts.map +1 -1
  28. package/dist/Calendar/styles.js +30 -31
  29. package/dist/Card/Card.js +1 -1
  30. package/dist/Carousel/Carousel.d.ts.map +1 -1
  31. package/dist/Carousel/Carousel.js +22 -12
  32. package/dist/Chat/ChatComposerInput.js +1 -1
  33. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  34. package/dist/Chat/ChatDictationButton.js +3 -1
  35. package/dist/Chat/ChatLayout.js +4 -4
  36. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  37. package/dist/Chat/ChatMessageBubble.js +8 -8
  38. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  39. package/dist/Chat/ChatToolCalls.js +10 -3
  40. package/dist/Chat/useTriggerMenu.js +2 -2
  41. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.js +6 -6
  43. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  44. package/dist/CheckboxList/CheckboxListItem.js +19 -4
  45. package/dist/Citation/Citation.d.ts +22 -1
  46. package/dist/Citation/Citation.d.ts.map +1 -1
  47. package/dist/Citation/Citation.js +20 -6
  48. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  49. package/dist/CodeBlock/CodeBlock.js +16 -10
  50. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  51. package/dist/Collapsible/Collapsible.js +3 -1
  52. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  53. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  54. package/dist/CommandPalette/CommandPalette.js +42 -3
  55. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  56. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  57. package/dist/ContextMenu/ContextMenu.js +23 -5
  58. package/dist/ContextMenu/index.d.ts +1 -0
  59. package/dist/ContextMenu/index.d.ts.map +1 -1
  60. package/dist/ContextMenu/index.js +3 -1
  61. package/dist/DateInput/DateInput.d.ts +10 -2
  62. package/dist/DateInput/DateInput.d.ts.map +1 -1
  63. package/dist/DateInput/DateInput.js +33 -19
  64. package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
  65. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  66. package/dist/DateRangeInput/DateRangeInput.js +23 -20
  67. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  68. package/dist/DateTimeInput/DateTimeInput.js +23 -18
  69. package/dist/Divider/Divider.d.ts +2 -2
  70. package/dist/Divider/Divider.d.ts.map +1 -1
  71. package/dist/Divider/Divider.js +13 -0
  72. package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
  73. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  74. package/dist/DropdownMenu/DropdownMenu.js +22 -5
  75. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  76. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +4 -1
  77. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  78. package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
  79. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +8 -11
  80. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  81. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +3 -1
  82. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +1 -1
  83. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  84. package/dist/DropdownMenu/DropdownMenuRadioItem.js +5 -2
  85. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
  86. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
  87. package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
  88. package/dist/DropdownMenu/index.d.ts +10 -0
  89. package/dist/DropdownMenu/index.d.ts.map +1 -1
  90. package/dist/DropdownMenu/index.js +13 -0
  91. package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
  92. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
  93. package/dist/DropdownMenu/menuItemHover.js +33 -0
  94. package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
  95. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
  96. package/dist/DropdownMenu/menuItemRoles.js +10 -1
  97. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  98. package/dist/DropdownMenu/renderDropdownItems.js +21 -6
  99. package/dist/Field/Field.d.ts +3 -1
  100. package/dist/Field/Field.d.ts.map +1 -1
  101. package/dist/Field/Field.js +4 -1
  102. package/dist/Field/FieldLabel.d.ts +2 -1
  103. package/dist/Field/FieldLabel.d.ts.map +1 -1
  104. package/dist/Field/FieldLabel.js +9 -5
  105. package/dist/Field/inputStyles.stylex.d.ts +1 -0
  106. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  107. package/dist/Field/inputStyles.stylex.js +1 -0
  108. package/dist/FieldStatus/FieldStatus.d.ts +10 -0
  109. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  110. package/dist/FieldStatus/FieldStatus.js +39 -3
  111. package/dist/FileInput/FileInput.d.ts +10 -2
  112. package/dist/FileInput/FileInput.d.ts.map +1 -1
  113. package/dist/FileInput/FileInput.js +93 -65
  114. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  115. package/dist/HoverCard/useHoverCard.js +10 -4
  116. package/dist/Icon/Icon.d.ts +15 -1
  117. package/dist/Icon/Icon.d.ts.map +1 -1
  118. package/dist/Icon/Icon.js +19 -3
  119. package/dist/Item/Item.d.ts +16 -3
  120. package/dist/Item/Item.d.ts.map +1 -1
  121. package/dist/Item/Item.js +31 -6
  122. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  123. package/dist/Layer/layerAnimations.stylex.js +10 -2
  124. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  125. package/dist/Lightbox/Lightbox.js +19 -13
  126. package/dist/List/List.d.ts.map +1 -1
  127. package/dist/List/List.js +6 -3
  128. package/dist/List/ListItem.d.ts +11 -1
  129. package/dist/List/ListItem.d.ts.map +1 -1
  130. package/dist/List/ListItem.js +2 -0
  131. package/dist/Markdown/Markdown.d.ts.map +1 -1
  132. package/dist/Markdown/Markdown.js +7 -0
  133. package/dist/MetadataList/MetadataList.d.ts +1 -1
  134. package/dist/MetadataList/MetadataList.d.ts.map +1 -1
  135. package/dist/MetadataList/MetadataList.js +4 -2
  136. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  137. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  138. package/dist/MultiSelector/MultiSelector.js +80 -42
  139. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  140. package/dist/NumberInput/NumberInput.d.ts +10 -2
  141. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  142. package/dist/NumberInput/NumberInput.js +22 -17
  143. package/dist/Outline/Outline.js +2 -2
  144. package/dist/Pagination/Pagination.d.ts.map +1 -1
  145. package/dist/Pagination/Pagination.js +11 -3
  146. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  147. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  148. package/dist/PowerSearch/PowerSearch.js +2 -0
  149. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  150. package/dist/ProgressBar/ProgressBar.js +6 -1
  151. package/dist/RadioList/RadioList.d.ts +2 -2
  152. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  153. package/dist/RadioList/RadioListItem.js +5 -5
  154. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  155. package/dist/Resizable/ResizeHandle.js +49 -19
  156. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  157. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  158. package/dist/SegmentedControl/SegmentedControlItem.js +5 -3
  159. package/dist/Selector/Selector.d.ts +8 -0
  160. package/dist/Selector/Selector.d.ts.map +1 -1
  161. package/dist/Selector/Selector.js +66 -17
  162. package/dist/SideNav/SideNav.d.ts.map +1 -1
  163. package/dist/SideNav/SideNav.js +5 -5
  164. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  165. package/dist/SideNav/SideNavCollapseButton.js +13 -10
  166. package/dist/SideNav/SideNavItem.d.ts +1 -1
  167. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  168. package/dist/SideNav/SideNavItem.js +12 -10
  169. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  170. package/dist/Skeleton/Skeleton.js +2 -2
  171. package/dist/Slider/Slider.d.ts.map +1 -1
  172. package/dist/Slider/Slider.js +87 -34
  173. package/dist/Spinner/Spinner.d.ts +3 -2
  174. package/dist/Spinner/Spinner.d.ts.map +1 -1
  175. package/dist/Spinner/Spinner.js +11 -2
  176. package/dist/Switch/Switch.d.ts +8 -1
  177. package/dist/Switch/Switch.d.ts.map +1 -1
  178. package/dist/Switch/Switch.js +171 -91
  179. package/dist/TabList/Tab.js +2 -2
  180. package/dist/TabList/TabList.d.ts +2 -11
  181. package/dist/TabList/TabList.d.ts.map +1 -1
  182. package/dist/TabList/TabList.js +5 -9
  183. package/dist/TabList/TabListContext.d.ts +0 -5
  184. package/dist/TabList/TabListContext.d.ts.map +1 -1
  185. package/dist/TabList/TabListContext.js +0 -5
  186. package/dist/TabList/TabMenu.js +1 -1
  187. package/dist/Table/BaseTable.d.ts.map +1 -1
  188. package/dist/Table/BaseTable.js +30 -4
  189. package/dist/Table/TableCell.js +3 -3
  190. package/dist/Table/TableHeaderCell.js +3 -3
  191. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  192. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
  193. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  194. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +37 -27
  195. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  196. package/dist/Table/plugins/selection/useTableSelection.js +3 -0
  197. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  198. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +15 -7
  199. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  200. package/dist/Table/plugins/tree/useTableTreeData.js +29 -23
  201. package/dist/Table/types.d.ts +32 -0
  202. package/dist/Table/types.d.ts.map +1 -1
  203. package/dist/TextArea/TextArea.d.ts +10 -1
  204. package/dist/TextArea/TextArea.d.ts.map +1 -1
  205. package/dist/TextArea/TextArea.js +18 -19
  206. package/dist/TextInput/TextInput.d.ts +10 -2
  207. package/dist/TextInput/TextInput.d.ts.map +1 -1
  208. package/dist/TextInput/TextInput.js +20 -17
  209. package/dist/Thumbnail/Thumbnail.js +2 -2
  210. package/dist/TimeInput/TimeInput.d.ts +10 -2
  211. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  212. package/dist/TimeInput/TimeInput.js +17 -17
  213. package/dist/Timestamp/Timestamp.d.ts +31 -3
  214. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  215. package/dist/Timestamp/Timestamp.js +47 -76
  216. package/dist/Timestamp/formatInstant.d.ts +41 -0
  217. package/dist/Timestamp/formatInstant.d.ts.map +1 -0
  218. package/dist/Timestamp/formatInstant.js +177 -0
  219. package/dist/Timestamp/index.d.ts +1 -0
  220. package/dist/Timestamp/index.d.ts.map +1 -1
  221. package/dist/Timestamp/tooltipEntries.d.ts +56 -0
  222. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -0
  223. package/dist/Timestamp/tooltipEntries.js +163 -0
  224. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  225. package/dist/Toast/ToastViewport.js +61 -9
  226. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  227. package/dist/ToggleButton/ToggleButton.js +3 -1
  228. package/dist/Token/Token.d.ts +34 -4
  229. package/dist/Token/Token.d.ts.map +1 -1
  230. package/dist/Token/Token.js +85 -45
  231. package/dist/Token/TokenLink.d.ts +62 -0
  232. package/dist/Token/TokenLink.d.ts.map +1 -0
  233. package/dist/Token/TokenLink.js +76 -0
  234. package/dist/Token/index.d.ts +1 -1
  235. package/dist/Token/index.d.ts.map +1 -1
  236. package/dist/Tokenizer/Tokenizer.d.ts +9 -2
  237. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  238. package/dist/Tokenizer/Tokenizer.js +4 -2
  239. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  240. package/dist/Tooltip/useTooltip.js +17 -1
  241. package/dist/TopNav/TopNavItem.d.ts +3 -1
  242. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  243. package/dist/TopNav/TopNavItem.js +30 -3
  244. package/dist/TreeList/TreeList.d.ts.map +1 -1
  245. package/dist/TreeList/TreeList.js +1 -0
  246. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  247. package/dist/TreeList/TreeListBranches.js +8 -6
  248. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  249. package/dist/TreeList/TreeListItem.js +32 -14
  250. package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
  251. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  252. package/dist/Typeahead/BaseTypeahead.js +22 -11
  253. package/dist/Typeahead/Typeahead.d.ts +9 -2
  254. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  255. package/dist/Typeahead/Typeahead.js +11 -2
  256. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  257. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  258. package/dist/Typeahead/TypeaheadItem.js +20 -10
  259. package/dist/astryx.css +70 -30
  260. package/dist/astryx.umd.js +51 -51
  261. package/dist/astryx.umd.js.map +4 -4
  262. package/dist/hooks/index.d.ts +2 -0
  263. package/dist/hooks/index.d.ts.map +1 -1
  264. package/dist/hooks/index.js +1 -0
  265. package/dist/hooks/isRtlElement.d.ts +18 -0
  266. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  267. package/dist/hooks/isRtlElement.js +27 -0
  268. package/dist/hooks/useAnnounce.d.ts +3 -0
  269. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  270. package/dist/hooks/useAnnounce.js +39 -1
  271. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  272. package/dist/hooks/useFocusTrap.js +52 -11
  273. package/dist/hooks/useGridFocus.d.ts +6 -1
  274. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  275. package/dist/hooks/useGridFocus.js +12 -9
  276. package/dist/hooks/useHotkeys.d.ts +9 -0
  277. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  278. package/dist/hooks/useHotkeys.js +9 -0
  279. package/dist/hooks/useInputStatusIcon.d.ts +38 -0
  280. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
  281. package/dist/hooks/useInputStatusIcon.js +158 -0
  282. package/dist/hooks/useKeyboardHint.d.ts +1 -1
  283. package/dist/hooks/useKeyboardHint.d.ts.map +1 -1
  284. package/dist/hooks/useKeyboardHint.js +4 -2
  285. package/dist/hooks/useListFocus.d.ts +39 -1
  286. package/dist/hooks/useListFocus.d.ts.map +1 -1
  287. package/dist/hooks/useListFocus.js +54 -9
  288. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  289. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  290. package/dist/i18n/InternationalizationContext.js +3 -0
  291. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  292. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  293. package/dist/i18n/InternationalizationProvider.js +5 -1
  294. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  295. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  296. package/dist/i18n/getLocaleDirection.js +29 -0
  297. package/dist/i18n/index.d.ts +6 -0
  298. package/dist/i18n/index.d.ts.map +1 -1
  299. package/dist/i18n/index.js +7 -1
  300. package/dist/i18n/useDirection.d.ts +2 -0
  301. package/dist/i18n/useDirection.d.ts.map +1 -0
  302. package/dist/i18n/useDirection.js +27 -0
  303. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  304. package/dist/theme/derivedVarRegistry.js +13 -0
  305. package/dist/utils/index.d.ts +1 -0
  306. package/dist/utils/index.d.ts.map +1 -1
  307. package/dist/utils/index.js +2 -1
  308. package/dist/utils/plainDate.d.ts +17 -0
  309. package/dist/utils/plainDate.d.ts.map +1 -1
  310. package/dist/utils/plainDate.js +23 -4
  311. package/dist/utils/rtlStyles.d.ts +24 -0
  312. package/dist/utils/rtlStyles.d.ts.map +1 -0
  313. package/dist/utils/rtlStyles.js +27 -0
  314. package/locales/en.json +112 -0
  315. package/locales/pseudo.json +84 -0
  316. package/package.json +6 -1
  317. package/src/Avatar/Avatar.doc.mjs +50 -3
  318. package/src/Avatar/Avatar.test.tsx +218 -0
  319. package/src/Avatar/Avatar.tsx +285 -79
  320. package/src/Avatar/AvatarStatusDot.doc.mjs +4 -4
  321. package/src/Avatar/AvatarStatusDot.tsx +6 -4
  322. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  323. package/src/AvatarGroup/AvatarGroup.test.tsx +162 -2
  324. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  325. package/src/AvatarGroup/AvatarGroupOverflow.tsx +5 -2
  326. package/src/Banner/Banner.tsx +6 -6
  327. package/src/Breadcrumbs/BreadcrumbItem.tsx +10 -10
  328. package/src/Breadcrumbs/Breadcrumbs.test.tsx +52 -1
  329. package/src/Breadcrumbs/index.ts +4 -0
  330. package/src/Button/Button.doc.mjs +0 -4
  331. package/src/Button/Button.test.tsx +16 -0
  332. package/src/Button/Button.tsx +6 -4
  333. package/src/Calendar/Calendar.test.tsx +170 -20
  334. package/src/Calendar/Calendar.tsx +73 -16
  335. package/src/Calendar/dayCellUtils.test.ts +18 -18
  336. package/src/Calendar/dayCellUtils.ts +2 -2
  337. package/src/Calendar/styles.ts +33 -39
  338. package/src/Card/Card.tsx +1 -1
  339. package/src/Carousel/Carousel.tsx +25 -6
  340. package/src/Chat/ChatComposer.doc.mjs +2 -2
  341. package/src/Chat/ChatComposerInput.doc.mjs +1 -1
  342. package/src/Chat/ChatComposerInput.tsx +2 -2
  343. package/src/Chat/ChatDictationButton.tsx +7 -1
  344. package/src/Chat/ChatLayout.tsx +4 -4
  345. package/src/Chat/ChatMessageBubble.tsx +15 -10
  346. package/src/Chat/ChatSystemMessage.test.tsx +5 -0
  347. package/src/Chat/ChatToolCalls.tsx +9 -2
  348. package/src/Chat/useTriggerMenu.tsx +1 -1
  349. package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
  350. package/src/CheckboxInput/CheckboxInput.test.tsx +23 -0
  351. package/src/CheckboxInput/CheckboxInput.tsx +21 -6
  352. package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
  353. package/src/CheckboxList/CheckboxList.test.tsx +94 -3
  354. package/src/CheckboxList/CheckboxListItem.tsx +17 -10
  355. package/src/Citation/Citation.doc.mjs +4 -3
  356. package/src/Citation/Citation.test.tsx +97 -0
  357. package/src/Citation/Citation.tsx +43 -11
  358. package/src/CodeBlock/CodeBlock.test.tsx +17 -0
  359. package/src/CodeBlock/CodeBlock.tsx +38 -11
  360. package/src/Collapsible/Collapsible.doc.mjs +1 -0
  361. package/src/Collapsible/Collapsible.test.tsx +7 -0
  362. package/src/Collapsible/Collapsible.tsx +16 -6
  363. package/src/CommandPalette/CommandPalette.test.tsx +95 -1
  364. package/src/CommandPalette/CommandPalette.tsx +41 -2
  365. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  366. package/src/ContextMenu/ContextMenu.test.tsx +59 -2
  367. package/src/ContextMenu/ContextMenu.tsx +22 -11
  368. package/src/ContextMenu/index.ts +5 -0
  369. package/src/DateInput/DateInput.doc.mjs +25 -0
  370. package/src/DateInput/DateInput.test.tsx +230 -0
  371. package/src/DateInput/DateInput.tsx +51 -29
  372. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  373. package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
  374. package/src/DateRangeInput/DateRangeInput.tsx +42 -30
  375. package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
  376. package/src/DateTimeInput/DateTimeInput.test.tsx +112 -0
  377. package/src/DateTimeInput/DateTimeInput.tsx +44 -39
  378. package/src/Divider/Divider.test.tsx +32 -8
  379. package/src/Divider/Divider.tsx +14 -1
  380. package/src/DropdownMenu/DropdownMenu.test.tsx +60 -0
  381. package/src/DropdownMenu/DropdownMenu.tsx +31 -12
  382. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +8 -2
  383. package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
  384. package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +4 -12
  385. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +9 -10
  386. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +9 -3
  387. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +20 -2
  388. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
  389. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
  390. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
  391. package/src/DropdownMenu/index.ts +16 -0
  392. package/src/DropdownMenu/menuItemHover.ts +39 -0
  393. package/src/DropdownMenu/menuItemRoles.ts +9 -0
  394. package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
  395. package/src/Field/Field.tsx +14 -9
  396. package/src/Field/FieldLabel.test.tsx +25 -0
  397. package/src/Field/FieldLabel.tsx +12 -3
  398. package/src/Field/inputStyles.stylex.ts +2 -0
  399. package/src/FieldStatus/FieldStatus.test.tsx +72 -0
  400. package/src/FieldStatus/FieldStatus.tsx +48 -2
  401. package/src/FileInput/FileInput.doc.mjs +23 -2
  402. package/src/FileInput/FileInput.test.tsx +104 -13
  403. package/src/FileInput/FileInput.tsx +106 -79
  404. package/src/HoverCard/useHoverCard.tsx +15 -3
  405. package/src/Icon/Icon.doc.mjs +13 -0
  406. package/src/Icon/Icon.test.tsx +89 -0
  407. package/src/Icon/Icon.tsx +51 -3
  408. package/src/Item/Item.doc.mjs +5 -0
  409. package/src/Item/Item.test.tsx +88 -0
  410. package/src/Item/Item.tsx +57 -11
  411. package/src/Layer/layerAnimations.stylex.ts +23 -0
  412. package/src/Lightbox/Lightbox.tsx +15 -7
  413. package/src/List/List.test.tsx +17 -29
  414. package/src/List/List.tsx +6 -1
  415. package/src/List/ListItem.doc.mjs +12 -0
  416. package/src/List/ListItem.tsx +13 -0
  417. package/src/Markdown/Markdown.test.tsx +21 -0
  418. package/src/Markdown/Markdown.tsx +4 -0
  419. package/src/MetadataList/MetadataList.test.tsx +24 -0
  420. package/src/MetadataList/MetadataList.tsx +6 -2
  421. package/src/MultiSelector/MultiSelector.doc.mjs +20 -0
  422. package/src/MultiSelector/MultiSelector.test.tsx +402 -0
  423. package/src/MultiSelector/MultiSelector.tsx +120 -59
  424. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  425. package/src/NumberInput/NumberInput.doc.mjs +21 -0
  426. package/src/NumberInput/NumberInput.test.tsx +71 -0
  427. package/src/NumberInput/NumberInput.tsx +35 -26
  428. package/src/Outline/Outline.test.tsx +12 -12
  429. package/src/Outline/Outline.tsx +2 -2
  430. package/src/Pagination/Pagination.tsx +11 -3
  431. package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
  432. package/src/PowerSearch/PowerSearch.test.tsx +23 -0
  433. package/src/PowerSearch/PowerSearch.tsx +10 -1
  434. package/src/ProgressBar/ProgressBar.test.tsx +34 -0
  435. package/src/ProgressBar/ProgressBar.tsx +16 -1
  436. package/src/RadioList/RadioList.doc.mjs +6 -0
  437. package/src/RadioList/RadioList.test.tsx +26 -4
  438. package/src/RadioList/RadioList.tsx +2 -2
  439. package/src/RadioList/RadioListItem.tsx +12 -5
  440. package/src/Resizable/ResizeHandle.test.tsx +94 -0
  441. package/src/Resizable/ResizeHandle.tsx +70 -20
  442. package/src/SegmentedControl/SegmentedControl.test.tsx +28 -0
  443. package/src/SegmentedControl/SegmentedControlItem.tsx +22 -2
  444. package/src/Selector/Selector.doc.mjs +15 -0
  445. package/src/Selector/Selector.test.tsx +370 -0
  446. package/src/Selector/Selector.tsx +88 -20
  447. package/src/SideNav/SideNav.tsx +1 -8
  448. package/src/SideNav/SideNavCollapseButton.tsx +9 -7
  449. package/src/SideNav/SideNavItem.tsx +5 -3
  450. package/src/Skeleton/Skeleton.test.tsx +16 -0
  451. package/src/Skeleton/Skeleton.tsx +13 -1
  452. package/src/Slider/Slider.doc.mjs +6 -0
  453. package/src/Slider/Slider.test.tsx +240 -12
  454. package/src/Slider/Slider.tsx +96 -23
  455. package/src/Spinner/Spinner.test.tsx +10 -8
  456. package/src/Spinner/Spinner.tsx +15 -5
  457. package/src/Switch/Switch.doc.mjs +142 -42
  458. package/src/Switch/Switch.test.tsx +111 -0
  459. package/src/Switch/Switch.tsx +149 -32
  460. package/src/TabList/Tab.tsx +2 -2
  461. package/src/TabList/TabList.doc.mjs +0 -6
  462. package/src/TabList/TabList.test.tsx +3 -15
  463. package/src/TabList/TabList.tsx +6 -17
  464. package/src/TabList/TabListContext.ts +0 -6
  465. package/src/TabList/TabMenu.tsx +2 -2
  466. package/src/Table/BaseTable.tsx +34 -2
  467. package/src/Table/Table.doc.mjs +11 -0
  468. package/src/Table/Table.test.tsx +85 -0
  469. package/src/Table/TableCell.tsx +3 -3
  470. package/src/Table/TableHeaderCell.tsx +3 -3
  471. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +9 -6
  472. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +19 -0
  473. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +27 -18
  474. package/src/Table/plugins/selection/useTableSelection.test.tsx +61 -3
  475. package/src/Table/plugins/selection/useTableSelection.tsx +3 -0
  476. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +38 -9
  477. package/src/Table/plugins/tree/useTableTreeData.tsx +17 -13
  478. package/src/Table/types.ts +33 -0
  479. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  480. package/src/TextArea/TextArea.doc.mjs +21 -0
  481. package/src/TextArea/TextArea.test.tsx +23 -0
  482. package/src/TextArea/TextArea.tsx +27 -26
  483. package/src/TextInput/TextInput.doc.mjs +21 -0
  484. package/src/TextInput/TextInput.test.tsx +150 -0
  485. package/src/TextInput/TextInput.tsx +28 -25
  486. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  487. package/src/Thumbnail/Thumbnail.tsx +1 -1
  488. package/src/TimeInput/TimeInput.doc.mjs +21 -0
  489. package/src/TimeInput/TimeInput.test.tsx +23 -0
  490. package/src/TimeInput/TimeInput.tsx +24 -25
  491. package/src/Timestamp/Timestamp.doc.mjs +32 -6
  492. package/src/Timestamp/Timestamp.test.tsx +371 -0
  493. package/src/Timestamp/Timestamp.tsx +96 -93
  494. package/src/Timestamp/formatInstant.ts +218 -0
  495. package/src/Timestamp/index.ts +4 -0
  496. package/src/Timestamp/tooltipEntries.test.ts +552 -0
  497. package/src/Timestamp/tooltipEntries.ts +210 -0
  498. package/src/Toast/ToastViewport.test.tsx +218 -8
  499. package/src/Toast/ToastViewport.tsx +71 -12
  500. package/src/ToggleButton/ToggleButton.test.tsx +24 -0
  501. package/src/ToggleButton/ToggleButton.tsx +19 -1
  502. package/src/Token/Token.test.tsx +166 -15
  503. package/src/Token/Token.tsx +104 -47
  504. package/src/Token/TokenLink.tsx +107 -0
  505. package/src/Token/index.ts +1 -1
  506. package/src/Tokenizer/Tokenizer.doc.mjs +23 -1
  507. package/src/Tokenizer/Tokenizer.test.tsx +23 -0
  508. package/src/Tokenizer/Tokenizer.tsx +14 -2
  509. package/src/Tooltip/Tooltip.test.tsx +46 -0
  510. package/src/Tooltip/useTooltip.tsx +20 -0
  511. package/src/TopNav/TopNav.test.tsx +93 -2
  512. package/src/TopNav/TopNavItem.doc.mjs +3 -3
  513. package/src/TopNav/TopNavItem.tsx +35 -6
  514. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +1 -1
  515. package/src/TreeList/TreeList.doc.mjs +6 -0
  516. package/src/TreeList/TreeList.test.tsx +50 -10
  517. package/src/TreeList/TreeList.tsx +5 -0
  518. package/src/TreeList/TreeListBranches.tsx +8 -6
  519. package/src/TreeList/TreeListItem.tsx +33 -11
  520. package/src/Typeahead/BaseTypeahead.tsx +42 -15
  521. package/src/Typeahead/Typeahead.doc.mjs +13 -0
  522. package/src/Typeahead/Typeahead.test.tsx +112 -0
  523. package/src/Typeahead/Typeahead.tsx +17 -1
  524. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  525. package/src/__tests__/forcedColors.ts +60 -0
  526. package/src/__tests__/inputWidthContract.test.tsx +62 -0
  527. package/src/doc-mjs.d.ts +19 -0
  528. package/src/hooks/index.ts +6 -0
  529. package/src/hooks/isRtlElement.ts +27 -0
  530. package/src/hooks/useAnnounce.test.tsx +75 -2
  531. package/src/hooks/useAnnounce.ts +47 -1
  532. package/src/hooks/useFocusTrap.test.tsx +104 -0
  533. package/src/hooks/useFocusTrap.ts +61 -12
  534. package/src/hooks/useGridFocus.doc.mjs +3 -3
  535. package/src/hooks/useGridFocus.test.tsx +41 -0
  536. package/src/hooks/useGridFocus.ts +21 -10
  537. package/src/hooks/useHotkeys.ts +9 -0
  538. package/src/hooks/useInputStatusIcon.test.tsx +162 -0
  539. package/src/hooks/useInputStatusIcon.tsx +224 -0
  540. package/src/hooks/useKeyboardHint.test.tsx +22 -0
  541. package/src/hooks/useKeyboardHint.tsx +6 -2
  542. package/src/hooks/useListFocus.doc.mjs +25 -3
  543. package/src/hooks/useListFocus.test.tsx +153 -1
  544. package/src/hooks/useListFocus.ts +102 -9
  545. package/src/i18n/InternationalizationContext.ts +4 -0
  546. package/src/i18n/InternationalizationProvider.tsx +12 -2
  547. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  548. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  549. package/src/i18n/getLocaleDirection.ts +29 -0
  550. package/src/i18n/index.ts +6 -0
  551. package/src/i18n/useDirection.ts +29 -0
  552. package/src/reset.css +0 -26
  553. package/src/reset.test.ts +60 -0
  554. package/src/theme/derivedVarRegistry.test.ts +1 -0
  555. package/src/theme/derivedVarRegistry.ts +6 -0
  556. package/src/theme/generateThemeRules.test.ts +42 -0
  557. package/src/utils/index.ts +2 -0
  558. package/src/utils/plainDate.test.ts +24 -6
  559. package/src/utils/plainDate.ts +18 -4
  560. package/src/utils/rtlStyles.ts +27 -0
@@ -86,7 +86,7 @@ describe('Outline', () => {
86
86
  render(<Outline items={items} activeId="install" />);
87
87
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
88
88
  'aria-current',
89
- 'true',
89
+ 'location',
90
90
  );
91
91
  expect(
92
92
  screen.getByRole('link', {name: 'Introduction'}),
@@ -111,7 +111,7 @@ describe('Outline', () => {
111
111
  // so it has not moved to the clicked item yet.
112
112
  expect(
113
113
  screen.getByRole('link', {name: 'Installation'}),
114
- ).not.toHaveAttribute('aria-current', 'true');
114
+ ).not.toHaveAttribute('aria-current', 'location');
115
115
 
116
116
  // When the scroll settles, the indicator lands on the clicked item.
117
117
  act(() => {
@@ -120,7 +120,7 @@ describe('Outline', () => {
120
120
  expect(onActiveIdChange).toHaveBeenCalledWith('install');
121
121
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
122
122
  'aria-current',
123
- 'true',
123
+ 'location',
124
124
  );
125
125
 
126
126
  document.body.removeChild(target);
@@ -224,7 +224,7 @@ describe('Outline', () => {
224
224
 
225
225
  expect(screen.getByRole('link', {name: 'Introduction'})).toHaveAttribute(
226
226
  'aria-current',
227
- 'true',
227
+ 'location',
228
228
  );
229
229
 
230
230
  // Controlled active id is driven entirely by the prop.
@@ -237,7 +237,7 @@ describe('Outline', () => {
237
237
  );
238
238
  expect(screen.getByRole('link', {name: 'API'})).toHaveAttribute(
239
239
  'aria-current',
240
- 'true',
240
+ 'location',
241
241
  );
242
242
  expect(
243
243
  screen.getByRole('link', {name: 'Introduction'}),
@@ -277,7 +277,7 @@ describe('Outline', () => {
277
277
 
278
278
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
279
279
  'aria-current',
280
- 'true',
280
+ 'location',
281
281
  );
282
282
  expect(onActiveIdChange).toHaveBeenCalledWith('install');
283
283
 
@@ -493,7 +493,7 @@ describe('Outline keyboard navigation', () => {
493
493
  expect(onNavigateEnd).toHaveBeenCalledTimes(1);
494
494
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
495
495
  'aria-current',
496
- 'true',
496
+ 'location',
497
497
  );
498
498
 
499
499
  cleanup();
@@ -764,7 +764,7 @@ describe('Outline scroll scoping', () => {
764
764
  expect(onNavigateEnd).toHaveBeenCalledWith('install');
765
765
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
766
766
  'aria-current',
767
- 'true',
767
+ 'location',
768
768
  );
769
769
 
770
770
  cleanup();
@@ -797,7 +797,7 @@ describe('Outline scroll scoping', () => {
797
797
  // has not reached it, so `intro` stays active.
798
798
  expect(screen.getByRole('link', {name: 'Introduction'})).toHaveAttribute(
799
799
  'aria-current',
800
- 'true',
800
+ 'location',
801
801
  );
802
802
 
803
803
  rerender(<Outline items={items} offset={64} />);
@@ -806,7 +806,7 @@ describe('Outline scroll scoping', () => {
806
806
  });
807
807
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
808
808
  'aria-current',
809
- 'true',
809
+ 'location',
810
810
  );
811
811
 
812
812
  cleanup();
@@ -930,7 +930,7 @@ describe('Outline scroll scoping', () => {
930
930
 
931
931
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
932
932
  'aria-current',
933
- 'true',
933
+ 'location',
934
934
  );
935
935
  expect(screen.getByRole('link', {name: 'API'})).not.toHaveAttribute(
936
936
  'aria-current',
@@ -981,7 +981,7 @@ describe('Outline scroll scoping', () => {
981
981
 
982
982
  expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
983
983
  'aria-current',
984
- 'true',
984
+ 'location',
985
985
  );
986
986
 
987
987
  pane.remove();
@@ -372,7 +372,7 @@ export function Outline({
372
372
  }
373
373
  const links = Array.from(list.querySelectorAll<HTMLElement>('a[href]'));
374
374
  const active = links.find(
375
- link => link.getAttribute('aria-current') === 'true',
375
+ link => link.getAttribute('aria-current') === 'location',
376
376
  );
377
377
  if (active == null) {
378
378
  return;
@@ -465,7 +465,7 @@ export function Outline({
465
465
  <li key={item.id} {...stylex.props(styles.item)} role="listitem">
466
466
  <LinkComponent
467
467
  href={`#${item.id}`}
468
- aria-current={isActive ? 'true' : undefined}
468
+ aria-current={isActive ? 'location' : undefined}
469
469
  onClick={handleClick(item.id)}
470
470
  onKeyDown={handleKeyDown(item.id)}
471
471
  {...mergeProps(
@@ -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
@@ -90,6 +90,13 @@ export const docs = {
90
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
91
  slotElements: [{__element: 'Icon', props: {icon: 'search', size: 'sm'}}],
92
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
+ },
93
100
  {
94
101
  name: 'maxTokenLength',
95
102
  type: 'number',
@@ -248,6 +255,13 @@ export const docsZh = {
248
255
  description:
249
256
  '在输入框开头(筛选 token 之前)显示的图标,转发给内部的 Tokenizer。接受语义图标名称、SVG 图标组件或直接传入 ReactNode。',
250
257
  },
258
+ {
259
+ name: 'statusVariant',
260
+ type: "'attached' | 'detached'",
261
+ description:
262
+ '状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
263
+ default: "'attached'",
264
+ },
251
265
  {
252
266
  name: 'maxTokenLength',
253
267
  type: 'number',
@@ -332,6 +346,7 @@ export const docsDense = {
332
346
  isDisabled: 'Disables entire component.',
333
347
  status: 'Validation status object w/ type + optional message.',
334
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.',
335
350
  maxTokenLength: 'Max char length for filter value display in tokens.',
336
351
  popoverSaveButtonLabel: 'Label for save button in edit popover.',
337
352
  timezoneID: 'Timezone ID for date formatting (e.g. "America/New_York").',
@@ -424,3 +424,26 @@ describe('PowerSearch', () => {
424
424
  });
425
425
  });
426
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}
@@ -242,5 +242,39 @@ describe('ProgressBar', () => {
242
242
  unmount();
243
243
  }
244
244
  });
245
+
246
+ it('drives a direction-aware indeterminate slide (mirrored keyframe under RTL)', () => {
247
+ // StyleX injects the keyframes + the atomic rule that swaps the
248
+ // animation-name under `[dir="rtl"]`. Scan the injected CSS so we can
249
+ // assert the RTL branch exists without relying on jsdom animation.
250
+ function injectedCss(): string {
251
+ let out = '';
252
+ for (const sheet of Array.from(document.styleSheets)) {
253
+ try {
254
+ for (const rule of Array.from(sheet.cssRules)) {
255
+ out += rule.cssText + '\n';
256
+ }
257
+ } catch {
258
+ // ignore cross-origin sheets
259
+ }
260
+ }
261
+ out += Array.from(document.querySelectorAll('style'))
262
+ .map(s => s.textContent || '')
263
+ .join('\n');
264
+ return out;
265
+ }
266
+
267
+ render(<ProgressBar isIndeterminate label="Loading" />);
268
+ const css = injectedCss();
269
+ // LTR keyframe slides physically left → right (−100% → 250%).
270
+ expect(css).toMatch(/translateX\(-100%\)/);
271
+ expect(css).toMatch(/translateX\(250%\)/);
272
+ // RTL keyframe mirrors it (100% → −250%) so the bar travels along the
273
+ // reading flow (inline-start → inline-end, i.e. right → left).
274
+ expect(css).toMatch(/translateX\(100%\)/);
275
+ expect(css).toMatch(/translateX\(-250%\)/);
276
+ // The animation-name is swapped specifically under `[dir="rtl"]`.
277
+ expect(css).toMatch(/:is\(\[dir="rtl"\][^)]*\)[^{]*\{\s*animation-name:/);
278
+ });
245
279
  });
246
280
  });
@@ -132,6 +132,18 @@ const indeterminateSlide = stylex.keyframes({
132
132
  },
133
133
  });
134
134
 
135
+ // RTL: mirror the slide so the indeterminate bar travels along the reading
136
+ // flow (inline-start → inline-end, i.e. right → left) instead of always
137
+ // physically left → right. The magnitudes mirror the LTR keyframe.
138
+ const indeterminateSlideRtl = stylex.keyframes({
139
+ '0%': {
140
+ transform: 'translateX(100%)',
141
+ },
142
+ '100%': {
143
+ transform: 'translateX(-250%)',
144
+ },
145
+ });
146
+
135
147
  // =============================================================================
136
148
  // Styles
137
149
  // =============================================================================
@@ -196,7 +208,10 @@ const styles = stylex.create({
196
208
  height: '100%',
197
209
  width: '40%',
198
210
  borderRadius: radiusVars['--radius-full'],
199
- animationName: indeterminateSlide,
211
+ animationName: {
212
+ default: indeterminateSlide,
213
+ ':is([dir="rtl"] *)': indeterminateSlideRtl,
214
+ },
200
215
  animationDuration: {
201
216
  default: '1.5s',
202
217
  '@media (prefers-reduced-motion: reduce)': '3s',
@@ -114,6 +114,12 @@ export const docs = {
114
114
  type: 'string',
115
115
  description: 'Tooltip text for an info icon next to the label.',
116
116
  },
117
+ {
118
+ name: 'width',
119
+ type: 'SizeValue',
120
+ description:
121
+ 'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
122
+ },
117
123
  {
118
124
  name: 'xstyle',
119
125
  type: 'StyleXStyles',
@@ -14,6 +14,7 @@ import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {RadioList} from './RadioList';
16
16
  import {RadioListItem} from './RadioListItem';
17
+ import {getForcedColorsRules} from '../__tests__/forcedColors';
17
18
 
18
19
  // Mock showPopover/hidePopover (not implemented in jsdom) so the tooltip layer
19
20
  // reflects its open state via a `popover-open` attribute the tests can assert.
@@ -580,7 +581,11 @@ describe('RadioList', () => {
580
581
  it('submits the selected value under htmlName', () => {
581
582
  const {container} = render(
582
583
  <form>
583
- <RadioList label="Preference" htmlName="pref" value="b" onChange={() => {}}>
584
+ <RadioList
585
+ label="Preference"
586
+ htmlName="pref"
587
+ value="b"
588
+ onChange={() => {}}>
584
589
  <RadioListItem label="Option A" value="a" />
585
590
  <RadioListItem label="Option B" value="b" />
586
591
  </RadioList>
@@ -599,13 +604,14 @@ describe('RadioList', () => {
599
604
  value="a"
600
605
  onChange={() => {}}
601
606
  isDisabled
602
- disabledMessage="Locked"
603
- >
607
+ disabledMessage="Locked">
604
608
  <RadioListItem label="Option A" value="a" />
605
609
  </RadioList>
606
610
  </form>,
607
611
  );
608
- expect([...new FormData(container.querySelector('form')!).keys()]).toEqual([]);
612
+ expect([
613
+ ...new FormData(container.querySelector('form')!).keys(),
614
+ ]).toEqual([]);
609
615
  });
610
616
 
611
617
  it('keeps working as an isolated group when htmlName is omitted', () => {
@@ -642,3 +648,19 @@ describe('RadioList', () => {
642
648
  });
643
649
  });
644
650
  });
651
+
652
+ // jsdom cannot emulate forced-colors rendering, so this asserts that the
653
+ // compiled output includes the forced-colors rule; visual behavior needs
654
+ // manual verification under Windows High Contrast.
655
+ describe('forced colors (WCAG 1.4.11)', () => {
656
+ it('compiles a forced-colors fill so the selected dot survives Windows High Contrast', () => {
657
+ render(
658
+ <RadioList label="Preference" value="a" onChange={() => {}}>
659
+ <RadioListItem label="Option A" value="a" />
660
+ </RadioList>,
661
+ );
662
+ // The painted inner dot would be stripped to Canvas (invisible), making
663
+ // checked and unchecked radios identical; CanvasText keeps it perceivable.
664
+ expect(getForcedColorsRules()).toContain('background-color: canvastext;');
665
+ });
666
+ });
@@ -146,8 +146,8 @@ export interface RadioListProps extends Omit<
146
146
  status?: InputStatus;
147
147
  /**
148
148
  * The size of the radio controls.
149
- * - 'sm': Compact size (18px radio, 20px wrapper)
150
- * - 'md': Default size (22px radio, 24px wrapper)
149
+ * - 'sm': Compact size (20px radio)
150
+ * - 'md': Default size (24px radio)
151
151
  * @default 'md'
152
152
  */
153
153
  size?: RadioListSize;
@@ -119,7 +119,14 @@ const styles = stylex.create({
119
119
  },
120
120
  innerDot: {
121
121
  borderRadius: '50%',
122
- backgroundColor: colorVars['--color-on-accent'],
122
+ backgroundColor: {
123
+ default: colorVars['--color-on-accent'],
124
+ // Forced colors (Windows High Contrast) strips painted backgrounds,
125
+ // which would make the selected dot invisible — checked and unchecked
126
+ // radios would look identical. CanvasText keeps the dot perceivable on
127
+ // the Canvas circle fill (WCAG 1.4.11).
128
+ '@media (forced-colors: active)': 'CanvasText',
129
+ },
123
130
  },
124
131
  labelDisabled: {
125
132
  color: colorVars['--color-text-disabled'],
@@ -140,12 +147,12 @@ const wrapperSizeStyles = stylex.create({
140
147
 
141
148
  const radioSizeStyles = stylex.create({
142
149
  sm: {
143
- width: 18,
144
- height: 18,
150
+ width: 20,
151
+ height: 20,
145
152
  },
146
153
  md: {
147
- width: 22,
148
- height: 22,
154
+ width: 24,
155
+ height: 24,
149
156
  },
150
157
  });
151
158
 
@@ -201,6 +201,100 @@ describe('ResizeHandle', () => {
201
201
  expect(document.body.style.userSelect).toBe('');
202
202
  });
203
203
 
204
+ // --- RTL pointer-drag direction ---
205
+
206
+ it('drives the region with the raw pointer delta under LTR', () => {
207
+ const resizable: ResizableProps = {
208
+ _size: 200,
209
+ _isCollapsed: false,
210
+ _onResizeStart: vi.fn(),
211
+ _onResizeMove: vi.fn(),
212
+ _onResizeEnd: vi.fn(),
213
+ _minSizePx: 100,
214
+ _maxSizePx: 400,
215
+ _snaps: [],
216
+ _collapsedSize: 40,
217
+ _collapsible: false,
218
+ _isResizableProps: true,
219
+ };
220
+ render(<ResizeHandle resizable={resizable} label="Resize" />);
221
+ const hitArea = screen.getByRole('separator')
222
+ .firstElementChild as HTMLElement;
223
+
224
+ fireEvent.pointerDown(hitArea, {clientX: 0, clientY: 0});
225
+ // Pointer moves +40px to the right → panel grows by +40 under LTR.
226
+ fireEvent.pointerMove(window, {clientX: 40, clientY: 0});
227
+ expect(resizable._onResizeMove).toHaveBeenLastCalledWith(40);
228
+ });
229
+
230
+ it('inverts the pointer delta under RTL so dragging resizes intuitively', () => {
231
+ const resizable: ResizableProps = {
232
+ _size: 200,
233
+ _isCollapsed: false,
234
+ _onResizeStart: vi.fn(),
235
+ _onResizeMove: vi.fn(),
236
+ _onResizeEnd: vi.fn(),
237
+ _minSizePx: 100,
238
+ _maxSizePx: 400,
239
+ _snaps: [],
240
+ _collapsedSize: 40,
241
+ _collapsible: false,
242
+ _isResizableProps: true,
243
+ };
244
+ // Under RTL the start panel sits on the RIGHT, so a pointer move to the
245
+ // right (+clientX) must SHRINK it — the delta is inverted. The handle reads
246
+ // its own computed `direction` via getRTLMultiplier(); jsdom doesn't resolve
247
+ // inherited `direction`, so force it on the separator (the handle element),
248
+ // mirroring the Slider RTL pointer-mapping test precedent.
249
+ render(<ResizeHandle resizable={resizable} label="Resize" />);
250
+ const separator = screen.getByRole('separator');
251
+ const hitArea = separator.firstElementChild as HTMLElement;
252
+
253
+ const realGetComputedStyle = window.getComputedStyle;
254
+ const gcsSpy = vi
255
+ .spyOn(window, 'getComputedStyle')
256
+ .mockImplementation((el: Element, pseudo?: string | null) => {
257
+ if (el === separator) {
258
+ return {direction: 'rtl'} as CSSStyleDeclaration;
259
+ }
260
+ return realGetComputedStyle(el, pseudo ?? undefined);
261
+ });
262
+
263
+ fireEvent.pointerDown(hitArea, {clientX: 0, clientY: 0});
264
+ // Same +40px physical move as LTR, but mirrored → −40 delta under RTL.
265
+ fireEvent.pointerMove(window, {clientX: 40, clientY: 0});
266
+ expect(resizable._onResizeMove).toHaveBeenLastCalledWith(-40);
267
+
268
+ gcsSpy.mockRestore();
269
+ });
270
+
271
+ // --- Hit-area geometry (grab zone tracks the visible pill) ---
272
+
273
+ it('anchors the biased grab zone with the pill offset and a dir-flipped centering shift', () => {
274
+ // For an off-center pill the hit area must reuse the pill's physical offset
275
+ // construction (anchored at insetInlineStart:0) rather than a divider-
276
+ // relative 50% anchor + percentage bias, so the two stay aligned in LTR and
277
+ // RTL. The half-width-difference centering shift (6.5px) is inline, so it
278
+ // flips physical sign under RTL: `- 6.5px` (LTR) vs `+ 6.5px` (RTL). See the
279
+ // Playwright measurement (hitArea.center === pill.center, 0px offset in both
280
+ // directions) for the geometric proof; here we lock the transform shape.
281
+ render(<Harness handleProps={{pillPlacement: 'start'}} />);
282
+ const hitArea = getSeparator().firstElementChild as HTMLElement;
283
+ expect(hitArea.className).toContain('hitAreaOffsetX');
284
+ const style = hitArea.getAttribute('style') ?? '';
285
+ // LTR (default) branch subtracts the centering shift; RTL branch adds it.
286
+ expect(style).toContain('- 6.5px');
287
+ expect(style).toContain('+ 6.5px');
288
+ });
289
+
290
+ it('centers the grab zone on the divider when the pill is centered (no bias)', () => {
291
+ render(<Harness handleProps={{pillPlacement: 'center'}} />);
292
+ const hitArea = getSeparator().firstElementChild as HTMLElement;
293
+ // No physical offset — a plain logical centering class, no biased transform.
294
+ expect(hitArea.className).toContain('hitAreaCenteredX');
295
+ expect(hitArea.className).not.toContain('hitAreaOffsetX');
296
+ });
297
+
204
298
  // --- Prop composition (ordering choice: handler sits after {...props}) ---
205
299
 
206
300
  it('runs a consumer onKeyDown alongside keyboard resizing', () => {