@astryxdesign/core 0.4.5 → 0.4.6-canary.cea9ecd

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 (538) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/dist/Avatar/Avatar.d.ts +10 -5
  3. package/dist/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/Avatar/Avatar.js +139 -30
  5. package/dist/Avatar/AvatarStatusDot.d.ts +2 -1
  6. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  7. package/dist/Avatar/AvatarStatusDot.js +30 -4
  8. package/dist/Avatar/AvatarStatusLabelContext.d.ts +39 -0
  9. package/dist/Avatar/AvatarStatusLabelContext.d.ts.map +1 -0
  10. package/dist/Avatar/AvatarStatusLabelContext.js +41 -0
  11. package/dist/AvatarGroup/AvatarGroup.d.ts +3 -1
  12. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  13. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +15 -9
  15. package/dist/Blockquote/Blockquote.d.ts +4 -3
  16. package/dist/Blockquote/Blockquote.d.ts.map +1 -1
  17. package/dist/Blockquote/Blockquote.js +9 -10
  18. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  19. package/dist/BottomSheet/BottomSheetPanel.js +21 -5
  20. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  21. package/dist/Breadcrumbs/BreadcrumbItem.js +47 -34
  22. package/dist/Button/Button.d.ts.map +1 -1
  23. package/dist/Button/Button.js +7 -7
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +21 -12
  26. package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
  27. package/dist/Calendar/hooks/useCalendarNavigation.js +8 -4
  28. package/dist/Calendar/styles.d.ts +2 -2
  29. package/dist/Calendar/styles.d.ts.map +1 -1
  30. package/dist/Calendar/styles.js +5 -5
  31. package/dist/Center/Center.d.ts +23 -1
  32. package/dist/Center/Center.d.ts.map +1 -1
  33. package/dist/Center/Center.js +12 -6
  34. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  35. package/dist/Chat/ChatComposer.js +3 -3
  36. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  37. package/dist/Chat/ChatComposerDrawer.js +2 -2
  38. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  39. package/dist/Chat/ChatToolCalls.js +2 -2
  40. package/dist/Chat/useChatDictation.d.ts +1 -1
  41. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  42. package/dist/Chat/useSpeechRecognition.d.ts +1 -1
  43. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  44. package/dist/Chat/useSpeechRecognition.js +4 -3
  45. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  46. package/dist/Chat/useTriggerMenu.js +2 -2
  47. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  48. package/dist/CheckboxInput/CheckboxInput.js +2 -2
  49. package/dist/Citation/Citation.d.ts.map +1 -1
  50. package/dist/Citation/Citation.js +5 -5
  51. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  52. package/dist/ClickableCard/ClickableCard.js +4 -4
  53. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  54. package/dist/CodeBlock/CodeBlock.js +1 -1
  55. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  56. package/dist/Collapsible/Collapsible.js +2 -2
  57. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  58. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  59. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  60. package/dist/ComplexSelector/ComplexSelector.js +6 -6
  61. package/dist/DateInput/DateInput.d.ts +31 -2
  62. package/dist/DateInput/DateInput.d.ts.map +1 -1
  63. package/dist/DateInput/DateInput.js +90 -22
  64. package/dist/DateInput/MonthScroller.d.ts +35 -0
  65. package/dist/DateInput/MonthScroller.d.ts.map +1 -0
  66. package/dist/DateInput/MonthScroller.js +658 -0
  67. package/dist/DateInput/MonthYearWheels.d.ts +24 -0
  68. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -0
  69. package/dist/DateInput/MonthYearWheels.js +114 -0
  70. package/dist/DateInput/TouchDateField.d.ts +10 -0
  71. package/dist/DateInput/TouchDateField.d.ts.map +1 -0
  72. package/dist/DateInput/TouchDateField.js +810 -0
  73. package/dist/DateInput/Wheel.d.ts +41 -0
  74. package/dist/DateInput/Wheel.d.ts.map +1 -0
  75. package/dist/DateInput/Wheel.js +315 -0
  76. package/dist/DateInput/monthGeometry.d.ts +65 -0
  77. package/dist/DateInput/monthGeometry.d.ts.map +1 -0
  78. package/dist/DateInput/monthGeometry.js +98 -0
  79. package/dist/DateInput/tokens.stylex.d.ts +63 -0
  80. package/dist/DateInput/tokens.stylex.d.ts.map +1 -0
  81. package/dist/DateInput/tokens.stylex.js +74 -0
  82. package/dist/DateInput/useOwnScrollGesture.d.ts +41 -0
  83. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -0
  84. package/dist/DateInput/useOwnScrollGesture.js +202 -0
  85. package/dist/DateInput/usePointerDragScroll.d.ts +15 -0
  86. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -0
  87. package/dist/DateInput/usePointerDragScroll.js +216 -0
  88. package/dist/DateInput/useScrollSettle.d.ts +26 -0
  89. package/dist/DateInput/useScrollSettle.d.ts.map +1 -0
  90. package/dist/DateInput/useScrollSettle.js +149 -0
  91. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  92. package/dist/DateRangeInput/DateRangeInput.js +17 -14
  93. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  94. package/dist/DateTimeInput/DateTimeInput.js +17 -14
  95. package/dist/Dialog/Dialog.d.ts.map +1 -1
  96. package/dist/Dialog/Dialog.js +3 -3
  97. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  98. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +2 -2
  99. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  100. package/dist/DropdownMenu/DropdownMenuItem.js +2 -2
  101. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  102. package/dist/DropdownMenu/DropdownMenuRadioItem.js +2 -2
  103. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  104. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -2
  105. package/dist/Field/FieldLabel.d.ts.map +1 -1
  106. package/dist/Field/FieldLabel.js +4 -4
  107. package/dist/Field/InputClearButton.d.ts.map +1 -1
  108. package/dist/Field/InputClearButton.js +6 -0
  109. package/dist/Field/inputStyles.stylex.d.ts +1 -1
  110. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  111. package/dist/Field/inputStyles.stylex.js +5 -5
  112. package/dist/FileInput/FileInput.d.ts.map +1 -1
  113. package/dist/FileInput/FileInput.js +6 -6
  114. package/dist/HoverCard/HoverCard.d.ts +13 -3
  115. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  116. package/dist/HoverCard/HoverCard.js +2 -0
  117. package/dist/HoverCard/index.d.ts +1 -1
  118. package/dist/HoverCard/index.d.ts.map +1 -1
  119. package/dist/HoverCard/useHoverCard.d.ts +17 -2
  120. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  121. package/dist/HoverCard/useHoverCard.js +78 -9
  122. package/dist/InputGroup/InputGroup.js +1 -1
  123. package/dist/Item/Item.d.ts +9 -1
  124. package/dist/Item/Item.d.ts.map +1 -1
  125. package/dist/Item/Item.js +52 -14
  126. package/dist/Layer/index.d.ts +4 -2
  127. package/dist/Layer/index.d.ts.map +1 -1
  128. package/dist/Layer/index.js +2 -0
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +3 -2
  131. package/dist/Layer/useTouchTrigger.d.ts +113 -0
  132. package/dist/Layer/useTouchTrigger.d.ts.map +1 -0
  133. package/dist/Layer/useTouchTrigger.js +241 -0
  134. package/dist/Layout/container.stylex.d.ts +4 -2
  135. package/dist/Layout/container.stylex.d.ts.map +1 -1
  136. package/dist/Layout/container.stylex.js +19 -11
  137. package/dist/Layout/index.d.ts +1 -0
  138. package/dist/Layout/index.d.ts.map +1 -1
  139. package/dist/Layout/index.js +4 -0
  140. package/dist/Layout/padding.stylex.d.ts +315 -12
  141. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  142. package/dist/Layout/padding.stylex.js +389 -12
  143. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  144. package/dist/Lightbox/Lightbox.js +5 -4
  145. package/dist/Link/Link.d.ts.map +1 -1
  146. package/dist/Link/Link.js +6 -6
  147. package/dist/MetadataList/MetadataList.d.ts.map +1 -1
  148. package/dist/MetadataList/MetadataList.js +1 -1
  149. package/dist/MobileNav/MobileNav.d.ts +1 -0
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +24 -6
  152. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  153. package/dist/MultiSelector/MultiSelector.js +8 -8
  154. package/dist/NavItem/navItemStyles.stylex.d.ts +4 -4
  155. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  156. package/dist/NavItem/navItemStyles.stylex.js +4 -4
  157. package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
  158. package/dist/NavMenu/NavHeadingMenuItem.js +3 -3
  159. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  160. package/dist/NumberInput/NumberInput.js +36 -8
  161. package/dist/Outline/Outline.d.ts.map +1 -1
  162. package/dist/Outline/Outline.js +3 -3
  163. package/dist/Pagination/Pagination.d.ts.map +1 -1
  164. package/dist/Pagination/Pagination.js +2 -2
  165. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  166. package/dist/PowerSearch/PowerSearch.js +11 -12
  167. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  169. package/dist/PowerSearch/formatFilterValue.d.ts +11 -2
  170. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  171. package/dist/PowerSearch/formatFilterValue.js +23 -8
  172. package/dist/RadioList/RadioListItem.d.ts +2 -2
  173. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  174. package/dist/RadioList/RadioListItem.js +70 -40
  175. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  176. package/dist/Resizable/ResizeHandle.js +7 -7
  177. package/dist/Section/Section.d.ts +36 -1
  178. package/dist/Section/Section.d.ts.map +1 -1
  179. package/dist/Section/Section.js +12 -2
  180. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  181. package/dist/SegmentedControl/SegmentedControlItem.js +7 -2
  182. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  183. package/dist/SelectableCard/SelectableCard.js +3 -3
  184. package/dist/Selector/Selector.d.ts +26 -1
  185. package/dist/Selector/Selector.d.ts.map +1 -1
  186. package/dist/Selector/Selector.js +93 -20
  187. package/dist/Selector/SelectorOption.d.ts +14 -1
  188. package/dist/Selector/SelectorOption.d.ts.map +1 -1
  189. package/dist/Selector/SelectorOption.js +6 -0
  190. package/dist/Selector/SelectorRowLayoutContext.d.ts +8 -0
  191. package/dist/Selector/SelectorRowLayoutContext.d.ts.map +1 -0
  192. package/dist/Selector/SelectorRowLayoutContext.js +27 -0
  193. package/dist/Selector/types.d.ts +1 -0
  194. package/dist/Selector/types.d.ts.map +1 -1
  195. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  196. package/dist/SideNav/SideNavHeading.js +4 -4
  197. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  198. package/dist/SideNav/SideNavItem.js +3 -3
  199. package/dist/Slider/Slider.d.ts.map +1 -1
  200. package/dist/Slider/Slider.js +7 -7
  201. package/dist/Stack/Stack.d.ts +23 -1
  202. package/dist/Stack/Stack.d.ts.map +1 -1
  203. package/dist/Stack/Stack.js +12 -6
  204. package/dist/Switch/Switch.d.ts.map +1 -1
  205. package/dist/Switch/Switch.js +2 -2
  206. package/dist/TabList/Tab.d.ts.map +1 -1
  207. package/dist/TabList/Tab.js +1 -1
  208. package/dist/TabList/TabMenu.d.ts.map +1 -1
  209. package/dist/TabList/TabMenu.js +3 -3
  210. package/dist/Table/TableRow.js +4 -4
  211. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  212. package/dist/Table/plugins/columnResize/useTableColumnResize.js +1 -1
  213. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  214. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -2
  215. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  216. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +2 -2
  217. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  218. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +2 -2
  219. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  220. package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
  221. package/dist/Table/plugins/sortable/useTableSortableState.d.ts +5 -3
  222. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  223. package/dist/Table/plugins/sortable/useTableSortableState.js +12 -9
  224. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  225. package/dist/Table/plugins/tree/useTableTreeData.js +3 -3
  226. package/dist/TextArea/TextArea.js +1 -1
  227. package/dist/TextInput/TextInput.js +1 -1
  228. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  229. package/dist/Thumbnail/Thumbnail.js +3 -3
  230. package/dist/TimeInput/TimeInput.js +2 -2
  231. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  232. package/dist/Timestamp/Timestamp.js +6 -4
  233. package/dist/Timestamp/formatInstant.d.ts +3 -2
  234. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  235. package/dist/Timestamp/formatInstant.js +8 -8
  236. package/dist/Timestamp/tooltipEntries.d.ts +2 -1
  237. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  238. package/dist/Timestamp/tooltipEntries.js +5 -3
  239. package/dist/Toast/Toast.d.ts +4 -3
  240. package/dist/Toast/Toast.d.ts.map +1 -1
  241. package/dist/Toast/Toast.js +10 -7
  242. package/dist/Token/Token.d.ts.map +1 -1
  243. package/dist/Token/Token.js +6 -6
  244. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  245. package/dist/Tokenizer/Tokenizer.js +1 -1
  246. package/dist/Tooltip/Tooltip.d.ts +16 -3
  247. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  248. package/dist/Tooltip/Tooltip.js +2 -0
  249. package/dist/Tooltip/index.d.ts +1 -1
  250. package/dist/Tooltip/index.d.ts.map +1 -1
  251. package/dist/Tooltip/useTooltip.d.ts +21 -2
  252. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  253. package/dist/Tooltip/useTooltip.js +71 -13
  254. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  255. package/dist/TopNav/TopNavHeading.js +4 -4
  256. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavItem.js +3 -3
  258. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  259. package/dist/TopNav/TopNavMegaMenu.js +2 -2
  260. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  261. package/dist/TopNav/TopNavMegaMenuItem.js +2 -2
  262. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  263. package/dist/TopNav/TopNavMenu.js +4 -4
  264. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  265. package/dist/TreeList/TreeListItem.js +7 -7
  266. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  267. package/dist/Typeahead/BaseTypeahead.js +2 -2
  268. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  269. package/dist/Typeahead/Typeahead.js +1 -1
  270. package/dist/astryx.css +124 -62
  271. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -1
  272. package/dist/hooks/containerReveal.stylex.js +18 -18
  273. package/dist/hooks/scrollbarGutter.d.ts +28 -0
  274. package/dist/hooks/scrollbarGutter.d.ts.map +1 -0
  275. package/dist/hooks/scrollbarGutter.js +103 -0
  276. package/dist/hooks/useAutoMediaMode.d.ts +31 -0
  277. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -0
  278. package/dist/hooks/useAutoMediaMode.js +201 -0
  279. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  280. package/dist/hooks/useInputStatusIcon.js +1 -1
  281. package/dist/hooks/useListFocus.d.ts +5 -2
  282. package/dist/hooks/useListFocus.d.ts.map +1 -1
  283. package/dist/hooks/useListFocus.js +12 -6
  284. package/dist/hooks/useScrollLock.d.ts +4 -0
  285. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  286. package/dist/hooks/useScrollLock.js +13 -1
  287. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  288. package/dist/i18n/InternationalizationContext.js +2 -0
  289. package/dist/i18n/index.d.ts +6 -0
  290. package/dist/i18n/index.d.ts.map +1 -1
  291. package/dist/i18n/index.js +6 -0
  292. package/dist/i18n/useCollator.d.ts +12 -0
  293. package/dist/i18n/useCollator.d.ts.map +1 -0
  294. package/dist/i18n/useCollator.js +40 -0
  295. package/dist/i18n/useLocale.d.ts +3 -0
  296. package/dist/i18n/useLocale.d.ts.map +1 -0
  297. package/dist/i18n/useLocale.js +31 -0
  298. package/dist/theme/MediaTheme.d.ts +25 -5
  299. package/dist/theme/MediaTheme.d.ts.map +1 -1
  300. package/dist/theme/MediaTheme.js +31 -6
  301. package/dist/theme/defineTheme.d.ts +5 -0
  302. package/dist/theme/defineTheme.d.ts.map +1 -1
  303. package/dist/theme/defineTheme.js +5 -0
  304. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  305. package/dist/theme/derivedVarRegistry.js +7 -0
  306. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  307. package/dist/theme/generateThemeRules.js +66 -5
  308. package/dist/theme/index.d.ts +1 -1
  309. package/dist/theme/index.d.ts.map +1 -1
  310. package/dist/theme/syntax/index.d.ts +6 -0
  311. package/dist/theme/syntax/index.d.ts.map +1 -1
  312. package/dist/theme/syntax/index.js +7 -2
  313. package/dist/utils/dateParser.d.ts +4 -3
  314. package/dist/utils/dateParser.d.ts.map +1 -1
  315. package/dist/utils/dateParser.js +8 -8
  316. package/dist/utils/index.d.ts +1 -1
  317. package/dist/utils/index.d.ts.map +1 -1
  318. package/dist/utils/index.js +1 -1
  319. package/dist/utils/plainDate.d.ts +5 -2
  320. package/dist/utils/plainDate.d.ts.map +1 -1
  321. package/dist/utils/plainDate.js +20 -4
  322. package/locales/en.json +28 -0
  323. package/locales/pseudo.json +21 -0
  324. package/package.json +3 -3
  325. package/src/Avatar/Avatar.doc.mjs +10 -6
  326. package/src/Avatar/Avatar.test.tsx +219 -1
  327. package/src/Avatar/Avatar.tsx +179 -37
  328. package/src/Avatar/AvatarStatusDot.tsx +30 -4
  329. package/src/Avatar/AvatarStatusLabelContext.ts +47 -0
  330. package/src/AvatarGroup/AvatarGroup.doc.mjs +10 -6
  331. package/src/AvatarGroup/AvatarGroup.test.tsx +62 -0
  332. package/src/AvatarGroup/AvatarGroup.tsx +3 -1
  333. package/src/AvatarGroup/AvatarGroupOverflow.tsx +31 -8
  334. package/src/Banner/Banner.doc.mjs +2 -0
  335. package/src/Blockquote/Blockquote.doc.mjs +30 -7
  336. package/src/Blockquote/Blockquote.test.tsx +34 -3
  337. package/src/Blockquote/Blockquote.tsx +11 -9
  338. package/src/BottomSheet/BottomSheet.doc.mjs +3 -3
  339. package/src/BottomSheet/BottomSheet.test.tsx +24 -0
  340. package/src/BottomSheet/BottomSheetPanel.test.tsx +91 -0
  341. package/src/BottomSheet/BottomSheetPanel.tsx +58 -3
  342. package/src/Breadcrumbs/BreadcrumbItem.tsx +36 -23
  343. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +26 -2
  344. package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -0
  345. package/src/Button/Button.tsx +12 -9
  346. package/src/Calendar/Calendar.tsx +15 -9
  347. package/src/Calendar/hooks/useCalendarNavigation.ts +6 -4
  348. package/src/Calendar/styles.ts +8 -5
  349. package/src/Center/Center.doc.mjs +48 -0
  350. package/src/Center/Center.test.tsx +158 -0
  351. package/src/Center/Center.tsx +50 -9
  352. package/src/Chat/ChatComposer.tsx +11 -5
  353. package/src/Chat/ChatComposerDrawer.tsx +4 -1
  354. package/src/Chat/ChatToolCalls.tsx +13 -4
  355. package/src/Chat/{useChatDictation.test.ts → useChatDictation.test.tsx} +29 -14
  356. package/src/Chat/useChatDictation.ts +1 -1
  357. package/src/Chat/useSpeechRecognition.ts +5 -3
  358. package/src/Chat/useTriggerMenu.tsx +4 -1
  359. package/src/CheckboxInput/CheckboxInput.tsx +5 -2
  360. package/src/Citation/Citation.test.tsx +6 -1
  361. package/src/Citation/Citation.tsx +11 -5
  362. package/src/ClickableCard/ClickableCard.tsx +7 -4
  363. package/src/CodeBlock/CodeBlock.tsx +4 -1
  364. package/src/Collapsible/Collapsible.tsx +5 -2
  365. package/src/CommandPalette/CommandPaletteItem.tsx +6 -3
  366. package/src/ComplexSelector/ComplexSelector.doc.mjs +10 -0
  367. package/src/ComplexSelector/ComplexSelector.tsx +14 -7
  368. package/src/DateInput/DateInput.test.tsx +17 -1
  369. package/src/DateInput/DateInput.tsx +93 -21
  370. package/src/DateInput/DateInputTouch.test.tsx +2582 -0
  371. package/src/DateInput/MonthScroller.tsx +878 -0
  372. package/src/DateInput/MonthYearWheels.tsx +147 -0
  373. package/src/DateInput/TouchDateField.tsx +1223 -0
  374. package/src/DateInput/Wheel.tsx +473 -0
  375. package/src/DateInput/monthGeometry.ts +118 -0
  376. package/src/DateInput/tokens.stylex.ts +99 -0
  377. package/src/DateInput/useOwnScrollGesture.ts +227 -0
  378. package/src/DateInput/usePointerDragScroll.ts +220 -0
  379. package/src/DateInput/useScrollSettle.ts +164 -0
  380. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  381. package/src/DateRangeInput/DateRangeInput.tsx +31 -13
  382. package/src/DateTimeInput/DateTimeInput.tsx +25 -9
  383. package/src/Dialog/Dialog.test.tsx +24 -0
  384. package/src/Dialog/Dialog.tsx +3 -0
  385. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -2
  386. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -2
  387. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -2
  388. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -2
  389. package/src/Field/Field.doc.mjs +2 -0
  390. package/src/Field/FieldLabel.tsx +9 -3
  391. package/src/Field/InputClearButton.test.tsx +110 -3
  392. package/src/Field/InputClearButton.tsx +38 -0
  393. package/src/Field/inputStyles.stylex.ts +17 -13
  394. package/src/FileInput/FileInput.tsx +15 -8
  395. package/src/FormLayout/FormLayout.doc.mjs +1 -1
  396. package/src/HoverCard/HoverCard.doc.mjs +18 -0
  397. package/src/HoverCard/HoverCard.test.tsx +189 -0
  398. package/src/HoverCard/HoverCard.tsx +22 -2
  399. package/src/HoverCard/index.ts +1 -0
  400. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  401. package/src/HoverCard/useHoverCard.tsx +103 -7
  402. package/src/InputGroup/InputGroup.tsx +1 -1
  403. package/src/Item/Item.doc.mjs +1 -0
  404. package/src/Item/Item.test.tsx +50 -0
  405. package/src/Item/Item.tsx +54 -6
  406. package/src/Layer/index.ts +10 -0
  407. package/src/Layer/useLayer.tsx +13 -2
  408. package/src/Layer/useTouchTrigger.test.ts +70 -0
  409. package/src/Layer/useTouchTrigger.ts +366 -0
  410. package/src/Layout/Layout.doc.mjs +18 -0
  411. package/src/Layout/container.stylex.ts +11 -3
  412. package/src/Layout/index.ts +4 -0
  413. package/src/Layout/overlayPaddingReset.test.tsx +222 -0
  414. package/src/Layout/padding.stylex.ts +192 -12
  415. package/src/Lightbox/Lightbox.tsx +11 -3
  416. package/src/Link/Link.tsx +9 -6
  417. package/src/MetadataList/MetadataList.tsx +4 -1
  418. package/src/MobileNav/MobileNav.tsx +61 -5
  419. package/src/MobileNav/MobileNavEntryAnimation.test.tsx +212 -0
  420. package/src/MobileNav/MobileNavScrollbarGutter.test.tsx +109 -0
  421. package/src/MultiSelector/MultiSelector.test.tsx +1 -1
  422. package/src/MultiSelector/MultiSelector.tsx +26 -10
  423. package/src/NavItem/navItemStyles.stylex.ts +7 -4
  424. package/src/NavMenu/NavHeadingMenuItem.tsx +6 -3
  425. package/src/NumberInput/NumberInput.doc.mjs +24 -0
  426. package/src/NumberInput/NumberInput.test.tsx +138 -0
  427. package/src/NumberInput/NumberInput.tsx +47 -8
  428. package/src/Outline/Outline.tsx +5 -2
  429. package/src/Pagination/Pagination.tsx +5 -2
  430. package/src/Popover/Popover.test.tsx +27 -1
  431. package/src/PowerSearch/PowerSearch.tsx +17 -8
  432. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  433. package/src/PowerSearch/formatFilterValue.test.ts +22 -2
  434. package/src/PowerSearch/formatFilterValue.ts +31 -6
  435. package/src/RadioList/RadioList.doc.mjs +1 -1
  436. package/src/RadioList/RadioList.test.tsx +170 -2
  437. package/src/RadioList/RadioListItem.tsx +88 -53
  438. package/src/Resizable/ResizeHandle.test.tsx +22 -0
  439. package/src/Resizable/ResizeHandle.tsx +25 -7
  440. package/src/Section/Section.doc.mjs +55 -0
  441. package/src/Section/Section.test.tsx +201 -4
  442. package/src/Section/Section.tsx +69 -0
  443. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  444. package/src/SegmentedControl/SegmentedControlItem.tsx +15 -3
  445. package/src/SelectableCard/SelectableCard.tsx +6 -3
  446. package/src/Selector/Selector.doc.mjs +16 -2
  447. package/src/Selector/Selector.test.tsx +525 -1
  448. package/src/Selector/Selector.tsx +180 -25
  449. package/src/Selector/SelectorOption.doc.mjs +7 -0
  450. package/src/Selector/SelectorOption.tsx +21 -0
  451. package/src/Selector/SelectorRowLayoutContext.ts +32 -0
  452. package/src/Selector/types.ts +4 -4
  453. package/src/SideNav/SideNavHeading.tsx +14 -5
  454. package/src/SideNav/SideNavItem.tsx +9 -3
  455. package/src/Slider/Slider.tsx +25 -6
  456. package/src/Stack/Stack.doc.mjs +72 -0
  457. package/src/Stack/Stack.test.tsx +156 -0
  458. package/src/Stack/Stack.tsx +50 -8
  459. package/src/Switch/Switch.tsx +5 -2
  460. package/src/TabList/Tab.tsx +4 -1
  461. package/src/TabList/TabMenu.tsx +9 -3
  462. package/src/Table/TableRow.tsx +4 -4
  463. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +6 -2
  464. package/src/Table/plugins/filtering/useTableFiltering.tsx +4 -1
  465. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +10 -3
  466. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +6 -3
  467. package/src/Table/plugins/sortable/useTableSortable.tsx +4 -1
  468. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +34 -0
  469. package/src/Table/plugins/sortable/useTableSortableState.tsx +26 -23
  470. package/src/Table/plugins/tree/useTableTreeData.tsx +10 -4
  471. package/src/TextArea/TextArea.doc.mjs +1 -1
  472. package/src/TextArea/TextArea.tsx +1 -1
  473. package/src/TextInput/TextInput.tsx +1 -1
  474. package/src/Thumbnail/Thumbnail.tsx +9 -3
  475. package/src/TimeInput/TimeInput.tsx +1 -1
  476. package/src/Timestamp/Timestamp.test.tsx +27 -7
  477. package/src/Timestamp/Timestamp.tsx +8 -4
  478. package/src/Timestamp/formatInstant.ts +9 -7
  479. package/src/Timestamp/tooltipEntries.test.ts +11 -6
  480. package/src/Timestamp/tooltipEntries.ts +6 -2
  481. package/src/Toast/Toast.tsx +9 -7
  482. package/src/Token/Token.tsx +14 -5
  483. package/src/Tokenizer/Tokenizer.tsx +4 -1
  484. package/src/Tooltip/Tooltip.doc.mjs +18 -0
  485. package/src/Tooltip/Tooltip.test.tsx +254 -1
  486. package/src/Tooltip/Tooltip.tsx +22 -2
  487. package/src/Tooltip/index.ts +1 -0
  488. package/src/Tooltip/useTooltip.doc.mjs +2 -0
  489. package/src/Tooltip/useTooltip.tsx +99 -21
  490. package/src/TopNav/TopNavHeading.tsx +13 -4
  491. package/src/TopNav/TopNavItem.tsx +6 -3
  492. package/src/TopNav/TopNavMegaMenu.tsx +5 -2
  493. package/src/TopNav/TopNavMegaMenuItem.tsx +5 -2
  494. package/src/TopNav/TopNavMenu.tsx +10 -4
  495. package/src/TreeList/TreeListItem.tsx +22 -7
  496. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  497. package/src/Typeahead/Typeahead.tsx +4 -1
  498. package/src/hooks/containerReveal.stylex.ts +54 -18
  499. package/src/hooks/scrollbarGutter.test.ts +167 -0
  500. package/src/hooks/scrollbarGutter.ts +121 -0
  501. package/src/hooks/useAutoMediaMode.test.ts +109 -0
  502. package/src/hooks/useAutoMediaMode.ts +233 -0
  503. package/src/hooks/useInputStatusIcon.tsx +4 -1
  504. package/src/hooks/useListFocus.doc.mjs +2 -2
  505. package/src/hooks/useListFocus.test.tsx +65 -3
  506. package/src/hooks/useListFocus.ts +15 -7
  507. package/src/hooks/useScrollLock.doc.mjs +4 -4
  508. package/src/hooks/useScrollLock.test.ts +73 -0
  509. package/src/hooks/useScrollLock.ts +14 -0
  510. package/src/i18n/InternationalizationContext.ts +2 -0
  511. package/src/i18n/__tests__/e2e-powersearch.test.tsx +37 -1
  512. package/src/i18n/__tests__/useCollator.test.tsx +115 -0
  513. package/src/i18n/__tests__/useLocale.test.tsx +52 -0
  514. package/src/i18n/index.ts +6 -0
  515. package/src/i18n/useCollator.doc.mjs +84 -0
  516. package/src/i18n/useCollator.ts +44 -0
  517. package/src/i18n/useLocale.doc.mjs +70 -0
  518. package/src/i18n/useLocale.ts +34 -0
  519. package/src/i18n/useTranslator.doc.mjs +1 -1
  520. package/src/reset.css +9 -2
  521. package/src/reset.test.ts +22 -0
  522. package/src/theme/MediaTheme.doc.mjs +23 -4
  523. package/src/theme/MediaTheme.dom.test.tsx +97 -0
  524. package/src/theme/MediaTheme.tsx +42 -7
  525. package/src/theme/defineTheme.test.ts +9 -3
  526. package/src/theme/defineTheme.ts +5 -0
  527. package/src/theme/derivedVarRegistry.test.ts +19 -5
  528. package/src/theme/derivedVarRegistry.ts +4 -0
  529. package/src/theme/generateThemeRules.test.ts +118 -0
  530. package/src/theme/generateThemeRules.ts +83 -5
  531. package/src/theme/index.ts +1 -1
  532. package/src/theme/syntax/index.ts +6 -2
  533. package/src/theme/syntax/serverSafeSyntax.test.ts +68 -0
  534. package/src/utils/dateParser.test.ts +20 -0
  535. package/src/utils/dateParser.ts +14 -7
  536. package/src/utils/index.ts +2 -0
  537. package/src/utils/plainDate.test.ts +6 -0
  538. package/src/utils/plainDate.ts +21 -4
