@astryxdesign/core 0.4.4 → 0.4.5-canary.013e728

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 (469) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -1
  3. package/dist/BottomSheet/BottomSheet.d.ts +11 -2
  4. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  5. package/dist/BottomSheet/BottomSheet.js +4 -0
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts +5 -2
  7. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  8. package/dist/BottomSheet/BottomSheetPanel.js +65 -15
  9. package/dist/BottomSheet/index.d.ts +1 -1
  10. package/dist/BottomSheet/index.d.ts.map +1 -1
  11. package/dist/BottomSheet/snapOffsets.d.ts +57 -20
  12. package/dist/BottomSheet/snapOffsets.d.ts.map +1 -1
  13. package/dist/BottomSheet/snapOffsets.js +106 -30
  14. package/dist/BottomSheet/useSheetGestures.d.ts +13 -8
  15. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  16. package/dist/BottomSheet/useSheetGestures.js +160 -64
  17. package/dist/Breadcrumbs/BreadcrumbItem.js +6 -6
  18. package/dist/Button/Button.js +5 -5
  19. package/dist/Calendar/Calendar.d.ts +17 -0
  20. package/dist/Calendar/Calendar.d.ts.map +1 -1
  21. package/dist/Calendar/Calendar.js +55 -15
  22. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +14 -0
  23. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +1 -0
  24. package/dist/Calendar/getStandaloneShortWeekdayNames.js +26 -0
  25. package/dist/Calendar/hooks/useCalendarConstraints.d.ts +22 -1
  26. package/dist/Calendar/hooks/useCalendarConstraints.d.ts.map +1 -1
  27. package/dist/Calendar/hooks/useCalendarConstraints.js +26 -4
  28. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  29. package/dist/Calendar/hooks/useCalendarDays.js +14 -10
  30. package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
  31. package/dist/Calendar/hooks/useCalendarNavigation.js +8 -4
  32. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts +47 -0
  33. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +1 -0
  34. package/dist/Calendar/standaloneShortWeekdayNames.generated.js +40 -0
  35. package/dist/Calendar/styles.js +3 -3
  36. package/dist/Center/Center.d.ts +23 -1
  37. package/dist/Center/Center.d.ts.map +1 -1
  38. package/dist/Center/Center.js +12 -6
  39. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  40. package/dist/Chat/ChatComposer.js +2 -2
  41. package/dist/Chat/ChatToolCalls.js +1 -1
  42. package/dist/Chat/useChatDictation.d.ts +1 -1
  43. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  44. package/dist/Chat/useSpeechRecognition.d.ts +1 -1
  45. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  46. package/dist/Chat/useSpeechRecognition.js +4 -3
  47. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  48. package/dist/CheckboxInput/CheckboxInput.js +9 -0
  49. package/dist/Citation/Citation.js +3 -3
  50. package/dist/ClickableCard/ClickableCard.js +2 -2
  51. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  53. package/dist/ComplexSelector/ComplexSelector.js +8 -3
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +17 -9
  56. package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
  57. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  58. package/dist/DateRangeInput/DateRangeInput.js +47 -9
  59. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  60. package/dist/DateTimeInput/DateTimeInput.js +18 -10
  61. package/dist/Dialog/Dialog.d.ts.map +1 -1
  62. package/dist/Dialog/Dialog.js +3 -3
  63. package/dist/Field/FieldLabel.d.ts +2 -1
  64. package/dist/Field/FieldLabel.d.ts.map +1 -1
  65. package/dist/Field/FieldLabel.js +21 -3
  66. package/dist/Field/InputClearButton.d.ts +2 -1
  67. package/dist/Field/InputClearButton.d.ts.map +1 -1
  68. package/dist/Field/InputClearButton.js +12 -1
  69. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  70. package/dist/Field/inputStyles.stylex.js +4 -4
  71. package/dist/FileInput/FileInput.d.ts.map +1 -1
  72. package/dist/FileInput/FileInput.js +2 -2
  73. package/dist/FormLayout/FormLayout.d.ts +24 -2
  74. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  75. package/dist/FormLayout/FormLayout.js +7 -2
  76. package/dist/FormLayout/FormLayoutContext.d.ts +15 -2
  77. package/dist/FormLayout/FormLayoutContext.d.ts.map +1 -1
  78. package/dist/FormLayout/FormLayoutContext.js +19 -4
  79. package/dist/FormLayout/index.d.ts +1 -1
  80. package/dist/FormLayout/index.d.ts.map +1 -1
  81. package/dist/HoverCard/HoverCard.d.ts +13 -3
  82. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  83. package/dist/HoverCard/HoverCard.js +2 -0
  84. package/dist/HoverCard/index.d.ts +1 -1
  85. package/dist/HoverCard/index.d.ts.map +1 -1
  86. package/dist/HoverCard/useHoverCard.d.ts +17 -2
  87. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  88. package/dist/HoverCard/useHoverCard.js +78 -9
  89. package/dist/Item/Item.d.ts +9 -1
  90. package/dist/Item/Item.d.ts.map +1 -1
  91. package/dist/Item/Item.js +46 -8
  92. package/dist/Layer/index.d.ts +4 -2
  93. package/dist/Layer/index.d.ts.map +1 -1
  94. package/dist/Layer/index.js +2 -0
  95. package/dist/Layer/useLayer.d.ts.map +1 -1
  96. package/dist/Layer/useLayer.js +3 -2
  97. package/dist/Layer/useTouchTrigger.d.ts +113 -0
  98. package/dist/Layer/useTouchTrigger.d.ts.map +1 -0
  99. package/dist/Layer/useTouchTrigger.js +241 -0
  100. package/dist/Layout/container.stylex.d.ts +4 -2
  101. package/dist/Layout/container.stylex.d.ts.map +1 -1
  102. package/dist/Layout/container.stylex.js +19 -11
  103. package/dist/Layout/index.d.ts +1 -0
  104. package/dist/Layout/index.d.ts.map +1 -1
  105. package/dist/Layout/index.js +4 -0
  106. package/dist/Layout/padding.stylex.d.ts +315 -12
  107. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  108. package/dist/Layout/padding.stylex.js +389 -12
  109. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  110. package/dist/Lightbox/Lightbox.js +2 -1
  111. package/dist/Link/Link.js +4 -4
  112. package/dist/Markdown/Markdown.d.ts +8 -0
  113. package/dist/Markdown/Markdown.d.ts.map +1 -1
  114. package/dist/Markdown/Markdown.js +31 -3
  115. package/dist/Markdown/parser.d.ts +14 -2
  116. package/dist/Markdown/parser.d.ts.map +1 -1
  117. package/dist/Markdown/parser.js +50 -2
  118. package/dist/MobileNav/MobileNav.d.ts +1 -0
  119. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  120. package/dist/MobileNav/MobileNav.js +24 -6
  121. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  122. package/dist/MultiSelector/MultiSelector.js +8 -3
  123. package/dist/NavItem/navItemStyles.stylex.d.ts +2 -2
  124. package/dist/NavItem/navItemStyles.stylex.js +2 -2
  125. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  126. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  127. package/dist/NumberInput/NumberInput.js +38 -5
  128. package/dist/Outline/Outline.js +2 -2
  129. package/dist/Outline/parseOutlineFromMarkdown.d.ts +2 -0
  130. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  131. package/dist/Outline/parseOutlineFromMarkdown.js +5 -31
  132. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  133. package/dist/PowerSearch/PowerSearch.js +11 -12
  134. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  135. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  136. package/dist/PowerSearch/formatFilterValue.d.ts +11 -2
  137. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  138. package/dist/PowerSearch/formatFilterValue.js +23 -8
  139. package/dist/RadioList/RadioList.d.ts.map +1 -1
  140. package/dist/RadioList/RadioList.js +12 -1
  141. package/dist/RadioList/RadioListItem.d.ts +2 -2
  142. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  143. package/dist/RadioList/RadioListItem.js +68 -38
  144. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  145. package/dist/Resizable/ResizeHandle.js +3 -3
  146. package/dist/Section/Section.d.ts +36 -1
  147. package/dist/Section/Section.d.ts.map +1 -1
  148. package/dist/Section/Section.js +12 -2
  149. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  150. package/dist/SegmentedControl/SegmentedControlItem.js +6 -1
  151. package/dist/SelectableCard/SelectableCard.js +1 -1
  152. package/dist/Selector/Selector.d.ts +26 -1
  153. package/dist/Selector/Selector.d.ts.map +1 -1
  154. package/dist/Selector/Selector.js +95 -17
  155. package/dist/Selector/SelectorOption.d.ts +14 -1
  156. package/dist/Selector/SelectorOption.d.ts.map +1 -1
  157. package/dist/Selector/SelectorOption.js +6 -0
  158. package/dist/Selector/SelectorRowLayoutContext.d.ts +8 -0
  159. package/dist/Selector/SelectorRowLayoutContext.d.ts.map +1 -0
  160. package/dist/Selector/SelectorRowLayoutContext.js +27 -0
  161. package/dist/Selector/types.d.ts +1 -0
  162. package/dist/Selector/types.d.ts.map +1 -1
  163. package/dist/SideNav/SideNavHeading.js +1 -1
  164. package/dist/SideNav/SideNavItem.js +1 -1
  165. package/dist/Slider/Slider.d.ts.map +1 -1
  166. package/dist/Slider/Slider.js +3 -3
  167. package/dist/Stack/Stack.d.ts +23 -1
  168. package/dist/Stack/Stack.d.ts.map +1 -1
  169. package/dist/Stack/Stack.js +12 -6
  170. package/dist/StatusDot/StatusDot.d.ts +43 -3
  171. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  172. package/dist/StatusDot/StatusDot.js +42 -5
  173. package/dist/Switch/Switch.d.ts.map +1 -1
  174. package/dist/Switch/Switch.js +9 -0
  175. package/dist/TabList/TabMenu.js +1 -1
  176. package/dist/Table/TableRow.js +4 -4
  177. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  178. package/dist/Table/plugins/columnResize/useTableColumnResize.js +1 -1
  179. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  180. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +1 -1
  181. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  182. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  183. package/dist/Table/plugins/sortable/useTableSortableState.d.ts +5 -3
  184. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  185. package/dist/Table/plugins/sortable/useTableSortableState.js +12 -9
  186. package/dist/Table/plugins/tree/useTableTreeData.js +2 -2
  187. package/dist/TextArea/TextArea.d.ts.map +1 -1
  188. package/dist/TextArea/TextArea.js +6 -1
  189. package/dist/TextInput/TextInput.d.ts.map +1 -1
  190. package/dist/TextInput/TextInput.js +6 -1
  191. package/dist/Thumbnail/Thumbnail.js +1 -1
  192. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  193. package/dist/TimeInput/TimeInput.js +6 -1
  194. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  195. package/dist/Timestamp/Timestamp.js +6 -4
  196. package/dist/Timestamp/formatInstant.d.ts +3 -2
  197. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  198. package/dist/Timestamp/formatInstant.js +8 -8
  199. package/dist/Timestamp/tooltipEntries.d.ts +2 -1
  200. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  201. package/dist/Timestamp/tooltipEntries.js +5 -3
  202. package/dist/Token/Token.js +1 -1
  203. package/dist/Tooltip/Tooltip.d.ts +16 -3
  204. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  205. package/dist/Tooltip/Tooltip.js +2 -0
  206. package/dist/Tooltip/index.d.ts +1 -1
  207. package/dist/Tooltip/index.d.ts.map +1 -1
  208. package/dist/Tooltip/useTooltip.d.ts +21 -2
  209. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  210. package/dist/Tooltip/useTooltip.js +71 -13
  211. package/dist/TopNav/TopNavHeading.js +2 -2
  212. package/dist/TopNav/TopNavItem.js +2 -2
  213. package/dist/TopNav/TopNavMegaMenu.js +1 -1
  214. package/dist/TopNav/TopNavMegaMenuItem.js +1 -1
  215. package/dist/TopNav/TopNavMenu.js +2 -2
  216. package/dist/TreeList/TreeListItem.js +1 -1
  217. package/dist/astryx.css +85 -60
  218. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -1
  219. package/dist/hooks/containerReveal.stylex.js +18 -18
  220. package/dist/hooks/scrollbarGutter.d.ts +28 -0
  221. package/dist/hooks/scrollbarGutter.d.ts.map +1 -0
  222. package/dist/hooks/scrollbarGutter.js +103 -0
  223. package/dist/hooks/useResolvedRequired.d.ts +19 -0
  224. package/dist/hooks/useResolvedRequired.d.ts.map +1 -0
  225. package/dist/hooks/useResolvedRequired.js +40 -0
  226. package/dist/hooks/useScrollLock.d.ts +4 -0
  227. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  228. package/dist/hooks/useScrollLock.js +13 -1
  229. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  230. package/dist/i18n/InternationalizationContext.js +2 -0
  231. package/dist/i18n/index.d.ts +6 -0
  232. package/dist/i18n/index.d.ts.map +1 -1
  233. package/dist/i18n/index.js +6 -0
  234. package/dist/i18n/useCollator.d.ts +12 -0
  235. package/dist/i18n/useCollator.d.ts.map +1 -0
  236. package/dist/i18n/useCollator.js +40 -0
  237. package/dist/i18n/useLocale.d.ts +3 -0
  238. package/dist/i18n/useLocale.d.ts.map +1 -0
  239. package/dist/i18n/useLocale.js +31 -0
  240. package/dist/theme/defineTheme.d.ts +5 -0
  241. package/dist/theme/defineTheme.d.ts.map +1 -1
  242. package/dist/theme/defineTheme.js +5 -0
  243. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  244. package/dist/theme/derivedVarRegistry.js +7 -0
  245. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  246. package/dist/theme/generateThemeRules.js +66 -5
  247. package/dist/utils/dateParser.d.ts +4 -3
  248. package/dist/utils/dateParser.d.ts.map +1 -1
  249. package/dist/utils/dateParser.js +8 -8
  250. package/dist/utils/plainDate.d.ts +9 -2
  251. package/dist/utils/plainDate.d.ts.map +1 -1
  252. package/dist/utils/plainDate.js +16 -4
  253. package/locales/af-ZA.json +958 -0
  254. package/locales/ar-SA.json +998 -0
  255. package/locales/ca-ES.json +974 -0
  256. package/locales/cs-CZ.json +990 -0
  257. package/locales/da-DK.json +966 -0
  258. package/locales/de-DE.json +966 -0
  259. package/locales/el-GR.json +990 -0
  260. package/locales/en.json +8 -0
  261. package/locales/es-ES.json +978 -0
  262. package/locales/fi-FI.json +990 -0
  263. package/locales/fr-FR.json +928 -0
  264. package/locales/he-IL.json +990 -0
  265. package/locales/hu-HU.json +990 -0
  266. package/locales/it-IT.json +978 -0
  267. package/locales/ja-JP.json +998 -0
  268. package/locales/ko-KR.json +990 -0
  269. package/locales/nl-NL.json +954 -0
  270. package/locales/no-NO.json +978 -0
  271. package/locales/pl-PL.json +982 -0
  272. package/locales/pseudo.json +6 -0
  273. package/locales/pt-BR.json +982 -0
  274. package/locales/pt-PT.json +982 -0
  275. package/locales/ro-RO.json +982 -0
  276. package/locales/ru-RU.json +990 -0
  277. package/locales/sr-SP.json +990 -0
  278. package/locales/sv-SE.json +986 -0
  279. package/locales/tr-TR.json +990 -0
  280. package/locales/uk-UA.json +990 -0
  281. package/locales/vi-VN.json +986 -0
  282. package/locales/zh-CN.json +998 -0
  283. package/locales/zh-TW.json +998 -0
  284. package/package.json +3 -3
  285. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -1
  286. package/src/Banner/Banner.doc.mjs +2 -0
  287. package/src/BottomSheet/BottomSheet.doc.mjs +36 -3
  288. package/src/BottomSheet/BottomSheet.test.tsx +177 -2
  289. package/src/BottomSheet/BottomSheet.tsx +16 -2
  290. package/src/BottomSheet/BottomSheetPanel.test.tsx +41 -0
  291. package/src/BottomSheet/BottomSheetPanel.tsx +95 -15
  292. package/src/BottomSheet/index.ts +5 -1
  293. package/src/BottomSheet/snapOffsets.test.ts +114 -47
  294. package/src/BottomSheet/snapOffsets.ts +119 -33
  295. package/src/BottomSheet/useSheetGestures.test.ts +113 -15
  296. package/src/BottomSheet/useSheetGestures.ts +196 -100
  297. package/src/Breadcrumbs/BreadcrumbItem.tsx +1 -1
  298. package/src/Button/Button.tsx +7 -7
  299. package/src/Calendar/Calendar.doc.mjs +16 -0
  300. package/src/Calendar/Calendar.test.tsx +137 -0
  301. package/src/Calendar/Calendar.tsx +80 -11
  302. package/src/Calendar/getStandaloneShortWeekdayNames.test.ts +54 -0
  303. package/src/Calendar/getStandaloneShortWeekdayNames.ts +38 -0
  304. package/src/Calendar/hooks/useCalendarConstraints.ts +54 -3
  305. package/src/Calendar/hooks/useCalendarDays.ts +13 -10
  306. package/src/Calendar/hooks/useCalendarNavigation.ts +6 -4
  307. package/src/Calendar/standaloneShortWeekdayNames.generated.ts +50 -0
  308. package/src/Calendar/styles.ts +3 -3
  309. package/src/Center/Center.doc.mjs +48 -0
  310. package/src/Center/Center.test.tsx +158 -0
  311. package/src/Center/Center.tsx +50 -9
  312. package/src/Chat/ChatComposer.tsx +7 -4
  313. package/src/Chat/ChatToolCalls.tsx +1 -1
  314. package/src/Chat/{useChatDictation.test.ts → useChatDictation.test.tsx} +29 -14
  315. package/src/Chat/useChatDictation.ts +1 -1
  316. package/src/Chat/useSpeechRecognition.ts +5 -3
  317. package/src/CheckboxInput/CheckboxInput.tsx +6 -0
  318. package/src/Citation/Citation.tsx +3 -3
  319. package/src/ClickableCard/ClickableCard.tsx +2 -2
  320. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  321. package/src/ComplexSelector/ComplexSelector.doc.mjs +10 -0
  322. package/src/ComplexSelector/ComplexSelector.tsx +8 -5
  323. package/src/DateInput/DateInput.test.tsx +17 -1
  324. package/src/DateInput/DateInput.tsx +13 -9
  325. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  326. package/src/DateRangeInput/DateRangeInput.test.tsx +81 -1
  327. package/src/DateRangeInput/DateRangeInput.tsx +88 -8
  328. package/src/DateTimeInput/DateTimeInput.tsx +23 -8
  329. package/src/Dialog/Dialog.test.tsx +24 -0
  330. package/src/Dialog/Dialog.tsx +3 -0
  331. package/src/Field/Field.doc.mjs +3 -0
  332. package/src/Field/FieldLabel.tsx +20 -4
  333. package/src/Field/InputClearButton.test.tsx +134 -2
  334. package/src/Field/InputClearButton.tsx +42 -1
  335. package/src/Field/inputStyles.stylex.ts +16 -12
  336. package/src/FileInput/FileInput.tsx +5 -4
  337. package/src/FormLayout/FormLayout.doc.mjs +13 -0
  338. package/src/FormLayout/FormLayout.test.tsx +181 -4
  339. package/src/FormLayout/FormLayout.tsx +33 -2
  340. package/src/FormLayout/FormLayoutContext.ts +22 -7
  341. package/src/FormLayout/index.ts +1 -1
  342. package/src/HoverCard/HoverCard.doc.mjs +18 -0
  343. package/src/HoverCard/HoverCard.test.tsx +189 -0
  344. package/src/HoverCard/HoverCard.tsx +22 -2
  345. package/src/HoverCard/index.ts +1 -0
  346. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  347. package/src/HoverCard/useHoverCard.tsx +103 -7
  348. package/src/Item/Item.doc.mjs +1 -0
  349. package/src/Item/Item.test.tsx +50 -0
  350. package/src/Item/Item.tsx +41 -2
  351. package/src/Layer/index.ts +10 -0
  352. package/src/Layer/useLayer.tsx +13 -2
  353. package/src/Layer/useTouchTrigger.test.ts +70 -0
  354. package/src/Layer/useTouchTrigger.ts +366 -0
  355. package/src/Layout/Layout.doc.mjs +18 -0
  356. package/src/Layout/container.stylex.ts +11 -3
  357. package/src/Layout/index.ts +4 -0
  358. package/src/Layout/overlayPaddingReset.test.tsx +222 -0
  359. package/src/Layout/padding.stylex.ts +192 -12
  360. package/src/Lightbox/Lightbox.tsx +2 -1
  361. package/src/Link/Link.tsx +4 -4
  362. package/src/Markdown/Markdown.doc.mjs +3 -0
  363. package/src/Markdown/Markdown.test.tsx +78 -0
  364. package/src/Markdown/Markdown.tsx +41 -1
  365. package/src/Markdown/parser.ts +60 -2
  366. package/src/MobileNav/MobileNav.tsx +61 -5
  367. package/src/MobileNav/MobileNavEntryAnimation.test.tsx +212 -0
  368. package/src/MobileNav/MobileNavScrollbarGutter.test.tsx +109 -0
  369. package/src/MultiSelector/MultiSelector.test.tsx +1 -1
  370. package/src/MultiSelector/MultiSelector.tsx +8 -5
  371. package/src/NavItem/navItemStyles.stylex.ts +2 -2
  372. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  373. package/src/NumberInput/NumberInput.doc.mjs +24 -0
  374. package/src/NumberInput/NumberInput.test.tsx +138 -0
  375. package/src/NumberInput/NumberInput.tsx +44 -6
  376. package/src/Outline/Outline.doc.mjs +2 -0
  377. package/src/Outline/Outline.tsx +1 -1
  378. package/src/Outline/parseOutlineFromMarkdown.ts +10 -40
  379. package/src/PowerSearch/PowerSearch.tsx +17 -8
  380. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  381. package/src/PowerSearch/formatFilterValue.test.ts +22 -2
  382. package/src/PowerSearch/formatFilterValue.ts +31 -6
  383. package/src/RadioList/RadioList.doc.mjs +1 -1
  384. package/src/RadioList/RadioList.test.tsx +170 -2
  385. package/src/RadioList/RadioList.tsx +9 -1
  386. package/src/RadioList/RadioListItem.tsx +83 -51
  387. package/src/Resizable/ResizeHandle.test.tsx +22 -0
  388. package/src/Resizable/ResizeHandle.tsx +9 -3
  389. package/src/Section/Section.doc.mjs +55 -0
  390. package/src/Section/Section.test.tsx +201 -4
  391. package/src/Section/Section.tsx +69 -0
  392. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  393. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -2
  394. package/src/SelectableCard/SelectableCard.tsx +1 -1
  395. package/src/Selector/Selector.doc.mjs +16 -2
  396. package/src/Selector/Selector.test.tsx +525 -1
  397. package/src/Selector/Selector.tsx +166 -21
  398. package/src/Selector/SelectorOption.doc.mjs +7 -0
  399. package/src/Selector/SelectorOption.tsx +21 -0
  400. package/src/Selector/SelectorRowLayoutContext.ts +32 -0
  401. package/src/Selector/types.ts +4 -4
  402. package/src/SideNav/SideNavHeading.tsx +2 -2
  403. package/src/SideNav/SideNavItem.tsx +1 -1
  404. package/src/Slider/Slider.tsx +11 -1
  405. package/src/Stack/Stack.doc.mjs +72 -0
  406. package/src/Stack/Stack.test.tsx +156 -0
  407. package/src/Stack/Stack.tsx +50 -8
  408. package/src/StatusDot/StatusDot.doc.mjs +13 -0
  409. package/src/StatusDot/StatusDot.test.tsx +115 -8
  410. package/src/StatusDot/StatusDot.tsx +74 -9
  411. package/src/Switch/Switch.tsx +6 -0
  412. package/src/TabList/TabMenu.tsx +1 -1
  413. package/src/Table/TableRow.tsx +4 -4
  414. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  415. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +2 -1
  416. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +22 -4
  417. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +34 -0
  418. package/src/Table/plugins/sortable/useTableSortableState.tsx +26 -23
  419. package/src/Table/plugins/tree/useTableTreeData.tsx +2 -2
  420. package/src/TextArea/TextArea.doc.mjs +1 -1
  421. package/src/TextArea/TextArea.tsx +3 -1
  422. package/src/TextInput/TextInput.tsx +3 -1
  423. package/src/Thumbnail/Thumbnail.tsx +1 -1
  424. package/src/TimeInput/TimeInput.tsx +3 -1
  425. package/src/Timestamp/Timestamp.test.tsx +27 -7
  426. package/src/Timestamp/Timestamp.tsx +8 -4
  427. package/src/Timestamp/formatInstant.ts +9 -7
  428. package/src/Timestamp/tooltipEntries.test.ts +11 -6
  429. package/src/Timestamp/tooltipEntries.ts +6 -2
  430. package/src/Token/Token.tsx +1 -1
  431. package/src/Tooltip/Tooltip.doc.mjs +18 -0
  432. package/src/Tooltip/Tooltip.test.tsx +254 -1
  433. package/src/Tooltip/Tooltip.tsx +22 -2
  434. package/src/Tooltip/index.ts +1 -0
  435. package/src/Tooltip/useTooltip.doc.mjs +2 -0
  436. package/src/Tooltip/useTooltip.tsx +99 -21
  437. package/src/TopNav/TopNavHeading.tsx +1 -1
  438. package/src/TopNav/TopNavItem.tsx +2 -2
  439. package/src/TopNav/TopNavMegaMenu.tsx +1 -1
  440. package/src/TopNav/TopNavMegaMenuItem.tsx +1 -1
  441. package/src/TopNav/TopNavMenu.tsx +2 -2
  442. package/src/TreeList/TreeListItem.tsx +1 -1
  443. package/src/hooks/containerReveal.stylex.ts +54 -18
  444. package/src/hooks/scrollbarGutter.test.ts +167 -0
  445. package/src/hooks/scrollbarGutter.ts +121 -0
  446. package/src/hooks/useResolvedRequired.ts +42 -0
  447. package/src/hooks/useScrollLock.doc.mjs +4 -4
  448. package/src/hooks/useScrollLock.test.ts +73 -0
  449. package/src/hooks/useScrollLock.ts +14 -0
  450. package/src/i18n/InternationalizationContext.ts +2 -0
  451. package/src/i18n/__tests__/e2e-powersearch.test.tsx +37 -1
  452. package/src/i18n/__tests__/useCollator.test.tsx +115 -0
  453. package/src/i18n/__tests__/useLocale.test.tsx +52 -0
  454. package/src/i18n/index.ts +6 -0
  455. package/src/i18n/useCollator.doc.mjs +84 -0
  456. package/src/i18n/useCollator.ts +44 -0
  457. package/src/i18n/useLocale.doc.mjs +70 -0
  458. package/src/i18n/useLocale.ts +34 -0
  459. package/src/i18n/useTranslator.doc.mjs +1 -1
  460. package/src/theme/defineTheme.test.ts +9 -3
  461. package/src/theme/defineTheme.ts +5 -0
  462. package/src/theme/derivedVarRegistry.test.ts +19 -5
  463. package/src/theme/derivedVarRegistry.ts +4 -0
  464. package/src/theme/generateThemeRules.test.ts +118 -0
  465. package/src/theme/generateThemeRules.ts +83 -5
  466. package/src/utils/dateParser.test.ts +20 -0
  467. package/src/utils/dateParser.ts +14 -7
  468. package/src/utils/plainDate.test.ts +56 -0
  469. package/src/utils/plainDate.ts +17 -4
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file useCalendarDays.ts
7
- * @input Uses React useMemo, PlainDate utilities
7
+ * @input Uses React context via use(), useMemo, PlainDate utilities, generated CLDR weekday data
8
8
  * @output Exports useCalendarDays hook for generating calendar day grids
