@astryxdesign/core 0.3.0 → 0.4.0

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 (551) 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.map +1 -1
  16. package/dist/Banner/Banner.js +15 -14
  17. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  18. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  19. package/dist/Breadcrumbs/index.d.ts +2 -1
  20. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  21. package/dist/Breadcrumbs/index.js +1 -0
  22. package/dist/Button/Button.d.ts.map +1 -1
  23. package/dist/Button/Button.js +11 -15
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +2 -1
  26. package/dist/Calendar/styles.d.ts +0 -2
  27. package/dist/Calendar/styles.d.ts.map +1 -1
  28. package/dist/Calendar/styles.js +0 -2
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +8 -12
  31. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  32. package/dist/Chat/ChatDictationButton.js +2 -1
  33. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  34. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  35. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  36. package/dist/Chat/ChatSendButton.js +4 -3
  37. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  38. package/dist/Chat/ChatToolCalls.js +17 -17
  39. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  40. package/dist/Chat/useTriggerMenu.js +2 -6
  41. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  43. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  44. package/dist/ClickableCard/ClickableCard.js +3 -11
  45. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  46. package/dist/CodeBlock/CodeBlock.js +84 -67
  47. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  48. package/dist/Collapsible/Collapsible.js +35 -15
  49. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  52. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  53. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  54. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.js +35 -33
  56. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  57. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  58. package/dist/ContextMenu/ContextMenu.js +1 -1
  59. package/dist/ContextMenu/index.d.ts +2 -1
  60. package/dist/ContextMenu/index.d.ts.map +1 -1
  61. package/dist/ContextMenu/index.js +1 -0
  62. package/dist/DateInput/DateInput.d.ts +9 -2
  63. package/dist/DateInput/DateInput.d.ts.map +1 -1
  64. package/dist/DateInput/DateInput.js +24 -23
  65. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  66. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  67. package/dist/DateRangeInput/DateRangeInput.js +11 -16
  68. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  69. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  70. package/dist/DateTimeInput/DateTimeInput.js +22 -17
  71. package/dist/Dialog/Dialog.d.ts.map +1 -1
  72. package/dist/Dialog/Dialog.js +4 -4
  73. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  74. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  75. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  76. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  77. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  78. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  79. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  80. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  81. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  82. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  83. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  84. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  85. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  86. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  87. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  88. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  89. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  90. package/dist/DropdownMenu/index.d.ts +2 -1
  91. package/dist/DropdownMenu/index.d.ts.map +1 -1
  92. package/dist/DropdownMenu/index.js +4 -0
  93. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  94. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  95. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  96. package/dist/EmptyState/EmptyState.js +9 -5
  97. package/dist/Field/InputClearButton.d.ts +16 -3
  98. package/dist/Field/InputClearButton.d.ts.map +1 -1
  99. package/dist/Field/InputClearButton.js +15 -4
  100. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  101. package/dist/HoverCard/useHoverCard.js +3 -19
  102. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  103. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  104. package/dist/Indicator/CheckIndicator.js +155 -0
  105. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  106. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  107. package/dist/Indicator/CheckboxIndicator.js +173 -0
  108. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  109. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  110. package/dist/Indicator/RadioIndicator.js +137 -0
  111. package/dist/Indicator/index.d.ts +24 -0
  112. package/dist/Indicator/index.d.ts.map +1 -0
  113. package/dist/Indicator/index.js +26 -0
  114. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  115. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  116. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  117. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  118. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  119. package/dist/Indicator/indicatorRegistry.js +93 -0
  120. package/dist/Indicator/types.d.ts +167 -0
  121. package/dist/Indicator/types.d.ts.map +1 -0
  122. package/dist/Indicator/types.js +1 -0
  123. package/dist/Indicator/useIndicator.d.ts +18 -0
  124. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  125. package/dist/Indicator/useIndicator.js +30 -0
  126. package/dist/Item/Item.d.ts.map +1 -1
  127. package/dist/Item/Item.js +4 -8
  128. package/dist/Layer/useLayer.d.ts +14 -0
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +25 -2
  131. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  132. package/dist/Lightbox/Lightbox.js +56 -53
  133. package/dist/Link/Link.d.ts.map +1 -1
  134. package/dist/Link/Link.js +4 -5
  135. package/dist/MobileNav/MobileNav.js +8 -8
  136. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  137. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  138. package/dist/MoreMenu/MoreMenu.js +4 -0
  139. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  140. package/dist/MultiSelector/MultiSelector.js +78 -75
  141. package/dist/NumberInput/NumberInput.d.ts +27 -1
  142. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  143. package/dist/NumberInput/NumberInput.js +230 -42
  144. package/dist/Outline/Outline.d.ts.map +1 -1
  145. package/dist/Outline/Outline.js +2 -3
  146. package/dist/Pagination/Pagination.d.ts.map +1 -1
  147. package/dist/Pagination/Pagination.js +61 -63
  148. package/dist/Popover/Popover.d.ts.map +1 -1
  149. package/dist/Popover/Popover.js +6 -8
  150. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  151. package/dist/PowerSearch/PowerSearch.js +1 -1
  152. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  153. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  154. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  155. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  156. package/dist/ProgressBar/ProgressBar.js +96 -6
  157. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  158. package/dist/RadioList/RadioListItem.js +29 -84
  159. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  160. package/dist/Resizable/ResizeHandle.js +2 -3
  161. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  162. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  163. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  164. package/dist/SelectableCard/SelectableCard.js +3 -11
  165. package/dist/Selector/Selector.d.ts +2 -1
  166. package/dist/Selector/Selector.d.ts.map +1 -1
  167. package/dist/Selector/Selector.js +164 -94
  168. package/dist/Selector/hooks.d.ts +18 -6
  169. package/dist/Selector/hooks.d.ts.map +1 -1
  170. package/dist/Selector/hooks.js +57 -40
  171. package/dist/SideNav/SideNav.d.ts.map +1 -1
  172. package/dist/SideNav/SideNav.js +1 -1
  173. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  174. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  175. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  176. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  177. package/dist/SideNav/SideNavHeading.js +56 -20
  178. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  179. package/dist/SideNav/SideNavItem.js +28 -22
  180. package/dist/Stack/stack.stylex.d.ts +3 -3
  181. package/dist/Switch/Switch.js +11 -10
  182. package/dist/TabList/Tab.d.ts.map +1 -1
  183. package/dist/TabList/Tab.js +2 -3
  184. package/dist/TabList/TabMenu.d.ts.map +1 -1
  185. package/dist/TabList/TabMenu.js +41 -19
  186. package/dist/Table/BaseTable.d.ts.map +1 -1
  187. package/dist/Table/BaseTable.js +8 -0
  188. package/dist/Table/index.d.ts +1 -1
  189. package/dist/Table/index.d.ts.map +1 -1
  190. package/dist/Table/index.js +1 -1
  191. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  192. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  193. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  194. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  195. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  196. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  197. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  198. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  199. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  200. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  201. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  202. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  203. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  204. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  205. package/dist/Table/tableContextMenu.js +2 -1
  206. package/dist/Table/types.d.ts +11 -0
  207. package/dist/Table/types.d.ts.map +1 -1
  208. package/dist/TextArea/TextArea.d.ts +10 -1
  209. package/dist/TextArea/TextArea.d.ts.map +1 -1
  210. package/dist/TextArea/TextArea.js +16 -6
  211. package/dist/TextInput/TextInput.d.ts +10 -1
  212. package/dist/TextInput/TextInput.d.ts.map +1 -1
  213. package/dist/TextInput/TextInput.js +13 -19
  214. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  215. package/dist/Thumbnail/Thumbnail.js +32 -26
  216. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  217. package/dist/TimeInput/TimeInput.js +7 -15
  218. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  219. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  220. package/dist/Token/Token.d.ts.map +1 -1
  221. package/dist/Token/Token.js +20 -11
  222. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  223. package/dist/Tokenizer/Tokenizer.js +4 -2
  224. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  225. package/dist/Tooltip/useTooltip.js +3 -19
  226. package/dist/TopNav/TopNav.d.ts.map +1 -1
  227. package/dist/TopNav/TopNav.js +6 -5
  228. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  229. package/dist/TopNav/TopNavHeading.js +54 -16
  230. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  231. package/dist/TopNav/TopNavItem.js +3 -9
  232. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  233. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  234. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  235. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  236. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  237. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  238. package/dist/TopNav/TopNavMenu.js +83 -38
  239. package/dist/TreeList/TreeList.d.ts.map +1 -1
  240. package/dist/TreeList/TreeList.js +13 -0
  241. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  242. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  243. package/dist/TreeList/TreeListBranches.js +14 -4
  244. package/dist/TreeList/TreeListItem.d.ts +11 -1
  245. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  246. package/dist/TreeList/TreeListItem.js +57 -30
  247. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  248. package/dist/Typeahead/BaseTypeahead.js +16 -8
  249. package/dist/astryx.css +74 -85
  250. package/dist/astryx.umd.js +56 -56
  251. package/dist/astryx.umd.js.map +4 -4
  252. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  253. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  254. package/dist/hooks/containerReveal.stylex.js +63 -0
  255. package/dist/hooks/index.d.ts +3 -0
  256. package/dist/hooks/index.d.ts.map +1 -1
  257. package/dist/hooks/index.js +2 -0
  258. package/dist/hooks/useClipboard.d.ts +59 -0
  259. package/dist/hooks/useClipboard.d.ts.map +1 -0
  260. package/dist/hooks/useClipboard.js +106 -0
  261. package/dist/hooks/useContainerReveal.d.ts +14 -8
  262. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  263. package/dist/hooks/useContainerReveal.js +28 -69
  264. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  265. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  266. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  267. package/dist/hooks/useLongPress.d.ts.map +1 -1
  268. package/dist/hooks/useLongPress.js +12 -2
  269. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  270. package/dist/hooks/useScrollLock.js +33 -18
  271. package/dist/hooks/useStreamingText.d.ts +18 -3
  272. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  273. package/dist/hooks/useStreamingText.js +47 -7
  274. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  275. package/dist/hooks/useTreeFocus.js +9 -3
  276. package/dist/hooks/useTypeahead.d.ts +3 -2
  277. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  278. package/dist/hooks/useTypeahead.js +19 -7
  279. package/dist/index.d.ts +1 -0
  280. package/dist/index.d.ts.map +1 -1
  281. package/dist/index.js +1 -0
  282. package/dist/theme/defineTheme.d.ts +16 -0
  283. package/dist/theme/defineTheme.d.ts.map +1 -1
  284. package/dist/theme/defineTheme.js +8 -0
  285. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  286. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  287. package/dist/theme/derivedVarRegistry.js +14 -13
  288. package/dist/theme/expandColorScale.d.ts +3 -1
  289. package/dist/theme/expandColorScale.d.ts.map +1 -1
  290. package/dist/theme/expandColorScale.js +17 -7
  291. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  292. package/dist/theme/expandTypeScale.js +17 -0
  293. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  294. package/dist/theme/generateThemeRules.js +11 -0
  295. package/dist/theme/index.d.ts +1 -0
  296. package/dist/theme/index.d.ts.map +1 -1
  297. package/dist/utils/focusOutline.stylex.d.ts +107 -0
  298. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  299. package/dist/utils/focusOutline.stylex.js +130 -0
  300. package/dist/utils/focusReturn.d.ts +24 -0
  301. package/dist/utils/focusReturn.d.ts.map +1 -0
  302. package/dist/utils/focusReturn.js +29 -0
  303. package/dist/utils/index.d.ts +1 -0
  304. package/dist/utils/index.d.ts.map +1 -1
  305. package/dist/utils/index.js +1 -0
  306. package/dist/utils/mergeRefs.d.ts.map +1 -1
  307. package/dist/utils/mergeRefs.js +7 -5
  308. package/dist/utils/rtlStyles.d.ts +2 -2
  309. package/dist/utils/rtlStyles.js +2 -2
  310. package/dist/utils/themeProps.d.ts +20 -1
  311. package/dist/utils/themeProps.d.ts.map +1 -1
  312. package/dist/utils/themeProps.js +8 -2
  313. package/locales/en.json +12 -0
  314. package/locales/pseudo.json +9 -0
  315. package/package.json +7 -2
  316. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  317. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  318. package/src/AlertDialog/AlertDialog.tsx +21 -3
  319. package/src/AppShell/AppShell.doc.mjs +11 -0
  320. package/src/AppShell/AppShell.test.tsx +139 -0
  321. package/src/AppShell/AppShell.tsx +32 -22
  322. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  323. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  324. package/src/AspectRatio/AspectRatio.tsx +13 -0
  325. package/src/Avatar/Avatar.doc.mjs +2 -13
  326. package/src/Avatar/Avatar.test.tsx +33 -8
  327. package/src/Avatar/Avatar.tsx +52 -50
  328. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  329. package/src/Banner/Banner.tsx +9 -6
  330. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  331. package/src/Breadcrumbs/index.ts +5 -1
  332. package/src/Button/Button.tsx +21 -41
  333. package/src/Calendar/Calendar.tsx +2 -1
  334. package/src/Calendar/styles.ts +0 -8
  335. package/src/Carousel/Carousel.doc.mjs +3 -0
  336. package/src/Carousel/Carousel.tsx +10 -6
  337. package/src/Chat/Chat.doc.mjs +2 -0
  338. package/src/Chat/ChatDictationButton.tsx +7 -1
  339. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  340. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  341. package/src/Chat/ChatSendButton.tsx +2 -3
  342. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  343. package/src/Chat/ChatToolCalls.tsx +36 -16
  344. package/src/Chat/useTriggerMenu.tsx +2 -5
  345. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  346. package/src/CheckboxInput/CheckboxInput.test.tsx +115 -0
  347. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  348. package/src/ClickableCard/ClickableCard.tsx +6 -11
  349. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  350. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  351. package/src/CodeBlock/CodeBlock.tsx +57 -80
  352. package/src/Collapsible/Collapsible.tsx +22 -18
  353. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  354. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  355. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  356. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  357. package/src/ComplexSelector/ComplexSelector.test.tsx +64 -0
  358. package/src/ComplexSelector/ComplexSelector.tsx +46 -29
  359. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  360. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  361. package/src/ContextMenu/ContextMenu.tsx +3 -3
  362. package/src/ContextMenu/index.ts +5 -1
  363. package/src/DateInput/DateInput.doc.mjs +18 -3
  364. package/src/DateInput/DateInput.test.tsx +93 -11
  365. package/src/DateInput/DateInput.tsx +41 -19
  366. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  367. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  368. package/src/DateRangeInput/DateRangeInput.tsx +24 -12
  369. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  370. package/src/DateTimeInput/DateTimeInput.test.tsx +75 -0
  371. package/src/DateTimeInput/DateTimeInput.tsx +35 -8
  372. package/src/Dialog/Dialog.tsx +2 -9
  373. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  374. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  375. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  376. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  377. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  378. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  379. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  380. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  381. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  382. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  383. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  384. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  385. package/src/DropdownMenu/index.ts +8 -1
  386. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  387. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  388. package/src/EmptyState/EmptyState.test.tsx +62 -0
  389. package/src/EmptyState/EmptyState.tsx +16 -6
  390. package/src/Field/Field.doc.mjs +1 -0
  391. package/src/Field/InputClearButton.test.tsx +117 -0
  392. package/src/Field/InputClearButton.tsx +30 -3
  393. package/src/HoverCard/useHoverCard.tsx +2 -23
  394. package/src/Icon/Icon.doc.mjs +2 -1
  395. package/src/Indicator/CheckIndicator.tsx +174 -0
  396. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  397. package/src/Indicator/Indicator.doc.mjs +344 -0
  398. package/src/Indicator/Indicator.test.tsx +393 -0
  399. package/src/Indicator/RadioIndicator.tsx +206 -0
  400. package/src/Indicator/index.ts +45 -0
  401. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  402. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  403. package/src/Indicator/indicatorRegistry.ts +120 -0
  404. package/src/Indicator/types.ts +186 -0
  405. package/src/Indicator/useIndicator.ts +39 -0
  406. package/src/Item/Item.doc.mjs +1 -1
  407. package/src/Item/Item.tsx +7 -14
  408. package/src/Layer/useLayer.doc.mjs +2 -2
  409. package/src/Layer/useLayer.test.tsx +85 -0
  410. package/src/Layer/useLayer.tsx +39 -1
  411. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  412. package/src/Lightbox/Lightbox.tsx +43 -38
  413. package/src/Link/Link.tsx +4 -11
  414. package/src/MobileNav/MobileNav.tsx +3 -3
  415. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  416. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  417. package/src/MoreMenu/MoreMenu.tsx +19 -0
  418. package/src/MultiSelector/MultiSelector.doc.mjs +9 -1
  419. package/src/MultiSelector/MultiSelector.test.tsx +255 -16
  420. package/src/MultiSelector/MultiSelector.tsx +103 -99
  421. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  422. package/src/NumberInput/NumberInput.test.tsx +726 -21
  423. package/src/NumberInput/NumberInput.tsx +353 -59
  424. package/src/Outline/Outline.tsx +2 -5
  425. package/src/Pagination/Pagination.doc.mjs +1 -1
  426. package/src/Pagination/Pagination.test.tsx +22 -7
  427. package/src/Pagination/Pagination.tsx +38 -35
  428. package/src/Popover/Popover.tsx +6 -7
  429. package/src/PowerSearch/PowerSearch.tsx +1 -1
  430. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  431. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  432. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  433. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  434. package/src/ProgressBar/ProgressBar.tsx +124 -22
  435. package/src/RadioList/RadioList.doc.mjs +4 -2
  436. package/src/RadioList/RadioListItem.tsx +31 -130
  437. package/src/Resizable/ResizeHandle.tsx +2 -9
  438. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  439. package/src/SelectableCard/SelectableCard.tsx +4 -9
  440. package/src/Selector/Selector.doc.mjs +7 -4
  441. package/src/Selector/Selector.test.tsx +935 -25
  442. package/src/Selector/Selector.tsx +189 -106
  443. package/src/Selector/hooks.ts +77 -50
  444. package/src/SideNav/SideNav.test.tsx +46 -0
  445. package/src/SideNav/SideNav.tsx +1 -0
  446. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  447. package/src/SideNav/SideNavHeading.tsx +48 -10
  448. package/src/SideNav/SideNavItem.tsx +20 -12
  449. package/src/Stack/Stack.doc.mjs +110 -0
  450. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  451. package/src/Switch/Switch.test.tsx +32 -0
  452. package/src/Switch/Switch.tsx +8 -8
  453. package/src/TabList/Tab.tsx +2 -9
  454. package/src/TabList/TabMenu.tsx +14 -21
  455. package/src/Table/BaseTable.tsx +11 -0
  456. package/src/Table/index.ts +1 -4
  457. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  458. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  459. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  460. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  461. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  462. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  463. package/src/Table/tableContextMenu.test.tsx +27 -0
  464. package/src/Table/tableContextMenu.tsx +1 -0
  465. package/src/Table/types.ts +11 -0
  466. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  467. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  468. package/src/TextArea/TextArea.doc.mjs +42 -2
  469. package/src/TextArea/TextArea.test.tsx +219 -0
  470. package/src/TextArea/TextArea.tsx +34 -7
  471. package/src/TextInput/TextInput.doc.mjs +18 -2
  472. package/src/TextInput/TextInput.test.tsx +189 -0
  473. package/src/TextInput/TextInput.tsx +25 -31
  474. package/src/Thumbnail/Thumbnail.tsx +2 -9
  475. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  476. package/src/TimeInput/TimeInput.test.tsx +30 -3
  477. package/src/TimeInput/TimeInput.tsx +9 -26
  478. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  479. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  480. package/src/Token/Token.tsx +5 -28
  481. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  482. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  483. package/src/Tokenizer/Tokenizer.tsx +10 -2
  484. package/src/Tooltip/useTooltip.tsx +2 -23
  485. package/src/TopNav/TopNav.tsx +1 -3
  486. package/src/TopNav/TopNavHeading.tsx +42 -13
  487. package/src/TopNav/TopNavItem.tsx +3 -21
  488. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  489. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  490. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  491. package/src/TopNav/TopNavMenu.tsx +34 -37
  492. package/src/TreeList/TreeList.doc.mjs +5 -0
  493. package/src/TreeList/TreeList.test.tsx +206 -7
  494. package/src/TreeList/TreeList.tsx +22 -0
  495. package/src/TreeList/TreeListBranches.tsx +25 -2
  496. package/src/TreeList/TreeListItem.tsx +89 -52
  497. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  498. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  499. package/src/Typeahead/Typeahead.test.tsx +76 -3
  500. package/src/hooks/containerReveal.stylex.ts +102 -0
  501. package/src/hooks/index.ts +4 -0
  502. package/src/hooks/useClipboard.doc.mjs +87 -0
  503. package/src/hooks/useClipboard.test.tsx +151 -0
  504. package/src/hooks/useClipboard.ts +135 -0
  505. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  506. package/src/hooks/useContainerReveal.test.tsx +42 -62
  507. package/src/hooks/useContainerReveal.ts +36 -91
  508. package/src/hooks/useImageMode.test.ts +1 -1
  509. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  510. package/src/hooks/useLongPress.test.tsx +18 -0
  511. package/src/hooks/useLongPress.ts +12 -2
  512. package/src/hooks/useScrollLock.test.ts +72 -0
  513. package/src/hooks/useScrollLock.ts +51 -19
  514. package/src/hooks/useStreamingText.test.ts +46 -1
  515. package/src/hooks/useStreamingText.ts +49 -7
  516. package/src/hooks/useTreeFocus.test.tsx +50 -0
  517. package/src/hooks/useTreeFocus.ts +14 -3
  518. package/src/hooks/useTypeahead.test.tsx +150 -0
  519. package/src/hooks/useTypeahead.ts +24 -9
  520. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  521. package/src/index.ts +1 -0
  522. package/src/theme/defineTheme.ts +24 -0
  523. package/src/theme/derivedVarRegistry.test.ts +21 -1
  524. package/src/theme/derivedVarRegistry.ts +19 -6
  525. package/src/theme/expandColorScale.test.ts +14 -0
  526. package/src/theme/expandColorScale.ts +24 -9
  527. package/src/theme/expandTypeScale.test.ts +43 -0
  528. package/src/theme/expandTypeScale.ts +17 -0
  529. package/src/theme/generateThemeRules.test.ts +61 -20
  530. package/src/theme/generateThemeRules.ts +11 -0
  531. package/src/theme/index.ts +13 -0
  532. package/src/utils/focusOutline.stylex.ts +163 -0
  533. package/src/utils/focusReturn.test.ts +42 -0
  534. package/src/utils/focusReturn.ts +31 -0
  535. package/src/utils/index.ts +1 -0
  536. package/src/utils/mergeRefs.test.ts +48 -0
  537. package/src/utils/mergeRefs.ts +12 -6
  538. package/src/utils/rtlStyles.ts +2 -2
  539. package/src/utils/themeProps.ts +26 -4
  540. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  541. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  542. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  543. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  544. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  545. package/dist/RadioList/radio.markers.stylex.js +0 -12
  546. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  547. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  548. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  549. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  550. package/src/RadioList/radio.markers.stylex.ts +0 -10
  551. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -122,8 +122,12 @@ export interface ProgressBarProps extends BaseProps<HTMLDivElement> {
122
122
  /**
123
123
  * Target marks drawn on the track at fixed points in the same `0..max`
124
124
  * scale as `value` — e.g. a goal line. Marks stay visible whether progress
125
- * is below or past them. Each mark's required `label` names it for assistive
126
- * tech and is revealed via a `Tooltip` on hover/focus. Ignored when
125
+ * is below or past them, and take their color from what they sit on: a mark
126
+ * inside the filled area uses the fill variant's on-color (on-accent,
127
+ * on-warning, on-error, …), while a mark still out on the bare track uses
128
+ * `--color-text-primary` (`--color-text-secondary` on a disabled bar, which
129
+ * dims everything it draws). Each mark's required `label` names it for
130
+ * assistive tech and is revealed via a `Tooltip` on hover/focus. Ignored when
127
131
  * `isIndeterminate` is true.
128
132
  */
129
133
  marks?: ReadonlyArray<ProgressBarMark>;
@@ -257,20 +261,27 @@ const styles = stylex.create({
257
261
  },
258
262
  // A mark is a vertical tick centered on the track, a child of the
259
263
  // `role="progressbar"` element (unchanged DOM). The track no longer clips, so
260
- // its height — 8px by default, directly overridable via the `progressbar-mark`
261
- // theme target may exceed the bar and overhang; the centering translate
262
- // keeps any overhang symmetric. Positioned horizontally via `insetInlineStart`;
263
- // the translate mirrors under RTL.
264
+ // its height — 8px by default may exceed the bar and overhang; the centering
265
+ // translate keeps any overhang symmetric. Positioned horizontally via
266
+ // `insetInlineStart`; the translate mirrors under RTL.
267
+ //
268
+ // The dimensions read private vars rather than being plain declarations: a
269
+ // theme writes `width`/`height` on the `progressbar-mark` target as usual and
270
+ // the derived-var registry emits them as these vars instead of as competing
271
+ // properties. Nothing else declares them, so the theme value lands whatever
272
+ // the consumer's cascade looks like — a source-build app that compiles StyleX
273
+ // without `useCSSLayers` leaves the atomics unlayered, where they outrank
274
+ // every rule in `@layer astryx-theme` and made sizing the mark impossible
275
+ // without `!important`.
276
+ //
277
+ // The tick's color is not set here: it depends on what the mark sits on, so
278
+ // it comes from `markOnFillStyles[variant]` (mark inside the filled area) or
279
+ // `markOnTrackStyles.track` (mark out on the bare track).
264
280
  mark: {
265
281
  position: 'absolute',
266
282
  top: '50%',
267
- width: 2,
268
- height: 8,
269
- // Defaults to text-primary. Directly overridable via the `progressbar-mark`
270
- // theme target — a theme can set `backgroundColor`, `width`, and `height`
271
- // (e.g. a taller "flag" tick that overhangs the bar, or per-variant
272
- // contrast) with `defineTheme`; no dedicated CSS vars needed.
273
- backgroundColor: colorVars['--color-text-primary'],
283
+ width: 'var(--_progressbar-mark-width, 2px)',
284
+ height: 'var(--_progressbar-mark-height, 8px)',
274
285
  outline: {
275
286
  default: 'none',
276
287
  ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
@@ -307,6 +318,64 @@ const variantStyles = stylex.create({
307
318
  },
308
319
  });
309
320
 
321
+ // A mark sitting inside the filled area is drawn *on* the bar, so it takes the
322
+ // on-color that pairs with the fill's own variant color — the same pairing
323
+ // Badge uses for solid semantic backgrounds.
324
+ //
325
+ // `neutral` and `disabled` both fill with the muted `--color-text-disabled`
326
+ // gray, which carries no semantic weight and has no dedicated on-token, so
327
+ // they fall back to a plain foreground. They pick different ones: a `neutral`
328
+ // bar is live, so its mark keeps the full-contrast `--color-text-primary` a
329
+ // mark uses out on the track; a `disabled` bar is deliberately low-emphasis —
330
+ // its own label and value text drop to muted colors — so its mark steps down
331
+ // to `--color-text-secondary` rather than becoming the loudest thing on a
332
+ // grayed-out component.
333
+ const markOnFillStyles = stylex.create({
334
+ accent: {
335
+ backgroundColor: colorVars['--color-on-accent'],
336
+ },
337
+ success: {
338
+ backgroundColor: colorVars['--color-on-success'],
339
+ },
340
+ warning: {
341
+ backgroundColor: colorVars['--color-on-warning'],
342
+ },
343
+ error: {
344
+ backgroundColor: colorVars['--color-on-error'],
345
+ },
346
+ neutral: {
347
+ backgroundColor: colorVars['--color-text-primary'],
348
+ },
349
+ disabled: {
350
+ backgroundColor: colorVars['--color-text-secondary'],
351
+ },
352
+ });
353
+
354
+ // A mark out on the bare track is a foreground tick over the muted track
355
+ // background, so it takes `--color-text-primary`.
356
+ //
357
+ // The obvious candidate was `--color-border-emphasized` — the emphasized
358
+ // divider color `Divider`'s `strong` variant and `Slider`'s marks use — but
359
+ // divider tokens sit a step or two from the track on the same neutral ramp, so
360
+ // a mark drawn in one is at or near invisible: measured against each shipped
361
+ // theme's track it lands between 1.00:1 (theme-neutral, both modes, where the
362
+ // track is aliased to that very token) and 2.9:1, under the 3:1 WCAG 1.4.11
363
+ // non-text floor in 7 of 8 themes. `--color-text-secondary` still misses in
364
+ // two. `--color-text-primary` is the one foreground guaranteed to read against
365
+ // every surface a theme defines: 5.8:1 to 15.7:1 on the track across all
366
+ // themes and both modes.
367
+ const markOnTrackStyles = stylex.create({
368
+ track: {
369
+ backgroundColor: colorVars['--color-text-primary'],
370
+ },
371
+ // A disabled bar dims everything it draws, so its track marks step down to
372
+ // the secondary foreground for the same reason the disabled on-fill mark
373
+ // does — matching the muted label and value text.
374
+ trackDisabled: {
375
+ backgroundColor: colorVars['--color-text-secondary'],
376
+ },
377
+ });
378
+
310
379
  function defaultFormatValueLabel(value: number, max: number): string {
311
380
  const pct = max > 0 ? Math.round((value / max) * 100) : 0;
312
381
  return `${pct}%`;
@@ -338,8 +407,11 @@ function defaultFormatValueLabel(value: number, max: number): string {
338
407
  * ```
339
408
  *
340
409
  * A mark's height, width, and color are directly themeable via the
341
- * `progressbar-mark` target — e.g. a taller "goal flag" tick that overhangs the
342
- * bar (centered, so the overhang is symmetric):
410
+ * `progressbar-mark` target. The target reflects `data-placement`
411
+ * (`"fill"` when the mark sits inside the filled area, `"track"` when it is
412
+ * still out on the bare track) and `data-variant` (the fill's variant), so a
413
+ * theme can style the two cases separately — e.g. a taller "goal flag" tick
414
+ * that overhangs the bar (centered, so the overhang is symmetric):
343
415
  *
344
416
  * @example
345
417
  * ```
@@ -387,6 +459,13 @@ export function ProgressBar({
387
459
  // Marks make no sense without a determinate value, so they are only drawn
388
460
  // in determinate mode. Non-finite mark values are dropped; the rest are
389
461
  // clamped to the track edges, matching the bar's own `clampedValue`.
462
+ //
463
+ // Each mark also records whether it lands on the filled part of the bar
464
+ // (`isOnFill`), which decides its color: a mark inside the fill reads against
465
+ // the variant color, one out on the bare track reads against the track. A
466
+ // mark exactly at the fill's leading edge counts as on the fill — it is the
467
+ // "reached the target" moment — except at zero progress, where there is no
468
+ // fill for it to sit on.
390
469
  const resolvedMarks =
391
470
  !isIndeterminate && marks
392
471
  ? marks
@@ -394,7 +473,12 @@ export function ProgressBar({
394
473
  .map(mark => {
395
474
  const clamped = Math.min(Math.max(0, mark.value), safeMax);
396
475
  const pct = safeMax > 0 ? (clamped / safeMax) * 100 : 0;
397
- return {value: mark.value, label: mark.label, pct};
476
+ return {
477
+ value: mark.value,
478
+ label: mark.label,
479
+ pct,
480
+ isOnFill: percentage > 0 && pct <= percentage,
481
+ };
398
482
  })
399
483
  : [];
400
484
 
@@ -471,21 +555,39 @@ export function ProgressBar({
471
555
  )}
472
556
  {/* Target marks — children of the progressbar element (unchanged),
473
557
  layered above the fill so they show whether progress is below or
474
- past them. Each mark is labeled, so it is a focusable Tooltip
475
- trigger: the label is visible on hover/focus and names the mark for
476
- assistive tech via the Tooltip's aria-describedby, without adding a
477
- labeled child to the progressbar's own a11y subtree. */}
558
+ past them. A mark's color follows what it sits on: inside the fill
559
+ it uses the fill variant's on-color, out on the bare track it uses
560
+ the emphasized divider color. Each mark is labeled, so it is a
561
+ focusable Tooltip trigger: the label is visible on hover/focus and
562
+ names the mark for assistive tech via the Tooltip's
563
+ aria-describedby, without adding a labeled child to the
564
+ progressbar's own a11y subtree. */}
478
565
  {resolvedMarks.map(mark => {
479
566
  // The tick element. It is both the Tooltip's anchor and the Suspense
480
567
  // fallback shown while the lazy Tooltip chunk loads, so the tick is
481
568
  // always visible and the label attaches once ready. The list `key`
482
569
  // lives on the mapped <Suspense>, not here.
570
+ //
571
+ // `placement` is reflected as `data-placement` (and a class) so a
572
+ // theme can style the two cases separately on the
573
+ // `progressbar-mark` target; `variant` mirrors the fill's variant
574
+ // for the same reason.
483
575
  const markEl = (
484
576
  <span
485
577
  tabIndex={0}
486
578
  {...mergeProps(
487
- themeProps('progressbar-mark'),
488
- stylex.props(styles.mark),
579
+ themeProps('progressbar-mark', {
580
+ variant: fillVariant,
581
+ placement: mark.isOnFill ? 'fill' : 'track',
582
+ }),
583
+ stylex.props(
584
+ styles.mark,
585
+ mark.isOnFill
586
+ ? markOnFillStyles[fillVariant]
587
+ : isDisabled
588
+ ? markOnTrackStyles.trackDisabled
589
+ : markOnTrackStyles.track,
590
+ ),
489
591
  )}
490
592
  style={{insetInlineStart: `${mark.pct}%`}}
491
593
  />
@@ -12,8 +12,10 @@ export const docs = {
12
12
  targets: [
13
13
  {className: 'astryx-radio-list', visualProps: ['orientation', 'size']},
14
14
  {className: 'astryx-radio-list-item'},
15
- {className: 'astryx-radio', visualProps: ['size'], states: ['checked', 'disabled']},
16
- {className: 'astryx-radio-dot', visualProps: ['size']},
15
+ {className: 'astryx-radio-indicator', visualProps: ['size'], states: ['checked', 'disabled']},
16
+ {className: 'astryx-radio-indicator-dot', visualProps: ['size']},
17
+ {className: 'astryx-radio', visualProps: ['size'], states: ['checked', 'disabled'], deprecatedFor: 'radio-indicator'},
18
+ {className: 'astryx-radio-dot', visualProps: ['size'], deprecatedFor: 'radio-indicator-dot'},
17
19
  ],
18
20
  },
19
21
  description: 'Radio group container with field integration for label, description, and status.',
@@ -18,19 +18,15 @@
18
18
  * - /packages/cli/assets/templates/blocks/components/RadioList/ (showcase blocks)
19
19
  */
20
20
 
21
- import React, {use, useId, type ReactNode} from 'react';
21
+ import React, {use, useId, useRef, type ReactNode} from 'react';
22
22
  import * as stylex from '@stylexjs/stylex';
23
23
  import type {BaseProps} from '../BaseProps';
24
- import {
25
- colorVars,
26
- spacingVars,
27
- durationVars,
28
- easeVars,
29
- borderVars,
30
- } from '../theme/tokens.stylex';
24
+ import {colorVars, spacingVars} from '../theme/tokens.stylex';
31
25
  import {RadioListContext} from './RadioList';
32
26
  import {mergeProps} from '../utils';
33
- import {radioScope} from './radio.markers.stylex';
27
+ import {indicatorScope} from '../Indicator/indicator.markers.stylex';
28
+ import {useIndicatorFocusRing} from '../hooks/useIndicatorFocusRing';
29
+ import {useIndicator} from '../Indicator';
34
30
  import {Item} from '../Item';
35
31
  import {themeProps} from '../utils/themeProps';
36
32
 
@@ -59,74 +55,9 @@ const styles = stylex.create({
59
55
  inputDisabled: {
60
56
  cursor: 'not-allowed',
61
57
  },
62
- radio: {
63
- display: 'flex',
64
- alignItems: 'center',
65
- justifyContent: 'center',
66
- borderWidth: borderVars['--border-width'],
67
- borderStyle: 'solid',
68
- borderRadius: '50%',
69
- transitionProperty: 'background-color, border-color',
70
- transitionDuration: durationVars['--duration-fast'],
71
- transitionTimingFunction: easeVars['--ease-standard'],
72
- boxSizing: 'border-box',
73
- },
74
- radioUnchecked: {
75
- borderColor: {
76
- default: colorVars['--color-border-emphasized'],
77
- [stylex.when.ancestor(':hover', radioScope)]: {
78
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-border-emphasized']}, ${colorVars['--color-tint-hover']} 20%)`,
79
- },
80
- },
81
- backgroundColor: {
82
- default: colorVars['--color-background-surface'],
83
- [stylex.when.ancestor(':hover', radioScope)]: {
84
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-background-surface']}, ${colorVars['--color-tint-hover']} 5%)`,
85
- },
86
- },
87
- },
88
- radioChecked: {
89
- borderColor: {
90
- default: colorVars['--color-accent'],
91
- [stylex.when.ancestor(':hover', radioScope)]: {
92
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-accent']}, ${colorVars['--color-tint-hover']} 15%)`,
93
- },
94
- },
95
- backgroundColor: {
96
- default: colorVars['--color-accent'],
97
- [stylex.when.ancestor(':hover', radioScope)]: {
98
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-accent']}, ${colorVars['--color-tint-hover']} 15%)`,
99
- },
100
- },
101
- },
102
- radioWrapperFocus: {
103
- outline: {
104
- default: 'none',
105
- ':has(:focus-visible)': `2px solid ${colorVars['--color-accent']}`,
106
- },
107
- outlineOffset: {
108
- default: '0',
109
- ':has(:focus-visible)': '2px',
110
- },
111
- borderRadius: '50%',
112
- },
113
- radioDisabled: {
114
- opacity: 0.5,
115
- borderColor: colorVars['--color-border'],
116
- },
117
- radioDisabledUnchecked: {
118
- backgroundColor: colorVars['--color-background-muted'],
119
- },
120
- innerDot: {
121
- borderRadius: '50%',
122
- backgroundColor: {
123
- default: colorVars['--color-on-accent'],
124
- // Forced colors (Windows High Contrast) strips painted backgrounds,
125
- // which would make the selected dot invisible — checked and unchecked
126
- // radios would look identical. CanvasText keeps the dot perceivable on
127
- // the Canvas circle fill (WCAG 1.4.11).
128
- '@media (forced-colors: active)': 'CanvasText',
129
- },
58
+ // Holds only the indicator, so the focus ring has one unambiguous target.
59
+ indicatorSlot: {
60
+ display: 'contents',
130
61
  },
131
62
  labelDisabled: {
132
63
  color: colorVars['--color-text-disabled'],
@@ -145,28 +76,6 @@ const wrapperSizeStyles = stylex.create({
145
76
  },
146
77
  });
147
78
 
148
- const radioSizeStyles = stylex.create({
149
- sm: {
150
- width: 20,
151
- height: 20,
152
- },
153
- md: {
154
- width: 24,
155
- height: 24,
156
- },
157
- });
158
-
159
- const dotSizeStyles = stylex.create({
160
- sm: {
161
- width: 8,
162
- height: 8,
163
- },
164
- md: {
165
- width: 10,
166
- height: 10,
167
- },
168
- });
169
-
170
79
  const embeddedStyles = stylex.create({
171
80
  root: {
172
81
  paddingBlock: 0,
@@ -248,14 +157,18 @@ export function RadioListItem({
248
157
  context.hasDisabledMessage && !isItemDisabled;
249
158
  const isChecked = context.value === value;
250
159
  const size = context.size;
160
+ // The radio visual is an indicator: a theme can restyle it through the
161
+ // `radio` / `radio-dot` targets or replace the component outright.
162
+ const RadioControl = useIndicator('radio');
163
+ // See CheckboxInput: the ring goes on the indicator's own element, because
164
+ // the native input is visually hidden and only the indicator knows its shape.
165
+ const indicatorRef = useRef<HTMLSpanElement>(null);
166
+ const {focusProps} = useIndicatorFocusRing(indicatorRef, isDisabled);
251
167
 
252
168
  const radioCircle = (
253
169
  <div
254
- {...stylex.props(
255
- styles.radioWrapper,
256
- wrapperSizeStyles[size],
257
- !isDisabled && styles.radioWrapperFocus,
258
- )}>
170
+ {...stylex.props(styles.radioWrapper, wrapperSizeStyles[size])}
171
+ {...focusProps}>
259
172
  <input
260
173
  id={id}
261
174
  type="radio"
@@ -282,31 +195,13 @@ export function RadioListItem({
282
195
  isDisabled && styles.inputDisabled,
283
196
  )}
284
197
  />
285
- <div
286
- aria-hidden="true"
287
- {...mergeProps(
288
- themeProps('radio', {
289
- size,
290
- checked: isChecked ? 'checked' : null,
291
- disabled: isDisabled ? 'disabled' : null,
292
- }),
293
- stylex.props(
294
- styles.radio,
295
- radioSizeStyles[size],
296
- isChecked ? styles.radioChecked : styles.radioUnchecked,
297
- isDisabled && styles.radioDisabled,
298
- isDisabled && !isChecked && styles.radioDisabledUnchecked,
299
- ),
300
- )}>
301
- {isChecked && (
302
- <div
303
- {...mergeProps(
304
- themeProps('radio-dot', {size}),
305
- stylex.props(styles.innerDot, dotSizeStyles[size]),
306
- )}
307
- />
308
- )}
309
- </div>
198
+ <span ref={indicatorRef} {...stylex.props(styles.indicatorSlot)}>
199
+ <RadioControl
200
+ state={isChecked ? 'checked' : 'unchecked'}
201
+ size={size}
202
+ isDisabled={isDisabled}
203
+ />
204
+ </span>
310
205
  </div>
311
206
  );
312
207
 
@@ -325,7 +220,13 @@ export function RadioListItem({
325
220
  ref={ref}
326
221
  {...mergeProps(
327
222
  themeProps('radio-list-item'),
328
- stylex.props(styles.container, !isDisabled && radioScope, xstyle),
223
+ stylex.props(
224
+ styles.container,
225
+ // Hover reaches the radio visual through this ancestor marker rather
226
+ // than props, so hovering the row tints the control.
227
+ !isDisabled && indicatorScope,
228
+ xstyle,
229
+ ),
329
230
  className,
330
231
  style,
331
232
  )}
@@ -34,6 +34,7 @@ import {
34
34
  radiusVars,
35
35
  spacingVars,
36
36
  } from '../theme/tokens.stylex';
37
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
37
38
  import {mergeProps, mergeRefs, rtlStyles} from '../utils';
38
39
  import type {ResizableProps} from './useResizable';
39
40
  import {themeProps} from '../utils/themeProps';
@@ -94,14 +95,6 @@ const styles = stylex.create({
94
95
  transitionProperty: 'background-color',
95
96
  transitionDuration: durationVars['--duration-fast'],
96
97
  transitionTimingFunction: easeVars['--ease-standard'],
97
- outline: {
98
- default: 'none',
99
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
100
- },
101
- outlineOffset: {
102
- default: null,
103
- ':focus-visible': spacingVars['--spacing-0-5'],
104
- },
105
98
  },
106
99
  // Overlay mode — absolutely positioned inside the parent panel
107
100
  // instead of being a sibling in flex flow. Used when the handle
@@ -554,7 +547,7 @@ export function ResizeHandle({
554
547
  data-resizing={isDragging || undefined}
555
548
  {...mergeProps(
556
549
  themeProps('resize-handle'),
557
- stylex.props(
550
+ focusOutlineProps.focusVisible(
558
551
  styles.handle,
559
552
  isOverlay && styles.overlay,
560
553
  isOverlay &&
@@ -32,6 +32,7 @@ import type {SegmentedControlSize} from './SegmentedControlContext';
32
32
  import {mergeProps, composeEventHandlers} from '../utils';
33
33
  import type {BaseProps} from '../BaseProps';
34
34
  import {themeProps} from '../utils/themeProps';
35
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
35
36
 
36
37
  export interface SegmentedControlItemProps extends BaseProps<HTMLButtonElement> {
37
38
  ref?: React.Ref<HTMLButtonElement>;
@@ -85,14 +86,6 @@ const styles = stylex.create({
85
86
  transitionProperty: 'color, background-color, box-shadow',
86
87
  transitionDuration: durationVars['--duration-fast'],
87
88
  transitionTimingFunction: easeVars['--ease-standard'],
88
- outline: {
89
- default: null,
90
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
91
- },
92
- outlineOffset: {
93
- default: '0',
94
- ':focus-visible': '2px',
95
- },
96
89
  },
97
90
  hover: {
98
91
  backgroundColor: {
@@ -240,7 +233,7 @@ export function SegmentedControlItem({
240
233
  selected: isSelected ? 'selected' : null,
241
234
  disabled: isItemDisabled ? 'disabled' : null,
242
235
  }),
243
- stylex.props(
236
+ focusOutlineProps.focusVisible(
244
237
  styles.base,
245
238
  sizeStyles[size],
246
239
  isFill && styles.fill,
@@ -46,6 +46,7 @@ import type {CardVariant} from '../Card/Card';
46
46
  import {useClickableContainer} from '../hooks/useClickableContainer';
47
47
  import type {BaseProps} from '../BaseProps';
48
48
  import {themeProps} from '../utils/themeProps';
49
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
49
50
 
50
51
  // =============================================================================
51
52
  // Styles — selection + interaction; Card handles the rest
@@ -58,13 +59,6 @@ const styles = stylex.create({
58
59
  transitionProperty: 'box-shadow, border-color',
59
60
  transitionDuration: durationVars['--duration-fast'],
60
61
  transitionTimingFunction: easeVars['--ease-standard'],
61
- outlineOffset: '2px',
62
- },
63
- focusWithin: {
64
- ':has(:focus-visible)': {
65
- outline: `2px solid ${colorVars['--color-accent']}`,
66
- outlineOffset: '2px',
67
- },
68
62
  },
69
63
  // Hover overlay — guarded by @media (hover: hover) so touch devices
70
64
  // don't show a stuck hover state. Active/pressed state works everywhere.
@@ -361,12 +355,13 @@ export function SelectableCard({
361
355
  variant,
362
356
  selected: isSelected ? 'true' : 'false',
363
357
  }),
364
- {className: classNameProp, style},
358
+ focusOutlineProps.focusWithin(),
359
+ classNameProp,
360
+ style,
365
361
  )}
366
362
  xstyle={
367
363
  [
368
364
  styles.interactive,
369
- styles.focusWithin,
370
365
  isSelected && selectedStyleForVariant(variant),
371
366
  !isDisabled && styles.overlay,
372
367
  !isDisabled && styles.hoverOnPointer,
@@ -24,10 +24,13 @@ export const docs = {
24
24
  {
25
25
  className: 'astryx-selector',
26
26
  visualProps: ['variant', 'size', 'status'],
27
+ states: ['disabled'],
27
28
  },
28
29
  {className: 'astryx-selector-option'},
29
- {className: 'astryx-selector-clear-icon'},
30
+ {className: 'astryx-selector-empty-state'},
31
+ {className: 'astryx-selector-clear-icon', deprecatedFor: 'input-clear-icon'},
30
32
  {className: 'astryx-selector-indicator-icon', states: ['state']},
33
+ {className: 'astryx-selector-check'},
31
34
  ],
32
35
  },
33
36
  description: 'Dropdown selector for choosing from a list of options.',
@@ -169,7 +172,7 @@ export const docs = {
169
172
  components: [{name: 'SelectorOption'}],
170
173
  usage: {
171
174
  description:
172
- 'A dropdown selector for choosing a single value from a list of options. Supports labels, validation, descriptions, and required/optional states. Use it in forms and settings when presenting a moderate number of options.',
175
+ 'A dropdown selector for choosing a single value from a list of options. Supports labels, validation, descriptions, and required/optional states. Use it in forms and settings when presenting a moderate number of options. Keyboard typeahead matches a native select: typing on the focused closed trigger selects the matching option directly, repeated presses cycle through options sharing a first letter, and spaces count as match characters ("new y" reaches "New York"). With the menu open, typing moves the highlight and Enter commits. With hasSearch, typing on the closed trigger opens the popup and seeds the search input.',
173
176
  bestPractices: [
174
177
  {
175
178
  guidance: true,
@@ -271,7 +274,7 @@ export const docs = {
271
274
  export const docsZh = {
272
275
  usage: {
273
276
  description:
274
- 'A dropdown selector for choosing a single value from a list of options. Supports labels, validation, descriptions, and required/optional states. Use it in forms and settings when presenting a moderate number of options.',
277
+ 'A dropdown selector for choosing a single value from a list of options. Supports labels, validation, descriptions, and required/optional states. Use it in forms and settings when presenting a moderate number of options. Keyboard typeahead matches a native select: typing on the focused closed trigger selects the matching option directly, repeated presses cycle through options sharing a first letter, and spaces count as match characters ("new y" reaches "New York"). With the menu open, typing moves the highlight and Enter commits. With hasSearch, typing on the closed trigger opens the popup and seeds the search input.',
275
278
  bestPractices: [
276
279
  {
277
280
  guidance: true,
@@ -363,7 +366,7 @@ export const docsZh = {
363
366
  export const docsDense = {
364
367
  usage: {
365
368
  description:
366
- 'A dropdown selector for choosing a single value from a list of options. Supports labels, validation, descriptions, and required/optional states. Use it in forms and settings when presenting a moderate number of options.',
369
+ 'A dropdown selector for choosing a single value from a list of options. Supports labels, validation, descriptions, and required/optional states. Use it in forms and settings when presenting a moderate number of options. Keyboard typeahead matches a native select: typing on the focused closed trigger selects the matching option directly, repeated presses cycle through options sharing a first letter, and spaces count as match characters ("new y" reaches "New York"). With the menu open, typing moves the highlight and Enter commits. With hasSearch, typing on the closed trigger opens the popup and seeds the search input.',
367
370
  bestPractices: [
368
371
  {
369
372
  guidance: true,