@astryxdesign/core 0.5.0 → 0.5.1-canary.70169cd

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 (622) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AspectRatio/AspectRatio.d.ts +6 -6
  6. package/dist/Avatar/Avatar.d.ts +25 -1
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +43 -9
  9. package/dist/Avatar/index.d.ts +2 -2
  10. package/dist/Avatar/index.d.ts.map +1 -1
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +5 -2
  15. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  16. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  17. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroupOverflow.js +11 -7
  19. package/dist/Badge/Badge.d.ts.map +1 -1
  20. package/dist/Badge/Badge.js +26 -2
  21. package/dist/Banner/Banner.d.ts +10 -1
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +11 -2
  24. package/dist/Button/Button.d.ts.map +1 -1
  25. package/dist/Button/Button.js +8 -7
  26. package/dist/Calendar/Calendar.d.ts +4 -2
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +15 -21
  29. package/dist/Calendar/hooks/useCalendarDays.js +4 -6
  30. package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
  31. package/dist/Calendar/styles.d.ts +5 -20
  32. package/dist/Calendar/styles.d.ts.map +1 -1
  33. package/dist/Calendar/styles.js +15 -17
  34. package/dist/Card/Card.d.ts +12 -12
  35. package/dist/Card/Card.d.ts.map +1 -1
  36. package/dist/Card/Card.js +17 -9
  37. package/dist/Card/index.d.ts +35 -1
  38. package/dist/Card/index.d.ts.map +1 -1
  39. package/dist/Card/index.js +21 -1
  40. package/dist/Carousel/Carousel.d.ts.map +1 -1
  41. package/dist/Carousel/Carousel.js +108 -7
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +7 -1
  44. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  45. package/dist/CodeBlock/CodeBlock.js +15 -4
  46. package/dist/CodeBlock/highlightRanges.js +1 -1
  47. package/dist/CodeBlock/highlightStyles.js +13 -13
  48. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  49. package/dist/CommandPalette/CommandPaletteItem.js +2 -7
  50. package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +14 -7
  53. package/dist/DateInput/DateInput.d.ts +43 -0
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +22 -5
  56. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  57. package/dist/DateInput/MonthScroller.js +5 -3
  58. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  59. package/dist/DateInput/MonthYearWheels.js +6 -4
  60. package/dist/DateInput/NativeDateField.d.ts +10 -0
  61. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  62. package/dist/DateInput/NativeDateField.js +494 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +52 -25
  65. package/dist/DateInput/Wheel.d.ts.map +1 -1
  66. package/dist/DateInput/Wheel.js +1 -0
  67. package/dist/DateInput/index.d.ts +1 -1
  68. package/dist/DateInput/index.d.ts.map +1 -1
  69. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  70. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  71. package/dist/DateInput/nativeDateSegments.js +111 -0
  72. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  73. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  74. package/dist/DateRangeInput/DateRangeInput.js +3 -5
  75. package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
  76. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  77. package/dist/DateTimeInput/DateTimeInput.js +35 -10
  78. package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
  79. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
  80. package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
  81. package/dist/Dialog/Dialog.d.ts +16 -2
  82. package/dist/Dialog/Dialog.d.ts.map +1 -1
  83. package/dist/Dialog/Dialog.js +28 -7
  84. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  86. package/dist/Field/FieldLabel.d.ts.map +1 -1
  87. package/dist/Field/FieldLabel.js +9 -1
  88. package/dist/Field/InputClearButton.d.ts +9 -3
  89. package/dist/Field/InputClearButton.d.ts.map +1 -1
  90. package/dist/Field/InputClearButton.js +14 -3
  91. package/dist/Heading/Heading.d.ts.map +1 -1
  92. package/dist/Heading/Heading.js +0 -1
  93. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/HoverCard.js +104 -3
  95. package/dist/HoverCard/useHoverCard.d.ts +14 -2
  96. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  97. package/dist/HoverCard/useHoverCard.js +7 -1
  98. package/dist/Icon/Icon.d.ts +4 -2
  99. package/dist/Icon/Icon.d.ts.map +1 -1
  100. package/dist/Icon/defaultIcons.d.ts +3 -2
  101. package/dist/Icon/defaultIcons.d.ts.map +1 -1
  102. package/dist/Icon/defaultIcons.js +7 -0
  103. package/dist/Icon/globalIconRegistry.d.ts +13 -0
  104. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  105. package/dist/Icon/globalIconRegistry.js +34 -6
  106. package/dist/Icon/index.d.ts +1 -1
  107. package/dist/Icon/index.d.ts.map +1 -1
  108. package/dist/Icon/useIcon.d.ts +5 -2
  109. package/dist/Icon/useIcon.d.ts.map +1 -1
  110. package/dist/Icon/useIcon.js +3 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  112. package/dist/Indicator/CheckboxIndicator.js +6 -2
  113. package/dist/Item/Item.d.ts.map +1 -1
  114. package/dist/Item/Item.js +2 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -26
  117. package/dist/Layer/gestureCounter.d.ts +8 -0
  118. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  119. package/dist/Layer/gestureCounter.js +53 -0
  120. package/dist/Layer/useLayer.d.ts +23 -13
  121. package/dist/Layer/useLayer.d.ts.map +1 -1
  122. package/dist/Layer/useLayer.js +146 -24
  123. package/dist/List/List.d.ts +1 -1
  124. package/dist/List/List.d.ts.map +1 -1
  125. package/dist/List/List.js +15 -4
  126. package/dist/Markdown/Markdown.d.ts +1 -1
  127. package/dist/Markdown/Markdown.d.ts.map +1 -1
  128. package/dist/Markdown/Markdown.js +20 -7
  129. package/dist/Markdown/parser.d.ts.map +1 -1
  130. package/dist/Markdown/parser.js +5 -3
  131. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  132. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  133. package/dist/MetadataList/MetadataListItem.js +4 -1
  134. package/dist/MultiSelector/MultiSelector.d.ts +18 -1
  135. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  136. package/dist/MultiSelector/MultiSelector.js +58 -11
  137. package/dist/MultiSelector/hooks.d.ts +7 -1
  138. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  139. package/dist/MultiSelector/hooks.js +3 -2
  140. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  141. package/dist/NavIcon/NavIcon.js +5 -1
  142. package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
  143. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  144. package/dist/NavItem/navItemStyles.stylex.js +0 -2
  145. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  146. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  147. package/dist/NavMenu/NavHeadingMenu.js +7 -4
  148. package/dist/NumberInput/NumberInput.d.ts +6 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +95 -126
  151. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  152. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  153. package/dist/NumberInput/numberInputCommit.js +71 -0
  154. package/dist/NumberInput/numberParser.d.ts +64 -0
  155. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  156. package/dist/NumberInput/numberParser.js +350 -0
  157. package/dist/Outline/Outline.d.ts.map +1 -1
  158. package/dist/Outline/Outline.js +2 -3
  159. package/dist/OverflowList/OverflowList.d.ts +41 -1
  160. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  161. package/dist/OverflowList/OverflowList.js +43 -2
  162. package/dist/Popover/Popover.d.ts.map +1 -1
  163. package/dist/Popover/Popover.js +8 -14
  164. package/dist/Popover/usePopover.d.ts +15 -41
  165. package/dist/Popover/usePopover.d.ts.map +1 -1
  166. package/dist/Popover/usePopover.js +26 -7
  167. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
  169. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  170. package/dist/PowerSearch/formatFilterValue.js +4 -2
  171. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  172. package/dist/ProgressBar/ProgressBar.js +18 -5
  173. package/dist/Resizable/useResizable.d.ts +19 -1
  174. package/dist/Resizable/useResizable.d.ts.map +1 -1
  175. package/dist/Resizable/useResizable.js +104 -38
  176. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.js +9 -0
  178. package/dist/Selector/Selector.d.ts +18 -1
  179. package/dist/Selector/Selector.d.ts.map +1 -1
  180. package/dist/Selector/Selector.js +92 -21
  181. package/dist/Selector/hooks.d.ts +7 -1
  182. package/dist/Selector/hooks.d.ts.map +1 -1
  183. package/dist/Selector/hooks.js +3 -2
  184. package/dist/SideNav/SideNav.d.ts +6 -1
  185. package/dist/SideNav/SideNav.d.ts.map +1 -1
  186. package/dist/SideNav/SideNav.js +57 -27
  187. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  188. package/dist/SideNav/SideNavHeading.js +5 -4
  189. package/dist/SideNav/SideNavItem.d.ts +29 -4
  190. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  191. package/dist/SideNav/SideNavItem.js +75 -20
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +34 -2
  194. package/dist/Spinner/Spinner.d.ts +3 -1
  195. package/dist/Spinner/Spinner.d.ts.map +1 -1
  196. package/dist/Spinner/Spinner.js +199 -20
  197. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  198. package/dist/StatusDot/StatusDot.js +6 -1
  199. package/dist/Stepper/Step.d.ts.map +1 -1
  200. package/dist/Stepper/Step.js +7 -6
  201. package/dist/Switch/Switch.d.ts.map +1 -1
  202. package/dist/Switch/Switch.js +5 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +6 -1
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +3 -6
  207. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  208. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  210. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  211. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +34 -3
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +25 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  215. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  216. package/dist/Text/Text.d.ts.map +1 -1
  217. package/dist/Text/Text.js +0 -1
  218. package/dist/TextArea/TextArea.d.ts.map +1 -1
  219. package/dist/TextArea/TextArea.js +13 -8
  220. package/dist/Timestamp/Timestamp.d.ts +1 -1
  221. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  222. package/dist/Timestamp/Timestamp.js +10 -18
  223. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  224. package/dist/Timestamp/formatInstant.js +10 -5
  225. package/dist/Toast/Toast.d.ts +17 -2
  226. package/dist/Toast/Toast.d.ts.map +1 -1
  227. package/dist/Toast/Toast.js +77 -11
  228. package/dist/Toast/ToastViewport.d.ts +1 -0
  229. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  230. package/dist/Toast/ToastViewport.js +76 -21
  231. package/dist/Toast/index.d.ts +1 -1
  232. package/dist/Toast/index.d.ts.map +1 -1
  233. package/dist/Toast/types.d.ts +38 -0
  234. package/dist/Toast/types.d.ts.map +1 -1
  235. package/dist/Toast/useToastGesture.d.ts +26 -0
  236. package/dist/Toast/useToastGesture.d.ts.map +1 -0
  237. package/dist/Toast/useToastGesture.js +223 -0
  238. package/dist/Token/Token.d.ts +1 -1
  239. package/dist/Token/Token.d.ts.map +1 -1
  240. package/dist/Token/Token.js +23 -12
  241. package/dist/Token/TokenLink.d.ts +1 -1
  242. package/dist/Token/TokenLink.d.ts.map +1 -1
  243. package/dist/Token/TokenLink.js +5 -2
  244. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  245. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  246. package/dist/Tokenizer/Tokenizer.js +31 -21
  247. package/dist/TopNav/TopNavHeading.js +2 -2
  248. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  249. package/dist/TopNav/TopNavItem.js +3 -3
  250. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  251. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavMegaMenu.js +30 -9
  253. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
  255. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +21 -6
  258. package/dist/TreeList/TreeList.d.ts +1 -1
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +7 -2
  261. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  262. package/dist/TreeList/TreeListItem.js +2 -2
  263. package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
  264. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  265. package/dist/Typeahead/BaseTypeahead.js +51 -8
  266. package/dist/Typeahead/Typeahead.d.ts +8 -1
  267. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  268. package/dist/Typeahead/Typeahead.js +2 -0
  269. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  270. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  271. package/dist/Typeahead/TypeaheadItem.js +7 -2
  272. package/dist/astryx.css +87 -22
  273. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  274. package/dist/hooks/useHotkeys.js +3 -25
  275. package/dist/hooks/useOverflow.d.ts.map +1 -1
  276. package/dist/hooks/useOverflow.js +14 -4
  277. package/dist/i18n/InternationalizationContext.d.ts +2 -0
  278. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  279. package/dist/i18n/InternationalizationContext.js +3 -1
  280. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  281. package/dist/i18n/InternationalizationProvider.js +3 -1
  282. package/dist/i18n/resolve.d.ts +1 -1
  283. package/dist/i18n/resolve.d.ts.map +1 -1
  284. package/dist/i18n/resolve.js +37 -38
  285. package/dist/i18n/useTranslator.d.ts.map +1 -1
  286. package/dist/i18n/useTranslator.js +2 -3
  287. package/dist/index.d.ts +1 -1
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/theme/Theme.d.ts.map +1 -1
  290. package/dist/theme/Theme.js +46 -10
  291. package/dist/theme/defineTheme.d.ts +9 -3
  292. package/dist/theme/defineTheme.d.ts.map +1 -1
  293. package/dist/theme/defineTheme.js +5 -0
  294. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  295. package/dist/theme/derivedVarRegistry.js +24 -4
  296. package/dist/theme/generateThemeRules.d.ts +21 -0
  297. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  298. package/dist/theme/generateThemeRules.js +26 -0
  299. package/dist/theme/syntax/tokens.d.ts +1 -1
  300. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  301. package/dist/theme/syntax/tokens.js +5 -2
  302. package/dist/theme/useTheme.d.ts.map +1 -1
  303. package/dist/theme/useTheme.js +6 -7
  304. package/dist/utils/dateParser.d.ts +5 -8
  305. package/dist/utils/dateParser.d.ts.map +1 -1
  306. package/dist/utils/dateParser.js +10 -11
  307. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  308. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  309. package/dist/utils/focusOutline.stylex.js +15 -0
  310. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  311. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  312. package/dist/utils/interactionOverlay.stylex.js +42 -0
  313. package/dist/utils/isApplePlatform.d.ts +18 -0
  314. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  315. package/dist/utils/isApplePlatform.js +37 -0
  316. package/dist/utils/plainDate.d.ts +11 -0
  317. package/dist/utils/plainDate.d.ts.map +1 -1
  318. package/dist/utils/plainDate.js +20 -4
  319. package/locales/af-ZA.json +7 -7
  320. package/locales/ar-SA.json +7 -7
  321. package/locales/ca-ES.json +6 -6
  322. package/locales/cs-CZ.json +7 -7
  323. package/locales/da-DK.json +7 -7
  324. package/locales/de-DE.json +7 -7
  325. package/locales/el-GR.json +7 -7
  326. package/locales/en.json +178 -6
  327. package/locales/es-ES.json +6 -6
  328. package/locales/fi-FI.json +7 -7
  329. package/locales/fr-FR.json +7 -7
  330. package/locales/he-IL.json +7 -7
  331. package/locales/hu-HU.json +7 -7
  332. package/locales/it-IT.json +7 -7
  333. package/locales/ja-JP.json +7 -7
  334. package/locales/ko-KR.json +7 -7
  335. package/locales/nl-NL.json +7 -7
  336. package/locales/no-NO.json +7 -7
  337. package/locales/pl-PL.json +7 -7
  338. package/locales/pseudo.json +130 -1
  339. package/locales/pt-BR.json +7 -7
  340. package/locales/pt-PT.json +7 -7
  341. package/locales/ro-RO.json +7 -7
  342. package/locales/ru-RU.json +7 -7
  343. package/locales/sr-SP.json +7 -7
  344. package/locales/sv-SE.json +7 -7
  345. package/locales/tr-TR.json +7 -7
  346. package/locales/uk-UA.json +7 -7
  347. package/locales/vi-VN.json +7 -7
  348. package/locales/zh-CN.json +7 -7
  349. package/locales/zh-TW.json +7 -7
  350. package/package.json +4 -5
  351. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  352. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  353. package/src/AlertDialog/AlertDialog.tsx +62 -20
  354. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  355. package/src/AspectRatio/AspectRatio.tsx +6 -6
  356. package/src/Avatar/Avatar.doc.mjs +12 -2
  357. package/src/Avatar/Avatar.test.tsx +80 -0
  358. package/src/Avatar/Avatar.tsx +64 -14
  359. package/src/Avatar/index.ts +2 -2
  360. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  361. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  362. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  363. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  364. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  365. package/src/Badge/Badge.doc.mjs +3 -2
  366. package/src/Badge/Badge.test.tsx +32 -3
  367. package/src/Badge/Badge.tsx +42 -1
  368. package/src/Banner/Banner.doc.mjs +9 -0
  369. package/src/Banner/Banner.test.tsx +76 -11
  370. package/src/Banner/Banner.tsx +21 -2
  371. package/src/Button/Button.doc.mjs +2 -1
  372. package/src/Button/Button.test.tsx +19 -4
  373. package/src/Button/Button.tsx +9 -29
  374. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  375. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  376. package/src/Calendar/Calendar.doc.mjs +4 -4
  377. package/src/Calendar/Calendar.test.tsx +112 -0
  378. package/src/Calendar/Calendar.tsx +18 -16
  379. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  380. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  381. package/src/Calendar/styles.ts +48 -42
  382. package/src/Card/Card.doc.mjs +10 -7
  383. package/src/Card/Card.test.tsx +113 -19
  384. package/src/Card/Card.tsx +67 -89
  385. package/src/Card/index.ts +36 -1
  386. package/src/Carousel/Carousel.doc.mjs +3 -0
  387. package/src/Carousel/Carousel.test.tsx +360 -0
  388. package/src/Carousel/Carousel.tsx +116 -15
  389. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -1
  390. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  391. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  392. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  393. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  394. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  395. package/src/CodeBlock/CodeBlock.tsx +20 -4
  396. package/src/CodeBlock/highlightRanges.ts +1 -1
  397. package/src/CodeBlock/highlightStyles.ts +13 -13
  398. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  399. package/src/ComplexSelector/ComplexSelector.doc.mjs +9 -2
  400. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  401. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  402. package/src/DateInput/DateInput.doc.mjs +17 -1
  403. package/src/DateInput/DateInput.test.tsx +9 -4
  404. package/src/DateInput/DateInput.tsx +54 -3
  405. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  406. package/src/DateInput/MonthScroller.tsx +5 -1
  407. package/src/DateInput/MonthYearWheels.tsx +7 -4
  408. package/src/DateInput/NativeDateField.test.tsx +635 -0
  409. package/src/DateInput/NativeDateField.tsx +641 -0
  410. package/src/DateInput/TouchDateField.tsx +83 -33
  411. package/src/DateInput/Wheel.tsx +1 -0
  412. package/src/DateInput/index.ts +1 -0
  413. package/src/DateInput/nativeDateSegments.ts +127 -0
  414. package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -3
  415. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  416. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  417. package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
  418. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  419. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  420. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  421. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  422. package/src/Dialog/Dialog.test.tsx +185 -18
  423. package/src/Dialog/Dialog.tsx +35 -11
  424. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  425. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  426. package/src/Field/Field.doc.mjs +1 -1
  427. package/src/Field/FieldLabel.test.tsx +29 -0
  428. package/src/Field/FieldLabel.tsx +7 -0
  429. package/src/Field/InputClearButton.test.tsx +15 -1
  430. package/src/Field/InputClearButton.tsx +28 -4
  431. package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
  432. package/src/FileInput/FileInput.doc.mjs +1 -1
  433. package/src/Heading/Heading.tsx +0 -1
  434. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  435. package/src/HoverCard/HoverCard.test.tsx +154 -4
  436. package/src/HoverCard/HoverCard.tsx +137 -3
  437. package/src/HoverCard/useHoverCard.tsx +23 -3
  438. package/src/Icon/Icon.test.tsx +55 -1
  439. package/src/Icon/Icon.tsx +5 -3
  440. package/src/Icon/defaultIcons.tsx +11 -2
  441. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  442. package/src/Icon/globalIconRegistry.tsx +37 -6
  443. package/src/Icon/index.ts +1 -0
  444. package/src/Icon/useIcon.ts +9 -2
  445. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  446. package/src/Indicator/Indicator.doc.mjs +3 -1
  447. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  448. package/src/Item/Item.tsx +2 -7
  449. package/src/Kbd/Kbd.test.tsx +0 -17
  450. package/src/Kbd/Kbd.tsx +2 -26
  451. package/src/Layer/gestureCounter.ts +57 -0
  452. package/src/Layer/useLayer.test.tsx +368 -16
  453. package/src/Layer/useLayer.tsx +208 -35
  454. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  455. package/src/List/List.test.tsx +38 -0
  456. package/src/List/List.tsx +8 -1
  457. package/src/Markdown/Markdown.test.tsx +37 -0
  458. package/src/Markdown/Markdown.tsx +16 -5
  459. package/src/Markdown/parser.test.ts +33 -0
  460. package/src/Markdown/parser.ts +9 -3
  461. package/src/MetadataList/MetadataList.test.tsx +75 -2
  462. package/src/MetadataList/MetadataListItem.tsx +5 -2
  463. package/src/MultiSelector/MultiSelector.doc.mjs +23 -2
  464. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  465. package/src/MultiSelector/MultiSelector.tsx +103 -16
  466. package/src/MultiSelector/hooks.ts +9 -2
  467. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  468. package/src/NavIcon/NavIcon.test.tsx +9 -0
  469. package/src/NavIcon/NavIcon.tsx +5 -1
  470. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  471. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  472. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  473. package/src/NumberInput/NumberInput.doc.mjs +27 -8
  474. package/src/NumberInput/NumberInput.test.tsx +563 -8
  475. package/src/NumberInput/NumberInput.tsx +77 -131
  476. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  477. package/src/NumberInput/numberInputCommit.ts +103 -0
  478. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  479. package/src/NumberInput/numberParser.test.ts +222 -0
  480. package/src/NumberInput/numberParser.ts +403 -0
  481. package/src/Outline/Outline.tsx +2 -4
  482. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  483. package/src/OverflowList/OverflowList.test.tsx +550 -4
  484. package/src/OverflowList/OverflowList.tsx +100 -2
  485. package/src/Pagination/Pagination.test.tsx +3 -2
  486. package/src/Popover/Popover.doc.mjs +2 -2
  487. package/src/Popover/Popover.test.tsx +38 -0
  488. package/src/Popover/Popover.tsx +28 -66
  489. package/src/Popover/usePopover.tsx +44 -5
  490. package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
  491. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  492. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  493. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  494. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  495. package/src/PowerSearch/formatFilterValue.ts +2 -0
  496. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  497. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  498. package/src/ProgressBar/ProgressBar.tsx +28 -8
  499. package/src/RadioList/RadioList.doc.mjs +1 -1
  500. package/src/Resizable/Resizable.doc.mjs +2 -2
  501. package/src/Resizable/useResizable.doc.mjs +21 -2
  502. package/src/Resizable/useResizable.test.ts +421 -0
  503. package/src/Resizable/useResizable.ts +133 -48
  504. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  505. package/src/SelectableCard/SelectableCard.tsx +16 -0
  506. package/src/Selector/Selector.doc.mjs +15 -1
  507. package/src/Selector/Selector.source-build.test.mjs +65 -0
  508. package/src/Selector/Selector.test.tsx +301 -0
  509. package/src/Selector/Selector.tsx +145 -32
  510. package/src/Selector/hooks.ts +17 -2
  511. package/src/SideNav/SideNav.doc.mjs +2 -2
  512. package/src/SideNav/SideNav.test.tsx +1069 -6
  513. package/src/SideNav/SideNav.tsx +109 -38
  514. package/src/SideNav/SideNavHeading.tsx +5 -2
  515. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  516. package/src/SideNav/SideNavItem.tsx +134 -44
  517. package/src/Slider/Slider.doc.mjs +2 -2
  518. package/src/Slider/Slider.test.tsx +106 -1
  519. package/src/Slider/Slider.tsx +52 -1
  520. package/src/Spinner/Spinner.doc.mjs +17 -5
  521. package/src/Spinner/Spinner.test.tsx +164 -0
  522. package/src/Spinner/Spinner.tsx +252 -22
  523. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  524. package/src/StatusDot/StatusDot.test.tsx +9 -0
  525. package/src/StatusDot/StatusDot.tsx +7 -1
  526. package/src/Stepper/Step.doc.mjs +1 -1
  527. package/src/Stepper/Step.tsx +7 -14
  528. package/src/Switch/Switch.doc.mjs +3 -1
  529. package/src/Switch/Switch.test.tsx +10 -0
  530. package/src/Switch/Switch.tsx +3 -0
  531. package/src/Table/BaseTable.tsx +6 -1
  532. package/src/Table/Table.doc.mjs +5 -3
  533. package/src/Table/Table.tsx +3 -8
  534. package/src/Table/TableBody.doc.mjs +2 -2
  535. package/src/Table/TableFooter.doc.mjs +1 -1
  536. package/src/Table/TableHeader.doc.mjs +1 -1
  537. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  538. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  539. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  540. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  541. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  542. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  543. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  544. package/src/Table/useTablePagination.doc.mjs +1 -1
  545. package/src/Table/useTableSelection.doc.mjs +1 -1
  546. package/src/Text/Text.test.tsx +44 -0
  547. package/src/Text/Text.tsx +0 -1
  548. package/src/TextArea/TextArea.doc.mjs +13 -3
  549. package/src/TextArea/TextArea.test.tsx +11 -0
  550. package/src/TextArea/TextArea.tsx +34 -22
  551. package/src/TextInput/TextInput.doc.mjs +1 -1
  552. package/src/TimeInput/TimeInput.doc.mjs +1 -1
  553. package/src/Timestamp/Timestamp.test.tsx +89 -0
  554. package/src/Timestamp/Timestamp.tsx +8 -8
  555. package/src/Timestamp/formatInstant.ts +5 -0
  556. package/src/Toast/Toast.doc.mjs +213 -44
  557. package/src/Toast/Toast.tsx +118 -23
  558. package/src/Toast/ToastViewport.test.tsx +1434 -8
  559. package/src/Toast/ToastViewport.tsx +85 -14
  560. package/src/Toast/index.ts +2 -0
  561. package/src/Toast/types.ts +43 -5
  562. package/src/Toast/useToastGesture.ts +361 -0
  563. package/src/Token/Token.test.tsx +95 -0
  564. package/src/Token/Token.tsx +19 -17
  565. package/src/Token/TokenLink.tsx +12 -3
  566. package/src/Tokenizer/Tokenizer.doc.mjs +17 -4
  567. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  568. package/src/Tokenizer/Tokenizer.tsx +49 -24
  569. package/src/TopNav/TopNavHeading.tsx +2 -2
  570. package/src/TopNav/TopNavItem.tsx +3 -7
  571. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  572. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  573. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  574. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  575. package/src/TopNav/TopNavMenu.tsx +38 -5
  576. package/src/TreeList/TreeList.test.tsx +49 -0
  577. package/src/TreeList/TreeList.tsx +7 -2
  578. package/src/TreeList/TreeListItem.tsx +2 -7
  579. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  580. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  581. package/src/Typeahead/Typeahead.doc.mjs +7 -1
  582. package/src/Typeahead/Typeahead.test.tsx +154 -0
  583. package/src/Typeahead/Typeahead.tsx +9 -0
  584. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  585. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  586. package/src/hooks/useAnnounce.doc.mjs +96 -0
  587. package/src/hooks/useDevWarning.doc.mjs +96 -0
  588. package/src/hooks/useHotkeys.test.ts +0 -18
  589. package/src/hooks/useHotkeys.ts +3 -25
  590. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  591. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  592. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  593. package/src/hooks/useLongPress.doc.mjs +123 -0
  594. package/src/hooks/useOverflow.doc.mjs +58 -17
  595. package/src/hooks/useOverflow.ts +16 -4
  596. package/src/hooks/useTypeahead.doc.mjs +153 -0
  597. package/src/i18n/InternationalizationContext.ts +3 -0
  598. package/src/i18n/InternationalizationProvider.tsx +8 -1
  599. package/src/i18n/__tests__/resolve.test.ts +23 -1
  600. package/src/i18n/resolve.ts +46 -49
  601. package/src/i18n/useTranslator.ts +2 -7
  602. package/src/index.ts +2 -0
  603. package/src/raw-import.d.ts +14 -0
  604. package/src/theme/Theme.test.tsx +104 -2
  605. package/src/theme/Theme.tsx +49 -14
  606. package/src/theme/defineTheme.test.ts +23 -0
  607. package/src/theme/defineTheme.ts +12 -3
  608. package/src/theme/derivedVarRegistry.test.ts +87 -3
  609. package/src/theme/derivedVarRegistry.ts +23 -4
  610. package/src/theme/generateThemeRules.test.ts +99 -1
  611. package/src/theme/generateThemeRules.ts +28 -0
  612. package/src/theme/syntax/tokens.ts +5 -2
  613. package/src/theme/useTheme.test.tsx +10 -0
  614. package/src/theme/useTheme.ts +16 -10
  615. package/src/utils/dateParser.test.ts +34 -2
  616. package/src/utils/dateParser.ts +11 -14
  617. package/src/utils/focusOutline.stylex.ts +50 -0
  618. package/src/utils/interactionOverlay.stylex.ts +74 -0
  619. package/src/utils/isApplePlatform.test.ts +61 -0
  620. package/src/utils/isApplePlatform.ts +37 -0
  621. package/src/utils/plainDate.test.ts +46 -0
  622. package/src/utils/plainDate.ts +18 -3