9
9
  * @position Calendar-specific hook; used by Calendar
10
10
  *
@@ -12,7 +12,7 @@
12
12
  * - /packages/core/src/Calendar/hooks/index.ts
13
13
  */
14
14
 
15
- import {useMemo} from 'react';
15
+ import {use, useMemo} from 'react';
16
16
  import type {DayOfWeek, ISODateString} from '../../utils/dateTypes';
17
17
  import {
18
18
  type PlainDate,
@@ -21,6 +21,8 @@ import {
21
21
  plainDateDayOfWeek,
22
22
  plainDateAddDays,
23
23
  } from '../../utils/plainDate';
24
+ import {InternationalizationContext} from '../../i18n/InternationalizationContext';
25
+ import {getStandaloneShortWeekdayNames} from '../getStandaloneShortWeekdayNames';
24
26
 
25
27
  /**
26
28
  * Represents a single day in the calendar grid.
@@ -84,6 +86,7 @@ export function useCalendarDays(
84
86
  options: UseCalendarDaysOptions,
85
87
  ): UseCalendarDaysReturn {
86
88
  const {year, month, weekStartsOn = 0, hasVariableRowCount = false} = options;
89
+ const {locale} = use(InternationalizationContext);
87
90
 
88
91
  // Calculate grid structure
89
92
  const gridInfo = useMemo(() => {
@@ -108,15 +111,15 @@ export function useCalendarDays(
108
111
  };
109
112
  }, [year, month, weekStartsOn, hasVariableRowCount]);
110
113
 
111
- // Generate day names
114
+ // Generated strings avoid Date anchors, so weekday headers cannot shift with
115
+ // the runtime timezone. Keep numeric indices as the rotation source of truth.
112
116
  const dayNames = useMemo(() => {
113
- const names = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
114
- const rotated: string[] = [];
115
- for (let i = 0; i < 7; i++) {
116
- rotated.push(names[(i + weekStartsOn) % 7]);
117
- }
118
- return rotated;
119
- }, [weekStartsOn]);
117
+ const names = getStandaloneShortWeekdayNames(locale);
118
+ return Array.from(
119
+ {length: 7},
120
+ (_, index) => names[(index + weekStartsOn) % 7],
121
+ );
122
+ }, [locale, weekStartsOn]);
120
123
 
121
124
  // Generate days array
122
125
  const days = useMemo(() => {
@@ -12,7 +12,7 @@
12
12
  * - /packages/core/src/Calendar/hooks/index.ts
13
13
  */
14
14
 
15
- import {useState, useMemo, useCallback} from 'react';
15
+ import {use, useState, useMemo, useCallback} from 'react';
16
16
  import type {ISODateString} from '../../utils/dateTypes';
17
17
  import {
18
18
  type PlainDate,
@@ -25,6 +25,7 @@ import {
25
25
  plainDateFormat,
26
26
  DATE_FORMAT_MONTH_YEAR,
27
27
  } from '../../utils/plainDate';
28
+ import {InternationalizationContext} from '../../i18n';
28
29
 
29
30
  /**
30
31
  * Configuration for calendar navigation
@@ -98,6 +99,7 @@ export function useCalendarNavigation(
98
99
  onFocusDateChange,
99
100
  numberOfMonths = 1,
100
101
  } = options;
102
+ const {locale} = use(InternationalizationContext);
101
103
 
102
104
  // Pending focus target after month navigation
103
105
  const [pendingFocus, setPendingFocus] = useState<ISODateString | null>(null);
@@ -135,12 +137,12 @@ export function useCalendarNavigation(
135
137
  // Format month header
136
138
  const monthYearLabel = useMemo(() => {
137
139
  if (numberOfMonths === 1) {
138
- return plainDateFormat(visibleMonths[0], DATE_FORMAT_MONTH_YEAR);
140
+ return plainDateFormat(visibleMonths[0], DATE_FORMAT_MONTH_YEAR, locale);
139
141
  }
140
142
  return visibleMonths
141
- .map(m => plainDateFormat(m, DATE_FORMAT_MONTH_YEAR))
143
+ .map(m => plainDateFormat(m, DATE_FORMAT_MONTH_YEAR, locale))
142
144
  .join(' – ');
143
- }, [visibleMonths, numberOfMonths]);
145
+ }, [visibleMonths, numberOfMonths, locale]);
144
146
 
145
147
  // Navigate to previous/next month
146
148
  const navigateMonth = useCallback(
@@ -0,0 +1,50 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @generated by scripts/generate-cldr-weekdays.mjs from Unicode CLDR 48.2.0.
5
+ * Do not edit by hand. Run `pnpm generate:cldr-weekdays` instead.
6
+ */
7
+
8
+ export type StandaloneShortWeekdayNames = readonly [
9
+ string,
10
+ string,
11
+ string,
12
+ string,
13
+ string,
14
+ string,
15
+ string,
16
+ ];
17
+
18
+ export const standaloneShortWeekdayNamesByLocale = {
19
+ af: ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'],
20
+ ar: ['أحد', 'إثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'],
21
+ 'ar-SA': ['أحد', 'إثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'],
22
+ ca: ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'],
23
+ cs: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
24
+ da: ['sø.', 'ma.', 'ti.', 'on.', 'to.', 'fr.', 'lø.'],
25
+ de: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
26
+ el: ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πέ', 'Πα', 'Σά'],
27
+ en: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
28
+ es: ['DO', 'LU', 'MA', 'MI', 'JU', 'VI', 'SA'],
29
+ fi: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
30
+ fr: ['di', 'lu', 'ma', 'me', 'je', 've', 'sa'],
31
+ he: ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],
32
+ hu: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
33
+ it: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],
34
+ ja: ['日', '月', '火', '水', '木', '金', '土'],
35
+ ko: ['일', '월', '화', '수', '목', '금', '토'],
36
+ nl: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
37
+ no: ['sø.', 'ma.', 'ti.', 'on.', 'to.', 'fr.', 'lø.'],
38
+ pl: ['nie', 'pon', 'wto', 'śro', 'czw', 'pią', 'sob'],
39
+ pt: ['dom.', 'seg.', 'ter.', 'qua.', 'qui.', 'sex.', 'sáb.'],
40
+ 'pt-PT': ['dom.', 'seg.', 'ter.', 'qua.', 'qui.', 'sex.', 'sáb.'],
41
+ ro: ['du.', 'lu.', 'ma.', 'mi.', 'joi', 'vi.', 'sâ.'],
42
+ ru: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
43
+ sr: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
44
+ sv: ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö'],
45
+ tr: ['Pa', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'],
46
+ uk: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
47
+ vi: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
48
+ zh: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
49
+ 'zh-TW': ['日', '一', '二', '三', '四', '五', '六'],
50
+ } as const satisfies Readonly<Record<string, StandaloneShortWeekdayNames>>;
@@ -254,7 +254,7 @@ export const dayCellTheme = stylex.create({
254
254
  backgroundColor: 'transparent',
255
255
  backgroundImage: {
256
256
  default: null,
257
- ':hover': {
257
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
258
258
  '@media (hover: hover)': `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`,
259
259
  },
260
260
  },
@@ -281,7 +281,7 @@ export const dayCellTheme = stylex.create({
281
281
  color: colorVars['--color-on-accent'],
282
282
  backgroundImage: {
283
283
  default: null,
284
- ':hover': {
284
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
285
285
  '@media (hover: hover)': `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`,
286
286
  },
287
287
  },
@@ -292,7 +292,7 @@ export const dayCellTheme = stylex.create({
292
292
  opacity: 0.3,
293
293
  backgroundImage: {
294
294
  default: 'none',
295
- ':hover': {
295
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
296
296
  '@media (hover: hover)': 'none',
297
297
  },
298
298
  },
@@ -48,12 +48,36 @@ export const docs = {
48
48
  description:
49
49
  'Inline (horizontal) padding, using the spacing scale. Overrides padding on the inline axis when both are set.',
50
50
  },
51
+ {
52
+ name: 'paddingInlineStart',
53
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
54
+ description:
55
+ 'Inline-start padding, using the spacing scale (left in LTR, right in RTL). Overrides paddingInline and padding on that edge only.',
56
+ },
57
+ {
58
+ name: 'paddingInlineEnd',
59
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
60
+ description:
61
+ 'Inline-end padding, using the spacing scale (right in LTR, left in RTL). Overrides paddingInline and padding on that edge only.',
62
+ },
51
63
  {
52
64
  name: 'paddingBlock',
53
65
  type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
54
66
  description:
55
67
  'Block (vertical) padding, using the spacing scale. Overrides padding on the block axis when both are set.',
56
68
  },
69
+ {
70
+ name: 'paddingBlockStart',
71
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
72
+ description:
73
+ 'Block-start (top) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
74
+ },
75
+ {
76
+ name: 'paddingBlockEnd',
77
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
78
+ description:
79
+ 'Block-end (bottom) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
80
+ },
57
81
  {
58
82
  name: 'isInline',
59
83
  type: 'boolean',
@@ -124,11 +148,31 @@ export const docsZh = {
124
148
  type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
125
149
  description: '行内(水平)内边距,使用间距刻度。两者同时设置时在行内轴上覆盖 padding。',
126
150
  },
151
+ {
152
+ name: 'paddingInlineStart',
153
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
154
+ description: '行内起始内边距,使用间距刻度(LTR 中为左侧,RTL 中为右侧)。仅在该边上覆盖 paddingInline 和 padding。',
155
+ },
156
+ {
157
+ name: 'paddingInlineEnd',
158
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
159
+ description: '行内结束内边距,使用间距刻度(LTR 中为右侧,RTL 中为左侧)。仅在该边上覆盖 paddingInline 和 padding。',
160
+ },
127
161
  {
128
162
  name: 'paddingBlock',
129
163
  type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
130
164
  description: '块(垂直)内边距,使用间距刻度。两者同时设置时在块轴上覆盖 padding。',
131
165
  },
166
+ {
167
+ name: 'paddingBlockStart',
168
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
169
+ description: '块起始(顶部)内边距,使用间距刻度。仅在该边上覆盖 paddingBlock 和 padding。',
170
+ },
171
+ {
172
+ name: 'paddingBlockEnd',
173
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
174
+ description: '块结束(底部)内边距,使用间距刻度。仅在该边上覆盖 paddingBlock 和 padding。',
175
+ },
132
176
  {name: 'isInline', type: 'boolean', description: '使用 inline-flex(适用于文本/图标)。', default: 'false'},
133
177
  {name: 'children', type: 'ReactNode', description: '要居中的内容。'},
134
178
  {
@@ -171,7 +215,11 @@ export const docsDense = {
171
215
  padding:
172
216
  'inner padding on all sides (spacing step: 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10)',
173
217
  paddingInline: 'inline (horizontal) padding; overrides padding on that axis',
218
+ paddingInlineStart: 'inline-start padding (left in LTR); overrides paddingInline/padding on that edge',
219
+ paddingInlineEnd: 'inline-end padding (right in LTR); overrides paddingInline/padding on that edge',
174
220
  paddingBlock: 'block (vertical) padding; overrides padding on that axis',
221
+ paddingBlockStart: 'block-start (top) padding; overrides paddingBlock/padding on that edge',
222
+ paddingBlockEnd: 'block-end (bottom) padding; overrides paddingBlock/padding on that edge',
175
223
  isInline: 'use inline-flex for text/icons',
176
224
  children: 'content to center',
177
225
  xstyle: 'StyleX styles for layout (margins, positioning, sizing); must be stylex.create() value',
@@ -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,
@@ -273,7 +273,9 @@ const elevationStyles = stylex.create({
273
273
  low: {
274
274
  boxShadow: {
275
275
  default: shadowVars['--shadow-low'],
276
- ':hover': {'@media (hover: hover)': shadowVars['--shadow-med']},
276
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
277
+ '@media (hover: hover)': shadowVars['--shadow-med'],
278
+ },
277
279
  },
278
280
  ':focus-within': {
279
281
  boxShadow: shadowVars['--shadow-med'],
@@ -292,9 +294,10 @@ const elevationStyles = stylex.create({
292
294
  padding: `calc(var(--_chat-composer-padding) - ${borderVars['--border-width']})`,
293
295
  boxShadow: {
294
296
  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
- },
297
+ ':hover:not(:focus-within):where(:not(:disabled,[aria-disabled="true"]))':
298
+ {
299
+ '@media (hover: hover)': `inset 0px 0px 0px 2px color-mix(in srgb, ${colorVars['--color-border-emphasized']} 30%, transparent)`,
300
+ },
298
301
  ':focus-within': `inset 0px 0px 0px 2px ${colorVars['--color-accent-muted']}`,
299
302
  },
300
303
  },
@@ -197,7 +197,7 @@ const styles = stylex.create({
197
197
  paddingInline: spacingVars['--spacing-1'],
198
198
  marginInline: `calc(-1 * ${spacingVars['--spacing-1']})`,
199
199
  '@media (hover: hover)': {
200
- ':hover': {
200
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
201
201
  backgroundColor: colorVars['--color-overlay-hover'],
202
202
  },
203
203
  },
@@ -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;