@astryxdesign/core 0.4.7 → 0.5.0-canary.32a62fd

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 (554) hide show
  1. package/CHANGELOG.md +161 -1
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +3 -2
  4. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  5. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  6. package/dist/AspectRatio/AspectRatio.js +23 -4
  7. package/dist/Avatar/Avatar.d.ts +25 -1
  8. package/dist/Avatar/Avatar.d.ts.map +1 -1
  9. package/dist/Avatar/Avatar.js +58 -19
  10. package/dist/Avatar/index.d.ts +2 -2
  11. package/dist/Avatar/index.d.ts.map +1 -1
  12. package/dist/Avatar/index.js +1 -1
  13. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  14. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  15. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  16. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  17. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  19. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  20. package/dist/Banner/Banner.d.ts +40 -15
  21. package/dist/Banner/Banner.d.ts.map +1 -1
  22. package/dist/Banner/Banner.js +51 -18
  23. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  24. package/dist/BottomSheet/BottomSheet.js +17 -4
  25. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  26. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  27. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  28. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  29. package/dist/Button/Button.d.ts.map +1 -1
  30. package/dist/Button/Button.js +5 -4
  31. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  32. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  33. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  34. package/dist/Calendar/Calendar.d.ts +3 -1
  35. package/dist/Calendar/Calendar.d.ts.map +1 -1
  36. package/dist/Calendar/Calendar.js +13 -14
  37. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  38. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  39. package/dist/Calendar/getInitialFocusDate.js +62 -0
  40. package/dist/Carousel/Carousel.d.ts.map +1 -1
  41. package/dist/Carousel/Carousel.js +3 -3
  42. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  43. package/dist/Chat/ChatComposerInput.js +2 -3
  44. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  45. package/dist/Chat/ChatLayout.js +3 -3
  46. package/dist/Chat/ChatMessageList.d.ts +22 -3
  47. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  48. package/dist/Chat/ChatMessageList.js +6 -3
  49. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  50. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  51. package/dist/Chat/ChatTokenizedText.js +11 -6
  52. package/dist/Chat/useChatComposerTokens.js +1 -1
  53. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  54. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  55. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  56. package/dist/ClickableCard/ClickableCard.js +3 -3
  57. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  58. package/dist/CodeBlock/CodeBlock.js +15 -4
  59. package/dist/CodeBlock/highlightRanges.js +1 -1
  60. package/dist/CodeBlock/highlightStyles.js +13 -13
  61. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  62. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  63. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  64. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  65. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  66. package/dist/ContextMenu/ContextMenu.js +4 -3
  67. package/dist/DateInput/DateInput.d.ts +43 -0
  68. package/dist/DateInput/DateInput.d.ts.map +1 -1
  69. package/dist/DateInput/DateInput.js +22 -2
  70. package/dist/DateInput/NativeDateField.d.ts +10 -0
  71. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  72. package/dist/DateInput/NativeDateField.js +477 -0
  73. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  74. package/dist/DateInput/TouchDateField.js +38 -4
  75. package/dist/DateInput/index.d.ts +1 -1
  76. package/dist/DateInput/index.d.ts.map +1 -1
  77. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  78. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  79. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  80. package/dist/DateTimeInput/index.d.ts +1 -1
  81. package/dist/DateTimeInput/index.d.ts.map +1 -1
  82. package/dist/Dialog/Dialog.d.ts +7 -1
  83. package/dist/Dialog/Dialog.d.ts.map +1 -1
  84. package/dist/Dialog/Dialog.js +89 -58
  85. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  86. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  87. package/dist/Field/FieldLabel.d.ts.map +1 -1
  88. package/dist/Field/FieldLabel.js +9 -1
  89. package/dist/FileInput/FileInput.d.ts.map +1 -1
  90. package/dist/FileInput/FileInput.js +3 -2
  91. package/dist/Heading/Heading.d.ts.map +1 -1
  92. package/dist/Heading/Heading.js +6 -2
  93. package/dist/HoverCard/HoverCard.d.ts +6 -0
  94. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  95. package/dist/HoverCard/HoverCard.js +52 -3
  96. package/dist/HoverCard/useHoverCard.d.ts +16 -2
  97. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  98. package/dist/HoverCard/useHoverCard.js +74 -26
  99. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  100. package/dist/Indicator/CheckboxIndicator.js +6 -2
  101. package/dist/Item/Item.d.ts.map +1 -1
  102. package/dist/Item/Item.js +4 -2
  103. package/dist/Kbd/Kbd.d.ts.map +1 -1
  104. package/dist/Kbd/Kbd.js +2 -19
  105. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  106. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  107. package/dist/Layer/LayerDepthContext.js +66 -0
  108. package/dist/Layer/index.d.ts +3 -0
  109. package/dist/Layer/index.d.ts.map +1 -1
  110. package/dist/Layer/index.js +4 -0
  111. package/dist/Layer/layerStack.d.ts +98 -0
  112. package/dist/Layer/layerStack.d.ts.map +1 -0
  113. package/dist/Layer/layerStack.js +306 -0
  114. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  115. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  116. package/dist/Layer/useLayerDismissal.js +91 -0
  117. package/dist/Lightbox/Lightbox.d.ts +1 -0
  118. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  119. package/dist/Lightbox/Lightbox.js +103 -81
  120. package/dist/Markdown/index.d.ts +1 -1
  121. package/dist/Markdown/index.d.ts.map +1 -1
  122. package/dist/Markdown/parser.d.ts +38 -1
  123. package/dist/Markdown/parser.d.ts.map +1 -1
  124. package/dist/Markdown/parser.js +177 -29
  125. package/dist/MobileNav/MobileNav.d.ts +6 -1
  126. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  127. package/dist/MobileNav/MobileNav.js +61 -36
  128. package/dist/MultiSelector/MultiSelector.d.ts +15 -1
  129. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  130. package/dist/MultiSelector/MultiSelector.js +17 -6
  131. package/dist/MultiSelector/index.d.ts +1 -1
  132. package/dist/MultiSelector/index.d.ts.map +1 -1
  133. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  134. package/dist/NavIcon/NavIcon.js +5 -1
  135. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  136. package/dist/NavMenu/NavHeadingMenu.js +3 -2
  137. package/dist/NumberInput/NumberInput.d.ts +1 -0
  138. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  139. package/dist/NumberInput/NumberInput.js +27 -37
  140. package/dist/NumberInput/numberParser.d.ts +43 -0
  141. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  142. package/dist/NumberInput/numberParser.js +293 -0
  143. package/dist/Outline/Outline.d.ts.map +1 -1
  144. package/dist/Outline/Outline.js +3 -2
  145. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  146. package/dist/OverflowList/OverflowList.js +3 -2
  147. package/dist/Overlay/Overlay.d.ts.map +1 -1
  148. package/dist/Overlay/Overlay.js +3 -2
  149. package/dist/Popover/usePopover.d.ts.map +1 -1
  150. package/dist/Popover/usePopover.js +20 -17
  151. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  152. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  153. package/dist/PowerSearch/PowerSearch.js +19 -6
  154. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  155. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  156. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  157. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  158. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  159. package/dist/PowerSearch/PowerSearchValueEditor.js +19 -9
  160. package/dist/PowerSearch/types.d.ts +2 -0
  161. package/dist/PowerSearch/types.d.ts.map +1 -1
  162. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  163. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  164. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  165. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  166. package/dist/ProgressBar/ProgressBar.js +18 -5
  167. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  168. package/dist/Resizable/ResizeHandle.js +3 -2
  169. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  170. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  171. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  172. package/dist/SelectableCard/SelectableCard.js +3 -3
  173. package/dist/Selector/Selector.d.ts.map +1 -1
  174. package/dist/Selector/Selector.js +5 -0
  175. package/dist/SideNav/SideNav.d.ts.map +1 -1
  176. package/dist/SideNav/SideNav.js +4 -3
  177. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  178. package/dist/SideNav/SideNavHeading.js +8 -7
  179. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  180. package/dist/SideNav/SideNavItem.js +4 -3
  181. package/dist/Slider/Slider.d.ts.map +1 -1
  182. package/dist/Slider/Slider.js +3 -3
  183. package/dist/Spinner/Spinner.d.ts +3 -3
  184. package/dist/Spinner/Spinner.d.ts.map +1 -1
  185. package/dist/Spinner/Spinner.js +130 -78
  186. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  187. package/dist/StatusDot/StatusDot.js +6 -1
  188. package/dist/Stepper/Step.d.ts +140 -0
  189. package/dist/Stepper/Step.d.ts.map +1 -0
  190. package/dist/Stepper/Step.js +1045 -0
  191. package/dist/Stepper/StepStatus.d.ts +24 -0
  192. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  193. package/dist/Stepper/StepStatus.js +1 -0
  194. package/dist/Stepper/Stepper.d.ts +93 -0
  195. package/dist/Stepper/Stepper.d.ts.map +1 -0
  196. package/dist/Stepper/Stepper.js +184 -0
  197. package/dist/Stepper/StepperContext.d.ts +41 -0
  198. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  199. package/dist/Stepper/StepperContext.js +34 -0
  200. package/dist/Stepper/index.d.ts +8 -0
  201. package/dist/Stepper/index.d.ts.map +1 -0
  202. package/dist/Stepper/index.js +7 -0
  203. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  204. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  205. package/dist/Stepper/stepper.stylex.js +20 -0
  206. package/dist/Switch/Switch.d.ts.map +1 -1
  207. package/dist/Switch/Switch.js +8 -3
  208. package/dist/TabList/Tab.d.ts +15 -2
  209. package/dist/TabList/Tab.d.ts.map +1 -1
  210. package/dist/TabList/Tab.js +32 -7
  211. package/dist/TabList/TabList.d.ts +46 -7
  212. package/dist/TabList/TabList.d.ts.map +1 -1
  213. package/dist/TabList/TabList.js +353 -23
  214. package/dist/TabList/TabListContext.d.ts +11 -1
  215. package/dist/TabList/TabListContext.d.ts.map +1 -1
  216. package/dist/TabList/TabListContext.js +11 -2
  217. package/dist/TabList/TabMenu.d.ts.map +1 -1
  218. package/dist/TabList/TabMenu.js +3 -2
  219. package/dist/TabList/index.d.ts +2 -2
  220. package/dist/TabList/index.d.ts.map +1 -1
  221. package/dist/Table/BaseTable.d.ts.map +1 -1
  222. package/dist/Table/BaseTable.js +10 -2
  223. package/dist/Table/Table.d.ts.map +1 -1
  224. package/dist/Table/Table.js +3 -6
  225. package/dist/Table/TableRow.d.ts +16 -5
  226. package/dist/Table/TableRow.d.ts.map +1 -1
  227. package/dist/Table/TableRow.js +16 -5
  228. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  229. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
  230. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  231. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  232. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  233. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  234. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  235. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  236. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  237. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  238. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  239. package/dist/Table/plugins/selection/useTableSelection.js +19 -5
  240. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  241. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  242. package/dist/Table/types.d.ts +22 -4
  243. package/dist/Table/types.d.ts.map +1 -1
  244. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  245. package/dist/Table/useBaseTablePlugins.js +5 -0
  246. package/dist/Text/Text.d.ts.map +1 -1
  247. package/dist/Text/Text.js +6 -2
  248. package/dist/TextArea/TextArea.d.ts.map +1 -1
  249. package/dist/TextArea/TextArea.js +9 -3
  250. package/dist/TextInput/TextInput.d.ts.map +1 -1
  251. package/dist/TextInput/TextInput.js +3 -2
  252. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  253. package/dist/TimeInput/TimeInput.js +3 -2
  254. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  255. package/dist/Timestamp/Timestamp.js +5 -3
  256. package/dist/Token/TokenLink.d.ts.map +1 -1
  257. package/dist/Token/TokenLink.js +2 -2
  258. package/dist/Tokenizer/Tokenizer.d.ts +3 -1
  259. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  260. package/dist/Tokenizer/Tokenizer.js +2 -0
  261. package/dist/Tooltip/Tooltip.d.ts +5 -0
  262. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  263. package/dist/Tooltip/useTooltip.d.ts +5 -0
  264. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  265. package/dist/Tooltip/useTooltip.js +39 -24
  266. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  267. package/dist/TopNav/TopNavHeading.js +5 -4
  268. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  269. package/dist/TopNav/TopNavMegaMenu.js +3 -3
  270. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  271. package/dist/TopNav/TopNavMenu.js +4 -3
  272. package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
  273. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  274. package/dist/Typeahead/BaseTypeahead.js +68 -29
  275. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  276. package/dist/Typeahead/Typeahead.js +3 -2
  277. package/dist/astryx.css +94 -7
  278. package/dist/hooks/index.d.ts +1 -0
  279. package/dist/hooks/index.d.ts.map +1 -1
  280. package/dist/hooks/index.js +1 -0
  281. package/dist/hooks/useFocusTrap.d.ts +7 -4
  282. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  283. package/dist/hooks/useFocusTrap.js +60 -95
  284. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  285. package/dist/hooks/useHotkeys.js +3 -18
  286. package/dist/hooks/useMergedRefs.d.ts +18 -0
  287. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  288. package/dist/hooks/useMergedRefs.js +25 -0
  289. package/dist/index.d.ts +1 -0
  290. package/dist/index.d.ts.map +1 -1
  291. package/dist/index.js +1 -0
  292. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  293. package/dist/theme/derivedVarRegistry.js +24 -4
  294. package/dist/theme/syntax/tokens.d.ts +1 -1
  295. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  296. package/dist/theme/syntax/tokens.js +5 -2
  297. package/dist/utils/groupItems.d.ts +5 -1
  298. package/dist/utils/groupItems.d.ts.map +1 -1
  299. package/dist/utils/groupItems.js +9 -9
  300. package/dist/utils/index.d.ts +1 -1
  301. package/dist/utils/index.d.ts.map +1 -1
  302. package/dist/utils/isApplePlatform.d.ts +18 -0
  303. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  304. package/dist/utils/isApplePlatform.js +37 -0
  305. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  306. package/dist/utils/sharedResizeObserver.js +10 -1
  307. package/dist/utils/timeParser.d.ts +1 -1
  308. package/dist/utils/timeParser.d.ts.map +1 -1
  309. package/dist/utils/timeParser.js +26 -12
  310. package/locales/en.json +31 -7
  311. package/locales/pseudo.json +18 -0
  312. package/package.json +8 -3
  313. package/src/AppShell/AppShell.tsx +3 -2
  314. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  315. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  316. package/src/AspectRatio/AspectRatio.tsx +40 -1
  317. package/src/Avatar/Avatar.doc.mjs +14 -3
  318. package/src/Avatar/Avatar.test.tsx +97 -0
  319. package/src/Avatar/Avatar.tsx +125 -52
  320. package/src/Avatar/index.ts +2 -2
  321. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  322. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  323. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  324. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  325. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  326. package/src/Banner/Banner.doc.mjs +13 -11
  327. package/src/Banner/Banner.test.tsx +102 -15
  328. package/src/Banner/Banner.tsx +72 -25
  329. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  330. package/src/BottomSheet/BottomSheet.tsx +17 -4
  331. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  332. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  333. package/src/Button/Button.doc.mjs +22 -0
  334. package/src/Button/Button.test.tsx +13 -0
  335. package/src/Button/Button.tsx +5 -4
  336. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  337. package/src/ButtonGroup/ButtonGroup.test.tsx +391 -1
  338. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  339. package/src/Calendar/Calendar.doc.mjs +4 -3
  340. package/src/Calendar/Calendar.test.tsx +52 -0
  341. package/src/Calendar/Calendar.tsx +18 -15
  342. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  343. package/src/Calendar/getInitialFocusDate.ts +93 -0
  344. package/src/Carousel/Carousel.tsx +3 -2
  345. package/src/Chat/ChatComposerInput.tsx +5 -1
  346. package/src/Chat/ChatLayout.tsx +3 -2
  347. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  348. package/src/Chat/ChatMessageList.test.tsx +46 -0
  349. package/src/Chat/ChatMessageList.tsx +28 -4
  350. package/src/Chat/ChatTokenizedText.tsx +17 -10
  351. package/src/Chat/useChatComposerTokens.ts +1 -1
  352. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  353. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  354. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  355. package/src/ClickableCard/ClickableCard.tsx +3 -2
  356. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  357. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  358. package/src/CodeBlock/CodeBlock.tsx +20 -4
  359. package/src/CodeBlock/highlightRanges.ts +1 -1
  360. package/src/CodeBlock/highlightStyles.ts +13 -13
  361. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  362. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  363. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  364. package/src/ContextMenu/ContextMenu.tsx +4 -3
  365. package/src/DateInput/DateInput.doc.mjs +16 -0
  366. package/src/DateInput/DateInput.tsx +55 -2
  367. package/src/DateInput/DateInputTouch.test.tsx +68 -9
  368. package/src/DateInput/NativeDateField.test.tsx +565 -0
  369. package/src/DateInput/NativeDateField.tsx +623 -0
  370. package/src/DateInput/TouchDateField.tsx +38 -4
  371. package/src/DateInput/index.ts +1 -0
  372. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  373. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  374. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  375. package/src/DateTimeInput/index.ts +1 -0
  376. package/src/Dialog/Dialog.doc.mjs +8 -3
  377. package/src/Dialog/Dialog.test.tsx +261 -1
  378. package/src/Dialog/Dialog.tsx +109 -58
  379. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  380. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  381. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  382. package/src/Field/Field.doc.mjs +13 -2
  383. package/src/Field/FieldLabel.test.tsx +29 -0
  384. package/src/Field/FieldLabel.tsx +7 -0
  385. package/src/FileInput/FileInput.tsx +3 -2
  386. package/src/Heading/Heading.test.tsx +23 -1
  387. package/src/Heading/Heading.tsx +6 -2
  388. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  389. package/src/HoverCard/HoverCard.test.tsx +101 -4
  390. package/src/HoverCard/HoverCard.tsx +71 -3
  391. package/src/HoverCard/useHoverCard.tsx +101 -33
  392. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  393. package/src/Indicator/Indicator.doc.mjs +2 -0
  394. package/src/Item/Item.tsx +5 -4
  395. package/src/Kbd/Kbd.tsx +2 -19
  396. package/src/Layer/LayerDepthContext.tsx +62 -0
  397. package/src/Layer/index.ts +9 -0
  398. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  399. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  400. package/src/Layer/layerStack.ts +362 -0
  401. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  402. package/src/Layer/useLayerDismissal.ts +173 -0
  403. package/src/Layout/Layout.doc.mjs +2 -2
  404. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  405. package/src/Lightbox/Lightbox.tsx +124 -102
  406. package/src/Link/Link.doc.mjs +39 -0
  407. package/src/Markdown/Markdown.doc.mjs +5 -0
  408. package/src/Markdown/incremental.test.ts +16 -2
  409. package/src/Markdown/index.ts +1 -0
  410. package/src/Markdown/parser.perf.test.ts +96 -1
  411. package/src/Markdown/parser.test.ts +145 -2
  412. package/src/Markdown/parser.ts +244 -29
  413. package/src/MobileNav/MobileNav.tsx +62 -36
  414. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  415. package/src/MultiSelector/MultiSelector.doc.mjs +27 -0
  416. package/src/MultiSelector/MultiSelector.test.tsx +106 -0
  417. package/src/MultiSelector/MultiSelector.tsx +50 -6
  418. package/src/MultiSelector/index.ts +1 -0
  419. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  420. package/src/NavIcon/NavIcon.test.tsx +9 -0
  421. package/src/NavIcon/NavIcon.tsx +5 -1
  422. package/src/NavMenu/NavHeadingMenu.tsx +3 -2
  423. package/src/NumberInput/NumberInput.doc.mjs +20 -0
  424. package/src/NumberInput/NumberInput.tsx +28 -29
  425. package/src/NumberInput/numberParser.test.ts +137 -0
  426. package/src/NumberInput/numberParser.ts +346 -0
  427. package/src/Outline/Outline.tsx +3 -2
  428. package/src/OverflowList/OverflowList.tsx +3 -2
  429. package/src/Overlay/Overlay.tsx +3 -2
  430. package/src/Popover/usePopover.tsx +31 -28
  431. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  432. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  433. package/src/PowerSearch/PowerSearch.tsx +34 -5
  434. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +201 -0
  435. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  436. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +47 -1
  437. package/src/PowerSearch/PowerSearchValueEditor.tsx +15 -0
  438. package/src/PowerSearch/types.ts +2 -0
  439. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  440. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  441. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  442. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  443. package/src/ProgressBar/ProgressBar.tsx +28 -8
  444. package/src/Resizable/ResizeHandle.tsx +3 -2
  445. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  446. package/src/SelectableCard/SelectableCard.tsx +3 -2
  447. package/src/Selector/Selector.doc.mjs +12 -1
  448. package/src/Selector/Selector.test.tsx +45 -1
  449. package/src/Selector/Selector.tsx +11 -1
  450. package/src/SideNav/SideNav.doc.mjs +6 -6
  451. package/src/SideNav/SideNav.tsx +4 -2
  452. package/src/SideNav/SideNavHeading.tsx +12 -12
  453. package/src/SideNav/SideNavItem.tsx +4 -2
  454. package/src/Slider/Slider.tsx +3 -2
  455. package/src/Spinner/Spinner.test.tsx +147 -1
  456. package/src/Spinner/Spinner.tsx +120 -101
  457. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  458. package/src/StatusDot/StatusDot.test.tsx +9 -0
  459. package/src/StatusDot/StatusDot.tsx +7 -1
  460. package/src/Stepper/Step.doc.mjs +98 -0
  461. package/src/Stepper/Step.tsx +1638 -0
  462. package/src/Stepper/StepStatus.ts +26 -0
  463. package/src/Stepper/Stepper.doc.mjs +370 -0
  464. package/src/Stepper/Stepper.test.tsx +1024 -0
  465. package/src/Stepper/Stepper.tsx +258 -0
  466. package/src/Stepper/StepperContext.ts +71 -0
  467. package/src/Stepper/index.ts +18 -0
  468. package/src/Stepper/stepper.stylex.ts +19 -0
  469. package/src/Switch/Switch.doc.mjs +2 -0
  470. package/src/Switch/Switch.test.tsx +10 -0
  471. package/src/Switch/Switch.tsx +6 -2
  472. package/src/TabList/Tab.doc.mjs +13 -1
  473. package/src/TabList/Tab.tsx +67 -7
  474. package/src/TabList/TabList.doc.mjs +22 -6
  475. package/src/TabList/TabList.test.tsx +559 -0
  476. package/src/TabList/TabList.tsx +490 -22
  477. package/src/TabList/TabListContext.ts +13 -2
  478. package/src/TabList/TabMenu.tsx +3 -2
  479. package/src/TabList/index.ts +6 -2
  480. package/src/Table/BaseTable.tsx +12 -4
  481. package/src/Table/Table.doc.mjs +9 -2
  482. package/src/Table/Table.test.tsx +132 -14
  483. package/src/Table/Table.tsx +3 -8
  484. package/src/Table/TableBody.doc.mjs +40 -0
  485. package/src/Table/TableFooter.doc.mjs +40 -0
  486. package/src/Table/TableHeader.doc.mjs +40 -0
  487. package/src/Table/TableRow.tsx +16 -5
  488. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  489. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  490. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
  491. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  492. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  493. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  494. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  495. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  496. package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
  497. package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
  498. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  499. package/src/Table/types.ts +22 -4
  500. package/src/Table/useBaseTablePlugins.ts +5 -0
  501. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  502. package/src/Table/useTablePagination.doc.mjs +7 -0
  503. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  504. package/src/Table/useTableSelection.doc.mjs +31 -0
  505. package/src/Text/Text.test.tsx +23 -1
  506. package/src/Text/Text.tsx +6 -2
  507. package/src/TextArea/TextArea.doc.mjs +8 -2
  508. package/src/TextArea/TextArea.test.tsx +11 -0
  509. package/src/TextArea/TextArea.tsx +15 -8
  510. package/src/TextInput/TextInput.doc.mjs +10 -0
  511. package/src/TextInput/TextInput.tsx +3 -2
  512. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  513. package/src/TimeInput/TimeInput.tsx +2 -2
  514. package/src/Timestamp/Timestamp.tsx +4 -2
  515. package/src/Toast/Toast.doc.mjs +6 -0
  516. package/src/Token/TokenLink.tsx +2 -2
  517. package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
  518. package/src/Tokenizer/Tokenizer.tsx +4 -0
  519. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  520. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  521. package/src/Tooltip/Tooltip.test.tsx +32 -0
  522. package/src/Tooltip/Tooltip.tsx +5 -0
  523. package/src/Tooltip/useTooltip.tsx +47 -24
  524. package/src/TopNav/TopNavHeading.tsx +5 -4
  525. package/src/TopNav/TopNavMegaMenu.tsx +3 -2
  526. package/src/TopNav/TopNavMenu.tsx +4 -3
  527. package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
  528. package/src/Typeahead/BaseTypeahead.tsx +85 -33
  529. package/src/Typeahead/Typeahead.doc.mjs +5 -0
  530. package/src/Typeahead/Typeahead.test.tsx +49 -0
  531. package/src/Typeahead/Typeahead.tsx +3 -2
  532. package/src/hooks/index.ts +2 -0
  533. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  534. package/src/hooks/useFocusTrap.test.tsx +14 -0
  535. package/src/hooks/useFocusTrap.ts +62 -111
  536. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  537. package/src/hooks/useHotkeys.ts +3 -18
  538. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  539. package/src/hooks/useMergedRefs.test.tsx +62 -0
  540. package/src/hooks/useMergedRefs.ts +36 -0
  541. package/src/index.ts +1 -0
  542. package/src/theme/MediaTheme.doc.mjs +5 -5
  543. package/src/theme/derivedVarRegistry.test.ts +19 -3
  544. package/src/theme/derivedVarRegistry.ts +23 -4
  545. package/src/theme/generateThemeRules.test.ts +37 -0
  546. package/src/theme/syntax/tokens.ts +5 -2
  547. package/src/utils/groupItems.ts +12 -6
  548. package/src/utils/index.ts +1 -1
  549. package/src/utils/isApplePlatform.test.ts +61 -0
  550. package/src/utils/isApplePlatform.ts +37 -0
  551. package/src/utils/sharedResizeObserver.ts +10 -2
  552. package/src/utils/timeParser.test.ts +6 -1
  553. package/src/utils/timeParser.ts +35 -13
  554. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -31,6 +31,7 @@ import {
31
31
  type LayerTouchTrigger,
32
32
  } from '../Layer/useTouchTrigger';
