@astryxdesign/core 0.3.0 → 0.4.0-canary.058f476

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 (664) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +10 -2
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +22 -3
  5. package/dist/AppShell/AppShell.d.ts +2 -2
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +40 -9
  8. package/dist/AspectRatio/AspectRatio.d.ts +13 -0
  9. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js +10 -2
  11. package/dist/AspectRatio/index.d.ts.map +1 -1
  12. package/dist/AspectRatio/index.js +1 -2
  13. package/dist/Avatar/Avatar.d.ts.map +1 -1
  14. package/dist/Avatar/Avatar.js +33 -20
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
  17. package/dist/Badge/Badge.d.ts.map +1 -1
  18. package/dist/Badge/Badge.js +1 -2
  19. package/dist/Badge/index.d.ts.map +1 -1
  20. package/dist/Badge/index.js +1 -2
  21. package/dist/Banner/Banner.d.ts +3 -0
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +32 -17
  24. package/dist/Blockquote/Blockquote.d.ts.map +1 -1
  25. package/dist/Blockquote/Blockquote.js +1 -2
  26. package/dist/Blockquote/index.d.ts.map +1 -1
  27. package/dist/Blockquote/index.js +1 -2
  28. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  29. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  30. package/dist/Breadcrumbs/index.d.ts +2 -1
  31. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  32. package/dist/Breadcrumbs/index.js +1 -0
  33. package/dist/Button/Button.d.ts.map +1 -1
  34. package/dist/Button/Button.js +12 -16
  35. package/dist/Calendar/Calendar.d.ts.map +1 -1
  36. package/dist/Calendar/Calendar.js +2 -1
  37. package/dist/Calendar/styles.d.ts +0 -2
  38. package/dist/Calendar/styles.d.ts.map +1 -1
  39. package/dist/Calendar/styles.js +0 -2
  40. package/dist/Card/Card.d.ts.map +1 -1
  41. package/dist/Card/Card.js +1 -2
  42. package/dist/Card/index.d.ts.map +1 -1
  43. package/dist/Card/index.js +1 -2
  44. package/dist/Carousel/Carousel.d.ts.map +1 -1
  45. package/dist/Carousel/Carousel.js +8 -12
  46. package/dist/Center/Center.d.ts.map +1 -1
  47. package/dist/Center/Center.js +1 -2
  48. package/dist/Center/index.d.ts.map +1 -1
  49. package/dist/Center/index.js +1 -2
  50. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  51. package/dist/Chat/ChatDictationButton.js +2 -1
  52. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  53. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  54. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  55. package/dist/Chat/ChatSendButton.js +4 -3
  56. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  57. package/dist/Chat/ChatToolCalls.js +17 -17
  58. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  59. package/dist/Chat/useTriggerMenu.js +2 -6
  60. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  61. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  62. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  63. package/dist/ClickableCard/ClickableCard.js +3 -11
  64. package/dist/Code/Code.d.ts.map +1 -1
  65. package/dist/Code/Code.js +1 -2
  66. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  67. package/dist/CodeBlock/CodeBlock.js +84 -67
  68. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  69. package/dist/Collapsible/Collapsible.js +35 -15
  70. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  71. package/dist/CommandPalette/CommandPalette.js +5 -0
  72. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  73. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  75. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  76. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +32 -31
  79. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  80. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  81. package/dist/ContextMenu/ContextMenu.js +1 -1
  82. package/dist/ContextMenu/index.d.ts +2 -1
  83. package/dist/ContextMenu/index.d.ts.map +1 -1
  84. package/dist/ContextMenu/index.js +1 -0
  85. package/dist/DateInput/DateInput.d.ts +9 -2
  86. package/dist/DateInput/DateInput.d.ts.map +1 -1
  87. package/dist/DateInput/DateInput.js +47 -33
  88. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  89. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  90. package/dist/DateRangeInput/DateRangeInput.js +55 -32
  91. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  92. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  93. package/dist/DateTimeInput/DateTimeInput.js +54 -30
  94. package/dist/Dialog/Dialog.d.ts.map +1 -1
  95. package/dist/Dialog/Dialog.js +4 -4
  96. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  97. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  98. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  99. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  100. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  101. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  102. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  103. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  104. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  105. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  106. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  108. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
  109. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  110. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
  111. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  112. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  113. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  114. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  115. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  116. package/dist/DropdownMenu/index.d.ts +2 -1
  117. package/dist/DropdownMenu/index.d.ts.map +1 -1
  118. package/dist/DropdownMenu/index.js +4 -0
  119. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  120. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  121. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  122. package/dist/EmptyState/EmptyState.js +9 -5
  123. package/dist/Field/InputClearButton.d.ts +16 -3
  124. package/dist/Field/InputClearButton.d.ts.map +1 -1
  125. package/dist/Field/InputClearButton.js +15 -4
  126. package/dist/Field/PanelSearchInput.d.ts +81 -0
  127. package/dist/Field/PanelSearchInput.d.ts.map +1 -0
  128. package/dist/Field/PanelSearchInput.js +151 -0
  129. package/dist/FileInput/FileInput.d.ts.map +1 -1
  130. package/dist/FileInput/FileInput.js +21 -10
  131. package/dist/Grid/Grid.d.ts.map +1 -1
  132. package/dist/Grid/Grid.js +1 -2
  133. package/dist/Grid/index.d.ts.map +1 -1
  134. package/dist/Grid/index.js +1 -2
  135. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  136. package/dist/HoverCard/useHoverCard.js +3 -19
  137. package/dist/Icon/globalIconRegistry.d.ts +5 -4
  138. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  139. package/dist/Icon/globalIconRegistry.js +5 -4
  140. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  141. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  142. package/dist/Indicator/CheckIndicator.js +155 -0
  143. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  144. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  145. package/dist/Indicator/CheckboxIndicator.js +173 -0
  146. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  147. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  148. package/dist/Indicator/RadioIndicator.js +137 -0
  149. package/dist/Indicator/index.d.ts +24 -0
  150. package/dist/Indicator/index.d.ts.map +1 -0
  151. package/dist/Indicator/index.js +26 -0
  152. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  153. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  154. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  155. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  156. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  157. package/dist/Indicator/indicatorRegistry.js +93 -0
  158. package/dist/Indicator/types.d.ts +177 -0
  159. package/dist/Indicator/types.d.ts.map +1 -0
  160. package/dist/Indicator/types.js +1 -0
  161. package/dist/Indicator/useIndicator.d.ts +18 -0
  162. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  163. package/dist/Indicator/useIndicator.js +30 -0
  164. package/dist/Item/Item.d.ts.map +1 -1
  165. package/dist/Item/Item.js +4 -8
  166. package/dist/Layer/useLayer.d.ts +14 -0
  167. package/dist/Layer/useLayer.d.ts.map +1 -1
  168. package/dist/Layer/useLayer.js +25 -2
  169. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  170. package/dist/Lightbox/Lightbox.js +80 -103
  171. package/dist/Link/Link.d.ts.map +1 -1
  172. package/dist/Link/Link.js +4 -5
  173. package/dist/MobileNav/MobileNav.js +8 -8
  174. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  175. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  176. package/dist/MoreMenu/MoreMenu.js +4 -0
  177. package/dist/MultiSelector/MultiSelector.d.ts +8 -1
  178. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  179. package/dist/MultiSelector/MultiSelector.js +205 -170
  180. package/dist/NumberInput/NumberInput.d.ts +27 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +230 -42
  183. package/dist/Outline/Outline.d.ts.map +1 -1
  184. package/dist/Outline/Outline.js +2 -3
  185. package/dist/Pagination/Pagination.d.ts.map +1 -1
  186. package/dist/Pagination/Pagination.js +61 -63
  187. package/dist/Popover/Popover.d.ts.map +1 -1
  188. package/dist/Popover/Popover.js +6 -8
  189. package/dist/Popover/usePopover.d.ts +15 -0
  190. package/dist/Popover/usePopover.d.ts.map +1 -1
  191. package/dist/Popover/usePopover.js +14 -2
  192. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  193. package/dist/PowerSearch/PowerSearch.js +1 -1
  194. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  195. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  196. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  197. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  198. package/dist/ProgressBar/ProgressBar.js +95 -6
  199. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  200. package/dist/RadioList/RadioListItem.js +29 -84
  201. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  202. package/dist/Resizable/ResizeHandle.js +2 -3
  203. package/dist/Section/Section.d.ts.map +1 -1
  204. package/dist/Section/Section.js +1 -2
  205. package/dist/Section/index.d.ts.map +1 -1
  206. package/dist/Section/index.js +1 -2
  207. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  208. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  209. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  210. package/dist/SelectableCard/SelectableCard.js +3 -11
  211. package/dist/Selector/Selector.d.ts +12 -1
  212. package/dist/Selector/Selector.d.ts.map +1 -1
  213. package/dist/Selector/Selector.js +293 -183
  214. package/dist/Selector/hooks.d.ts +18 -6
  215. package/dist/Selector/hooks.d.ts.map +1 -1
  216. package/dist/Selector/hooks.js +57 -40
  217. package/dist/SideNav/SideNav.d.ts.map +1 -1
  218. package/dist/SideNav/SideNav.js +1 -1
  219. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  220. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  221. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  222. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  223. package/dist/SideNav/SideNavHeading.js +56 -20
  224. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  225. package/dist/SideNav/SideNavItem.js +28 -22
  226. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  227. package/dist/Skeleton/Skeleton.js +1 -2
  228. package/dist/Skeleton/index.d.ts.map +1 -1
  229. package/dist/Skeleton/index.js +1 -2
  230. package/dist/Slider/Slider.d.ts.map +1 -1
  231. package/dist/Slider/Slider.js +2 -6
  232. package/dist/Stack/stack.stylex.d.ts +3 -3
  233. package/dist/Switch/Switch.d.ts.map +1 -1
  234. package/dist/Switch/Switch.js +14 -13
  235. package/dist/TabList/Tab.d.ts.map +1 -1
  236. package/dist/TabList/Tab.js +2 -3
  237. package/dist/TabList/TabMenu.d.ts.map +1 -1
  238. package/dist/TabList/TabMenu.js +41 -19
  239. package/dist/Table/BaseTable.d.ts.map +1 -1
  240. package/dist/Table/BaseTable.js +8 -0
  241. package/dist/Table/TableRow.d.ts +1 -1
  242. package/dist/Table/TableRow.d.ts.map +1 -1
  243. package/dist/Table/TableRow.js +4 -2
  244. package/dist/Table/index.d.ts +1 -1
  245. package/dist/Table/index.d.ts.map +1 -1
  246. package/dist/Table/index.js +1 -1
  247. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  248. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  249. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  250. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  251. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  252. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  255. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  256. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  257. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  258. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  259. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  260. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  261. package/dist/Table/tableContextMenu.js +2 -1
  262. package/dist/Table/types.d.ts +11 -0
  263. package/dist/Table/types.d.ts.map +1 -1
  264. package/dist/TextArea/TextArea.d.ts +10 -1
  265. package/dist/TextArea/TextArea.d.ts.map +1 -1
  266. package/dist/TextArea/TextArea.js +16 -6
  267. package/dist/TextInput/TextInput.d.ts +10 -1
  268. package/dist/TextInput/TextInput.d.ts.map +1 -1
  269. package/dist/TextInput/TextInput.js +13 -19
  270. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  271. package/dist/Thumbnail/Thumbnail.js +32 -26
  272. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  273. package/dist/TimeInput/TimeInput.js +14 -17
  274. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  275. package/dist/Timestamp/Timestamp.js +14 -3
  276. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  277. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  278. package/dist/Timestamp/formatInstant.d.ts +11 -1
  279. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  280. package/dist/Timestamp/formatInstant.js +3 -1
  281. package/dist/Token/Token.d.ts.map +1 -1
  282. package/dist/Token/Token.js +20 -11
  283. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  284. package/dist/Tokenizer/Tokenizer.js +4 -2
  285. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  286. package/dist/Tooltip/useTooltip.js +3 -19
  287. package/dist/TopNav/TopNav.d.ts.map +1 -1
  288. package/dist/TopNav/TopNav.js +6 -5
  289. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  290. package/dist/TopNav/TopNavHeading.js +54 -16
  291. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  292. package/dist/TopNav/TopNavItem.js +3 -9
  293. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  294. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  295. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  296. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  297. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  298. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  299. package/dist/TopNav/TopNavMenu.js +83 -38
  300. package/dist/TreeList/TreeList.d.ts.map +1 -1
  301. package/dist/TreeList/TreeList.js +13 -0
  302. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  303. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  304. package/dist/TreeList/TreeListBranches.js +14 -4
  305. package/dist/TreeList/TreeListItem.d.ts +11 -1
  306. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  307. package/dist/TreeList/TreeListItem.js +57 -30
  308. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  309. package/dist/Typeahead/BaseTypeahead.js +16 -8
  310. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  311. package/dist/VisuallyHidden/VisuallyHidden.js +1 -2
  312. package/dist/VisuallyHidden/index.d.ts.map +1 -1
  313. package/dist/VisuallyHidden/index.js +1 -2
  314. package/dist/astryx.css +86 -96
  315. package/dist/astryx.umd.js +56 -56
  316. package/dist/astryx.umd.js.map +4 -4
  317. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  318. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  319. package/dist/hooks/containerReveal.stylex.js +63 -0
  320. package/dist/hooks/index.d.ts +3 -0
  321. package/dist/hooks/index.d.ts.map +1 -1
  322. package/dist/hooks/index.js +2 -0
  323. package/dist/hooks/useClipboard.d.ts +59 -0
  324. package/dist/hooks/useClipboard.d.ts.map +1 -0
  325. package/dist/hooks/useClipboard.js +106 -0
  326. package/dist/hooks/useContainerReveal.d.ts +14 -8
  327. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  328. package/dist/hooks/useContainerReveal.js +28 -69
  329. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  330. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  331. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  332. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  333. package/dist/hooks/useInputStatusIcon.js +17 -4
  334. package/dist/hooks/useLongPress.d.ts.map +1 -1
  335. package/dist/hooks/useLongPress.js +12 -2
  336. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  337. package/dist/hooks/useScrollLock.js +33 -18
  338. package/dist/hooks/useStreamingText.d.ts +18 -3
  339. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  340. package/dist/hooks/useStreamingText.js +47 -7
  341. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  342. package/dist/hooks/useTreeFocus.js +9 -3
  343. package/dist/hooks/useTypeahead.d.ts +3 -2
  344. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  345. package/dist/hooks/useTypeahead.js +19 -7
  346. package/dist/index.d.ts +1 -0
  347. package/dist/index.d.ts.map +1 -1
  348. package/dist/index.js +1 -0
  349. package/dist/theme/defineTheme.d.ts +18 -2
  350. package/dist/theme/defineTheme.d.ts.map +1 -1
  351. package/dist/theme/defineTheme.js +10 -1
  352. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  353. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  354. package/dist/theme/derivedVarRegistry.js +14 -13
  355. package/dist/theme/expandColorScale.d.ts +3 -1
  356. package/dist/theme/expandColorScale.d.ts.map +1 -1
  357. package/dist/theme/expandColorScale.js +17 -7
  358. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  359. package/dist/theme/expandTypeScale.js +17 -0
  360. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  361. package/dist/theme/generateThemeRules.js +11 -0
  362. package/dist/theme/index.d.ts +2 -1
  363. package/dist/theme/index.d.ts.map +1 -1
  364. package/dist/theme/index.js +1 -1
  365. package/dist/theme/tokens.stylex.d.ts +12 -0
  366. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  367. package/dist/theme/tokens.stylex.js +23 -0
  368. package/dist/utils/focusOutline.stylex.d.ts +122 -0
  369. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  370. package/dist/utils/focusOutline.stylex.js +143 -0
  371. package/dist/utils/focusReturn.d.ts +24 -0
  372. package/dist/utils/focusReturn.d.ts.map +1 -0
  373. package/dist/utils/focusReturn.js +29 -0
  374. package/dist/utils/index.d.ts +2 -0
  375. package/dist/utils/index.d.ts.map +1 -1
  376. package/dist/utils/index.js +6 -1
  377. package/dist/utils/interactionModality.d.ts +34 -0
  378. package/dist/utils/interactionModality.d.ts.map +1 -0
  379. package/dist/utils/interactionModality.js +70 -0
  380. package/dist/utils/mergeRefs.d.ts.map +1 -1
  381. package/dist/utils/mergeRefs.js +7 -5
  382. package/dist/utils/rtlStyles.d.ts +2 -2
  383. package/dist/utils/rtlStyles.js +2 -2
  384. package/dist/utils/themeProps.d.ts +20 -1
  385. package/dist/utils/themeProps.d.ts.map +1 -1
  386. package/dist/utils/themeProps.js +8 -2
  387. package/locales/en.json +52 -0
  388. package/locales/pseudo.json +39 -0
  389. package/package.json +8 -3
  390. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  391. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  392. package/src/AlertDialog/AlertDialog.tsx +21 -3
  393. package/src/AppShell/AppShell.doc.mjs +14 -0
  394. package/src/AppShell/AppShell.test.tsx +139 -0
  395. package/src/AppShell/AppShell.tsx +32 -22
  396. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  397. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  398. package/src/AspectRatio/AspectRatio.tsx +13 -2
  399. package/src/AspectRatio/index.ts +0 -2
  400. package/src/Avatar/Avatar.doc.mjs +2 -13
  401. package/src/Avatar/Avatar.test.tsx +33 -8
  402. package/src/Avatar/Avatar.tsx +52 -50
  403. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  404. package/src/Badge/Badge.tsx +0 -2
  405. package/src/Badge/index.ts +0 -2
  406. package/src/Banner/Banner.test.tsx +58 -1
  407. package/src/Banner/Banner.tsx +33 -11
  408. package/src/Blockquote/Blockquote.tsx +0 -2
  409. package/src/Blockquote/index.ts +0 -2
  410. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  411. package/src/Breadcrumbs/index.ts +5 -1
  412. package/src/Button/Button.doc.mjs +2 -2
  413. package/src/Button/Button.tsx +22 -41
  414. package/src/Calendar/Calendar.tsx +2 -1
  415. package/src/Calendar/styles.ts +0 -8
  416. package/src/Card/Card.tsx +0 -2
  417. package/src/Card/index.ts +0 -2
  418. package/src/Carousel/Carousel.doc.mjs +3 -0
  419. package/src/Carousel/Carousel.tsx +10 -6
  420. package/src/Center/Center.tsx +0 -2
  421. package/src/Center/index.ts +0 -2
  422. package/src/Chat/Chat.doc.mjs +2 -0
  423. package/src/Chat/ChatDictationButton.tsx +7 -1
  424. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  425. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  426. package/src/Chat/ChatSendButton.tsx +2 -3
  427. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  428. package/src/Chat/ChatToolCalls.tsx +36 -16
  429. package/src/Chat/useTriggerMenu.tsx +2 -5
  430. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  431. package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
  432. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  433. package/src/ClickableCard/ClickableCard.tsx +6 -11
  434. package/src/Code/Code.tsx +0 -2
  435. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  436. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  437. package/src/CodeBlock/CodeBlock.tsx +57 -80
  438. package/src/Collapsible/Collapsible.tsx +22 -18
  439. package/src/CommandPalette/CommandPalette.test.tsx +83 -0
  440. package/src/CommandPalette/CommandPalette.tsx +5 -0
  441. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  442. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  443. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  444. package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
  445. package/src/ComplexSelector/ComplexSelector.tsx +41 -28
  446. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  447. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  448. package/src/ContextMenu/ContextMenu.tsx +3 -3
  449. package/src/ContextMenu/index.ts +5 -1
  450. package/src/DateInput/DateInput.doc.mjs +18 -3
  451. package/src/DateInput/DateInput.test.tsx +112 -11
  452. package/src/DateInput/DateInput.tsx +44 -25
  453. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  454. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  455. package/src/DateRangeInput/DateRangeInput.tsx +27 -21
  456. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  457. package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
  458. package/src/DateTimeInput/DateTimeInput.tsx +58 -17
  459. package/src/Dialog/Dialog.tsx +2 -9
  460. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  461. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  462. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  463. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  464. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  465. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  466. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  467. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  468. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
  469. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  470. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  471. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  472. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  473. package/src/DropdownMenu/index.ts +8 -1
  474. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  475. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  476. package/src/EmptyState/EmptyState.test.tsx +62 -0
  477. package/src/EmptyState/EmptyState.tsx +16 -6
  478. package/src/Field/Field.doc.mjs +1 -0
  479. package/src/Field/InputClearButton.test.tsx +117 -0
  480. package/src/Field/InputClearButton.tsx +30 -3
  481. package/src/Field/PanelSearchInput.tsx +271 -0
  482. package/src/FileInput/FileInput.tsx +21 -8
  483. package/src/Grid/Grid.tsx +0 -2
  484. package/src/Grid/index.ts +0 -2
  485. package/src/HoverCard/useHoverCard.tsx +2 -23
  486. package/src/Icon/Icon.doc.mjs +2 -1
  487. package/src/Icon/globalIconRegistry.tsx +5 -4
  488. package/src/Indicator/CheckIndicator.tsx +174 -0
  489. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  490. package/src/Indicator/Indicator.doc.mjs +344 -0
  491. package/src/Indicator/Indicator.test.tsx +393 -0
  492. package/src/Indicator/RadioIndicator.tsx +206 -0
  493. package/src/Indicator/index.ts +46 -0
  494. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  495. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  496. package/src/Indicator/indicatorRegistry.ts +120 -0
  497. package/src/Indicator/types.ts +197 -0
  498. package/src/Indicator/useIndicator.ts +39 -0
  499. package/src/Item/Item.doc.mjs +1 -1
  500. package/src/Item/Item.tsx +7 -14
  501. package/src/Layer/useLayer.doc.mjs +2 -2
  502. package/src/Layer/useLayer.test.tsx +85 -0
  503. package/src/Layer/useLayer.tsx +39 -1
  504. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  505. package/src/Lightbox/Lightbox.tsx +45 -49
  506. package/src/Link/Link.tsx +4 -11
  507. package/src/MobileNav/MobileNav.tsx +3 -3
  508. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  509. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  510. package/src/MoreMenu/MoreMenu.tsx +19 -0
  511. package/src/MultiSelector/MultiSelector.doc.mjs +18 -1
  512. package/src/MultiSelector/MultiSelector.test.tsx +387 -18
  513. package/src/MultiSelector/MultiSelector.tsx +267 -220
  514. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  515. package/src/NumberInput/NumberInput.test.tsx +726 -21
  516. package/src/NumberInput/NumberInput.tsx +353 -59
  517. package/src/Outline/Outline.tsx +2 -5
  518. package/src/Pagination/Pagination.doc.mjs +1 -1
  519. package/src/Pagination/Pagination.test.tsx +22 -7
  520. package/src/Pagination/Pagination.tsx +38 -35
  521. package/src/Popover/Popover.doc.mjs +2 -0
  522. package/src/Popover/Popover.tsx +6 -7
  523. package/src/Popover/usePopover.tsx +37 -4
  524. package/src/PowerSearch/PowerSearch.tsx +1 -1
  525. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  526. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  527. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  528. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  529. package/src/ProgressBar/ProgressBar.tsx +126 -30
  530. package/src/RadioList/RadioList.doc.mjs +4 -2
  531. package/src/RadioList/RadioListItem.tsx +31 -130
  532. package/src/Resizable/ResizeHandle.tsx +2 -9
  533. package/src/Section/Section.tsx +0 -2
  534. package/src/Section/index.ts +0 -2
  535. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  536. package/src/SelectableCard/SelectableCard.tsx +4 -9
  537. package/src/Selector/Selector.doc.mjs +17 -4
  538. package/src/Selector/Selector.test.tsx +1394 -100
  539. package/src/Selector/Selector.tsx +355 -212
  540. package/src/Selector/hooks.ts +77 -50
  541. package/src/SideNav/SideNav.test.tsx +46 -0
  542. package/src/SideNav/SideNav.tsx +1 -0
  543. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  544. package/src/SideNav/SideNavHeading.tsx +48 -10
  545. package/src/SideNav/SideNavItem.tsx +20 -12
  546. package/src/Skeleton/Skeleton.tsx +0 -2
  547. package/src/Skeleton/index.ts +0 -2
  548. package/src/Slider/Slider.tsx +2 -11
  549. package/src/Stack/Stack.doc.mjs +110 -0
  550. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  551. package/src/Switch/Switch.test.tsx +32 -0
  552. package/src/Switch/Switch.tsx +18 -10
  553. package/src/TabList/Tab.tsx +2 -9
  554. package/src/TabList/TabMenu.tsx +14 -21
  555. package/src/Table/BaseTable.tsx +11 -0
  556. package/src/Table/Table.test.tsx +31 -0
  557. package/src/Table/TableRow.tsx +6 -0
  558. package/src/Table/index.ts +1 -4
  559. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  560. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  561. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  562. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  563. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  564. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  565. package/src/Table/tableContextMenu.test.tsx +27 -0
  566. package/src/Table/tableContextMenu.tsx +1 -0
  567. package/src/Table/types.ts +11 -0
  568. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  569. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  570. package/src/TextArea/TextArea.doc.mjs +42 -2
  571. package/src/TextArea/TextArea.test.tsx +219 -0
  572. package/src/TextArea/TextArea.tsx +34 -7
  573. package/src/TextInput/TextInput.doc.mjs +18 -2
  574. package/src/TextInput/TextInput.test.tsx +189 -0
  575. package/src/TextInput/TextInput.tsx +25 -31
  576. package/src/Thumbnail/Thumbnail.tsx +2 -9
  577. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  578. package/src/TimeInput/TimeInput.test.tsx +84 -3
  579. package/src/TimeInput/TimeInput.tsx +26 -28
  580. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  581. package/src/Timestamp/Timestamp.test.tsx +91 -14
  582. package/src/Timestamp/Timestamp.tsx +14 -2
  583. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  584. package/src/Timestamp/formatInstant.ts +16 -1
  585. package/src/Token/Token.tsx +5 -28
  586. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  587. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  588. package/src/Tokenizer/Tokenizer.tsx +10 -2
  589. package/src/Tooltip/useTooltip.tsx +2 -23
  590. package/src/TopNav/TopNav.tsx +1 -3
  591. package/src/TopNav/TopNavHeading.tsx +42 -13
  592. package/src/TopNav/TopNavItem.tsx +3 -21
  593. package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
  594. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  595. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  596. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  597. package/src/TopNav/TopNavMenu.tsx +34 -37
  598. package/src/TreeList/TreeList.doc.mjs +5 -0
  599. package/src/TreeList/TreeList.test.tsx +208 -8
  600. package/src/TreeList/TreeList.tsx +22 -0
  601. package/src/TreeList/TreeListBranches.tsx +25 -2
  602. package/src/TreeList/TreeListItem.tsx +89 -52
  603. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  604. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  605. package/src/Typeahead/Typeahead.test.tsx +76 -3
  606. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -2
  607. package/src/VisuallyHidden/index.ts +0 -2
  608. package/src/hooks/containerReveal.stylex.ts +102 -0
  609. package/src/hooks/index.ts +4 -0
  610. package/src/hooks/useClipboard.doc.mjs +87 -0
  611. package/src/hooks/useClipboard.test.tsx +151 -0
  612. package/src/hooks/useClipboard.ts +135 -0
  613. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  614. package/src/hooks/useContainerReveal.test.tsx +42 -62
  615. package/src/hooks/useContainerReveal.ts +36 -91
  616. package/src/hooks/useImageMode.test.ts +1 -1
  617. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  618. package/src/hooks/useInputStatusIcon.tsx +8 -8
  619. package/src/hooks/useLongPress.test.tsx +18 -0
  620. package/src/hooks/useLongPress.ts +12 -2
  621. package/src/hooks/useScrollLock.test.ts +72 -0
  622. package/src/hooks/useScrollLock.ts +51 -19
  623. package/src/hooks/useStreamingText.test.ts +46 -1
  624. package/src/hooks/useStreamingText.ts +49 -7
  625. package/src/hooks/useTreeFocus.test.tsx +50 -0
  626. package/src/hooks/useTreeFocus.ts +14 -3
  627. package/src/hooks/useTypeahead.test.tsx +150 -0
  628. package/src/hooks/useTypeahead.ts +24 -9
  629. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  630. package/src/index.ts +1 -0
  631. package/src/serverSafeComponents.test.ts +665 -0
  632. package/src/theme/defineTheme.ts +27 -0
  633. package/src/theme/derivedVarRegistry.test.ts +21 -1
  634. package/src/theme/derivedVarRegistry.ts +19 -6
  635. package/src/theme/expandColorScale.test.ts +14 -0
  636. package/src/theme/expandColorScale.ts +24 -9
  637. package/src/theme/expandTypeScale.test.ts +43 -0
  638. package/src/theme/expandTypeScale.ts +17 -0
  639. package/src/theme/generateThemeRules.test.ts +78 -20
  640. package/src/theme/generateThemeRules.ts +11 -0
  641. package/src/theme/index.ts +15 -0
  642. package/src/theme/tokens.stylex.ts +18 -0
  643. package/src/theme/tokens.test.ts +37 -0
  644. package/src/utils/focusOutline.stylex.ts +177 -0
  645. package/src/utils/focusReturn.test.ts +42 -0
  646. package/src/utils/focusReturn.ts +31 -0
  647. package/src/utils/index.ts +5 -0
  648. package/src/utils/interactionModality.ts +74 -0
  649. package/src/utils/mergeRefs.test.ts +48 -0
  650. package/src/utils/mergeRefs.ts +12 -6
  651. package/src/utils/rtlStyles.ts +2 -2
  652. package/src/utils/themeProps.ts +26 -4
  653. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  654. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  655. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  656. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  657. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  658. package/dist/RadioList/radio.markers.stylex.js +0 -12
  659. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  660. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  661. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  662. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  663. package/src/RadioList/radio.markers.stylex.ts +0 -10
  664. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -276,6 +276,36 @@ describe('AspectRatio', () => {
276
276
  });
