@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
@@ -186,7 +186,6 @@ function discoverComponents(): ComponentInfo[] {
186
186
  // ---------------------------------------------------------------------------
187
187
 
188
188
  const DIR_TO_REGISTRY_KEY: Record<string, string> = {
189
- Avatar: 'avatar',
190
189
  Banner: 'banner',
191
190
  Button: 'button',
192
191
  Card: 'card',
@@ -196,8 +195,10 @@ const DIR_TO_REGISTRY_KEY: Record<string, string> = {
196
195
  Field: 'field',
197
196
  HoverCard: 'hovercard',
198
197
  Popover: 'popover',
198
+ ProgressBar: 'progressbar-mark',
199
199
  Section: 'section',
200
200
  SegmentedControl: 'segmented-control',
201
+ TextArea: 'textarea',
201
202
  };
202
203
 
203
204
  /**
@@ -340,4 +341,23 @@ describe('getDerivedVars', () => {
340
341
  it('returns empty for unregistered property', () => {
341
342
  expect(getDerivedVars('card', 'color')).toEqual([]);
342
343
  });
344
+
345
+ it('marks textarea paddingInline as replacing the source property', () => {
346
+ const result = getDerivedVars('textarea', 'paddingInline');
347
+ expect(result).toHaveLength(1);
348
+ expect(result[0].vars).toEqual(['--_textarea-inline-padding']);
349
+ expect(result[0].replaces).toBe(true);
350
+ });
351
+
352
+ it('marks progressbar-mark width and height as replacing the source property', () => {
353
+ for (const [property, varName] of [
354
+ ['width', '--_progressbar-mark-width'],
355
+ ['height', '--_progressbar-mark-height'],
356
+ ]) {
357
+ const result = getDerivedVars('progressbar-mark', property);
358
+ expect(result).toHaveLength(1);
359
+ expect(result[0].vars).toEqual([varName]);
360
+ expect(result[0].replaces).toBe(true);
361
+ }
362
+ });
343
363
  });
@@ -25,6 +25,14 @@ export interface DerivedVarEntry {
25
25
  vars?: string[];
26
26
  /** Named expansion strategy. 'container' expands padding to container tokens. */
27
27
  expand?: 'container';
28
+ /**
29
+ * Emit only the internal `vars`, dropping the source property from the rule.
30
+ * Use when the class-carrying element must NOT receive the standard property
31
+ * itself — the value is consumed by a child through the var instead. Without
32
+ * this, the property is emitted alongside the var (correct when the same
33
+ * element both reads the var and applies the property, e.g. Chat/DropdownMenu).
34
+ */
35
+ replaces?: boolean;
28
36
  }
29
37
 
30
38
  /**
@@ -35,12 +43,6 @@ export interface DerivedVarEntry {
35
43
  * entries share the same property.
36
44
  */
37
45
  export const derivedVarRegistry: Record<string, DerivedVarEntry[]> = {
38
- avatar: [
39
- {property: 'fontSize', vars: ['--_avatar-fallback-font-size']},
40
- {property: 'fontWeight', vars: ['--_avatar-fallback-font-weight']},
41
- {property: 'color', vars: ['--_avatar-fallback-color']},
42
- {property: 'backgroundColor', vars: ['--_avatar-fallback-background']},
43
- ],
44
46
  banner: [{property: 'borderRadius', vars: ['--_banner-radius']}],
45
47
  button: [{property: 'borderRadius', vars: ['--_button-radius']}],
46
48
  card: [
@@ -62,11 +64,22 @@ export const derivedVarRegistry: Record<string, DerivedVarEntry[]> = {
62
64
  field: [{property: 'borderRadius', vars: ['--_field-radius']}],
63
65
  hovercard: [{property: 'borderRadius', vars: ['--_hovercard-radius']}],
64
66
  popover: [{property: 'borderRadius', vars: ['--_popover-radius']}],
67
+ 'progressbar-mark': [
68
+ {property: 'width', vars: ['--_progressbar-mark-width'], replaces: true},
69
+ {property: 'height', vars: ['--_progressbar-mark-height'], replaces: true},
70
+ ],
65
71
  section: [{property: 'padding', expand: 'container'}],
66
72
  'segmented-control': [
67
73
  {property: 'borderRadius', vars: ['--_segmented-control-radius']},
68
74
  {property: 'padding', vars: ['--_segmented-control-padding']},
69
75
  ],
76
+ textarea: [
77
+ {
78
+ property: 'paddingInline',
79
+ vars: ['--_textarea-inline-padding'],
80
+ replaces: true,
81
+ },
82
+ ],
70
83
  };
71
84
 
72
85
  /**
@@ -100,6 +100,20 @@ describe('expandColorScale', () => {
100
100
  standard['--color-text-primary'],
101
101
  );
102
102
  });
103
+
104
+ it('contrast high strengthens both border tokens', () => {
105
+ const standard = expandColorScale({
106
+ accent: '#0064E0',
107
+ contrast: 'standard',
108
+ });
109
+ const high = expandColorScale({accent: '#0064E0', contrast: 'high'});
110
+ // Both the subtle hairline and the emphasized border shift under high
111
+ // contrast, so structural boundaries stay perceivable.
112
+ expect(high['--color-border']).not.toBe(standard['--color-border']);
113
+ expect(high['--color-border-emphasized']).not.toBe(
114
+ standard['--color-border-emphasized'],
115
+ );
116
+ });
103
117
  });
104
118
 
105
119
  describe('expandColorScale — neutral-only themes (#2279)', () => {
@@ -71,7 +71,9 @@ export interface ColorScaleConfig {
71
71
  neutralStyle?: 'warm' | 'cool' | 'neutral';
72
72
 
73
73
  /**
74
- * Contrast level. Affects tone assignments for text and UI elements.
74
+ * Contrast level. `'high'` pulls text, icons, and borders toward stronger
75
+ * tones (and thickens the subtle border's alpha) so structural and textual
76
+ * boundaries stay perceivable.
75
77
  * @default 'standard'
76
78
  */
77
79
  contrast?: 'standard' | 'high';
@@ -190,17 +192,25 @@ export function expandColorScale(config: ColorScaleConfig): ColorScaleTokens {
190
192
  const textSecondaryLightTone = isHigh ? 20 : 30;
191
193
  const textSecondaryDarkTone = isHigh ? 80 : 70;
192
194
 
195
+ // Borders track contrast the same way text does: high contrast pulls the
196
+ // emphasized border tone toward mid-scale (stronger against both the near-
197
+ // white light surface and the near-black dark surface) and thickens the
198
+ // otherwise-decorative subtle hairline by doubling its alpha, so structural
199
+ // boundaries stay perceivable for users who opt into high contrast.
200
+ const borderSubtleAlpha = isHigh ? 0.2 : 0.1;
201
+
193
202
  // Emphasized borders outline form controls (CheckboxInput, Selector), so
194
203
  // they are non-text UI boundaries under WCAG 1.4.11 and must reach 3:1
195
- // against the surface they sit on. The preferred tones (70 light /
196
- // 30 dark) land around 2.2:1 / 1.8:1, so bump the tone toward the
197
- // opposing extreme until the ratio passes. Text tones need no such loop:
198
- // their spacing guarantees >= 4.5:1 for any hue/chroma (see file header).
204
+ // against the surface they sit on. High contrast starts at a more
205
+ // aggressive tone (50 vs 70/30), guaranteeing a stronger result; standard
206
+ // contrast starts at 70/30 and walks toward mid-scale only as far as needed.
207
+ const borderEmphasizedStartLight = isHigh ? 50 : 70;
208
+ const borderEmphasizedStartDark = isHigh ? 50 : 30;
199
209
  const borderEmphasized = ld(
200
210
  ensureContrastTone(
201
211
  seedHue,
202
212
  neutralVariantChroma,
203
- 70,
213
+ borderEmphasizedStartLight,
204
214
  -1,
205
215
  N[99],
206
216
  NON_TEXT_MIN_CONTRAST,
@@ -208,7 +218,7 @@ export function expandColorScale(config: ColorScaleConfig): ColorScaleTokens {
208
218
  ensureContrastTone(
209
219
  seedHue,
210
220
  neutralVariantChroma,
211
- 30,
221
+ borderEmphasizedStartDark,
212
222
  1,
213
223
  N[10],
214
224
  NON_TEXT_MIN_CONTRAST,
@@ -276,8 +286,13 @@ export function expandColorScale(config: ColorScaleConfig): ColorScaleTokens {
276
286
  '--color-background-inverted': ld(N[10], N[99]),
277
287
 
278
288
  // Border
279
- // Decorative hairline (~1.1:1 by design) — not a WCAG 1.4.11 boundary.
280
- '--color-border': ld(hexWithAlpha(N[10], 0.1), hexWithAlpha(N[95], 0.1)),
289
+ // Border
290
+ // Decorative hairline — not a WCAG 1.4.11 boundary. High contrast
291
+ // doubles the alpha so structural boundaries stay perceivable.
292
+ '--color-border': ld(
293
+ hexWithAlpha(N[10], borderSubtleAlpha),
294
+ hexWithAlpha(N[95], borderSubtleAlpha),
295
+ ),
281
296
  '--color-border-emphasized': borderEmphasized,
282
297
 
283
298
  // Effects
@@ -305,4 +305,47 @@ describe('generateTypeScaleComponents', () => {
305
305
  'var(--text-body-leading)',
306
306
  );
307
307
  });
308
+
309
+ it('generates rules for all 3 heading display types', () => {
310
+ const components = generateTypeScaleComponents({base: 14, ratio: 1.2});
311
+ for (const type of ['display-1', 'display-2', 'display-3']) {
312
+ expect(components.heading).toHaveProperty(`type:${type}`);
313
+ }
314
+ });
315
+
316
+ it('heading display-type rules reference the display semantic tokens', () => {
317
+ const components = generateTypeScaleComponents({base: 14, ratio: 1.2});
318
+ const display1 = components.heading['type:display-1'];
319
+ expect(display1.fontFamily).toBe('var(--font-family-heading)');
320
+ expect(display1.fontSize).toBe('var(--text-display-1-size)');
321
+ expect(display1.lineHeight).toBe('var(--text-display-1-leading)');
322
+ // fontWeight is intentionally omitted here, matching the `text` branch's
323
+ // type-keyed rules — see defaultWeightByTypeStyles for how weight is
324
+ // applied instead.
325
+ expect(display1.fontWeight).toBeUndefined();
326
+ });
327
+
328
+ it('emits heading type:display-N rules after level:N rules, so type wins at equal specificity', () => {
329
+ // Heading renders both a `level:N` and a `type:display-N` class on the
330
+ // same element simultaneously when `type` is set (see Heading.tsx).
331
+ // Both produce single-class-selector CSS rules of equal specificity, so
332
+ // CSS's own "last rule wins" tiebreak is what makes `type` take
333
+ // precedence over `level` -- which only holds if type rules are emitted
334
+ // strictly after all level rules in this object's (and therefore the
335
+ // generated stylesheet's) key order. This regression-tests #4829,
336
+ // where type-keyed heading rules didn't exist at all and level always
337
+ // won by default, silently discarding the `type` prop under any theme
338
+ // with a typography.scale.
339
+ const components = generateTypeScaleComponents({base: 14, ratio: 1.2});
340
+ const keys = Object.keys(components.heading);
341
+ const lastLevelIndex = Math.max(
342
+ ...[1, 2, 3, 4, 5, 6].map(level => keys.indexOf(`level:${level}`)),
343
+ );
344
+ const firstTypeIndex = Math.min(
345
+ ...['display-1', 'display-2', 'display-3'].map(type =>
346
+ keys.indexOf(`type:${type}`),
347
+ ),
348
+ );
349
+ expect(firstTypeIndex).toBeGreaterThan(lastLevelIndex);
350
+ });
308
351
  });
@@ -368,6 +368,23 @@ export function generateTypeScaleComponents(
368
368
  lineHeight: `var(--text-heading-${level}-leading)`,
369
369
  };
370
370
  }
371
+ // `Heading` renders both a `level:N` and, when set, a `type:display-N`
372
+ // visual-prop class simultaneously (type sizing takes precedence over
373
+ // level sizing — see Heading.tsx's own `type ? sizeByTypeStyles[type] :
374
+ // sizeByLevelStyles[level]`). Without a `type:display-N` rule here, the
375
+ // `level:N` rule is the only one that matches, so it silently wins
376
+ // regardless of `type` once a theme supplies a type scale. Emitting these
377
+ // after the level rules keeps them later in source order, so they take
378
+ // precedence at equal specificity, matching the component's own logic.
379
+ // fontWeight is intentionally omitted, mirroring the `text` branch below
380
+ // and preserving `defaultWeightByTypeStyles`.
381
+ for (const type of ['display-1', 'display-2', 'display-3']) {
382
+ headingRules[`type:${type}`] = {
383
+ fontFamily: 'var(--font-family-heading)',
384
+ fontSize: `var(--text-${type}-size)`,
385
+ lineHeight: `var(--text-${type}-leading)`,
386
+ };
387
+ }
371
388
  components.heading = headingRules;
372
389
 
373
390
  const textRules: Record<string, Record<string, string>> = {};
@@ -23,6 +23,23 @@ const defaultInput = {
23
23
  },
24
24
  };
25
25
 
26
+ describe('focus outline tokens', () => {
27
+ it('emits a focus ring override into the theme scope', () => {
28
+ const theme = defineTheme({
29
+ name: 'brand',
30
+ tokens: {
31
+ '--focus-outline-color': '#FF00FF',
32
+ '--focus-outline-width': '4px',
33
+ },
34
+ });
35
+
36
+ const {component} = generateThemeCSS(theme);
37
+
38
+ expect(component).toContain('--focus-outline-color: #FF00FF;');
39
+ expect(component).toContain('--focus-outline-width: 4px;');
40
+ });
41
+ });
42
+
26
43
  describe('generateThemeRules', () => {
27
44
  const theme = defineTheme(defaultInput);
28
45
  const rules = generateThemeRules(theme);
@@ -385,46 +402,46 @@ describe('derived var expansion', () => {
385
402
  expect(rule).toContain('--_button-radius: 8px');
386
403
  });
387
404
 
388
- it('emits internal vars for avatar fallback typography (base)', () => {
405
+ it('emits direct rules for avatar fallback background, color, and weight', () => {
389
406
  const theme = defineTheme({
390
- name: 'test-derived-avatar',
407
+ name: 'test-avatar-fallback',
391
408
  components: {
392
- avatar: {
409
+ 'avatar-fallback': {
393
410
  base: {
394
- fontWeight: 'var(--font-weight-normal)',
395
- color: 'var(--color-text-secondary)',
396
411
  backgroundColor: 'var(--color-accent-muted)',
412
+ color: 'var(--color-text-secondary)',
413
+ fontWeight: 'var(--font-weight-normal)',
397
414
  },
398
415
  },
399
416
  },
400
417
  });
401
418
  const rules = generateThemeRules(theme);
402
- const rule = rules.find(r => r.includes('.astryx-avatar'));
419
+ const rule = rules.find(r => r.includes('.astryx-avatar-fallback'));
403
420
  expect(rule).toBeDefined();
404
- expect(rule).toContain(
405
- '--_avatar-fallback-font-weight: var(--font-weight-normal)',
406
- );
407
- expect(rule).toContain(
408
- '--_avatar-fallback-color: var(--color-text-secondary)',
409
- );
410
- expect(rule).toContain(
411
- '--_avatar-fallback-background: var(--color-accent-muted)',
412
- );
421
+ expect(rule).toContain('background-color: var(--color-accent-muted)');
422
+ expect(rule).toContain('color: var(--color-text-secondary)');
423
+ expect(rule).toContain('font-weight: var(--font-weight-normal)');
424
+ // These are direct class targets now, not internal derived vars.
425
+ expect(rule).not.toContain('--_avatar-fallback-background');
426
+ expect(rule).not.toContain('--_avatar-fallback-color');
427
+ expect(rule).not.toContain('--_avatar-fallback-font-weight');
413
428
  });
414
429
 
415
- it('emits a per-size fallback font-size for avatar (size:sm)', () => {
430
+ it('emits a direct per-size font-size rule for the avatar fallback target', () => {
416
431
  const theme = defineTheme({
417
- name: 'test-derived-avatar-size',
432
+ name: 'test-avatar-fallback-size',
418
433
  components: {
419
- avatar: {
434
+ 'avatar-fallback': {
420
435
  'size:sm': {fontSize: '9px'},
421
436
  },
422
437
  },
423
438
  });
424
439
  const rules = generateThemeRules(theme);
425
- const rule = rules.find(r => r.includes('.astryx-avatar.sm'));
440
+ const rule = rules.find(r => r.includes('.astryx-avatar-fallback.sm'));
426
441
  expect(rule).toBeDefined();
427
- expect(rule).toContain('--_avatar-fallback-font-size: 9px');
442
+ expect(rule).toContain('font-size: 9px');
443
+ // Direct class target now — no internal derived var.
444
+ expect(rule).not.toContain('--_avatar-fallback-font-size');
428
445
  });
429
446
 
430
447
  it('does not emit derived vars for components without registry entries', () => {
@@ -475,6 +492,47 @@ describe('derived var expansion', () => {
475
492
  expect(rule).toContain('border-radius: 16px');
476
493
  expect(rule).toContain('--_card-radius: 16px');
477
494
  });
495
+
496
+ it('replaces paddingInline with the var for textarea (no raw property)', () => {
497
+ const theme = defineTheme({
498
+ name: 'test-derived-textarea',
499
+ components: {
500
+ textarea: {
501
+ base: {paddingInline: 'var(--eps-input-padding-x)'},
502
+ },
503
+ },
504
+ });
505
+ const rules = generateThemeRules(theme);
506
+ const rule = rules.find(r => r.includes('.astryx-textarea'));
507
+ expect(rule).toBeDefined();
508
+ // Value flows to the inner <textarea> via the var…
509
+ expect(rule).toContain(
510
+ '--_textarea-inline-padding: var(--eps-input-padding-x)',
511
+ );
512
+ // …and must NOT land on the flush wrapper, which would re-inset the
513
+ // full-bleed textarea and push the native resize grip off the corner.
514
+ expect(rule).not.toContain('padding-inline: var(--eps-input-padding-x)');
515
+ });
516
+
517
+ it('replaces progressbar-mark width/height with vars (no raw properties)', () => {
518
+ const theme = defineTheme({
519
+ name: 'test-derived-progressbar-mark',
520
+ components: {
521
+ 'progressbar-mark': {
522
+ base: {width: '2px', height: '12px'},
523
+ },
524
+ },
525
+ });
526
+ const rules = generateThemeRules(theme);
527
+ const rule = rules.find(r => r.includes('.astryx-progressbar-mark'));
528
+ expect(rule).toBeDefined();
529
+ expect(rule).toContain('--_progressbar-mark-width: 2px');
530
+ expect(rule).toContain('--_progressbar-mark-height: 12px');
531
+ // Raw dimensions would be a same-element fight with the mark's StyleX,
532
+ // which an unlayered consumer build wins — the vars have no competitor.
533
+ expect(rule).not.toMatch(/[{;]\s*width: 2px/);
534
+ expect(rule).not.toMatch(/[{;]\s*height: 12px/);
535
+ });
478
536
  });
479
537
 
480
538
  describe('brutalist-style derived expansion', () => {
@@ -350,9 +350,11 @@ function generateComponentRules(
350
350
  // Entries are processed in order (priority).
351
351
  // - `vars`: emit internal CSS custom property declarations
352
352
  // - `expand: 'container'`: expand padding to container layout tokens
353
+ // - `replaces: true`: emit only the var, dropping the source property
353
354
  let finalProps = props;
354
355
  const derivedProps: [string, string][] = [];
355
356
  let containerExpanded = false;
357
+ const replacedProps = new Set<string>();
356
358
 
357
359
  for (const [prop, value] of props) {
358
360
  const derived = getDerivedVars(component, prop);
@@ -366,6 +368,9 @@ function generateComponentRules(
366
368
  if (entry.expand === 'container' && PADDING_PROPS.has(prop)) {
367
369
  containerExpanded = true;
368
370
  }
371
+ if (entry.replaces) {
372
+ replacedProps.add(prop);
373
+ }
369
374
  if (entry.vars) {
370
375
  for (const varName of entry.vars) {
371
376
  derivedProps.push([varName, value]);
@@ -384,6 +389,12 @@ function generateComponentRules(
384
389
  finalProps = [...nonPaddingProps, ...containerTokens];
385
390
  }
386
391
 
392
+ // Drop properties whose derived entry set `replaces` — their value is
393
+ // carried by the emitted var and must not land on the class element.
394
+ if (replacedProps.size > 0) {
395
+ finalProps = finalProps.filter(([p]) => !replacedProps.has(p));
396
+ }
397
+
387
398
  if (derivedProps.length > 0) {
388
399
  finalProps = [...finalProps, ...derivedProps];
389
400
  }
@@ -90,6 +90,7 @@ export {
90
90
  spacingDefaults,
91
91
  sizeDefaults,
92
92
  borderDefaults,
93
+ focusDefaults,
93
94
  radiusDefaults,
94
95
  shadowDefaults,
95
96
  durationDefaults,
@@ -102,6 +103,7 @@ export {
102
103
  spacingVars,
103
104
  sizeVars,
104
105
  borderVars,
106
+ focusVars,
105
107
  radiusVars,
106
108
  shadowVars,
107
109
  durationVars,
@@ -130,6 +132,19 @@ export type {
130
132
 
131
133
  export {useTheme, useThemeName, ThemeContext} from './useTheme';
132
134
  export type {UseThemeReturn, ThemeContextValue} from './useTheme';
135
+
136
+ export type {
137
+ IndicatorComponent,
138
+ IndicatorFamily,
139
+ IndicatorFamilyMap,
140
+ IndicatorMap,
141
+ IndicatorName,
142
+ IndicatorNameOfFamily,
143
+ IndicatorProps,
144
+ IndicatorRegistry,
145
+ IndicatorSize,
146
+ IndicatorState,
147
+ } from '../Indicator';
133
148
  export {
134
149
  resolveThemeToken,
135
150
  resolveThemeTokens,
@@ -193,6 +193,24 @@ export const borderVars = stylex.defineVars(borderDefaults);
193
193
 
194
194
  export type BorderVarName = keyof typeof borderDefaults;
195
195
 
196
+ // =============================================================================
197
+ // Focus Tokens
198
+ // =============================================================================
199
+ // The keyboard focus ring, as one definition for the whole system. Values come
200
+ // from Design Conventions §User Interaction States: 2px --color-accent at 3px
201
+ // offset. Components read these through utils/focusOutline.stylex.ts; the
202
+ // `:focus-visible` condition stays in core, so a theme can restyle the ring
203
+ // but cannot show it to pointer users.
204
+
205
+ export const focusDefaults = {
206
+ '--focus-outline-width': '2px',
207
+ '--focus-outline-style': 'solid',
208
+ '--focus-outline-color': 'var(--color-accent)',
209
+ '--focus-outline-offset': '3px',
210
+ } as const;
211
+
212
+ export const focusVars = stylex.defineVars(focusDefaults);
213
+
196
214
  // =============================================================================
197
215
  // Radius Tokens
198
216
  // =============================================================================
@@ -280,3 +280,40 @@ describe('resolveThemeTokens — generated themes end to end', () => {
280
280
  expect(light['--color-icon-accent']).toBe(light['--color-accent']);
281
281
  });
282
282
  });
283
+
284
+ describe('focus outline tokens', () => {
285
+ it('default to the accent ring from Design Conventions', () => {
286
+ const tokens = resolveThemeTokens(null, {mode: 'light'});
287
+
288
+ expect(tokens['--focus-outline-width']).toBe('2px');
289
+ expect(tokens['--focus-outline-style']).toBe('solid');
290
+ expect(tokens['--focus-outline-offset']).toBe('3px');
291
+ // Tracks the theme's accent unless a theme says otherwise.
292
+ expect(tokens['--focus-outline-color']).toBe(tokens['--color-accent']);
293
+ });
294
+
295
+ it('follows a theme accent without an explicit focus override', () => {
296
+ const theme = defineTheme({name: 'brand', color: {accent: '#AA0000'}});
297
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
298
+
299
+ expect(tokens['--focus-outline-color']).toBe(tokens['--color-accent']);
300
+ expect(tokens['--focus-outline-color']).not.toContain('var(');
301
+ });
302
+
303
+ it('takes an explicit ring over the accent', () => {
304
+ const theme = defineTheme({
305
+ name: 'brand',
306
+ color: {accent: '#AA0000'},
307
+ tokens: {
308
+ '--focus-outline-color': '#00FF00',
309
+ '--focus-outline-width': '4px',
310
+ '--focus-outline-offset': '0px',
311
+ },
312
+ });
313
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
314
+
315
+ expect(tokens['--focus-outline-color']).toBe('#00FF00');
316
+ expect(tokens['--focus-outline-width']).toBe('4px');
317
+ expect(tokens['--focus-outline-offset']).toBe('0px');
318
+ });
319
+ });