@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052

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 (728) 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 +58 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +240 -53
  9. package/dist/Avatar/AvatarStatusDot.d.ts +35 -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 +215 -6
  23. package/dist/Breadcrumbs/index.d.ts +6 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +10 -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 +80 -11
  34. package/dist/Calendar/dayCellUtils.d.ts +4 -4
  35. package/dist/Calendar/dayCellUtils.js +3 -3
  36. package/dist/Calendar/styles.d.ts +30 -31
  37. package/dist/Calendar/styles.d.ts.map +1 -1
  38. package/dist/Calendar/styles.js +30 -31
  39. package/dist/Card/Card.d.ts +8 -2
  40. package/dist/Card/Card.d.ts.map +1 -1
  41. package/dist/Card/Card.js +28 -2
  42. package/dist/Carousel/Carousel.d.ts +4 -1
  43. package/dist/Carousel/Carousel.d.ts.map +1 -1
  44. package/dist/Carousel/Carousel.js +46 -16
  45. package/dist/Chat/ChatComposer.d.ts +8 -0
  46. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  47. package/dist/Chat/ChatComposer.js +46 -7
  48. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  49. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  50. package/dist/Chat/ChatComposerDrawer.js +11 -1
  51. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  52. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  53. package/dist/Chat/ChatComposerInput.js +36 -4
  54. package/dist/Chat/ChatContext.d.ts +33 -0
  55. package/dist/Chat/ChatContext.d.ts.map +1 -1
  56. package/dist/Chat/ChatContext.js +16 -2
  57. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatDictationButton.js +4 -2
  59. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  60. package/dist/Chat/ChatLayout.js +4 -4
  61. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  62. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  63. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  64. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  65. package/dist/Chat/ChatSendButton.js +7 -1
  66. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +27 -11
  69. package/dist/Chat/index.d.ts +2 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/index.js +1 -1
  72. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  73. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  74. package/dist/Chat/useChatStreamScroll.js +22 -8
  75. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  76. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  77. package/dist/Chat/useSpeechRecognition.js +1 -1
  78. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  79. package/dist/Chat/useTriggerMenu.js +2 -2
  80. package/dist/CheckboxInput/CheckboxInput.js +5 -5
  81. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  82. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  83. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  84. package/dist/Citation/Citation.d.ts +22 -1
  85. package/dist/Citation/Citation.d.ts.map +1 -1
  86. package/dist/Citation/Citation.js +20 -6
  87. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  88. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  89. package/dist/ClickableCard/ClickableCard.js +5 -2
  90. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  91. package/dist/CodeBlock/CodeBlock.js +22 -9
  92. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  93. package/dist/Collapsible/Collapsible.js +3 -1
  94. package/dist/CommandPalette/CommandPalette.d.ts +2 -2
  95. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  96. package/dist/CommandPalette/CommandPalette.js +45 -4
  97. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  98. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  99. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  100. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  101. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  102. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  103. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  104. package/dist/ContextMenu/ContextMenu.js +14 -5
  105. package/dist/ContextMenu/index.d.ts +1 -0
  106. package/dist/ContextMenu/index.d.ts.map +1 -1
  107. package/dist/ContextMenu/index.js +3 -1
  108. package/dist/DateInput/DateInput.d.ts +56 -2
  109. package/dist/DateInput/DateInput.d.ts.map +1 -1
  110. package/dist/DateInput/DateInput.js +59 -21
  111. package/dist/DateInput/index.d.ts +1 -1
  112. package/dist/DateInput/index.d.ts.map +1 -1
  113. package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
  114. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  115. package/dist/DateRangeInput/DateRangeInput.js +23 -20
  116. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  117. package/dist/DateTimeInput/DateTimeInput.js +33 -19
  118. package/dist/Dialog/Dialog.d.ts +3 -0
  119. package/dist/Dialog/Dialog.d.ts.map +1 -1
  120. package/dist/Dialog/Dialog.js +57 -6
  121. package/dist/Dialog/DialogContext.d.ts +7 -0
  122. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  123. package/dist/Dialog/DialogContext.js +2 -2
  124. package/dist/Dialog/DialogHeader.d.ts +5 -2
  125. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  126. package/dist/Dialog/DialogHeader.js +6 -1
  127. package/dist/Divider/Divider.js +1 -1
  128. package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
  129. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  130. package/dist/DropdownMenu/DropdownMenu.js +22 -5
  131. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  132. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  133. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
  134. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  135. package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
  136. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  137. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  138. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  139. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  140. package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
  141. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
  142. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
  143. package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
  144. package/dist/DropdownMenu/index.d.ts +10 -0
  145. package/dist/DropdownMenu/index.d.ts.map +1 -1
  146. package/dist/DropdownMenu/index.js +13 -0
  147. package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
  148. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
  149. package/dist/DropdownMenu/menuItemHover.js +33 -0
  150. package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
  151. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
  152. package/dist/DropdownMenu/menuItemRoles.js +10 -1
  153. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  154. package/dist/DropdownMenu/renderDropdownItems.js +21 -6
  155. package/dist/Field/Field.d.ts +3 -1
  156. package/dist/Field/Field.d.ts.map +1 -1
  157. package/dist/Field/Field.js +6 -4
  158. package/dist/Field/FieldLabel.d.ts +1 -1
  159. package/dist/Field/FieldLabel.d.ts.map +1 -1
  160. package/dist/Field/FieldLabel.js +43 -16
  161. package/dist/Field/inputStyles.stylex.d.ts +1 -0
  162. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  163. package/dist/Field/inputStyles.stylex.js +1 -0
  164. package/dist/FieldStatus/FieldStatus.d.ts +18 -0
  165. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  166. package/dist/FieldStatus/FieldStatus.js +60 -6
  167. package/dist/FileInput/FileInput.d.ts +10 -2
  168. package/dist/FileInput/FileInput.d.ts.map +1 -1
  169. package/dist/FileInput/FileInput.js +54 -35
  170. package/dist/HoverCard/HoverCard.d.ts +9 -1
  171. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  172. package/dist/HoverCard/HoverCard.js +2 -0
  173. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  174. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  175. package/dist/HoverCard/useHoverCard.js +17 -6
  176. package/dist/Icon/Icon.d.ts +22 -3
  177. package/dist/Icon/Icon.d.ts.map +1 -1
  178. package/dist/Icon/Icon.js +19 -3
  179. package/dist/Item/Item.d.ts +6 -1
  180. package/dist/Item/Item.d.ts.map +1 -1
  181. package/dist/Item/Item.js +22 -1
  182. package/dist/Layer/useLayer.d.ts +6 -0
  183. package/dist/Layer/useLayer.d.ts.map +1 -1
  184. package/dist/Layer/useLayer.js +2 -0
  185. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  186. package/dist/Lightbox/Lightbox.js +19 -13
  187. package/dist/Markdown/Markdown.d.ts.map +1 -1
  188. package/dist/Markdown/Markdown.js +7 -0
  189. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  190. package/dist/MobileNav/MobileNav.js +6 -1
  191. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  192. package/dist/MobileNav/MobileNavToggle.js +4 -0
  193. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  194. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  195. package/dist/MultiSelector/MultiSelector.js +104 -50
  196. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  197. package/dist/MultiSelector/hooks.js +16 -0
  198. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  199. package/dist/NumberInput/NumberInput.d.ts +10 -2
  200. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  201. package/dist/NumberInput/NumberInput.js +22 -17
  202. package/dist/Outline/Outline.d.ts +0 -1
  203. package/dist/Outline/Outline.d.ts.map +1 -1
  204. package/dist/Outline/Outline.js +0 -1
  205. package/dist/OverflowList/OverflowList.d.ts +20 -3
  206. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  207. package/dist/OverflowList/OverflowList.js +29 -4
  208. package/dist/Pagination/Pagination.d.ts.map +1 -1
  209. package/dist/Pagination/Pagination.js +11 -3
  210. package/dist/Popover/Popover.d.ts.map +1 -1
  211. package/dist/Popover/Popover.js +3 -2
  212. package/dist/Popover/usePopover.d.ts.map +1 -1
  213. package/dist/Popover/usePopover.js +3 -9
  214. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  215. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  216. package/dist/PowerSearch/PowerSearch.js +2 -0
  217. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  218. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  219. package/dist/RadioList/RadioList.d.ts +2 -2
  220. package/dist/RadioList/RadioListItem.js +4 -4
  221. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  222. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  223. package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
  224. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  225. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  226. package/dist/SelectableCard/SelectableCard.js +16 -13
  227. package/dist/Selector/Selector.d.ts +8 -0
  228. package/dist/Selector/Selector.d.ts.map +1 -1
  229. package/dist/Selector/Selector.js +65 -19
  230. package/dist/Selector/hooks.d.ts.map +1 -1
  231. package/dist/Selector/hooks.js +16 -0
  232. package/dist/SideNav/SideNav.d.ts.map +1 -1
  233. package/dist/SideNav/SideNav.js +5 -5
  234. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  235. package/dist/SideNav/SideNavCollapseButton.js +13 -10
  236. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  237. package/dist/SideNav/SideNavHeading.js +21 -8
  238. package/dist/SideNav/SideNavItem.d.ts +1 -1
  239. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  240. package/dist/SideNav/SideNavItem.js +12 -10
  241. package/dist/Slider/Slider.d.ts.map +1 -1
  242. package/dist/Slider/Slider.js +106 -36
  243. package/dist/Stack/stack.stylex.d.ts +9 -9
  244. package/dist/Switch/Switch.d.ts +8 -1
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +160 -91
  247. package/dist/TabList/Tab.js +2 -2
  248. package/dist/TabList/TabMenu.js +1 -1
  249. package/dist/Table/BaseTable.d.ts.map +1 -1
  250. package/dist/Table/BaseTable.js +33 -6
  251. package/dist/Table/TableCell.js +3 -3
  252. package/dist/Table/TableHeaderCell.js +3 -3
  253. package/dist/Table/index.d.ts +2 -0
  254. package/dist/Table/index.d.ts.map +1 -1
  255. package/dist/Table/index.js +1 -0
  256. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  257. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
  258. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  259. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
  260. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  261. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  262. package/dist/Table/plugins/rowStatus/index.js +3 -0
  263. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  264. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  265. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  266. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  267. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  268. package/dist/Table/plugins/selection/useTableSelection.js +7 -1
  269. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  270. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  271. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  272. package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
  273. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  274. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  275. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  276. package/dist/Table/types.d.ts +32 -0
  277. package/dist/Table/types.d.ts.map +1 -1
  278. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  279. package/dist/Table/useBaseTablePlugins.js +5 -3
  280. package/dist/TextArea/TextArea.d.ts +10 -1
  281. package/dist/TextArea/TextArea.d.ts.map +1 -1
  282. package/dist/TextArea/TextArea.js +18 -19
  283. package/dist/TextInput/TextInput.d.ts +10 -2
  284. package/dist/TextInput/TextInput.d.ts.map +1 -1
  285. package/dist/TextInput/TextInput.js +20 -17
  286. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  287. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  288. package/dist/Thumbnail/Thumbnail.js +97 -54
  289. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  290. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  291. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  292. package/dist/TimeInput/TimeInput.d.ts +10 -2
  293. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  294. package/dist/TimeInput/TimeInput.js +32 -21
  295. package/dist/Timestamp/Timestamp.d.ts +3 -1
  296. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  297. package/dist/Timestamp/Timestamp.js +8 -6
  298. package/dist/Toast/useToast.d.ts.map +1 -1
  299. package/dist/Toast/useToast.js +2 -5
  300. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  301. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  302. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  303. package/dist/Token/Token.d.ts +30 -3
  304. package/dist/Token/Token.d.ts.map +1 -1
  305. package/dist/Token/Token.js +17 -2
  306. package/dist/Token/index.d.ts +1 -1
  307. package/dist/Token/index.d.ts.map +1 -1
  308. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  309. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  310. package/dist/Tokenizer/Tokenizer.js +20 -6
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +17 -1
  313. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  314. package/dist/TopNav/TopNavHeading.js +18 -8
  315. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  316. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  319. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  320. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  321. package/dist/TopNav/TopNavMenu.js +68 -6
  322. package/dist/TreeList/TreeList.d.ts +12 -3
  323. package/dist/TreeList/TreeList.d.ts.map +1 -1
  324. package/dist/TreeList/TreeList.js +3 -0
  325. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  326. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  327. package/dist/TreeList/TreeListBranches.js +18 -10
  328. package/dist/TreeList/TreeListItem.d.ts +8 -2
  329. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  330. package/dist/TreeList/TreeListItem.js +59 -21
  331. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  332. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  333. package/dist/TreeList/index.d.ts +2 -2
  334. package/dist/TreeList/index.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  336. package/dist/Typeahead/BaseTypeahead.js +20 -11
  337. package/dist/Typeahead/Typeahead.d.ts +9 -2
  338. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  339. package/dist/Typeahead/Typeahead.js +3 -1
  340. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  341. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  342. package/dist/Typeahead/TypeaheadItem.js +20 -10
  343. package/dist/astryx.css +61 -39
  344. package/dist/astryx.umd.js +53 -53
  345. package/dist/astryx.umd.js.map +4 -4
  346. package/dist/authoring/doc.d.ts.map +1 -1
  347. package/dist/docs-types.d.ts +8 -0
  348. package/dist/docs-types.d.ts.map +1 -1
  349. package/dist/hooks/computeOverflow.d.ts +47 -0
  350. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  351. package/dist/hooks/computeOverflow.js +213 -0
  352. package/dist/hooks/index.d.ts +3 -0
  353. package/dist/hooks/index.d.ts.map +1 -1
  354. package/dist/hooks/index.js +3 -1
  355. package/dist/hooks/isRtlElement.d.ts +18 -0
  356. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  357. package/dist/hooks/isRtlElement.js +27 -0
  358. package/dist/hooks/useDevWarning.d.ts +18 -0
  359. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  360. package/dist/hooks/useDevWarning.js +49 -0
  361. package/dist/hooks/useGridFocus.d.ts +6 -1
  362. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  363. package/dist/hooks/useGridFocus.js +12 -9
  364. package/dist/hooks/useInputStatusIcon.d.ts +38 -0
  365. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
  366. package/dist/hooks/useInputStatusIcon.js +158 -0
  367. package/dist/hooks/useListFocus.d.ts +39 -1
  368. package/dist/hooks/useListFocus.d.ts.map +1 -1
  369. package/dist/hooks/useListFocus.js +54 -9
  370. package/dist/hooks/useOverflow.d.ts +19 -0
  371. package/dist/hooks/useOverflow.d.ts.map +1 -1
  372. package/dist/hooks/useOverflow.js +36 -25
  373. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  374. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  375. package/dist/i18n/InternationalizationContext.js +3 -0
  376. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  377. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  378. package/dist/i18n/InternationalizationProvider.js +5 -1
  379. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  380. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  381. package/dist/i18n/getLocaleDirection.js +29 -0
  382. package/dist/i18n/index.d.ts +6 -0
  383. package/dist/i18n/index.d.ts.map +1 -1
  384. package/dist/i18n/index.js +7 -1
  385. package/dist/i18n/resolve.d.ts.map +1 -1
  386. package/dist/i18n/resolve.js +7 -18
  387. package/dist/i18n/useDirection.d.ts +2 -0
  388. package/dist/i18n/useDirection.d.ts.map +1 -0
  389. package/dist/i18n/useDirection.js +27 -0
  390. package/dist/theme/Theme.d.ts.map +1 -1
  391. package/dist/theme/Theme.js +2 -7
  392. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  393. package/dist/theme/derivedVarRegistry.js +13 -0
  394. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  395. package/dist/theme/generateThemeRules.js +51 -0
  396. package/dist/theme/hct.d.ts +0 -1
  397. package/dist/theme/hct.d.ts.map +1 -1
  398. package/dist/theme/hct.js +1 -1
  399. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  400. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  401. package/dist/utils/devWarning.d.ts +42 -0
  402. package/dist/utils/devWarning.d.ts.map +1 -0
  403. package/dist/utils/devWarning.js +88 -0
  404. package/dist/utils/index.d.ts +4 -1
  405. package/dist/utils/index.d.ts.map +1 -1
  406. package/dist/utils/index.js +4 -2
  407. package/dist/utils/plainDate.d.ts +30 -0
  408. package/dist/utils/plainDate.d.ts.map +1 -1
  409. package/dist/utils/plainDate.js +65 -3
  410. package/dist/utils/rtlStyles.d.ts +24 -0
  411. package/dist/utils/rtlStyles.d.ts.map +1 -0
  412. package/dist/utils/rtlStyles.js +27 -0
  413. package/dist/utils/types.d.ts +13 -0
  414. package/dist/utils/types.d.ts.map +1 -1
  415. package/locales/en.json +104 -0
  416. package/locales/fr-FR.json +14 -0
  417. package/locales/pseudo.json +78 -0
  418. package/package.json +6 -1
  419. package/src/AppShell/AppShell.tsx +6 -0
  420. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  421. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  422. package/src/Avatar/Avatar.doc.mjs +64 -5
  423. package/src/Avatar/Avatar.test.tsx +374 -1
  424. package/src/Avatar/Avatar.tsx +367 -69
  425. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  426. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  427. package/src/Avatar/AvatarStatusDot.tsx +180 -21
  428. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  429. package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
  430. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  431. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  432. package/src/Banner/Banner.doc.mjs +9 -0
  433. package/src/Banner/Banner.test.tsx +30 -0
  434. package/src/Banner/Banner.tsx +53 -9
  435. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  436. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  437. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  438. package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
  439. package/src/Breadcrumbs/index.ts +31 -0
  440. package/src/Button/Button.doc.mjs +9 -4
  441. package/src/Button/Button.test.tsx +49 -0
  442. package/src/Button/Button.tsx +27 -3
  443. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  444. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  445. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  446. package/src/Calendar/Calendar.doc.mjs +12 -1
  447. package/src/Calendar/Calendar.test.tsx +362 -19
  448. package/src/Calendar/Calendar.tsx +111 -32
  449. package/src/Calendar/dayCellUtils.test.ts +23 -18
  450. package/src/Calendar/dayCellUtils.ts +3 -3
  451. package/src/Calendar/styles.ts +33 -39
  452. package/src/Card/Card.doc.mjs +9 -0
  453. package/src/Card/Card.test.tsx +21 -3
  454. package/src/Card/Card.tsx +35 -2
  455. package/src/Carousel/Carousel.doc.mjs +1 -0
  456. package/src/Carousel/Carousel.test.tsx +53 -0
  457. package/src/Carousel/Carousel.tsx +59 -10
  458. package/src/Chat/ChatComposer.doc.mjs +12 -3
  459. package/src/Chat/ChatComposer.test.tsx +115 -0
  460. package/src/Chat/ChatComposer.tsx +73 -9
  461. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  462. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  463. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  464. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  465. package/src/Chat/ChatComposerInput.tsx +51 -5
  466. package/src/Chat/ChatContext.tsx +37 -10
  467. package/src/Chat/ChatDictationButton.tsx +11 -2
  468. package/src/Chat/ChatLayout.tsx +7 -5
  469. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  470. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  471. package/src/Chat/ChatSendButton.tsx +11 -1
  472. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  473. package/src/Chat/ChatToolCalls.tsx +33 -5
  474. package/src/Chat/index.ts +5 -1
  475. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  476. package/src/Chat/useChatStreamScroll.ts +27 -10
  477. package/src/Chat/useSpeechRecognition.ts +1 -1
  478. package/src/Chat/useTriggerMenu.tsx +4 -2
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
  480. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  481. package/src/CheckboxInput/CheckboxInput.tsx +5 -5
  482. package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
  483. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  484. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  485. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  486. package/src/Citation/Citation.doc.mjs +4 -3
  487. package/src/Citation/Citation.test.tsx +97 -0
  488. package/src/Citation/Citation.tsx +43 -11
  489. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  490. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  491. package/src/ClickableCard/ClickableCard.tsx +13 -3
  492. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  493. package/src/CodeBlock/CodeBlock.tsx +45 -10
  494. package/src/Collapsible/Collapsible.doc.mjs +1 -0
  495. package/src/Collapsible/Collapsible.test.tsx +7 -0
  496. package/src/Collapsible/Collapsible.tsx +16 -6
  497. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  498. package/src/CommandPalette/CommandPalette.test.tsx +95 -1
  499. package/src/CommandPalette/CommandPalette.tsx +44 -3
  500. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  501. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  502. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  503. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  504. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  505. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  506. package/src/ContextMenu/ContextMenu.test.tsx +235 -0
  507. package/src/ContextMenu/ContextMenu.tsx +13 -11
  508. package/src/ContextMenu/index.ts +5 -0
  509. package/src/DateInput/DateInput.doc.mjs +41 -0
  510. package/src/DateInput/DateInput.test.tsx +338 -0
  511. package/src/DateInput/DateInput.tsx +119 -32
  512. package/src/DateInput/index.ts +1 -0
  513. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  514. package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
  515. package/src/DateRangeInput/DateRangeInput.tsx +42 -30
  516. package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
  517. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  518. package/src/DateTimeInput/DateTimeInput.tsx +58 -41
  519. package/src/Dialog/Dialog.doc.mjs +2 -2
  520. package/src/Dialog/Dialog.test.tsx +77 -4
  521. package/src/Dialog/Dialog.tsx +89 -5
  522. package/src/Dialog/DialogContext.ts +9 -2
  523. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  524. package/src/Dialog/DialogHeader.tsx +9 -2
  525. package/src/Divider/Divider.tsx +2 -2
  526. package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
  527. package/src/DropdownMenu/DropdownMenu.tsx +31 -12
  528. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
  529. package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
  530. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  531. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
  532. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
  533. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
  534. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
  535. package/src/DropdownMenu/index.ts +16 -0
  536. package/src/DropdownMenu/menuItemHover.ts +39 -0
  537. package/src/DropdownMenu/menuItemRoles.ts +9 -0
  538. package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
  539. package/src/Field/Field.test.tsx +57 -12
  540. package/src/Field/Field.tsx +20 -14
  541. package/src/Field/FieldLabel.tsx +9 -1
  542. package/src/Field/inputStyles.stylex.ts +2 -0
  543. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  544. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  545. package/src/FieldStatus/FieldStatus.tsx +69 -5
  546. package/src/FileInput/FileInput.doc.mjs +23 -2
  547. package/src/FileInput/FileInput.test.tsx +135 -12
  548. package/src/FileInput/FileInput.tsx +65 -51
  549. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  550. package/src/HoverCard/HoverCard.test.tsx +21 -2
  551. package/src/HoverCard/HoverCard.tsx +11 -0
  552. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  553. package/src/HoverCard/useHoverCard.tsx +39 -5
  554. package/src/Icon/Icon.doc.mjs +16 -2
  555. package/src/Icon/Icon.test.tsx +89 -0
  556. package/src/Icon/Icon.tsx +58 -5
  557. package/src/IconButton/IconButton.doc.mjs +8 -0
  558. package/src/IconButton/IconButton.test.tsx +15 -18
  559. package/src/Item/Item.test.tsx +40 -18
  560. package/src/Item/Item.tsx +38 -2
  561. package/src/Layer/useLayer.tsx +8 -0
  562. package/src/Lightbox/Lightbox.tsx +15 -7
  563. package/src/List/List.test.tsx +9 -8
  564. package/src/Markdown/Markdown.test.tsx +21 -0
  565. package/src/Markdown/Markdown.tsx +4 -0
  566. package/src/MobileNav/MobileNav.tsx +12 -1
  567. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  568. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  569. package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
  570. package/src/MultiSelector/MultiSelector.test.tsx +498 -3
  571. package/src/MultiSelector/MultiSelector.tsx +149 -65
  572. package/src/MultiSelector/hooks.ts +17 -0
  573. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  574. package/src/NumberInput/NumberInput.doc.mjs +21 -0
  575. package/src/NumberInput/NumberInput.test.tsx +82 -7
  576. package/src/NumberInput/NumberInput.tsx +36 -28
  577. package/src/Outline/Outline.tsx +0 -1
  578. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  579. package/src/OverflowList/OverflowList.test.tsx +111 -0
  580. package/src/OverflowList/OverflowList.tsx +48 -8
  581. package/src/Pagination/Pagination.tsx +11 -3
  582. package/src/Popover/Popover.tsx +7 -4
  583. package/src/Popover/usePopover.tsx +9 -13
  584. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  585. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  586. package/src/PowerSearch/PowerSearch.tsx +10 -1
  587. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  588. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  589. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  590. package/src/RadioList/RadioList.doc.mjs +6 -0
  591. package/src/RadioList/RadioList.tsx +2 -2
  592. package/src/RadioList/RadioListItem.tsx +4 -4
  593. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
  594. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  595. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  596. package/src/SelectableCard/SelectableCard.tsx +29 -16
  597. package/src/Selector/Selector.doc.mjs +15 -0
  598. package/src/Selector/Selector.test.tsx +417 -0
  599. package/src/Selector/Selector.tsx +86 -21
  600. package/src/Selector/hooks.ts +17 -0
  601. package/src/SideNav/SideNav.test.tsx +119 -3
  602. package/src/SideNav/SideNav.tsx +1 -8
  603. package/src/SideNav/SideNavCollapseButton.tsx +15 -8
  604. package/src/SideNav/SideNavHeading.tsx +24 -8
  605. package/src/SideNav/SideNavItem.tsx +10 -4
  606. package/src/Slider/Slider.doc.mjs +6 -0
  607. package/src/Slider/Slider.test.tsx +314 -13
  608. package/src/Slider/Slider.tsx +117 -28
  609. package/src/Switch/Switch.doc.mjs +142 -42
  610. package/src/Switch/Switch.test.tsx +54 -1
  611. package/src/Switch/Switch.tsx +90 -33
  612. package/src/TabList/Tab.tsx +2 -2
  613. package/src/TabList/TabMenu.tsx +2 -2
  614. package/src/Table/BaseTable.tsx +37 -7
  615. package/src/Table/Table.doc.mjs +11 -0
  616. package/src/Table/Table.test.tsx +85 -0
  617. package/src/Table/TableCell.tsx +3 -3
  618. package/src/Table/TableHeaderCell.tsx +3 -3
  619. package/src/Table/index.ts +5 -0
  620. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
  621. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
  622. package/src/Table/plugins/rowStatus/index.ts +7 -0
  623. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  624. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  625. package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
  626. package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
  627. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  628. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  629. package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
  630. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  631. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  632. package/src/Table/types.ts +33 -0
  633. package/src/Table/useBaseTablePlugins.ts +10 -6
  634. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  635. package/src/Table/useTableSelection.doc.mjs +65 -14
  636. package/src/Table/useTableTreeData.doc.mjs +29 -0
  637. package/src/Table/useTableTreeState.doc.mjs +2 -2
  638. package/src/TextArea/TextArea.doc.mjs +21 -0
  639. package/src/TextArea/TextArea.test.tsx +32 -1
  640. package/src/TextArea/TextArea.tsx +27 -26
  641. package/src/TextInput/TextInput.doc.mjs +21 -0
  642. package/src/TextInput/TextInput.test.tsx +150 -0
  643. package/src/TextInput/TextInput.tsx +28 -25
  644. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  645. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  646. package/src/Thumbnail/Thumbnail.tsx +142 -42
  647. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  648. package/src/TimeInput/TimeInput.doc.mjs +21 -0
  649. package/src/TimeInput/TimeInput.test.tsx +99 -1
  650. package/src/TimeInput/TimeInput.tsx +43 -31
  651. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  652. package/src/Timestamp/Timestamp.test.tsx +32 -0
  653. package/src/Timestamp/Timestamp.tsx +28 -8
  654. package/src/Toast/useToast.tsx +7 -8
  655. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  656. package/src/Token/Token.test.tsx +21 -15
  657. package/src/Token/Token.tsx +31 -14
  658. package/src/Token/index.ts +1 -1
  659. package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
  660. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  661. package/src/Tokenizer/Tokenizer.tsx +30 -6
  662. package/src/Tooltip/Tooltip.test.tsx +46 -0
  663. package/src/Tooltip/useTooltip.tsx +20 -0
  664. package/src/TopNav/TopNav.test.tsx +125 -1
  665. package/src/TopNav/TopNavHeading.tsx +24 -8
  666. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  667. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  668. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  669. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  670. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  671. package/src/TopNav/TopNavMenu.tsx +83 -5
  672. package/src/TreeList/TreeList.doc.mjs +28 -0
  673. package/src/TreeList/TreeList.test.tsx +272 -0
  674. package/src/TreeList/TreeList.tsx +23 -2
  675. package/src/TreeList/TreeListBranches.tsx +24 -8
  676. package/src/TreeList/TreeListItem.tsx +84 -22
  677. package/src/TreeList/TreeListTypes.ts +27 -1
  678. package/src/TreeList/index.ts +2 -2
  679. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  680. package/src/Typeahead/Typeahead.doc.mjs +13 -0
  681. package/src/Typeahead/Typeahead.test.tsx +50 -0
  682. package/src/Typeahead/Typeahead.tsx +11 -1
  683. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  684. package/src/__tests__/inputWidthContract.test.tsx +62 -0
  685. package/src/authoring/doc.ts +1 -3
  686. package/src/doc-mjs.d.ts +19 -0
  687. package/src/docs-types.ts +5 -0
  688. package/src/hooks/computeOverflow.test.ts +422 -0
  689. package/src/hooks/computeOverflow.ts +290 -0
  690. package/src/hooks/index.ts +8 -0
  691. package/src/hooks/isRtlElement.ts +27 -0
  692. package/src/hooks/useDevWarning.test.tsx +45 -0
  693. package/src/hooks/useDevWarning.ts +54 -0
  694. package/src/hooks/useGridFocus.doc.mjs +3 -3
  695. package/src/hooks/useGridFocus.test.tsx +41 -0
  696. package/src/hooks/useGridFocus.ts +21 -10
  697. package/src/hooks/useInputStatusIcon.test.tsx +162 -0
  698. package/src/hooks/useInputStatusIcon.tsx +224 -0
  699. package/src/hooks/useListFocus.doc.mjs +25 -3
  700. package/src/hooks/useListFocus.test.tsx +153 -1
  701. package/src/hooks/useListFocus.ts +102 -9
  702. package/src/hooks/useOverflow.test.ts +96 -4
  703. package/src/hooks/useOverflow.ts +74 -33
  704. package/src/i18n/InternationalizationContext.ts +4 -0
  705. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  706. package/src/i18n/InternationalizationProvider.tsx +12 -2
  707. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  708. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  709. package/src/i18n/getLocaleDirection.ts +29 -0
  710. package/src/i18n/index.ts +6 -0
  711. package/src/i18n/resolve.ts +9 -21
  712. package/src/i18n/useDirection.ts +29 -0
  713. package/src/reset.css +0 -26
  714. package/src/reset.test.ts +60 -0
  715. package/src/theme/Theme.tsx +11 -14
  716. package/src/theme/derivedVarRegistry.test.ts +1 -0
  717. package/src/theme/derivedVarRegistry.ts +6 -0
  718. package/src/theme/generateThemeRules.test.ts +107 -0
  719. package/src/theme/generateThemeRules.ts +56 -0
  720. package/src/theme/hct.ts +1 -1
  721. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  722. package/src/utils/devWarning.test.ts +56 -0
  723. package/src/utils/devWarning.ts +102 -0
  724. package/src/utils/index.ts +8 -0
  725. package/src/utils/plainDate.test.ts +46 -6
  726. package/src/utils/plainDate.ts +69 -3
  727. package/src/utils/rtlStyles.ts +27 -0
  728. package/src/utils/types.ts +14 -0