277
277
  });
278
278
 
279
+ describe('style merging', () => {
280
+ it('keeps the consumer style and applies the ratio over it', () => {
281
+ render(
282
+ <AspectRatio
283
+ ratio={16 / 9}
284
+ data-testid="aspect-ratio"
285
+ style={{opacity: 0.5, aspectRatio: '3 / 1'}}>
286
+ <div>Content</div>
287
+ </AspectRatio>,
288
+ );
289
+ const element = screen.getByTestId('aspect-ratio');
290
+ expect(element.style.opacity).toBe('0.5');
291
+ expect(element.style.aspectRatio).toBe(String(16 / 9));
292
+ });
293
+
294
+ it('keeps a consumer className beside the theme target', () => {
295
+ render(
296
+ <AspectRatio
297
+ ratio={1}
298
+ data-testid="aspect-ratio"
299
+ className="consumer-class">
300
+ <div>Content</div>
301
+ </AspectRatio>,
302
+ );
303
+ const element = screen.getByTestId('aspect-ratio');
304
+ expect(element).toHaveClass('consumer-class');
305
+ expect(element).toHaveClass('astryx-aspect-ratio');
306
+ });
307
+ });
308
+
279
309
  describe('reset.css fit baseline rules', () => {
280
310
  // The cover/contain child sizing ships as zero-specificity baseline
281
311
  // rules in reset.css keyed on the data-astryx-aspect-ratio-override
@@ -1,7 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- 'use client';
4
-
5
3
  /**
6
4
  * @file AspectRatio.tsx
7
5
  * @input Uses React, stylex
@@ -94,6 +92,10 @@ export interface AspectRatioProps extends BaseProps<HTMLDivElement> {
94
92
  /**
95
93
  * Content to render inside the aspect ratio container.
96
94
  * The child element will be positioned absolutely to fill the container.
95
+ *
96
+ * Pass a single child. With `fit` set, every direct child is stretched to
97
+ * fill the box, so a second child is laid out below the first and clipped
98
+ * out of view; compose an overlay or caption inside one wrapper child.
97
99
  */
98
100
  children: ReactNode;
99
101
  }
@@ -145,6 +147,15 @@ const styles = stylex.create({
145
147
  * `ratio={1}` or an oval at other ratios. Both shapes respect the provided
146
148
  * `ratio`.
147
149
  *
150
+ * Sizing: the box takes its width from its container and derives its height
151
+ * from the ratio, so it needs an ancestor with a definite width. Two
152
+ * consequences are worth knowing. Constraining only the height (`height` or
153
+ * `maxHeight`) clamps the box without releasing the width, so the rendered
154
+ * ratio no longer matches `ratio`; pass `width: 'auto'` alongside to size from
155
+ * the height instead. And in a shrink-to-fit parent (`inline-flex`,
156
+ * `width: fit-content`, a floated box) it contributes no intrinsic width and
157
+ * collapses to zero.
158
+ *
148
159
  * @example
149
160
  * ```
150
161
  * <AspectRatio ratio={16 / 9} fit="cover">
@@ -1,7 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- 'use client';
4
-
5
3
  /**
6
4
  * @file index.ts
7
5
  * @input Imports from AspectRatio.tsx
@@ -29,21 +29,10 @@ export const docs = {
29
29
  theming: {
30
30
  targets: [
31
31
  {className: 'astryx-avatar', visualProps: ['size']},
32
+ {className: 'astryx-avatar-fallback', visualProps: ['size']},
32
33
  {className: 'astryx-avatar-status-dot', visualProps: ['variant']},
33
34
  {className: 'astryx-avatar-status-dot-glyph', visualProps: ['shape']},
34
35
  ],
35
- vars: [
36
- {name: '--_avatar-fallback-font-size', description: 'Initials font size; default is proportional to the avatar size (size × 0.4). Override per size tier (e.g. size:sm) for a custom type scale.', default: 'calc(avatar-size × 0.4)', private: true},
37
- {name: '--_avatar-fallback-font-weight', description: 'Initials font weight', default: 'var(--font-weight-medium)', private: true},
38
- {name: '--_avatar-fallback-color', description: 'Fallback text and default-icon color', default: 'var(--color-text-secondary)', private: true},
39
- {name: '--_avatar-fallback-background', description: 'Fallback wash background fill', default: 'var(--color-neutral)', private: true},
40
- ],
41
- derived: [
42
- {property: 'fontSize', vars: ['--_avatar-fallback-font-size']},
43
- {property: 'fontWeight', vars: ['--_avatar-fallback-font-weight']},
44
- {property: 'color', vars: ['--_avatar-fallback-color']},
45
- {property: 'backgroundColor', vars: ['--_avatar-fallback-background']},
46
- ],
47
36
  },
48
37
  description: 'Displays a user avatar with image, initials fallback, and optional status indicator.',
49
38
  props: [
@@ -104,7 +93,7 @@ export const docs = {
104
93
  name: 'as',
105
94
  type: 'ElementType',
106
95
  description:
107
- 'Custom link component used when `href` is set (e.g. Next.js `Link`). Overrides the provider-level LinkProvider default. Only applies with `href`.',
96
+ 'Custom link component used when `href` is set (e.g. `next/link`). Overrides the provider-level LinkProvider default. Only applies with `href`.',
108
97
  },
109
98
  {
110
99
  name: 'target',
@@ -37,17 +37,42 @@ describe('Avatar', () => {
37
37
  expect(innerImg).toHaveAttribute('alt', '');
38
38
  });
39
39
 
40
- it('renders fallback initials through the themeable font-size var, not a bare px literal', () => {
40
+ it('renders fallback initials at the proportional size via a StyleX class, not an inline property', () => {
41
41
  render(<Avatar name="Ada Lovelace" size="sm" data-testid="a" />);
42
42
  const initials = screen.getByText('AL');
43
- // The seam: the dynamic font size resolves to the Avatar-scoped var (with
44
- // the proportional `size × 0.4` default baked in as the fallback), so a
45
- // theme can re-scope it per size. A regression to a bare px literal would
46
- // break theming.
43
+ // The default proportional size (sm = 24 × 0.4 = 9.6px) is fed to StyleX as
44
+ // a dynamic value: StyleX applies `font-size` through a class and sets only
45
+ // the computed value inline (as a custom property). Because the property
46
+ // lands via a class, a theme's `.astryx-avatar-fallback.<size>` rule in the
47
+ // theme layer overrides it per size tier — no internal var seam needed.
47
48
  const style = initials.getAttribute('style') ?? '';
48
- expect(style).toContain('var(--_avatar-fallback-font-size,');
49
- // Default still reproduces the proportional scale (sm = 24 × 0.4 = 9.6px).
50
- expect(style).toMatch(/var\(--_avatar-fallback-font-size,\s*9\.6\d*px\)/);
49
+ expect(style).toMatch(/9\.6\d*px/);
50
+ // Regression guard: the seam must NOT reintroduce the removed internal var.
51
+ expect(style).not.toContain('--_avatar-fallback-font-size');
52
+ });
53
+
54
+ it('marks the fallback surface with the stable theming class (initials and icon)', () => {
55
+ // The background is themed directly on `.astryx-avatar-fallback`, so both
56
+ // the initials and the default-icon fallback must carry the class.
57
+ const {rerender} = render(<Avatar name="Ada Lovelace" />);
58
+ expect(screen.getByText('AL').className).toContain(
59
+ 'astryx-avatar-fallback',
60
+ );
61
+
62
+ rerender(<Avatar />);
63
+ const icon = document.querySelector('.astryx-avatar-fallback');
64
+ expect(icon).not.toBeNull();
65
+ expect(icon?.querySelector('svg')).not.toBeNull();
66
+ });
67
+
68
+ it('does not split an emoji surrogate pair when generating initials', () => {
69
+ render(<Avatar name="😀 Ada" data-testid="avatar" />);
70
+ expect(screen.getByTestId('avatar')).toHaveTextContent('😀A');
71
+ });
72
+
73
+ it('preserves a complete grapheme when generating initials', () => {
74
+ render(<Avatar name="🇬🇧 Ada" data-testid="avatar" />);
75
+ expect(screen.getByTestId('avatar')).toHaveTextContent('🇬🇧A');
51
76
  });
52
77
 
53
78
  it('retries a new src after a previous src failed to load', () => {
@@ -31,6 +31,7 @@ import {AvatarSizeContext} from './AvatarSizeContext';
31
31
  import {useAvatarGroup} from '../AvatarGroup/AvatarGroupContext';
32
32
  import {mergeProps, mergeRefs} from '../utils';
33
33
  import {themeProps} from '../utils/themeProps';
34
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
34
35
  import {useTooltip} from '../Tooltip/useTooltip';
35
36
  import {useLinkComponent} from '../Link/useLinkComponent';
36
37
  import type {LinkComponentType} from '../Link/types';
@@ -112,9 +113,9 @@ const styles = stylex.create({
112
113
  display: 'inline-flex',
113
114
  flexShrink: 0,
114
115
  // The wrapper is not clipped (so the status dot can overflow), so it must be
115
- // rounded itself: a themed fallback background lands on `.astryx-avatar` (the
116
- // class-bearing wrapper) as well as the internal var, and an unrounded
117
- // wrapper would show that fill as square corners behind the circular content.
116
+ // rounded itself: a theme can set a background on the `.astryx-avatar`
117
+ // wrapper, and an unrounded wrapper would show that fill as square corners
118
+ // behind the circular content.
118
119
  borderRadius: radiusVars['--radius-full'],
119
120
  },
120
121
  content: {
@@ -136,14 +137,15 @@ const styles = stylex.create({
136
137
  justifyContent: 'center',
137
138
  width: '100%',
138
139
  height: '100%',
139
- // Fallback surface (initials + default icon). Each property reads an
140
- // Avatar-scoped internal var so a theme can re-scope the fallback wash and
141
- // initials weight/color without forking; the defaults reproduce today's
142
- // exact output. See derivedVarRegistry (avatar) + Avatar.doc.mjs theming.
143
- backgroundColor: `var(--_avatar-fallback-background, ${colorVars['--color-neutral']})`,
144
- color: `var(--_avatar-fallback-color, ${colorVars['--color-text-secondary']})`,
140
+ // Fallback surface (initials + default icon). Background, text color,
141
+ // weight, and per-size font size are all themed directly via the stable
142
+ // `.astryx-avatar-fallback` class target (font size through its size
143
+ // variant, `.astryx-avatar-fallback.<size>`), so the defaults here are
144
+ // plain values with no internal-var seam. See Avatar.doc.mjs theming.
145
+ backgroundColor: colorVars['--color-neutral'],
146
+ color: colorVars['--color-text-secondary'],
145
147
  fontFamily: typographyVars['--font-family-body'],
146
- fontWeight: `var(--_avatar-fallback-font-weight, ${fontWeightVars['--font-weight-medium']})`,
148
+ fontWeight: fontWeightVars['--font-weight-medium'],
147
149
  textTransform: 'uppercase',
148
150
  },
149
151
  status: {
@@ -152,16 +154,6 @@ const styles = stylex.create({
152
154
  // Visible focus ring for the name-tooltip tab stop, matching the repo-wide
153
155
  // focus-visible outline treatment (see Timestamp, Token, Thumbnail). Only
154
156
  // applied when a tooltip is active so keyboard users can reveal it.
155
- focusable: {
156
- outline: {
157
- default: null,
158
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
159
- },
160
- outlineOffset: {
161
- default: '0',
162
- ':focus-visible': '2px',
163
- },
164
- },
165
157
  // Reset the intrinsic styling of the interactive element (<a>/<button>) so it
166
158
  // is a transparent, correctly-sized wrapper around the avatar visuals. The
167
159
  // element carries the focus-visible accent ring for keyboard users.
@@ -178,22 +170,6 @@ const styles = stylex.create({
178
170
  cursor: 'pointer',
179
171
  // Match the avatar's circular shape so the focus ring hugs it.
180
172
  borderRadius: radiusVars['--radius-full'],
181
- outlineWidth: {
182
- default: 0,
183
- ':focus-visible': 2,
184
- },
185
- outlineStyle: {
186
- default: 'none',
187
- ':focus-visible': 'solid',
188
- },
189
- outlineColor: {
190
- default: null,
191
- ':focus-visible': colorVars['--color-accent'],
192
- },
193
- outlineOffset: {
194
- default: 0,
195
- ':focus-visible': 2,
196
- },
197
173
  },
198
174
  });
199
175
 
@@ -205,13 +181,12 @@ const dynamicStyles = stylex.create({
205
181
  width: size,
206
182
  height: size,
207
183
  }),
208
- // Initials font size defaults to the proportional `size × ratio` scale but is
209
- // reachable via the `--_avatar-fallback-font-size` derived var, so a theme can
210
- // set a per-size type scale (e.g. `components.avatar['size:sm']`).
184
+ // Initials font size defaults to the proportional `size × ratio` scale. It's
185
+ // a StyleX dynamic style, so the value lands via a class (not an inline
186
+ // property) — a theme's `.astryx-avatar-fallback.<size>` rule in the theme
187
+ // layer overrides it per size tier, no internal var needed.
211
188
  fontSize: (size: number) => ({
212
- fontSize: `var(--_avatar-fallback-font-size, ${
213
- size * INITIALS_FONT_SIZE_RATIO
214
- }px)`,
189
+ fontSize: `${size * INITIALS_FONT_SIZE_RATIO}px`,
215
190
  }),
216
191
  statusPosition: (size: number) => ({
217
192
  bottom: size * CIRCLE_EDGE_OFFSET_RATIO,
@@ -337,6 +312,25 @@ export interface AvatarProps extends BaseProps<HTMLDivElement> {
337
312
  onClick?: React.MouseEventHandler<HTMLElement>;
338
313
  }
339
314
 
315
+ /**
316
+ * Reuse a single segmenter when the runtime supports Intl.Segmenter.
317
+ */
318
+ const graphemeSegmenter =
319
+ typeof Intl.Segmenter === 'function'
320
+ ? new Intl.Segmenter(undefined, {granularity: 'grapheme'})
321
+ : null;
322
+
323
+ /**
324
+ * Return the first user-perceived character, with a code-point fallback.
325
+ */
326
+ function firstGrapheme(word: string): string {
327
+ if (graphemeSegmenter) {
328
+ return [...graphemeSegmenter.segment(word)][0]?.segment ?? '';
329
+ }
330
+
331
+ return [...word][0] ?? '';
332
+ }
333
+
340
334
  /**
341
335
  * Generates initials from a name string.
342
336
  * Takes the first letter of the first two words.
@@ -352,9 +346,11 @@ function getInitials(name: string): string {
352
346
  return '';
353
347
  }
354
348
  if (words.length === 1) {
355
- return words[0].charAt(0).toUpperCase();
349
+ return firstGrapheme(words[0]).toUpperCase();
356
350
  }
357
- return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase();
351
+ return (
352
+ firstGrapheme(words[0]) + firstGrapheme(words[words.length - 1])
353
+ ).toUpperCase();
358
354
  }
359
355
 
360
356
  /**
@@ -549,15 +545,22 @@ export function Avatar({
549
545
  )}
550
546
  {showInitials && (
551
547
  <div
552
- {...stylex.props(
553
- styles.fallback,
554
- dynamicStyles.fontSize(numericSize),
548
+ {...mergeProps(
549
+ themeProps('avatar-fallback', {size: resolvedSize}),
550
+ stylex.props(
551
+ styles.fallback,
552
+ dynamicStyles.fontSize(numericSize),
553
+ ),
555
554
  )}>
556
555
  {getInitials(name)}
557
556
  </div>
558
557
  )}
559
558
  {showIcon && (
560
- <div {...stylex.props(styles.fallback)}>
559
+ <div
560
+ {...mergeProps(
561
+ themeProps('avatar-fallback', {size: resolvedSize}),
562
+ stylex.props(styles.fallback),
563
+ )}>
561
564
  <DefaultIcon size={numericSize} />
562
565
  </div>
563
566
  )}
@@ -580,10 +583,9 @@ export function Avatar({
580
583
  // `<a>`/`<button>` and the static `<div>` carry the exact same box.
581
584
  const rootStylexProps = mergeProps(
582
585
  themeProps('avatar', {size: resolvedSize}),
583
- stylex.props(
586
+ focusOutlineProps.focusVisible(
584
587
  styles.wrapper,
585
588
  isInteractive && styles.interactive,
586
- !isInteractive && showTooltip && !avatarGroup && styles.focusable,
587
589
  avatarGroup && groupStyles.ring,
588
590
  avatarGroup && groupStyles.overlap,
589
591
  avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
@@ -26,6 +26,7 @@ import {mergeProps} from '../utils';
26
26
  import {useAvatarGroup} from './AvatarGroupContext';
27
27
  import type {BaseProps} from '../BaseProps';
28
28
  import {themeProps} from '../utils/themeProps';
29
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
29
30
  import {useTranslator} from '../i18n';
30
31
 
31
32
  const BORDER_WIDTH = 2;
@@ -93,14 +94,6 @@ const styles = stylex.create({
93
94
  ':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']}), linear-gradient(${colorVars['--color-neutral']}, ${colorVars['--color-neutral']})`,
94
95
  },
95
96
  // Focus ring via focus-visible
96
- outline: {
97
- default: 'none',
98
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
99
- },
100
- outlineOffset: {
101
- default: null,
102
- ':focus-visible': '2px',
103
- },
104
97
  },
105
98
  overlap: {
106
99
  marginInlineStart: 'var(--_avatar-group-overlap)',
@@ -170,7 +163,7 @@ export function AvatarGroupOverflow({
170
163
  data-avatar-item=""
171
164
  {...mergeProps(
172
165
  themeProps('avatar-group-overflow'),
173
- stylex.props(
166
+ focusOutlineProps.focusVisible(
174
167
  styles.base,
175
168
  styles.button,
176
169
  styles.overlap,
@@ -1,7 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- 'use client';
4
-
5
3
  /**
6
4
  * @file Badge.tsx
7
5
  * @input Uses React, HTMLAttributes
@@ -1,7 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- 'use client';
4
-
5
3
  /**
6
4
  * @file index.ts
7
5
  * @input Imports Badge component and types from Badge.tsx
@@ -3,7 +3,8 @@
3
3
  /**
4
4
  * @file Banner.test.tsx
5
5
  * @input Uses vitest, @testing-library/react, Banner component
6
- * @output Unit tests for Banner component behavior
6
+ * @output Unit tests for Banner component behavior, including the
7
+ * 'banner-icon' theme target riding on the status icon glyph (#4166)
7
8
  * @position Testing; validates Banner.tsx implementation
8
9
  *
9
10
  * SYNC: When modified, update this header
@@ -337,6 +338,62 @@ describe('Banner', () => {
337
338
  expect(ref.current).toBeInstanceOf(HTMLDivElement);
338
339
  });
339
340
 
341
+ // =========================================================================
342
+ // Status icon color theming (#4166)
343
+ // =========================================================================
344
+
345
+ it("carries the 'banner-icon' theme target on the default status icon glyph", () => {
346
+ // Theme overrides for 'banner-icon' + 'status:X' compile to
347
+ // '.astryx-banner-icon.<status>' (parseStyleKey). The target must sit on
348
+ // the <Icon> span itself so those same-element rules in
349
+ // @layer astryx-theme beat the Icon's own color variant.
350
+ const statuses = ['info', 'warning', 'error', 'success'] as const;
351
+ for (const status of statuses) {
352
+ const {container, unmount} = render(
353
+ <Banner status={status} title={`${status} banner`} />,
354
+ );
355
+ const glyph = container.querySelector(
356
+ `.astryx-icon.astryx-banner-icon.${status}`,
357
+ );
358
+ expect(glyph).not.toBeNull();
359
+ expect(glyph).toHaveAttribute('data-status', status);
360
+ // Exactly one element carries the target — the layout wrapper no
361
+ // longer does.
362
+ expect(container.querySelectorAll('.astryx-banner-icon')).toHaveLength(1);
363
+ unmount();
364
+ }
365
+ });
366
+
367
+ it('keeps the color variant on the theme-target element (regression pin for #4166)', () => {
368
+ // Pre-fix, '.astryx-banner-icon.info' matched the layout wrapper while
369
+ // the color variant (data-color="accent") sat on an inner span that a
370
+ // theme override could never reach. Target and paint now share one
371
+ // element.
372
+ const {container} = render(<Banner status="info" title="Info" />);
373
+ const target = container.querySelector('.astryx-banner-icon.info');
374
+ expect(target).toHaveAttribute('data-color', 'accent');
375
+ });
376
+
377
+ it("keeps the 'banner-icon' target on the wrapper for a custom icon node", () => {
378
+ // Core never injects props into consumer elements, so with a custom
379
+ // `icon` the target stays on the (layout-only) wrapper and overrides
380
+ // reach the node via inheritance. The node itself is untouched.
381
+ const {container} = render(
382
+ <Banner
383
+ status="info"
384
+ title="Custom icon"
385
+ icon={<span data-testid="custom-glyph">i</span>}
386
+ />,
387
+ );
388
+ const targets = container.querySelectorAll('.astryx-banner-icon');
389
+ expect(targets).toHaveLength(1);
390
+ expect(targets[0]?.tagName).toBe('DIV');
391
+ expect(targets[0]).toHaveAttribute('aria-hidden', 'true');
392
+ const custom = container.querySelector('[data-testid="custom-glyph"]');
393
+ expect(custom).not.toBeNull();
394
+ expect(custom?.className).toBe('');
395
+ });
396
+
340
397
  // =========================================================================
341
398
  // Icon registry integration
342
399
  // =========================================================================
@@ -12,6 +12,9 @@
12
12
  * - Root container: layout-only wrapper (flex column), no visual styling, no theme target
13
13
  * - Header area (themeProps 'banner'): colored status background with icon, title, description, actions, dismiss
14
14
  * - Content area (themeProps 'banner-content'): collapsible card background for additional content (children)
15
+ * - Status icon (themeProps 'banner-icon'): the target rides on the default
16
+ * <Icon> itself — the element that paints — so 'status:X' overrides reach
17
+ * the glyph (#4166); for a custom `icon` node it stays on the layout wrapper
15
18
  * - No left border accent — color is expressed through the full header background
16
19
  * - Each visual area owns its own border-radius (no overflow:clip on the container)
17
20
  * - When children are provided, a collapse/expand toggle button appears in the end area
@@ -271,8 +274,9 @@ const styles = stylex.create({
271
274
  borderEndStartRadius: radiusVars['--radius-container'],
272
275
  borderEndEndRadius: radiusVars['--radius-container'],
273
276
  },
277
+ // Applied to the chevron <Icon> itself (via `xstyle`) rather than a wrapper,
278
+ // so the element that rotates is the element a theme targets.
274
279
  chevron: {
275
- display: 'inline-flex',
276
280
  transitionProperty: 'transform',
277
281
  transitionDuration: {
278
282
  default: durationVars['--duration-fast'],
@@ -444,16 +448,32 @@ export function Banner({
444
448
  : styles.headerCardStandalone),
445
449
  ),
446
450
  )}>
451
+ {/* The 'banner-icon' target rides on the element that paints: the
452
+ default <Icon> below, or this wrapper when a custom `icon` node
453
+ is passed (core never injects props into consumer elements, so
454
+ overrides reach it via inheritance). The wrapper itself stays
455
+ layout-only. */}
447
456
  <div
448
- {...mergeProps(
449
- themeProps('banner-icon', {status}),
450
- stylex.props(styles.iconWrapper),
451
- )}
457
+ {...(icon != null
458
+ ? mergeProps(
459
+ themeProps('banner-icon', {status}),
460
+ stylex.props(styles.iconWrapper),
461
+ )
462
+ : stylex.props(styles.iconWrapper))}
452
463
  aria-hidden="true">
453
464
  {icon != null ? (
454
465
  icon
455
466
  ) : (
456
- <Icon icon={defaultIconName} size="md" color={iconColor} />
467
+ // Applied to the status <Icon> itself rather than the wrapper, so
468
+ // the element that paints the glyph is the element a theme
469
+ // targets — a 'banner-icon' 'status:X' color override beats the
470
+ // Icon's own variant from @layer astryx-theme (#4166).
471
+ <Icon
472
+ icon={defaultIconName}
473
+ size="md"
474
+ color={iconColor}
475
+ {...themeProps('banner-icon', {status})}
476
+ />
457
477
  )}
458
478
  </div>
459
479
  <div {...stylex.props(styles.headerContent)}>
@@ -484,13 +504,15 @@ export function Banner({
484
504
  : t('@astryx.banner.expand')
485
505
  }
486
506
  icon={
487
- <span
488
- {...stylex.props(
507
+ <Icon
508
+ icon="chevronDown"
509
+ size="sm"
510
+ color="inherit"
511
+ xstyle={[
489
512
  styles.chevron,
490
513
  isExpanded && styles.chevronExpanded,
491
- )}>
492
- <Icon icon="chevronDown" size="sm" color="inherit" />
493
- </span>
514
+ ]}
515
+ />
494
516
  }
495
517
  onClick={handleToggleExpand}
496
518
  aria-expanded={isExpanded}
@@ -1,7 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- 'use client';
4
-
5
3
  /**
6
4
  * @file Blockquote.tsx
7
5
  * @input Uses React, stylex, spacing and color tokens
@@ -1,7 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- 'use client';
4
-
5
3
  /**
6
4
  * @file index.ts
7
5
  * @input Imports from Blockquote.tsx
@@ -45,7 +45,7 @@ import type {LinkComponentType} from '../Link/types';
45
45
  import {mergeProps, mergeRefs} from '../utils';
46
46
  import type {BaseProps} from '../BaseProps';
47
47
  import {themeProps} from '../utils/themeProps';
48
- import {useIcon} from '../Icon';
48
+ import {Icon} from '../Icon';
49
49
  import {usePopover} from '../Popover/usePopover';
50
50
  import {useListFocus} from '../hooks/useListFocus';
51
51
  import {useTypeahead} from '../hooks/useTypeahead';
@@ -196,6 +196,11 @@ const itemStyles = stylex.create({
196
196
  display: 'flex',
197
197
  alignItems: 'center',
198
198
  flexShrink: 0,
199
+ // Sized off supporting text (12px) — exactly Icon's `xsm` box at the
200
+ // default type scale. Width/height stay on the token so the box and the
201
+ // glyph keep matching if a theme retunes the supporting step.
202
+ width: typeScaleVars['--text-supporting-size'],
203
+ height: typeScaleVars['--text-supporting-size'],
199
204
  fontSize: typeScaleVars['--text-supporting-size'],
200
205
  },
201
206
  separator: {
@@ -507,8 +512,6 @@ function BreadcrumbMenuTrigger({
507
512
  role: 'none',
508
513
  });
509
514
 
510
- const chevronDownIcon = useIcon('chevronDown');
511
-
512
515
  const closeMenu = useCallback(() => {
513
516
  popover.hide();
514
517
  }, [popover]);
@@ -624,9 +627,16 @@ function BreadcrumbMenuTrigger({
624
627
  isSupporting ? itemStyles.supportingLink : itemStyles.defaultLink,
625
628
  )}>
626
629
  {children}
627
- <span aria-hidden="true" {...stylex.props(itemStyles.chevron)}>
628
- {chevronDownIcon}
629
- </span>
630
+ <Icon
631
+ icon="chevronDown"
632
+ // 0.75rem — the 12px supporting-text box the bare glyph already
633
+ // rendered at; `itemStyles.chevron` keeps that box on the token.
634
+ size="xsm"
635
+ // The chevron reads as part of the link label, so it takes the
636
+ // trigger's link color rather than an icon color.
637
+ color="inherit"
638
+ xstyle={itemStyles.chevron}
639
+ />
630
640
  </button>
631
641
 
632
642
  {popover.render(
@@ -37,6 +37,10 @@ export {
37
37
  DropdownMenuItem as BreadcrumbMenuItem,
38
38
  type DropdownMenuItemProps as BreadcrumbMenuItemProps,
39
39
  } from '../DropdownMenu/DropdownMenuItem';
40
+ export {
41
+ DropdownMenuDivider as BreadcrumbMenuDivider,
42
+ type DropdownMenuDividerProps as BreadcrumbMenuDividerProps,
43
+ } from '../DropdownMenu/DropdownMenuDivider';
40
44
  export {
41
45
  DropdownMenuCheckboxItem as BreadcrumbMenuCheckboxItem,
42
46
  type DropdownMenuCheckboxItemProps as BreadcrumbMenuCheckboxItemProps,
@@ -56,6 +60,6 @@ export {
56
60
  export type {
57
61
  DropdownMenuOption as BreadcrumbMenuOption,
58
62
  DropdownMenuItemData as BreadcrumbMenuItemData,
59
- DropdownMenuDivider as BreadcrumbMenuDivider,
63
+ DropdownMenuDividerData as BreadcrumbMenuDividerData,
60
64
  DropdownMenuSection as BreadcrumbMenuSection,
61
65
  } from '../DropdownMenu/DropdownMenu';
@@ -163,7 +163,7 @@ export const docs = {
163
163
  ],
164
164
  vars: [
165
165
  {name: '--_button-radius', description: 'Border radius', default: 'var(--radius-element)', private: true},
166
- {name: '--button-focus-offset', description: 'Focus ring outline offset', default: '3px'},
166
+ {name: '--button-focus-offset', description: 'Focus ring outline offset', default: 'var(--focus-outline-offset)'},
167
167
  {name: '--button-icon-only-aspect', description: 'Aspect ratio for icon-only buttons', default: '1 / 1'},
168
168
  ],
169
169
  derived: [
@@ -245,7 +245,7 @@ export const docsZh = {
245
245
  ],
246
246
  vars: [
247
247
  {name: '--_button-radius', description: '圆角半径', default: 'var(--radius-element)', private: true},
248
- {name: '--button-focus-offset', description: '焦点环轮廓偏移', default: '3px'},
248
+ {name: '--button-focus-offset', description: '焦点环轮廓偏移', default: 'var(--focus-outline-offset)'},
249
249
  {name: '--button-icon-only-aspect', description: '纯图标按钮的宽高比', default: '1 / 1'},
250
250
  ],
251
251
  derived: [