@astryxdesign/core 0.3.0 → 0.4.0

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 (551) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +10 -2
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +22 -3
  5. package/dist/AppShell/AppShell.d.ts +2 -2
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +40 -9
  8. package/dist/AspectRatio/AspectRatio.d.ts +13 -0
  9. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js +9 -0
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +33 -20
  13. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
  15. package/dist/Banner/Banner.d.ts.map +1 -1
  16. package/dist/Banner/Banner.js +15 -14
  17. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  18. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  19. package/dist/Breadcrumbs/index.d.ts +2 -1
  20. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  21. package/dist/Breadcrumbs/index.js +1 -0
  22. package/dist/Button/Button.d.ts.map +1 -1
  23. package/dist/Button/Button.js +11 -15
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +2 -1
  26. package/dist/Calendar/styles.d.ts +0 -2
  27. package/dist/Calendar/styles.d.ts.map +1 -1
  28. package/dist/Calendar/styles.js +0 -2
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +8 -12
  31. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  32. package/dist/Chat/ChatDictationButton.js +2 -1
  33. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  34. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  35. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  36. package/dist/Chat/ChatSendButton.js +4 -3
  37. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  38. package/dist/Chat/ChatToolCalls.js +17 -17
  39. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  40. package/dist/Chat/useTriggerMenu.js +2 -6
  41. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  43. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  44. package/dist/ClickableCard/ClickableCard.js +3 -11
  45. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  46. package/dist/CodeBlock/CodeBlock.js +84 -67
  47. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  48. package/dist/Collapsible/Collapsible.js +35 -15
  49. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  52. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  53. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  54. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.js +35 -33
  56. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  57. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  58. package/dist/ContextMenu/ContextMenu.js +1 -1
  59. package/dist/ContextMenu/index.d.ts +2 -1
  60. package/dist/ContextMenu/index.d.ts.map +1 -1
  61. package/dist/ContextMenu/index.js +1 -0
  62. package/dist/DateInput/DateInput.d.ts +9 -2
  63. package/dist/DateInput/DateInput.d.ts.map +1 -1
  64. package/dist/DateInput/DateInput.js +24 -23
  65. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  66. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  67. package/dist/DateRangeInput/DateRangeInput.js +11 -16
  68. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  69. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  70. package/dist/DateTimeInput/DateTimeInput.js +22 -17
  71. package/dist/Dialog/Dialog.d.ts.map +1 -1
  72. package/dist/Dialog/Dialog.js +4 -4
  73. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  74. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  75. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  76. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  77. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  78. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  79. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  80. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  81. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  82. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  83. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  84. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  85. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  86. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  87. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  88. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  89. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  90. package/dist/DropdownMenu/index.d.ts +2 -1
  91. package/dist/DropdownMenu/index.d.ts.map +1 -1
  92. package/dist/DropdownMenu/index.js +4 -0
  93. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  94. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  95. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  96. package/dist/EmptyState/EmptyState.js +9 -5
  97. package/dist/Field/InputClearButton.d.ts +16 -3
  98. package/dist/Field/InputClearButton.d.ts.map +1 -1
  99. package/dist/Field/InputClearButton.js +15 -4
  100. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  101. package/dist/HoverCard/useHoverCard.js +3 -19
  102. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  103. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  104. package/dist/Indicator/CheckIndicator.js +155 -0
  105. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  106. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  107. package/dist/Indicator/CheckboxIndicator.js +173 -0
  108. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  109. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  110. package/dist/Indicator/RadioIndicator.js +137 -0
  111. package/dist/Indicator/index.d.ts +24 -0
  112. package/dist/Indicator/index.d.ts.map +1 -0
  113. package/dist/Indicator/index.js +26 -0
  114. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  115. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  116. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  117. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  118. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  119. package/dist/Indicator/indicatorRegistry.js +93 -0
  120. package/dist/Indicator/types.d.ts +167 -0
  121. package/dist/Indicator/types.d.ts.map +1 -0
  122. package/dist/Indicator/types.js +1 -0
  123. package/dist/Indicator/useIndicator.d.ts +18 -0
  124. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  125. package/dist/Indicator/useIndicator.js +30 -0
  126. package/dist/Item/Item.d.ts.map +1 -1
  127. package/dist/Item/Item.js +4 -8
  128. package/dist/Layer/useLayer.d.ts +14 -0
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +25 -2
  131. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  132. package/dist/Lightbox/Lightbox.js +56 -53
  133. package/dist/Link/Link.d.ts.map +1 -1
  134. package/dist/Link/Link.js +4 -5
  135. package/dist/MobileNav/MobileNav.js +8 -8
  136. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  137. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  138. package/dist/MoreMenu/MoreMenu.js +4 -0
  139. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  140. package/dist/MultiSelector/MultiSelector.js +78 -75
  141. package/dist/NumberInput/NumberInput.d.ts +27 -1
  142. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  143. package/dist/NumberInput/NumberInput.js +230 -42
  144. package/dist/Outline/Outline.d.ts.map +1 -1
  145. package/dist/Outline/Outline.js +2 -3
  146. package/dist/Pagination/Pagination.d.ts.map +1 -1
  147. package/dist/Pagination/Pagination.js +61 -63
  148. package/dist/Popover/Popover.d.ts.map +1 -1
  149. package/dist/Popover/Popover.js +6 -8
  150. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  151. package/dist/PowerSearch/PowerSearch.js +1 -1
  152. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  153. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  154. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  155. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  156. package/dist/ProgressBar/ProgressBar.js +96 -6
  157. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  158. package/dist/RadioList/RadioListItem.js +29 -84
  159. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  160. package/dist/Resizable/ResizeHandle.js +2 -3
  161. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  162. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  163. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  164. package/dist/SelectableCard/SelectableCard.js +3 -11
  165. package/dist/Selector/Selector.d.ts +2 -1
  166. package/dist/Selector/Selector.d.ts.map +1 -1
  167. package/dist/Selector/Selector.js +164 -94
  168. package/dist/Selector/hooks.d.ts +18 -6
  169. package/dist/Selector/hooks.d.ts.map +1 -1
  170. package/dist/Selector/hooks.js +57 -40
  171. package/dist/SideNav/SideNav.d.ts.map +1 -1
  172. package/dist/SideNav/SideNav.js +1 -1
  173. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  174. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  175. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  176. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  177. package/dist/SideNav/SideNavHeading.js +56 -20
  178. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  179. package/dist/SideNav/SideNavItem.js +28 -22
  180. package/dist/Stack/stack.stylex.d.ts +3 -3
  181. package/dist/Switch/Switch.js +11 -10
  182. package/dist/TabList/Tab.d.ts.map +1 -1
  183. package/dist/TabList/Tab.js +2 -3
  184. package/dist/TabList/TabMenu.d.ts.map +1 -1
  185. package/dist/TabList/TabMenu.js +41 -19
  186. package/dist/Table/BaseTable.d.ts.map +1 -1
  187. package/dist/Table/BaseTable.js +8 -0
  188. package/dist/Table/index.d.ts +1 -1
  189. package/dist/Table/index.d.ts.map +1 -1
  190. package/dist/Table/index.js +1 -1
  191. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  192. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  193. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  194. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  195. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  196. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  197. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  198. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  199. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  200. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  201. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  202. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  203. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  204. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  205. package/dist/Table/tableContextMenu.js +2 -1
  206. package/dist/Table/types.d.ts +11 -0
  207. package/dist/Table/types.d.ts.map +1 -1
  208. package/dist/TextArea/TextArea.d.ts +10 -1
  209. package/dist/TextArea/TextArea.d.ts.map +1 -1
  210. package/dist/TextArea/TextArea.js +16 -6
  211. package/dist/TextInput/TextInput.d.ts +10 -1
  212. package/dist/TextInput/TextInput.d.ts.map +1 -1
  213. package/dist/TextInput/TextInput.js +13 -19
  214. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  215. package/dist/Thumbnail/Thumbnail.js +32 -26
  216. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  217. package/dist/TimeInput/TimeInput.js +7 -15
  218. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  219. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  220. package/dist/Token/Token.d.ts.map +1 -1
  221. package/dist/Token/Token.js +20 -11
  222. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  223. package/dist/Tokenizer/Tokenizer.js +4 -2
  224. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  225. package/dist/Tooltip/useTooltip.js +3 -19
  226. package/dist/TopNav/TopNav.d.ts.map +1 -1
  227. package/dist/TopNav/TopNav.js +6 -5
  228. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  229. package/dist/TopNav/TopNavHeading.js +54 -16
  230. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  231. package/dist/TopNav/TopNavItem.js +3 -9
  232. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  233. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  234. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  235. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  236. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  237. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  238. package/dist/TopNav/TopNavMenu.js +83 -38
  239. package/dist/TreeList/TreeList.d.ts.map +1 -1
  240. package/dist/TreeList/TreeList.js +13 -0
  241. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  242. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  243. package/dist/TreeList/TreeListBranches.js +14 -4
  244. package/dist/TreeList/TreeListItem.d.ts +11 -1
  245. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  246. package/dist/TreeList/TreeListItem.js +57 -30
  247. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  248. package/dist/Typeahead/BaseTypeahead.js +16 -8
  249. package/dist/astryx.css +74 -85
  250. package/dist/astryx.umd.js +56 -56
  251. package/dist/astryx.umd.js.map +4 -4
  252. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  253. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  254. package/dist/hooks/containerReveal.stylex.js +63 -0
  255. package/dist/hooks/index.d.ts +3 -0
  256. package/dist/hooks/index.d.ts.map +1 -1
  257. package/dist/hooks/index.js +2 -0
  258. package/dist/hooks/useClipboard.d.ts +59 -0
  259. package/dist/hooks/useClipboard.d.ts.map +1 -0
  260. package/dist/hooks/useClipboard.js +106 -0
  261. package/dist/hooks/useContainerReveal.d.ts +14 -8
  262. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  263. package/dist/hooks/useContainerReveal.js +28 -69
  264. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  265. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  266. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  267. package/dist/hooks/useLongPress.d.ts.map +1 -1
  268. package/dist/hooks/useLongPress.js +12 -2
  269. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  270. package/dist/hooks/useScrollLock.js +33 -18
  271. package/dist/hooks/useStreamingText.d.ts +18 -3
  272. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  273. package/dist/hooks/useStreamingText.js +47 -7
  274. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  275. package/dist/hooks/useTreeFocus.js +9 -3
  276. package/dist/hooks/useTypeahead.d.ts +3 -2
  277. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  278. package/dist/hooks/useTypeahead.js +19 -7
  279. package/dist/index.d.ts +1 -0
  280. package/dist/index.d.ts.map +1 -1
  281. package/dist/index.js +1 -0
  282. package/dist/theme/defineTheme.d.ts +16 -0
  283. package/dist/theme/defineTheme.d.ts.map +1 -1
  284. package/dist/theme/defineTheme.js +8 -0
  285. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  286. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  287. package/dist/theme/derivedVarRegistry.js +14 -13
  288. package/dist/theme/expandColorScale.d.ts +3 -1
  289. package/dist/theme/expandColorScale.d.ts.map +1 -1
  290. package/dist/theme/expandColorScale.js +17 -7
  291. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  292. package/dist/theme/expandTypeScale.js +17 -0
  293. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  294. package/dist/theme/generateThemeRules.js +11 -0
  295. package/dist/theme/index.d.ts +1 -0
  296. package/dist/theme/index.d.ts.map +1 -1
  297. package/dist/utils/focusOutline.stylex.d.ts +107 -0
  298. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  299. package/dist/utils/focusOutline.stylex.js +130 -0
  300. package/dist/utils/focusReturn.d.ts +24 -0
  301. package/dist/utils/focusReturn.d.ts.map +1 -0
  302. package/dist/utils/focusReturn.js +29 -0
  303. package/dist/utils/index.d.ts +1 -0
  304. package/dist/utils/index.d.ts.map +1 -1
  305. package/dist/utils/index.js +1 -0
  306. package/dist/utils/mergeRefs.d.ts.map +1 -1
  307. package/dist/utils/mergeRefs.js +7 -5
  308. package/dist/utils/rtlStyles.d.ts +2 -2
  309. package/dist/utils/rtlStyles.js +2 -2
  310. package/dist/utils/themeProps.d.ts +20 -1
  311. package/dist/utils/themeProps.d.ts.map +1 -1
  312. package/dist/utils/themeProps.js +8 -2
  313. package/locales/en.json +12 -0
  314. package/locales/pseudo.json +9 -0
  315. package/package.json +7 -2
  316. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  317. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  318. package/src/AlertDialog/AlertDialog.tsx +21 -3
  319. package/src/AppShell/AppShell.doc.mjs +11 -0
  320. package/src/AppShell/AppShell.test.tsx +139 -0
  321. package/src/AppShell/AppShell.tsx +32 -22
  322. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  323. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  324. package/src/AspectRatio/AspectRatio.tsx +13 -0
  325. package/src/Avatar/Avatar.doc.mjs +2 -13
  326. package/src/Avatar/Avatar.test.tsx +33 -8
  327. package/src/Avatar/Avatar.tsx +52 -50
  328. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  329. package/src/Banner/Banner.tsx +9 -6
  330. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  331. package/src/Breadcrumbs/index.ts +5 -1
  332. package/src/Button/Button.tsx +21 -41
  333. package/src/Calendar/Calendar.tsx +2 -1
  334. package/src/Calendar/styles.ts +0 -8
  335. package/src/Carousel/Carousel.doc.mjs +3 -0
  336. package/src/Carousel/Carousel.tsx +10 -6
  337. package/src/Chat/Chat.doc.mjs +2 -0
  338. package/src/Chat/ChatDictationButton.tsx +7 -1
  339. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  340. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  341. package/src/Chat/ChatSendButton.tsx +2 -3
  342. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  343. package/src/Chat/ChatToolCalls.tsx +36 -16
  344. package/src/Chat/useTriggerMenu.tsx +2 -5
  345. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  346. package/src/CheckboxInput/CheckboxInput.test.tsx +115 -0
  347. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  348. package/src/ClickableCard/ClickableCard.tsx +6 -11
  349. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  350. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  351. package/src/CodeBlock/CodeBlock.tsx +57 -80
  352. package/src/Collapsible/Collapsible.tsx +22 -18
  353. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  354. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  355. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  356. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  357. package/src/ComplexSelector/ComplexSelector.test.tsx +64 -0
  358. package/src/ComplexSelector/ComplexSelector.tsx +46 -29
  359. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  360. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  361. package/src/ContextMenu/ContextMenu.tsx +3 -3
  362. package/src/ContextMenu/index.ts +5 -1
  363. package/src/DateInput/DateInput.doc.mjs +18 -3
  364. package/src/DateInput/DateInput.test.tsx +93 -11
  365. package/src/DateInput/DateInput.tsx +41 -19
  366. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  367. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  368. package/src/DateRangeInput/DateRangeInput.tsx +24 -12
  369. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  370. package/src/DateTimeInput/DateTimeInput.test.tsx +75 -0
  371. package/src/DateTimeInput/DateTimeInput.tsx +35 -8
  372. package/src/Dialog/Dialog.tsx +2 -9
  373. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  374. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  375. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  376. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  377. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  378. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  379. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  380. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  381. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  382. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  383. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  384. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  385. package/src/DropdownMenu/index.ts +8 -1
  386. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  387. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  388. package/src/EmptyState/EmptyState.test.tsx +62 -0
  389. package/src/EmptyState/EmptyState.tsx +16 -6
  390. package/src/Field/Field.doc.mjs +1 -0
  391. package/src/Field/InputClearButton.test.tsx +117 -0
  392. package/src/Field/InputClearButton.tsx +30 -3
  393. package/src/HoverCard/useHoverCard.tsx +2 -23
  394. package/src/Icon/Icon.doc.mjs +2 -1
  395. package/src/Indicator/CheckIndicator.tsx +174 -0
  396. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  397. package/src/Indicator/Indicator.doc.mjs +344 -0
  398. package/src/Indicator/Indicator.test.tsx +393 -0
  399. package/src/Indicator/RadioIndicator.tsx +206 -0
  400. package/src/Indicator/index.ts +45 -0
  401. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  402. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  403. package/src/Indicator/indicatorRegistry.ts +120 -0
  404. package/src/Indicator/types.ts +186 -0
  405. package/src/Indicator/useIndicator.ts +39 -0
  406. package/src/Item/Item.doc.mjs +1 -1
  407. package/src/Item/Item.tsx +7 -14
  408. package/src/Layer/useLayer.doc.mjs +2 -2
  409. package/src/Layer/useLayer.test.tsx +85 -0
  410. package/src/Layer/useLayer.tsx +39 -1
  411. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  412. package/src/Lightbox/Lightbox.tsx +43 -38
  413. package/src/Link/Link.tsx +4 -11
  414. package/src/MobileNav/MobileNav.tsx +3 -3
  415. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  416. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  417. package/src/MoreMenu/MoreMenu.tsx +19 -0
  418. package/src/MultiSelector/MultiSelector.doc.mjs +9 -1
  419. package/src/MultiSelector/MultiSelector.test.tsx +255 -16
  420. package/src/MultiSelector/MultiSelector.tsx +103 -99
  421. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  422. package/src/NumberInput/NumberInput.test.tsx +726 -21
  423. package/src/NumberInput/NumberInput.tsx +353 -59
  424. package/src/Outline/Outline.tsx +2 -5
  425. package/src/Pagination/Pagination.doc.mjs +1 -1
  426. package/src/Pagination/Pagination.test.tsx +22 -7
  427. package/src/Pagination/Pagination.tsx +38 -35
  428. package/src/Popover/Popover.tsx +6 -7
  429. package/src/PowerSearch/PowerSearch.tsx +1 -1
  430. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  431. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  432. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  433. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  434. package/src/ProgressBar/ProgressBar.tsx +124 -22
  435. package/src/RadioList/RadioList.doc.mjs +4 -2
  436. package/src/RadioList/RadioListItem.tsx +31 -130
  437. package/src/Resizable/ResizeHandle.tsx +2 -9
  438. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  439. package/src/SelectableCard/SelectableCard.tsx +4 -9
  440. package/src/Selector/Selector.doc.mjs +7 -4
  441. package/src/Selector/Selector.test.tsx +935 -25
  442. package/src/Selector/Selector.tsx +189 -106
  443. package/src/Selector/hooks.ts +77 -50
  444. package/src/SideNav/SideNav.test.tsx +46 -0
  445. package/src/SideNav/SideNav.tsx +1 -0
  446. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  447. package/src/SideNav/SideNavHeading.tsx +48 -10
  448. package/src/SideNav/SideNavItem.tsx +20 -12
  449. package/src/Stack/Stack.doc.mjs +110 -0
  450. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  451. package/src/Switch/Switch.test.tsx +32 -0
  452. package/src/Switch/Switch.tsx +8 -8
  453. package/src/TabList/Tab.tsx +2 -9
  454. package/src/TabList/TabMenu.tsx +14 -21
  455. package/src/Table/BaseTable.tsx +11 -0
  456. package/src/Table/index.ts +1 -4
  457. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  458. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  459. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  460. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  461. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  462. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  463. package/src/Table/tableContextMenu.test.tsx +27 -0
  464. package/src/Table/tableContextMenu.tsx +1 -0
  465. package/src/Table/types.ts +11 -0
  466. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  467. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  468. package/src/TextArea/TextArea.doc.mjs +42 -2
  469. package/src/TextArea/TextArea.test.tsx +219 -0
  470. package/src/TextArea/TextArea.tsx +34 -7
  471. package/src/TextInput/TextInput.doc.mjs +18 -2
  472. package/src/TextInput/TextInput.test.tsx +189 -0
  473. package/src/TextInput/TextInput.tsx +25 -31
  474. package/src/Thumbnail/Thumbnail.tsx +2 -9
  475. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  476. package/src/TimeInput/TimeInput.test.tsx +30 -3
  477. package/src/TimeInput/TimeInput.tsx +9 -26
  478. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  479. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  480. package/src/Token/Token.tsx +5 -28
  481. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  482. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  483. package/src/Tokenizer/Tokenizer.tsx +10 -2
  484. package/src/Tooltip/useTooltip.tsx +2 -23
  485. package/src/TopNav/TopNav.tsx +1 -3
  486. package/src/TopNav/TopNavHeading.tsx +42 -13
  487. package/src/TopNav/TopNavItem.tsx +3 -21
  488. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  489. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  490. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  491. package/src/TopNav/TopNavMenu.tsx +34 -37
  492. package/src/TreeList/TreeList.doc.mjs +5 -0
  493. package/src/TreeList/TreeList.test.tsx +206 -7
  494. package/src/TreeList/TreeList.tsx +22 -0
  495. package/src/TreeList/TreeListBranches.tsx +25 -2
  496. package/src/TreeList/TreeListItem.tsx +89 -52
  497. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  498. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  499. package/src/Typeahead/Typeahead.test.tsx +76 -3
  500. package/src/hooks/containerReveal.stylex.ts +102 -0
  501. package/src/hooks/index.ts +4 -0
  502. package/src/hooks/useClipboard.doc.mjs +87 -0
  503. package/src/hooks/useClipboard.test.tsx +151 -0
  504. package/src/hooks/useClipboard.ts +135 -0
  505. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  506. package/src/hooks/useContainerReveal.test.tsx +42 -62
  507. package/src/hooks/useContainerReveal.ts +36 -91
  508. package/src/hooks/useImageMode.test.ts +1 -1
  509. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  510. package/src/hooks/useLongPress.test.tsx +18 -0
  511. package/src/hooks/useLongPress.ts +12 -2
  512. package/src/hooks/useScrollLock.test.ts +72 -0
  513. package/src/hooks/useScrollLock.ts +51 -19
  514. package/src/hooks/useStreamingText.test.ts +46 -1
  515. package/src/hooks/useStreamingText.ts +49 -7
  516. package/src/hooks/useTreeFocus.test.tsx +50 -0
  517. package/src/hooks/useTreeFocus.ts +14 -3
  518. package/src/hooks/useTypeahead.test.tsx +150 -0
  519. package/src/hooks/useTypeahead.ts +24 -9
  520. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  521. package/src/index.ts +1 -0
  522. package/src/theme/defineTheme.ts +24 -0
  523. package/src/theme/derivedVarRegistry.test.ts +21 -1
  524. package/src/theme/derivedVarRegistry.ts +19 -6
  525. package/src/theme/expandColorScale.test.ts +14 -0
  526. package/src/theme/expandColorScale.ts +24 -9
  527. package/src/theme/expandTypeScale.test.ts +43 -0
  528. package/src/theme/expandTypeScale.ts +17 -0
  529. package/src/theme/generateThemeRules.test.ts +61 -20
  530. package/src/theme/generateThemeRules.ts +11 -0
  531. package/src/theme/index.ts +13 -0
  532. package/src/utils/focusOutline.stylex.ts +163 -0
  533. package/src/utils/focusReturn.test.ts +42 -0
  534. package/src/utils/focusReturn.ts +31 -0
  535. package/src/utils/index.ts +1 -0
  536. package/src/utils/mergeRefs.test.ts +48 -0
  537. package/src/utils/mergeRefs.ts +12 -6
  538. package/src/utils/rtlStyles.ts +2 -2
  539. package/src/utils/themeProps.ts +26 -4
  540. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  541. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  542. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  543. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  544. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  545. package/dist/RadioList/radio.markers.stylex.js +0 -12
  546. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  547. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  548. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  549. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  550. package/src/RadioList/radio.markers.stylex.ts +0 -10
  551. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -50,6 +50,18 @@ const styles = stylex.create({
50
50
  fixed: {
51
51
  position: 'fixed',
52
52
  },
53
+ // Clearance from the anchor. Set on BOTH edges of the placement axis, not
54
+ // just the one facing the anchor: `position-try-fallbacks` can flip the
55
+ // layer to the opposite side at paint time, and a single-edge margin then
56
+ // lands on the far side and the gap vanishes (#4803).
57
+ offsetBlock: (offset: string) => ({
58
+ marginBlockStart: offset,
59
+ marginBlockEnd: offset,
60
+ }),
61
+ offsetInline: (offset: string) => ({
62
+ marginInlineStart: offset,
63
+ marginInlineEnd: offset,
64
+ }),
53
65
  });