@@ -4,16 +4,20 @@
4
4
 
5
5
  /**
6
6
  * @file useListFocus.ts
7
- * @input Uses React useCallback, useRef, useIsomorphicLayoutEffect
7
+ * @input Uses React useCallback, useRef, useIsomorphicLayoutEffect,
8
+ * isRtlElement
8
9
  * @output Exports useListFocus hook for linear list keyboard navigation
9
10
  * @position Core hook; used by TabMenu for dropdown menu navigation, Toolbar
10
11
  * for roving tabindex, ButtonGroup, ContextMenu, NavHeadingMenu, and more.
12
+ * Auto-detects RTL from the container's computed direction so horizontal
13
+ * arrow keys follow visual direction (WCAG 1.3.2).
11
14
  *
12
15
  * SYNC: When modified, update:
13
16
  * - /packages/core/src/hooks/index.ts
14
17
  */
15
18
 
16
19
  import {useCallback, useRef} from 'react';
20
+ import {isRtlElement} from './isRtlElement';
17
21
  import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
18
22
 
19
23
  /**
@@ -34,6 +38,25 @@ export interface UseListFocusOptions {
34
38
  */
35
39
  itemSelector?: string;
36
40
 
41
+ /**
42
+ * Selector identifying a list boundary — used to scope a list that contains
43
+ * *nested* lists of the same kind (e.g. a menu with submenu flyouts).
44
+ *
45
+ * Overlays like submenu flyouts render inline (native popover, not a
46
+ * portal), so a nested list's items are DOM descendants of the parent list.
47
+ * Without scoping, the parent's `querySelectorAll` sweeps the nested items
48
+ * into its roving order (leaving hidden items `.focus()` can't land on), and
49
+ * key events from the nested list bubble into the parent's handler (moving
50
+ * focus twice). When set, `useListFocus`:
51
+ * - counts an item as its own only when the item's nearest
52
+ * `boundarySelector` ancestor is this list's container, and
53
+ * - ignores key events whose nearest `boundarySelector` ancestor is not
54
+ * this list's container (i.e. they originated in a nested list).
55
+ *
56
+ * Typically `'[role="menu"]'` for menus. Omit for flat lists.
57
+ */
58
+ boundarySelector?: string;
59
+
37
60
  /**
38
61
  * Whether arrow navigation wraps around at the ends.
39
62
  * @default true
@@ -62,7 +85,12 @@ export interface UseListFocusOptions {
62
85
  * Whether the list is in a right-to-left context. When true, ArrowLeft and
63
86
  * ArrowRight are swapped so horizontal navigation follows visual direction.
64
87
  * Only affects horizontal (`'horizontal'`/`'both'`) navigation.
65
- * @default false
88
+ *
89
+ * When omitted, the direction is auto-detected from the container's computed
90
+ * `direction` (read lazily on keydown, only for horizontal arrow keys), so
91
+ * lists inside `dir="rtl"` subtrees flip automatically. Pass an explicit
92
+ * boolean to override detection.
93
+ * @default undefined (auto-detect from the container)
66
94
  */
