@astryxdesign/core 0.3.0 → 0.4.0-canary.3112e99

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 (594) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +10 -2
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +22 -3
  5. package/dist/AppShell/AppShell.d.ts +2 -2
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +40 -9
  8. package/dist/AspectRatio/AspectRatio.d.ts +13 -0
  9. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js +9 -0
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +33 -20
  13. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
  15. package/dist/Banner/Banner.d.ts +3 -0
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -17
  18. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  20. package/dist/Breadcrumbs/index.d.ts +2 -1
  21. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/index.js +1 -0
  23. package/dist/Button/Button.d.ts.map +1 -1
  24. package/dist/Button/Button.js +12 -16
  25. package/dist/Calendar/Calendar.d.ts.map +1 -1
  26. package/dist/Calendar/Calendar.js +2 -1
  27. package/dist/Calendar/styles.d.ts +0 -2
  28. package/dist/Calendar/styles.d.ts.map +1 -1
  29. package/dist/Calendar/styles.js +0 -2
  30. package/dist/Carousel/Carousel.d.ts.map +1 -1
  31. package/dist/Carousel/Carousel.js +8 -12
  32. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  33. package/dist/Chat/ChatDictationButton.js +2 -1
  34. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  35. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  36. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  37. package/dist/Chat/ChatSendButton.js +4 -3
  38. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  39. package/dist/Chat/ChatToolCalls.js +17 -17
  40. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  41. package/dist/Chat/useTriggerMenu.js +2 -6
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  44. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  45. package/dist/ClickableCard/ClickableCard.js +3 -11
  46. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  47. package/dist/CodeBlock/CodeBlock.js +84 -67
  48. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  49. package/dist/Collapsible/Collapsible.js +35 -15
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  52. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  53. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  54. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  56. package/dist/ComplexSelector/ComplexSelector.js +32 -31
  57. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  58. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  59. package/dist/ContextMenu/ContextMenu.js +1 -1
  60. package/dist/ContextMenu/index.d.ts +2 -1
  61. package/dist/ContextMenu/index.d.ts.map +1 -1
  62. package/dist/ContextMenu/index.js +1 -0
  63. package/dist/DateInput/DateInput.d.ts +9 -2
  64. package/dist/DateInput/DateInput.d.ts.map +1 -1
  65. package/dist/DateInput/DateInput.js +47 -33
  66. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  67. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  68. package/dist/DateRangeInput/DateRangeInput.js +55 -32
  69. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  70. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  71. package/dist/DateTimeInput/DateTimeInput.js +54 -30
  72. package/dist/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/Dialog/Dialog.js +4 -4
  74. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  75. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  76. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  77. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  78. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  79. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  80. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  81. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  82. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  83. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  84. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  86. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
  87. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  88. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
  89. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  90. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  91. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  92. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  93. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  94. package/dist/DropdownMenu/index.d.ts +2 -1
  95. package/dist/DropdownMenu/index.d.ts.map +1 -1
  96. package/dist/DropdownMenu/index.js +4 -0
  97. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  98. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  99. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  100. package/dist/EmptyState/EmptyState.js +9 -5
  101. package/dist/Field/InputClearButton.d.ts +16 -3
  102. package/dist/Field/InputClearButton.d.ts.map +1 -1
  103. package/dist/Field/InputClearButton.js +15 -4
  104. package/dist/FileInput/FileInput.d.ts.map +1 -1
  105. package/dist/FileInput/FileInput.js +21 -10
  106. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  107. package/dist/HoverCard/useHoverCard.js +3 -19
  108. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  109. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  110. package/dist/Indicator/CheckIndicator.js +155 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  112. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  113. package/dist/Indicator/CheckboxIndicator.js +173 -0
  114. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  115. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  116. package/dist/Indicator/RadioIndicator.js +137 -0
  117. package/dist/Indicator/index.d.ts +24 -0
  118. package/dist/Indicator/index.d.ts.map +1 -0
  119. package/dist/Indicator/index.js +26 -0
  120. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  121. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  122. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  123. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  124. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  125. package/dist/Indicator/indicatorRegistry.js +93 -0
  126. package/dist/Indicator/types.d.ts +177 -0
  127. package/dist/Indicator/types.d.ts.map +1 -0
  128. package/dist/Indicator/types.js +1 -0
  129. package/dist/Indicator/useIndicator.d.ts +18 -0
  130. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  131. package/dist/Indicator/useIndicator.js +30 -0
  132. package/dist/Item/Item.d.ts.map +1 -1
  133. package/dist/Item/Item.js +4 -8
  134. package/dist/Layer/useLayer.d.ts +14 -0
  135. package/dist/Layer/useLayer.d.ts.map +1 -1
  136. package/dist/Layer/useLayer.js +25 -2
  137. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  138. package/dist/Lightbox/Lightbox.js +80 -103
  139. package/dist/Link/Link.d.ts.map +1 -1
  140. package/dist/Link/Link.js +4 -5
  141. package/dist/MobileNav/MobileNav.js +8 -8
  142. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  143. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  144. package/dist/MoreMenu/MoreMenu.js +4 -0
  145. package/dist/MultiSelector/MultiSelector.d.ts +8 -1
  146. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  147. package/dist/MultiSelector/MultiSelector.js +119 -95
  148. package/dist/NumberInput/NumberInput.d.ts +27 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +230 -42
  151. package/dist/Outline/Outline.d.ts.map +1 -1
  152. package/dist/Outline/Outline.js +2 -3
  153. package/dist/Pagination/Pagination.d.ts.map +1 -1
  154. package/dist/Pagination/Pagination.js +61 -63
  155. package/dist/Popover/Popover.d.ts.map +1 -1
  156. package/dist/Popover/Popover.js +6 -8
  157. package/dist/Popover/usePopover.d.ts +15 -0
  158. package/dist/Popover/usePopover.d.ts.map +1 -1
  159. package/dist/Popover/usePopover.js +14 -2
  160. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  161. package/dist/PowerSearch/PowerSearch.js +1 -1
  162. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  163. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  164. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  165. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  166. package/dist/ProgressBar/ProgressBar.js +95 -6
  167. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  168. package/dist/RadioList/RadioListItem.js +29 -84
  169. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  170. package/dist/Resizable/ResizeHandle.js +2 -3
  171. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  172. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  173. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  174. package/dist/SelectableCard/SelectableCard.js +3 -11
  175. package/dist/Selector/Selector.d.ts +12 -1
  176. package/dist/Selector/Selector.d.ts.map +1 -1
  177. package/dist/Selector/Selector.js +222 -111
  178. package/dist/Selector/hooks.d.ts +18 -6
  179. package/dist/Selector/hooks.d.ts.map +1 -1
  180. package/dist/Selector/hooks.js +57 -40
  181. package/dist/SideNav/SideNav.d.ts.map +1 -1
  182. package/dist/SideNav/SideNav.js +1 -1
  183. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  184. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  185. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  186. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  187. package/dist/SideNav/SideNavHeading.js +56 -20
  188. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  189. package/dist/SideNav/SideNavItem.js +28 -22
  190. package/dist/Slider/Slider.d.ts.map +1 -1
  191. package/dist/Slider/Slider.js +2 -6
  192. package/dist/Stack/stack.stylex.d.ts +3 -3
  193. package/dist/Switch/Switch.d.ts.map +1 -1
  194. package/dist/Switch/Switch.js +14 -13
  195. package/dist/TabList/Tab.d.ts.map +1 -1
  196. package/dist/TabList/Tab.js +2 -3
  197. package/dist/TabList/TabMenu.d.ts.map +1 -1
  198. package/dist/TabList/TabMenu.js +41 -19
  199. package/dist/Table/BaseTable.d.ts.map +1 -1
  200. package/dist/Table/BaseTable.js +8 -0
  201. package/dist/Table/TableRow.d.ts +1 -1
  202. package/dist/Table/TableRow.d.ts.map +1 -1
  203. package/dist/Table/TableRow.js +4 -2
  204. package/dist/Table/index.d.ts +1 -1
  205. package/dist/Table/index.d.ts.map +1 -1
  206. package/dist/Table/index.js +1 -1
  207. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  208. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  210. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  211. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  212. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  213. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  214. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  215. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  216. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  217. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  218. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  219. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  220. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  221. package/dist/Table/tableContextMenu.js +2 -1
  222. package/dist/Table/types.d.ts +11 -0
  223. package/dist/Table/types.d.ts.map +1 -1
  224. package/dist/TextArea/TextArea.d.ts +10 -1
  225. package/dist/TextArea/TextArea.d.ts.map +1 -1
  226. package/dist/TextArea/TextArea.js +16 -6
  227. package/dist/TextInput/TextInput.d.ts +10 -1
  228. package/dist/TextInput/TextInput.d.ts.map +1 -1
  229. package/dist/TextInput/TextInput.js +13 -19
  230. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  231. package/dist/Thumbnail/Thumbnail.js +32 -26
  232. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  233. package/dist/TimeInput/TimeInput.js +14 -17
  234. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  235. package/dist/Timestamp/Timestamp.js +14 -3
  236. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  237. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  238. package/dist/Timestamp/formatInstant.d.ts +11 -1
  239. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  240. package/dist/Timestamp/formatInstant.js +3 -1
  241. package/dist/Token/Token.d.ts.map +1 -1
  242. package/dist/Token/Token.js +20 -11
  243. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  244. package/dist/Tokenizer/Tokenizer.js +4 -2
  245. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  246. package/dist/Tooltip/useTooltip.js +3 -19
  247. package/dist/TopNav/TopNav.d.ts.map +1 -1
  248. package/dist/TopNav/TopNav.js +6 -5
  249. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  250. package/dist/TopNav/TopNavHeading.js +54 -16
  251. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavItem.js +3 -9
  253. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  254. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  255. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  256. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  258. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  259. package/dist/TopNav/TopNavMenu.js +83 -38
  260. package/dist/TreeList/TreeList.d.ts.map +1 -1
  261. package/dist/TreeList/TreeList.js +13 -0
  262. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  263. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  264. package/dist/TreeList/TreeListBranches.js +14 -4
  265. package/dist/TreeList/TreeListItem.d.ts +11 -1
  266. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  267. package/dist/TreeList/TreeListItem.js +57 -30
  268. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  269. package/dist/Typeahead/BaseTypeahead.js +16 -8
  270. package/dist/astryx.css +84 -96
  271. package/dist/astryx.umd.js +56 -56
  272. package/dist/astryx.umd.js.map +4 -4
  273. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  274. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  275. package/dist/hooks/containerReveal.stylex.js +63 -0
  276. package/dist/hooks/index.d.ts +3 -0
  277. package/dist/hooks/index.d.ts.map +1 -1
  278. package/dist/hooks/index.js +2 -0
  279. package/dist/hooks/useClipboard.d.ts +59 -0
  280. package/dist/hooks/useClipboard.d.ts.map +1 -0
  281. package/dist/hooks/useClipboard.js +106 -0
  282. package/dist/hooks/useContainerReveal.d.ts +14 -8
  283. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  284. package/dist/hooks/useContainerReveal.js +28 -69
  285. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  286. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  287. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  288. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  289. package/dist/hooks/useInputStatusIcon.js +17 -4
  290. package/dist/hooks/useLongPress.d.ts.map +1 -1
  291. package/dist/hooks/useLongPress.js +12 -2
  292. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  293. package/dist/hooks/useScrollLock.js +33 -18
  294. package/dist/hooks/useStreamingText.d.ts +18 -3
  295. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  296. package/dist/hooks/useStreamingText.js +47 -7
  297. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  298. package/dist/hooks/useTreeFocus.js +9 -3
  299. package/dist/hooks/useTypeahead.d.ts +3 -2
  300. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  301. package/dist/hooks/useTypeahead.js +19 -7
  302. package/dist/index.d.ts +1 -0
  303. package/dist/index.d.ts.map +1 -1
  304. package/dist/index.js +1 -0
  305. package/dist/theme/defineTheme.d.ts +18 -2
  306. package/dist/theme/defineTheme.d.ts.map +1 -1
  307. package/dist/theme/defineTheme.js +10 -1
  308. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  309. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  310. package/dist/theme/derivedVarRegistry.js +14 -13
  311. package/dist/theme/expandColorScale.d.ts +3 -1
  312. package/dist/theme/expandColorScale.d.ts.map +1 -1
  313. package/dist/theme/expandColorScale.js +17 -7
  314. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  315. package/dist/theme/expandTypeScale.js +17 -0
  316. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  317. package/dist/theme/generateThemeRules.js +11 -0
  318. package/dist/theme/index.d.ts +2 -1
  319. package/dist/theme/index.d.ts.map +1 -1
  320. package/dist/theme/index.js +1 -1
  321. package/dist/theme/tokens.stylex.d.ts +12 -0
  322. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  323. package/dist/theme/tokens.stylex.js +23 -0
  324. package/dist/utils/focusOutline.stylex.d.ts +122 -0
  325. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  326. package/dist/utils/focusOutline.stylex.js +143 -0
  327. package/dist/utils/focusReturn.d.ts +24 -0
  328. package/dist/utils/focusReturn.d.ts.map +1 -0
  329. package/dist/utils/focusReturn.js +29 -0
  330. package/dist/utils/index.d.ts +2 -0
  331. package/dist/utils/index.d.ts.map +1 -1
  332. package/dist/utils/index.js +6 -1
  333. package/dist/utils/mergeRefs.d.ts.map +1 -1
  334. package/dist/utils/mergeRefs.js +7 -5
  335. package/dist/utils/rtlStyles.d.ts +2 -2
  336. package/dist/utils/rtlStyles.js +2 -2
  337. package/dist/utils/themeProps.d.ts +20 -1
  338. package/dist/utils/themeProps.d.ts.map +1 -1
  339. package/dist/utils/themeProps.js +8 -2
  340. package/locales/en.json +52 -0
  341. package/locales/pseudo.json +39 -0
  342. package/package.json +8 -3
  343. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  344. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  345. package/src/AlertDialog/AlertDialog.tsx +21 -3
  346. package/src/AppShell/AppShell.doc.mjs +11 -0
  347. package/src/AppShell/AppShell.test.tsx +139 -0
  348. package/src/AppShell/AppShell.tsx +32 -22
  349. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  350. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  351. package/src/AspectRatio/AspectRatio.tsx +13 -0
  352. package/src/Avatar/Avatar.doc.mjs +2 -13
  353. package/src/Avatar/Avatar.test.tsx +33 -8
  354. package/src/Avatar/Avatar.tsx +52 -50
  355. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  356. package/src/Banner/Banner.test.tsx +58 -1
  357. package/src/Banner/Banner.tsx +33 -11
  358. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  359. package/src/Breadcrumbs/index.ts +5 -1
  360. package/src/Button/Button.doc.mjs +2 -2
  361. package/src/Button/Button.tsx +22 -41
  362. package/src/Calendar/Calendar.tsx +2 -1
  363. package/src/Calendar/styles.ts +0 -8
  364. package/src/Carousel/Carousel.doc.mjs +3 -0
  365. package/src/Carousel/Carousel.tsx +10 -6
  366. package/src/Chat/Chat.doc.mjs +2 -0
  367. package/src/Chat/ChatDictationButton.tsx +7 -1
  368. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  369. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  370. package/src/Chat/ChatSendButton.tsx +2 -3
  371. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  372. package/src/Chat/ChatToolCalls.tsx +36 -16
  373. package/src/Chat/useTriggerMenu.tsx +2 -5
  374. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  375. package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
  376. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  377. package/src/ClickableCard/ClickableCard.tsx +6 -11
  378. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  379. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  380. package/src/CodeBlock/CodeBlock.tsx +57 -80
  381. package/src/Collapsible/Collapsible.tsx +22 -18
  382. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  383. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  384. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  385. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  386. package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
  387. package/src/ComplexSelector/ComplexSelector.tsx +41 -28
  388. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  389. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  390. package/src/ContextMenu/ContextMenu.tsx +3 -3
  391. package/src/ContextMenu/index.ts +5 -1
  392. package/src/DateInput/DateInput.doc.mjs +18 -3
  393. package/src/DateInput/DateInput.test.tsx +112 -11
  394. package/src/DateInput/DateInput.tsx +44 -25
  395. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  396. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  397. package/src/DateRangeInput/DateRangeInput.tsx +27 -21
  398. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  399. package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
  400. package/src/DateTimeInput/DateTimeInput.tsx +58 -17
  401. package/src/Dialog/Dialog.tsx +2 -9
  402. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  403. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  404. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  405. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  406. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  407. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  408. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  409. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  410. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
  411. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  412. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  413. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  414. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  415. package/src/DropdownMenu/index.ts +8 -1
  416. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  417. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  418. package/src/EmptyState/EmptyState.test.tsx +62 -0
  419. package/src/EmptyState/EmptyState.tsx +16 -6
  420. package/src/Field/Field.doc.mjs +1 -0
  421. package/src/Field/InputClearButton.test.tsx +117 -0
  422. package/src/Field/InputClearButton.tsx +30 -3
  423. package/src/FileInput/FileInput.tsx +21 -8
  424. package/src/HoverCard/useHoverCard.tsx +2 -23
  425. package/src/Icon/Icon.doc.mjs +2 -1
  426. package/src/Indicator/CheckIndicator.tsx +174 -0
  427. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  428. package/src/Indicator/Indicator.doc.mjs +344 -0
  429. package/src/Indicator/Indicator.test.tsx +393 -0
  430. package/src/Indicator/RadioIndicator.tsx +206 -0
  431. package/src/Indicator/index.ts +46 -0
  432. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  433. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  434. package/src/Indicator/indicatorRegistry.ts +120 -0
  435. package/src/Indicator/types.ts +197 -0
  436. package/src/Indicator/useIndicator.ts +39 -0
  437. package/src/Item/Item.doc.mjs +1 -1
  438. package/src/Item/Item.tsx +7 -14
  439. package/src/Layer/useLayer.doc.mjs +2 -2
  440. package/src/Layer/useLayer.test.tsx +85 -0
  441. package/src/Layer/useLayer.tsx +39 -1
  442. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  443. package/src/Lightbox/Lightbox.tsx +45 -49
  444. package/src/Link/Link.tsx +4 -11
  445. package/src/MobileNav/MobileNav.tsx +3 -3
  446. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  447. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  448. package/src/MoreMenu/MoreMenu.tsx +19 -0
  449. package/src/MultiSelector/MultiSelector.doc.mjs +16 -1
  450. package/src/MultiSelector/MultiSelector.test.tsx +259 -16
  451. package/src/MultiSelector/MultiSelector.tsx +144 -121
  452. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  453. package/src/NumberInput/NumberInput.test.tsx +726 -21
  454. package/src/NumberInput/NumberInput.tsx +353 -59
  455. package/src/Outline/Outline.tsx +2 -5
  456. package/src/Pagination/Pagination.doc.mjs +1 -1
  457. package/src/Pagination/Pagination.test.tsx +22 -7
  458. package/src/Pagination/Pagination.tsx +38 -35
  459. package/src/Popover/Popover.doc.mjs +2 -0
  460. package/src/Popover/Popover.tsx +6 -7
  461. package/src/Popover/usePopover.tsx +37 -4
  462. package/src/PowerSearch/PowerSearch.tsx +1 -1
  463. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  464. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  465. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  466. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  467. package/src/ProgressBar/ProgressBar.tsx +126 -30
  468. package/src/RadioList/RadioList.doc.mjs +4 -2
  469. package/src/RadioList/RadioListItem.tsx +31 -130
  470. package/src/Resizable/ResizeHandle.tsx +2 -9
  471. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  472. package/src/SelectableCard/SelectableCard.tsx +4 -9
  473. package/src/Selector/Selector.doc.mjs +15 -4
  474. package/src/Selector/Selector.test.tsx +1234 -98
  475. package/src/Selector/Selector.tsx +254 -126
  476. package/src/Selector/hooks.ts +77 -50
  477. package/src/SideNav/SideNav.test.tsx +46 -0
  478. package/src/SideNav/SideNav.tsx +1 -0
  479. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  480. package/src/SideNav/SideNavHeading.tsx +48 -10
  481. package/src/SideNav/SideNavItem.tsx +20 -12
  482. package/src/Slider/Slider.tsx +2 -11
  483. package/src/Stack/Stack.doc.mjs +110 -0
  484. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  485. package/src/Switch/Switch.test.tsx +32 -0
  486. package/src/Switch/Switch.tsx +18 -10
  487. package/src/TabList/Tab.tsx +2 -9
  488. package/src/TabList/TabMenu.tsx +14 -21
  489. package/src/Table/BaseTable.tsx +11 -0
  490. package/src/Table/Table.test.tsx +31 -0
  491. package/src/Table/TableRow.tsx +6 -0
  492. package/src/Table/index.ts +1 -4
  493. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  494. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  495. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  496. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  497. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  498. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  499. package/src/Table/tableContextMenu.test.tsx +27 -0
  500. package/src/Table/tableContextMenu.tsx +1 -0
  501. package/src/Table/types.ts +11 -0
  502. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  503. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  504. package/src/TextArea/TextArea.doc.mjs +42 -2
  505. package/src/TextArea/TextArea.test.tsx +219 -0
  506. package/src/TextArea/TextArea.tsx +34 -7
  507. package/src/TextInput/TextInput.doc.mjs +18 -2
  508. package/src/TextInput/TextInput.test.tsx +189 -0
  509. package/src/TextInput/TextInput.tsx +25 -31
  510. package/src/Thumbnail/Thumbnail.tsx +2 -9
  511. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  512. package/src/TimeInput/TimeInput.test.tsx +84 -3
  513. package/src/TimeInput/TimeInput.tsx +26 -28
  514. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  515. package/src/Timestamp/Timestamp.test.tsx +91 -14
  516. package/src/Timestamp/Timestamp.tsx +14 -2
  517. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  518. package/src/Timestamp/formatInstant.ts +16 -1
  519. package/src/Token/Token.tsx +5 -28
  520. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  521. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  522. package/src/Tokenizer/Tokenizer.tsx +10 -2
  523. package/src/Tooltip/useTooltip.tsx +2 -23
  524. package/src/TopNav/TopNav.tsx +1 -3
  525. package/src/TopNav/TopNavHeading.tsx +42 -13
  526. package/src/TopNav/TopNavItem.tsx +3 -21
  527. package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
  528. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  529. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  530. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  531. package/src/TopNav/TopNavMenu.tsx +34 -37
  532. package/src/TreeList/TreeList.doc.mjs +5 -0
  533. package/src/TreeList/TreeList.test.tsx +208 -8
  534. package/src/TreeList/TreeList.tsx +22 -0
  535. package/src/TreeList/TreeListBranches.tsx +25 -2
  536. package/src/TreeList/TreeListItem.tsx +89 -52
  537. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  538. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  539. package/src/Typeahead/Typeahead.test.tsx +76 -3
  540. package/src/hooks/containerReveal.stylex.ts +102 -0
  541. package/src/hooks/index.ts +4 -0
  542. package/src/hooks/useClipboard.doc.mjs +87 -0
  543. package/src/hooks/useClipboard.test.tsx +151 -0
  544. package/src/hooks/useClipboard.ts +135 -0
  545. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  546. package/src/hooks/useContainerReveal.test.tsx +42 -62
  547. package/src/hooks/useContainerReveal.ts +36 -91
  548. package/src/hooks/useImageMode.test.ts +1 -1
  549. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  550. package/src/hooks/useInputStatusIcon.tsx +8 -8
  551. package/src/hooks/useLongPress.test.tsx +18 -0
  552. package/src/hooks/useLongPress.ts +12 -2
  553. package/src/hooks/useScrollLock.test.ts +72 -0
  554. package/src/hooks/useScrollLock.ts +51 -19
  555. package/src/hooks/useStreamingText.test.ts +46 -1
  556. package/src/hooks/useStreamingText.ts +49 -7
  557. package/src/hooks/useTreeFocus.test.tsx +50 -0
  558. package/src/hooks/useTreeFocus.ts +14 -3
  559. package/src/hooks/useTypeahead.test.tsx +150 -0
  560. package/src/hooks/useTypeahead.ts +24 -9
  561. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  562. package/src/index.ts +1 -0
  563. package/src/theme/defineTheme.ts +27 -0
  564. package/src/theme/derivedVarRegistry.test.ts +21 -1
  565. package/src/theme/derivedVarRegistry.ts +19 -6
  566. package/src/theme/expandColorScale.test.ts +14 -0
  567. package/src/theme/expandColorScale.ts +24 -9
  568. package/src/theme/expandTypeScale.test.ts +43 -0
  569. package/src/theme/expandTypeScale.ts +17 -0
  570. package/src/theme/generateThemeRules.test.ts +78 -20
  571. package/src/theme/generateThemeRules.ts +11 -0
  572. package/src/theme/index.ts +15 -0
  573. package/src/theme/tokens.stylex.ts +18 -0
  574. package/src/theme/tokens.test.ts +37 -0
  575. package/src/utils/focusOutline.stylex.ts +177 -0
  576. package/src/utils/focusReturn.test.ts +42 -0
  577. package/src/utils/focusReturn.ts +31 -0
  578. package/src/utils/index.ts +5 -0
  579. package/src/utils/mergeRefs.test.ts +48 -0
  580. package/src/utils/mergeRefs.ts +12 -6
  581. package/src/utils/rtlStyles.ts +2 -2
  582. package/src/utils/themeProps.ts +26 -4
  583. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  584. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  585. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  586. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  587. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  588. package/dist/RadioList/radio.markers.stylex.js +0 -12
  589. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  590. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  591. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  592. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  593. package/src/RadioList/radio.markers.stylex.ts +0 -10
  594. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -24,12 +24,12 @@