54
66
 
55
67
  /**
@@ -94,6 +106,20 @@ export interface ContextRenderProps {
94
106
  * is `'custom'`.
95
107
  */
96
108
  alignment?: LayerAlignment;
109
+ /**
110
+ * Clearance between the layer and its anchor, as a CSS length (a number is
111
+ * treated as `px`). Applied along the placement axis and flip-safe, so the
112
+ * gap survives a `position-try-fallbacks` flip to the opposite side.
113
+ *
114
+ * Layers sit flush by default: the hook zeroes the UA margins so anchor
115
+ * positioning has a clean box, and clearance is a deliberate choice per
116
+ * surface. `var(--spacing-1)` is the system's standard clearance.
117
+ *
118
+ * Ignored when `positioning` is `'custom'` — that mode owns its own insets.
119
+ *
120
+ * @default 0
121
+ */
122
+ offset?: number | string;
97
123
  /**
98
124
  * ARIA role applied to the popover container (e.g. `'tooltip'`). Lets
99
125
  * consumers complete the ARIA pattern and gives test tooling a stable,
@@ -284,6 +310,10 @@ export interface FixedLayerReturn {
284
310
  render: (children: ReactNode, props: FixedRenderProps) => ReactNode;
285
311
  }
286
312
 
313
+ function toCssLength(value: number | string): string {
314
+ return typeof value === 'number' ? `${value}px` : value;
315
+ }
316
+
287
317
  /**
288
318
  * Map logical placement/alignment to a CSS position-area value.
289
319
  *
@@ -530,6 +560,7 @@ export function useLayer(
530
560
  placement = 'above',
531
561
  alignment = 'center',
532
562
  positioning = 'anchor',
563
+ offset,
533
564
  role,
534
565
  'aria-label': ariaLabel,
535
566
  xstyle,
@@ -555,7 +586,14 @@ export function useLayer(
555
586
  ),
556
587
  };
557
588
 
558
- const stylexResult = stylex.props(styles.base, xstyle);
589
+ const offsetStyle =
590
+ positioning === 'anchor' && offset
591
+ ? placement === 'above' || placement === 'below'
592
+ ? styles.offsetBlock(toCssLength(offset))
593
+ : styles.offsetInline(toCssLength(offset))
594
+ : null;
595
+
596
+ const stylexResult = stylex.props(styles.base, offsetStyle, xstyle);
559
597
  const combinedClassName = extraClassName
560
598
  ? `${extraClassName} ${stylexResult.className ?? ''}`
561
599
  : stylexResult.className;
@@ -77,7 +77,7 @@ export const docs = {
77
77
  defaults: {
78
78
  isOpen: false,
79
79
  media: {
80
- src: 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png',
80
+ src: '/template-assets/light-scene-horizontal-1.png',
81
81
  alt: 'Coastal shoreline with ocean waves',
82
82
  caption: 'A scenic coastline with waves rolling onto a sandy beach beneath a clear sky.',
83
83
  },
@@ -215,7 +215,12 @@ const styles = stylex.create({
215
215
  navButton: {
216
216
  position: 'absolute',
217
217
  top: '50%',
218
- transform: 'translateY(-50%)',
218
+ // The individual `translate` property, not `transform`: this style now
219
+ // lands on the Button root, and a `transform` here replaces the Button's
220
+ // own transform rules — measured: the `scale(0.98)` press feedback stops
221
+ // firing. `translate` composes with them, reproducing exactly what the
222
+ // removed wrapper element did (wrapper translated, button scaled).
223
+ translate: '0 -50%',
219
224
  zIndex: 1,
220
225
  },
221
226
  navPrev: {
@@ -595,34 +600,33 @@ export function Lightbox({
595
600
  {...props}>
596
601
  <div ref={containerRef} {...stylex.props(styles.container)}>
597
602
  {/* Close button */}