67
95
  isRtl?: boolean;
68
96
 
@@ -128,6 +156,23 @@ export interface UseListFocusReturn<T extends HTMLElement = HTMLElement> {
128
156
  * Focus the last enabled item. Returns true when an item was focused.
129
157
  */
130
158
  focusLast: () => boolean;
159
+
160
+ /**
161
+ * Whether a key event belongs to this list level (vs. a nested list that
162
+ * shares the same `boundarySelector`). Useful when a consumer wraps
163
+ * `handleKeyDown` with extra behavior (Enter/Space activation, typeahead)
164
+ * and must apply it only to events this level owns. Always true when no
165
+ * `boundarySelector` is configured.
166
+ */
167
+ ownsEvent: (e: React.KeyboardEvent) => boolean;
168
+
169
+ /**
170
+ * The current, in-DOM-order list of this level's focusable items (already
171
+ * scoped by `boundarySelector`). Exposed so consumers can build typeahead
172
+ * targets from the same source of truth as roving focus, rather than
173
+ * re-querying and re-filtering.
174
+ */
175
+ getItems: () => HTMLElement[];
131
176
  }
132
177
 
133
178
  // Text-editing inputs whose caret must not be hijacked by arrow navigation.
@@ -271,11 +316,12 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
271
316
  ): UseListFocusReturn<T> {
272
317
  const {
273
318
  itemSelector = '[role="menuitem"]',
319
+ boundarySelector,
274
320
  wrap = true,
275
321
  onEscape,
276
322
  orientation = 'vertical',
277
323
  hasHomeEnd = true,
278
- isRtl = false,
324
+ isRtl,
279
325
  hasRovingTabIndex = false,
280
326
  hasCaretGuard = false,
281
327
  } = options;
@@ -299,13 +345,43 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
299
345
  * Get all focusable items in the list.
300
346
  */
301
347
  const getItems = useCallback((): HTMLElement[] => {
302
- if (!listRef.current) {
348
+ const listEl = listRef.current;
349
+ if (!listEl) {
303
350
  return [];
304
351
  }
305
- return Array.from(
306
- listRef.current.querySelectorAll<HTMLElement>(itemSelector),
352
+ const matched = Array.from(
353
+ listEl.querySelectorAll<HTMLElement>(itemSelector),
307
354
  );
308
- }, [itemSelector]);
355
+ // When a boundary is set, keep only items that belong to THIS list level —
356
+ // i.e. whose nearest boundary ancestor is our own container. This excludes
357
+ // items inside nested lists (e.g. inline submenu flyouts) that would
358
+ // otherwise be swept in by querySelectorAll.
359
+ if (!boundarySelector) {
360
+ return matched;
361
+ }
362
+ return matched.filter(el => el.closest(boundarySelector) === listEl);
363
+ }, [itemSelector, boundarySelector]);
364
+
365
+ /**
366
+ * Whether a key event belongs to this list level rather than a nested list.
367
+ * With a boundary set, an event that originated inside a nested boundary
368
+ * (e.g. a submenu flyout) has bubbled up to us and must be ignored so we
369
+ * don't double-handle navigation. Without a boundary, every event is ours.
370
+ */
371
+ const ownsEvent = useCallback(
372
+ (e: React.KeyboardEvent): boolean => {
373
+ const listEl = listRef.current;
374
+ if (!listEl || !boundarySelector) {
375
+ return true;
376
+ }
377
+ const target = e.target as HTMLElement | null;
378
+ if (!target) {
379
+ return true;
380
+ }
381
+ return target.closest(boundarySelector) === listEl;
382
+ },
383
+ [boundarySelector],
384
+ );
309
385
 
310
386
  /**
311
387
  * Find the next enabled item index from `start`, moving by `step`, optionally
@@ -473,6 +549,13 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
473
549
  return;
474
550
  }
475
551
 
552
+ // Ignore events that bubbled up from a nested list (e.g. a submenu
553
+ // flyout, which renders inline inside this container). That level owns
554
+ // and already handled them; re-handling here would move focus twice.
555
+ if (!ownsEvent(e)) {
556
+ return;
557
+ }
558
+
476
559
  // Escape is handled regardless of orientation. Preserve the historical
477
560
  // behavior of always consuming Escape here (preventDefault) so consumers
478
561
  // that relied on it are unaffected.
@@ -486,11 +569,18 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
486
569
  const vertical = orientation === 'vertical' || orientation === 'both';
487
570
 
488
571
  // Resolve which keys advance vs retreat, honoring RTL for horizontal.
572
+ // Direction is resolved lazily — getComputedStyle runs only when a
573
+ // horizontal arrow key is actually pressed (SSR-safe, no layout thrash
574
+ // on unrelated keys) — and an explicit `isRtl` always wins.
489
575
  const nextKeys: string[] = [];
490
576
  const prevKeys: string[] = [];
491
577
  if (horizontal) {
492
- nextKeys.push(isRtl ? 'ArrowLeft' : 'ArrowRight');
493
- prevKeys.push(isRtl ? 'ArrowRight' : 'ArrowLeft');
578
+ const rtl =
579
+ e.key === 'ArrowLeft' || e.key === 'ArrowRight'
580
+ ? (isRtl ?? isRtlElement(listRef.current))
581
+ : false;
582
+ nextKeys.push(rtl ? 'ArrowLeft' : 'ArrowRight');
583
+ prevKeys.push(rtl ? 'ArrowRight' : 'ArrowLeft');
494
584
  }
495
585
  if (vertical) {
496
586
  nextKeys.push('ArrowDown');
@@ -553,6 +643,7 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
553
643
  focusFirst,
554
644
  focusLast,
555
645
  onEscape,
646
+ ownsEvent,
556
647
  ],
557
648
  );
558
649
 
@@ -563,5 +654,7 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
563
654
  focusItem,
564
655
  focusFirst,
565
656
  focusLast,
657
+ ownsEvent,
658
+ getItems,
566
659
  };
567
660
  }
@@ -14,12 +14,15 @@ function mockContainer(width: number): HTMLElement {
14
14
  function mockMeasure(
15
15
  itemWidths: number[],
16
16
  indicatorWidth?: number,
17
+ itemHeight = 0,
17
18
  ): HTMLElement {
18
- const children: {offsetWidth: number}[] = itemWidths.map(w => ({
19
- offsetWidth: w,
20
- }));
19
+ const children: {offsetWidth: number; offsetHeight: number}[] =
20
+ itemWidths.map(w => ({
21
+ offsetWidth: w,
22
+ offsetHeight: itemHeight,
23
+ }));
21
24
  if (indicatorWidth != null) {
22
- children.push({offsetWidth: indicatorWidth});
25
+ children.push({offsetWidth: indicatorWidth, offsetHeight: itemHeight});
23
26
  }
24
27
  return {children} as unknown as HTMLElement;
25
28
  }
@@ -332,6 +335,95 @@ describe('useOverflow', () => {
332
335
  });
333
336
  });
334
337
 
338
+ describe('useOverflow with maxVisibleItems (cap)', () => {
339
+ it('caps visible items even when they all fit', () => {
340
+ const {result} = renderHook(() =>
341
+ useOverflow(5, {gap: 10, maxVisibleItems: 3}),
342
+ );
343
+
344
+ act(() => {
345
+ result.current.measureRef(mockMeasure([50, 50, 50, 50, 50], 30));
346
+ result.current.containerRef(mockContainer(10000));
347
+ });
348
+
349
+ expect(result.current.visibleCount).toBe(3);
350
+ expect(result.current.hasOverflow).toBe(true);
351
+ });
352
+
353
+ it('cap does not raise a fit-limited count', () => {
354
+ const {result} = renderHook(() =>
355
+ useOverflow(4, {gap: 10, maxVisibleItems: 4}),
356
+ );
357
+
358
+ act(() => {
359
+ result.current.measureRef(mockMeasure([50, 50, 50, 50], 30));
360
+ result.current.containerRef(mockContainer(150));
361
+ });
362
+
363
+ expect(result.current.visibleCount).toBe(2);
364
+ });
365
+
366
+ it('min wins when maxVisibleItems < minVisibleItems and warns in dev', () => {
367
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
368
+ const {result} = renderHook(() =>
369
+ useOverflow(5, {gap: 10, minVisibleItems: 3, maxVisibleItems: 1}),
370
+ );
371
+
372
+ act(() => {
373
+ result.current.measureRef(mockMeasure([50, 50, 50, 50, 50], 30));
374
+ result.current.containerRef(mockContainer(10000));
375
+ });
376
+
377
+ expect(result.current.visibleCount).toBe(3);
378
+ expect(warn).toHaveBeenCalled();
379
+ warn.mockRestore();
380
+ });
381
+ });
382
+
383
+ describe('useOverflow with maxRows (multi-row)', () => {
384
+ it('exposes rows and rowHeight', () => {
385
+ const {result} = renderHook(() => useOverflow(6, {gap: 10, maxRows: 2}));
386
+
387
+ act(() => {
388
+ result.current.measureRef(mockMeasure([50, 50, 50, 50, 50, 50], 40, 24));
389
+ result.current.containerRef(mockContainer(170));
390
+ });
391
+
392
+ // 3 items per row (170), 2 rows → all 6 fit
393
+ expect(result.current.visibleCount).toBe(6);
394
+ expect(result.current.rows).toBe(2);
395
+ expect(result.current.rowHeight).toBe(24);
396
+ expect(result.current.hasOverflow).toBe(false);
397
+ });
398
+
399
+ it('collapses items beyond maxRows into the indicator', () => {
400
+ const {result} = renderHook(() => useOverflow(8, {gap: 10, maxRows: 2}));
401
+
402
+ act(() => {
403
+ result.current.measureRef(
404
+ mockMeasure([50, 50, 50, 50, 50, 50, 50, 50], 40, 24),
405
+ );
406
+ result.current.containerRef(mockContainer(170));
407
+ });
408
+
409
+ expect(result.current.visibleCount).toBe(5);
410
+ expect(result.current.rows).toBe(2);
411
+ expect(result.current.hasOverflow).toBe(true);
412
+ });
413
+
414
+ it('maxRows=1 matches single-line behavior', () => {
415
+ const {result} = renderHook(() => useOverflow(4, {gap: 10, maxRows: 1}));
416
+
417
+ act(() => {
418
+ result.current.measureRef(mockMeasure([50, 50, 50, 50], 30, 24));
419
+ result.current.containerRef(mockContainer(150));
420
+ });
421
+
422
+ expect(result.current.visibleCount).toBe(2);
423
+ expect(result.current.rows).toBe(1);
424
+ });
425
+ });
426
+
335
427
  describe('useOverflow with behavior=observeParent', () => {
336
428
  function mockContainerWithParent(
337
429
  parentWidth: number,
@@ -10,15 +10,20 @@
10
10
  *
11
11
  * Measures children rendered in a hidden container to determine how many fit
12
12
  * in the available width, without flickering. Uses ResizeObserver to react
13
- * to container size changes.
13
+ * to container size changes. Supports an optional item cap (`maxVisibleItems`)
14
+ * and bounded multi-row wrapping (`maxRows`); the fit/clamp/row-packing math
15
+ * lives in the pure `computeOverflow` helper.
14
16
  *
15
17
  * SYNC: When modified, update:
16
18
  * - /packages/core/src/hooks/index.ts
19
+ * - /packages/core/src/hooks/computeOverflow.ts (the pure computation)
17
20
  */
18
21
 
19
22
  import {useState, useCallback, useRef} from 'react';
20
23
  import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
21
24
  import {observeResize, unobserveResize} from '../utils/sharedResizeObserver';
25
+ import {computeOverflow} from './computeOverflow';
26
+ import {useDevWarning} from './useDevWarning';
22
27
 
23
28
  export interface UseOverflowOptions {
24
29
  /**
@@ -33,6 +38,23 @@ export interface UseOverflowOptions {
33
38
  */
34
39
  minVisibleItems?: number;
35
40
 
41
+ /**
42
+ * Maximum number of items to ever show, even if they all fit. The ceiling
43
+ * partner to `minVisibleItems`. `undefined` means no cap. When it is less
44
+ * than `minVisibleItems`, the floor wins and a dev-only warning is emitted.
45
+ * @default undefined
46
+ */
47
+ maxVisibleItems?: number;
48
+
49
+ /**
50
+ * Wrap items across up to this many rows before collapsing the rest into the
51
+ * overflow indicator. `undefined` (or `1`) keeps the single-line behavior.
52
+ * A number, not a boolean: unbounded wrapping is a plain flex-wrap layout,
53
+ * not overflow collapse. Assumes uniform row height.
54
+ * @default undefined
55
+ */
56
+ maxRows?: number;
57
+
36
58
  /**
37
59
  * Which end to collapse items from.
38
60
  * @default 'end'
@@ -61,6 +83,10 @@ export interface UseOverflowReturn {
61
83
  visibleCount: number;
62
84
  /** Whether any items are overflowing */
63
85
  hasOverflow: boolean;
86
+ /** Number of rows the visible items occupy (1 for the single-line path) */
87
+ rows: number;
88
+ /** Measured max item height in pixels; used to size the multi-row container */
89
+ rowHeight: number;
64
90
  }
65
91
 
66
92
  /**
@@ -88,13 +114,25 @@ export function useOverflow(
88
114
  const {
89
115
  gap = 0,
90
116
  minVisibleItems = 0,
117
+ maxVisibleItems,
118
+ maxRows,
91
119
  collapseFrom = 'end',
92
120
  behavior = 'observeSelf',
93
121
  } = options;
94
122
 
123
+ useDevWarning(
124
+ 'useOverflow',
125
+ `maxVisibleItems (${maxVisibleItems}) is less than ` +
126
+ `minVisibleItems (${minVisibleItems}); the floor wins and ` +
127
+ `minVisibleItems items will be shown.`,
128
+ maxVisibleItems != null && maxVisibleItems < minVisibleItems,
129
+ );
130
+
95
131
  const observeParent = behavior === 'observeParent';
96
132
 
97
133
  const [visibleCount, setVisibleCount] = useState(itemCount);
134
+ const [rows, setRows] = useState(1);
135
+ const [rowHeight, setRowHeight] = useState(0);
98
136
  const containerElRef = useRef<HTMLElement | null>(null);
99
137
  const measureElRef = useRef<HTMLElement | null>(null);
100
138
  const observedElRef = useRef<HTMLElement | null>(null);
@@ -134,44 +172,45 @@ export function useOverflow(
134
172
  if (children.length === 0) {
135
173
  // eslint-disable-next-line @eslint-react/set-state-in-effect -- overflow count is derived from measured DOM widths
136
174
  setVisibleCount(0);
175
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- derived from measured DOM
176
+ setRows(0);
137
177
  return;
138
178
  }
139
179
 
140
- // Collect widths of all children
141
180
  const widths = children.map(child => child.offsetWidth);
142
-
143
- // Determine how many items fit
144
- let totalWidth = 0;
145
- let count = 0;
146
-
147
- const orderedWidths =
148
- collapseFrom === 'end' ? widths : [...widths].reverse();
149
-
150
- for (let i = 0; i < orderedWidths.length; i++) {
151
- const itemWidth = orderedWidths[i];
152
- const gapWidth = i > 0 ? gap : 0;
153
- const candidateWidth = totalWidth + itemWidth + gapWidth;
154
-
155
- // If this isn't the last item, we need to reserve space for the indicator
156
- const isLastItem = i === orderedWidths.length - 1;
157
- const reservedWidth = isLastItem
158
- ? 0
159
- : indicatorWidth + (count > 0 || indicatorWidth > 0 ? gap : 0);
160
-
161
- if (
162
- candidateWidth + reservedWidth > availableWidth &&
163
- count >= minVisibleItems
164
- ) {
165
- break;
166
- }
167
-
168
- totalWidth = candidateWidth;
169
- count++;
170
- }
181
+ const measuredRowHeight = children.reduce(
182
+ (max, child) => Math.max(max, child.offsetHeight || 0),
183
+ 0,
184
+ );
185
+
186
+ const {visibleCount: nextVisible, rows: nextRows} = computeOverflow({
187
+ widths,
188
+ gap,
189
+ availableWidth,
190
+ indicatorWidth,
191
+ minVisibleItems,
192
+ maxVisibleItems,
193
+ maxRows,
194
+ collapseFrom,
195
+ });
171
196
 
172
197
  // eslint-disable-next-line @eslint-react/set-state-in-effect -- overflow count is derived from measured DOM widths
173
- setVisibleCount(Math.max(Math.min(count, itemCount), minVisibleItems));
174
- }, [itemCount, gap, minVisibleItems, collapseFrom, observeParent]);
198
+ setVisibleCount(nextVisible);
199
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- derived from measured DOM
200
+ setRows(prev => (prev === nextRows ? prev : nextRows));
201
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- derived from measured DOM
202
+ setRowHeight(prev =>
203
+ prev === measuredRowHeight ? prev : measuredRowHeight,
204
+ );
205
+ }, [
206
+ itemCount,
207
+ gap,
208
+ minVisibleItems,
209
+ maxVisibleItems,
210
+ maxRows,
211
+ collapseFrom,
212
+ observeParent,
213
+ ]);
175
214
 
176
215
  const containerRef = useCallback(
177
216
  (el: HTMLElement | null) => {
@@ -217,5 +256,7 @@ export function useOverflow(
217
256
  measureRef,
218
257
  visibleCount,
219
258
  hasOverflow,
259
+ rows,
260
+ rowHeight,
220
261
  };
221
262
  }
@@ -15,6 +15,8 @@
15
15
  * SYNC: When modified, update these files to stay in sync:
16
16
  * - /packages/core/src/i18n/InternationalizationProvider.tsx
17
17
  * - /packages/core/src/i18n/t.client.ts
18
+ * - /packages/core/src/i18n/useDirection.ts
19
+ * - /packages/core/src/i18n/getLocaleDirection.ts
18
20
  * - /packages/core/src/i18n/index.ts
19
21
  */
20
22
 
@@ -23,6 +25,7 @@ import type {Locale, MessagesByLocale, Overrides} from './types';
23
25
 
24
26
  export interface InternationalizationContextValue {
25
27
  locale: Locale;
28
+ direction: 'ltr' | 'rtl';
26
29
  messages: MessagesByLocale;
27
30
  overrides?: Overrides;
28
31
  }
@@ -34,6 +37,7 @@ export interface InternationalizationContextValue {
34
37
  export const InternationalizationContext =
35
38
  createContext<InternationalizationContextValue>({
36
39
  locale: 'en',
40
+ direction: 'ltr',
37
41
  messages: {},
38
42
  });
39
43
  InternationalizationContext.displayName = 'InternationalizationContext';
@@ -20,7 +20,29 @@ export const docs = {
20
20
  ],
21
21
  usage: {
22
22
  description:
23
- "Wraps your app to set the active locale and (optionally) merge additional translation catalogs + per-locale overrides. Astryx components inside the subtree resolve their strings against this context. If no provider is present, components fall back to the shipped English defaults.",
23
+ 'Wraps your app to set the active locale and (optionally) merge additional translation catalogs + per-locale overrides. Astryx components inside the subtree resolve their strings against this context. If no provider is present, components fall back to the shipped English defaults.',
24
+ bestPractices: [
25
+ {
26
+ guidance: true,
27
+ description:
28
+ 'Use shipped Astryx locale catalogs from `@astryxdesign/core/locales/*` when one exists for your target locale.',
29
+ },
30
+ {
31
+ guidance: true,
32
+ description:
33
+ 'Use a same-shape local catalog only when Astryx has not shipped that locale yet or you are testing in-progress translations.',
34
+ },
35
+ {
36
+ guidance: true,
37
+ description:
38
+ 'Use real BCP 47 tags such as `fr`, `pt-BR`, or `ar`; regional locales fall back to their base language before English.',
39
+ },
40
+ {
41
+ guidance: false,
42
+ description:
43
+ 'Cast custom catalog maps to `any`; the i18n package exports `MessagesByLocale` and `Catalog` for local catalog typing.',
44
+ },
45
+ ],
24
46
  },
25
47
  props: [
26
48
  {
@@ -35,7 +57,7 @@ export const docs = {
35
57
  type: 'MessagesByLocale',
36
58
  required: false,
37
59
  description:
38
- 'Optional map of BCP 47 tag to translation catalog. The shipped "en" catalog is always available and does not need to be listed here.',
60
+ 'Optional map of BCP 47 tag to translation catalog. Import shipped catalogs from `@astryxdesign/core/locales/*`; the shipped "en" catalog is always available and does not need to be listed here.',
39
61
  },
40
62
  {
41
63
  name: 'overrides',
@@ -51,6 +73,59 @@ export const docs = {
51
73
  description: 'Content to render with the internationalization provider.',
52
74
  },
53
75
  ],
76
+ examples: [
77
+ {
78
+ label: 'Load a shipped Astryx locale catalog',
79
+ code: `import type {ReactNode} from 'react';
80
+ import {InternationalizationProvider} from '@astryxdesign/core/i18n';
81
+ import frFR from '@astryxdesign/core/locales/fr-FR.json';
82
+
83
+ export function AppI18n({children}: {children: ReactNode}) {
84
+ return (
85
+ <InternationalizationProvider locale="fr-FR" messages={{'fr-FR': frFR}}>
86
+ {children}
87
+ </InternationalizationProvider>
88
+ );
89
+ }`,
90
+ },
91
+ {
92
+ label: 'Override one Astryx string',
93
+ code: `import type {ReactNode} from 'react';
94
+ import {InternationalizationProvider} from '@astryxdesign/core/i18n';
95
+
96
+ export function AppI18n({children}: {children: ReactNode}) {
97
+ return (
98
+ <InternationalizationProvider
99
+ locale="en"
100
+ overrides={{
101
+ en: {'@astryx.selector.placeholder': 'Choose...'},
102
+ }}
103
+ >
104
+ {children}
105
+ </InternationalizationProvider>
106
+ );
107
+ }`,
108
+ },
109
+ {
110
+ label: 'Provide a local fallback catalog',
111
+ code: `import type {ReactNode} from 'react';
112
+ import {
113
+ InternationalizationProvider,
114
+ type MessagesByLocale,
115
+ } from '@astryxdesign/core/i18n';
116
+ import ptBR from './locales/pt-BR.json';
117
+
118
+ const messages: MessagesByLocale = {'pt-BR': ptBR};
119
+
120
+ export function AppI18n({children}: {children: ReactNode}) {
121
+ return (
122
+ <InternationalizationProvider locale="pt-BR" messages={messages}>
123
+ {children}
124
+ </InternationalizationProvider>
125
+ );
126
+ }`,
127
+ },
128
+ ],
54
129
  };
55
130
 
56
131
  /** @type {import('../docs-types').TranslationDoc} */
@@ -60,6 +135,28 @@ export const docsDense = {
60
135
  usage: {
61
136
  description:
62
137
  'Wraps app to set active locale and (optionally) merge translation catalogs + per-locale overrides. Astryx components resolve strings against this context; missing keys fall back to shipped English.',
138
+ bestPractices: [
139
+ {
140
+ guidance: true,
141
+ description:
142
+ 'Use shipped Astryx locale catalogs from `@astryxdesign/core/locales/*` when one exists for the target locale.',
143
+ },
144
+ {
145
+ guidance: true,
146
+ description:
147
+ 'Use a same-shape local catalog only when Astryx has not shipped that locale yet or when testing in-progress translations.',
148
+ },
149
+ {
150
+ guidance: true,
151
+ description:
152
+ 'Use real BCP 47 tags like `fr`, `pt-BR`, or `ar`; regional locales fall back to base language before English.',
153
+ },
154
+ {
155
+ guidance: false,
156
+ description:
157
+ 'Cast custom catalog maps to `any`; the i18n package exports `MessagesByLocale` and `Catalog` for local catalog typing.',
158
+ },
159
+ ],
63
160
  },
64
161
  propDescriptions: {
65
162
  locale:
@@ -21,6 +21,7 @@
21
21
 
22
22
  import {useMemo, type ReactNode} from 'react';
23
23
  import {InternationalizationContext} from './InternationalizationContext';
24
+ import {getLocaleDirection} from './getLocaleDirection';
24
25
  import type {Locale, MessagesByLocale, Overrides} from './types';
25
26
 
26
27
  export interface InternationalizationProviderProps {
@@ -55,6 +56,13 @@ export interface InternationalizationProviderProps {
55
56
  * ```
56
57
  */
57
58
  overrides?: Overrides;
59
+ /**
60
+ * Optional explicit text direction override. When omitted, direction is derived
61
+ * from `locale` via `Intl.Locale.getTextInfo()`. Provide this to force a
62
+ * direction (e.g. RTL layout testing under an English catalog) or to skip the
63
+ * derivation when you already know the direction.
64
+ */
65
+ dir?: 'ltr' | 'rtl';
58
66
  children: ReactNode;
59
67
  }
60
68
 
@@ -66,11 +74,13 @@ export function InternationalizationProvider({
66
74
  locale,
67
75
  messages,
68
76
  overrides,
77
+ dir,
69
78
  children,
70
79
  }: InternationalizationProviderProps) {
80
+ const direction = dir ?? getLocaleDirection(locale);
71
81
  const value = useMemo(
72
- () => ({locale, messages: messages ?? {}, overrides}),
73
- [locale, messages, overrides],
82
+ () => ({locale, direction, messages: messages ?? {}, overrides}),
83
+ [locale, direction, messages, overrides],
74
84
  );
75
85
  return (
76
86
  <InternationalizationContext value={value}>