@@ -13,6 +13,22 @@ import {describe, it, expect, vi} from 'vitest';
13
13
  import {render, screen} from '@testing-library/react';
14
14
  import {Center} from './Center';
15
15
 
16
+ /**
17
+ * The functional class output, as an order-insensitive set. StyleX's dev
18
+ * runtime also emits readable debug classes naming the style object a
19
+ * declaration came from ("padding__paddingBlockStyles.2"); those record
20
+ * provenance rather than applied CSS and survive even when the declaration
21
+ * they name loses a merge, so they are dropped here.
22
+ */
23
+ function classSet(el: HTMLElement): Set<string> {
24
+ return new Set(
25
+ el.className
26
+ .split(' ')
27
+ .filter(Boolean)
28
+ .filter(c => !c.includes('__') && !c.includes('.')),
29
+ );
30
+ }
31
+
16
32
  describe('Center', () => {
17
33
  it('renders and centers children (both axes by default)', () => {
18
34
  render(
@@ -207,4 +223,146 @@ describe('Center', () => {
207
223
  const element = screen.getByTestId('center');
208
224
  expect(element.tagName).toBe('DIV');
209
225
  });
226
+
227
+ it('applies a class when paddingBlockStart is set on its own', () => {
228
+ const {rerender} = render(
229
+ <Center data-testid="center">
230
+ <div>Content</div>
231
+ </Center>,
232
+ );
233
+ const baseline = screen.getByTestId('center').className;
234
+ rerender(
235
+ <Center paddingBlockStart={2} data-testid="center">
236
+ <div>Content</div>
237
+ </Center>,
238
+ );
239
+ expect(screen.getByTestId('center').className).not.toBe(baseline);
240
+ });
241
+
242
+ it('lets paddingBlockStart/paddingBlockEnd override only their own edge', () => {
243
+ // padding={4} + paddingBlockStart={2} must equal spelling every edge out:
244
+ // both inline edges and the block-end edge stay at 4.
245
+ const {rerender} = render(
246
+ <Center padding={4} paddingBlockStart={2} data-testid="center">
247
+ <div>Content</div>
248
+ </Center>,
249
+ );
250
+ const perEdge = classSet(screen.getByTestId('center'));
251
+ rerender(
252
+ <Center
253
+ paddingInline={4}
254
+ paddingBlockStart={2}
255
+ paddingBlockEnd={4}
256
+ data-testid="center">
257
+ <div>Content</div>
258
+ </Center>,
259
+ );
260
+ expect(perEdge).toEqual(classSet(screen.getByTestId('center')));
261
+ });
262
+
263
+ it('gives paddingBlockEnd precedence over paddingBlock', () => {
264
+ const {rerender} = render(
265
+ <Center paddingBlock={6} paddingBlockEnd={0} data-testid="center">
266
+ <div>Content</div>
267
+ </Center>,
268
+ );
269
+ const overridden = classSet(screen.getByTestId('center'));
270
+ rerender(
271
+ <Center paddingBlockStart={6} paddingBlockEnd={0} data-testid="center">
272
+ <div>Content</div>
273
+ </Center>,
274
+ );
275
+ expect(overridden).toEqual(classSet(screen.getByTestId('center')));
276
+ });
277
+
278
+ it('leaves padding/paddingBlock output unchanged when no edge prop is set', () => {
279
+ const {rerender} = render(
280
+ <Center padding={3} data-testid="center">
281
+ <div>Content</div>
282
+ </Center>,
283
+ );
284
+ const uniform = classSet(screen.getByTestId('center'));
285
+ rerender(
286
+ <Center paddingInline={3} paddingBlock={3} data-testid="center">
287
+ <div>Content</div>
288
+ </Center>,
289
+ );
290
+ expect(uniform).toEqual(classSet(screen.getByTestId('center')));
291
+ });
292
+
293
+ it('applies a class when paddingInlineStart is set on its own', () => {
294
+ const {rerender} = render(
295
+ <Center data-testid="center">
296
+ <div>Content</div>
297
+ </Center>,
298
+ );
299
+ const baseline = screen.getByTestId('center').className;
300
+ rerender(
301
+ <Center paddingInlineStart={2} data-testid="center">
302
+ <div>Content</div>
303
+ </Center>,
304
+ );
305
+ expect(screen.getByTestId('center').className).not.toBe(baseline);
306
+ });
307
+
308
+ it('lets paddingInlineStart/paddingInlineEnd override only their own edge', () => {
309
+ const {rerender} = render(
310
+ <Center padding={4} paddingInlineStart={2} data-testid="center">
311
+ <div>Content</div>
312
+ </Center>,
313
+ );
314
+ const perEdge = classSet(screen.getByTestId('center'));
315
+ rerender(
316
+ <Center
317
+ paddingInlineStart={2}
318
+ paddingInlineEnd={4}
319
+ paddingBlock={4}
320
+ data-testid="center">
321
+ <div>Content</div>
322
+ </Center>,
323
+ );
324
+ expect(perEdge).toEqual(classSet(screen.getByTestId('center')));
325
+ });
326
+
327
+ it('gives paddingInlineEnd precedence over paddingInline', () => {
328
+ const {rerender} = render(
329
+ <Center paddingInline={6} paddingInlineEnd={0} data-testid="center">
330
+ <div>Content</div>
331
+ </Center>,
332
+ );
333
+ const overridden = classSet(screen.getByTestId('center'));
334
+ rerender(
335
+ <Center paddingInlineStart={6} paddingInlineEnd={0} data-testid="center">
336
+ <div>Content</div>
337
+ </Center>,
338
+ );
339
+ expect(overridden).toEqual(classSet(screen.getByTestId('center')));
340
+ });
341
+
342
+ it('resolves all four edges independently', () => {
343
+ // One prop per edge, each a different step: the four-edge spelling and the
344
+ // shorthand-plus-overrides spelling must agree.
345
+ const {rerender} = render(
346
+ <Center
347
+ paddingInlineStart={1}
348
+ paddingInlineEnd={2}
349
+ paddingBlockStart={3}
350
+ paddingBlockEnd={4}
351
+ data-testid="center">
352
+ <div>Content</div>
353
+ </Center>,
354
+ );
355
+ const explicit = classSet(screen.getByTestId('center'));
356
+ rerender(
357
+ <Center
358
+ padding={4}
359
+ paddingInlineStart={1}
360
+ paddingInlineEnd={2}
361
+ paddingBlockStart={3}
362
+ data-testid="center">
363
+ <div>Content</div>
364
+ </Center>,
365
+ );
366
+ expect(explicit).toEqual(classSet(screen.getByTestId('center')));
367
+ });
210
368
  });
@@ -18,8 +18,10 @@ import type {BaseProps} from '../BaseProps';
18
18
  import * as stylex from '@stylexjs/stylex';
19
19
  import type {SizeValue, SpacingStep} from '../utils/types';
20
20
  import {
21
- paddingInlineStyles,
22
- paddingBlockStyles,
21
+ paddingInlineStartStyles,
22
+ paddingInlineEndStyles,
23
+ paddingBlockStartStyles,
24
+ paddingBlockEndStyles,
23
25
  } from '../Layout/padding.stylex';
24
26
  import {mergeProps} from '../utils';
25
27
  import {themeProps} from '../utils/themeProps';
@@ -106,12 +108,38 @@ export interface CenterProps extends BaseProps<HTMLDivElement> {
106
108
  */
107
109
  paddingInline?: SpacingStep;
108
110
 
111
+ /**
112
+ * Inline-start padding, using the spacing scale. Logical: the left edge in
113
+ * LTR, the right edge in RTL.
114
+ * Overrides `paddingInline` and `padding` on that edge only.
115
+ */
116
+ paddingInlineStart?: SpacingStep;
117
+
118
+ /**
119
+ * Inline-end padding, using the spacing scale. Logical: the right edge in
120
+ * LTR, the left edge in RTL.
121
+ * Overrides `paddingInline` and `padding` on that edge only.
122
+ */
123
+ paddingInlineEnd?: SpacingStep;
124
+
109
125
  /**
110
126
  * Block (vertical) padding, using the spacing scale.
111
127
  * Overrides `padding` on the block axis when both are set.
112
128
  */
113
129
  paddingBlock?: SpacingStep;
114
130
 
131
+ /**
132
+ * Block-start (top) padding, using the spacing scale.
133
+ * Overrides `paddingBlock` and `padding` on that edge only.
134
+ */
135
+ paddingBlockStart?: SpacingStep;
136
+
137
+ /**
138
+ * Block-end (bottom) padding, using the spacing scale.
139
+ * Overrides `paddingBlock` and `padding` on that edge only.
140
+ */
141
+ paddingBlockEnd?: SpacingStep;
142
+
115
143
  /**
116
144
  * Whether to make the container inline-flex (useful for text/icons).
117
145
  * @default false
@@ -145,7 +173,11 @@ export function Center({
145
173
  minHeight,
146
174
  padding,
147
175
  paddingInline,
176
+ paddingInlineStart,
177
+ paddingInlineEnd,
148
178
  paddingBlock,
179
+ paddingBlockStart,
180
+ paddingBlockEnd,
149
181
  isInline = false,
150
182
  children,
151
183
  xstyle,
@@ -154,10 +186,14 @@ export function Center({
154
186
  ref,
155
187
  ...props
156
188
  }: CenterProps) {
157
- // Resolve padding to per-axis values: `padding` sets both axes; `paddingInline`
158
- // / `paddingBlock` take precedence on their own axis when provided.
159
- const resolvedPaddingInline = paddingInline ?? padding;
160
- const resolvedPaddingBlock = paddingBlock ?? padding;
189
+ // Resolve padding to per-edge values. Most specific wins, per edge:
190
+ // edge prop -> axis prop -> `padding`.
191
+ const resolvedPaddingInlineStart =
192
+ paddingInlineStart ?? paddingInline ?? padding;
193
+ const resolvedPaddingInlineEnd = paddingInlineEnd ?? paddingInline ?? padding;
194
+ const resolvedPaddingBlockStart =
195
+ paddingBlockStart ?? paddingBlock ?? padding;
196
+ const resolvedPaddingBlockEnd = paddingBlockEnd ?? paddingBlock ?? padding;
161
197
 
162
198
  const stylexProps = mergeProps(
163
199
  themeProps('center', {axis}),
@@ -171,9 +207,14 @@ export function Center({
171
207
  maxWidth ?? null,
172
208
  minHeight ?? null,
173
209
  ),
174
- resolvedPaddingInline != null &&
175
- paddingInlineStyles[resolvedPaddingInline],
176
- resolvedPaddingBlock != null && paddingBlockStyles[resolvedPaddingBlock],
210
+ resolvedPaddingInlineStart != null &&
211
+ paddingInlineStartStyles[resolvedPaddingInlineStart],
212
+ resolvedPaddingInlineEnd != null &&
213
+ paddingInlineEndStyles[resolvedPaddingInlineEnd],
214
+ resolvedPaddingBlockStart != null &&
215
+ paddingBlockStartStyles[resolvedPaddingBlockStart],
216
+ resolvedPaddingBlockEnd != null &&
217
+ paddingBlockEndStyles[resolvedPaddingBlockEnd],
177
218
  xstyle,
178
219
  ),
179
220
  className,
@@ -152,7 +152,10 @@ const styles = stylex.create({
152
152
  gap: spacingVars['--spacing-2'],
153
153
  borderRadius: 'var(--_chat-composer-radius)',
154
154
  backgroundColor: colorVars['--color-background-popover'],
155
- cursor: 'text',
155
+ cursor: {
156
+ default: 'text',
157
+ ':is(:disabled,[aria-disabled="true"])': 'default',
158
+ },
156
159
  transition: `box-shadow ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}, border-color ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
157
160
  },
158
161
  header: {
@@ -273,7 +276,9 @@ const elevationStyles = stylex.create({
273
276
  low: {
274
277
  boxShadow: {
275
278
  default: shadowVars['--shadow-low'],
276
- ':hover': {'@media (hover: hover)': shadowVars['--shadow-med']},
279
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
280
+ '@media (hover: hover)': shadowVars['--shadow-med'],
281
+ },
277
282
  },
278
283
  ':focus-within': {
279
284
  boxShadow: shadowVars['--shadow-med'],
@@ -292,9 +297,10 @@ const elevationStyles = stylex.create({
292
297
  padding: `calc(var(--_chat-composer-padding) - ${borderVars['--border-width']})`,
293
298
  boxShadow: {
294
299
  default: 'none',
295
- ':hover:not(:focus-within)': {
296
- '@media (hover: hover)': `inset 0px 0px 0px 2px color-mix(in srgb, ${colorVars['--color-border-emphasized']} 30%, transparent)`,
297
- },
300
+ ':hover:not(:focus-within):where(:not(:disabled,[aria-disabled="true"]))':
301
+ {
302
+ '@media (hover: hover)': `inset 0px 0px 0px 2px color-mix(in srgb, ${colorVars['--color-border-emphasized']} 30%, transparent)`,
303
+ },
298
304
  ':focus-within': `inset 0px 0px 0px 2px ${colorVars['--color-accent-muted']}`,
299
305
  },
300
306
  },
@@ -117,7 +117,10 @@ const styles = stylex.create({
117
117
  height: spacingVars['--spacing-5'],
118
118
  paddingInline: spacingVars['--spacing-4'],
119
119
  marginInline: `calc(-1 * ${spacingVars['--spacing-4']})`,
120
- cursor: 'pointer',
120
+ cursor: {
121
+ default: 'pointer',
122
+ ':is(:disabled,[aria-disabled="true"])': 'default',
123
+ },
121
124
  userSelect: 'none',
122
125
  },
123
126
  toggleCollapsed: {},
@@ -105,7 +105,10 @@ const styles = stylex.create({
105
105
  display: 'flex',
106
106
  alignItems: 'center',
107
107
  gap: spacingVars['--spacing-1-5'],
108
- cursor: 'pointer',
108
+ cursor: {
109
+ default: 'pointer',
110
+ ':is(:disabled,[aria-disabled="true"])': 'default',
111
+ },
109
112
  userSelect: 'none',
110
113
  minHeight: '24px',
111
114
  paddingBlock: spacingVars['--spacing-0-5'],
@@ -192,18 +195,24 @@ const styles = stylex.create({
192
195
  paddingBlock: spacingVars['--spacing-0-5'],
193
196
  },
194
197
  callRowClickable: {
195
- cursor: 'pointer',
198
+ cursor: {
199
+ default: 'pointer',
200
+ ':is(:disabled,[aria-disabled="true"])': 'default',
201
+ },
196
202
  borderRadius: radiusVars['--radius-element'],
197
203
  paddingInline: spacingVars['--spacing-1'],
198
204
  marginInline: `calc(-1 * ${spacingVars['--spacing-1']})`,
199
205
  '@media (hover: hover)': {
200
- ':hover': {
206
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
201
207
  backgroundColor: colorVars['--color-overlay-hover'],
202
208
  },
203
209
  },
204
210
  },
205
211
  callRowToggle: {
206
- cursor: 'pointer',
212
+ cursor: {
213
+ default: 'pointer',
214
+ ':is(:disabled,[aria-disabled="true"])': 'default',
215
+ },
207
216
  },
208
217
  statusIcon: {
209
218
  position: 'relative',
@@ -1,7 +1,9 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
+ import type {ReactNode} from 'react';
3
4
  import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
4
5
  import {renderHook, act} from '@testing-library/react';
6
+ import {InternationalizationProvider} from '../i18n';
5
7
  import {useSpeechRecognition} from './useSpeechRecognition';
6
8
  import {useChatDictation} from './useChatDictation';
7
9
 
@@ -50,8 +52,7 @@ let originalSR: unknown;
50
52
 
51
53
  beforeEach(() => {
52
54
  lastInstance = null;
53
- originalSR = (window as unknown as Record<string, unknown>)
54
- .SpeechRecognition;
55
+ originalSR = (window as unknown as Record<string, unknown>).SpeechRecognition;
55
56
  (window as unknown as Record<string, unknown>).SpeechRecognition =
56
57
  MockSRConstructor;
57
58
  });
@@ -85,6 +86,28 @@ describe('useSpeechRecognition', () => {
85
86
  expect(result.current.isSupported).toBe(true);
86
87
  });
87
88
 
89
+ it('uses the provider locale by default and preserves an explicit override', () => {
90
+ const wrapper = ({children}: {children: ReactNode}) => (
91
+ <InternationalizationProvider locale="fr-FR">
92
+ {children}
93
+ </InternationalizationProvider>
94
+ );
95
+ const provider = renderHook(() => useSpeechRecognition(), {wrapper});
96
+
97
+ act(() => {
98
+ provider.result.current.start();
99
+ });
100
+ expect(lastInstance?.lang).toBe('fr-FR');
101
+
102
+ const explicit = renderHook(() => useSpeechRecognition({lang: 'ja-JP'}), {
103
+ wrapper,
104
+ });
105
+ act(() => {
106
+ explicit.result.current.start();
107
+ });
108
+ expect(lastInstance?.lang).toBe('ja-JP');
109
+ });
110
+
88
111
  it('starts and sets isListening', () => {
89
112
  const {result} = renderHook(() => useSpeechRecognition());
90
113
 
@@ -145,9 +168,7 @@ describe('useSpeechRecognition', () => {
145
168
  const onStart = vi.fn();
146
169
  const onEnd = vi.fn();
147
170
 
148
- const {result} = renderHook(() =>
149
- useSpeechRecognition({onStart, onEnd}),
150
- );
171
+ const {result} = renderHook(() => useSpeechRecognition({onStart, onEnd}));
151
172
 
152
173
  act(() => {
153
174
  result.current.start();
@@ -194,9 +215,7 @@ describe('useSpeechRecognition', () => {
194
215
  it('handles interim results and updates interimTranscript', () => {
195
216
  const onTranscript = vi.fn();
196
217
 
197
- const {result} = renderHook(() =>
198
- useSpeechRecognition({onTranscript}),
199
- );
218
+ const {result} = renderHook(() => useSpeechRecognition({onTranscript}));
200
219
 
201
220
  act(() => {
202
221
  result.current.start();
@@ -294,9 +313,7 @@ describe('useChatDictation', () => {
294
313
  const onStart = vi.fn();
295
314
  const onEnd = vi.fn();
296
315
 
297
- const {result} = renderHook(() =>
298
- useChatDictation({onStart, onEnd}),
299
- );
316
+ const {result} = renderHook(() => useChatDictation({onStart, onEnd}));
300
317
 
301
318
  act(() => {
302
319
  result.current.start();
@@ -312,9 +329,7 @@ describe('useChatDictation', () => {
312
329
  it('handles final transcript via onResult', () => {
313
330
  const onResult = vi.fn();
314
331
 
315
- const {result} = renderHook(() =>
316
- useChatDictation({onResult}),
317
- );
332
+ const {result} = renderHook(() => useChatDictation({onResult}));
318
333
 
319
334
  act(() => {
320
335
  result.current.start();
@@ -22,7 +22,7 @@ import {useSpeechRecognition} from './useSpeechRecognition';
22
22
  // =============================================================================
23
23
 
24
24
  export interface UseChatDictationOptions {
25
- /** BCP-47 language tag. @default navigator.language */
25
+ /** BCP-47 language tag. @default InternationalizationProvider locale */
26
26
  lang?: string;
27
27
  /** Whether recognition continues until explicitly stopped. @default true */
28
28
  continuous?: boolean;
@@ -14,14 +14,14 @@
14
14
  */
15
15
 
16
16
  import {useState, useCallback, useEffect, useMemo, useRef} from 'react';
17
- import {useTranslator} from '../i18n';
17
+ import {useLocale, useTranslator} from '../i18n';
18
18
 
19
19
  // =============================================================================
20
20
  // Types
21
21
  // =============================================================================
22
22
 
23
23
  export interface UseSpeechRecognitionOptions {
24
- /** BCP-47 language tag. @default navigator.language */
24
+ /** BCP-47 language tag. @default InternationalizationProvider locale */
25
25
  lang?: string;
26
26
  /** Whether recognition continues until explicitly stopped. @default true */
27
27
  continuous?: boolean;
@@ -260,6 +260,7 @@ export function useSpeechRecognition(
260
260
  options: UseSpeechRecognitionOptions = {},
261
261
  ): UseSpeechRecognitionReturn {
262
262
  const t = useTranslator();
263
+ const providerLocale = useLocale();
263
264
  const {
264
265
  lang,
265
266
  continuous = true,
@@ -348,7 +349,7 @@ export function useSpeechRecognition(
348
349
  }
349
350
  recognitionRef.current?.abort();
350
351
  const recognition = new SR();
351
- recognition.lang = lang ?? navigator.language;
352
+ recognition.lang = lang ?? providerLocale;
352
353
  recognition.continuous = continuous;
353
354
  recognition.interimResults = interimResults;
354
355
 
@@ -418,6 +419,7 @@ export function useSpeechRecognition(
418
419
  recognition.start();
419
420
  }, [
420
421
  lang,
422
+ providerLocale,
421
423
  continuous,
422
424
  interimResults,
423
425
  startVolumePolling,
@@ -117,7 +117,10 @@ const styles = stylex.create({
117
117
  width: '100%',
118
118
  padding: spacingVars['--spacing-2'],
119
119
  borderRadius: radiusVars['--radius-element'],
120
- cursor: 'pointer',
120
+ cursor: {
121
+ default: 'pointer',
122
+ ':is(:disabled,[aria-disabled="true"])': 'default',
123
+ },
121
124
  outline: 'none',
122
125
  backgroundColor: 'transparent',
123
126
  border: 'none',
@@ -80,7 +80,10 @@ const styles = stylex.create({
80
80
  margin: 0,
81
81
  padding: 0,
82
82
  opacity: 0,
83
- cursor: 'pointer',
83
+ cursor: {
84
+ default: 'pointer',
85
+ ':is(:disabled,[aria-disabled="true"])': 'default',
86
+ },
84
87
  zIndex: 1,
85
88
  minInlineSize: {
86
89
  default: null,
@@ -104,7 +107,7 @@ const styles = stylex.create({
104
107
  },
105
108
  },
106
109
  inputDisabled: {
107
- cursor: 'not-allowed',
110
+ cursor: 'default',
108
111
  },
109
112
  labelWrapper: {
110
113
  display: 'flex',
@@ -20,7 +20,12 @@ const probe = stylex.create({
20
20
  secondaryText: {color: colorVars['--color-text-secondary']},
21
21
  accentText: {color: colorVars['--color-text-accent']},
22
22
  badgeBackground: {backgroundColor: colorVars['--color-accent-muted']},
23
- pointerCursor: {cursor: 'pointer'},
23
+ pointerCursor: {
24
+ cursor: {
25
+ default: 'pointer',
26
+ ':is(:disabled,[aria-disabled="true"])': 'default',
27
+ },
28
+ },
24
29
  });
25
30
 
26
31
  function atomicClasses(style: (typeof probe)[keyof typeof probe]): string[] {
@@ -99,11 +99,14 @@ const styles = stylex.create({
99
99
  minWidth: 0,
100
100
  },
101
101
  labelInteractive: {
102
- cursor: 'pointer',
102
+ cursor: {
103
+ default: 'pointer',
104
+ ':is(:disabled,[aria-disabled="true"])': 'default',
105
+ },
103
106
  },
104
107
  labelHover: {
105
108
  backgroundColor: {
106
- ':hover': {
109
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
107
110
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
108
111
  },
109
112
  },
@@ -112,7 +115,7 @@ const styles = stylex.create({
112
115
  // the base secondary color from `label` (last-wins property merge),
113
116
  // leaving linked citations to inherit the surrounding text color.
114
117
  default: colorVars['--color-text-secondary'],
115
- ':hover': {
118
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
116
119
  '@media (hover: hover)': colorVars['--color-text-primary'],
117
120
  },
118
121
  },
@@ -137,7 +140,10 @@ const styles = stylex.create({
137
140
  transitionTimingFunction: easeVars['--ease-standard'],
138
141
  },
139
142
  numberInteractive: {
140
- cursor: 'pointer',
143
+ cursor: {
144
+ default: 'pointer',
145
+ ':is(:disabled,[aria-disabled="true"])': 'default',
146
+ },
141
147
  },
142
148
  numberHover: {
143
149
  backgroundColor: {
@@ -145,7 +151,7 @@ const styles = stylex.create({
145
151
  // hover-only conditional replaces the base accent-muted pill from
146
152
  // `number` on merge, leaving linked badges transparent.
147
153
  default: colorVars['--color-accent-muted'],
148
- ':hover': {
154
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
149
155
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
150
156
  },
151
157
  },
@@ -55,7 +55,10 @@ import {focusOutlineProps} from '../utils/focusOutline.stylex';
55
55
  const styles = stylex.create({
56
56
  interactive: {
57
57
  position: 'relative',
58
- cursor: 'pointer',
58
+ cursor: {
59
+ default: 'pointer',
60
+ ':is(:disabled,[aria-disabled="true"])': 'default',
61
+ },
59
62
  textDecoration: 'none',
60
63
  color: 'inherit',
61
64
  },
@@ -78,7 +81,7 @@ const styles = stylex.create({
78
81
  },
79
82
  hoverOnPointer: {
80
83
  '@media (hover: hover)': {
81
- ':hover::after': {
84
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))::after': {
82
85
  backgroundColor: colorVars['--color-overlay-hover'],
83
86
  },
84
87
  },
@@ -110,13 +113,13 @@ const styles = stylex.create({
110
113
  // @media (hover: hover) so touch devices don't get a stuck hover state.
111
114
  borderedHoverOnPointer: {
112
115
  '@media (hover: hover)': {
113
- ':hover': {
116
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
114
117
  borderColor: colorVars['--color-border-emphasized'],
115
118
  },
116
119
  },
117
120
  },
118
121
  disabled: {
119
- cursor: 'not-allowed',
122
+ cursor: 'default',
120
123
  opacity: 0.5,
121
124
  },
122
125
  srOnly: {
@@ -215,7 +215,10 @@ const styles = stylex.create({
215
215
  transform: 'rotate(90deg)',
216
216
  },
217
217
  headerCollapsible: {
218
- cursor: 'pointer',
218
+ cursor: {
219
+ default: 'pointer',
220
+ ':is(:disabled,[aria-disabled="true"])': 'default',
221
+ },
219
222
  userSelect: 'none',
220
223
  // Restore a keyboard-only focus ring with the standard token/offset so this
221
224
  // disclosure control matches the rest of the system (Collapsible, TabMenu);
@@ -65,7 +65,10 @@ const styles = stylex.create({
65
65
  alignItems: 'center',
66
66
  justifyContent: 'space-between',
67
67
  width: '100%',
68
- cursor: 'pointer',
68
+ cursor: {
69
+ default: 'pointer',
70
+ ':is(:disabled,[aria-disabled="true"])': 'default',
71
+ },
69
72
  fontFamily: typographyVars['--font-family-body'],
70
73
  fontSize: typeScaleVars['--text-large-size'],
71
74
  fontWeight: fontWeightVars['--font-weight-semibold'],
@@ -84,7 +87,7 @@ const styles = stylex.create({
84
87
  // button blocks click + keyboard activation; these styles restore the
85
88
  // visual affordance that `all: unset` wipes.
86
89
  triggerDisabled: {
87
- cursor: 'not-allowed',
90
+ cursor: 'default',
88
91
  opacity: 0.5,
89
92
  },
90
93
  // Chevron indicator