@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697

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 (635) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.d.ts +0 -2
  6. package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
  7. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
  8. package/dist/AppShell/AppShell.d.ts +1 -1
  9. package/dist/AppShell/AppShell.d.ts.map +1 -1
  10. package/dist/AppShell/AppShell.js +55 -53
  11. package/dist/AspectRatio/AspectRatio.d.ts +48 -10
  12. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  13. package/dist/AspectRatio/AspectRatio.js +33 -12
  14. package/dist/AspectRatio/index.d.ts +1 -1
  15. package/dist/AspectRatio/index.d.ts.map +1 -1
  16. package/dist/Avatar/Avatar.d.ts.map +1 -1
  17. package/dist/Avatar/Avatar.js +28 -26
  18. package/dist/Avatar/AvatarStatusDot.js +6 -6
  19. package/dist/AvatarGroup/AvatarGroup.js +6 -6
  20. package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
  21. package/dist/Badge/Badge.js +3 -3
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +32 -25
  24. package/dist/Blockquote/Blockquote.js +7 -7
  25. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  26. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  27. package/dist/Button/Button.js +19 -19
  28. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  29. package/dist/Calendar/Calendar.d.ts.map +1 -1
  30. package/dist/Calendar/Calendar.js +68 -48
  31. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  32. package/dist/Calendar/styles.d.ts +2 -2
  33. package/dist/Calendar/styles.d.ts.map +1 -1
  34. package/dist/Calendar/styles.js +2 -2
  35. package/dist/Card/Card.d.ts +4 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +18 -10
  38. package/dist/Carousel/Carousel.d.ts.map +1 -1
  39. package/dist/Carousel/Carousel.js +24 -21
  40. package/dist/Center/Center.js +3 -3
  41. package/dist/Chat/ChatComposer.js +23 -23
  42. package/dist/Chat/ChatComposerDrawer.js +14 -14
  43. package/dist/Chat/ChatComposerInput.d.ts +1 -1
  44. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  45. package/dist/Chat/ChatComposerInput.js +27 -15
  46. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  47. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatDictationButton.js +13 -11
  49. package/dist/Chat/ChatLayout.js +17 -17
  50. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  51. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  52. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  53. package/dist/Chat/ChatMessage.js +12 -12
  54. package/dist/Chat/ChatMessageBubble.js +7 -7
  55. package/dist/Chat/ChatMessageList.js +14 -14
  56. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  57. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  58. package/dist/Chat/ChatMessageMetadata.js +14 -12
  59. package/dist/Chat/ChatPastedTextToken.js +13 -13
  60. package/dist/Chat/ChatSendButton.js +3 -3
  61. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  62. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  63. package/dist/Chat/ChatSystemMessage.js +17 -17
  64. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  65. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  66. package/dist/Chat/ChatTokenizedText.js +24 -15
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +81 -74
  69. package/dist/Chat/index.d.ts +1 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  72. package/dist/Chat/useTriggerMenu.js +15 -15
  73. package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
  74. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  75. package/dist/CheckboxInput/CheckboxInput.js +25 -23
  76. package/dist/CheckboxList/CheckboxList.js +9 -9
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  80. package/dist/Citation/Citation.js +10 -10
  81. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  82. package/dist/ClickableCard/ClickableCard.js +32 -9
  83. package/dist/Code/Code.js +3 -3
  84. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  85. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  86. package/dist/CodeBlock/CodeBlock.js +88 -52
  87. package/dist/Collapsible/Collapsible.d.ts +9 -3
  88. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  89. package/dist/Collapsible/Collapsible.js +109 -22
  90. package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
  91. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  92. package/dist/Collapsible/CollapsibleGroup.js +64 -12
  93. package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  95. package/dist/Collapsible/CollapsibleGroupContext.js +26 -3
  96. package/dist/Collapsible/index.d.ts +1 -0
  97. package/dist/Collapsible/index.d.ts.map +1 -1
  98. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  99. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  100. package/dist/Collapsible/useCollapsible.js +20 -6
  101. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  102. package/dist/CommandPalette/CommandPalette.js +36 -34
  103. package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
  104. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  105. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  106. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  107. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  108. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  109. package/dist/ContextMenu/ContextMenu.d.ts +7 -2
  110. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  111. package/dist/ContextMenu/ContextMenu.js +76 -43
  112. package/dist/DateInput/DateInput.js +18 -18
  113. package/dist/DateRangeInput/DateRangeInput.js +21 -21
  114. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  115. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  116. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  117. package/dist/DateTimeInput/index.d.ts +1 -1
  118. package/dist/DateTimeInput/index.d.ts.map +1 -1
  119. package/dist/Dialog/Dialog.js +9 -9
  120. package/dist/Dialog/DialogHeader.js +16 -16
  121. package/dist/Dialog/useImperativeDialog.js +3 -3
  122. package/dist/Divider/Divider.js +7 -7
  123. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  124. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  125. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  126. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  127. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  128. package/dist/EmptyState/EmptyState.js +9 -9
  129. package/dist/Field/Field.js +17 -17
  130. package/dist/Field/FieldLabel.js +15 -15
  131. package/dist/Field/InputClearButton.js +5 -5
  132. package/dist/FieldStatus/FieldStatus.js +3 -3
  133. package/dist/FileInput/FileInput.js +29 -29
  134. package/dist/FormLayout/FormLayout.js +5 -5
  135. package/dist/Grid/Grid.d.ts +4 -3
  136. package/dist/Grid/Grid.d.ts.map +1 -1
  137. package/dist/Grid/Grid.js +29 -12
  138. package/dist/Grid/GridSpan.js +3 -3
  139. package/dist/HStack/HStack.js +3 -3
  140. package/dist/Heading/Heading.js +10 -10
  141. package/dist/HoverCard/HoverCard.js +9 -9
  142. package/dist/HoverCard/useHoverCard.d.ts +5 -1
  143. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  144. package/dist/HoverCard/useHoverCard.js +3 -3
  145. package/dist/Icon/Icon.d.ts.map +1 -1
  146. package/dist/Icon/Icon.js +16 -12
  147. package/dist/Icon/defaultIcons.js +116 -116
  148. package/dist/IconButton/IconButton.js +3 -3
  149. package/dist/InputGroup/InputGroup.js +11 -11
  150. package/dist/InputGroup/InputGroupText.js +3 -3
  151. package/dist/Item/Item.js +18 -18
  152. package/dist/Kbd/Kbd.js +5 -5
  153. package/dist/Layer/LayerProvider.js +7 -7
  154. package/dist/Layer/useLayer.d.ts +29 -2
  155. package/dist/Layer/useLayer.d.ts.map +1 -1
  156. package/dist/Layer/useLayer.js +44 -31
  157. package/dist/Layout/Layout.js +21 -21
  158. package/dist/Layout/LayoutContent.js +3 -3
  159. package/dist/Layout/LayoutFooter.js +5 -5
  160. package/dist/Layout/LayoutHeader.js +5 -5
  161. package/dist/Layout/LayoutPanel.js +3 -3
  162. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  163. package/dist/Lightbox/Lightbox.js +55 -31
  164. package/dist/Lightbox/useLightbox.d.ts +0 -1
  165. package/dist/Lightbox/useLightbox.d.ts.map +1 -1
  166. package/dist/Lightbox/useLightbox.js +3 -4
  167. package/dist/Link/Link.d.ts +0 -2
  168. package/dist/Link/Link.d.ts.map +1 -1
  169. package/dist/Link/Link.js +15 -17
  170. package/dist/Link/LinkProvider.js +3 -3
  171. package/dist/Link/useLinkify.js +3 -3
  172. package/dist/List/List.js +11 -11
  173. package/dist/List/ListItem.js +11 -11
  174. package/dist/Markdown/Markdown.d.ts.map +1 -1
  175. package/dist/Markdown/Markdown.js +102 -102
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.d.ts +1 -1
  179. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  180. package/dist/MobileNav/MobileNav.js +26 -23
  181. package/dist/MobileNav/MobileNavToggle.js +5 -5
  182. package/dist/MoreMenu/MoreMenu.js +3 -3
  183. package/dist/MultiSelector/MultiSelector.js +56 -56
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.d.ts +0 -3
  194. package/dist/Overlay/useOverlay.d.ts.map +1 -1
  195. package/dist/Overlay/useOverlay.js +3 -6
  196. package/dist/Pagination/Pagination.d.ts +1 -1
  197. package/dist/Pagination/Pagination.d.ts.map +1 -1
  198. package/dist/Pagination/Pagination.js +125 -72
  199. package/dist/Popover/Popover.js +16 -16
  200. package/dist/Popover/usePopover.js +7 -7
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +110 -92
  203. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  204. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  205. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  206. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  207. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  208. package/dist/ProgressBar/ProgressBar.js +25 -18
  209. package/dist/RadioList/RadioList.js +7 -7
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +24 -21
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.js +46 -46
  224. package/dist/Selector/SelectorOption.js +3 -3
  225. package/dist/SideNav/SideNav.d.ts.map +1 -1
  226. package/dist/SideNav/SideNav.js +38 -34
  227. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  228. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  229. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  230. package/dist/SideNav/SideNavHeading.js +87 -87
  231. package/dist/SideNav/SideNavItem.js +42 -42
  232. package/dist/SideNav/SideNavSection.d.ts +1 -1
  233. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  234. package/dist/SideNav/SideNavSection.js +18 -16
  235. package/dist/Skeleton/Skeleton.js +3 -3
  236. package/dist/Slider/Slider.js +23 -23
  237. package/dist/Spinner/Spinner.js +9 -9
  238. package/dist/StatusDot/StatusDot.js +5 -5
  239. package/dist/Switch/Switch.d.ts +8 -4
  240. package/dist/Switch/Switch.d.ts.map +1 -1
  241. package/dist/Switch/Switch.js +34 -29
  242. package/dist/TabList/Tab.js +18 -18
  243. package/dist/TabList/TabList.js +5 -5
  244. package/dist/TabList/TabMenu.d.ts.map +1 -1
  245. package/dist/TabList/TabMenu.js +57 -30
  246. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  247. package/dist/Table/BaseTable.d.ts.map +1 -1
  248. package/dist/Table/BaseTable.js +50 -39
  249. package/dist/Table/Table.js +7 -7
  250. package/dist/Table/TableBody.d.ts +1 -1
  251. package/dist/Table/TableBody.d.ts.map +1 -1
  252. package/dist/Table/TableBody.js +9 -5
  253. package/dist/Table/TableCell.js +3 -3
  254. package/dist/Table/TableFooter.d.ts +1 -1
  255. package/dist/Table/TableFooter.d.ts.map +1 -1
  256. package/dist/Table/TableFooter.js +9 -5
  257. package/dist/Table/TableHeader.d.ts +1 -1
  258. package/dist/Table/TableHeader.d.ts.map +1 -1
  259. package/dist/Table/TableHeader.js +9 -5
  260. package/dist/Table/TableHeaderCell.js +3 -3
  261. package/dist/Table/TableRow.js +5 -5
  262. package/dist/Table/index.d.ts +2 -0
  263. package/dist/Table/index.d.ts.map +1 -1
  264. package/dist/Table/index.js +1 -0
  265. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  266. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  267. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  268. package/dist/Table/plugins/groupedRows/index.d.ts +3 -0
  269. package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
  270. package/dist/Table/plugins/groupedRows/index.js +3 -0
  271. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
  272. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
  273. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
  278. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
  279. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  280. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  281. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  282. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  283. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  284. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  285. package/dist/Table/tableContextMenu.js +9 -9
  286. package/dist/Text/Text.js +10 -10
  287. package/dist/TextArea/TextArea.js +14 -14
  288. package/dist/TextInput/TextInput.js +15 -15
  289. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  290. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  291. package/dist/Thumbnail/Thumbnail.js +30 -29
  292. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  293. package/dist/TimeInput/TimeInput.js +26 -21
  294. package/dist/Timestamp/Timestamp.d.ts +1 -1
  295. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  296. package/dist/Timestamp/Timestamp.js +37 -26
  297. package/dist/Toast/Toast.d.ts.map +1 -1
  298. package/dist/Toast/Toast.js +25 -17
  299. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  300. package/dist/Toast/ToastViewport.js +23 -11
  301. package/dist/Toast/useToast.d.ts.map +1 -1
  302. package/dist/Toast/useToast.js +44 -4
  303. package/dist/ToggleButton/ToggleButton.js +12 -12
  304. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  305. package/dist/Token/Token.js +21 -21
  306. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  307. package/dist/Tokenizer/Tokenizer.js +36 -34
  308. package/dist/Toolbar/Toolbar.js +18 -18
  309. package/dist/Tooltip/Tooltip.js +11 -11
  310. package/dist/Tooltip/useTooltip.d.ts +5 -1
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +3 -3
  313. package/dist/TopNav/TopNav.js +32 -32
  314. package/dist/TopNav/TopNavHeading.js +67 -67
  315. package/dist/TopNav/TopNavItem.js +5 -5
  316. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  319. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  320. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  321. package/dist/TopNav/TopNavMenu.js +32 -32
  322. package/dist/TreeList/TreeList.js +8 -8
  323. package/dist/TreeList/TreeListBranches.js +11 -11
  324. package/dist/TreeList/TreeListItem.js +30 -30
  325. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  326. package/dist/Typeahead/BaseTypeahead.js +23 -20
  327. package/dist/Typeahead/Typeahead.js +12 -12
  328. package/dist/Typeahead/TypeaheadItem.js +10 -10
  329. package/dist/VStack/VStack.js +3 -3
  330. package/dist/VisuallyHidden/VisuallyHidden.d.ts +0 -3
  331. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  332. package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
  333. package/dist/astryx.css +7 -0
  334. package/dist/astryx.umd.js +63 -63
  335. package/dist/astryx.umd.js.map +4 -4
  336. package/dist/docs-types.d.ts +8 -2
  337. package/dist/docs-types.d.ts.map +1 -1
  338. package/dist/hooks/focusableSelector.d.ts +1 -1
  339. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  340. package/dist/hooks/focusableSelector.js +1 -1
  341. package/dist/hooks/index.d.ts +2 -0
  342. package/dist/hooks/index.d.ts.map +1 -1
  343. package/dist/hooks/index.js +1 -0
  344. package/dist/hooks/useFocusTrap.d.ts +3 -0
  345. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  346. package/dist/hooks/useFocusTrap.js +38 -1
  347. package/dist/hooks/useHotkeys.d.ts +51 -0
  348. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  349. package/dist/hooks/useHotkeys.js +160 -0
  350. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  351. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  352. package/dist/hooks/useInteractiveRole.js +6 -2
  353. package/dist/hooks/useKeyboardHint.js +9 -9
  354. package/dist/hooks/useStreamingText.d.ts +3 -1
  355. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  356. package/dist/hooks/useStreamingText.js +14 -5
  357. package/dist/theme/MediaTheme.js +3 -3
  358. package/dist/theme/Theme.js +7 -7
  359. package/dist/theme/defineTheme.d.ts +1 -1
  360. package/dist/theme/defineTheme.d.ts.map +1 -1
  361. package/dist/theme/expandColorScale.d.ts.map +1 -1
  362. package/dist/theme/expandColorScale.js +10 -3
  363. package/dist/theme/hct.d.ts +0 -15
  364. package/dist/theme/hct.d.ts.map +1 -1
  365. package/dist/theme/hct.js +9 -9
  366. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  367. package/dist/theme/tokens.d.ts +10 -2
  368. package/dist/theme/tokens.d.ts.map +1 -1
  369. package/dist/theme/tokens.js +220 -4
  370. package/dist/theme/useTheme.d.ts +3 -2
  371. package/dist/theme/useTheme.d.ts.map +1 -1
  372. package/dist/theme/useTheme.js +73 -6
  373. package/dist/utils/color.d.ts +42 -0
  374. package/dist/utils/color.d.ts.map +1 -0
  375. package/dist/utils/color.js +150 -0
  376. package/dist/utils/composeEventHandlers.d.ts +30 -0
  377. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  378. package/dist/utils/composeEventHandlers.js +40 -0
  379. package/dist/utils/index.d.ts +3 -0
  380. package/dist/utils/index.d.ts.map +1 -1
  381. package/dist/utils/index.js +3 -1
  382. package/dist/utils/timeParser.d.ts.map +1 -1
  383. package/dist/utils/timeParser.js +8 -5
  384. package/package.json +4 -4
  385. package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
  386. package/src/AlertDialog/AlertDialog.tsx +2 -0
  387. package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
  388. package/src/AppShell/AppShell.tsx +2 -0
  389. package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
  390. package/src/AspectRatio/AspectRatio.test.tsx +142 -1
  391. package/src/AspectRatio/AspectRatio.tsx +70 -10
  392. package/src/AspectRatio/index.ts +5 -1
  393. package/src/Avatar/Avatar.doc.mjs +11 -0
  394. package/src/Avatar/Avatar.test.tsx +32 -1
  395. package/src/Avatar/Avatar.tsx +14 -22
  396. package/src/Avatar/AvatarStatusDot.tsx +2 -2
  397. package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
  398. package/src/AvatarGroup/AvatarGroup.tsx +2 -2
  399. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
  400. package/src/Banner/Banner.doc.mjs +8 -0
  401. package/src/Banner/Banner.test.tsx +38 -0
  402. package/src/Banner/Banner.tsx +8 -1
  403. package/src/Calendar/Calendar.doc.mjs +1 -1
  404. package/src/Calendar/Calendar.test.tsx +122 -17
  405. package/src/Calendar/Calendar.tsx +26 -5
  406. package/src/Calendar/dayCellUtils.ts +3 -1
  407. package/src/Calendar/styles.ts +12 -2
  408. package/src/Card/Card.doc.mjs +1 -1
  409. package/src/Card/Card.tsx +16 -6
  410. package/src/Carousel/Carousel.doc.mjs +12 -12
  411. package/src/Carousel/Carousel.test.tsx +13 -0
  412. package/src/Carousel/Carousel.tsx +4 -2
  413. package/src/Chat/Chat.doc.mjs +1 -1
  414. package/src/Chat/ChatComposerInput.test.tsx +27 -1
  415. package/src/Chat/ChatComposerInput.tsx +20 -15
  416. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  417. package/src/Chat/ChatDictationButton.tsx +4 -4
  418. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  419. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  420. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  421. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  422. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  423. package/src/Chat/ChatSystemMessage.tsx +7 -7
  424. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  425. package/src/Chat/ChatTokenizedText.tsx +15 -8
  426. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  427. package/src/Chat/ChatToolCalls.tsx +10 -12
  428. package/src/Chat/index.ts +1 -4
  429. package/src/Chat/useTriggerMenu.tsx +1 -4
  430. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
  431. package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
  432. package/src/CheckboxInput/CheckboxInput.tsx +2 -0
  433. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  434. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  435. package/src/Citation/Citation.doc.mjs +5 -0
  436. package/src/ClickableCard/ClickableCard.tsx +45 -2
  437. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  438. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  439. package/src/CodeBlock/CodeBlock.tsx +62 -4
  440. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  441. package/src/Collapsible/Collapsible.test.tsx +403 -0
  442. package/src/Collapsible/Collapsible.tsx +85 -10
  443. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  444. package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
  445. package/src/Collapsible/CollapsibleGroup.tsx +97 -9
  446. package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
  447. package/src/Collapsible/index.ts +1 -0
  448. package/src/Collapsible/useCollapsible.ts +20 -6
  449. package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
  450. package/src/CommandPalette/CommandPalette.tsx +5 -3
  451. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  452. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  453. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  454. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  455. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  456. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  457. package/src/ContextMenu/ContextMenu.test.tsx +87 -0
  458. package/src/ContextMenu/ContextMenu.tsx +87 -28
  459. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  460. package/src/DateInput/DateInput.test.tsx +11 -20
  461. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
  462. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  463. package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
  464. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  465. package/src/DateTimeInput/DateTimeInput.tsx +8 -2
  466. package/src/DateTimeInput/index.ts +1 -0
  467. package/src/Dialog/Dialog.doc.mjs +4 -0
  468. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  469. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  470. package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
  471. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  472. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  473. package/src/Field/Field.test.tsx +1 -4
  474. package/src/Field/FieldLabel.test.tsx +2 -2
  475. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  476. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  477. package/src/Grid/Grid.test.tsx +43 -18
  478. package/src/Grid/Grid.tsx +26 -9
  479. package/src/HoverCard/HoverCard.doc.mjs +6 -6
  480. package/src/HoverCard/useHoverCard.doc.mjs +5 -5
  481. package/src/HoverCard/useHoverCard.tsx +9 -2
  482. package/src/Icon/Icon.test.tsx +41 -29
  483. package/src/Icon/Icon.tsx +6 -2
  484. package/src/InputGroup/InputGroup.doc.mjs +1 -0
  485. package/src/InputGroup/InputGroup.tsx +2 -2
  486. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  487. package/src/Item/Item.tsx +1 -1
  488. package/src/Layer/useLayer.doc.mjs +2 -2
  489. package/src/Layer/useLayer.test.tsx +221 -2
  490. package/src/Layer/useLayer.tsx +69 -30
  491. package/src/Layout/Layout.test.tsx +285 -0
  492. package/src/Layout/LayoutContent.doc.mjs +12 -0
  493. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  494. package/src/Layout/LayoutSlots.test.tsx +364 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Lightbox/useLightbox.tsx +0 -1
  499. package/src/Link/Link.tsx +0 -2
  500. package/src/Markdown/Markdown.tsx +9 -7
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/MobileNav/MobileNav.test.tsx +56 -0
  503. package/src/MobileNav/MobileNav.tsx +13 -8
  504. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  505. package/src/NumberInput/NumberInput.test.tsx +48 -3
  506. package/src/NumberInput/NumberInput.tsx +32 -15
  507. package/src/Outline/Outline.doc.mjs +2 -0
  508. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  509. package/src/OverflowList/OverflowList.test.tsx +416 -0
  510. package/src/Overlay/Overlay.doc.mjs +6 -0
  511. package/src/Overlay/Overlay.test.tsx +356 -0
  512. package/src/Overlay/useOverlay.tsx +0 -3
  513. package/src/Pagination/Pagination.test.tsx +162 -0
  514. package/src/Pagination/Pagination.tsx +80 -26
  515. package/src/Popover/Popover.doc.mjs +6 -6
  516. package/src/Popover/Popover.test.tsx +65 -0
  517. package/src/Popover/usePopover.doc.mjs +1 -1
  518. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
  522. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  523. package/src/ProgressBar/ProgressBar.tsx +12 -5
  524. package/src/RadioList/RadioList.test.tsx +19 -0
  525. package/src/RadioList/RadioListItem.tsx +9 -4
  526. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  527. package/src/Resizable/ResizeHandle.tsx +22 -4
  528. package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
  529. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  530. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  531. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  532. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  533. package/src/Selector/Selector.test.tsx +27 -1
  534. package/src/SideNav/SideNav.doc.mjs +7 -1
  535. package/src/SideNav/SideNav.test.tsx +66 -0
  536. package/src/SideNav/SideNav.tsx +6 -2
  537. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  538. package/src/SideNav/SideNavSection.tsx +6 -4
  539. package/src/SizeContext/SizeContext.test.tsx +226 -0
  540. package/src/Switch/Switch.doc.mjs +7 -7
  541. package/src/Switch/Switch.test.tsx +102 -3
  542. package/src/Switch/Switch.tsx +20 -7
  543. package/src/TabList/TabList.test.tsx +185 -1
  544. package/src/TabList/TabMenu.tsx +45 -9
  545. package/src/Table/BaseTable.tsx +13 -2
  546. package/src/Table/Table.doc.mjs +6 -1
  547. package/src/Table/Table.test.tsx +87 -0
  548. package/src/Table/TableBody.tsx +15 -2
  549. package/src/Table/TableFooter.tsx +15 -2
  550. package/src/Table/TableHeader.tsx +15 -2
  551. package/src/Table/index.ts +5 -0
  552. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  553. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  554. package/src/Table/plugins/groupedRows/index.ts +7 -0
  555. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
  556. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
  557. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  558. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  559. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
  560. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  561. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  562. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  563. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  564. package/src/Table/useTableGroupedRows.doc.mjs +71 -0
  565. package/src/TextArea/TextArea.test.tsx +3 -3
  566. package/src/TextInput/TextInput.test.tsx +3 -3
  567. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  568. package/src/Thumbnail/Thumbnail.tsx +4 -2
  569. package/src/TimeInput/TimeInput.test.tsx +37 -0
  570. package/src/TimeInput/TimeInput.tsx +11 -1
  571. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  572. package/src/Timestamp/Timestamp.test.tsx +52 -0
  573. package/src/Timestamp/Timestamp.tsx +30 -16
  574. package/src/Toast/Toast.tsx +11 -3
  575. package/src/Toast/ToastViewport.test.tsx +64 -0
  576. package/src/Toast/ToastViewport.tsx +12 -0
  577. package/src/Toast/useToast.test.tsx +258 -0
  578. package/src/Toast/useToast.tsx +41 -0
  579. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  580. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  581. package/src/Tokenizer/Tokenizer.test.tsx +54 -0
  582. package/src/Tokenizer/Tokenizer.tsx +5 -4
  583. package/src/Tooltip/Tooltip.doc.mjs +6 -6
  584. package/src/Tooltip/useTooltip.doc.mjs +5 -5
  585. package/src/Tooltip/useTooltip.tsx +12 -2
  586. package/src/TopNav/TopNav.doc.mjs +1 -1
  587. package/src/TopNav/TopNav.test.tsx +23 -7
  588. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  589. package/src/TreeList/TreeList.doc.mjs +2 -2
  590. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  591. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  592. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  593. package/src/Typeahead/Typeahead.test.tsx +45 -1
  594. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
  595. package/src/__tests__/TestIcon.tsx +26 -0
  596. package/src/__tests__/fastRoleQueries.ts +66 -0
  597. package/src/docPropReferences.test.ts +178 -0
  598. package/src/docs-types.ts +9 -1
  599. package/src/hooks/focusableSelector.ts +1 -1
  600. package/src/hooks/index.ts +3 -0
  601. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  602. package/src/hooks/useFocusTrap.test.tsx +149 -1
  603. package/src/hooks/useFocusTrap.ts +50 -1
  604. package/src/hooks/useHotkeys.doc.mjs +52 -0
  605. package/src/hooks/useHotkeys.test.ts +245 -0
  606. package/src/hooks/useHotkeys.ts +203 -0
  607. package/src/hooks/useInteractiveRole.ts +12 -4
  608. package/src/hooks/useStreamingText.test.ts +54 -19
  609. package/src/hooks/useStreamingText.ts +16 -5
  610. package/src/hooks/useTreeFocus.test.tsx +1 -3
  611. package/src/reset.css +29 -0
  612. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  613. package/src/theme/defineTheme.ts +4 -13
  614. package/src/theme/derivedVarRegistry.test.ts +2 -2
  615. package/src/theme/expandColorScale.test.ts +29 -0
  616. package/src/theme/expandColorScale.ts +11 -6
  617. package/src/theme/hct.ts +9 -17
  618. package/src/theme/themingTargets.test.ts +353 -0
  619. package/src/theme/tokens.test.ts +182 -9
  620. package/src/theme/tokens.ts +239 -4
  621. package/src/theme/useTheme.test.tsx +126 -2
  622. package/src/theme/useTheme.ts +87 -6
  623. package/src/utils/color.test.ts +133 -0
  624. package/src/utils/color.ts +148 -0
  625. package/src/utils/composeEventHandlers.test.ts +71 -0
  626. package/src/utils/composeEventHandlers.ts +44 -0
  627. package/src/utils/index.ts +4 -0
  628. package/src/utils/mergeProps.test.ts +166 -0
  629. package/src/utils/sharedResizeObserver.test.ts +2 -2
  630. package/src/utils/timeParser.test.ts +13 -0
  631. package/src/utils/timeParser.ts +8 -5
  632. package/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
  633. package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
  634. package/dist/Carousel/carousel.markers.stylex.js +0 -12
  635. package/src/Carousel/carousel.markers.stylex.ts +0 -10