@@ -176,12 +176,6 @@ const styles = stylex.create({
176
176
  },
177
177
  scrollbarWidth: 'none',
178
178
  maskImage: 'none',
179
- transitionProperty: 'mask-image',
180
- transitionDuration: {
181
- default: durationVars['--duration-medium'],
182
- '@media (prefers-reduced-motion: reduce)': '0ms',
183
- },
184
- transitionTimingFunction: easeVars['--ease-standard'],
185
179
  },
186
180
  fadeStart: {
187
181
  maskImage: `linear-gradient(to right, transparent 0%, rgba(0,0,0,0.3) 2px, black ${spacingVars['--spacing-1']})`,
@@ -341,6 +335,13 @@ export function Carousel({
341
335
  const t = useTranslator();
342
336
  const ariaLabel = ariaLabelFromProps ?? t('@astryx.carousel.label');
343
337
  const scrollElRef = useRef<HTMLElement | null>(null);
338
+ const startButtonRef = useRef<HTMLButtonElement>(null);
339
+ const endButtonRef = useRef<HTMLButtonElement>(null);
340
+ // Which nav button last held focus, and what the overflow state was on the
341
+ // previous render. Together they are how the Effect below recognises the one
342
+ // transition it is allowed to act on.
343
+ const focusedNavRef = useRef<'start' | 'end' | null>(null);
344
+ const prevCanScrollRef = useRef<{start: boolean; end: boolean} | null>(null);
344
345
  const {scrollRef, overflowStart, overflowEnd, hasOverflow} =
345
346
  useScrollOverflow();
346
347
 
@@ -487,6 +488,76 @@ export function Carousel({
487
488
  const canScrollStart = hasLoop && hasOverflow ? true : overflowStart;
488
489
  const canScrollEnd = hasLoop && hasOverflow ? true : overflowEnd;
489
490
 
491
+ // Keep the keyboard user where they are when a nav button disables under
492
+ // them. The browser drops focus off a control it disables, so reaching an
493
+ // edge used to land the user on <body> and cost them their place in the page.
494
+ //
495
+ // This is an Effect on purpose, and the exception is narrow. The thing that
496
+ // disables the button IS this state transition, so it is the only correct
497
+ // trigger: three attempts to predict it from the press -- the position after
498
+ // the scroll, the position before it plus the step, and the settled position
499
+ // reported by `scrollend` -- were each wrong somewhere, under reduced motion,
500
+ // under mandatory scroll-snap, and on a browser that never fires the event.
501
+ // Running after the commit also makes the opposite button a valid receiver,
502
+ // which it is not during the press: at that moment it is still disabled and
503
+ // focus() on a disabled control does nothing. Ruled acceptable by the
504
+ // maintainer, 2026-08-27, on the conditions encoded below: it acts only on
505
+ // the transition that newly disables the focused button, it moves focus and
506
+ // nothing else, and it cannot fire twice for one transition.
507
+ //
508
+ // Which button the person is on is tracked by the buttons' own focus and blur
509
+ // handlers, and the blur has to ignore the one the commit itself causes: a
510
+ // tracker that outlived the person let a later edge -- a swipe, a resize, no
511
+ // press at all -- pull their focus back onto a control they never chose.
512
+ useEffect(() => {
513
+ const previous = prevCanScrollRef.current;
514
+ prevCanScrollRef.current = {start: canScrollStart, end: canScrollEnd};
515
+ const side = focusedNavRef.current;
516
+ if (previous == null || side == null) {
517
+ return;
518
+ }
519
+
520
+ // Only the edge that just ran out, and only while it held focus. An edge
521
+ // that was already disabled, or one the user was not on, is not ours.
522
+ const wasEnabled = side === 'start' ? previous.start : previous.end;
523
+ const isEnabled = side === 'start' ? canScrollStart : canScrollEnd;
524
+ if (!wasEnabled || isEnabled) {
525
+ return;
526
+ }
527
+
528
+ const pressed =
529
+ side === 'start' ? startButtonRef.current : endButtonRef.current;
530
+ if (pressed == null) {
531
+ return;
532
+ }
533
+ // The browser has already blurred it, so focus reads as the body. Anything
534
+ // else means the user moved on themselves and this is not ours to redirect.
535
+ const active = pressed.ownerDocument.activeElement;
536
+ if (active !== pressed && active !== pressed.ownerDocument.body) {
537
+ return;
538
+ }
539
+
540
+ const opposite =
541
+ side === 'start' ? endButtonRef.current : startButtonRef.current;
542
+ // The opposite button is the receiver. It is disabled only when the
543
+ // carousel stopped overflowing entirely, which happens when its content
544
+ // shrinks; the scroll container is then the nearest tab stop still inside
545
+ // the labelled region.
546
+ const receiver =
547
+ opposite != null && !opposite.disabled ? opposite : scrollElRef.current;
548
+ if (receiver == null) {
549
+ return;
550
+ }
551
+
552
+ // One move per transition: clearing the tracker first means a re-render or
553
+ // a StrictMode double-invoke re-runs this and returns at the `side == null`
554
+ // guard above. Focusing the receiver sets it again, to the other side.
555
+ focusedNavRef.current = null;
556
+ // preventScroll: a plain focus() scrolls its element into view, which on
557
+ // the scroll container cancels the scroll the press just started.
558
+ receiver.focus({preventScroll: true});
559
+ }, [canScrollStart, canScrollEnd]);
560
+
490
561
  const fadeStyle = hasEdgeFade
491
562
  ? (hasLoop && hasOverflow) || (overflowStart && overflowEnd)
492
563
  ? styles.fadeBoth
@@ -523,12 +594,20 @@ export function Carousel({
523
594
  ref={composedRef}
524
595
  tabIndex={0}
525
596
  onWheel={handleWheel}
526
- {...stylex.props(
527
- styles.scroller,
528
- gapStyles[gap],
529
- padding != null && paddingStyles[padding],
530
- hasSnap && styles.snap,
531
- fadeStyle,
597
+ {...mergeProps(
598
+ themeProps('carousel-scroller', {
599
+ gap,
600
+ padding,
601
+ snap: hasSnap ? 'snap' : null,
602
+ edgeFade: hasEdgeFade ? 'edge-fade' : null,
603
+ }),
604
+ stylex.props(
605
+ styles.scroller,
606
+ gapStyles[gap],
607
+ padding != null && paddingStyles[padding],
608
+ hasSnap && styles.snap,
609
+ fadeStyle,
610
+ ),
532
611
  )}>
533
612
  {slides.map((child, index) => (
534
613
  // APG carousel pattern: each slide container is a group with
@@ -560,6 +639,7 @@ export function Carousel({
560
639
  !canScrollStart && styles.buttonHidden,
561
640
  )}>
562
641
  <Button
642
+ ref={startButtonRef}
563
643
  icon={
564
644
  <Icon
565
645
  icon="chevronLeft"
@@ -572,10 +652,21 @@ export function Carousel({
572
652
  size="sm"
573
653
  isIconOnly
574
654
  // Disabled when there's nothing to scroll toward. Keeps the
575
- // button mounted (stable layout/focus) but removes it from the
576
- // tab order and a11y tree while it's visually hidden, so
577
- // keyboard users don't land on an invisible control.
655
+ // button mounted (stable layout) but removes it from the tab
656
+ // order and a11y tree while it's visually hidden, so keyboard
657
+ // users don't land on an invisible control. The Effect above
658
+ // hands focus to the other button when the state behind this
659
+ // one flips it disabled.
578
660
  isDisabled={!canScrollStart}
661
+ onFocus={() => {
662
+ focusedNavRef.current = 'start';
663
+ }}
664
+ onBlur={event => {
665
+ // A disabled button was blurred by the commit, not the person.
666
+ if (!event.currentTarget.disabled) {
667
+ focusedNavRef.current = null;
668
+ }
669
+ }}
579
670
  onClick={() => scrollBy(-1)}
580
671
  xstyle={styles.buttonRadiusOverride}
581
672
  />
@@ -587,6 +678,7 @@ export function Carousel({
587
678
  !canScrollEnd && styles.buttonHidden,
588
679
  )}>
589
680
  <Button
681
+ ref={endButtonRef}
590
682
  icon={
591
683
  <Icon
592
684
  icon="chevronRight"
@@ -601,6 +693,15 @@ export function Carousel({
601
693
  // See "Scroll left" — disabled while visually hidden so the
602
694
  // button stays mounted but out of the tab order / a11y tree.
603
695
  isDisabled={!canScrollEnd}
696
+ onFocus={() => {
697
+ focusedNavRef.current = 'end';
698
+ }}
699
+ onBlur={event => {
700
+ // A disabled button was blurred by the commit, not the person.
701
+ if (!event.currentTarget.disabled) {
702
+ focusedNavRef.current = null;
703
+ }
704
+ }}
604
705
  onClick={() => scrollBy(1)}
605
706
  xstyle={styles.buttonRadiusOverride}
606
707
  />
@@ -6,7 +6,7 @@ export const docs = {
6
6
  name: 'CheckboxInput',
7
7
  displayName: 'Checkbox Input',
8
8
  group: 'Checkbox',
9
- category: 'Data Input',
9
+ category: 'Form Controls',
10
10
  keywords: ["checkbox","check","toggle","tick","indeterminate","boolean","tristate"],
11
11
  props: [
12
12
  {
@@ -133,6 +133,7 @@ export const docs = {
133
133
  {className: 'astryx-checkbox-input', visualProps: ['size']},
134
134
  {className: 'astryx-checkbox-indicator', visualProps: ['size'], states: ['checked', 'disabled']},
135
135
  {className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled'], deprecatedFor: 'checkbox-indicator'},
136
+ {className: 'astryx-checkbox-label'},
136
137
  ],
137
138
  },
138
139
  usage: {
@@ -209,6 +210,7 @@ export const docsZh = {
209
210
  },
210
211
  {className: 'astryx-checkbox-indicator', visualProps: ['size'], states: ['checked', 'disabled']},
211
212
  {className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled'], deprecatedFor: 'checkbox-indicator'},
213
+ {className: 'astryx-checkbox-label'},
212
214
  ],
213
215
  },
214
216
  };
@@ -719,3 +719,18 @@ describe('focus ring ownership (WCAG 2.4.7)', () => {
719
719
  expect(indicatorOf(container).style.outlineStyle).toBe('');
720
720
  });
721
721
  });
722
+
723
+ describe('label theme target', () => {
724
+ it('names its own label so a theme can style it apart from a field label', () => {
725
+ // The control knows this label shares a row with it; the label does not.
726
+ // Both classes land on the one element, so a theme reaches every label
727
+ // through `astryx-field-label` and only this kind through
728
+ // `astryx-checkbox-label`.
729
+ render(
730
+ <CheckboxInput label="Notify me" value={false} onChange={() => {}} />,
731
+ );
732
+ const label = screen.getByText('Notify me').closest('label');
733
+ expect(label).toHaveClass('astryx-field-label');
734
+ expect(label).toHaveClass('astryx-checkbox-label');
735
+ });
736
+ });
@@ -478,6 +478,11 @@ export function CheckboxInput({
478
478
  </div>
479
479
  <div {...stylex.props(styles.labelWrapper)}>
480
480
  <FieldLabel
481
+ // A checkbox's label shares a row with its control, unlike a form
482
+ // field's label above its input. Naming the label rather than the
483
+ // arrangement means a theme asks for the thing it wants, and the
484
+ // component that actually knows what this is says so.
485
+ {...themeProps('checkbox-label')}
481
486
  label={label}
482
487
  inputID={id}
483
488
  isLabelHidden={isLabelHidden}
@@ -6,7 +6,7 @@ export const docs = {
6
6
  name: 'CheckboxList',
7
7
  displayName: 'Checkbox List',
8
8
  group: 'Checkbox',
9
- category: 'Data Input',
9
+ category: 'Form Controls',
10
10
  isHiddenFromOverview: true,
11
11
  keywords: ["checkboxlist","checkbox","checkboxgroup","multichoice","multiselect","checklist"],
12
12
  description: 'Checkbox group container with field integration for label, description, and status.',
@@ -147,10 +147,16 @@ export const docs = {
147
147
  theming: {
148
148
  targets: [
149
149
  {className: 'astryx-code', visualProps: ['color']},
150
- {className: 'astryx-codeblock', visualProps: ['size', 'language', 'container']},
151
- {className: 'astryx-codeblock-header', visualProps: ['size', 'language', 'container']},
152
- {className: 'astryx-codeblock-title', visualProps: ['size', 'language']},
153
- {className: 'astryx-codeblock-copy-button'},
150
+ {className: 'astryx-code-block', visualProps: ['size', 'language', 'container']},
151
+ {className: 'astryx-code-block-header', visualProps: ['size', 'language', 'container']},
152
+ {className: 'astryx-code-block-title', visualProps: ['size', 'language']},
153
+ {className: 'astryx-code-block-copy-button'},
154
+ // Still emitted beside the names above, so themes written against
155
+ // them keep working. Drop in the next major.
156
+ {className: 'astryx-codeblock', visualProps: ['size', 'language', 'container'], deprecatedFor: 'code-block'},
157
+ {className: 'astryx-codeblock-header', visualProps: ['size', 'language', 'container'], deprecatedFor: 'code-block-header'},
158
+ {className: 'astryx-codeblock-title', visualProps: ['size', 'language'], deprecatedFor: 'code-block-title'},
159
+ {className: 'astryx-codeblock-copy-button', deprecatedFor: 'code-block-copy-button'},
154
160
  ],
155
161
  vars: [
156
162
  {name: '--_codeblock-gutter-width', description: 'Width of the line-number gutter, computed from the digit count of the last line so the code column starts at a stable offset.', default: '2ch', private: true},
@@ -396,3 +396,40 @@ describe('CodeBlock', () => {
396
396
  });
397
397
  });
398
398
  });
399
+
400
+ describe('CodeBlock theme target names', () => {
401
+ it('renders the deprecated classes beside the current ones', () => {
402
+ const {container} = render(
403
+ <CodeBlock
404
+ code="const x = 1;"
405
+ language="javascript"
406
+ title="example.js"
407
+ />,
408
+ );
409
+ expect(container.querySelector('.astryx-code-block')).toHaveClass(
410
+ 'astryx-codeblock',
411
+ );
412
+ expect(container.querySelector('.astryx-code-block-header')).toHaveClass(
413
+ 'astryx-codeblock-header',
414
+ );
415
+ expect(container.querySelector('.astryx-code-block-title')).toHaveClass(
416
+ 'astryx-codeblock-title',
417
+ );
418
+ expect(screen.getByRole('button', {name: 'Copy code'})).toHaveClass(
419
+ 'astryx-code-block-copy-button',
420
+ );
421
+ });
422
+
423
+ it('reaches the header and title through the current defineTheme keys', () => {
424
+ const theme = defineTheme({
425
+ name: 'code-block-header-target-test',
426
+ components: {
427
+ 'code-block-header': {base: {paddingBlock: 'var(--spacing-1)'}},
428
+ 'code-block-title': {base: {fontSize: 'var(--text-body-size)'}},
429
+ },
430
+ });
431
+ const css = generateThemeTestCSS(theme);
432
+ expect(css).toContain('.astryx-code-block-header');
433
+ expect(css).toContain('.astryx-code-block-title');
434
+ });
435
+ });
@@ -810,14 +810,20 @@ export function CodeBlock({
810
810
  void handleCopy();
811
811
  }}
812
812
  xstyle={[styles.copyButton, !showHeader && styles.copyButtonAbsolute]}
813
- {...themeProps('codeblock-copy-button')}
813
+ {...themeProps('code-block-copy-button', undefined, {
814
+ legacyNames: ['codeblock-copy-button'],
815
+ })}
814
816
  />
815
817
  ) : null;
816
818
 
817
819
  const headerEl = showHeader ? (
818
820
  <div
819
821
  {...mergeProps(
820
- themeProps('codeblock-header', {size, language, container}),
822
+ themeProps(
823
+ 'code-block-header',
824
+ {size, language, container},
825
+ {legacyNames: ['codeblock-header']},
826
+ ),
821
827
  stylex.props(
822
828
  styles.headerRow,
823
829
  hasLineNumbers ? styles.headerWithDivider : styles.headerCompact,
@@ -845,7 +851,11 @@ export function CodeBlock({
845
851
  )}>
846
852
  <span
847
853
  {...mergeProps(
848
- themeProps('codeblock-title', {size, language}),
854
+ themeProps(
855
+ 'code-block-title',
856
+ {size, language},
857
+ {legacyNames: ['codeblock-title']},
858
+ ),
849
859
  stylex.props(styles.headerTitle),
850
860
  )}>
851
861
  {canCollapse && (
@@ -917,7 +927,13 @@ export function CodeBlock({
917
927
  <pre
918
928
  ref={ref}
919
929
  {...mergeProps(
920
- themeProps('codeblock', {size, language, container}),
930
+ themeProps(
931
+ 'code-block',
932
+ {size, language, container},
933
+ // `codeblock` ran the compound name together; themes styling it keep
934
+ // working until the next major.
935
+ {legacyNames: ['codeblock']},
936
+ ),
921
937
  stylex.props(
922
938
  styles.root,
923
939
  dynamicStyles.width(widthProp),
@@ -67,7 +67,7 @@ function ensureDynamicHighlightType(tokenType: string): void {
67
67
  const name = `astryx-${tokenType}`;
68
68
  const colorVar = `var(--color-syntax-${tokenType}, currentColor)`;
69
69
  dynamicStyleSheet.insertRule(
70
- `.astryx-codeblock code::highlight(${name}), .astryx-codeeditor code::highlight(${name}) { color: ${colorVar}; }`,
70
+ `.astryx-code-block code::highlight(${name}), .astryx-codeeditor code::highlight(${name}) { color: ${colorVar}; }`,
71
71
  );
72
72
  }
73
73
 
@@ -30,31 +30,31 @@ const FALLBACK_TOKENS = `:root {\n${Object.entries(syntaxTokenDefaults)
30
30
  const HIGHLIGHT_STYLES = `
31
31
  ${FALLBACK_TOKENS}
32
32
 
33
- .astryx-codeblock code::highlight(astryx-keyword),
33
+ .astryx-code-block code::highlight(astryx-keyword),
34
34
  .astryx-codeeditor code::highlight(astryx-keyword) { color: var(--color-syntax-keyword); }
35
- .astryx-codeblock code::highlight(astryx-string),
35
+ .astryx-code-block code::highlight(astryx-string),
36
36
  .astryx-codeeditor code::highlight(astryx-string) { color: var(--color-syntax-string); }
37
- .astryx-codeblock code::highlight(astryx-comment),
37
+ .astryx-code-block code::highlight(astryx-comment),
38
38
  .astryx-codeeditor code::highlight(astryx-comment) { color: var(--color-syntax-comment); }
39
- .astryx-codeblock code::highlight(astryx-number),
39
+ .astryx-code-block code::highlight(astryx-number),
40
40
  .astryx-codeeditor code::highlight(astryx-number) { color: var(--color-syntax-number); }
41
- .astryx-codeblock code::highlight(astryx-function),
41
+ .astryx-code-block code::highlight(astryx-function),
42
42
  .astryx-codeeditor code::highlight(astryx-function) { color: var(--color-syntax-function); }
43
- .astryx-codeblock code::highlight(astryx-type),
43
+ .astryx-code-block code::highlight(astryx-type),
44
44
  .astryx-codeeditor code::highlight(astryx-type) { color: var(--color-syntax-type); }
45
- .astryx-codeblock code::highlight(astryx-tag),
45
+ .astryx-code-block code::highlight(astryx-tag),
46
46
  .astryx-codeeditor code::highlight(astryx-tag) { color: var(--color-syntax-tag); }
47
- .astryx-codeblock code::highlight(astryx-attribute),
47
+ .astryx-code-block code::highlight(astryx-attribute),
48
48
  .astryx-codeeditor code::highlight(astryx-attribute) { color: var(--color-syntax-attribute); }
49
- .astryx-codeblock code::highlight(astryx-property),
49
+ .astryx-code-block code::highlight(astryx-property),
50
50
  .astryx-codeeditor code::highlight(astryx-property) { color: var(--color-syntax-property); }
51
- .astryx-codeblock code::highlight(astryx-operator),
51
+ .astryx-code-block code::highlight(astryx-operator),
52
52
  .astryx-codeeditor code::highlight(astryx-operator) { color: var(--color-syntax-operator); }
53
- .astryx-codeblock code::highlight(astryx-constant),
53
+ .astryx-code-block code::highlight(astryx-constant),
54
54
  .astryx-codeeditor code::highlight(astryx-constant) { color: var(--color-syntax-constant); }
55
- .astryx-codeblock code::highlight(astryx-punctuation),
55
+ .astryx-code-block code::highlight(astryx-punctuation),
56
56
  .astryx-codeeditor code::highlight(astryx-punctuation) { color: var(--color-syntax-punctuation); }
57
- .astryx-codeblock code::highlight(astryx-variable),
57
+ .astryx-code-block code::highlight(astryx-variable),
58
58
  .astryx-codeeditor code::highlight(astryx-variable) { color: var(--color-syntax-variable); }
59
59
 
60
60
  /* Span-based fallback classes — used when highlightMode='spans' or
@@ -26,9 +26,9 @@ import {
26
26
  import {useCommandPaletteContext} from './CommandPaletteContext';
27
27
  import {useDialogContext} from '../Dialog/DialogContext';
28
28
  import {themeProps} from '../utils/themeProps';
29
+ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
29
30
 
30
31
  import {useMergedRefs} from '../hooks/useMergedRefs';
31
- const HOVER_HOVER = '@media (hover: hover)';
32
32
 
33
33
  const styles = stylex.create({
34
34
  item: {
@@ -52,16 +52,6 @@ const styles = stylex.create({
52
52
  outline: 'none',
53
53
  userSelect: 'none',
54
54
  },
55
- itemHover: {
56
- ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
57
- [HOVER_HOVER]: {
58
- backgroundColor: colorVars['--color-overlay-hover'],
59
- },
60
- },
61
- ':active': {
62
- backgroundColor: colorVars['--color-overlay-pressed'],
63
- },
64
- },
65
55
  itemHighlighted: {
66
56
  backgroundColor: colorVars['--color-overlay-hover'],
67
57
  },
@@ -205,7 +195,7 @@ export function CommandPaletteItem({
205
195
  themeProps('command-palette-item'),
206
196
  stylex.props(
207
197
  styles.item,
208
- !isDisabled && styles.itemHover,
198
+ !isDisabled && interactionOverlayStyles.backgroundColor,
209
199
  isHighlighted && styles.itemHighlighted,
210
200
  isSelected && styles.itemSelected,
211
201
  isDisabled && styles.itemDisabled,
@@ -15,7 +15,7 @@ export const docs = {
15
15
  name: 'ComplexSelector',
16
16
  displayName: 'Complex Selector',
17
17
  group: 'Selector',
18
- category: 'Data Input',
18
+ category: 'Form Controls',
19
19
  keywords: [
20
20
  'selector',
21
21
  'picker',
@@ -143,6 +143,12 @@ export const docs = {
143
143
  description:
144
144
  'Imperative handle for programmatic control. Exposes open(), close(), toggle(), and isOpen().',
145
145
  },
146
+ {
147
+ name: 'onOpenChange',
148
+ type: '(isOpen: boolean) => void',
149
+ description:
150
+ 'Called whenever the surface opens or closes, however it happened — trigger, keyboard, light dismiss, Escape, close(), or the imperative handle.',
151
+ },
146
152
  {
147
153
  name: 'contentXstyle',
148
154
  type: 'StyleXStyles',
@@ -208,7 +214,7 @@ export const docsDense = {
208
214
  name: 'ComplexSelector',
209
215
  displayName: 'Complex Selector',
210
216
  group: 'Selector',
211
- category: 'Data Input',
217
+ category: 'Form Controls',
212
218
  description:
213
219
  'Input/ghost trigger + dialog-popover shell for rich custom selectors. Content gets value/onChange/close/state; content owns semantics. Use focus hooks and evaluate custom content against WCAG 2.2.',
214
220
  usage: {
@@ -274,6 +280,7 @@ export const docsDense = {
274
280
  placement: 'Popup placement.',
275
281
  alignment: 'Popup alignment.',
276
282
  handleRef: 'Imperative open/close/toggle handle.',
283
+ onOpenChange: 'Notified on every open and close, whatever caused it.',
277
284
  accessibility:
278
285
  'Custom content must provide its own accessible structure. Use focus hooks and evaluate against WCAG 2.2.',
279
286
  },