33
33
  import {layerAnimations} from '../Layer/layerAnimations.stylex';
34
+ import {useLayerDismissal} from '../Layer/useLayerDismissal';
34
35
  import {
35
36
  colorVars,
36
37
  shadowVars,
@@ -135,6 +136,11 @@ export interface HoverCardOptions {
135
136
  * - `true`: force-show the hover card (hover/focus hide is suppressed)
136
137
  * - `false`: force-hide the hover card
137
138
  * - `undefined`: uncontrolled — hover/focus triggers manage visibility
139
+ *
140
+ * A controlled hover card still takes Escape when it is the top-most layer,
141
+ * and answers by calling `onHide` without hiding itself — closing is your
142
+ * update's decision, exactly as for a controlled Dialog. Ignore the call and
143
+ * the card stays, and so does the press: nothing underneath dismisses.
138
144
  */
139
145
  isOpen?: boolean;
140
146
 
@@ -184,11 +190,22 @@ export interface HoverCardReturn {
184
190
  anchorId: string;
185
191
 
186
192
  /**
187
- * ID for aria-describedby on the trigger element.
188
- * Caller should compose with other IDs using mergeIds utility.
193
+ * Unique ID for the hover card container.
194
+ * Useful for `aria-controls` or `aria-owns` on the trigger.
195
+ */
196
+ id: string;
197
+
198
+ /**
199
+ * Deprecated alias of `id`. Kept for backwards compatibility; prefer `id`.
189
200
  */
190
201
  describedBy: string;
191
202
 
203
+ /**
204
+ * Whether the hover card is currently open.
205
+ * Useful for driving `aria-expanded` on the trigger.
206
+ */
207
+ isOpen: boolean;
208
+
192
209
  /**
193
210
  * Render function for hover card content.
194
211
  * Returns anchor-positioned popover element.
@@ -409,19 +426,71 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
409
426
  [layer.id, scheduleHide],
410
427
  );
411
428
 
412
- const handleKeyDown = useCallback(
413
- (e: KeyboardEvent) => {
414
- if (e.key === 'Escape') {
415
- // Stop propagation so parent components don't react to the same Escape
416
- e.stopPropagation();
417
- // Hide immediately without refocusing (we're already on trigger)
418
- clearTimeouts();
419
- touch.clearTapOpen();
420
- layer.hide();
429
+ // Escape dismissal (WCAG 1.4.13) goes through the shared layer stack: a
430
+ // visible card is the top-most layer, so it takes the press and consumes it.
431
+ //
432
+ // This replaces a keydown listener on the TRIGGER that called
433
+ // stopPropagation() on any Escape while the trigger merely had focus — open
434
+ // card or not — so focusing a HoverCard trigger inside a Dialog silently ate
435
+ // the press that should have closed the Dialog. Presence is now answered from
436
+ // the DOM, so a closed card never claims a press.
437
+ // A controlled hover card stays on the stack and takes the press like any
438
+ // other layer, but answers it by reporting instead of hiding: `isOpen` is
439
+ // the consumer's value, so only their update may change it. Same contract as
440
+ // a controlled Dialog.
441
+ useLayerDismissal({
442
+ // Registered for the hook's lifetime rather than gated on `layer.isOpen`:
443
+ // that state can lag a frame behind the DOM, so a press arriving right after
444
+ // the layer appears would find nothing registered. Because this layer
445
+ // CONSUMES the press, a stale registration would be worse than a missed one
446
+ // — it would silently eat Escapes meant for the dialog underneath — so
447
+ // presence is answered from the DOM at press time instead of from state.
448
+ isActive: true,
449
+ isPresent: () => {
450
+ const el =
451
+ typeof document === 'undefined'
452
+ ? null
453
+ : document.getElementById(layer.id);
454
+ if (el == null) {
455
+ return false;
456
+ }
457
+ try {
458
+ return el.matches(':popover-open');
459
+ } catch {
460
+ // Browsers without the Popover API (and some test environments) cannot
461
+ // answer the selector; fall back to the hook's own state.
462
+ return layer.isOpen;
421
463
  }
422
464
  },
423
- [touch, clearTimeouts, layer],
424
- );
465
+ onDismiss: () => {
466
+ clearTimeouts();
467
+ touch.clearTapOpen();
468
+ // Controlled: report and stop. The close — and the focus restore that
469
+ // goes with it — happens in the controlled effect if and when the
470
+ // consumer flips `isOpen`.
471
+ if (isOpen !== undefined) {
472
+ onHide?.();
473
+ return;
474
+ }
475
+ // Only when the card itself held focus, which is the one case the
476
+ // content-level handler this replaced could run in. Refocusing
477
+ // unconditionally would drag the caret out of a field the user was
478
+ // typing in while a hover card happened to be up; arming the re-show
479
+ // guard unconditionally would swallow their next focus on the trigger,
480
+ // because a focus() on the already-focused trigger fires no focusin to
481
+ // clear it.
482
+ const card =
483
+ typeof document === 'undefined'
484
+ ? null
485
+ : document.getElementById(layer.id);
486
+ const hadFocus = card?.contains(document.activeElement) ?? false;
487
+ layer.hide();
488
+ if (hadFocus) {
489
+ isEscapeDismissingRef.current = true;
490
+ triggerRef.current?.focus();
491
+ }
492
+ },
493
+ });
425
494
 
426
495
  // Interaction ref that handles event listeners only
427
496
  const {handlePointerEnter} = touch;
@@ -436,7 +505,6 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
436
505
  'focusout',
437
506
  handleFocusOut as EventListener,
438
507
  );
439
- triggerRef.current.removeEventListener('keydown', handleKeyDown);
440
508
  triggerRef.current.removeEventListener(
441
509
  'pointerenter',
442
510
  handlePointerEnter,
@@ -465,9 +533,6 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
465
533
  el.addEventListener('focusin', handleFocusIn);
466
534
  el.addEventListener('focusout', handleFocusOut as EventListener);
467
535
  }
468
-
469
- // Attach keydown for Escape handling
470
- el.addEventListener('keydown', handleKeyDown);
471
536
  }
472
537
 
473
538
  triggerRef.current = el;
@@ -478,7 +543,6 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
478
543
  handleMouseLeave,
479
544
  handleFocusIn,
480
545
  handleFocusOut,
481
- handleKeyDown,
482
546
  handlePointerEnter,
483
547
  handlePointerDown,
484
548
  ],
@@ -518,7 +582,19 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
518
582
  layer.show();
519
583
  } else {
520
584
  clearTimeouts();
585
+ // A consumer closing the card while it holds focus would strand focus on
586
+ // <body>. Arming the re-show guard is what keeps the refocus from
587
+ // reopening the card through `handleFocusIn`, which shows on any focusin.
588
+ const card =
589
+ typeof document === 'undefined'
590
+ ? null
591
+ : document.getElementById(layer.id);
592
+ const hadFocus = card?.contains(document.activeElement) ?? false;
521
593
  layer.hide();
594
+ if (hadFocus) {
595
+ isEscapeDismissingRef.current = true;
596
+ triggerRef.current?.focus();
597
+ }
522
598
  }
523
599
  }, [isOpen, clearTimeouts, layer]);
524
600
 
@@ -529,7 +605,11 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
529
605
  props?: Omit<ContextRenderProps, 'positioning'>,
530
606
  ): ReactNode => {
531
607
  const renderPlacement = props?.placement ?? placement;
532
- const themeClassName = themeProps('hovercard').className;
608
+ const themeClassName = themeProps('hover-card', undefined, {
609
+ // `hovercard` ran the compound name together; themes styling it keep
610
+ // working until the next major.
611
+ legacyNames: ['hovercard'],
612
+ }).className;
533
613
  const renderProps = {
534
614
  placement: renderPlacement,
535
615
  alignment: props?.alignment ?? alignment,
@@ -576,20 +656,6 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
576
656
  isHoveringContentRef.current = false;
577
657
  scheduleHide();
578
658
  }}
579
- onKeyDown={e => {
580
- if (e.key === 'Escape') {
581
- // Stop propagation so parent components don't react to the same Escape
582
- e.stopPropagation();
583
- // Set flag to prevent re-show when we refocus trigger
584
- isEscapeDismissingRef.current = true;
585
- // Hide immediately
586
- clearTimeouts();
587
- touch.clearTapOpen();
588
- layer.hide();
589
- // Refocus the trigger
590
- triggerRef.current?.focus();
591
- }
592
- }}
593
659
  onBlur={e => {
594
660
  // Check if focus is moving back to the trigger or staying within content
595
661
  const relatedTarget = e.relatedTarget as HTMLElement | null;
@@ -630,7 +696,9 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
630
696
  positionRef: layer.ref,
631
697
  interactionRef,
632
698
  anchorId: layer.anchorId,
699
+ id: layer.id,
633
700
  describedBy: layer.id,
701
+ isOpen: layer.isOpen,
634
702
  renderHoverCard,
635
703
  show: layer.show,
636
704
  hide: layer.hide,
@@ -227,10 +227,13 @@ export function CheckboxIndicator({
227
227
  <>
228
228
  <svg
229
229
  viewBox="0 0 10 10"
230
- {...stylex.props(
231
- styles.checkmark,
232
- checkmarkSizeStyles[size],
233
- isChecked && styles.checkmarkVisible,
230
+ {...mergeProps(
231
+ themeProps('checkbox-indicator-check', {size}),
232
+ stylex.props(
233
+ styles.checkmark,
234
+ checkmarkSizeStyles[size],
235
+ isChecked && styles.checkmarkVisible,
236
+ ),
234
237
  )}>
235
238
  <path
236
239
  d="M8.5 2.5L4 7.5L1.5 5"
@@ -242,10 +245,13 @@ export function CheckboxIndicator({
242
245
  />
243
246
  </svg>
244
247
  <span
245
- {...stylex.props(
246
- styles.indeterminateMark,
247
- indeterminateSizeStyles[size],
248
- isIndeterminate && styles.indeterminateMarkVisible,
248
+ {...mergeProps(
249
+ themeProps('checkbox-indicator-dash', {size}),
250
+ stylex.props(
251
+ styles.indeterminateMark,
252
+ indeterminateSizeStyles[size],
253
+ isIndeterminate && styles.indeterminateMarkVisible,
254
+ ),
249
255
  )}
250
256
  />
251
257
  </>
@@ -132,6 +132,8 @@ export const docs = {
132
132
  visualProps: ['size'],
133
133
  states: ['checked', 'disabled'],
134
134
  },
135
+ {className: 'astryx-checkbox-indicator-check', visualProps: ['size']},
136
+ {className: 'astryx-checkbox-indicator-dash', visualProps: ['size']},
135
137
  {
136
138
  className: 'astryx-radio-indicator',
137
139
  visualProps: ['size'],
package/src/Item/Item.tsx CHANGED
@@ -27,7 +27,8 @@ import {
27
27
  typeScaleVars,
28
28
  } from '../theme/tokens.stylex';
29
29
  import type {BaseProps} from '../BaseProps';
30
- import {mergeProps, mergeRefs} from '../utils';
30
+ import {mergeProps} from '../utils';
31
+ import {useMergedRefs} from '../hooks/useMergedRefs';
31
32
  import {computeTargetAndRel} from '../Link/computeTargetAndRel';
32
33
  import {useLinkComponent} from '../Link/useLinkComponent';
33
34
  import {useClickableContainer} from '../hooks/useClickableContainer';
@@ -579,11 +580,11 @@ export function Item({
579
580
  </>
580
581
  );
581
582
 
583
+ const mergedRef = useMergedRefs(ref, containerRef);
584
+
582
585
  return (
583
586
  <Component
584
- ref={
585
- (isDelegate ? mergeRefs(ref, containerRef) : ref) as React.Ref<never>
586
- }
587
+ ref={(isDelegate ? mergedRef : ref) as React.Ref<never>}
587
588
  {...restProps}
588
589
  aria-selected={(allowsAriaSelected && isSelected) || undefined}
589
590
  // aria-selected is invalid on roles that don't permit it (listitem, a
package/src/Kbd/Kbd.tsx CHANGED
@@ -16,6 +16,7 @@
16
16
  import React, {useSyncExternalStore} from 'react';
17
17
  import * as stylex from '@stylexjs/stylex';
18
18
  import {mergeProps} from '../utils';
19
+ import {isApplePlatform} from '../utils/isApplePlatform';
19
20
  import type {BaseProps} from '../BaseProps';
20
21
  import {themeProps} from '../utils/themeProps';
21
22
  import {
@@ -122,24 +123,6 @@ function getServerPlatformSnapshot(): boolean {
122
123
  return false;
123
124
  }
124
125
 
125
- /**
126
- * Detects whether the current platform is macOS/iOS.
127
- * Prefers the User-Agent Client Hints API when available (modern Chrome/Edge),
128
- * falls back to navigator.platform (deprecated but universally supported).
129
- */
130
- function detectMac(): boolean {
131
- if (typeof navigator === 'undefined') {
132
- return false;
133
- }
134
- // Prefer User-Agent Client Hints API (not deprecated)
135
- const uaData = 'userAgentData' in navigator ? navigator.userAgentData : null;
136
- if (uaData && typeof uaData === 'object' && 'platform' in uaData) {
137
- return /mac/i.test((uaData as {platform: string}).platform ?? '');
138
- }
139
- // Fallback: navigator.platform (deprecated but still shipped everywhere)
140
- return /Mac|iPhone|iPad|iPod/.test(navigator.platform ?? '');
141
- }
142
-
143
126
  export interface KbdProps extends BaseProps<HTMLSpanElement> {
144
127
  ref?: React.Ref<HTMLSpanElement>;
145
128
  /**
@@ -176,7 +159,7 @@ export interface KbdProps extends BaseProps<HTMLSpanElement> {
176
159
  export function Kbd({keys, ref, xstyle, className, style, ...rest}: KbdProps) {
177
160
  const isMac = useSyncExternalStore(
178
161
  subscribeToPlatformChanges,
179
- detectMac,
162
+ isApplePlatform,
180
163
  getServerPlatformSnapshot,
181
164
  );
182
165
 
@@ -0,0 +1,62 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file LayerDepthContext.tsx
7
+ * @input React context
8
+ * @output Exports LayerDepthContext, useLayerDepth, LayerDepthProvider
9
+ * @position Layer system; how the dismissal stack learns which layer is nested
10
+ * inside which.
11
+ *
12
+ * SYNC: When modified, update:
13
+ * - /packages/core/src/Layer/index.ts
14
+ * - /packages/core/src/Layer/useLayerDismissal.ts
15
+ *
16
+ * Nesting is read from the React tree rather than the DOM. Two reasons:
17
+ *
18
+ * - **Portals.** A nested overlay routinely renders into `document.body` or the
19
+ * native top layer, so DOM containment reports it as a sibling of the layer
20
+ * it is logically inside. React context flows through `createPortal`, so the
21
+ * tree keeps the relationship the DOM loses.
22
+ * - **Same-commit mounts.** Depth is fixed during render. Effect order is not
23
+ * available then and is misleading anyway: React runs child effects before
24
+ * parent effects, so an inner layer registers first and looks "older" than
25
+ * the outer layer that contains it.
26
+ *
27
+ * There is nothing to mount at the app root: the context defaults to 0, and
28
+ * each layer provides depth for its OWN content, so nesting composes on its own.
29
+ */
30
+
31
+ import {createContext, use, type ReactNode} from 'react';
32
+
33
+ /**
34
+ * How many layers deep the current subtree is. 0 at the app root; each layer
35
+ * increments it for its own content.
36
+ */
37
+ export const LayerDepthContext = createContext(0);
38
+ LayerDepthContext.displayName = 'LayerDepthContext';
39
+
40
+ /**
41
+ * Read the current nesting depth. A layer calls this to learn its OWN depth —
42
+ * the depth of the subtree it is rendered into, before it pushes its content
43
+ * one level deeper.
44
+ */
45
+ export function useLayerDepth(): number {
46
+ return use(LayerDepthContext);
47
+ }
48
+
49
+ /**
50
+ * Wrap a layer's content so any layer opened from inside it registers as
51
+ * nested. Takes no depth prop on purpose: it reads the ambient depth and adds
52
+ * one, so nesting composes without anyone tracking absolute numbers.
53
+ *
54
+ * Renders no DOM element — it is a context boundary only, which is why it takes
55
+ * no `xstyle`/`ref` and exposes no props interface.
56
+ */
57
+ export function LayerDepthProvider({children}: {children: ReactNode}) {
58
+ const depth = use(LayerDepthContext);
59
+ return <LayerDepthContext value={depth + 1}>{children}</LayerDepthContext>;
60
+ }
61
+
62
+ LayerDepthProvider.displayName = 'LayerDepthProvider';
@@ -29,6 +29,15 @@ export type {
29
29
  FixedLayerReturn,
30
30
  } from './useLayer';
31
31
 
32
+ // Layer dismissal stack — one Escape owner for every overlay family
33
+ export {useLayerDismissal} from './useLayerDismissal';
34
+ export type {
35
+ LayerEscapeBehavior,
36
+ UseLayerDismissalOptions,
37
+ UseLayerDismissalReturn,
38
+ } from './useLayerDismissal';
39
+ export {LayerDepthProvider} from './LayerDepthContext';
40
+
32
41
  // Shared touch behavior for the hover layers
33
42
  export {useTouchTrigger, isActionTrigger} from './useTouchTrigger';
34
43
  export type {