@@ -50,6 +50,12 @@ export const docs = {
50
50
  description: 'StyleX styles for layout customization. Must be a stylex.create() value.',
51
51
  },
52
52
  ],
53
+ playground: {
54
+ defaults: {
55
+ value: 'go-home',
56
+ children: 'Go to Dashboard',
57
+ },
58
+ },
53
59
  };
54
60
 
55
61
  export const docsZh = {
@@ -27,6 +27,15 @@ export const docs = {
27
27
  description: 'StyleX styles for layout customization. Must be a stylex.create() value.',
28
28
  },
29
29
  ],
30
+ playground: {
31
+ defaults: {
32
+ children: [
33
+ {__element: 'CommandPaletteItem', props: {value: 'home', onSelect: undefined}, children: 'Go Home'},
34
+ {__element: 'CommandPaletteItem', props: {value: 'settings', onSelect: undefined}, children: 'Open Settings'},
35
+ {__element: 'CommandPaletteItem', props: {value: 'profile', onSelect: undefined}, children: 'View Profile'},
36
+ ],
37
+ },
38
+ },
30
39
  };
31
40
 
32
41
  export const docsZh = {
@@ -78,6 +78,21 @@ export const docs = {
78
78
  { guidance: false, description: 'Place more than 10–12 items in a single menu without grouping them into sections.' },
79
79
  ],
80
80
  },
