@astryxdesign/core 0.4.5 → 0.4.6-canary.3b74294

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 (539) 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 +6 -2
  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 +9 -2
  461. package/src/TabList/TabList.test.tsx +21 -4
  462. package/src/TabList/TabMenu.tsx +9 -3
  463. package/src/Table/TableRow.tsx +4 -4
  464. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +6 -2
  465. package/src/Table/plugins/filtering/useTableFiltering.tsx +4 -1
  466. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +10 -3
  467. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +6 -3
  468. package/src/Table/plugins/sortable/useTableSortable.tsx +4 -1
  469. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +34 -0
  470. package/src/Table/plugins/sortable/useTableSortableState.tsx +26 -23
  471. package/src/Table/plugins/tree/useTableTreeData.tsx +10 -4
  472. package/src/TextArea/TextArea.doc.mjs +1 -1
  473. package/src/TextArea/TextArea.tsx +1 -1
  474. package/src/TextInput/TextInput.tsx +1 -1
  475. package/src/Thumbnail/Thumbnail.tsx +9 -3
  476. package/src/TimeInput/TimeInput.tsx +1 -1
  477. package/src/Timestamp/Timestamp.test.tsx +27 -7
  478. package/src/Timestamp/Timestamp.tsx +8 -4
  479. package/src/Timestamp/formatInstant.ts +9 -7
  480. package/src/Timestamp/tooltipEntries.test.ts +11 -6
  481. package/src/Timestamp/tooltipEntries.ts +6 -2
  482. package/src/Toast/Toast.tsx +9 -7
  483. package/src/Token/Token.tsx +14 -5
  484. package/src/Tokenizer/Tokenizer.tsx +4 -1
  485. package/src/Tooltip/Tooltip.doc.mjs +18 -0
  486. package/src/Tooltip/Tooltip.test.tsx +254 -1
  487. package/src/Tooltip/Tooltip.tsx +22 -2
  488. package/src/Tooltip/index.ts +1 -0
  489. package/src/Tooltip/useTooltip.doc.mjs +2 -0
  490. package/src/Tooltip/useTooltip.tsx +99 -21
  491. package/src/TopNav/TopNavHeading.tsx +13 -4
  492. package/src/TopNav/TopNavItem.tsx +6 -3
  493. package/src/TopNav/TopNavMegaMenu.tsx +5 -2
  494. package/src/TopNav/TopNavMegaMenuItem.tsx +5 -2
  495. package/src/TopNav/TopNavMenu.tsx +10 -4
  496. package/src/TreeList/TreeListItem.tsx +22 -7
  497. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  498. package/src/Typeahead/Typeahead.tsx +4 -1
  499. package/src/hooks/containerReveal.stylex.ts +54 -18
  500. package/src/hooks/scrollbarGutter.test.ts +167 -0
  501. package/src/hooks/scrollbarGutter.ts +121 -0
  502. package/src/hooks/useAutoMediaMode.test.ts +109 -0
  503. package/src/hooks/useAutoMediaMode.ts +233 -0
  504. package/src/hooks/useInputStatusIcon.tsx +4 -1
  505. package/src/hooks/useListFocus.doc.mjs +2 -2
  506. package/src/hooks/useListFocus.test.tsx +65 -3
  507. package/src/hooks/useListFocus.ts +15 -7
  508. package/src/hooks/useScrollLock.doc.mjs +4 -4
  509. package/src/hooks/useScrollLock.test.ts +73 -0
  510. package/src/hooks/useScrollLock.ts +14 -0
  511. package/src/i18n/InternationalizationContext.ts +2 -0
  512. package/src/i18n/__tests__/e2e-powersearch.test.tsx +37 -1
  513. package/src/i18n/__tests__/useCollator.test.tsx +115 -0
  514. package/src/i18n/__tests__/useLocale.test.tsx +52 -0
  515. package/src/i18n/index.ts +6 -0
  516. package/src/i18n/useCollator.doc.mjs +84 -0
  517. package/src/i18n/useCollator.ts +44 -0
  518. package/src/i18n/useLocale.doc.mjs +70 -0
  519. package/src/i18n/useLocale.ts +34 -0
  520. package/src/i18n/useTranslator.doc.mjs +1 -1
  521. package/src/reset.css +9 -2
  522. package/src/reset.test.ts +22 -0
  523. package/src/theme/MediaTheme.doc.mjs +23 -4
  524. package/src/theme/MediaTheme.dom.test.tsx +97 -0
  525. package/src/theme/MediaTheme.tsx +42 -7
  526. package/src/theme/defineTheme.test.ts +9 -3
  527. package/src/theme/defineTheme.ts +5 -0
  528. package/src/theme/derivedVarRegistry.test.ts +19 -5
  529. package/src/theme/derivedVarRegistry.ts +4 -0
  530. package/src/theme/generateThemeRules.test.ts +118 -0
  531. package/src/theme/generateThemeRules.ts +83 -5
  532. package/src/theme/index.ts +1 -1
  533. package/src/theme/syntax/index.ts +6 -2
  534. package/src/theme/syntax/serverSafeSyntax.test.ts +68 -0
  535. package/src/utils/dateParser.test.ts +20 -0
  536. package/src/utils/dateParser.ts +14 -7
  537. package/src/utils/index.ts +2 -0
  538. package/src/utils/plainDate.test.ts +6 -0
  539. package/src/utils/plainDate.ts +21 -4
