@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3

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 (730) hide show
  1. package/CHANGELOG.md +161 -1
  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 +45 -20
  5. package/dist/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +49 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +62 -20
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +7 -3
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +21 -23
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +12 -12
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +17 -9
  49. package/dist/Card/index.d.ts +35 -1
  50. package/dist/Card/index.d.ts.map +1 -1
  51. package/dist/Card/index.js +21 -1
  52. package/dist/Carousel/Carousel.d.ts.map +1 -1
  53. package/dist/Carousel/Carousel.js +3 -3
  54. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  55. package/dist/Chat/ChatComposerInput.js +2 -3
  56. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  57. package/dist/Chat/ChatLayout.js +3 -3
  58. package/dist/Chat/ChatMessageList.d.ts +22 -3
  59. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  60. package/dist/Chat/ChatMessageList.js +6 -3
  61. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  62. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  63. package/dist/Chat/ChatTokenizedText.js +11 -6
  64. package/dist/Chat/useChatComposerTokens.js +1 -1
  65. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  66. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  67. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  68. package/dist/ClickableCard/ClickableCard.js +3 -3
  69. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  70. package/dist/CodeBlock/CodeBlock.js +15 -4
  71. package/dist/CodeBlock/highlightRanges.js +1 -1
  72. package/dist/CodeBlock/highlightStyles.js +13 -13
  73. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  75. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  76. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +1 -3
  79. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  80. package/dist/ContextMenu/ContextMenu.js +4 -3
  81. package/dist/DateInput/DateInput.d.ts +43 -0
  82. package/dist/DateInput/DateInput.d.ts.map +1 -1
  83. package/dist/DateInput/DateInput.js +22 -2
  84. package/dist/DateInput/NativeDateField.d.ts +10 -0
  85. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  86. package/dist/DateInput/NativeDateField.js +494 -0
  87. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  88. package/dist/DateInput/TouchDateField.js +82 -23
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  92. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  93. package/dist/DateInput/nativeDateSegments.js +111 -0
  94. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  95. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  96. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  97. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  98. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  99. package/dist/DateTimeInput/index.d.ts +1 -1
  100. package/dist/DateTimeInput/index.d.ts.map +1 -1
  101. package/dist/Dialog/Dialog.d.ts +21 -1
  102. package/dist/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/Dialog/Dialog.js +110 -58
  104. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  106. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  108. package/dist/Field/FieldLabel.d.ts.map +1 -1
  109. package/dist/Field/FieldLabel.js +9 -1
  110. package/dist/Field/InputClearButton.d.ts +9 -3
  111. package/dist/Field/InputClearButton.d.ts.map +1 -1
  112. package/dist/Field/InputClearButton.js +14 -3
  113. package/dist/FileInput/FileInput.d.ts.map +1 -1
  114. package/dist/FileInput/FileInput.js +3 -2
  115. package/dist/Heading/Heading.d.ts.map +1 -1
  116. package/dist/Heading/Heading.js +6 -3
  117. package/dist/HoverCard/HoverCard.d.ts +6 -0
  118. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/HoverCard.js +104 -3
  120. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  121. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  122. package/dist/HoverCard/useHoverCard.js +74 -26
  123. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  124. package/dist/Indicator/CheckboxIndicator.js +6 -2
  125. package/dist/Item/Item.d.ts.map +1 -1
  126. package/dist/Item/Item.js +4 -2
  127. package/dist/Kbd/Kbd.d.ts.map +1 -1
  128. package/dist/Kbd/Kbd.js +2 -19
  129. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  130. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  131. package/dist/Layer/LayerDepthContext.js +66 -0
  132. package/dist/Layer/gestureCounter.d.ts +8 -0
  133. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  134. package/dist/Layer/gestureCounter.js +53 -0
  135. package/dist/Layer/index.d.ts +3 -0
  136. package/dist/Layer/index.d.ts.map +1 -1
  137. package/dist/Layer/index.js +4 -0
  138. package/dist/Layer/layerStack.d.ts +98 -0
  139. package/dist/Layer/layerStack.d.ts.map +1 -0
  140. package/dist/Layer/layerStack.js +306 -0
  141. package/dist/Layer/useLayer.d.ts +23 -13
  142. package/dist/Layer/useLayer.d.ts.map +1 -1
  143. package/dist/Layer/useLayer.js +128 -8
  144. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  145. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  146. package/dist/Layer/useLayerDismissal.js +91 -0
  147. package/dist/Lightbox/Lightbox.d.ts +1 -0
  148. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  149. package/dist/Lightbox/Lightbox.js +103 -81
  150. package/dist/List/List.d.ts +1 -1
  151. package/dist/List/List.d.ts.map +1 -1
  152. package/dist/List/List.js +15 -4
  153. package/dist/Markdown/Markdown.d.ts +1 -1
  154. package/dist/Markdown/Markdown.d.ts.map +1 -1
  155. package/dist/Markdown/Markdown.js +20 -7
  156. package/dist/Markdown/index.d.ts +1 -1
  157. package/dist/Markdown/index.d.ts.map +1 -1
  158. package/dist/Markdown/parser.d.ts +38 -1
  159. package/dist/Markdown/parser.d.ts.map +1 -1
  160. package/dist/Markdown/parser.js +182 -32
  161. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  162. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  163. package/dist/MetadataList/MetadataListItem.js +4 -1
  164. package/dist/MobileNav/MobileNav.d.ts +6 -1
  165. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  166. package/dist/MobileNav/MobileNav.js +61 -36
  167. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  168. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  169. package/dist/MultiSelector/MultiSelector.js +73 -15
  170. package/dist/MultiSelector/hooks.d.ts +7 -1
  171. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  172. package/dist/MultiSelector/hooks.js +3 -2
  173. package/dist/MultiSelector/index.d.ts +1 -1
  174. package/dist/MultiSelector/index.d.ts.map +1 -1
  175. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  176. package/dist/NavIcon/NavIcon.js +5 -1
  177. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  178. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  179. package/dist/NavMenu/NavHeadingMenu.js +9 -5
  180. package/dist/NumberInput/NumberInput.d.ts +6 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +54 -104
  183. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  184. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  185. package/dist/NumberInput/numberInputCommit.js +71 -0
  186. package/dist/NumberInput/numberParser.d.ts +64 -0
  187. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  188. package/dist/NumberInput/numberParser.js +350 -0
  189. package/dist/Outline/Outline.d.ts.map +1 -1
  190. package/dist/Outline/Outline.js +3 -2
  191. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  192. package/dist/OverflowList/OverflowList.js +3 -2
  193. package/dist/Overlay/Overlay.d.ts.map +1 -1
  194. package/dist/Overlay/Overlay.js +3 -2
  195. package/dist/Popover/Popover.d.ts.map +1 -1
  196. package/dist/Popover/Popover.js +1 -9
  197. package/dist/Popover/usePopover.d.ts +7 -41
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +40 -21
  200. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +19 -6
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  206. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  207. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  209. package/dist/PowerSearch/types.d.ts +2 -0
  210. package/dist/PowerSearch/types.d.ts.map +1 -1
  211. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  212. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  213. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  214. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  215. package/dist/ProgressBar/ProgressBar.js +18 -5
  216. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  217. package/dist/Resizable/ResizeHandle.js +3 -2
  218. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  219. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  220. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  221. package/dist/SelectableCard/SelectableCard.js +12 -3
  222. package/dist/Selector/Selector.d.ts +18 -1
  223. package/dist/Selector/Selector.d.ts.map +1 -1
  224. package/dist/Selector/Selector.js +91 -18
  225. package/dist/Selector/hooks.d.ts +7 -1
  226. package/dist/Selector/hooks.d.ts.map +1 -1
  227. package/dist/Selector/hooks.js +3 -2
  228. package/dist/SideNav/SideNav.d.ts.map +1 -1
  229. package/dist/SideNav/SideNav.js +4 -3
  230. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavHeading.js +8 -7
  232. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  233. package/dist/SideNav/SideNavItem.js +4 -3
  234. package/dist/Slider/Slider.d.ts.map +1 -1
  235. package/dist/Slider/Slider.js +37 -5
  236. package/dist/Spinner/Spinner.d.ts +3 -3
  237. package/dist/Spinner/Spinner.d.ts.map +1 -1
  238. package/dist/Spinner/Spinner.js +130 -78
  239. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  240. package/dist/StatusDot/StatusDot.js +6 -1
  241. package/dist/Stepper/Step.d.ts +140 -0
  242. package/dist/Stepper/Step.d.ts.map +1 -0
  243. package/dist/Stepper/Step.js +1045 -0
  244. package/dist/Stepper/StepStatus.d.ts +24 -0
  245. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  246. package/dist/Stepper/StepStatus.js +1 -0
  247. package/dist/Stepper/Stepper.d.ts +93 -0
  248. package/dist/Stepper/Stepper.d.ts.map +1 -0
  249. package/dist/Stepper/Stepper.js +184 -0
  250. package/dist/Stepper/StepperContext.d.ts +41 -0
  251. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  252. package/dist/Stepper/StepperContext.js +34 -0
  253. package/dist/Stepper/index.d.ts +8 -0
  254. package/dist/Stepper/index.d.ts.map +1 -0
  255. package/dist/Stepper/index.js +7 -0
  256. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  257. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  258. package/dist/Stepper/stepper.stylex.js +20 -0
  259. package/dist/Switch/Switch.d.ts.map +1 -1
  260. package/dist/Switch/Switch.js +8 -3
  261. package/dist/TabList/Tab.d.ts +15 -2
  262. package/dist/TabList/Tab.d.ts.map +1 -1
  263. package/dist/TabList/Tab.js +32 -7
  264. package/dist/TabList/TabList.d.ts +46 -7
  265. package/dist/TabList/TabList.d.ts.map +1 -1
  266. package/dist/TabList/TabList.js +353 -23
  267. package/dist/TabList/TabListContext.d.ts +11 -1
  268. package/dist/TabList/TabListContext.d.ts.map +1 -1
  269. package/dist/TabList/TabListContext.js +11 -2
  270. package/dist/TabList/TabMenu.d.ts.map +1 -1
  271. package/dist/TabList/TabMenu.js +3 -2
  272. package/dist/TabList/index.d.ts +2 -2
  273. package/dist/TabList/index.d.ts.map +1 -1
  274. package/dist/Table/BaseTable.d.ts.map +1 -1
  275. package/dist/Table/BaseTable.js +10 -2
  276. package/dist/Table/Table.d.ts.map +1 -1
  277. package/dist/Table/Table.js +3 -6
  278. package/dist/Table/TableRow.d.ts +16 -5
  279. package/dist/Table/TableRow.d.ts.map +1 -1
  280. package/dist/Table/TableRow.js +16 -5
  281. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  282. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  283. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  284. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  285. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
  286. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  287. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  288. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  289. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  290. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  291. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  292. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  293. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  294. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  295. package/dist/Table/plugins/selection/useTableSelection.js +43 -5
  296. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  297. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  298. package/dist/Table/types.d.ts +22 -4
  299. package/dist/Table/types.d.ts.map +1 -1
  300. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  301. package/dist/Table/useBaseTablePlugins.js +5 -0
  302. package/dist/Text/Text.d.ts.map +1 -1
  303. package/dist/Text/Text.js +6 -3
  304. package/dist/TextArea/TextArea.d.ts.map +1 -1
  305. package/dist/TextArea/TextArea.js +16 -10
  306. package/dist/TextInput/TextInput.d.ts.map +1 -1
  307. package/dist/TextInput/TextInput.js +3 -2
  308. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  309. package/dist/TimeInput/TimeInput.js +3 -2
  310. package/dist/Timestamp/Timestamp.d.ts +1 -1
  311. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  312. package/dist/Timestamp/Timestamp.js +15 -21
  313. package/dist/Toast/Toast.d.ts.map +1 -1
  314. package/dist/Toast/Toast.js +22 -7
  315. package/dist/Toast/ToastViewport.d.ts +1 -0
  316. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  317. package/dist/Toast/ToastViewport.js +71 -18
  318. package/dist/Token/Token.d.ts +1 -1
  319. package/dist/Token/Token.d.ts.map +1 -1
  320. package/dist/Token/Token.js +20 -9
  321. package/dist/Token/TokenLink.d.ts +1 -1
  322. package/dist/Token/TokenLink.d.ts.map +1 -1
  323. package/dist/Token/TokenLink.js +7 -4
  324. package/dist/Tokenizer/Tokenizer.d.ts +14 -1
  325. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  326. package/dist/Tokenizer/Tokenizer.js +33 -21
  327. package/dist/Tooltip/Tooltip.d.ts +5 -0
  328. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  329. package/dist/Tooltip/useTooltip.d.ts +5 -0
  330. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  331. package/dist/Tooltip/useTooltip.js +39 -24
  332. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  333. package/dist/TopNav/TopNavHeading.js +5 -4
  334. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  335. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  336. package/dist/TopNav/TopNavMegaMenu.js +31 -11
  337. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  338. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  339. package/dist/TopNav/TopNavMenu.js +22 -7
  340. package/dist/TreeList/TreeList.d.ts +1 -1
  341. package/dist/TreeList/TreeList.d.ts.map +1 -1
  342. package/dist/TreeList/TreeList.js +7 -2
  343. package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
  344. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  345. package/dist/Typeahead/BaseTypeahead.js +119 -37
  346. package/dist/Typeahead/Typeahead.d.ts +8 -1
  347. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  348. package/dist/Typeahead/Typeahead.js +5 -2
  349. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  350. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  351. package/dist/Typeahead/TypeaheadItem.js +7 -2
  352. package/dist/astryx.css +113 -11
  353. package/dist/hooks/index.d.ts +1 -0
  354. package/dist/hooks/index.d.ts.map +1 -1
  355. package/dist/hooks/index.js +1 -0
  356. package/dist/hooks/useFocusTrap.d.ts +7 -4
  357. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  358. package/dist/hooks/useFocusTrap.js +60 -95
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -18
  361. package/dist/hooks/useMergedRefs.d.ts +18 -0
  362. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  363. package/dist/hooks/useMergedRefs.js +25 -0
  364. package/dist/index.d.ts +1 -0
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +1 -0
  367. package/dist/theme/Theme.d.ts.map +1 -1
  368. package/dist/theme/Theme.js +46 -10
  369. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  370. package/dist/theme/derivedVarRegistry.js +24 -4
  371. package/dist/theme/generateThemeRules.d.ts +21 -0
  372. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  373. package/dist/theme/generateThemeRules.js +26 -0
  374. package/dist/theme/syntax/tokens.d.ts +1 -1
  375. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  376. package/dist/theme/syntax/tokens.js +5 -2
  377. package/dist/utils/groupItems.d.ts +5 -1
  378. package/dist/utils/groupItems.d.ts.map +1 -1
  379. package/dist/utils/groupItems.js +9 -9
  380. package/dist/utils/index.d.ts +1 -1
  381. package/dist/utils/index.d.ts.map +1 -1
  382. package/dist/utils/isApplePlatform.d.ts +18 -0
  383. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  384. package/dist/utils/isApplePlatform.js +37 -0
  385. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  386. package/dist/utils/sharedResizeObserver.js +10 -1
  387. package/dist/utils/timeParser.d.ts +1 -1
  388. package/dist/utils/timeParser.d.ts.map +1 -1
  389. package/dist/utils/timeParser.js +26 -12
  390. package/locales/af-ZA.json +6 -6
  391. package/locales/ar-SA.json +6 -6
  392. package/locales/ca-ES.json +5 -5
  393. package/locales/cs-CZ.json +6 -6
  394. package/locales/da-DK.json +6 -6
  395. package/locales/de-DE.json +6 -6
  396. package/locales/el-GR.json +6 -6
  397. package/locales/en.json +163 -11
  398. package/locales/es-ES.json +5 -5
  399. package/locales/fi-FI.json +6 -6
  400. package/locales/fr-FR.json +6 -6
  401. package/locales/he-IL.json +6 -6
  402. package/locales/hu-HU.json +6 -6
  403. package/locales/it-IT.json +6 -6
  404. package/locales/ja-JP.json +6 -6
  405. package/locales/ko-KR.json +6 -6
  406. package/locales/nl-NL.json +6 -6
  407. package/locales/no-NO.json +6 -6
  408. package/locales/pl-PL.json +6 -6
  409. package/locales/pseudo.json +114 -0
  410. package/locales/pt-BR.json +6 -6
  411. package/locales/pt-PT.json +6 -6
  412. package/locales/ro-RO.json +6 -6
  413. package/locales/ru-RU.json +6 -6
  414. package/locales/sr-SP.json +6 -6
  415. package/locales/sv-SE.json +6 -6
  416. package/locales/tr-TR.json +6 -6
  417. package/locales/uk-UA.json +6 -6
  418. package/locales/vi-VN.json +6 -6
  419. package/locales/zh-CN.json +6 -6
  420. package/locales/zh-TW.json +6 -6
  421. package/package.json +8 -3
  422. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  423. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  424. package/src/AlertDialog/AlertDialog.tsx +62 -20
  425. package/src/AppShell/AppShell.tsx +3 -2
  426. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  427. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  428. package/src/AspectRatio/AspectRatio.tsx +40 -1
  429. package/src/Avatar/Avatar.doc.mjs +14 -3
  430. package/src/Avatar/Avatar.test.tsx +97 -0
  431. package/src/Avatar/Avatar.tsx +125 -52
  432. package/src/Avatar/index.ts +2 -2
  433. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  434. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  435. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  436. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  437. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  438. package/src/Banner/Banner.doc.mjs +22 -11
  439. package/src/Banner/Banner.test.tsx +177 -25
  440. package/src/Banner/Banner.tsx +93 -27
  441. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  442. package/src/BottomSheet/BottomSheet.tsx +17 -4
  443. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  444. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  445. package/src/Button/Button.doc.mjs +24 -1
  446. package/src/Button/Button.test.tsx +32 -4
  447. package/src/Button/Button.tsx +12 -5
  448. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  449. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  450. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  451. package/src/Calendar/Calendar.doc.mjs +7 -6
  452. package/src/Calendar/Calendar.test.tsx +143 -0
  453. package/src/Calendar/Calendar.tsx +30 -26
  454. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  455. package/src/Calendar/getInitialFocusDate.ts +93 -0
  456. package/src/Calendar/styles.ts +49 -31
  457. package/src/Card/Card.doc.mjs +10 -7
  458. package/src/Card/Card.test.tsx +113 -19
  459. package/src/Card/Card.tsx +67 -89
  460. package/src/Card/index.ts +36 -1
  461. package/src/Carousel/Carousel.tsx +3 -2
  462. package/src/Chat/ChatComposerInput.tsx +5 -1
  463. package/src/Chat/ChatLayout.tsx +3 -2
  464. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  465. package/src/Chat/ChatMessageList.test.tsx +46 -0
  466. package/src/Chat/ChatMessageList.tsx +28 -4
  467. package/src/Chat/ChatTokenizedText.tsx +17 -10
  468. package/src/Chat/useChatComposerTokens.ts +1 -1
  469. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  470. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  471. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  472. package/src/ClickableCard/ClickableCard.tsx +3 -2
  473. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  474. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  475. package/src/CodeBlock/CodeBlock.tsx +20 -4
  476. package/src/CodeBlock/highlightRanges.ts +1 -1
  477. package/src/CodeBlock/highlightStyles.ts +13 -13
  478. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  479. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  480. package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
  481. package/src/ComplexSelector/ComplexSelector.tsx +1 -3
  482. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  483. package/src/ContextMenu/ContextMenu.tsx +4 -3
  484. package/src/DateInput/DateInput.doc.mjs +16 -0
  485. package/src/DateInput/DateInput.tsx +55 -2
  486. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  487. package/src/DateInput/NativeDateField.test.tsx +635 -0
  488. package/src/DateInput/NativeDateField.tsx +641 -0
  489. package/src/DateInput/TouchDateField.tsx +108 -24
  490. package/src/DateInput/index.ts +1 -0
  491. package/src/DateInput/nativeDateSegments.ts +127 -0
  492. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  493. package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
  494. package/src/DateRangeInput/DateRangeInput.tsx +4 -2
  495. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  496. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  497. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  498. package/src/DateTimeInput/index.ts +1 -0
  499. package/src/Dialog/Dialog.doc.mjs +8 -3
  500. package/src/Dialog/Dialog.test.tsx +429 -2
  501. package/src/Dialog/Dialog.tsx +133 -58
  502. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  503. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  504. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  505. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  506. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  507. package/src/Field/Field.doc.mjs +13 -2
  508. package/src/Field/FieldLabel.test.tsx +29 -0
  509. package/src/Field/FieldLabel.tsx +7 -0
  510. package/src/Field/InputClearButton.test.tsx +15 -1
  511. package/src/Field/InputClearButton.tsx +28 -4
  512. package/src/FileInput/FileInput.tsx +3 -2
  513. package/src/Heading/Heading.test.tsx +23 -1
  514. package/src/Heading/Heading.tsx +6 -3
  515. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  516. package/src/HoverCard/HoverCard.test.tsx +154 -4
  517. package/src/HoverCard/HoverCard.tsx +143 -3
  518. package/src/HoverCard/useHoverCard.tsx +104 -33
  519. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  520. package/src/Indicator/Indicator.doc.mjs +2 -0
  521. package/src/Item/Item.tsx +5 -4
  522. package/src/Kbd/Kbd.tsx +2 -19
  523. package/src/Layer/LayerDepthContext.tsx +62 -0
  524. package/src/Layer/gestureCounter.ts +57 -0
  525. package/src/Layer/index.ts +9 -0
  526. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  527. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  528. package/src/Layer/layerStack.ts +362 -0
  529. package/src/Layer/useLayer.test.tsx +324 -15
  530. package/src/Layer/useLayer.tsx +164 -8
  531. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  532. package/src/Layer/useLayerDismissal.ts +173 -0
  533. package/src/Layout/Layout.doc.mjs +2 -2
  534. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  535. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  536. package/src/Lightbox/Lightbox.tsx +124 -102
  537. package/src/Link/Link.doc.mjs +39 -0
  538. package/src/List/List.test.tsx +38 -0
  539. package/src/List/List.tsx +8 -1
  540. package/src/Markdown/Markdown.doc.mjs +5 -0
  541. package/src/Markdown/Markdown.test.tsx +37 -0
  542. package/src/Markdown/Markdown.tsx +16 -5
  543. package/src/Markdown/incremental.test.ts +16 -2
  544. package/src/Markdown/index.ts +1 -0
  545. package/src/Markdown/parser.perf.test.ts +96 -1
  546. package/src/Markdown/parser.test.ts +178 -2
  547. package/src/Markdown/parser.ts +253 -32
  548. package/src/MetadataList/MetadataList.test.tsx +75 -2
  549. package/src/MetadataList/MetadataListItem.tsx +5 -2
  550. package/src/MobileNav/MobileNav.tsx +62 -36
  551. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  552. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  553. package/src/MultiSelector/MultiSelector.test.tsx +311 -0
  554. package/src/MultiSelector/MultiSelector.tsx +151 -15
  555. package/src/MultiSelector/hooks.ts +9 -2
  556. package/src/MultiSelector/index.ts +1 -0
  557. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  558. package/src/NavIcon/NavIcon.test.tsx +9 -0
  559. package/src/NavIcon/NavIcon.tsx +5 -1
  560. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  561. package/src/NavMenu/NavHeadingMenu.tsx +9 -5
  562. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  563. package/src/NumberInput/NumberInput.test.tsx +436 -8
  564. package/src/NumberInput/NumberInput.tsx +62 -114
  565. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  566. package/src/NumberInput/numberInputCommit.ts +103 -0
  567. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  568. package/src/NumberInput/numberParser.test.ts +222 -0
  569. package/src/NumberInput/numberParser.ts +403 -0
  570. package/src/Outline/Outline.tsx +3 -2
  571. package/src/OverflowList/OverflowList.tsx +3 -2
  572. package/src/Overlay/Overlay.tsx +3 -2
  573. package/src/Pagination/Pagination.test.tsx +3 -2
  574. package/src/Popover/Popover.test.tsx +14 -0
  575. package/src/Popover/Popover.tsx +1 -9
  576. package/src/Popover/usePopover.tsx +57 -32
  577. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  578. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  579. package/src/PowerSearch/PowerSearch.tsx +34 -5
  580. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  581. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  582. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  583. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  584. package/src/PowerSearch/types.ts +2 -0
  585. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  586. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  587. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  588. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  589. package/src/ProgressBar/ProgressBar.tsx +28 -8
  590. package/src/Resizable/ResizeHandle.tsx +3 -2
  591. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  592. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  593. package/src/SelectableCard/SelectableCard.tsx +19 -2
  594. package/src/Selector/Selector.doc.mjs +26 -1
  595. package/src/Selector/Selector.test.tsx +346 -1
  596. package/src/Selector/Selector.tsx +148 -21
  597. package/src/Selector/hooks.ts +17 -2
  598. package/src/SideNav/SideNav.doc.mjs +6 -6
  599. package/src/SideNav/SideNav.tsx +4 -2
  600. package/src/SideNav/SideNavHeading.tsx +12 -12
  601. package/src/SideNav/SideNavItem.tsx +4 -2
  602. package/src/Slider/Slider.test.tsx +106 -1
  603. package/src/Slider/Slider.tsx +55 -3
  604. package/src/Spinner/Spinner.test.tsx +147 -1
  605. package/src/Spinner/Spinner.tsx +120 -101
  606. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  607. package/src/StatusDot/StatusDot.test.tsx +9 -0
  608. package/src/StatusDot/StatusDot.tsx +7 -1
  609. package/src/Stepper/Step.doc.mjs +98 -0
  610. package/src/Stepper/Step.tsx +1638 -0
  611. package/src/Stepper/StepStatus.ts +26 -0
  612. package/src/Stepper/Stepper.doc.mjs +370 -0
  613. package/src/Stepper/Stepper.test.tsx +1024 -0
  614. package/src/Stepper/Stepper.tsx +258 -0
  615. package/src/Stepper/StepperContext.ts +71 -0
  616. package/src/Stepper/index.ts +18 -0
  617. package/src/Stepper/stepper.stylex.ts +19 -0
  618. package/src/Switch/Switch.doc.mjs +2 -0
  619. package/src/Switch/Switch.test.tsx +10 -0
  620. package/src/Switch/Switch.tsx +6 -2
  621. package/src/TabList/Tab.doc.mjs +13 -1
  622. package/src/TabList/Tab.tsx +67 -7
  623. package/src/TabList/TabList.doc.mjs +22 -6
  624. package/src/TabList/TabList.test.tsx +559 -0
  625. package/src/TabList/TabList.tsx +490 -22
  626. package/src/TabList/TabListContext.ts +13 -2
  627. package/src/TabList/TabMenu.tsx +3 -2
  628. package/src/TabList/index.ts +6 -2
  629. package/src/Table/BaseTable.tsx +12 -4
  630. package/src/Table/Table.doc.mjs +9 -2
  631. package/src/Table/Table.test.tsx +132 -14
  632. package/src/Table/Table.tsx +3 -8
  633. package/src/Table/TableBody.doc.mjs +40 -0
  634. package/src/Table/TableFooter.doc.mjs +40 -0
  635. package/src/Table/TableHeader.doc.mjs +40 -0
  636. package/src/Table/TableRow.tsx +16 -5
  637. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  638. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  639. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  640. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  641. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
  642. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  643. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  644. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  645. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  646. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  647. package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
  648. package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
  649. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  650. package/src/Table/types.ts +22 -4
  651. package/src/Table/useBaseTablePlugins.ts +5 -0
  652. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  653. package/src/Table/useTablePagination.doc.mjs +7 -0
  654. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  655. package/src/Table/useTableSelection.doc.mjs +31 -0
  656. package/src/Text/Text.test.tsx +67 -1
  657. package/src/Text/Text.tsx +6 -3
  658. package/src/TextArea/TextArea.doc.mjs +12 -2
  659. package/src/TextArea/TextArea.test.tsx +11 -0
  660. package/src/TextArea/TextArea.tsx +37 -24
  661. package/src/TextInput/TextInput.doc.mjs +10 -0
  662. package/src/TextInput/TextInput.tsx +3 -2
  663. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  664. package/src/TimeInput/TimeInput.tsx +2 -2
  665. package/src/Timestamp/Timestamp.test.tsx +58 -0
  666. package/src/Timestamp/Timestamp.tsx +12 -10
  667. package/src/Toast/Toast.doc.mjs +26 -12
  668. package/src/Toast/Toast.tsx +28 -4
  669. package/src/Toast/ToastViewport.test.tsx +536 -8
  670. package/src/Toast/ToastViewport.tsx +81 -12
  671. package/src/Token/Token.test.tsx +95 -0
  672. package/src/Token/Token.tsx +15 -10
  673. package/src/Token/TokenLink.tsx +14 -5
  674. package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
  675. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  676. package/src/Tokenizer/Tokenizer.tsx +53 -24
  677. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  678. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  679. package/src/Tooltip/Tooltip.test.tsx +32 -0
  680. package/src/Tooltip/Tooltip.tsx +5 -0
  681. package/src/Tooltip/useTooltip.tsx +47 -24
  682. package/src/TopNav/TopNavHeading.tsx +5 -4
  683. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  684. package/src/TopNav/TopNavMegaMenu.tsx +47 -5
  685. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  686. package/src/TopNav/TopNavMenu.tsx +38 -7
  687. package/src/TreeList/TreeList.test.tsx +49 -0
  688. package/src/TreeList/TreeList.tsx +7 -2
  689. package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
  690. package/src/Typeahead/BaseTypeahead.tsx +181 -39
  691. package/src/Typeahead/Typeahead.doc.mjs +11 -0
  692. package/src/Typeahead/Typeahead.test.tsx +203 -0
  693. package/src/Typeahead/Typeahead.tsx +12 -2
  694. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  695. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  696. package/src/hooks/index.ts +2 -0
  697. package/src/hooks/useAnnounce.doc.mjs +96 -0
  698. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  699. package/src/hooks/useDevWarning.doc.mjs +96 -0
  700. package/src/hooks/useFocusTrap.test.tsx +14 -0
  701. package/src/hooks/useFocusTrap.ts +62 -111
  702. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  703. package/src/hooks/useHotkeys.ts +3 -18
  704. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  705. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  706. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  707. package/src/hooks/useLongPress.doc.mjs +123 -0
  708. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  709. package/src/hooks/useMergedRefs.test.tsx +62 -0
  710. package/src/hooks/useMergedRefs.ts +36 -0
  711. package/src/hooks/useTypeahead.doc.mjs +153 -0
  712. package/src/index.ts +1 -0
  713. package/src/raw-import.d.ts +14 -0
  714. package/src/theme/MediaTheme.doc.mjs +5 -5
  715. package/src/theme/Theme.test.tsx +104 -2
  716. package/src/theme/Theme.tsx +49 -14
  717. package/src/theme/defineTheme.test.ts +23 -0
  718. package/src/theme/derivedVarRegistry.test.ts +26 -3
  719. package/src/theme/derivedVarRegistry.ts +23 -4
  720. package/src/theme/generateThemeRules.test.ts +99 -1
  721. package/src/theme/generateThemeRules.ts +28 -0
  722. package/src/theme/syntax/tokens.ts +5 -2
  723. package/src/utils/groupItems.ts +12 -6
  724. package/src/utils/index.ts +1 -1
  725. package/src/utils/isApplePlatform.test.ts +61 -0
  726. package/src/utils/isApplePlatform.ts +37 -0
  727. package/src/utils/sharedResizeObserver.ts +10 -2
  728. package/src/utils/timeParser.test.ts +6 -1
  729. package/src/utils/timeParser.ts +35 -13
  730. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -8,6 +8,13 @@