81
+ playground: {
82
+ defaults: {
83
+ children: {
84
+ __element: 'Card',
85
+ props: {padding: 6},
86
+ children: {__element: 'Text', props: {color: 'secondary'}, children: 'Right-click this area'},
87
+ },
88
+ items: [
89
+ {label: 'Edit'},
90
+ {label: 'Duplicate'},
91
+ {type: 'divider'},
92
+ {label: 'Delete'},
93
+ ],
94
+ },
95
+ },
81
96
  };
82
97
 
83
98
  /** @type {import('../docs-types').TranslationDoc} */
@@ -172,6 +172,21 @@ describe('ContextMenu', () => {
172
172
  expect(preventDefault).toHaveBeenCalled();
173
173
  });
174
174
 
175
+ it('prevents default context menu on the opened menu container', () => {
176
+ render(
177
+ <ContextMenu items={[{label: 'Item 1'}]}>
178
+ <div>Right-click me</div>
179
+ </ContextMenu>,
180
+ );
181
+
182
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
183
+ const menu = screen.getByRole('menu', {hidden: true});
184
+ const event = new MouseEvent('contextmenu', {bubbles: true});
185
+ const preventDefault = vi.spyOn(event, 'preventDefault');
186
+ menu.dispatchEvent(event);
187
+ expect(preventDefault).toHaveBeenCalled();
188
+ });
189
+
175
190
  it('does not open when isDisabled is true', () => {
176
191
  render(
177
192
  <ContextMenu items={[{label: 'Item 1'}]} isDisabled>
@@ -449,4 +464,76 @@ describe('ContextMenu compound mode', () => {
449
464
  ).toBeInTheDocument();
450
465
  expect(screen.getByRole('separator', {hidden: true})).toBeInTheDocument();
451
466
  });
467
+
468
+ describe('cursor anchor positioning (#3465)', () => {
469
+ // The menu is anchored to a zero-size element placed at the cursor point
470
+ // *inside the trigger*, so it is positioned relative to the trigger's
471
+ // context (scroll-follow + auto-flip) rather than the viewport.
472
+ function getCursorAnchor(trigger: HTMLElement): HTMLElement {
473
+ const anchor = trigger.querySelector<HTMLElement>('[aria-hidden="true"]');
474
+ if (!anchor) {
475
+ throw new Error('cursor anchor not found');
476
+ }
477
+ return anchor;
478
+ }
479
+
480
+ it('renders a zero-size cursor anchor inside the trigger', () => {
481
+ render(
482
+ <ContextMenu items={[{label: 'Item 1'}]} data-testid="ctx">
483
+ <div>Right-click me</div>
484
+ </ContextMenu>,
485
+ );
486
+ const anchor = getCursorAnchor(screen.getByTestId('ctx'));
487
+ expect(anchor.tagName).toBe('SPAN');
488
+ // Carries an anchor-name so the menu can be anchored to it via CSS
489
+ // anchor positioning (context mode), not fixed viewport coordinates.
490
+ expect(anchor.style.anchorName).toMatch(/^--astryx-layer-/);
491
+ });
492
+
493
+ it('places the cursor anchor at the pointer position relative to the trigger', () => {
494
+ render(
495
+ <ContextMenu items={[{label: 'Item 1'}]} data-testid="ctx">
496
+ <div>Right-click me</div>
497
+ </ContextMenu>,
498
+ );
499
+ const trigger = screen.getByTestId('ctx');
500
+ trigger.getBoundingClientRect = () =>
501
+ ({
502
+ left: 100,
503
+ top: 50,
504
+ right: 300,
505
+ bottom: 150,
506
+ width: 200,
507
+ height: 100,
508
+ }) as DOMRect;
509
+ // Pointer at viewport (170, 90) -> local trigger offset (70, 40).
510
+ fireEvent.contextMenu(trigger, {clientX: 170, clientY: 90, detail: 1});
511
+ const anchor = getCursorAnchor(trigger);
512
+ expect(anchor.style.left).toBe('70px');
513
+ expect(anchor.style.top).toBe('40px');
514
+ });
515
+
516
+ it('anchors a keyboard-invoked menu to the trigger bottom-left', () => {
517
+ render(
518
+ <ContextMenu items={[{label: 'Item 1'}]} data-testid="ctx">
519
+ <div>Right-click me</div>
520
+ </ContextMenu>,
521
+ );
522
+ const trigger = screen.getByTestId('ctx');
523
+ trigger.getBoundingClientRect = () =>
524
+ ({
525
+ left: 40,
526
+ top: 10,
527
+ right: 100,
528
+ bottom: 30,
529
+ width: 60,
530
+ height: 20,
531
+ }) as DOMRect;
532
+ // Keyboard-initiated contextmenu: coords (0,0), detail 0 -> local (0, height).
533
+ fireEvent.contextMenu(trigger, {clientX: 0, clientY: 0, detail: 0});
534
+ const anchor = getCursorAnchor(trigger);
535
+ expect(anchor.style.left).toBe('0px');
536
+ expect(anchor.style.top).toBe('20px');
537
+ });
538
+ });
452
539
  });
