@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
@@ -21,6 +21,7 @@ import {
21
21
  useCallback,
22
22
  use,
23
23
  useOptimistic,
24
+ useRef,
24
25
  useTransition,
25
26
  type ChangeEvent,
26
27
  type FocusEvent,
@@ -31,12 +32,9 @@ import {
31
32
  colorVars,
32
33
  spacingVars,
33
34
  radiusVars,
34
- durationVars,
35
- easeVars,
36
35
  typographyVars,
37
36
  typeScaleVars,
38
37
  fontWeightVars,
39
- borderVars,
40
38
  } from '../theme/tokens.stylex';
41
39
  import type {BaseProps} from '../BaseProps';
42
40
  import type {SizeValue} from '../utils/types';
@@ -47,7 +45,9 @@ import type {InputStatus} from '../Field/types';
47
45
  import {Spinner} from '../Spinner';
48
46
  import {useTooltip} from '../Tooltip';
49
47
  import {mergeProps, mergeRefs} from '../utils';
50
- import {checkboxScope} from './checkbox.markers.stylex';
48
+ import {indicatorScope} from '../Indicator/indicator.markers.stylex';
49
+ import {useIndicatorFocusRing} from '../hooks/useIndicatorFocusRing';
50
+ import {useIndicator} from '../Indicator';
51
51
  import {themeProps} from '../utils/themeProps';
52
52
  import {CheckboxListContext} from '../CheckboxList/CheckboxListContext';
53
53
 
@@ -68,6 +68,12 @@ const styles = stylex.create({
68
68
  flexShrink: 0,
69
69
  isolation: 'isolate',
70
70
  },
71
+ // Holds only the indicator, so the focus ring has one unambiguous target.
72
+ // `display: contents` adds no box of its own — the indicator keeps whatever
73
+ // layout relationship it already had with the wrapper.
74
+ indicatorSlot: {
75
+ display: 'contents',
76
+ },
71
77
  input: {
72
78
  position: 'absolute',
73
79
  margin: 0,
@@ -79,113 +85,6 @@ const styles = stylex.create({
79
85
  inputDisabled: {
80
86
  cursor: 'not-allowed',
81
87
  },
82
- checkbox: {
83
- display: 'flex',
84
- alignItems: 'center',
85
- justifyContent: 'center',
86
- borderWidth: borderVars['--border-width'],
87
- borderStyle: 'solid',
88
- borderRadius: radiusVars['--radius-inner'],
89
- transitionProperty: 'background-color, border-color',
90
- transitionDuration: {
91
- default: durationVars['--duration-fast'],
92
- '@media (prefers-reduced-motion: reduce)': '0s',
93
- },
94
- transitionTimingFunction: easeVars['--ease-standard'],
95
- },
96
- checkboxFocus: {
97
- outline: {
98
- default: 'none',
99
- [stylex.when.ancestor(':has(:focus-visible)', checkboxScope)]:
100
- `2px solid ${colorVars['--color-accent']}`,
101
- },
102
- outlineOffset: {
103
- default: null,
104
- [stylex.when.ancestor(':has(:focus-visible)', checkboxScope)]: '2px',
105
- },
106
- },
107
- // State-dependent colors with ancestor hover behavior
108
- checkboxUnchecked: {
109
- // Foreground for the inherit-shade loading spinner (reads currentColor):
110
- // brand accent on the light surface fill.
111
- color: colorVars['--color-accent'],
112
- borderColor: {
113
- default: colorVars['--color-border-emphasized'],
114
- [stylex.when.ancestor(':hover', checkboxScope)]: {
115
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-border-emphasized']}, ${colorVars['--color-tint-hover']} 20%)`,
116
- },
117
- },
118
- backgroundColor: {
119
- default: colorVars['--color-background-surface'],
120
- [stylex.when.ancestor(':hover', checkboxScope)]: {
121
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-background-surface']}, ${colorVars['--color-tint-hover']} 5%)`,
122
- },
123
- },
124
- },
125
- checkboxChecked: {
126
- // Foreground for the inherit-shade loading spinner (reads currentColor):
127
- // on-accent color against the accent fill.
128
- color: colorVars['--color-on-accent'],
129
- borderColor: {
130
- default: colorVars['--color-accent'],
131
- [stylex.when.ancestor(':hover', checkboxScope)]: {
132
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-accent']}, ${colorVars['--color-tint-hover']} 15%)`,
133
- },
134
- },
135
- backgroundColor: {
136
- default: colorVars['--color-accent'],
137
- [stylex.when.ancestor(':hover', checkboxScope)]: {
138
- '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-accent']}, ${colorVars['--color-tint-hover']} 15%)`,
139
- },
140
- },
141
- },
142
- checkboxDisabled: {
143
- opacity: 0.5,
144
- borderColor: {
145
- default: colorVars['--color-border'],
146
- [stylex.when.ancestor(':hover', checkboxScope)]: {
147
- '@media (hover: hover)': colorVars['--color-border'],
148
- },
149
- },
150
- },
151
- checkboxDisabledUnchecked: {
152
- backgroundColor: {
153
- default: colorVars['--color-background-muted'],
154
- [stylex.when.ancestor(':hover', checkboxScope)]: {
155
- '@media (hover: hover)': colorVars['--color-background-muted'],
156
- },
157
- },
158
- },
159
- checkmark: {
160
- display: 'none',
161
- color: {
162
- default: colorVars['--color-on-accent'],
163
- // Forced colors (Windows High Contrast) does not reliably force an SVG
164
- // stroke painted with currentColor, so the check stays the same white as
165
- // the flattened (Canvas) box fill — a white check on a white box.
166
- // CanvasText keeps it perceivable on the Canvas box, matching the
167
- // indeterminate mark (WCAG 1.4.11).
168
- '@media (forced-colors: active)': 'CanvasText',
169
- },
170
- },
171
- checkmarkVisible: {
172
- display: 'block',
173
- },
174
- indeterminateMark: {
175
- display: 'none',
176
- backgroundColor: {
177
- default: colorVars['--color-on-accent'],
178
- // Forced colors (Windows High Contrast) strips painted backgrounds,
179
- // which would make the indeterminate bar invisible; CanvasText keeps it
180
- // perceivable on the Canvas box fill (WCAG 1.4.11). The checkmark carries
181
- // the matching CanvasText treatment on its own style.
182
- '@media (forced-colors: active)': 'CanvasText',
183
- },
184
- borderRadius: radiusVars['--radius-full'],
185
- },
186
- indeterminateMarkVisible: {
187
- display: 'block',
188
- },
189
88
  labelWrapper: {
190
89
  display: 'flex',
191
90
  flexDirection: 'column',
@@ -211,39 +110,6 @@ const wrapperSizeStyles = stylex.create({
211
110
  },
212
111
  });
213
112
 
214
- const checkboxSizeStyles = stylex.create({
215
- sm: {
216
- width: 20,
217
- height: 20,
218
- },
219
- md: {
220
- width: 24,
221
- height: 24,
222
- },
223
- });
224
-
225
- const checkmarkSizeStyles = stylex.create({
226
- sm: {
227
- width: 12,
228
- height: 12,
229
- },
230
- md: {
231
- width: 14,
232
- height: 14,
233
- },
234
- });
235
-
236
- const indeterminateSizeStyles = stylex.create({
237
- sm: {
238
- width: 10,
239
- height: 2,
240
- },
241
- md: {
242
- width: 12,
243
- height: 2,
244
- },
245
- });
246
-
247
113
  export type CheckboxInputSize = keyof typeof wrapperSizeStyles;
248
114
 
249
115
  export interface CheckboxInputProps extends Omit<BaseProps, 'onChange'> {
@@ -443,9 +309,17 @@ export function CheckboxInput({
443
309
  isEnabled: showsDisabledMessage,
444
310
  });
445
311
 
312
+ // The checkbox visual is an indicator: a theme can restyle it through the
313
+ // `checkbox` target or replace the component outright.
314
+ const CheckboxControl = useIndicator('checkbox');
315
+ // The ring is drawn on the indicator itself: the native input is
316
+ // `opacity: 0`, and only the indicator's own element can shape the outline
317
+ // to match it. See useIndicatorFocusRing.
318
+ const indicatorRef = useRef<HTMLSpanElement>(null);
319
+ const {focusProps} = useIndicatorFocusRing(indicatorRef, isDisabled);
320
+
446
321
  const isIndeterminate = optimisticValue === 'indeterminate';
447
322
  const isChecked = optimisticValue === true;
448
- const isCheckedOrIndeterminate = isChecked || isIndeterminate;
449
323
 
450
324
  // Sync the native indeterminate DOM property (can't be set via JSX
451
325
  // attribute). On a native checkbox this is the authoritative way to expose
@@ -498,9 +372,13 @@ export function CheckboxInput({
498
372
  {...stylex.props(
499
373
  styles.container,
500
374
  isLabelHidden && styles.containerLabelHidden,
501
- !isDisabled && checkboxScope,
375
+ // Hover and focus reach the checkbox visual through this ancestor
376
+ // marker rather than props, so the whole row drives it.
377
+ !isDisabled && indicatorScope,
502
378
  )}>
503
- <div {...stylex.props(styles.checkboxWrapper, wrapperSizeStyles[size])}>
379
+ <div
380
+ {...stylex.props(styles.checkboxWrapper, wrapperSizeStyles[size])}
381
+ {...focusProps}>
504
382
  <input
505
383
  {...rest}
506
384
  ref={mergeRefs(
@@ -520,6 +398,7 @@ export function CheckboxInput({
520
398
  // still blocked by the isDisabled guard in onChange below.
521
399
  disabled={isDisabled && !isFocusableDisabled}
522
400
  aria-disabled={isFocusableDisabled ? 'true' : undefined}
401
+ form={isFocusableDisabled ? '' : undefined}
523
402
  readOnly={isReadOnly}
524
403
  required={isRequired}
525
404
  onChange={e => {
@@ -547,61 +426,25 @@ export function CheckboxInput({
547
426
  isDisabled && styles.inputDisabled,
548
427
  )}
549
428
  />
550
- <div
551
- aria-hidden="true"
552
- {...mergeProps(
553
- themeProps('checkbox', {
554
- size,
555
- checked: isChecked
556
- ? 'checked'
557
- : isIndeterminate
558
- ? 'indeterminate'
559
- : null,
560
- disabled: isDisabled ? 'disabled' : null,
561
- }),
562
- stylex.props(
563
- styles.checkbox,
564
- checkboxSizeStyles[size],
565
- !isDisabled && styles.checkboxFocus,
566
- isCheckedOrIndeterminate
567
- ? styles.checkboxChecked
568
- : styles.checkboxUnchecked,
569
- isDisabled && styles.checkboxDisabled,
570
- isDisabled &&
571
- !isCheckedOrIndeterminate &&
572
- styles.checkboxDisabledUnchecked,
573
- ),
574
- )}>
575
- {isBusy ? (
576
- <Spinner size="sm" shade="inherit" />
577
- ) : (
578
- <>
579
- <svg
580
- viewBox="0 0 10 10"
581
- {...stylex.props(
582
- styles.checkmark,
583
- checkmarkSizeStyles[size],
584
- isChecked && styles.checkmarkVisible,
585
- )}>
586
- <path
587
- d="M8.5 2.5L4 7.5L1.5 5"
588
- stroke="currentColor"
589
- strokeWidth="1.5"
590
- fill="none"
591
- strokeLinecap="round"
592
- strokeLinejoin="round"
593
- />
594
- </svg>
595
- <div
596
- {...stylex.props(
597
- styles.indeterminateMark,
598
- indeterminateSizeStyles[size],
599
- isIndeterminate && styles.indeterminateMarkVisible,
600
- )}
601
- />
602
- </>
603
- )}
604
- </div>
429
+ {/*
430
+ * A container holding ONLY the indicator, so the focus ring has an
431
+ * unambiguous target whatever a theme renders. `display: contents`
432
+ * keeps it out of layout entirely.
433
+ */}
434
+ <span ref={indicatorRef} {...stylex.props(styles.indicatorSlot)}>
435
+ <CheckboxControl
436
+ state={
437
+ isIndeterminate
438
+ ? 'indeterminate'
439
+ : isChecked
440
+ ? 'checked'
441
+ : 'unchecked'
442
+ }
443
+ size={size}
444
+ isDisabled={isDisabled}>
445
+ {isBusy ? <Spinner size="sm" shade="inherit" /> : null}
446
+ </CheckboxControl>
447
+ </span>
605
448
  </div>
606
449
  <div {...stylex.props(styles.labelWrapper)}>
607
450
  <FieldLabel
@@ -46,6 +46,7 @@ import {useClickableContainer} from '../hooks/useClickableContainer';
46
46
  import type {BaseProps} from '../BaseProps';
47
47
  import {useLinkComponent} from '../Link/useLinkComponent';
48
48
  import {themeProps} from '../utils/themeProps';
49
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
49
50
 
50
51
  // =============================================================================
51
52
  // Styles — only the interactive layer, Card handles everything else
@@ -57,13 +58,6 @@ const styles = stylex.create({
57
58
  cursor: 'pointer',
58
59
  textDecoration: 'none',
59
60
  color: 'inherit',
60
- outlineOffset: '2px',
61
- },
62
- focusWithin: {
63
- ':has(:focus-visible)': {
64
- outline: `2px solid ${colorVars['--color-accent']}`,
65
- outlineOffset: '2px',
66
- },
67
61
  },
68
62
  // Hover overlay — guarded by @media (hover: hover) so touch devices
69
63
  // don't show a stuck hover state. Active/pressed state works everywhere.
@@ -307,14 +301,15 @@ export function ClickableCard({
307
301
  padding={padding}
308
302
  variant={variant}
309
303
  elevation={elevation}
310
- {...mergeProps(themeProps('clickable-card', {variant}), {
311
- className: classNameProp,
304
+ {...mergeProps(
305
+ themeProps('clickable-card', {variant}),
306
+ focusOutlineProps.focusWithin(),
307
+ classNameProp,
312
308
  style,
313
- })}
309
+ )}
314
310
  xstyle={
315
311
  [
316
312
  styles.interactive,
317
- styles.focusWithin,
318
313
  hasBorder ? styles.bordered : styles.borderless,
319
314
  !isDisabled && styles.overlay,
320
315
  !isDisabled && styles.hoverOnPointer,
@@ -142,6 +142,9 @@ export const docs = {
142
142
  targets: [
143
143
  {className: 'astryx-code', visualProps: ['color']},
144
144
  {className: 'astryx-codeblock', visualProps: ['size', 'language', 'container']},
145
+ {className: 'astryx-codeblock-header', visualProps: ['size', 'language', 'container']},
146
+ {className: 'astryx-codeblock-title', visualProps: ['size', 'language']},
147
+ {className: 'astryx-codeblock-copy-button'},
145
148
  ],
146
149
  },
147
150
  usage: {
@@ -15,6 +15,13 @@ import {CodeBlock} from './CodeBlock';
15
15
  import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
16
16
  import {dracula} from '../theme/syntax';
17
17
  import {InternationalizationProvider} from '../i18n';
18
+ import {defineTheme} from '../theme/defineTheme';
19
+ import {generateThemeCSS} from '../theme/generateThemeRules';
20
+
21
+ function generateThemeTestCSS(theme: Parameters<typeof generateThemeCSS>[0]) {
22
+ const {prose, component} = generateThemeCSS(theme);
23
+ return [prose, component].filter(Boolean).join('\n\n');
24
+ }
18
25
 
19
26
  function politeRegion(): HTMLElement | null {
20
27
  return document.querySelector('[data-astryx-live-region="polite"]');
@@ -64,6 +71,30 @@ describe('CodeBlock', () => {
64
71
  expect(navigator.clipboard.writeText).toHaveBeenCalledWith('const x = 1;');
65
72
  });
66
73
 
74
+ it('renders the copy button as a themeable target with a "Copy code" tooltip', () => {
75
+ render(<CodeBlock code="const x = 1;" language="javascript" />);
76
+ const copyButton = screen.getByRole('button', {name: 'Copy code'});
77
+ // Theme seam: a design system can restyle the copy control via this class
78
+ // without turning the button off and re-implementing it.
79
+ expect(copyButton).toHaveClass('astryx-codeblock-copy-button');
80
+ // The button carries a visible "Copy code" hover/focus hint (tooltip),
81
+ // wired through aria-describedby — a bare <button> could not.
82
+ expect(copyButton).toHaveAttribute('aria-describedby');
83
+ });
84
+
85
+ it('keeps the copy button tooltip as "Copy code" after copying', async () => {
86
+ render(<CodeBlock code="const x = 1;" language="javascript" />);
87
+ fireEvent.click(screen.getByRole('button', {name: 'Copy code'}));
88
+ await act(async () => {});
89
+ // The icon flip (copy → check) is the confirmation; the tooltip text does
90
+ // not change. The accessible name still swaps to "Copied" for AT.
91
+ const copyButton = screen.getByRole('button', {name: 'Copied'});
92
+ const tooltipId = copyButton.getAttribute('aria-describedby');
93
+ expect(tooltipId).toBeTruthy();
94
+ const tooltip = document.getElementById(tooltipId as string);
95
+ expect(tooltip).toHaveTextContent('Copy code');
96
+ });
97
+
67
98
  it('announces "Copied" to a polite live region after copying', async () => {
68
99
  render(<CodeBlock code="const x = 1;" language="javascript" />);
69
100
  const copyButton = screen.getByRole('button', {name: 'Copy code'});
@@ -304,4 +335,64 @@ describe('CodeBlock', () => {
304
335
  expect(container.querySelector('[data-astryx-syntax-theme]')).toBeNull();
305
336
  expect(container.firstElementChild?.tagName).toBe('PRE');
306
337
  });
338
+
339
+ describe('header theming targets', () => {
340
+ it('puts astryx-codeblock-header on the header row when a header shows', () => {
341
+ const {container} = render(
342
+ <CodeBlock
343
+ code="const x = 1;"
344
+ language="javascript"
345
+ title="example.js"
346
+ />,
347
+ );
348
+ expect(
349
+ container.querySelector('.astryx-codeblock-header'),
350
+ ).not.toBeNull();
351
+ });
352
+
353
+ it('puts astryx-codeblock-title on the header title element', () => {
354
+ const {container} = render(
355
+ <CodeBlock
356
+ code="const x = 1;"
357
+ language="javascript"
358
+ title="example.js"
359
+ />,
360
+ );
361
+ const titleEl = container.querySelector('.astryx-codeblock-title');
362
+ expect(titleEl).not.toBeNull();
363
+ // The language label + title text live in this element.
364
+ expect(titleEl).toHaveTextContent('example.js');
365
+ });
366
+
367
+ it('renders no header targets when there is no header', () => {
368
+ // plaintext hides the language label and no title is given, so the
369
+ // header row is not rendered at all.
370
+ const {container} = render(
371
+ <CodeBlock code="const x = 1;" language="plaintext" />,
372
+ );
373
+ expect(container.querySelector('.astryx-codeblock-header')).toBeNull();
374
+ expect(container.querySelector('.astryx-codeblock-title')).toBeNull();
375
+ });
376
+
377
+ it('exposes the header and title as themeable defineTheme targets', () => {
378
+ // jsdom can't resolve the @layer cascade, so this asserts the targets are
379
+ // reachable by a theme via the sanctioned defineTheme channel — replacing
380
+ // the structural `> div:first-child > div > span` header/title selectors a
381
+ // consumer would otherwise need to restyle the header padding and title.
382
+ const theme = defineTheme({
383
+ name: 'codeblock-header-target-test',
384
+ components: {
385
+ 'codeblock-header': {
386
+ base: {paddingBlock: 'var(--spacing-1)'},
387
+ },
388
+ 'codeblock-title': {
389
+ base: {fontSize: 'var(--text-body-size)'},
390
+ },
391
+ },
392
+ });
393
+ const css = generateThemeTestCSS(theme);
394
+ expect(css).toContain('.astryx-codeblock-header');
395
+ expect(css).toContain('.astryx-codeblock-title');
396
+ });
397
+ });
307
398
  });