598
- <div {...stylex.props(styles.closeButton)}>
599
- <IconButton
600
- icon={<Icon icon="close" size="sm" color="inherit" />}
601
- label={t('@astryx.lightbox.close')}
602
- variant="ghost"
603
- onClick={handleClose}
604
- xstyle={styles.controlButton}
605
- />
606
- </div>
603
+ <IconButton
604
+ icon={<Icon icon="close" size="sm" color="inherit" />}
605
+ label={t('@astryx.lightbox.close')}
606
+ variant="ghost"
607
+ onClick={handleClose}
608
+ xstyle={[styles.closeButton, styles.controlButton]}
609
+ />
607
610
 
608
611
  {/* Gallery nav: prev — stays mounted and is disabled at the start of
609
612
  the range so pressing/arrowing to the boundary doesn't unmount the
610
613
  focused control and drop focus to <body>. */}
611
614
  {isGallery && (
612
- <div {...stylex.props(styles.navButton, styles.navPrev)}>
613
- <IconButton
614
- icon={
615
- <span {...stylex.props(rtlStyles.mirror)}>
616
- <Icon icon="chevronLeft" size="sm" color="inherit" />
617
- </span>
618
- }
619
- label={t('@astryx.lightbox.previous')}
620
- variant="ghost"
621
- isDisabled={!canPrev}
622
- onClick={goToPrev}
623
- xstyle={styles.controlButton}
624
- />
625
- </div>
615
+ <IconButton
616
+ icon={
617
+ <Icon
618
+ icon="chevronLeft"
619
+ size="sm"
620
+ color="inherit"
621
+ xstyle={rtlStyles.mirror}
622
+ />
623
+ }
624
+ label={t('@astryx.lightbox.previous')}
625
+ variant="ghost"
626
+ isDisabled={!canPrev}
627
+ onClick={goToPrev}
628
+ xstyle={[styles.navButton, styles.navPrev, styles.controlButton]}
629
+ />
626
630
  )}
