@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
@@ -19,7 +19,7 @@ import { useId, useState, useCallback, useRef, useMemo, useOptimistic, useTransi
19
19
  import * as stylex from '@stylexjs/stylex';
20
20
  import "../theme/tokens.stylex.js";
21
21
  import { colorVars, sizeVars, radiusVars, spacingVars, typographyVars, typeScaleVars, borderVars } from "../theme/tokens.stylex.js";
22
- import { Field, inputWrapperStyles, inputStatusBorderStyles, inputStatusHoverShadowStyles, inputStatusFocusWithinStyles } from "../Field/index.js";
22
+ import { Field, InputClearButton, inputWrapperStyles, inputStatusBorderStyles, inputStatusHoverShadowStyles, inputStatusFocusWithinStyles } from "../Field/index.js";
23
23
  import { Icon } from "../Icon/index.js";
24
24
  import { VisuallyHidden } from "../VisuallyHidden/index.js";
25
25
  import { Spinner } from "../Spinner/index.js";
@@ -29,7 +29,7 @@ import { usePopover } from "../Popover/index.js";
29
29
  import { useTooltip } from "../Tooltip/index.js";
30
30
  import { useInputContainer } from "../hooks/useInputContainer.js";
31
31
  import { useInputStatusIcon } from "../hooks/useInputStatusIcon.js";
32
- import { parseDateInput, parseTimeInput, formatDisplayTime12h, formatDisplayTime24h, formatISOTime, isTimeInRange, adjustTime, mergeProps, mergeRefs } from "../utils/index.js";
32
+ import { parseDateInput, parseTimeInput, formatDisplayTime12h, formatDisplayTime24h, formatISOTime, isTimeInRange, adjustTime, mergeProps, mergeRefs, isFocusDetached } from "../utils/index.js";
33
33
  import { plainDateFromISO, plainDateToISO, plainDateFormat, DATE_FORMAT_LONG } from "../utils/plainDate.js";
34
34
  import { useSize } from "../SizeContext/SizeContext.js";
35
35
  import { themeProps } from "../utils/themeProps.js";
@@ -142,6 +142,7 @@ export function DateTimeInput({
142
142
  status,
143
143
  labelTooltip,
144
144
  numberOfMonths = 1,
145
+ weekStartsOn,
145
146
  width,
146
147
  xstyle,
147
148
  className,
@@ -286,7 +287,18 @@ export function DateTimeInput({
286
287
  const popover = usePopover({
287
288
  dialogLabel: t('@astryx.dateTimeInput.dialogLabel'),
288
289
  closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
289
- onHide: () => dateInputRef.current?.focus()
290
+ // Return focus to the date input when the calendar closes — but only when
291
+ // the dismiss left focus detached (Escape, or a click on non-focusable
292
+ // empty space), which the focus trap can't restore on its own. A native
293
+ // popover="auto" light-dismiss fires synchronously with the pointer event
294
+ // that moved focus, so if the user clicked another control — the time
295
+ // input, the clear button, another field, anywhere — focus has already
296
+ // landed there; reclaiming it would fight their click.
297
+ onHide: () => {
298
+ if (isFocusDetached()) {
299
+ dateInputRef.current?.focus();
300
+ }
301
+ }
290
302
  });
291
303
  const handleCalendarToggle = useCallback(() => {
292
304
  if (!isEffectivelyDisabled) {
@@ -495,7 +507,8 @@ export function DateTimeInput({
495
507
  ...rest,
496
508
  ...mergeProps(themeProps('date-time-input', {
497
509
  size,
498
- status: status?.type ?? null
510
+ status: status?.type ?? null,
511
+ disabled: isDisabled ? 'disabled' : null
499
512
  }), stylex.props(styles.row, xstyle), className, style),
500
513
  children: [/*#__PURE__*/_jsxs("div", {
501
514
  ref: popover.triggerRef,
@@ -568,20 +581,11 @@ export function DateTimeInput({
568
581
  role: "alert",
569
582
  "aria-live": "assertive",
570
583
  children: !isDateInputValid ? 'Invalid date' : ''
571
- }), hasClear && value !== undefined && !isEffectivelyDisabled && /*#__PURE__*/_jsx("button", {
572
- type: "button",
573
- onClick: handleClear,
574
- "aria-label": t('@astryx.dateInput.clear', {
584
+ }), hasClear && value !== undefined && !isEffectivelyDisabled && /*#__PURE__*/_jsx(InputClearButton, {
585
+ label: t('@astryx.dateInput.clear', {
575
586
  label
576
587
  }),
577
- ...{
578
- className: "x78zum5 x6s0dn4 xl56j7k x1717udv x1ghz6dp xc342km xng3xce xjbqb8w x1ypdohk xh6dtrn x1a2a7pz x1p25gnr x1y3gkto"
579
- },
580
- children: /*#__PURE__*/_jsx(Icon, {
581
- icon: "close",
582
- size: "sm",
583
- color: "secondary"
584
- })
588
+ onClick: handleClear
585
589
  }), isBusy && /*#__PURE__*/_jsx(Spinner, {
586
590
  size: "sm"
587
591
  }), statusIcon]
@@ -655,7 +659,8 @@ export function DateTimeInput({
655
659
  min: calendarMin,
656
660
  max: calendarMax,
657
661
  dateConstraints: dateConstraints,
658
- numberOfMonths: numberOfMonths
662
+ numberOfMonths: numberOfMonths,
663
+ weekStartsOn: weekStartsOn
659
664
  }), {
660
665
  placement: 'below',
661
666
  alignment: 'start'
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/Dialog/Dialog.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoB5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAKhD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAqB9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzD,4EAA4E;AAC5E,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAe,SAAQ,mBAAmB;IACzD,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AA+HD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,cAAc;;;;;EAUpE;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC/D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE3C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,QAAgB,EAChB,YAAY,EACZ,KAAW,EACX,SAAkB,EAClB,QAAQ,EACR,OAAoB,EACpB,OAAgB,EAChB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,sCA2Sb;yBA3Te,MAAM"}
1
+ {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/Dialog/Dialog.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoB5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAKhD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAsB9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzD,4EAA4E;AAC5E,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAe,SAAQ,mBAAmB;IACzD,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAuHD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,cAAc;;;;;EAUpE;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC/D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE3C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,QAAgB,EAChB,YAAY,EACZ,KAAW,EACX,SAAkB,EAClB,QAAQ,EACR,OAAoB,EACpB,OAAgB,EAChB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,sCA2Sb;yBA3Te,MAAM"}
@@ -27,12 +27,14 @@ import { mergeProps, mergeRefs } from "../utils/index.js";
27
27
  import { devWarn } from "../utils/devWarning.js";
28
28
  import { DialogContext } from "./DialogContext.js";
29
29
  import { themeProps } from "../utils/themeProps.js";
30
- import { jsx as _jsx } from "react/jsx-runtime";
30
+ import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
31
+
31
32
  /**
32
33
  * Calculate a directional translate offset for dialog entry animation.
33
34
  * Returns a normalized vector from the trigger element toward the viewport
34
35
  * center, scaled to the given distance.
35
36
  */
37
+ import { jsx as _jsx } from "react/jsx-runtime";
36
38
  function getDialogDirection(triggerEl, distance = 16) {
37
39
  const rect = triggerEl.getBoundingClientRect();
38
40
  const dx = rect.left + rect.width / 2 - window.innerWidth / 2;
@@ -91,8 +93,6 @@ const styles = {
91
93
  k44tkh: "xqgcaz",
92
94
  kyAemX: "x128ha8g",
93
95
  kWV6AL: "xskzprw",
94
- kI3sdo: "x17nn4n9",
95
- kInvED: "x1wfwxd8 x7s97pk",
96
96
  $$css: true
97
97
  },
98
98
  open: {
@@ -447,7 +447,7 @@ export function Dialog({
447
447
  ...safeProps,
448
448
  ...mergeProps(themeProps('dialog', {
449
449
  variant
450
- }), stylex.props(styles.dialog, isOpen && styles.open, styles.backdrop, !isFullscreen && dynamicStyles.sizing(width, maxHeight), hasPosition && (() => {
450
+ }), focusOutlineProps.focusVisible(styles.dialog, isOpen && styles.open, styles.backdrop, !isFullscreen && dynamicStyles.sizing(width, maxHeight), hasPosition && (() => {
451
451
  const o = resolveDialogPositionOffsets(position);
452
452
  return dynamicStyles.position(o.top, o.insetInlineStart, o.insetInlineEnd, o.bottom);
453
453
  })(), isFullscreen && styles.fullscreen, xstyle), className, style),
@@ -10,6 +10,11 @@
10
10
  *
11
11
  * Both modes use useListFocus for DOM-based keyboard navigation.
12
12
  *
13
+ * Initial focus on open follows the input modality: a keyboard open
14
+ * (Enter / Space / ArrowDown on the trigger) focuses the first enabled item
15
+ * (APG menu-button); a pointer open focuses the menu container itself so no
16
+ * item reads as pre-selected, and the first ArrowDown then moves to item 1.
17
+ *
13
18
  * SYNC: When modified, update these files to stay in sync:
14
19
  * - /packages/core/src/DropdownMenu/DropdownMenu.doc.mjs
15
20
  * - /packages/core/src/DropdownMenu/DropdownMenu.test.tsx
@@ -19,14 +24,28 @@
19
24
  */
20
25
  import React, { type ReactNode } from 'react';
21
26
  import { type ButtonProps } from '../Button';
22
- import type { IconType } from '../Icon';
27
+ import type { DropdownMenuItemProps } from './DropdownMenuItem';
23
28
  import type { LayerAlignment, LayerPlacement } from '../Layer/useLayer';
24
29
  import type { BaseProps } from '../BaseProps';
25
- export interface DropdownMenuItemData {
26
- label: string;
27
- onClick?: () => void;
28
- isDisabled?: boolean;
29
- icon?: ReactNode | IconType;
30
+ /**
31
+ * Data-mode shape for one menu row.
32
+ *
33
+ * The item fields are sourced from `DropdownMenuItemProps` — data mode renders
34
+ * through `DropdownMenuItem`, so the two APIs describe the same thing and must
35
+ * not drift. Only the fields listed here are part of the data API; add a key to
36
+ * the `Pick` to expose more of the item's props to `items`.
37
+ */
38
+ export interface DropdownMenuItemData extends Pick<DropdownMenuItemProps, 'icon' | 'onClick' | 'isDisabled' | 'variant' | 'description' | 'endContent' | 'hasCloseOnSelect'> {
39
+ /**
40
+ * Stable identity for the row, used as its React key (as on
41
+ * `TreeListItemData`). Omit it and the row is keyed by position, which is
42
+ * correct for a fixed menu; set it when `items` can reorder, filter, or grow,
43
+ * so a row keeps its DOM node — and therefore keyboard focus — as the array
44
+ * changes around it.
45
+ */
46
+ id?: string;
47
+ /** Primary label content. */
48
+ label: ReactNode;
30
49
  /**
31
50
  * Nested submenu entries. When present, this row becomes a submenu (a
32
51
  * flyout revealing `items`) instead of a leaf action — no separate item
@@ -34,15 +53,21 @@ export interface DropdownMenuItemData {
34
53
  */
35
54
  items?: DropdownMenuOption[];
36
55
  }
37
- export interface DropdownMenuDivider {
56
+ /**
57
+ * Data-mode shape for a divider row. The compound-mode peer is the
58
+ * `DropdownMenuDivider` component, which both modes render.
59
+ */
60
+ export interface DropdownMenuDividerData {
38
61
  type: 'divider';
39
62
  }
40
63
  export interface DropdownMenuSection {
41
64
  type: 'section';
65
+ /** Stable identity for the group; see {@link DropdownMenuItemData.id}. */
66
+ id?: string;
42
67
  title?: string;
43
68
  items: DropdownMenuItemData[];
44
69
  }
45
- export type DropdownMenuOption = DropdownMenuItemData | DropdownMenuDivider | DropdownMenuSection;
70
+ export type DropdownMenuOption = DropdownMenuItemData | DropdownMenuDividerData | DropdownMenuSection;
46
71
  export type DropdownMenuButtonProps = Omit<ButtonProps, 'onClick'>;
47
72
  interface DropdownMenuBaseProps extends BaseProps {
48
73
  button?: DropdownMenuButtonProps;
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAS,KAAK,WAAW,EAAC,MAAM,WAAW,CAAC;AAEnD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAetC,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAQtE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAyC5C,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,kBAAkB,GAC5B,oBAAoB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAMnE,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAEnE,UAAU,qBAAsB,SAAQ,SAAS;IAC/C,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,qBAAsB,SAAQ,qBAAqB;IAC3D,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,UAAU,yBAA0B,SAAQ,qBAAqB;IAC/D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAC3B,qBAAqB,GAAG,yBAAyB,CAAC;AA+BpD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAiB,EACjB,SAAmB,EACnB,SAAmB,EACnB,SAAS,EACT,KAAK,EACL,MAAM,EACN,aAAa,EAAE,MAAM,EACrB,GAAG,KAAK,EACT,EAAE,iBAAiB,qBAwRnB;yBAtSe,YAAY"}
1
+ {"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAS,KAAK,WAAW,EAAC,MAAM,WAAW,CAAC;AAInD,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAa9D,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAQtE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAiC5C;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,qBAAqB,EACnB,MAAM,GACN,SAAS,GACT,YAAY,GACZ,SAAS,GACT,aAAa,GACb,YAAY,GACZ,kBAAkB,CACrB;IACC;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,kBAAkB,GAC5B,oBAAoB,GAAG,uBAAuB,GAAG,mBAAmB,CAAC;AAMvE,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAEnE,UAAU,qBAAsB,SAAQ,SAAS;IAC/C,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,qBAAsB,SAAQ,qBAAqB;IAC3D,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,UAAU,yBAA0B,SAAQ,qBAAqB;IAC/D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAC3B,qBAAqB,GAAG,yBAAyB,CAAC;AA+BpD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAiB,EACjB,SAAmB,EACnB,SAAmB,EACnB,SAAS,EACT,KAAK,EACL,MAAM,EACN,aAAa,EAAE,MAAM,EACrB,GAAG,KAAK,EACT,EAAE,iBAAiB,qBA2TnB;yBAzUe,YAAY"}
@@ -14,6 +14,11 @@
14
14
  *
15
15
  * Both modes use useListFocus for DOM-based keyboard navigation.
16
16
  *
17
+ * Initial focus on open follows the input modality: a keyboard open
18
+ * (Enter / Space / ArrowDown on the trigger) focuses the first enabled item
19
+ * (APG menu-button); a pointer open focuses the menu container itself so no
20
+ * item reads as pre-selected, and the first ArrowDown then moves to item 1.
21
+ *
17
22
  * SYNC: When modified, update these files to stay in sync:
18
23
  * - /packages/core/src/DropdownMenu/DropdownMenu.doc.mjs
19
24
  * - /packages/core/src/DropdownMenu/DropdownMenu.test.tsx
@@ -60,16 +65,6 @@ const styles = {
60
65
  k7Eaqz: "xrzjruh",
61
66
  $$css: true
62
67
  },
63
- popoverBlockGap: {
64
- keoZOQ: "xcsaf9d",
65
- k1K539: "x14cgwvg",
66
- $$css: true
67
- },
68
- popoverInlineGap: {
69
- keTefX: "x11g1kdw",
70
- k71WvV: "xnur1sd",
71
- $$css: true
72
- },
73
68
  popoverCustomWidth: width => [{
74
69
  k7Eaqz: (typeof width === 'number' ? `${width}px` : width) != null ? "xkj4a21" : typeof width === 'number' ? `${width}px` : width,
75
70
  $$css: true
@@ -82,6 +77,20 @@ const styles = {
82
77
  // Types
83
78
  // =============================================================================
84
79
 
80
+ /**
81
+ * Data-mode shape for one menu row.
82
+ *
83
+ * The item fields are sourced from `DropdownMenuItemProps` — data mode renders
84
+ * through `DropdownMenuItem`, so the two APIs describe the same thing and must
85
+ * not drift. Only the fields listed here are part of the data API; add a key to
86
+ * the `Pick` to expose more of the item's props to `items`.
87
+ */
88
+
89
+ /**
90
+ * Data-mode shape for a divider row. The compound-mode peer is the
91
+ * `DropdownMenuDivider` component, which both modes render.
92
+ */
93
+
85
94
  // =============================================================================
86
95
  // Props
87
96
  // =============================================================================
@@ -170,6 +179,13 @@ export function DropdownMenu({
170
179
  // Defer item focus until the layer has committed open, so focus restore
171
180
  // captures the trigger instead of the first menu item.
172
181
  const shouldFocusOnOpenRef = useRef(false);
182
+
183
+ // How the next open was initiated. Keyboard (and programmatic) opens focus
184
+ // the first enabled item per the APG menu-button pattern; pointer opens
185
+ // focus the menu container instead, so no item is visually highlighted as
186
+ // if pre-selected (#4477). Reset to 'keyboard' after every open so
187
+ // programmatic controlled opens keep the item-focus behavior.
188
+ const openModalityRef = useRef('keyboard');
173
189
  const handleLayerShow = useCallback(() => {
174
190
  onOpenChange?.(true);
175
191
  if (!isControlled) {
@@ -229,14 +245,26 @@ export function DropdownMenu({
229
245
  }
230
246
  }, [controlledIsOpen, isControlled, popover]);
231
247
 
232
- // Move focus into the menu only after the layer has committed open.
248
+ // Move focus into the menu only after the layer has committed open,
249
+ // honoring the input modality: keyboard (and programmatic) opens land on
250
+ // the first enabled item per the APG menu-button pattern; pointer opens
251
+ // focus the menu container itself (tabIndex={-1}) so no item is
252
+ // highlighted as if pre-selected (#4477). Container focus keeps arrows,
253
+ // typeahead, Escape and Tab in the menu's onKeyDown, and is also the
254
+ // fallback when no item is focusable (e.g. all disabled), mirroring the
255
+ // submenu flyout fallback.
233
256
  useEffect(() => {
234
257
  if (!popover.isOpen || !shouldFocusOnOpenRef.current) {
235
258
  return;
236
259
  }
237
260
  shouldFocusOnOpenRef.current = false;
238
- requestAnimationFrame(() => focusFirst());
239
- }, [popover.isOpen, focusFirst]);
261
+ requestAnimationFrame(() => {
262
+ if (openModalityRef.current === 'pointer' || !focusFirst()) {
263
+ listRef.current?.focus();
264
+ }
265
+ openModalityRef.current = 'keyboard';
266
+ });
267
+ }, [popover.isOpen, focusFirst, listRef]);
240
268
 
241
269
  // Extend useListFocus with Enter/Space activation + typeahead
242
270
  const listKeyDown = useCallback(e => {
@@ -269,25 +297,34 @@ export function DropdownMenu({
269
297
  }
270
298
  listNavKeyDown(e);
271
299
  }, [listNavKeyDown, closeMenu, typeahead, ownsEvent]);
272
- const openAndFocus = useCallback(() => {
300
+ const openAndFocus = useCallback((modality = 'keyboard') => {
301
+ openModalityRef.current = modality;
273
302
  shouldFocusOnOpenRef.current = true;
274
303
  popover.show();
275
304
  }, [popover]);
276
- const handleButtonClick = useCallback(() => {
305
+ const handleButtonClick = useCallback(e => {
277
306
  // If the menu was just closed by light dismiss (e.g. iOS Safari fires
278
307
  // pointerdown → hide before the trigger's click), the click would
279
- // otherwise immediately re-open it. Short-circuit within the guard window.
308
+ // otherwise immediately re-open it. Short-circuit within the guard
309
+ // window.
280
310
  if (Date.now() - lastHideTimeRef.current < 50) {
281
311
  return;
282
312
  }
283
313
  onClick?.();
314
+ // detail === 0 marks a synthesized click (screen reader / AT
315
+ // activation): treat it as keyboard so those users still land on the
316
+ // first item. Real pointer clicks report detail >= 1.
317
+ const modality = e.detail === 0 ? 'keyboard' : 'pointer';
284
318
  if (isControlled) {
319
+ if (!controlledIsOpen) {
320
+ openModalityRef.current = modality;
321
+ }
285
322
  onOpenChange?.(!controlledIsOpen);
286
323
  } else {
287
324
  if (popover.isOpen) {
288
325
  popover.hide();
289
326
  } else {
290
- openAndFocus();
327
+ openAndFocus(modality);
291
328
  }
292
329
  }
293
330
  }, [onClick, isControlled, onOpenChange, controlledIsOpen, popover, openAndFocus]);
@@ -309,8 +346,6 @@ export function DropdownMenu({
309
346
  color: "inherit"
310
347
  }) : undefined);
311
348
  const popoverXstyle = menuWidth ? styles.popoverCustomWidth(menuWidth) : styles.popover;
312
- const popoverGapStyle = placement === 'above' || placement === 'below' ? styles.popoverBlockGap : styles.popoverInlineGap;
313
-
314
349
  // Context for compound items
315
350
  const contextValue = useMemo(() => ({
316
351
  closeMenu,
@@ -347,6 +382,12 @@ export function DropdownMenu({
347
382
  ref: listRef,
348
383
  id: menuId,
349
384
  role: "menu"
385
+ // Focus target for pointer opens (not in the Tab order): holding
386
+ // focus on the container keeps key events (arrows, typeahead,
387
+ // Escape, Tab) inside the menu without highlighting any item.
388
+ // Mirrors the DropdownMenuSubMenu flyout container.
389
+ ,
390
+ tabIndex: -1
350
391
  // Give the menu an accessible name from its trigger's label, so
351
392
  // screen readers announce e.g. "Actions menu" rather than an unnamed
352
393
  // menu (menus-13).
@@ -361,7 +402,8 @@ export function DropdownMenu({
361
402
  }), {
362
403
  placement,
363
404
  alignment,
364
- xstyle: [popoverXstyle, popoverGapStyle, layerAnimations[placement]]
405
+ offset: spacingVars['--spacing-1'],
406
+ xstyle: [popoverXstyle, layerAnimations[placement]]
365
407
  })]
366
408
  });
367
409
  }
@@ -11,17 +11,14 @@
11
11
  * Enter/Space activation come from the parent DropdownMenu's useListFocus +
12
12
  * activation path, which matches menuitemcheckbox alongside plain menuitem rows.
13
13
  *
14
- * The checkbox visual composes the real CheckboxInput primitive so its checkmark
15
- * matches CheckboxListItem and picks up the standard `checkbox` theming slots.
16
- * It is purely decorative: the composed control is wrapped in an element that is
17
- * both `aria-hidden` and `inert`, so it contributes nothing to the row's
18
- * accessible name, and its native <input> and sr-only label stay out of the tab
19
- * order and the accessibility tree while pointer clicks fall through to the row
20
- * the same shim MultiSelector uses. The row owns the checked state and
21
- * accessible name. The control size is derived from the menu's item size (a
22
- * `sm` menu gets the compact control; `md`/`lg` get the standard one) and it
23
- * swaps to the inline-end of the row on coarse-pointer (touch) devices via CSS
24
- * `order`, so it lands where selection toggles are conventionally placed on
14
+ * The checkbox visual is the shared checkbox indicator, decorative
15
+ * (aria-hidden) the row owns the role, checked state, and accessible name, so
16
+ * there is no nested native <input> to shim out of the accessibility tree. It
17
+ * picks up the same `checkbox` theming (and any theme replacement) as
18
+ * CheckboxInput. The control size is derived from the menu's item size (a `sm`
19
+ * menu gets the compact control; `md`/`lg` get the standard one) and the marker
20
+ * box swaps to the inline-end of the row on coarse-pointer (touch) devices via
21
+ * CSS `order`, so it lands where selection toggles are conventionally placed on
25
22
  * mobile.
26
23
  */
27
24
  import { type ReactNode } from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenuCheckboxItem.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuCheckboxItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAErE,OAAO,EAAiB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAOtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAsC5C,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,SAAS,EACT,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAClD;IACC;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,UAAkB,EAClB,gBAAwB,EACxB,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,6BAA6B,+BA6D/B;yBA1Ee,wBAAwB"}
1
+ {"version":3,"file":"DropdownMenuCheckboxItem.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuCheckboxItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAErE,OAAO,EAAiB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAOtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAyC5C,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,SAAS,EACT,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAClD;IACC;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,UAAkB,EAClB,gBAAwB,EACxB,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,6BAA6B,+BA0D/B;yBAvEe,wBAAwB"}
@@ -15,23 +15,20 @@
15
15
  * Enter/Space activation come from the parent DropdownMenu's useListFocus +
16
16
  * activation path, which matches menuitemcheckbox alongside plain menuitem rows.
17
17
  *
18
- * The checkbox visual composes the real CheckboxInput primitive so its checkmark
19
- * matches CheckboxListItem and picks up the standard `checkbox` theming slots.
20
- * It is purely decorative: the composed control is wrapped in an element that is
21
- * both `aria-hidden` and `inert`, so it contributes nothing to the row's
22
- * accessible name, and its native <input> and sr-only label stay out of the tab
23
- * order and the accessibility tree while pointer clicks fall through to the row
24
- * the same shim MultiSelector uses. The row owns the checked state and
25
- * accessible name. The control size is derived from the menu's item size (a
26
- * `sm` menu gets the compact control; `md`/`lg` get the standard one) and it
27
- * swaps to the inline-end of the row on coarse-pointer (touch) devices via CSS
28
- * `order`, so it lands where selection toggles are conventionally placed on
18
+ * The checkbox visual is the shared checkbox indicator, decorative
19
+ * (aria-hidden) the row owns the role, checked state, and accessible name, so
20
+ * there is no nested native <input> to shim out of the accessibility tree. It
21
+ * picks up the same `checkbox` theming (and any theme replacement) as
22
+ * CheckboxInput. The control size is derived from the menu's item size (a `sm`
23
+ * menu gets the compact control; `md`/`lg` get the standard one) and the marker
24
+ * box swaps to the inline-end of the row on coarse-pointer (touch) devices via
25
+ * CSS `order`, so it lands where selection toggles are conventionally placed on
29
26
  * mobile.
30
27
  */
31
28
  import { useCallback } from 'react';
32
29
  import * as stylex from '@stylexjs/stylex';
33
30
  import { renderIconSlot } from "../Icon/index.js";
34
- import { CheckboxInput } from "../CheckboxInput/CheckboxInput.js";
31
+ import { useIndicator } from "../Indicator/index.js";
35
32
  import { Item } from "../Item/index.js";
36
33
  import { useDropdownMenuContext } from "./DropdownMenuContext.js";
37
34
  import { focusMenuItemOnHover } from "./menuItemHover.js";
@@ -53,8 +50,18 @@ const styles = {
53
50
  kSiTet: "xbyyjgo",
54
51
  kkrTdU: "x1h6gzvc",
55
52
  $$css: true
53
+ },
54
+ marker: {
55
+ kfzvcC: "x47corl",
56
+ kayTVb: "x1g77sc7 xozvky",
57
+ keTefX: "x1lziwak x1jymrmb",
58
+ $$css: true
56
59
  }
57
60
  };
61
+
62
+ // Matches the control sizes CheckboxInput uses, so a checkbox reads the same in
63
+ // a menu row as it does in a form.
64
+
58
65
  /**
59
66
  * A checkable dropdown menu item (role="menuitemcheckbox").
60
67
  *
@@ -90,12 +97,7 @@ export function DropdownMenuCheckboxItem({
90
97
  const ctx = useDropdownMenuContext();
91
98
  const menuSize = ctx?.menuSize ?? 'md';
92
99
  const controlSize = menuSize === 'sm' ? 'sm' : 'md';
93
-
94
- // The composed checkbox is decorative and inert, so its label never reaches
95
- // the accessibility tree — the row's `label` prop provides the announced
96
- // name. CheckboxInput still requires a string label, so pass one through when
97
- // the row label is a plain string.
98
- const checkboxLabel = typeof label === 'string' ? label : '';
100
+ const CheckboxControl = useIndicator('checkbox');
99
101
  const handleClick = useCallback(() => {
100
102
  if (isDisabled) {
101
103
  return;
@@ -112,19 +114,18 @@ export function DropdownMenuCheckboxItem({
112
114
  "aria-checked": value,
113
115
  tabIndex: isDisabled ? undefined : -1,
114
116
  onPointerMove: handlePointerMove,
115
- marker: /*#__PURE__*/_jsx("div", {
116
- "aria-hidden": "true",
117
- inert: true,
118
- ...{
119
- className: "x78zum5 x2lah0s x47corl x1g77sc7 xozvky x1lziwak x1jymrmb"
120
- },
121
- children: /*#__PURE__*/_jsx(CheckboxInput, {
122
- label: checkboxLabel,
123
- isLabelHidden: true,
124
- value: value,
125
- isDisabled: isDisabled,
126
- size: controlSize
127
- })
117
+ marker:
118
+ /*#__PURE__*/
119
+ // No wrapper, and no menu-specific theme target: the shared
120
+ // `astryx-checkbox` target is already on this element (main reached
121
+ // the menu checkbox through it too), so the menu adds only its own
122
+ // placement rules. A wrapper here would have duplicated the
123
+ // indicator's control size and moved nothing themeable.
124
+ _jsx(CheckboxControl, {
125
+ state: value ? 'checked' : 'unchecked',
126
+ size: controlSize,
127
+ isDisabled: isDisabled,
128
+ xstyle: styles.marker
128
129
  }),
129
130
  startContent: icon ? renderIconSlot(icon, {
130
131
  size: 'sm',
@@ -0,0 +1,25 @@
1
+ import type { BaseProps } from '../BaseProps';
2
+ export interface DropdownMenuDividerProps extends Pick<BaseProps, 'xstyle' | 'className' | 'style'> {
3
+ /** Ref forwarded to the separator element. */
4
+ ref?: React.Ref<HTMLDivElement>;
5
+ }
6
+ /**
7
+ * A horizontal rule separating groups of menu rows.
8
+ *
9
+ * Renders `role="separator"`, so it is never a stop in the menu's arrow-key
10
+ * order. Equivalent to `{type: 'divider'}` in the `items` data API.
11
+ *
12
+ * @example
13
+ * ```
14
+ * <DropdownMenu button={{ label: 'Actions' }}>
15
+ * <DropdownMenuItem label="Edit" onClick={handleEdit} />
16
+ * <DropdownMenuDivider />
17
+ * <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
18
+ * </DropdownMenu>
19
+ * ```
20
+ */
21
+ export declare function DropdownMenuDivider({ xstyle, className, style, ref, }: DropdownMenuDividerProps): import("react").JSX.Element;
22
+ export declare namespace DropdownMenuDivider {
23
+ var displayName: string;
24
+ }
25
+ //# sourceMappingURL=DropdownMenuDivider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownMenuDivider.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuDivider.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAW5C,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CACpD,SAAS,EACT,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC;IACC,8CAA8C;IAC9C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,GACJ,EAAE,wBAAwB,+BAW1B;yBAhBe,mBAAmB"}
@@ -0,0 +1,66 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file DropdownMenuDivider.tsx
7
+ * @input Uses Divider, spacing tokens, themeProps
8
+ * @output Exports DropdownMenuDivider component and DropdownMenuDividerProps
9
+ * @position Sub-component; used inside DropdownMenu
10
+ *
11
+ * The compound-mode peer of the data API's `{type: 'divider'}` option. The
12
+ * data path renders this same component, so neither mode can drift from the
13
+ * other in DOM, spacing, or theme target.
14
+ *
15
+ * SYNC: When modified, update these files to stay in sync:
16
+ * - /packages/core/src/DropdownMenu/DropdownMenu.doc.mjs
17
+ * - /packages/core/src/DropdownMenu/DropdownMenuDivider.doc.mjs
18
+ * - /packages/core/src/DropdownMenu/DropdownMenu.test.tsx
19
+ * - /packages/core/src/DropdownMenu/index.ts
20
+ * - /packages/core/src/ContextMenu/index.ts
21
+ * - /packages/core/src/Breadcrumbs/index.ts
22
+ * - /apps/storybook/stories/DropdownMenu.stories.tsx
23
+ * - /packages/cli/assets/templates/blocks/components/DropdownMenu/ (showcase blocks)
24
+ */
25
+ import * as stylex from '@stylexjs/stylex';
26
+ import { Divider } from "../Divider/index.js";
27
+ import "../theme/tokens.stylex.js";
28
+ import { spacingVars } from "../theme/tokens.stylex.js";
29
+ import { themeProps } from "../utils/themeProps.js";
30
+ import { jsx as _jsx } from "react/jsx-runtime";
31
+ const styles = {
32
+ divider: {
33
+ kqGvvJ: "xsq74q5",
34
+ $$css: true
35
+ }
36
+ };
37
+ const THEME_CLASS_NAME = themeProps('dropdown-menu-divider').className;
38
+ /**
39
+ * A horizontal rule separating groups of menu rows.
40
+ *
41
+ * Renders `role="separator"`, so it is never a stop in the menu's arrow-key
42
+ * order. Equivalent to `{type: 'divider'}` in the `items` data API.
43
+ *
44
+ * @example
45
+ * ```
46
+ * <DropdownMenu button={{ label: 'Actions' }}>
47
+ * <DropdownMenuItem label="Edit" onClick={handleEdit} />
48
+ * <DropdownMenuDivider />
49
+ * <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
50
+ * </DropdownMenu>
51
+ * ```
52
+ */
53
+ export function DropdownMenuDivider({
54
+ xstyle,
55
+ className,
56
+ style,
57
+ ref
58
+ }) {
59
+ return /*#__PURE__*/_jsx(Divider, {
60
+ ref: ref,
61
+ xstyle: [styles.divider, xstyle],
62
+ className: className ? `${THEME_CLASS_NAME} ${className}` : THEME_CLASS_NAME,
63
+ style: style
64
+ });
65
+ }
66
+ DropdownMenuDivider.displayName = 'DropdownMenuDivider';
@@ -34,6 +34,19 @@ export interface DropdownMenuItemProps extends Pick<BaseProps, 'xstyle' | 'class
34
34
  isDisabled?: boolean;
35
35
  /** Additional content to render after the label/description. */
36
36
  endContent?: ReactNode;
37
+ /**
38
+ * Whether activating the item closes the menu. Set `false` for an action
39
+ * that reports its result on the item itself (a copy row swapping to
40
+ * "Copied"), matching the checkbox and radio items, which already decide
41
+ * this for themselves.
42
+ * @default true
43
+ */
44
+ hasCloseOnSelect?: boolean;
45
+ /**
46
+ * Visual variant. `'destructive'` renders the label, description, and icon in
47
+ * the error color for dangerous actions (e.g. Delete). @default 'default'
48
+ */
49
+ variant?: 'default' | 'destructive';
37
50
  }
38
51
  /**
39
52
  * An interactive dropdown menu item with icon, label, and optional description.
@@ -45,11 +58,11 @@ export interface DropdownMenuItemProps extends Pick<BaseProps, 'xstyle' | 'class
45
58
  * ```
46
59
  * <DropdownMenu button={{ label: 'Actions' }}>
47
60
  * <DropdownMenuItem icon={PencilIcon} label="Edit" onClick={handleEdit} />
48
- * <DropdownMenuItem label="Delete" endContent={<Badge label="⌘D" />} onClick={handleDelete} />
61
+ * <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
49
62
  * </DropdownMenu>
50
63
  * ```
51
64
  */
52
- export declare function DropdownMenuItem({ icon, label, description, onClick, isDisabled, endContent, xstyle, className, style, }: DropdownMenuItemProps): import("react").JSX.Element;
65
+ export declare function DropdownMenuItem({ icon, label, description, onClick, isDisabled, endContent, hasCloseOnSelect, variant, xstyle, className, style, }: DropdownMenuItemProps): import("react").JSX.Element;
53
66
  export declare namespace DropdownMenuItem {
54
67
  var displayName: string;
55
68
  }