8
8
  * @output Exports Dialog component, DialogProps, DialogVariant, DialogPurpose types
9
9
  * @position Core implementation; consumed by index.ts, tested by Dialog.test.tsx
10
10
  *
11
+ * The standard variant treats `width` as the preferred surface width, then
12
+ * clamps it to the dynamic viewport with spacing-token gutters so narrow
13
+ * viewports keep content and controls on screen without changing the public API.
14
+ * Fullscreen dialogs add safe-area protection to the default padding fallback
15
+ * while preserving explicit prop/theme padding overrides, and fade in without
16
+ * the centered-dialog translate/scale motion.
17
+ *
11
18
  * SYNC: When modified, update these files to stay in sync:
12
19
  * - /packages/core/src/Dialog/Dialog.doc.mjs (props table, features, implementation notes)
13
20
  * - /packages/core/src/Dialog/Dialog.test.tsx (tests for new/changed behavior)
@@ -27,14 +34,15 @@ import {
27
34
  import type {BaseProps} from '../BaseProps';
28
35
  import * as stylex from '@stylexjs/stylex';
29
36
  import {useScrollLock} from '../hooks/useScrollLock';
30
- import {hasActiveFocusTrapEscape} from '../hooks/useFocusTrap';
31
- import {isImeKeyEvent} from '../utils/ime';
37
+ import {LayerDepthProvider} from '../Layer/LayerDepthContext';
38
+ import {useLayerDismissal} from '../Layer/useLayerDismissal';
32
39
  import {
33
40
  colorVars,
34
41
  radiusVars,
35
42
  durationVars,
36
43
  easeVars,
37
44
  shadowVars,
45
+ spacingVars,
38
46
  } from '../theme/tokens.stylex';
39
47
  import {container} from '../Layout/container.stylex';
40
48
  import type {SpacingToken} from '../Layout/container.stylex';
@@ -47,13 +55,14 @@ import {
47
55
  overlayPaddingReset,
48
56
  } from '../Layout/padding.stylex';
49
57
  import type {SpacingStep} from '../utils/types';
50
- import {mergeProps, mergeRefs} from '../utils';
58
+ import {mergeProps} from '../utils';
51
59
  import {devWarn} from '../utils/devWarning';
52
60
  import {DialogContext} from './DialogContext';
53
61
  import {themeProps} from '../utils/themeProps';
54
62
  import type {DialogVariantMap} from './index';
55
63
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
56
64
 
65
+ import {useMergedRefs} from '../hooks/useMergedRefs';
57
66
  /**
58
67
  * Calculate a directional translate offset for dialog entry animation.
59
68
  * Returns a normalized vector from the trigger element toward the viewport
@@ -118,6 +127,32 @@ const enterDirectional = stylex.keyframes({
118
127
  to: {opacity: 1, transform: 'translate(0, 0) scale(1)'},
119
128
  });
120
129
 
130
+ const enterFullscreen = stylex.keyframes({
131
+ from: {opacity: 0},
132
+ to: {opacity: 1},
133
+ });
134
+
135
+ const dialogFullscreenSafeAreaBlockStartPadding = `var(--astryx-dialog-padding-block-start, var(--astryx-dialog-padding, max(${spacingVars['--spacing-4']}, env(safe-area-inset-top, 0px))))`;
136
+ const dialogFullscreenSafeAreaBlockEndPadding = `var(--astryx-dialog-padding-block-end, var(--astryx-dialog-padding, max(${spacingVars['--spacing-4']}, env(safe-area-inset-bottom, 0px))))`;
137
+ const dialogFullscreenSafeAreaInlineStartPaddingLtr = `var(--astryx-dialog-padding-inline-start, var(--astryx-dialog-padding-inline, var(--astryx-dialog-padding, max(${spacingVars['--spacing-4']}, env(safe-area-inset-left, 0px)))))`;
138
+ const dialogFullscreenSafeAreaInlineStartPaddingRtl = `var(--astryx-dialog-padding-inline-start, var(--astryx-dialog-padding-inline, var(--astryx-dialog-padding, max(${spacingVars['--spacing-4']}, env(safe-area-inset-right, 0px)))))`;
139
+ const dialogFullscreenSafeAreaInlineEndPaddingLtr = `var(--astryx-dialog-padding-inline-end, var(--astryx-dialog-padding-inline, var(--astryx-dialog-padding, max(${spacingVars['--spacing-4']}, env(safe-area-inset-right, 0px)))))`;
140
+ const dialogFullscreenSafeAreaInlineEndPaddingRtl = `var(--astryx-dialog-padding-inline-end, var(--astryx-dialog-padding-inline, var(--astryx-dialog-padding, max(${spacingVars['--spacing-4']}, env(safe-area-inset-left, 0px)))))`;
141
+
142
+ /** @internal Verified by Dialog.test.tsx; not re-exported from the package entry point. */
143
+ export const dialogFullscreenSafeAreaPaddingContract = {
144
+ blockStart: dialogFullscreenSafeAreaBlockStartPadding,
145
+ blockEnd: dialogFullscreenSafeAreaBlockEndPadding,
146
+ inlineStart: {
147
+ ltr: dialogFullscreenSafeAreaInlineStartPaddingLtr,
148
+ rtl: dialogFullscreenSafeAreaInlineStartPaddingRtl,
149
+ },
150
+ inlineEnd: {
151
+ ltr: dialogFullscreenSafeAreaInlineEndPaddingLtr,
152
+ rtl: dialogFullscreenSafeAreaInlineEndPaddingRtl,
153
+ },
154
+ } as const;
155
+
121
156
  /**
122
157
  * Dialog styles using native <dialog> element
123
158
  * Uses ::backdrop pseudo-element for overlay
@@ -171,6 +206,24 @@ const styles = stylex.create({
171
206
  margin: 0,
172
207
  inset: 0,
173
208
  },
209
+ fullscreenOpen: {
210
+ animationName: {
211
+ default: enterFullscreen,
212
+ '@media (prefers-reduced-motion: reduce)': 'none',
213
+ },
214
+ },
215
+ fullscreenSafeArea: {
216
+ paddingBlockStart: dialogFullscreenSafeAreaBlockStartPadding,
217
+ paddingBlockEnd: dialogFullscreenSafeAreaBlockEndPadding,
218
+ paddingInlineStart: {
219
+ default: dialogFullscreenSafeAreaInlineStartPaddingLtr,
220
+ ':is([dir="rtl"] *)': dialogFullscreenSafeAreaInlineStartPaddingRtl,
221
+ },
222
+ paddingInlineEnd: {
223
+ default: dialogFullscreenSafeAreaInlineEndPaddingLtr,
224
+ ':is([dir="rtl"] *)': dialogFullscreenSafeAreaInlineEndPaddingRtl,
225
+ },
226
+ },
174
227
  inner: {
175
228
  display: 'flex',
176
229
  flexDirection: 'column',
@@ -194,12 +247,30 @@ const styles = stylex.create({
194
247
  },
195
248
  });
196
249
 
197
- // Dynamic styles for width, maxHeight, and position
250
+ const STANDARD_DIALOG_VIEWPORT_GUTTER = spacingVars['--spacing-4'];
251
+ const STANDARD_DIALOG_VIEWPORT_MAX_WIDTH = `calc(100dvw - ${STANDARD_DIALOG_VIEWPORT_GUTTER} - ${STANDARD_DIALOG_VIEWPORT_GUTTER})`;
252
+ const STANDARD_DIALOG_MAX_WIDTH = `min(100%, ${STANDARD_DIALOG_VIEWPORT_MAX_WIDTH})`;
253
+
254
+ function formatSizeValue(value: number | string): string {
255
+ return typeof value === 'number' ? `${value}px` : value;
256
+ }
257
+
258
+ function resolveDialogSizing(
259
+ width: number | string,
260
+ maxHeight: number | string,
261
+ ) {
262
+ return {
263
+ width: formatSizeValue(width),
264
+ maxWidth: STANDARD_DIALOG_MAX_WIDTH,
265
+ maxHeight: formatSizeValue(maxHeight),
266
+ };
267
+ }
268
+
198
269
  const dynamicStyles = stylex.create({
199
- sizing: (width: number | string, maxHeight: number | string) => ({
200
- width: typeof width === 'number' ? `${width}px` : width,
201
- maxWidth: '90vw',
202
- maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,
270
+ sizing: (width: string, maxWidth: string, maxHeight: string) => ({
271
+ width,
272
+ maxWidth,
273
+ maxHeight,
203
274
  }),
204
275
  position: (
205
276
  top: string,
@@ -288,7 +359,7 @@ export interface DialogProps extends BaseProps<HTMLDialogElement> {
288
359
  * The actual height will be the height of its content.
289
360
  * Numbers are treated as pixels, strings are used as-is.
290
361
  * Ignored when variant is 'fullscreen'.
291
- * @default '75vh'
362
+ * @default '75dvh'
292
363
  */
293
364
  maxHeight?: number | string;
294
365
 
@@ -356,7 +427,7 @@ export function Dialog({
356
427
  isInline = false,
357
428
  onOpenChange,
358
429
  width = 400,
359
- maxHeight = '75vh',
430
+ maxHeight = '75dvh',
360
431
  position,
361
432
  variant = 'standard',
362
433
  purpose = 'info',
@@ -374,6 +445,9 @@ export function Dialog({
374
445
  const paddingToken = spacingStepToToken[effectivePadding] as SpacingToken;
375
446
 
376
447
  const isFullscreen = variant === 'fullscreen';
448
+ const standardSizing = isFullscreen
449
+ ? null
450
+ : resolveDialogSizing(width, maxHeight);
377
451
 
378
452
  // Default accessible name: publish a title id through DialogContext so a
379
453
  // DialogHeader applies it to its heading (mirrors AlertDialog's explicit
@@ -415,6 +489,8 @@ export function Dialog({
415
489
  [titleId, hasConsumerName],
416
490
  );
417
491
 
492
+ const mergedDialogRef = useMergedRefs(ref, attachDialog);
493
+
418
494
  // Capture the element that was focused when the dialog opened,
419
495
  // for directional animation origin and focus restoration on close.
420
496
  const triggerElementRef = useRef<HTMLElement | null>(null);
@@ -474,34 +550,24 @@ export function Dialog({
474
550
  // Skip for inline rendering — no modal overlay to compensate for.
475
551
  useScrollLock(isOpen && !isInline);
476
552
 
477
- // Handle Escape key — skip for inline rendering
478
- useEffect(() => {
479
- if (isInline) {
480
- return;
481
- }
482
- const dialog = dialogRef.current;
483
- if (!dialog || !isOpen) {
484
- return;
485
- }
486
-
487
- const handleKeyDown = (event: KeyboardEvent) => {
488
- if (event.key === 'Escape') {
489
- // Ignore IME composition-cancel, and defer to any popover/menu layered
490
- // on top of this dialog so a single Escape closes only the top-most
491
- // layer (the popover's own focus trap handles it and stops propagation).
492
- if (isImeKeyEvent(event) || hasActiveFocusTrapEscape()) {
493
- return;
494
- }
495
- event.preventDefault();
496
- if (allowEscape) {
497
- onOpenChange(false);
498
- }
499
- }
500
- };
501
-
502
- dialog.addEventListener('keydown', handleKeyDown);
503
- return () => dialog.removeEventListener('keydown', handleKeyDown);
504
- }, [isOpen, isInline, allowEscape, onOpenChange]);
553
+ // Join the shared layer dismissal stack. The stack owns the Escape listener
554
+ // and routes each press to the top-most layer, so this dialog does not listen
555
+ // itself — that is what stops a modal opened from inside another modal (or a
556
+ // popover opened inside this one) from closing two layers on one press.
557
+ //
558
+ // A `required` dialog registers as `block`: it must not be dismissed, and the
559
+ // press must not fall through and dismiss a layer behind it either.
560
+ //
561
+ // Inline mode opts out — it renders dialog content in normal flow, with
562
+ // nothing layered over anything.
563
+ const {shouldDismissOnCloseRequest} = useLayerDismissal({
564
+ isActive: isOpen,
565
+ isEnabled: !isInline,
566
+ escapeBehavior: allowEscape ? 'close' : 'block',
567
+ onDismiss: () => {
568
+ onOpenChange(false);
569
+ },
570
+ });
505
571
 
506
572
  // Dev-time guardrail: an open modal should always have an accessible name.
507
573
  // The header-title check reads the DOM, so this stays in an effect; the ref
@@ -537,12 +603,18 @@ export function Dialog({
537
603
  }
538
604
  };
539
605
 
540
- // Handle native cancel event (browser Escape handling)
606
+ // The native `cancel` event is the browser's own close-watcher firing: an
607
+ // Android back gesture, or a close request the stack never saw a press for.
608
+ // Escape presses the stack owns never arrive here — it preventDefault()s
609
+ // those, which suppresses the close watcher.
610
+ //
611
+ // Always preventDefault so the browser cannot close a controlled <dialog>
612
+ // behind React's back, then answer the request with the stack's own rules:
613
+ // only the top-most layer dismisses, a `required` dialog swallows it, and
614
+ // nothing dismisses while an IME composition is in progress.
541
615
  const handleCancel = (event: React.SyntheticEvent<HTMLDialogElement>) => {
542
616
  event.preventDefault();
543
- // Defer to a popover/menu layered on top of this dialog; it will dismiss
544
- // itself on the same Escape press.
545
- if (hasActiveFocusTrapEscape()) {
617
+ if (!shouldDismissOnCloseRequest()) {
546
618
  return;
547
619
  }
548
620
  if (allowEscape) {
@@ -550,7 +622,6 @@ export function Dialog({
550
622
  }
551
623
  };
552
624
 
553
- // Shared inner content wrapper
554
625
  const innerContent = (
555
626
  <div
556
627
  {...stylex.props(
@@ -559,22 +630,14 @@ export function Dialog({
559
630
  useThemeDefault
560
631
  ? {
561
632
  useThemeDefault: 'dialog',
562
- maxHeight: isFullscreen
563
- ? undefined
564
- : typeof maxHeight === 'number'
565
- ? `${maxHeight}px`
566
- : maxHeight,
633
+ maxHeight: standardSizing?.maxHeight,
567
634
  }
568
635
  : {
569
636
  paddingInnerX: paddingToken,
570
637
  paddingInnerY: paddingToken,
571
638
  paddingOuterX: paddingToken,
572
639
  paddingOuterY: paddingToken,
573
- maxHeight: isFullscreen
574
- ? undefined
575
- : typeof maxHeight === 'number'
576
- ? `${maxHeight}px`
577
- : maxHeight,
640
+ maxHeight: standardSizing?.maxHeight,
578
641
  },
579
642
  ),
580
643
  !useThemeDefault &&
@@ -589,6 +652,7 @@ export function Dialog({
589
652
  !useThemeDefault &&
590
653
  effectivePadding !== 4 &&
591
654
  containerPaddingBlockEndVarStyles[effectivePadding],
655
+ isFullscreen && useThemeDefault && styles.fullscreenSafeArea,
592
656
  )}>
593
657
  <DialogContext value={dialogContextValue}>{children}</DialogContext>
594
658
  </div>
@@ -612,7 +676,12 @@ export function Dialog({
612
676
  stylex.props(
613
677
  styles.inlineWrapper,
614
678
  overlayPaddingReset.reset,
615
- !isFullscreen && dynamicStyles.sizing(width, maxHeight),
679
+ standardSizing &&
680
+ dynamicStyles.sizing(
681
+ standardSizing.width,
682
+ standardSizing.maxWidth,
683
+ standardSizing.maxHeight,
684
+ ),
616
685
  isFullscreen && styles.fullscreen,
617
686
  xstyle,
618
687
  ),
@@ -623,7 +692,7 @@ export function Dialog({
623
692
  (props as Record<string, unknown>)['data-testid'] as
624
693
  string | undefined
625
694
  }>
626
- {innerContent}
695
+ <LayerDepthProvider>{innerContent}</LayerDepthProvider>
627
696
  </div>
628
697
  );
629
698
  }
@@ -632,7 +701,7 @@ export function Dialog({
632
701
 
633
702
  return (
634
703
  <dialog
635
- ref={mergeRefs(ref, attachDialog)}
704
+ ref={mergedDialogRef}
636
705
  {...safeProps}
637
706
  {...mergeProps(
638
707
  themeProps('dialog', {variant}),
@@ -641,7 +710,12 @@ export function Dialog({
641
710
  overlayPaddingReset.reset,
642
711
  isOpen && styles.open,
643
712
  styles.backdrop,
644
- !isFullscreen && dynamicStyles.sizing(width, maxHeight),
713
+ standardSizing &&
714
+ dynamicStyles.sizing(
715
+ standardSizing.width,
716
+ standardSizing.maxWidth,
717
+ standardSizing.maxHeight,
718
+ ),
645
719
  hasPosition &&
646
720
  (() => {
647
721
  const o = resolveDialogPositionOffsets(position);
@@ -653,6 +727,7 @@ export function Dialog({
653
727
  );
654
728
  })(),
655
729
  isFullscreen && styles.fullscreen,
730
+ isFullscreen && isOpen && styles.fullscreenOpen,
656
731
  xstyle,
657
732
  ),
658
733
  className,
@@ -665,7 +740,7 @@ export function Dialog({
665
740
  // imperatively in `attachDialog`; a consumer-provided aria-labelledby
666
741
  // flows through {...safeProps} above and wins.
667
742
  {...(purpose === 'required' ? {role: 'alertdialog'} : undefined)}>
668
- {innerContent}
743
+ <LayerDepthProvider>{innerContent}</LayerDepthProvider>
669
744
  </dialog>
670
745
  );
671
746
  }
@@ -89,6 +89,12 @@ export const docs = {
89
89
  type: '() => void',
90
90
  description: 'Callback fired when the trigger button is clicked.',
91
91
  },
92
+ {
93
+ name: 'placement',
94
+ type: "'above' | 'below' | 'start' | 'end'",
95
+ description: 'Position placement for the menu popover relative to the trigger button.',
96
+ default: "'below'",
97
+ },
92
98
  {
93
99
  name: 'hasChevron',
94
100
  type: 'boolean',
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import {describe, it, expect, vi, beforeEach} from 'vitest';
13
- import {render, screen, fireEvent, waitFor} from '@testing-library/react';
13
+ import {render, screen, fireEvent, waitFor, act} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {useState} from 'react';
16
16
  import {DropdownMenu} from './DropdownMenu';
@@ -315,10 +315,7 @@ describe('DropdownMenu', () => {
315
315
  });
316
316
 
317
317
  describe('DropdownMenu light-dismiss race', () => {
318
- it('does not re-open the menu when a click follows a hide within the guard window', () => {
319
- // Reproduces the iOS Safari race: pointerdown fires light-dismiss before
320
- // the subsequent click on the trigger; without the guard, the click would
321
- // immediately re-open the menu in the same tap.
318
+ function openMenu() {
322
319
  render(
323
320
  <DropdownMenu
324
321
  button={{label: 'Actions'}}
@@ -326,13 +323,50 @@ describe('DropdownMenu light-dismiss race', () => {
326
323
  data-testid="astryx-dropdown-menu"
327
324
  />,
328
325
  );
329
-
330
326
  const trigger = screen.getByTestId('astryx-dropdown-menu');
331
- fireEvent.click(trigger); // open
332
- fireEvent.click(trigger); // close (stamps guard)
333
- fireEvent.click(trigger); // would re-open without guard
327
+ fireEvent.pointerDown(trigger);
328
+ fireEvent.click(trigger);
334
329
  expect(HTMLElement.prototype.showPopover).toHaveBeenCalledTimes(1);
335
- expect(HTMLElement.prototype.hidePopover).toHaveBeenCalledTimes(1);
330
+ return trigger;
331
+ }
332
+
333
+ /**
334
+ * The browser dismisses the menu on pointerup and queues the `toggle` event;
335
+ * on the engines that lose the race it reaches React before the trigger's
336
+ * own click, which then reads a closed menu.
337
+ */
338
+ function lightDismiss() {
339
+ const popover = document.querySelector('[popover]') as HTMLElement;
340
+ act(() => {
341
+ popover.dispatchEvent(
342
+ Object.assign(new Event('toggle'), {
343
+ oldState: 'open',
344
+ newState: 'closed',
345
+ }),
346
+ );
347
+ });
348
+ }
349
+
350
+ it('does not re-open when the trigger click follows its own light dismiss', () => {
351
+ const trigger = openMenu();
352
+
353
+ fireEvent.pointerDown(trigger);
354
+ lightDismiss();
355
+ fireEvent.click(trigger);
356
+
357
+ expect(HTMLElement.prototype.showPopover).toHaveBeenCalledTimes(1);
358
+ });
359
+
360
+ it('re-opens on a press of its own after a light dismiss', () => {
361
+ const trigger = openMenu();
362
+
363
+ fireEvent.pointerDown(trigger);
364
+ lightDismiss();
365
+ fireEvent.click(trigger);
366
+ fireEvent.pointerDown(trigger);
367
+ fireEvent.click(trigger);
368
+
369
+ expect(HTMLElement.prototype.showPopover).toHaveBeenCalledTimes(2);
336
370
  });
337
371
  });
338
372
 
@@ -37,7 +37,7 @@ import React, {
37
37
  type ReactNode,
38
38
  } from 'react';
39
39
  import * as stylex from '@stylexjs/stylex';
40
- import {usePopover} from '../Popover/usePopover';
40
+ import {usePopoverInternal} from '../Popover/usePopover';
41
41
  import {Button, type ButtonProps} from '../Button';
42
42
  import {Icon} from '../Icon';
43
43
 
@@ -261,14 +261,8 @@ export function DropdownMenu({
261
261
  const isControlled = controlledIsOpen !== undefined;
262
262
  const isOpen = isControlled ? controlledIsOpen : internalIsOpen;
263
263
 
264
- // Track when the menu was last hidden so a near-simultaneous trigger
265
- // click — e.g. on iOS Safari where pointerdown fires light-dismiss
266
- // before the trigger's click event — can't immediately re-open it.
267
- const lastHideTimeRef = useRef(0);
268
-
269
264
  // Close menu + return focus to trigger
270
265
  const handleLayerHide = useCallback(() => {
271
- lastHideTimeRef.current = Date.now();
272
266
  onOpenChange?.(false);
273
267
  if (!isControlled) {
274
268
  setInternalIsOpen(false);
@@ -294,7 +288,7 @@ export function DropdownMenu({
294
288
  }
295
289
  }, [isControlled, onOpenChange]);
296
290
 
297
- const popover = usePopover({
291
+ const popover = usePopoverInternal({
298
292
  onHide: handleLayerHide,
299
293
  onShow: handleLayerShow,
300
294
  hasLightDismiss: true,
@@ -422,11 +416,8 @@ export function DropdownMenu({
422
416
 
423
417
  const handleButtonClick = useCallback(
424
418
  (e: React.MouseEvent<HTMLButtonElement>) => {
425
- // If the menu was just closed by light dismiss (e.g. iOS Safari fires
426
- // pointerdown → hide before the trigger's click), the click would
427
- // otherwise immediately re-open it. Short-circuit within the guard
428
- // window.
429
- if (Date.now() - lastHideTimeRef.current < 50) {
419
+ // The click that light-dismissed the menu is not a request to reopen it.
420
+ if (popover.wasJustDismissed()) {
430
421
  return;
431
422
  }
432
423
  onClick?.();
@@ -701,11 +701,14 @@ describe('DropdownMenuSubMenu theming slots', () => {
701
701
  name: /Move to/,
702
702
  hidden: true,
703
703
  });
704
- // The indicator-icon slot wraps the chevron affordance inside the trigger
705
- // row.
706
- expect(
707
- trigger.querySelector('.astryx-dropdown-menu-indicator-icon'),
708
- ).toBeInTheDocument();
704
+ // The indicator-icon slot sits on the chevron glyph itself (the element
705
+ // that carries the icon size), so a theme can restyle its size/color
706
+ // directly.
707
+ const indicator = trigger.querySelector(
708
+ '.astryx-dropdown-menu-indicator-icon',
709
+ );
710
+ expect(indicator).toBeInTheDocument();
711
+ expect(indicator).toHaveClass('astryx-icon');
709
712
  });
710
713
  });
711
714
 
@@ -476,20 +476,17 @@ export function DropdownMenuSubMenu(
476
476
  );
477
477
 
478
478
  const endAffordance = hasSpinner ? (
479
- <span
480
- {...mergeProps(
481
- themeProps('dropdown-menu-indicator-icon'),
482
- stylex.props(triggerStyles.caret),
483
- )}>
479
+ <span {...stylex.props(triggerStyles.caret)}>
484
480
  <Spinner size="sm" />
485
481
  </span>
486
482
  ) : (
487
- <span
488
- {...mergeProps(
489
- themeProps('dropdown-menu-indicator-icon'),
490
- stylex.props(triggerStyles.caret),
491
- )}>
492
- <Icon icon="chevronRight" size="sm" color="secondary" />
483
+ <span {...stylex.props(triggerStyles.caret)}>
484
+ <Icon
485
+ icon="chevronRight"
486
+ size="sm"
487
+ color="secondary"
488
+ {...themeProps('dropdown-menu-indicator-icon')}
489
+ />
493
490
  </span>
494
491
  );
495
492
 
@@ -39,8 +39,8 @@ export const docs = {
39
39
  ],
40
40
  vars: [
41
41
  {name: '--_field-radius', description: 'Border radius of input fields', default: 'var(--radius-element)', private: true},
42
- {name: '--_input-clear-hit-inset', description: 'Outset of the clear (\u2715) button\u2019s invisible hit area, applied to a ::after overlay. 0 on a fine pointer; negative on a coarse one, which grows the 20px button to the 24px touch target without changing what is drawn.', default: '0px', private: true},
43
- {name: '--_input-clear-hit-content', description: 'Whether the clear (\u2715) button\u2019s invisible hit overlay exists. `none` on a fine pointer, so no ::after is generated and hover still reaches the glyph; `""` on a coarse one, where the overlay provides the 24px touch target.', default: 'none', private: true},
42
+ {name: '--_input-clear-hit-inset', description: 'Outset of the clear (\u2715) button\'s invisible hit area, applied to a ::after overlay. 0 on a fine pointer; negative on a coarse one, which grows the 20px button to the 24px touch target without changing what is drawn.', default: '0px', private: true},
43
+ {name: '--_input-clear-hit-content', description: 'Whether the clear (\u2715) button\'s invisible hit overlay exists. `none` on a fine pointer, so no ::after is generated and hover still reaches the glyph; `""` on a coarse one, where the overlay provides the 24px touch target.', default: 'none', private: true},
44
44
  ],
45
45
  derived: [
46
46
  {property: 'borderRadius', vars: ['--_field-radius']},
@@ -60,6 +60,17 @@ export const docs = {
60
60
  description: 'ID for the input element (used for the label htmlFor attribute).',
61
61
  required: true,
62
62
  },
63
+ {
64
+ name: 'labelID',
65
+ type: 'string',
66
+ description: 'ID applied to the label element itself for group accessibility.',
67
+ },
68
+ {
69
+ name: 'isGroupLabel',
70
+ type: 'boolean',
71
+ description: 'Renders the label as a span for control groups (radiogroup, checkbox list).',
72
+ default: 'false',
73
+ },
63
74
  {
64
75
  name: 'children',
65
76
  type: 'ReactNode',
@@ -15,6 +15,7 @@ import userEvent from '@testing-library/user-event';
15
15
  import {TestIcon} from '../__tests__/TestIcon';
16
16
  import {InternationalizationProvider} from '../i18n';
17
17
  import {FieldLabel} from './FieldLabel';
18
+ import {themeProps} from '../utils/themeProps';
18
19
 
19
20
  describe('FieldLabel', () => {
20
21
  it('renders label text', () => {
@@ -197,4 +198,32 @@ describe('FieldLabel', () => {
197
198
  expect(description.closest('label')).toBeNull();
198
199
  });
199
200
  });
201
+
202
+ describe('a control can name its own label target', () => {
203
+ it('composes a passed target onto the field-label one', () => {
204
+ // How CheckboxInput and Switch reach their label: the control spreads
205
+ // its own themeProps in, and both classes end up on the same element,
206
+ // so a theme can style every label or just this kind.
207
+ render(
208
+ <FieldLabel
209
+ {...themeProps('checkbox-label')}
210
+ label="Notify me"
211
+ inputID="notify-input"
212
+ />,
213
+ );
214
+ const label = screen.getByText('Notify me').closest('label');
215
+ expect(label).toHaveClass('astryx-field-label');
216
+ expect(label).toHaveClass('astryx-checkbox-label');
217
+ });
218
+
219
+ it('describes no placement of its own', () => {
220
+ // The label cannot know how its caller arranged it, so it says nothing:
221
+ // a `data-layout` here would be a claim that is wrong for at least one
222
+ // caller (Field's horizontal-labels puts a label beside its control),
223
+ // and a consumer could set it untruthfully.
224
+ render(<FieldLabel label="Email" inputID="email-input" />);
225
+ const label = screen.getByText('Email').closest('label');
226
+ expect(label).not.toHaveAttribute('data-layout');
227
+ });
228
+ });
200
229
  });
@@ -285,6 +285,13 @@ export function FieldLabel({
285
285
  htmlFor={isGroupLabel ? undefined : inputID}
286
286
  {...rest}
287
287
  {...mergeProps(
288
+ // A control that knows what kind of label this is passes its own
289
+ // target down (CheckboxInput's `checkbox-label`, Switch's
290
+ // `switch-label`); it arrives as `className` and composes onto this
291
+ // one. The label itself does not describe its own placement — it
292
+ // cannot know it, and any encoding it guessed would be wrong for a
293
+ // caller that arranges labels differently (Field's
294
+ // `horizontal-labels`).
288
295
  themeProps('field-label'),
289
296
  stylex.props(
290
297
  styles.label,
@@ -15,7 +15,7 @@ import {readFileSync} from 'node:fs';
15
15
  import path from 'node:path';
16
16
  import {describe, it, expect, vi} from 'vitest';
17
17
  import {render, screen, fireEvent} from '@testing-library/react';
18
- import {InputClearButton} from './InputClearButton';
18
+ import {InputClearButton, type InputClearButtonProps} from './InputClearButton';
19
19
  import {Icon} from '../Icon';
20
20
  import {defineTheme} from '../theme/defineTheme';
21
21
  import {generateThemeCSS} from '../theme/generateThemeRules';
@@ -67,6 +67,20 @@ const getGlyph = (): HTMLElement => {
67
67
  return icon as HTMLElement;
68
68
  };
69
69
 
70
+ describe('InputClearButton public props', () => {
71
+ it('keep popup invoker handlers internal', () => {
72
+ const hasPointerDown: 'onPointerDown' extends keyof InputClearButtonProps
73
+ ? true
74
+ : false = false;
75
+ const hasClickCapture: 'onClickCapture' extends keyof InputClearButtonProps
76
+ ? true
77
+ : false = false;
78
+
79
+ expect(hasPointerDown).toBe(false);
80
+ expect(hasClickCapture).toBe(false);
81
+ });
82
+ });
83
+
70
84
  describe('InputClearButton', () => {
71
85
  it('renders a real button with the given accessible label', () => {
72
86
  render(<InputClearButton label="Clear" onClick={() => {}} />);