627
631
 
628
632
  {/* Media + caption group (centered together) */}
@@ -676,20 +680,21 @@ export function Lightbox({
676
680
  {/* Gallery nav: next — see "prev" above; stays mounted and disabled at
677
681
  the end of the range instead of unmounting. */}
678
682
  {isGallery && (
679
- <div {...stylex.props(styles.navButton, styles.navNext)}>
680
- <IconButton
681
- icon={
682
- <span {...stylex.props(rtlStyles.mirror)}>
683
- <Icon icon="chevronRight" size="sm" color="inherit" />
684
- </span>
685
- }
686
- label={t('@astryx.lightbox.next')}
687
- variant="ghost"
688
- isDisabled={!canNext}
689
- onClick={goToNext}
690
- xstyle={styles.controlButton}
691
- />
692
- </div>
683
+ <IconButton
684
+ icon={
685
+ <Icon
686
+ icon="chevronRight"
687
+ size="sm"
688
+ color="inherit"
689
+ xstyle={rtlStyles.mirror}
690
+ />
691
+ }
692
+ label={t('@astryx.lightbox.next')}
693
+ variant="ghost"
694
+ isDisabled={!canNext}
695
+ onClick={goToNext}
696
+ xstyle={[styles.navButton, styles.navNext, styles.controlButton]}
697
+ />
693
698
  )}
694
699
 
695
700
  {/* Gallery counter */}
package/src/Link/Link.tsx CHANGED
@@ -44,6 +44,7 @@ import {mergeProps} from '../utils';
44
44
  import {computeTargetAndRel} from './computeTargetAndRel';
45
45
  import {useInteractiveRole} from '../hooks/useInteractiveRole';
46
46
  import {themeProps} from '../utils/themeProps';
47
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
47
48
  import {useTranslator} from '../i18n';
48
49
 
49
50
  /**
@@ -68,14 +69,6 @@ const styles = stylex.create({
68
69
  transitionProperty: 'color, text-decoration',
69
70
  transitionDuration: durationVars['--duration-fast'],
70
71
  transitionTimingFunction: easeVars['--ease-standard'],
71
- outline: {
72
- default: null,
73
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
74
- },
75
- outlineOffset: {
76
- default: '0',
77
- ':focus-visible': '2px',
78
- },
79
72
  },
80
73
  /**
81
74
  * Reset styles for rendering as a <button> when href is undefined.
@@ -368,7 +361,7 @@ export function Link({
368
361
  disabled={isDisabled}
369
362
  {...mergeProps(
370
363
  themeProps('link', {color}),
371
- stylex.props(
364
+ focusOutlineProps.focusVisible(
372
365
  styles.base,
373
366
  styles.buttonReset,
374
367
  linkColorStyles[color],
@@ -400,7 +393,7 @@ export function Link({
400
393
  tabIndex={-1}
401
394
  {...mergeProps(
402
395
  themeProps('link', {color}),
403
- stylex.props(
396
+ focusOutlineProps.focusVisible(
404
397
  styles.base,
405
398
  linkColorStyles[color],
406
399
  hasUnderline && styles.hasUnderline,
@@ -428,7 +421,7 @@ export function Link({
428
421
  tabIndex={isDisabled ? -1 : undefined}
429
422
  {...mergeProps(
430
423
  themeProps('link', {color}),
431
- stylex.props(
424
+ focusOutlineProps.focusVisible(
432
425
  styles.base,
433
426
  linkColorStyles[color],
434
427
  hasUnderline && styles.hasUnderline,
@@ -453,9 +453,9 @@ export function MobileNav({
453
453
  {/* Header — content + close button */}
454
454
  <div {...stylex.props(styles.header, !header && styles.headerNoTitle)}>
455
455
  {typeof header === 'string' ? (
456
- <span {...stylex.props(styles.headerText)}>
457
- <Heading level={2}>{header}</Heading>
458
- </span>
456
+ <Heading level={2} xstyle={styles.headerText}>
457
+ {header}
458
+ </Heading>
459
459
  ) : (
460
460
  (header ?? null)
461
461
  )}
@@ -47,6 +47,20 @@ export const docs = {
47
47
  description: 'Whether the menu trigger is disabled.',
48
48
  default: 'false',
49
49
  }, {
50
+ name: 'placement',
51
+ type: "'above' | 'below' | 'start' | 'end'",
52
+ description:
53
+ "Position of the menu relative to the trigger. Logical: start/end resolve against the menu's own inherited direction (RTL mirrors).",
54
+ default: "'below'",
55
+ },
56
+ {
57
+ name: 'alignment',
58
+ type: "'start' | 'center' | 'end'",
59
+ description:
60
+ "Alignment along the placement axis. Use 'end' to align the menu with the trigger's trailing edge, which is usually what an overflow menu wants.",
61
+ default: "'start'",
62
+ },
63
+ {
50
64
  name: 'xstyle',
51
65
  type: 'StyleXStyles',
52
66
  description:
@@ -120,6 +134,20 @@ export const docsZh = {
120
134
  description: '菜单触发器是否禁用。',
121
135
  default: 'false',
122
136
  }, {
137
+ name: 'placement',
138
+ type: "'above' | 'below' | 'start' | 'end'",
139
+ description:
140
+ '菜单相对于触发按钮的位置。逻辑方向:start/end 依据菜单自身继承的书写方向解析(RTL 自动镜像)。',
141
+ default: "'below'",
142
+ },
143
+ {
144
+ name: 'alignment',
145
+ type: "'start' | 'center' | 'end'",
146
+ description:
147
+ "沿放置轴的对齐方式。使用 'end' 让菜单与触发器的尾部边缘对齐,这通常是溢出菜单所需的效果。",
148
+ default: "'start'",
149
+ },
150
+ {
123
151
  name: 'xstyle',
124
152
  type: 'StyleXStyles',
125
153
  description:
@@ -162,6 +190,9 @@ export const docsDense = {
162
190
  size: 'Trigger button size.',
163
191
  icon: 'Override default three-dot icon. Accepts any ReactNode.',
164
192
  isDisabled: 'Whether menu trigger disabled.',
193
+ placement: 'Menu position relative to trigger. Logical (RTL mirrors).',
194
+ alignment:
195
+ "Alignment along the placement axis. 'end' aligns with the trigger's trailing edge.",
165
196
  xstyle:
166
197
  'StyleX styles for layout customization (margins, positioning, sizing). Must be stylex.create() value.',
167
198
  },
@@ -10,9 +10,10 @@
10
10
  */
11
11
 
12
12
  import {describe, it, expect, vi, beforeEach} from 'vitest';
13
- import {render, screen} from '@testing-library/react';
13
+ import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {MoreMenu} from './MoreMenu';
16
+ import {DropdownMenu} from '../DropdownMenu/DropdownMenu';
16
17
 
17
18
  // Mock showPopover and hidePopover methods since they're not implemented in jsdom
18
19
  beforeEach(() => {
@@ -197,4 +198,70 @@ describe('MoreMenu', () => {
197
198
  const menu = screen.getByRole('menu', {hidden: true});
198
199
  expect(menu.className).toContain('astryx-more-menu');
199
200
  });
201
+
202
+ it('pointer open focuses the menu container, not the first item (#4477)', async () => {
203
+ const user = userEvent.setup();
204
+ render(<MoreMenu items={defaultItems} />);
205
+
206
+ await user.click(screen.getByRole('button', {name: 'More options'}));
207
+
208
+ const menu = screen.getByRole('menu', {hidden: true});
209
+ await waitFor(() => expect(menu).toHaveFocus());
210
+ expect(
211
+ screen.getByRole('menuitem', {name: 'Edit', hidden: true}),
212
+ ).not.toHaveFocus();
213
+ });
214
+
215
+ it('first ArrowDown after a pointer open moves focus to the first item (#4477)', async () => {
216
+ const user = userEvent.setup();
217
+ render(<MoreMenu items={defaultItems} />);
218
+
219
+ await user.click(screen.getByRole('button', {name: 'More options'}));
220
+ const menu = screen.getByRole('menu', {hidden: true});
221
+ await waitFor(() => expect(menu).toHaveFocus());
222
+
223
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
224
+ expect(
225
+ screen.getByRole('menuitem', {name: 'Edit', hidden: true}),
226
+ ).toHaveFocus();
227
+ });
228
+
229
+ describe('placement and alignment', () => {
230
+ const positionAreaOf = (menu: HTMLElement) =>
231
+ menu
232
+ .closest('[popover]')
233
+ ?.getAttribute('style')
234
+ ?.match(/position-area:[^;]*/)?.[0];
235
+
236
+ it('resolves the same default position as DropdownMenu', () => {
237
+ render(
238
+ <>
239
+ <MoreMenu items={defaultItems} />
240
+ <DropdownMenu button={{label: 'Actions'}} items={defaultItems} />
241
+ </>,
242
+ );
243
+ const [moreMenu, dropdownMenu] = screen.getAllByRole('menu', {
244
+ hidden: true,
245
+ });
246
+
247
+ expect(positionAreaOf(moreMenu)).toBe(positionAreaOf(dropdownMenu));
248
+ expect(positionAreaOf(moreMenu)).toBe(
249
+ 'position-area: self-block-end span-self-inline-end',
250
+ );
251
+ });
252
+
253
+ it('forwards alignment to the menu layer', () => {
254
+ render(<MoreMenu items={defaultItems} alignment="end" />);
255
+ expect(positionAreaOf(screen.getByRole('menu', {hidden: true}))).toBe(
256
+ 'position-area: self-block-end span-self-inline-start',
257
+ );
258
+ });
259
+
260
+ it('forwards placement to the menu layer', () => {
261
+ render(<MoreMenu items={defaultItems} placement="above" />);
262
+ expect(positionAreaOf(screen.getByRole('menu', {hidden: true}))).toBe(
263
+ 'position-area: self-block-start span-self-inline-end',
264
+ );
265
+ });
266
+ });
200
267
  });
@@ -23,6 +23,7 @@ import {useIcon} from '../Icon';
23
23
  import {DropdownMenu} from '../DropdownMenu/DropdownMenu';
24
24
  import {useSize} from '../SizeContext/SizeContext';
25
25
  import type {DropdownMenuOption} from '../DropdownMenu';
26
+ import type {LayerAlignment, LayerPlacement} from '../Layer';
26
27
  import type {ButtonVariant, ButtonSize} from '../Button';
27
28
  import type {BaseProps} from '../BaseProps';
28
29
  import {stableClassName} from '../naming';
@@ -72,6 +73,20 @@ export interface MoreMenuProps extends Pick<
72
73
  */
73
74
  isDisabled?: boolean;
74
75
 
76
+ /**
77
+ * Position of the menu relative to the trigger button.
78
+ * Forwarded to DropdownMenu, which owns the default.
79
+ * @default 'below'
80
+ */
81
+ placement?: LayerPlacement;
82
+
83
+ /**
84
+ * Alignment of the menu along the placement axis.
85
+ * Forwarded to DropdownMenu, which owns the default.
86
+ * @default 'start'
87
+ */
88
+ alignment?: LayerAlignment;
89
+
75
90
  /**
76
91
  * Controlled open state for the menu.
77
92
  */
@@ -108,6 +123,8 @@ export function MoreMenu({
108
123
  size: sizeProp,
109
124
  icon,
110
125
  isDisabled = false,
126
+ placement,
127
+ alignment,
111
128
  isMenuOpen,
112
129
  onOpenChange,
113
130
  xstyle,
@@ -132,6 +149,8 @@ export function MoreMenu({
132
149
  style={style}
133
150
  isMenuOpen={isMenuOpen}
134
151
  onOpenChange={onOpenChange}
152
+ placement={placement}
153
+ alignment={alignment}
135
154
  button={{
136
155
  label,
137
156
  icon: icon ?? moreIcon,
@@ -23,12 +23,20 @@ export const docs = {
23
23
  {
24
24
  className: 'astryx-multi-selector',
25
25
  visualProps: ['variant', 'size', 'status'],
26
+ states: ['disabled'],
26
27
  },
27
- {className: 'astryx-multi-selector-clear-icon'},
28
+ {className: 'astryx-multi-selector-clear-icon', deprecatedFor: 'input-clear-icon'},
29
+ {className: 'astryx-multi-selector-empty-state'},
28
30
  {
29
31
  className: 'astryx-multi-selector-indicator-icon',
30
32
  states: ['state'],
31
33
  },
34
+ {
35
+ className: 'astryx-multi-selector-option',
36
+ visualProps: ['size'],
37
+ states: ['select-all', 'selected', 'disabled'],
38
+ },
39
+ {className: 'astryx-multi-selector-popup'},
32
40
  ],
33
41
  },
34
42
  components: [