@@ -3,11 +3,16 @@
3
3
 
4
4
  /**
5
5
  * @file ContextMenu.tsx
6
- * @input Uses React, StyleX, useLayer (fixed mode), useListFocus
6
+ * @input Uses React, StyleX, useLayer (context mode), useListFocus
7
7
  * @output Exports ContextMenu component
8
8
  * @position Core implementation; consumed by index.ts
9
9
  *
10
- * Right-click context menu positioned at cursor coordinates.
10
+ * Right-click context menu positioned at the cursor. The cursor point is
11
+ * captured as an offset *inside the trigger* and materialized as a zero-size
12
+ * anchor element, so the menu is positioned relative to the trigger's context
13
+ * (via CSS anchor positioning) rather than the viewport. It therefore follows
14
+ * the content on scroll and auto-flips at viewport edges, while still appearing
15
+ * under the cursor.
11
16
  * Reuses DropdownMenu item rendering and keyboard navigation.
12
17
  *
13
18
  * Supports two content modes with a single keyboard/focus path:
@@ -53,7 +58,7 @@ import {
53
58
  easeVars,
54
59
  shadowVars,
55
60
  } from '../theme/tokens.stylex';
56
- import {mergeProps} from '../utils';
61
+ import {mergeProps, mergeRefs} from '../utils';
57
62
  import type {BaseProps} from '../BaseProps';
58
63
  import type {StyleXStyles} from '../theme/types';
59
64
  import {themeProps} from '../utils/themeProps';
@@ -67,9 +72,23 @@ import type {
67
72
  const styles = stylex.create({
68
73
  // Trigger wrapper: suppress the iOS long-press callout/selection so the
69
74
  // long-press opens our context menu instead of the native text/callout UI.
75
+ // `position: relative` establishes the containing block for the absolutely
76
+ // positioned cursor anchor below, so the anchor point tracks the trigger
77
+ // (and scrolls with it) instead of the page.
70
78
  trigger: {
79
+ position: 'relative',
71
80
  WebkitTouchCallout: 'none',
72
81
  },
82
+ // Zero-size anchor placed at the cursor point within the trigger. The menu
83
+ // is anchored to this element, so it sits under the cursor yet is positioned
84
+ // relative to the trigger's context — it follows the content on scroll and
85
+ // the browser can auto-flip it against the viewport edges.
86
+ cursorAnchor: {
87
+ position: 'absolute',
88
+ width: 0,
89
+ height: 0,
90
+ pointerEvents: 'none',
91
+ },
73
92
  menu: {
74
93
  boxSizing: 'border-box',
75
94
  display: 'flex',
@@ -87,6 +106,7 @@ const styles = stylex.create({
87
106
  transitionProperty: 'opacity',
88
107
  transitionDuration: durationVars['--duration-fast'],
89
108
  transitionTimingFunction: easeVars['--ease-standard'],
109
+ userSelect: 'none',
90
110
  },
91
111
  popover: {
92
112
  minWidth: '160px',
@@ -200,7 +220,13 @@ export function ContextMenu({
200
220
  const menuContent = 'menuContent' in props ? props.menuContent : undefined;
201
221
 
202
222
  const menuId = useId();
223
+ // Cursor point in the trigger's local coordinate space (offset from the
224
+ // trigger's top-left, in-flow). Stored here and written to the zero-size
225
+ // anchor element so the menu is positioned relative to the trigger context
226
+ // — it scrolls with the content instead of sitting at a fixed viewport point.
203
227
  const positionRef = useRef({x: 0, y: 0});
228
+ const cursorAnchorRef = useRef<HTMLSpanElement>(null);
229
+ const triggerRef = useRef<HTMLDivElement>(null);
204
230
  // Element focused before the menu opened, restored when it closes so focus
205
231
  // does not fall to <body> after Escape or outside-click dismissal.
206
232
  const triggerFocusRef = useRef<HTMLElement | null>(null);
@@ -208,7 +234,7 @@ export function ContextMenu({
208
234
  const [isOpen, setIsOpen] = useState(false);
209
235
 
210
236
  const layer = useLayer({
211
- mode: 'fixed',
237
+ mode: 'context',
212
238
  onHide: useCallback(() => {
213
239
  setIsOpen(false);
214
240
  onOpenChange?.(false);
@@ -326,34 +352,53 @@ export function ContextMenu({
326
352
  [listNavKeyDown, typeahead],
327
353
  );
328
354
 
355
+ // Place the zero-size cursor anchor at a point in the trigger's local
356
+ // coordinate space and open the menu. Positioning the anchor inside the
357
+ // trigger (rather than storing viewport coordinates on the menu itself) is
358
+ // what makes the menu context-relative: it scrolls with the content and the
359
+ // browser auto-flips it against the viewport edges via CSS anchor positioning.
360
+ const openAtLocalPoint = useCallback(
361
+ (localX: number, localY: number, focusEl: HTMLElement | null) => {
362
+ positionRef.current = {x: localX, y: localY};
363
+ const anchorEl = cursorAnchorRef.current;
364
+ if (anchorEl) {
365
+ anchorEl.style.left = `${localX}px`;
366
+ anchorEl.style.top = `${localY}px`;
367
+ }
368
+ // Remember the element focused before opening so we can restore it on
369
+ // close (Escape or outside-click), instead of dropping focus to <body>.
370
+ triggerFocusRef.current =
371
+ document.activeElement instanceof HTMLElement
372
+ ? document.activeElement
373
+ : focusEl;
374
+ layer.show();
375
+ requestAnimationFrame(() => focusFirst());
376
+ },
377
+ [layer, focusFirst],
378
+ );
379
+
329
380
  const handleContextMenu = useCallback(
330
381
  (e: React.MouseEvent) => {
331
382
  if (isDisabled) {
332
383
  return;
333
384
  }
334
385
  e.preventDefault();
386
+ const trigger = triggerRef.current;
387
+ const rect = trigger?.getBoundingClientRect();
335
388
  // A keyboard-initiated contextmenu (Shift+F10 / the Menu key) fires a
336
389
  // `contextmenu` event whose coordinates are (0, 0) in several browsers.
337
- // Detect that and anchor the menu to the trigger's box instead, so the
338
- // menu is reachable without a pointer (menus-8).
390
+ // Detect that and anchor the menu to the trigger's bottom-left instead,
391
+ // so the menu is reachable without a pointer (menus-8).
339
392
  const isKeyboardInvoked =
340
393
  e.clientX === 0 && e.clientY === 0 && e.detail === 0;
341
- if (isKeyboardInvoked && e.currentTarget instanceof HTMLElement) {
342
- const rect = e.currentTarget.getBoundingClientRect();
343
- positionRef.current = {x: rect.left, y: rect.bottom};
344
- } else {
345
- positionRef.current = {x: e.clientX, y: e.clientY};
346
- }
347
- // Remember the element focused before opening so we can restore it on
348
- // close (Escape or outside-click), instead of dropping focus to <body>.
349
- triggerFocusRef.current =
350
- document.activeElement instanceof HTMLElement
351
- ? document.activeElement
352
- : (e.currentTarget as HTMLElement);
353
- layer.show();
354
- requestAnimationFrame(() => focusFirst());
394
+ // Convert the viewport cursor point into the trigger's local space so
395
+ // the anchor lives inside the (scrollable) trigger context.
396
+ const localX = isKeyboardInvoked || !rect ? 0 : e.clientX - rect.left;
397
+ const localY =
398
+ isKeyboardInvoked || !rect ? (rect?.height ?? 0) : e.clientY - rect.top;
399
+ openAtLocalPoint(localX, localY, e.currentTarget as HTMLElement);
355
400
  },
356
- [isDisabled, layer, focusFirst],
401
+ [isDisabled, openAtLocalPoint],
357
402
  );
358
403
 
359
404
  // Touch long-press invocation (menus-8). iOS Safari never synthesizes a
@@ -364,11 +409,14 @@ export function ContextMenu({
364
409
  disabled: isDisabled,
365
410
  onLongPress: useCallback(
366
411
  (point: {x: number; y: number}) => {
367
- positionRef.current = {x: point.x, y: point.y};
368
- layer.show();
369
- requestAnimationFrame(() => focusFirst());
412
+ const rect = triggerRef.current?.getBoundingClientRect();
413
+ openAtLocalPoint(
414
+ rect ? point.x - rect.left : point.x,
415
+ rect ? point.y - rect.top : point.y,
416
+ triggerRef.current,
417
+ );
370
418
  },
371
- [layer, focusFirst],
419
+ [openAtLocalPoint],
372
420
  ),
373
421
  });
374
422
 
@@ -387,7 +435,7 @@ export function ContextMenu({
387
435
  return (
388
436
  <>
389
437
  <div
390
- ref={ref}
438
+ ref={mergeRefs(ref, triggerRef)}
391
439
  onContextMenu={handleContextMenu}
392
440
  {...longPressHandlers}
393
441
  data-testid={testId}
@@ -400,6 +448,16 @@ export function ContextMenu({
400
448
  : []),
401
449
  )}>
402
450
  {children}
451
+ <span
452
+ ref={mergeRefs(cursorAnchorRef, layer.ref)}
453
+ aria-hidden="true"
454
+ {...mergeProps(stylex.props(styles.cursorAnchor), {
455
+ style: {
456
+ left: `${positionRef.current.x}px`,
457
+ top: `${positionRef.current.y}px`,
458
+ },
459
+ })}
460
+ />
403
461
  </div>
404
462
 
405
463
  {layer.render(
@@ -409,6 +467,7 @@ export function ContextMenu({
409
467
  role="menu"
410
468
  aria-label={label}
411
469
  onKeyDown={listKeyDown}
470
+ onContextMenu={e => e.preventDefault()}
412
471
  {...mergeProps(
413
472
  themeProps('context-menu'),
414
473
  stylex.props(styles.menu, xstyle),
@@ -420,8 +479,8 @@ export function ContextMenu({
420
479
  </DropdownMenuContext>
421
480
  </div>,
422
481
  {
423
- x: positionRef.current.x,
424
- y: positionRef.current.y,
482
+ placement: 'below',
483
+ alignment: 'start',
425
484
  xstyle: [popoverXstyle, layerAnimations.below],
426
485
  },
427
486
  )}
@@ -35,6 +35,12 @@ export const docs = {
35
35
  description: 'StyleX styles for layout customization.',
36
36
  },
37
37
  ],
38
+ playground: {
39
+ defaults: {
40
+ label: 'Edit',
41
+ description: 'Modify this item',
42
+ },
43
+ },
38
44
  };
39
45
 
40
46
  export const docsZh = {
@@ -12,6 +12,7 @@
12
12
  import {describe, it, expect, vi, beforeEach} from 'vitest';
13
13
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
+ import {getButton, queryButton} from '../__tests__/fastRoleQueries';
15
16
  import {DateInput} from './DateInput';
16
17
  import {InputGroup} from '../InputGroup';
17
18
  import {InputGroupText} from '../InputGroup/InputGroupText';
@@ -92,14 +93,14 @@ describe('DateInput', () => {
92
93
 
93
94
  it('calendar button is focusable and clickable', () => {
94
95
  render(<DateInput label="Date" onChange={() => {}} />);
95
- const button = screen.getByRole('button', {name: 'Open calendar'});
96
+ const button = getButton('Open calendar');
96
97
  expect(button).toBeInTheDocument();
97
98
  expect(button).not.toBeDisabled();
98
99
  });
99
100
 
100
101
  it('calendar button is disabled when isDisabled is true', () => {
101
102
  render(<DateInput label="Date" isDisabled onChange={() => {}} />);
102
- const button = screen.getByRole('button', {name: 'Open calendar'});
103
+ const button = getButton('Open calendar');
103
104
  expect(button).toBeDisabled();
104
105
  });
105
106
 
@@ -282,7 +283,7 @@ describe('DateInput', () => {
282
283
  it('disables input and button when isLoading is true', () => {
283
284
  render(<DateInput label="Date" isLoading onChange={() => {}} />);
284
285
  expect(screen.getByRole('combobox')).toBeDisabled();
285
- expect(screen.getByRole('button', {name: 'Open calendar'})).toBeDisabled();
286
+ expect(getButton('Open calendar')).toBeDisabled();
286
287
  });
287
288
 
288
289
  it('shows spinner when isLoading is true', () => {
@@ -475,7 +476,7 @@ describe('DateInput', () => {
475
476
 
476
477
  it('does not open popover when clicking calendar button while disabled', () => {
477
478
  render(<DateInput label="Date" isDisabled onChange={() => {}} />);
478
- const button = screen.getByRole('button', {name: 'Open calendar'});
479
+ const button = getButton('Open calendar');
479
480
  fireEvent.click(button);
480
481
  expect(screen.getByRole('combobox')).toHaveAttribute(
481
482
  'aria-expanded',
@@ -513,23 +514,17 @@ describe('DateInput', () => {
513
514
  hasClear
514
515
  />,
515
516
  );
516
- expect(
517
- screen.getByRole('button', {name: 'Clear Date'}),
518
- ).toBeInTheDocument();
517
+ expect(getButton('Clear Date')).toBeInTheDocument();
519
518
  });
520
519
 
521
520
  it('does not show clear button when value is undefined', () => {
522
521
  render(<DateInput label="Date" onChange={() => {}} hasClear />);
523
- expect(
524
- screen.queryByRole('button', {name: 'Clear Date'}),
525
- ).not.toBeInTheDocument();
522
+ expect(queryButton('Clear Date')).not.toBeInTheDocument();
526
523
  });
527
524
 
528
525
  it('does not show clear button when hasClear is false', () => {
529
526
  render(<DateInput label="Date" value="2026-01-15" onChange={() => {}} />);
530
- expect(
531
- screen.queryByRole('button', {name: 'Clear Date'}),
532
- ).not.toBeInTheDocument();
527
+ expect(queryButton('Clear Date')).not.toBeInTheDocument();
533
528
  });
534
529
 
535
530
  it('does not show clear button when disabled', () => {
@@ -542,9 +537,7 @@ describe('DateInput', () => {
542
537
  isDisabled
543
538
  />,
544
539
  );
545
- expect(
546
- screen.queryByRole('button', {name: 'Clear Date'}),
547
- ).not.toBeInTheDocument();
540
+ expect(queryButton('Clear Date')).not.toBeInTheDocument();
548
541
  });
549
542
 
550
543
  it('calls onChange with undefined when clear is clicked', () => {
@@ -557,7 +550,7 @@ describe('DateInput', () => {
557
550
  hasClear
558
551
  />,
559
552
  );
560
- fireEvent.click(screen.getByRole('button', {name: 'Clear Date'}));
553
+ fireEvent.click(getButton('Clear Date'));
561
554
  expect(onChange).toHaveBeenCalledWith(undefined);
562
555
  });
563
556
  });
@@ -699,9 +692,7 @@ describe('DateInput', () => {
699
692
  expect(input).toHaveAttribute('aria-disabled', 'true');
700
693
  expect(input.getAttribute('aria-describedby')).toContain(tooltip.id);
701
694
  expect(tooltip).toHaveTextContent('Scheduling is locked');
702
- expect(
703
- screen.getByRole('button', {name: 'Open calendar'}),
704
- ).toBeDisabled();
695
+ expect(getButton('Open calendar')).toBeDisabled();
705
696
  });
706
697
  });
707
698
 
@@ -57,7 +57,8 @@ export const docs = {
57
57
  {
58
58
  name: 'value',
59
59
  type: 'DateRange | null',
60
- description: 'Selected date range ({start, end} in ISO format), or null.',
60
+ description:
61
+ 'Selected date range or null. Import the `DateRange` type from `@astryxdesign/core/DateRangeInput` — it is `{start: ISODateString, end: ISODateString}`. Do NOT redeclare your own DateRange type; use the exported one so TypeScript structurally matches.',
61
62
  required: true,
62
63
  },
63
64
  {
@@ -83,12 +84,14 @@ export const docs = {
83
84
  {
84
85
  name: 'min',
85
86
  type: 'ISODateString',
86
- description: 'Minimum selectable date.',
87
+ description:
88
+ 'Minimum selectable date. `ISODateString` is a template literal type (`\\`${number}${number}${number}${number}-${number}${number}-${number}${number}\\``) — pass a string literal like `"2026-01-28"`, not a runtime string variable. Import it from `@astryxdesign/core/Calendar` or use `as ISODateString` if computing the value dynamically.',
87
89
  },
88
90
  {
89
91
  name: 'max',
90
92
  type: 'ISODateString',
91
- description: 'Maximum selectable date.',
93
+ description:
94
+ 'Maximum selectable date. Same template literal type as `min` — use a YYYY-MM-DD string literal or cast with `as ISODateString`.',
92
95
  },
93
96
  {
94
97
  name: 'dateConstraints',
@@ -283,10 +286,10 @@ export const docsDense = {
283
286
  isDisabled: 'disable trigger+picker',
284
287
  disabledMessage:
285
288
  'reason shown in a tooltip on hover/focus when disabled; keeps trigger focusable via aria-disabled',
286
- value: 'selected range {start, end} or null',
289
+ value: 'selected range {start, end} or null — import DateRange type from @astryxdesign/core/DateRangeInput (do not redeclare)',
287
290
  onChange: 'callback on range change; null on clear',
288
- min: 'min selectable date',
289
- max: 'max selectable date',
291
+ min: 'min selectable date — ISODateString template literal type (YYYY-MM-DD); use string literal or cast `as ISODateString`',
292
+ max: 'max selectable date — ISODateString template literal type (YYYY-MM-DD); use string literal or cast `as ISODateString`',
290
293
  dateConstraints: 'custom constraint fns to disable dates',
291
294
  presets: 'preset ranges as quick-select options',
292
295
  hasClear: 'clear button when range is set (default true)',