@@ -46,12 +46,36 @@ export const docs = {
46
46
  description:
47
47
  'Inline (horizontal) padding. Overrides padding on the inline axis when both are set.',
48
48
  },
49
+ {
50
+ name: 'paddingInlineStart',
51
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
52
+ description:
53
+ 'Inline-start padding, using the spacing scale (left in LTR, right in RTL). Overrides paddingInline and padding on that edge only.',
54
+ },
55
+ {
56
+ name: 'paddingInlineEnd',
57
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
58
+ description:
59
+ 'Inline-end padding, using the spacing scale (right in LTR, left in RTL). Overrides paddingInline and padding on that edge only.',
60
+ },
49
61
  {
50
62
  name: 'paddingBlock',
51
63
  type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
52
64
  description:
53
65
  'Block (vertical) padding. Overrides padding on the block axis when both are set.',
54
66
  },
67
+ {
68
+ name: 'paddingBlockStart',
69
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
70
+ description:
71
+ 'Block-start (top) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
72
+ },
73
+ {
74
+ name: 'paddingBlockEnd',
75
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
76
+ description:
77
+ 'Block-end (bottom) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
78
+ },
55
79
  {
56
80
  name: 'isScrollable',
57
81
  type: 'boolean',
@@ -150,12 +174,36 @@ export const docs = {
150
174
  description:
151
175
  'Inline (horizontal) padding, using the spacing scale. Overrides padding on the inline axis when both are set.',
152
176
  },
177
+ {
178
+ name: 'paddingInlineStart',
179
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
180
+ description:
181
+ 'Inline-start padding, using the spacing scale (left in LTR, right in RTL). Overrides paddingInline and padding on that edge only.',
182
+ },
183
+ {
184
+ name: 'paddingInlineEnd',
185
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
186
+ description:
187
+ 'Inline-end padding, using the spacing scale (right in LTR, left in RTL). Overrides paddingInline and padding on that edge only.',
188
+ },
153
189
  {
154
190
  name: 'paddingBlock',
155
191
  type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
156
192
  description:
157
193
  'Block (vertical) padding, using the spacing scale. Overrides padding on the block axis when both are set.',
158
194
  },
195
+ {
196
+ name: 'paddingBlockStart',
197
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
198
+ description:
199
+ 'Block-start (top) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
200
+ },
201
+ {
202
+ name: 'paddingBlockEnd',
203
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
204
+ description:
205
+ 'Block-end (bottom) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
206
+ },
159
207
  {
160
208
  name: 'isScrollable',
161
209
  type: 'boolean',
@@ -253,12 +301,36 @@ export const docs = {
253
301
  description:
254
302
  'Inline (horizontal) padding, using the spacing scale. Overrides padding on the inline axis when both are set.',
255
303
  },
304
+ {
305
+ name: 'paddingInlineStart',
306
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
307
+ description:
308
+ 'Inline-start padding, using the spacing scale (left in LTR, right in RTL). Overrides paddingInline and padding on that edge only.',
309
+ },
310
+ {
311
+ name: 'paddingInlineEnd',
312
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
313
+ description:
314
+ 'Inline-end padding, using the spacing scale (right in LTR, left in RTL). Overrides paddingInline and padding on that edge only.',
315
+ },
256
316
  {
257
317
  name: 'paddingBlock',
258
318
  type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
259
319
  description:
260
320
  'Block (vertical) padding, using the spacing scale. Overrides padding on the block axis when both are set.',
261
321
  },
322
+ {
323
+ name: 'paddingBlockStart',
324
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
325
+ description:
326
+ 'Block-start (top) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
327
+ },
328
+ {
329
+ name: 'paddingBlockEnd',
330
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
331
+ description:
332
+ 'Block-end (bottom) padding, using the spacing scale. Overrides paddingBlock and padding on that edge only.',
333
+ },
262
334
  {
263
335
  name: 'isScrollable',
264
336
  type: 'boolean',
@@ -13,6 +13,22 @@ import {describe, it, expect, vi} from 'vitest';
13
13
  import {render, screen} from '@testing-library/react';
14
14
  import {Stack} from './Stack';
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('Stack', () => {
17
33
  it('defaults to vertical direction', () => {
18
34
  render(
@@ -314,4 +330,144 @@ describe('Stack', () => {
314
330
  const withScroll = screen.getByTestId('stack').className;
315
331
  expect(withScroll).not.toBe(withoutScroll);
316
332
  });
333
+
334
+ it('applies a class when paddingBlockStart is set on its own', () => {
335
+ const {rerender} = render(
336
+ <Stack data-testid="stack">
337
+ <div>Content</div>
338
+ </Stack>,
339
+ );
340
+ const baseline = screen.getByTestId('stack').className;
341
+ rerender(
342
+ <Stack paddingBlockStart={2} data-testid="stack">
343
+ <div>Content</div>
344
+ </Stack>,
345
+ );
346
+ expect(screen.getByTestId('stack').className).not.toBe(baseline);
347
+ });
348
+
349
+ it('lets paddingBlockStart/paddingBlockEnd override only their own edge', () => {
350
+ const {rerender} = render(
351
+ <Stack padding={4} paddingBlockStart={2} data-testid="stack">
352
+ <div>Content</div>
353
+ </Stack>,
354
+ );
355
+ const perEdge = classSet(screen.getByTestId('stack'));
356
+ rerender(
357
+ <Stack
358
+ paddingInline={4}
359
+ paddingBlockStart={2}
360
+ paddingBlockEnd={4}
361
+ data-testid="stack">
362
+ <div>Content</div>
363
+ </Stack>,
364
+ );
365
+ expect(perEdge).toEqual(classSet(screen.getByTestId('stack')));
366
+ });
367
+
368
+ it('gives paddingBlockEnd precedence over paddingBlock', () => {
369
+ const {rerender} = render(
370
+ <Stack paddingBlock={6} paddingBlockEnd={0} data-testid="stack">
371
+ <div>Content</div>
372
+ </Stack>,
373
+ );
374
+ const overridden = classSet(screen.getByTestId('stack'));
375
+ rerender(
376
+ <Stack paddingBlockStart={6} paddingBlockEnd={0} data-testid="stack">
377
+ <div>Content</div>
378
+ </Stack>,
379
+ );
380
+ expect(overridden).toEqual(classSet(screen.getByTestId('stack')));
381
+ });
382
+
383
+ it('leaves padding/paddingBlock output unchanged when no edge prop is set', () => {
384
+ const {rerender} = render(
385
+ <Stack padding={3} data-testid="stack">
386
+ <div>Content</div>
387
+ </Stack>,
388
+ );
389
+ const uniform = classSet(screen.getByTestId('stack'));
390
+ rerender(
391
+ <Stack paddingInline={3} paddingBlock={3} data-testid="stack">
392
+ <div>Content</div>
393
+ </Stack>,
394
+ );
395
+ expect(uniform).toEqual(classSet(screen.getByTestId('stack')));
396
+ });
397
+
398
+ it('applies a class when paddingInlineStart is set on its own', () => {
399
+ const {rerender} = render(
400
+ <Stack data-testid="stack">
401
+ <div>Content</div>
402
+ </Stack>,
403
+ );
404
+ const baseline = screen.getByTestId('stack').className;
405
+ rerender(
406
+ <Stack paddingInlineStart={2} data-testid="stack">
407
+ <div>Content</div>
408
+ </Stack>,
409
+ );
410
+ expect(screen.getByTestId('stack').className).not.toBe(baseline);
411
+ });
412
+
413
+ it('lets paddingInlineStart/paddingInlineEnd override only their own edge', () => {
414
+ const {rerender} = render(
415
+ <Stack padding={4} paddingInlineStart={2} data-testid="stack">
416
+ <div>Content</div>
417
+ </Stack>,
418
+ );
419
+ const perEdge = classSet(screen.getByTestId('stack'));
420
+ rerender(
421
+ <Stack
422
+ paddingInlineStart={2}
423
+ paddingInlineEnd={4}
424
+ paddingBlock={4}
425
+ data-testid="stack">
426
+ <div>Content</div>
427
+ </Stack>,
428
+ );
429
+ expect(perEdge).toEqual(classSet(screen.getByTestId('stack')));
430
+ });
431
+
432
+ it('gives paddingInlineEnd precedence over paddingInline', () => {
433
+ const {rerender} = render(
434
+ <Stack paddingInline={6} paddingInlineEnd={0} data-testid="stack">
435
+ <div>Content</div>
436
+ </Stack>,
437
+ );
438
+ const overridden = classSet(screen.getByTestId('stack'));
439
+ rerender(
440
+ <Stack paddingInlineStart={6} paddingInlineEnd={0} data-testid="stack">
441
+ <div>Content</div>
442
+ </Stack>,
443
+ );
444
+ expect(overridden).toEqual(classSet(screen.getByTestId('stack')));
445
+ });
446
+
447
+ it('resolves all four edges independently', () => {
448
+ // One prop per edge, each a different step: the four-edge spelling and the
449
+ // shorthand-plus-overrides spelling must agree.
450
+ const {rerender} = render(
451
+ <Stack
452
+ paddingInlineStart={1}
453
+ paddingInlineEnd={2}
454
+ paddingBlockStart={3}
455
+ paddingBlockEnd={4}
456
+ data-testid="stack">
457
+ <div>Content</div>
458
+ </Stack>,
459
+ );
460
+ const explicit = classSet(screen.getByTestId('stack'));
461
+ rerender(
462
+ <Stack
463
+ padding={4}
464
+ paddingInlineStart={1}
465
+ paddingInlineEnd={2}
466
+ paddingBlockStart={3}
467
+ data-testid="stack">
468
+ <div>Content</div>
469
+ </Stack>,
470
+ );
471
+ expect(explicit).toEqual(classSet(screen.getByTestId('stack')));
472
+ });
317
473
  });
@@ -25,8 +25,10 @@ import {
25
25
  } from './stack.stylex';
26
26
  import type {SizeValue} from '../utils/types';
27
27
  import {
28
- paddingInlineStyles,
29
- paddingBlockStyles,
28
+ paddingInlineStartStyles,
29
+ paddingInlineEndStyles,
30
+ paddingBlockStartStyles,
31
+ paddingBlockEndStyles,
30
32
  } from '../Layout/padding.stylex';
31
33
  import {mergeProps} from '../utils';
32
34
  import {themeProps} from '../utils/themeProps';
@@ -140,12 +142,38 @@ export interface StackProps extends BaseProps<HTMLElement> {
140
142
  */
141
143
  paddingInline?: SpacingStep;
142
144
 
145
+ /**
146
+ * Inline-start padding, using the spacing scale. Logical: the left edge in
147
+ * LTR, the right edge in RTL.
148
+ * Overrides `paddingInline` and `padding` on that edge only.
149
+ */
150
+ paddingInlineStart?: SpacingStep;
151
+
152
+ /**
153
+ * Inline-end padding, using the spacing scale. Logical: the right edge in
154
+ * LTR, the left edge in RTL.
155
+ * Overrides `paddingInline` and `padding` on that edge only.
156
+ */
157
+ paddingInlineEnd?: SpacingStep;
158
+
143
159
  /**
144
160
  * Block (vertical) padding, using the spacing scale.
145
161
  * Overrides `padding` on the block axis when both are set.
146
162
  */
147
163
  paddingBlock?: SpacingStep;
148
164
 
165
+ /**
166
+ * Block-start (top) padding, using the spacing scale.
167
+ * Overrides `paddingBlock` and `padding` on that edge only.
168
+ */
169
+ paddingBlockStart?: SpacingStep;
170
+
171
+ /**
172
+ * Block-end (bottom) padding, using the spacing scale.
173
+ * Overrides `paddingBlock` and `padding` on that edge only.
174
+ */
175
+ paddingBlockEnd?: SpacingStep;
176
+
149
177
  /**
150
178
  * Enables scrollable overflow (`overflow: auto`) for the stack.
151
179
  *
@@ -211,7 +239,11 @@ export function Stack({
211
239
  gap,
212
240
  padding,
213
241
  paddingInline,
242
+ paddingInlineStart,
243
+ paddingInlineEnd,
214
244
  paddingBlock,
245
+ paddingBlockStart,
246
+ paddingBlockEnd,
215
247
  isScrollable,
216
248
  width,
217
249
  height,
@@ -242,10 +274,14 @@ export function Stack({
242
274
  ? (resolvedVAlign as StackCrossAlignment | undefined)
243
275
  : (resolvedHAlign as StackCrossAlignment | undefined);
244
276
 
245
- // Resolve padding to per-axis values: `padding` sets both axes; `paddingInline`
246
- // / `paddingBlock` take precedence on their own axis when provided.
247
- const resolvedPaddingInline = paddingInline ?? padding;
248
- const resolvedPaddingBlock = paddingBlock ?? padding;
277
+ // Resolve padding to per-edge values. Most specific wins, per edge:
278
+ // edge prop -> axis prop -> `padding`.
279
+ const resolvedPaddingInlineStart =
280
+ paddingInlineStart ?? paddingInline ?? padding;
281
+ const resolvedPaddingInlineEnd = paddingInlineEnd ?? paddingInline ?? padding;
282
+ const resolvedPaddingBlockStart =
283
+ paddingBlockStart ?? paddingBlock ?? padding;
284
+ const resolvedPaddingBlockEnd = paddingBlockEnd ?? paddingBlock ?? padding;
249
285
 
250
286
  const stylexProps = stylex.props(
251
287
  ...stack({
@@ -255,8 +291,14 @@ export function Stack({
255
291
  gap,
256
292
  wrap,
257
293
  }),
258
- resolvedPaddingInline != null && paddingInlineStyles[resolvedPaddingInline],
259
- resolvedPaddingBlock != null && paddingBlockStyles[resolvedPaddingBlock],
294
+ resolvedPaddingInlineStart != null &&
295
+ paddingInlineStartStyles[resolvedPaddingInlineStart],
296
+ resolvedPaddingInlineEnd != null &&
297
+ paddingInlineEndStyles[resolvedPaddingInlineEnd],
298
+ resolvedPaddingBlockStart != null &&
299
+ paddingBlockStartStyles[resolvedPaddingBlockStart],
300
+ resolvedPaddingBlockEnd != null &&
301
+ paddingBlockEndStyles[resolvedPaddingBlockEnd],
260
302
  isScrollable && overflowStyles.scrollable,
261
303
  xstyle,
262
304
  );
@@ -161,7 +161,10 @@ const styles = stylex.create({
161
161
  margin: 0,
162
162
  padding: 0,
163
163
  opacity: 0,
164
- cursor: 'pointer',
164
+ cursor: {
165
+ default: 'pointer',
166
+ ':is(:disabled,[aria-disabled="true"])': 'default',
167
+ },
165
168
  zIndex: 1,
166
169
  minInlineSize: {
167
170
  default: null,
@@ -185,7 +188,7 @@ const styles = stylex.create({
185
188
  },
186
189
  },
187
190
  inputDisabled: {
188
- cursor: 'not-allowed',
191
+ cursor: 'default',
189
192
  },
190
193
  inputBusy: {
191
194
  pointerEvents: 'none',
@@ -101,7 +101,10 @@ const styles = stylex.create({
101
101
  lineHeight: typeScaleVars['--text-label-leading'],
102
102
  fontWeight: fontWeightVars['--font-weight-normal'],
103
103
  color: colorVars['--color-text-secondary'],
104
- cursor: 'pointer',
104
+ cursor: {
105
+ default: 'pointer',
106
+ ':is(:disabled,[aria-disabled="true"])': 'default',
107
+ },
105
108
  textDecoration: 'none',
106
109
  whiteSpace: 'nowrap',
107
110
  transitionProperty: 'color',
@@ -257,7 +260,11 @@ export function Tab({
257
260
  ...(isLabelHidden ? {'aria-label': label} : {}),
258
261
  [EDGE_COMP_ATTR]: '',
259
262
  'data-tab-value': value,
260
- 'aria-current': isSelected ? ('page' as const) : undefined,
263
+ // Generic `true` ("the current item within a set"), not `page`: the strip
264
+ // switches views in place at least as often as it navigates, and claiming
265
+ // "current page" when no page changed is a false statement to a screen
266
+ // reader. Stays truthful for the `href` case too, just less specific.
267
+ 'aria-current': isSelected ? ('true' as const) : undefined,
261
268
  // Roving tabindex: the tab strip is a single Tab stop. The selected tab is
262
269
  // the tabbable one; the rest are reachable via arrow keys (handled by
263
270
  // TabList's onKeyDown). When no tab is selected, TabList's repair effect
@@ -106,7 +106,7 @@ describe('TabList', () => {
106
106
  );
107
107
  });
108
108
 
109
- it('marks selected tab with aria-current', () => {
109
+ it('marks selected tab with a generic aria-current, not "page"', () => {
110
110
  render(
111
111
  <TabList value="home" onChange={() => {}}>
112
112
  <Tab value="home" label="Home" />
@@ -116,13 +116,30 @@ describe('TabList', () => {
116
116
 
117
117
  expect(screen.getByRole('button', {name: 'Home'})).toHaveAttribute(
118
118
  'aria-current',
119
- 'page',
119
+ 'true',
120
120
  );
121
121
  expect(screen.getByRole('button', {name: 'Settings'})).not.toHaveAttribute(
122
122
  'aria-current',
123
123
  );
124
124
  });
125
125
 
126
+ it('marks a selected link tab with the same generic aria-current', () => {
127
+ render(
128
+ <TabList value="home" onChange={() => {}}>
129
+ <Tab value="home" label="Home" href="/home" />
130
+ <Tab value="settings" label="Settings" href="/settings" />
131
+ </TabList>,
132
+ );
133
+
134
+ expect(screen.getByRole('link', {name: 'Home'})).toHaveAttribute(
135
+ 'aria-current',
136
+ 'true',
137
+ );
138
+ expect(screen.getByRole('link', {name: 'Settings'})).not.toHaveAttribute(
139
+ 'aria-current',
140
+ );
141
+ });
142
+
126
143
  it('calls onChange when a tab is clicked', async () => {
127
144
  const user = userEvent.setup();
128
145
  const handleChange = vi.fn();
@@ -148,7 +165,7 @@ describe('TabList', () => {
148
165
 
149
166
  expect(screen.getByRole('button', {name: 'Home'})).toHaveAttribute(
150
167
  'aria-current',
151
- 'page',
168
+ 'true',
152
169
  );
153
170
 
154
171
  rerender(
@@ -163,7 +180,7 @@ describe('TabList', () => {
163
180
  );
164
181
  expect(screen.getByRole('button', {name: 'Settings'})).toHaveAttribute(
165
182
  'aria-current',
166
- 'page',
183
+ 'true',
167
184
  );
168
185
  });
169
186
 
@@ -87,7 +87,10 @@ const styles = stylex.create({
87
87
  lineHeight: typeScaleVars['--text-label-leading'],
88
88
  fontWeight: fontWeightVars['--font-weight-normal'],
89
89
  color: colorVars['--color-text-secondary'],
90
- cursor: 'pointer',
90
+ cursor: {
91
+ default: 'pointer',
92
+ ':is(:disabled,[aria-disabled="true"])': 'default',
93
+ },
91
94
  textDecoration: 'none',
92
95
  transitionProperty: 'color',
93
96
  transitionDuration: durationVars['--duration-fast'],
@@ -185,13 +188,16 @@ const styles = stylex.create({
185
188
  lineHeight: typeScaleVars['--text-label-leading'],
186
189
  fontWeight: fontWeightVars['--font-weight-normal'],
187
190
  color: colorVars['--color-text-primary'],
188
- cursor: 'pointer',
191
+ cursor: {
192
+ default: 'pointer',
193
+ ':is(:disabled,[aria-disabled="true"])': 'default',
194
+ },
189
195
  transitionProperty: 'background-color',
190
196
  transitionDuration: durationVars['--duration-fast'],
191
197
  transitionTimingFunction: easeVars['--ease-standard'],
192
198
  backgroundColor: {
193
199
  default: 'transparent',
194
- ':hover': {
200
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
195
201
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
196
202
  },
197
203
  },
@@ -61,13 +61,13 @@ const hoverRowStyles = stylex.create({
61
61
  row: {
62
62
  backgroundColor: {
63
63
  default: null,
64
- ':hover': {
64
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
65
65
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
66
66
  },
67
67
  },
68
68
  '--table-row-overlay': {
69
69
  default: null,
70
- ':hover': {
70
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
71
71
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
72
72
  },
73
73
  },
@@ -82,14 +82,14 @@ const stripedHoverRowStyles = stylex.create({
82
82
  backgroundColor: {
83
83
  default: null,
84
84
  ':nth-child(even)': colorVars['--color-background-muted'],
85
- ':hover': {
85
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
86
86
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
87
87
  },
88
88
  },
89
89
  '--table-row-overlay': {
90
90
  default: null,
91
91
  ':nth-child(even)': colorVars['--color-background-muted'],
92
- ':hover': {
92
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
93
93
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
94
94
  },
95
95
  },
@@ -207,7 +207,10 @@ const handleStyles = stylex.create({
207
207
  // Wide transparent hit area; the visible indicator uses ::after to span
208
208
  // the full handle height independently of the border box.
209
209
  width: '8px',
210
- cursor: 'ew-resize',
210
+ cursor: {
211
+ default: 'ew-resize',
212
+ ':is(:disabled,[aria-disabled="true"])': 'default',
213
+ },
211
214
  zIndex: 1,
212
215
  touchAction: 'none',
213
216
  userSelect: 'none',
@@ -216,7 +219,8 @@ const handleStyles = stylex.create({
216
219
  // can't receive :hover directly.
217
220
  '--indicator-color': {
218
221
  default: 'transparent',
219
- ':hover': colorVars['--color-accent'],
222
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))':
223
+ colorVars['--color-accent'],
220
224
  ':focus-visible': colorVars['--color-accent'],
221
225
  },
222
226
  '@media (pointer: coarse)': {
@@ -362,7 +362,10 @@ const filterStyles = stylex.create({
362
362
  triggerButton: {
363
363
  background: 'none',
364
364
  border: 'none',
365
- cursor: 'pointer',
365
+ cursor: {
366
+ default: 'pointer',
367
+ ':is(:disabled,[aria-disabled="true"])': 'default',
368
+ },
366
369
  display: 'inline-flex',
367
370
  alignItems: 'center',
368
371
  justifyContent: 'center',
@@ -113,7 +113,10 @@ export interface UseTableGroupedRowsResult<T extends Record<string, unknown>> {
113
113
 
114
114
  const styles = stylex.create({
115
115
  headerRow: {
116
- cursor: 'pointer',
116
+ cursor: {
117
+ default: 'pointer',
118
+ ':is(:disabled,[aria-disabled="true"])': 'default',
119
+ },
117
120
  userSelect: 'none',
118
121
  backgroundColor: colorVars['--color-background-muted'],
119
122
  // Divider beneath each group header row (Ernest review #2).
@@ -145,10 +148,14 @@ const styles = stylex.create({
145
148
  margin: 0,
146
149
  background: 'transparent',
147
150
  border: 'none',
148
- cursor: 'pointer',
151
+ cursor: {
152
+ default: 'pointer',
153
+ ':is(:disabled,[aria-disabled="true"])': 'default',
154
+ },
149
155
  color: {
150
156
  default: colorVars['--color-icon-secondary'],
151
- ':hover': colorVars['--color-icon-primary'],
157
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))':
158
+ colorVars['--color-icon-primary'],
152
159
  },
153
160
  },
154
161
  chevronIcon: {
@@ -77,7 +77,10 @@ const expansionStyles = stylex.create({
77
77
  background: 'transparent',
78
78
  border: 'none',
79
79
  borderRadius: radiusVars['--radius-inner'],
80
- cursor: 'pointer',
80
+ cursor: {
81
+ default: 'pointer',
82
+ ':is(:disabled,[aria-disabled="true"])': 'default',
83
+ },
81
84
  color: colorVars['--color-icon-secondary'],
82
85
  transitionProperty: 'transform, color',
83
86
  transitionDuration: '150ms',
@@ -85,11 +88,11 @@ const expansionStyles = stylex.create({
85
88
  // Match IconButton ghost hover: subtle overlay background.
86
89
  backgroundImage: {
87
90
  default: null,
88
- ':hover': {
91
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
89
92
  '@media (hover: hover)': `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`,
90
93
  },
91
94
  },
92
- ':hover': {
95
+ ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
93
96
  color: colorVars['--color-icon-primary'],
94
97
  },
95
98
  },
@@ -125,7 +125,10 @@ const sortStyles = stylex.create({
125
125
  border: 'none',
126
126
  padding: 0,
127
127
  margin: 0,
128
- cursor: 'pointer',
128
+ cursor: {
129
+ default: 'pointer',
130
+ ':is(:disabled,[aria-disabled="true"])': 'default',
131
+ },
129
132
  font: 'inherit',
130
133
  color: 'inherit',
131
134
  width: '100%',