24
24
  */
25
25
 
26
26
  import type {ReactNode} from 'react';
27
- import {useCallback, useEffect, useRef, useState} from 'react';
27
+ import {useCallback} from 'react';
28
28
  import * as stylex from '@stylexjs/stylex';
29
29
  import {HoverCard} from '../HoverCard';
30
30
  import {IconButton} from '../IconButton';
31
31
  import {Icon} from '../Icon';
32
- import {useAnnounce} from '../hooks/useAnnounce';
32
+ import {useClipboard} from '../hooks/useClipboard';
33
33
  import {useTranslator} from '../i18n';
34
34
  import {themeProps} from '../utils/themeProps';
35
35
  import {
@@ -108,7 +108,9 @@ const COPY_FEEDBACK_MS = 1500;
108
108
  * The per-row copy affordance: a compact ghost `IconButton` that writes the
109
109
  * row's value to the clipboard, flips `copy` → `check` for a moment, and
110
110
  * announces the copy to a polite live region (a swapped aria-label alone
111
- * isn't reliably announced). A clipboard rejection is a silent no-op.
111
+ * isn't reliably announced). A clipboard rejection is a silent no-op. The
112
+ * clipboard write, copied flag, reset timer, and announcement are owned by
113
+ * `useClipboard` — shared with CodeBlock's built-in copy button.
112
114
  *
113
115
  * Kept as its own component so its state/timer/effect only exist for rows that
114
116
  * actually opt into copying — read-only rows render no button and carry none
@@ -116,36 +118,14 @@ const COPY_FEEDBACK_MS = 1500;
116
118
  */
117
119
  function CopyButton({value}: {value: string}) {
118
120
  const t = useTranslator();
119
- const announce = useAnnounce();
120
- const [copied, setCopied] = useState(false);
121
- const resetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
121
+ const {copy, isCopied: copied} = useClipboard({
122
+ announce: t('@astryx.timestamp.copied'),
123
+ resetAfterMs: COPY_FEEDBACK_MS,
124
+ });
122
125
 
123
- useEffect(() => {
124
- return () => {
125
- if (resetTimerRef.current != null) {
126
- clearTimeout(resetTimerRef.current);
127
- }
128
- };
129
- }, []);
130
-
131
- const handleCopy = useCallback(async () => {
132
- try {
133
- await navigator.clipboard.writeText(value);
134
- setCopied(true);
135
- announce(t('@astryx.timestamp.copied'));
136
- // Restart the reset timer on every copy so a rapid re-copy isn't
137
- // reverted early by the previous click's timer.
138
- if (resetTimerRef.current != null) {
139
- clearTimeout(resetTimerRef.current);
140
- }
141
- resetTimerRef.current = setTimeout(() => {
142
- resetTimerRef.current = null;
143
- setCopied(false);
144
- }, COPY_FEEDBACK_MS);
145
- } catch {
146
- // Clipboard failures leave the copied state unchanged.
147
- }
148
- }, [value, announce, t]);
126
+ const handleCopy = useCallback(() => {
127
+ void copy(value);
128
+ }, [copy, value]);
149
129
 
150
130
  return (
151
131
  <IconButton
@@ -163,9 +143,7 @@ function CopyButton({value}: {value: string}) {
163
143
  ? t('@astryx.timestamp.copied')
164
144
  : t('@astryx.timestamp.copyValue', {value})
165
145
  }
166
- onClick={() => {
167
- void handleCopy();
168
- }}
146
+ onClick={handleCopy}
169
147
  {...themeProps('timestamp-copy-button')}
170
148
  />
171
149
  );
@@ -69,6 +69,16 @@ export interface FormatInstantOptions {
69
69
  * @default false
70
70
  */
71
71
  isTimezoneShown?: boolean;
72
+ /**
73
+ * How the zone name is spelled when a format carries one. `'short'` is the
74
+ * abbreviation ("PST"); `'long'` spells it out ("Pacific Standard Time").
75
+ * Only `'full'` honours it — it is the one format that always names its zone.
76
+ * The spelled-out form backs a relative timestamp's accessible name, where an
77
+ * abbreviation reads as an unexpanded initialism to a screen reader
78
+ * (WCAG 3.1.4); every visible surface keeps the abbreviation.
79
+ * @default 'short'
80
+ */
81
+ timeZoneNameStyle?: 'short' | 'long';
72
82
  }
73
83
 
74
84
  // =============================================================================
@@ -155,7 +165,11 @@ function getWallClock(date: Date, timeZone: string | undefined): WallClock {
155
165
  export function formatInstant(
156
166
  date: Date,
157
167
  format: InstantFormat,
158
- {timeZone, isTimezoneShown = false}: FormatInstantOptions = {},
168
+ {
169
+ timeZone,
170
+ isTimezoneShown = false,
171
+ timeZoneNameStyle = 'short',
172
+ }: FormatInstantOptions = {},
159
173
  ): string {
160
174
  const zone = timeZone === undefined ? {} : {timeZone};
161
175
  const zoneName = isTimezoneShown ? {timeZoneName: 'short' as const} : {};
@@ -164,6 +178,7 @@ export function formatInstant(
164
178
  case 'full':
165
179
  return new Intl.DateTimeFormat(undefined, {
166
180
  ...FULL_OPTIONS,
181
+ timeZoneName: timeZoneNameStyle,
167
182
  ...zone,
168
183
  }).format(date);
169
184
 
@@ -36,6 +36,7 @@ import {useInteractiveRole} from '../hooks/useInteractiveRole';
36
36
  import {TokenLink} from './TokenLink';
37
37
  import type {BaseProps} from '../BaseProps';
38
38
  import {themeProps} from '../utils/themeProps';
39
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
39
40
  import {useTranslator} from '../i18n';
40
41
  import type {TokenColorMap} from './index';
41
42
 
@@ -146,14 +147,6 @@ const styles = stylex.create({
146
147
  },
147
148
  ':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
148
149
  },
149
- outline: {
150
- default: null,
151
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
152
- },
153
- outlineOffset: {
154
- default: '0',
155
- ':focus-visible': '2px',
156
- },
157
150
  },
158
151
  disabled: {
159
152
  cursor: 'not-allowed',
@@ -180,16 +173,6 @@ const styles = stylex.create({
180
173
  overflow: 'hidden',
181
174
  minWidth: 0,
182
175
  },
183
- focusVisibleOutline: {
184
- outline: {
185
- default: null,
186
- ':has(:focus-visible)': `2px solid ${colorVars['--color-accent']}`,
187
- },
188
- outlineOffset: {
189
- default: '0',
190
- ':has(:focus-visible)': '2px',
191
- },
192
- },
193
176
  removeButton: {
194
177
  all: 'unset',
195
178
  display: 'inline-flex',
@@ -203,10 +186,6 @@ const styles = stylex.create({
203
186
  width: '16px',
204
187
  height: '16px',
205
188
  color: 'inherit',
206
- outline: {
207
- default: null,
208
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
209
- },
210
189
  '::after': {
211
190
  content: '""',
212
191
  position: 'absolute',
@@ -337,7 +316,7 @@ export function Token({
337
316
  onRemove(e);
338
317
  }}
339
318
  disabled={isDisabled}
340
- {...stylex.props(styles.removeButton)}>
319
+ {...focusOutlineProps.focusVisible(styles.removeButton)}>
341
320
  <Icon icon="close" size="xsm" color="inherit" />
342
321
  </button>
343
322
  );
@@ -370,7 +349,7 @@ export function Token({
370
349
  {...sharedProps}
371
350
  {...mergeProps(
372
351
  themeProps('token', {color, size}),
373
- stylex.props(
352
+ focusOutlineProps.focusVisible(
374
353
  styles.base,
375
354
  sizeStyles[size],
376
355
  colorStyles[color],
@@ -415,12 +394,11 @@ export function Token({
415
394
  {...sharedProps}
416
395
  {...mergeProps(
417
396
  themeProps('token', {color, size}),
418
- stylex.props(
397
+ focusOutlineProps.focusWithin(
419
398
  styles.base,
420
399
  sizeStyles[size],
421
400
  colorStyles[color],
422
401
  styles.interactive,
423
- styles.focusVisibleOutline,
424
402
  isDisabled && styles.disabled,
425
403
  xstyle,
426
404
  ),
@@ -447,12 +425,11 @@ export function Token({
447
425
  {...sharedProps}
448
426
  {...mergeProps(
449
427
  themeProps('token', {color, size}),
450
- stylex.props(
428
+ focusOutlineProps.focusWithin(
451
429
  styles.base,
452
430
  sizeStyles[size],
453
431
  colorStyles[color],
454
432
  styles.interactive,
455
- styles.focusVisibleOutline,
456
433
  isDisabled && styles.disabled,
457
434
  xstyle,
458
435
  ),
@@ -210,7 +210,7 @@ export const docs = {
210
210
  ],
211
211
  theming: {
212
212
  targets: [
213
- {className: 'astryx-tokenizer', visualProps: ['size', 'status']},
213
+ {className: 'astryx-tokenizer', visualProps: ['size', 'status'], states: ['disabled']},
214
214
  ],
215
215
  },
216
216
  usage: {
@@ -424,7 +424,7 @@ export const docsZh = {
424
424
  ],
425
425
  theming: {
426
426
  targets: [
427
- {className: 'astryx-tokenizer', visualProps: ['size', 'status']},
427
+ {className: 'astryx-tokenizer', visualProps: ['size', 'status'], states: ['disabled']},
428
428
  ],
429
429
  },
430
430
  usage: {
@@ -1137,11 +1137,16 @@ describe('Tokenizer', () => {
1137
1137
  });
1138
1138
  });
1139
1139
 
1140
-
1141
1140
  describe('Tokenizer statusVariant forwarding', () => {
1142
1141
  it('defaults to attached (status renders with data-variant="attached")', () => {
1143
1142
  const {container} = render(
1144
- <Tokenizer label="Members" searchSource={userSource} value={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} />,
1143
+ <Tokenizer
1144
+ label="Members"
1145
+ searchSource={userSource}
1146
+ value={[]}
1147
+ onChange={() => {}}
1148
+ status={{type: 'error', message: 'Required'}}
1149
+ />,
1145
1150
  );
1146
1151
  expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
1147
1152
  'data-variant',
@@ -1151,7 +1156,14 @@ describe('Tokenizer statusVariant forwarding', () => {
1151
1156
 
1152
1157
  it('forwards statusVariant="detached" to the underlying Field status', () => {
1153
1158
  const {container} = render(
1154
- <Tokenizer label="Members" searchSource={userSource} value={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} statusVariant="detached" />,
1159
+ <Tokenizer
1160
+ label="Members"
1161
+ searchSource={userSource}
1162
+ value={[]}
1163
+ onChange={() => {}}
1164
+ status={{type: 'error', message: 'Required'}}
1165
+ statusVariant="detached"
1166
+ />,
1155
1167
  );
1156
1168
  expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
1157
1169
  'data-variant',
@@ -1159,3 +1171,33 @@ describe('Tokenizer statusVariant forwarding', () => {
1159
1171
  );
1160
1172
  });
1161
1173
  });
1174
+
1175
+ describe('Tokenizer disabled theme state', () => {
1176
+ it('reflects disabled on the root target so themes can gate paint on it', () => {
1177
+ const {container} = render(
1178
+ <Tokenizer
1179
+ label="Members"
1180
+ searchSource={userSource}
1181
+ value={[]}
1182
+ onChange={() => {}}
1183
+ isDisabled
1184
+ />,
1185
+ );
1186
+ const root = container.querySelector('.astryx-tokenizer');
1187
+ expect(root).toHaveAttribute('data-disabled', 'disabled');
1188
+ expect(root).toHaveClass('disabled');
1189
+ });
1190
+
1191
+ it('omits data-disabled when enabled, like status does', () => {
1192
+ const {container} = render(
1193
+ <Tokenizer
1194
+ label="Members"
1195
+ searchSource={userSource}
1196
+ value={[]}
1197
+ onChange={() => {}}
1198
+ />,
1199
+ );
1200
+ const root = container.querySelector('.astryx-tokenizer');
1201
+ expect(root).not.toHaveAttribute('data-disabled');
1202
+ });
1203
+ });
@@ -730,7 +730,11 @@ export function Tokenizer<T extends SearchableItem>({
730
730
  onBlurCapture={handleBlurCapture}
731
731
  data-testid={testId}
732
732
  {...mergeProps(
733
- themeProps('tokenizer', {size, status: status?.type}),
733
+ themeProps('tokenizer', {
734
+ size,
735
+ status: status?.type,
736
+ disabled: isDisabled ? 'disabled' : null,
737
+ }),
734
738
  stylex.props(
735
739
  inputWrapperStyles.base,
736
740
  styles.wrapper,
@@ -828,7 +832,11 @@ export function Tokenizer<T extends SearchableItem>({
828
832
  ref={placeholderRef}
829
833
  onClick={handleWrapperClick}
830
834
  {...mergeProps(
831
- themeProps('tokenizer', {size, status: status?.type}),
835
+ themeProps('tokenizer', {
836
+ size,
837
+ status: status?.type,
838
+ disabled: isDisabled ? 'disabled' : null,
839
+ }),
832
840
  stylex.props(
833
841
  inputWrapperStyles.base,
834
842
  styles.wrapper,
@@ -15,7 +15,6 @@
15
15
  import {
16
16
  useCallback,
17
17
  useEffect,
18
- useMemo,
19
18
  useRef,
20
19
  type ReactNode,
21
20
  type RefCallback,
@@ -57,18 +56,6 @@ const styles = stylex.create({
57
56
  lineHeight: typeScaleVars['--text-body-leading'],
58
57
  },
59
58
  // Position-based margin styles
60
- marginBlock: {
61
- marginBlockStart: spacingVars['--spacing-1'],
62
- marginBlockEnd: spacingVars['--spacing-1'],
63
- marginInlineStart: 0,
64
- marginInlineEnd: 0,
65
- },
66
- marginInline: {
67
- marginBlockStart: 0,
68
- marginBlockEnd: 0,
69
- marginInlineStart: spacingVars['--spacing-1'],
70
- marginInlineEnd: spacingVars['--spacing-1'],
71
- },
72
59
  // Content wrapper for padding
73
60
  content: {
74
61
  paddingBlockStart: spacingVars['--spacing-1'],
@@ -261,22 +248,13 @@ export function useTooltip(options: TooltipOptions = {}): TooltipReturn {
261
248
  onHide,
262
249
  } = options;
263
250
 
264
- // Select margin style based on placement axis
265
- const marginStyle =
266
- placement === 'above' || placement === 'below'
267
- ? styles.marginBlock
268
- : styles.marginInline;
269
-
270
251
  const layer = useLayer({
271
252
  mode: 'context',
272
253
  onShow,
273
254
  onHide,
274
255
  });
275
256
 
276
- const popoverXstyle = useMemo(
277
- () => [styles.container, marginStyle],
278
- [marginStyle],
279
- );
257
+ const popoverXstyle = styles.container;
280
258
 
281
259
  const showTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
282
260
  const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
@@ -498,6 +476,7 @@ export function useTooltip(options: TooltipOptions = {}): TooltipReturn {
498
476
  const renderProps = {
499
477
  placement: renderPlacement,
500
478
  alignment: props?.alignment ?? alignment,
479
+ offset: spacingVars['--spacing-1'],
501
480
  role: 'tooltip',
502
481
  xstyle: [popoverXstyle, layerAnimations[renderPlacement]],
503
482
  className: themeProps('tooltip').className,
@@ -243,9 +243,7 @@ export function TopNav({
243
243
  </div>
244
244
  )}
245
245
  {hasCollapsibleContent && mobileContent && (
246
- <div {...stylex.props(styles.drawerDivider)}>
247
- <Divider />
248
- </div>
246
+ <Divider xstyle={styles.drawerDivider} />
249
247
  )}
250
248
  {mobileContent && (
251
249
  <div {...stylex.props(styles.drawerExtraContent)}>
@@ -31,7 +31,7 @@ import {
31
31
  } from '../theme/tokens.stylex';
32
32
  import {usePopover} from '../Popover/usePopover';
33
33
  import {Link} from '../Link';
34
- import {useIcon} from '../Icon';
34
+ import {Icon} from '../Icon';
35
35
  import {useLinkComponent} from '../Link/useLinkComponent';
36
36
  import type {LinkComponentType} from '../Link/types';
37
37
  import {mergeProps, mergeRefs} from '../utils';
@@ -149,6 +149,16 @@ const styles = stylex.create({
149
149
  minHeight: spacingVars['--spacing-7'],
150
150
  color: colorVars['--color-icon-secondary'],
151
151
  },
152
+ // The registry chevron is a 1em SVG, so it has always rendered at the
153
+ // heading's inherited font size. Icon's size box would repin it to a fixed
154
+ // rem (the nearest, sm, is 1rem = 16px vs the 14px base here), so hold the
155
+ // glyph on the inherited em — the 28px chevron box above is unchanged, and
156
+ // the glyph keeps tracking the surrounding text.
157
+ chevronGlyph: {
158
+ width: '1em',
159
+ height: '1em',
160
+ fontSize: 'inherit',
161
+ },
152
162
  headerEndContent: {
153
163
  flexShrink: 0,
154
164
  display: 'flex',
@@ -182,14 +192,9 @@ const styles = stylex.create({
182
192
  marginInline: spacingVars['--spacing-1'],
183
193
  cursor: 'pointer',
184
194
  },
195
+ // Composes over `chevron` — the flipped popover copy differs only by the
196
+ // rotation, so it carries just that.
185
197
  popoverChevron: {
186
- flexShrink: 0,
187
- display: 'flex',
188
- alignItems: 'center',
189
- justifyContent: 'center',
190
- minWidth: spacingVars['--spacing-7'],
191
- minHeight: spacingVars['--spacing-7'],
192
- color: colorVars['--color-icon-secondary'],
193
198
  transform: 'rotate(180deg)',
194
199
  },
195
200
  popover: {
@@ -313,7 +318,6 @@ export function TopNavHeading({
313
318
  ...props
314
319
  }: TopNavHeadingProps) {
315
320
  const t = useTranslator();
316
- const chevronDownIcon = useIcon('chevronDown');
317
321
  const LinkComponent = useLinkComponent(as);
318
322
  // When the logo is wrapped in a link it needs its own accessible name (the
319
323
  // logo image itself is decorative). Prefer an explicit logoLabel, fall back
@@ -404,7 +408,12 @@ export function TopNavHeading({
404
408
  );
405
409
 
406
410
  const chevronElement = showChevron && (
407
- <span {...stylex.props(styles.chevron)}>{chevronDownIcon}</span>
411
+ <Icon
412
+ icon="chevronDown"
413
+ size="sm"
414
+ color="secondary"
415
+ xstyle={[styles.chevron, styles.chevronGlyph]}
416
+ />
408
417
  );
409
418
 
410
419
  const headerEndContentElement = headerEndContent && (
@@ -420,7 +429,12 @@ export function TopNavHeading({
420
429
  onClick={triggerProps.onClick}>
421
430
  {logo && <span {...stylex.props(styles.logo)}>{logo}</span>}
422
431
  {renderTextContent(
423
- <span {...stylex.props(styles.popoverChevron)}>{chevronDownIcon}</span>,
432
+ <Icon
433
+ icon="chevronDown"
434
+ size="sm"
435
+ color="secondary"
436
+ xstyle={[styles.chevron, styles.chevronGlyph, styles.popoverChevron]}
437
+ />,
424
438
  )}
425
439
  </button>
426
440
  );
@@ -488,6 +502,8 @@ export function TopNavHeading({
488
502
  )}>
489
503
  {logo && <span {...stylex.props(styles.logo)}>{logo}</span>}
490
504
  {renderTextContent(
505
+ // Stays a <button>: this box is the popover trigger, so it carries
506
+ // the accessible name and handlers — only the glyph moves to Icon.
491
507
  <button
492
508
  type="button"
493
509
  aria-label={t('@astryx.topNav.heading.openMenu')}
@@ -497,7 +513,12 @@ export function TopNavHeading({
497
513
  }}
498
514
  {...popover.triggerProps}
499
515
  {...stylex.props(styles.chevron, styles.interactive)}>
500
- {chevronDownIcon}
516
+ <Icon
517
+ icon="chevronDown"
518
+ size="sm"
519
+ color="inherit"
520
+ xstyle={styles.chevronGlyph}
521
+ />
501
522
  </button>,
502
523
  )}
503
524
  {headerEndContentElement}
@@ -557,6 +578,9 @@ export function TopNavHeading({
557
578
  ))}
558
579
  {renderTextContent(
559
580
  showChevron ? (
581
+ // Stays a <button>: this box is the popover trigger, so it
582
+ // carries the accessible name and handlers — only the glyph
583
+ // moves to Icon.
560
584
  <button
561
585
  type="button"
562
586
  aria-label={t('@astryx.topNav.heading.openMenu')}
@@ -566,7 +590,12 @@ export function TopNavHeading({
566
590
  }}
567
591
  {...popover.triggerProps}
568
592
  {...stylex.props(styles.chevron, styles.interactive)}>
569
- {chevronDownIcon}
593
+ <Icon
594
+ icon="chevronDown"
595
+ size="sm"
596
+ color="inherit"
597
+ xstyle={styles.chevronGlyph}
598
+ />
570
599
  </button>
571
600
  ) : undefined,
572
601
  )}
@@ -35,6 +35,7 @@ import {navItemStyles, type NavItemSize} from '../NavItem/navItemStyles.stylex';
35
35
  import {mergeProps} from '../utils';
36
36
  import {useAppShellMobile} from '../AppShell/AppShellMobileContext';
37
37
  import {themeProps} from '../utils/themeProps';
38
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
38
39
 
39
40
  /**
40
41
  * NavItem styles with hover/selected states
@@ -63,14 +64,6 @@ const styles = stylex.create({
63
64
  },
64
65
  ':active': colorVars['--color-overlay-pressed'],
65
66
  },
66
- outline: {
67
- default: null,
68
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
69
- },
70
- outlineOffset: {
71
- default: '0',
72
- ':focus-visible': '2px',
73
- },
74
67
  },
75
68
  selected: {
76
69
  color: colorVars['--color-text-primary'],
@@ -87,16 +80,6 @@ const styles = stylex.create({
87
80
  paddingInline: spacingVars['--spacing-2'],
88
81
  },
89
82
  // Drawer mode — focus outline (base item + selected come from navItemStyles)
90
- drawerFocus: {
91
- outline: {
92
- default: null,
93
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
94
- },
95
- outlineOffset: {
96
- default: '0',
97
- ':focus-visible': '2px',
98
- },
99
- },
100
83
  });
101
84
 
102
85
  export interface TopNavItemProps extends BaseProps<HTMLAnchorElement> {
@@ -246,10 +229,9 @@ export function TopNavItem({
246
229
  mode: 'drawer',
247
230
  selected: isSelected ? 'selected' : null,
248
231
  }),
249
- stylex.props(
232
+ focusOutlineProps.focusVisible(
250
233
  navItemStyles.item,
251
234
  navItemStyles[size],
252
- styles.drawerFocus,
253
235
  isSelected && navItemStyles.selected,
254
236
  isDisabled && navItemStyles.disabled,
255
237
  xstyle,
@@ -283,7 +265,7 @@ export function TopNavItem({
283
265
  themeProps('top-nav-item', {
284
266
  selected: isSelected ? 'selected' : null,
285
267
  }),
286
- stylex.props(
268
+ focusOutlineProps.focusVisible(
287
269
  styles.base,
288
270
  isSelected && styles.selected,
289
271
  isDisabled && navItemStyles.disabled,
@@ -7,6 +7,11 @@ export const docs = {
7
7
  subComponentOf: 'TopNav',
8
8
  displayName: 'Top Nav Mega Menu',
9
9
  description: 'Navigation item that displays a full-width mega menu panel on hover. Uses a slots API with items and featured props. TopNavMegaMenuItem renders itself in both desktop and mobile drawer modes. Supports inline collapsible drawer via render mode context.',
10
+ // The panel anchors to the nearest <nav>; wrap the preview in a TopNav so
11
+ // it opens below the bar instead of pinning to the viewport corner (#4905).
12
+ playground: {
13
+ wrapper: {component: 'TopNav'},
14
+ },
10
15
  props: [
11
16
  {
12
17
  name: 'label',