@astryxdesign/core 0.1.1 → 0.1.2-canary.04e71b2

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 (631) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +131 -13
  3. package/dist/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/Avatar/Avatar.js +11 -5
  5. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
  6. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  7. package/dist/AvatarGroup/AvatarGroupOverflow.js +4 -1
  8. package/dist/Banner/Banner.d.ts +7 -0
  9. package/dist/Banner/Banner.d.ts.map +1 -1
  10. package/dist/Banner/Banner.js +9 -2
  11. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
  12. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  13. package/dist/Breadcrumbs/BreadcrumbItem.js +24 -5
  14. package/dist/Button/Button.d.ts +12 -2
  15. package/dist/Button/Button.d.ts.map +1 -1
  16. package/dist/Button/Button.js +53 -17
  17. package/dist/Calendar/Calendar.d.ts +5 -4
  18. package/dist/Calendar/Calendar.d.ts.map +1 -1
  19. package/dist/Calendar/Calendar.js +82 -43
  20. package/dist/Calendar/hooks/index.d.ts +0 -2
  21. package/dist/Calendar/hooks/index.d.ts.map +1 -1
  22. package/dist/Calendar/hooks/index.js +1 -2
  23. package/dist/Calendar/index.d.ts +3 -3
  24. package/dist/Calendar/index.d.ts.map +1 -1
  25. package/dist/Calendar/index.js +1 -1
  26. package/dist/Calendar/styles.d.ts +3 -9
  27. package/dist/Calendar/styles.d.ts.map +1 -1
  28. package/dist/Calendar/styles.js +3 -11
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +17 -3
  31. package/dist/Center/Center.d.ts +11 -1
  32. package/dist/Center/Center.d.ts.map +1 -1
  33. package/dist/Center/Center.js +9 -3
  34. package/dist/Chat/ChatMessageList.d.ts +14 -1
  35. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  36. package/dist/Chat/ChatMessageList.js +2 -0
  37. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  38. package/dist/Chat/useTriggerMenu.js +4 -1
  39. package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
  40. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  41. package/dist/CheckboxInput/CheckboxInput.js +51 -9
  42. package/dist/CheckboxList/CheckboxList.d.ts +13 -1
  43. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  44. package/dist/CheckboxList/CheckboxList.js +39 -9
  45. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  46. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  47. package/dist/Citation/Citation.d.ts.map +1 -1
  48. package/dist/Citation/Citation.js +3 -3
  49. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  50. package/dist/CodeBlock/CodeBlock.js +49 -37
  51. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  52. package/dist/CommandPalette/CommandPalette.js +5 -5
  53. package/dist/ContextMenu/ContextMenu.d.ts +4 -5
  54. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  55. package/dist/ContextMenu/ContextMenu.js +93 -11
  56. package/dist/DateInput/DateInput.d.ts +23 -1
  57. package/dist/DateInput/DateInput.d.ts.map +1 -1
  58. package/dist/DateInput/DateInput.js +59 -8
  59. package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
  60. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  61. package/dist/DateRangeInput/DateRangeInput.js +42 -9
  62. package/dist/DateTimeInput/DateTimeInput.d.ts +35 -2
  63. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  64. package/dist/DateTimeInput/DateTimeInput.js +78 -15
  65. package/dist/Dialog/Dialog.d.ts.map +1 -1
  66. package/dist/Dialog/Dialog.js +12 -0
  67. package/dist/DropdownMenu/DropdownMenu.d.ts +1 -8
  68. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  69. package/dist/DropdownMenu/DropdownMenu.js +42 -14
  70. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  71. package/dist/EmptyState/EmptyState.js +7 -1
  72. package/dist/Field/Field.d.ts +19 -2
  73. package/dist/Field/Field.d.ts.map +1 -1
  74. package/dist/Field/Field.js +4 -0
  75. package/dist/Field/FieldLabel.d.ts +21 -2
  76. package/dist/Field/FieldLabel.d.ts.map +1 -1
  77. package/dist/Field/FieldLabel.js +41 -26
  78. package/dist/FileInput/FileInput.d.ts +22 -1
  79. package/dist/FileInput/FileInput.d.ts.map +1 -1
  80. package/dist/FileInput/FileInput.js +56 -10
  81. package/dist/Grid/Grid.d.ts +11 -1
  82. package/dist/Grid/Grid.d.ts.map +1 -1
  83. package/dist/Grid/Grid.js +8 -0
  84. package/dist/HoverCard/HoverCard.d.ts +2 -2
  85. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  86. package/dist/HoverCard/HoverCard.js +18 -6
  87. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  88. package/dist/HoverCard/useHoverCard.js +7 -3
  89. package/dist/InputGroup/InputGroup.d.ts +2 -2
  90. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  91. package/dist/InputGroup/InputGroup.js +14 -5
  92. package/dist/InputGroup/InputGroupContext.d.ts +4 -0
  93. package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
  94. package/dist/InputGroup/InputGroupContext.js +2 -2
  95. package/dist/InputGroup/index.d.ts +1 -0
  96. package/dist/InputGroup/index.d.ts.map +1 -1
  97. package/dist/Kbd/Kbd.d.ts.map +1 -1
  98. package/dist/Kbd/Kbd.js +34 -2
  99. package/dist/Layer/anchorName.d.ts +20 -0
  100. package/dist/Layer/anchorName.d.ts.map +1 -0
  101. package/dist/Layer/anchorName.js +36 -0
  102. package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
  103. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  104. package/dist/Layer/layerAnimations.stylex.js +8 -4
  105. package/dist/Layer/useLayer.d.ts +29 -0
  106. package/dist/Layer/useLayer.d.ts.map +1 -1
  107. package/dist/Layer/useLayer.js +55 -11
  108. package/dist/Layout/Layout.d.ts +4 -11
  109. package/dist/Layout/Layout.d.ts.map +1 -1
  110. package/dist/Layout/Layout.js +10 -11
  111. package/dist/Layout/LayoutFooter.d.ts +2 -2
  112. package/dist/Layout/LayoutFooter.d.ts.map +1 -1
  113. package/dist/Layout/LayoutHeader.d.ts +2 -2
  114. package/dist/Layout/LayoutHeader.d.ts.map +1 -1
  115. package/dist/Layout/LayoutPanel.d.ts +2 -2
  116. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  117. package/dist/Layout/padding.stylex.d.ts +51 -0
  118. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  119. package/dist/Layout/padding.stylex.js +63 -0
  120. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  121. package/dist/Lightbox/Lightbox.js +4 -2
  122. package/dist/Link/Link.d.ts +17 -2
  123. package/dist/Link/Link.d.ts.map +1 -1
  124. package/dist/Link/Link.js +20 -9
  125. package/dist/Link/LinkProvider.d.ts +1 -0
  126. package/dist/Link/LinkProvider.d.ts.map +1 -1
  127. package/dist/Link/LinkProvider.js +1 -0
  128. package/dist/Markdown/Markdown.d.ts.map +1 -1
  129. package/dist/Markdown/Markdown.js +18 -3
  130. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  131. package/dist/MobileNav/MobileNav.js +13 -0
  132. package/dist/MoreMenu/MoreMenu.d.ts +1 -7
  133. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  134. package/dist/MoreMenu/MoreMenu.js +0 -2
  135. package/dist/MultiSelector/MultiSelector.d.ts +25 -2
  136. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  137. package/dist/MultiSelector/MultiSelector.js +103 -22
  138. package/dist/MultiSelector/hooks.d.ts +12 -1
  139. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  140. package/dist/MultiSelector/hooks.js +14 -1
  141. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  142. package/dist/NavMenu/NavHeadingMenu.js +34 -3
  143. package/dist/NumberInput/NumberInput.d.ts +23 -2
  144. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  145. package/dist/NumberInput/NumberInput.js +62 -12
  146. package/dist/Pagination/Pagination.d.ts +1 -1
  147. package/dist/Pagination/Pagination.d.ts.map +1 -1
  148. package/dist/Pagination/Pagination.js +46 -28
  149. package/dist/Popover/usePopover.d.ts +25 -2
  150. package/dist/Popover/usePopover.d.ts.map +1 -1
  151. package/dist/Popover/usePopover.js +18 -6
  152. package/dist/PowerSearch/PowerSearch.d.ts +11 -1
  153. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  154. package/dist/PowerSearch/PowerSearch.js +6 -1
  155. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  156. package/dist/ProgressBar/ProgressBar.js +3 -5
  157. package/dist/RadioList/RadioList.d.ts +20 -2
  158. package/dist/RadioList/RadioList.d.ts.map +1 -1
  159. package/dist/RadioList/RadioList.js +105 -9
  160. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  161. package/dist/RadioList/RadioListItem.js +13 -2
  162. package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
  163. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  164. package/dist/SegmentedControl/SegmentedControl.js +78 -44
  165. package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
  166. package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  167. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  168. package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
  169. package/dist/Selector/Selector.d.ts +22 -1
  170. package/dist/Selector/Selector.d.ts.map +1 -1
  171. package/dist/Selector/Selector.js +84 -23
  172. package/dist/Selector/hooks.d.ts +8 -1
  173. package/dist/Selector/hooks.d.ts.map +1 -1
  174. package/dist/Selector/hooks.js +14 -1
  175. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  176. package/dist/SideNav/SideNavItem.js +1 -1
  177. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  178. package/dist/Skeleton/Skeleton.js +8 -2
  179. package/dist/Slider/Slider.d.ts +21 -0
  180. package/dist/Slider/Slider.d.ts.map +1 -1
  181. package/dist/Slider/Slider.js +38 -11
  182. package/dist/Spinner/Spinner.d.ts.map +1 -1
  183. package/dist/Spinner/Spinner.js +1 -1
  184. package/dist/Stack/Stack.d.ts +38 -23
  185. package/dist/Stack/Stack.d.ts.map +1 -1
  186. package/dist/Stack/Stack.js +25 -1
  187. package/dist/Stack/StackItem.d.ts +12 -23
  188. package/dist/Stack/StackItem.d.ts.map +1 -1
  189. package/dist/Stack/StackItem.js +8 -1
  190. package/dist/Switch/Switch.d.ts +23 -2
  191. package/dist/Switch/Switch.d.ts.map +1 -1
  192. package/dist/Switch/Switch.js +41 -11
  193. package/dist/TabList/Tab.d.ts.map +1 -1
  194. package/dist/TabList/Tab.js +6 -0
  195. package/dist/TabList/TabList.d.ts +16 -4
  196. package/dist/TabList/TabList.d.ts.map +1 -1
  197. package/dist/TabList/TabList.js +86 -10
  198. package/dist/TabList/TabListContext.d.ts +5 -0
  199. package/dist/TabList/TabListContext.d.ts.map +1 -1
  200. package/dist/TabList/TabListContext.js +5 -0
  201. package/dist/TabList/TabMenu.d.ts.map +1 -1
  202. package/dist/TabList/TabMenu.js +6 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +38 -16
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +36 -7
  207. package/dist/Table/TableCell.d.ts +8 -1
  208. package/dist/Table/TableCell.d.ts.map +1 -1
  209. package/dist/Table/TableCell.js +10 -10
  210. package/dist/Table/TableHeaderCell.d.ts +8 -1
  211. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  212. package/dist/Table/TableHeaderCell.js +16 -16
  213. package/dist/Table/TableRow.d.ts +6 -1
  214. package/dist/Table/TableRow.d.ts.map +1 -1
  215. package/dist/Table/TableRow.js +15 -7
  216. package/dist/Table/index.d.ts +4 -1
  217. package/dist/Table/index.d.ts.map +1 -1
  218. package/dist/Table/index.js +3 -2
  219. package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
  220. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  221. package/dist/Table/plugins/pagination/paginateData.js +8 -3
  222. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  223. package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
  224. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  225. package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
  226. package/dist/Table/plugins/stickyColumns/index.d.ts +3 -0
  227. package/dist/Table/plugins/stickyColumns/index.d.ts.map +1 -0
  228. package/dist/Table/plugins/stickyColumns/index.js +3 -0
  229. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +25 -0
  230. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -0
  231. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +369 -0
  232. package/dist/Table/tableContextMenu.d.ts +33 -0
  233. package/dist/Table/tableContextMenu.d.ts.map +1 -0
  234. package/dist/Table/tableContextMenu.js +133 -0
  235. package/dist/Table/types.d.ts +161 -5
  236. package/dist/Table/types.d.ts.map +1 -1
  237. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  238. package/dist/Table/useBaseTablePlugins.js +1 -1
  239. package/dist/Text/text.stylex.d.ts +2 -2
  240. package/dist/Text/text.stylex.js +2 -2
  241. package/dist/TextArea/TextArea.d.ts +22 -1
  242. package/dist/TextArea/TextArea.d.ts.map +1 -1
  243. package/dist/TextArea/TextArea.js +41 -9
  244. package/dist/TextInput/TextInput.d.ts +23 -2
  245. package/dist/TextInput/TextInput.d.ts.map +1 -1
  246. package/dist/TextInput/TextInput.js +55 -10
  247. package/dist/TimeInput/TimeInput.d.ts +23 -1
  248. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  249. package/dist/TimeInput/TimeInput.js +53 -10
  250. package/dist/Timestamp/Timestamp.d.ts +1 -1
  251. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  252. package/dist/Timestamp/Timestamp.js +28 -3
  253. package/dist/Toast/Toast.d.ts.map +1 -1
  254. package/dist/Toast/Toast.js +14 -0
  255. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  256. package/dist/Toast/ToastViewport.js +132 -3
  257. package/dist/ToggleButton/ToggleButton.d.ts +7 -9
  258. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  259. package/dist/ToggleButton/ToggleButton.js +34 -57
  260. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  261. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  262. package/dist/Tokenizer/Tokenizer.js +27 -5
  263. package/dist/Toolbar/Toolbar.d.ts +3 -3
  264. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  265. package/dist/Toolbar/Toolbar.js +51 -7
  266. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  267. package/dist/Tooltip/useTooltip.js +57 -9
  268. package/dist/TreeList/TreeList.d.ts +1 -1
  269. package/dist/TreeList/TreeList.d.ts.map +1 -1
  270. package/dist/TreeList/TreeList.js +72 -2
  271. package/dist/TreeList/TreeListItem.d.ts +11 -1
  272. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  273. package/dist/TreeList/TreeListItem.js +51 -12
  274. package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
  275. package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
  276. package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
  277. package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
  278. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  279. package/dist/Typeahead/BaseTypeahead.js +67 -6
  280. package/dist/Typeahead/Typeahead.d.ts +24 -1
  281. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  282. package/dist/Typeahead/Typeahead.js +29 -5
  283. package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
  284. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  285. package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
  286. package/dist/VisuallyHidden/index.d.ts +11 -0
  287. package/dist/VisuallyHidden/index.d.ts.map +1 -0
  288. package/dist/VisuallyHidden/index.js +13 -0
  289. package/dist/astryx.css +40 -1
  290. package/dist/astryx.umd.js +147 -0
  291. package/dist/astryx.umd.js.map +7 -0
  292. package/dist/hooks/focusableSelector.d.ts +22 -0
  293. package/dist/hooks/focusableSelector.d.ts.map +1 -0
  294. package/dist/hooks/focusableSelector.js +24 -0
  295. package/dist/hooks/index.d.ts +12 -2
  296. package/dist/hooks/index.d.ts.map +1 -1
  297. package/dist/hooks/index.js +7 -2
  298. package/dist/hooks/useAnnounce.d.ts +40 -0
  299. package/dist/hooks/useAnnounce.d.ts.map +1 -0
  300. package/dist/hooks/useAnnounce.js +142 -0
  301. package/dist/hooks/useClickableContainer.d.ts +16 -1
  302. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  303. package/dist/hooks/useClickableContainer.js +16 -4
  304. package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
  305. package/dist/hooks/useEntryAnimation.js +4 -4
  306. package/dist/hooks/useFocusTrap.d.ts +18 -0
  307. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  308. package/dist/hooks/useFocusTrap.js +87 -3
  309. package/dist/hooks/useGridFocus.d.ts +88 -1
  310. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  311. package/dist/hooks/useGridFocus.js +261 -62
  312. package/dist/hooks/useKeyboardHint.d.ts +82 -0
  313. package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
  314. package/dist/hooks/useKeyboardHint.js +220 -0
  315. package/dist/hooks/useListFocus.d.ts +78 -7
  316. package/dist/hooks/useListFocus.d.ts.map +1 -1
  317. package/dist/hooks/useListFocus.js +305 -52
  318. package/dist/hooks/useLongPress.d.ts +21 -0
  319. package/dist/hooks/useLongPress.d.ts.map +1 -0
  320. package/dist/hooks/useLongPress.js +89 -0
  321. package/dist/hooks/useTreeFocus.d.ts +157 -0
  322. package/dist/hooks/useTreeFocus.d.ts.map +1 -0
  323. package/dist/hooks/useTreeFocus.js +337 -0
  324. package/dist/hooks/useTypeahead.d.ts +63 -0
  325. package/dist/hooks/useTypeahead.d.ts.map +1 -0
  326. package/dist/hooks/useTypeahead.js +117 -0
  327. package/dist/index.d.ts +1 -0
  328. package/dist/index.d.ts.map +1 -1
  329. package/dist/index.js +1 -0
  330. package/dist/theme/generateThemeRules.js +1 -1
  331. package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
  332. package/dist/theme/syntax/SyntaxTheme.js +1 -1
  333. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  334. package/dist/theme/syntax/defineSyntaxTheme.js +2 -2
  335. package/dist/theme/syntax/presets.d.ts +1 -1
  336. package/dist/theme/syntax/presets.d.ts.map +1 -1
  337. package/dist/theme/syntax/presets.js +1 -1
  338. package/dist/theme/syntax/tokens.d.ts +1 -1
  339. package/dist/theme/syntax/tokens.js +1 -1
  340. package/dist/theme/types.d.ts +1 -1
  341. package/dist/utils/dateTypes.d.ts +12 -0
  342. package/dist/utils/dateTypes.d.ts.map +1 -1
  343. package/dist/utils/dateTypes.js +41 -1
  344. package/dist/utils/index.d.ts +4 -0
  345. package/dist/utils/index.d.ts.map +1 -1
  346. package/dist/utils/index.js +3 -1
  347. package/dist/utils/inputAria.d.ts +29 -0
  348. package/dist/utils/inputAria.d.ts.map +1 -0
  349. package/dist/utils/inputAria.js +30 -0
  350. package/dist/utils/timeParser.d.ts.map +1 -1
  351. package/dist/utils/timeParser.js +5 -2
  352. package/package.json +15 -5
  353. package/src/Avatar/Avatar.test.tsx +37 -0
  354. package/src/Avatar/Avatar.tsx +10 -5
  355. package/src/AvatarGroup/AvatarGroupOverflow.tsx +3 -0
  356. package/src/Banner/Banner.doc.mjs +8 -0
  357. package/src/Banner/Banner.test.tsx +16 -7
  358. package/src/Banner/Banner.tsx +9 -2
  359. package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
  360. package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
  361. package/src/Button/Button.doc.mjs +6 -0
  362. package/src/Button/Button.test.tsx +105 -11
  363. package/src/Button/Button.tsx +76 -21
  364. package/src/Calendar/Calendar.doc.mjs +4 -4
  365. package/src/Calendar/Calendar.test.tsx +168 -30
  366. package/src/Calendar/Calendar.tsx +121 -66
  367. package/src/Calendar/hooks/index.ts +0 -6
  368. package/src/Calendar/index.ts +1 -3
  369. package/src/Calendar/styles.ts +4 -9
  370. package/src/Carousel/Carousel.doc.mjs +7 -1
  371. package/src/Carousel/Carousel.test.tsx +20 -0
  372. package/src/Carousel/Carousel.tsx +16 -1
  373. package/src/Center/Center.doc.mjs +12 -2
  374. package/src/Center/Center.tsx +28 -3
  375. package/src/Chat/ChatComposer.doc.mjs +3 -0
  376. package/src/Chat/ChatComposerDrawer.doc.mjs +12 -0
  377. package/src/Chat/ChatMessageList.doc.mjs +8 -0
  378. package/src/Chat/ChatMessageList.test.tsx +18 -0
  379. package/src/Chat/ChatMessageList.tsx +16 -0
  380. package/src/Chat/useTriggerMenu.tsx +3 -0
  381. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  382. package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
  383. package/src/CheckboxInput/CheckboxInput.tsx +78 -6
  384. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  385. package/src/CheckboxList/CheckboxList.test.tsx +169 -16
  386. package/src/CheckboxList/CheckboxList.tsx +56 -3
  387. package/src/CheckboxList/CheckboxListContext.tsx +7 -0
  388. package/src/Citation/Citation.doc.mjs +10 -0
  389. package/src/Citation/Citation.test.tsx +117 -0
  390. package/src/Citation/Citation.tsx +9 -1
  391. package/src/ClickableCard/ClickableCard.doc.mjs +15 -0
  392. package/src/CodeBlock/CodeBlock.test.tsx +115 -0
  393. package/src/CodeBlock/CodeBlock.tsx +61 -33
  394. package/src/CommandPalette/CommandPalette.test.tsx +47 -1
  395. package/src/CommandPalette/CommandPalette.tsx +9 -21
  396. package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
  397. package/src/ContextMenu/ContextMenu.test.tsx +155 -1
  398. package/src/ContextMenu/ContextMenu.tsx +113 -16
  399. package/src/DateInput/DateInput.doc.mjs +281 -56
  400. package/src/DateInput/DateInput.test.tsx +188 -2
  401. package/src/DateInput/DateInput.tsx +89 -10
  402. package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
  403. package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
  404. package/src/DateRangeInput/DateRangeInput.tsx +63 -5
  405. package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
  406. package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
  407. package/src/DateTimeInput/DateTimeInput.tsx +125 -17
  408. package/src/Dialog/Dialog.doc.mjs +2 -2
  409. package/src/Dialog/Dialog.tsx +12 -0
  410. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
  411. package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
  412. package/src/DropdownMenu/DropdownMenu.tsx +52 -18
  413. package/src/EmptyState/EmptyState.test.tsx +4 -2
  414. package/src/EmptyState/EmptyState.tsx +6 -2
  415. package/src/Field/Field.test.tsx +32 -0
  416. package/src/Field/Field.tsx +23 -5
  417. package/src/Field/FieldLabel.tsx +55 -17
  418. package/src/FileInput/FileInput.doc.mjs +17 -0
  419. package/src/FileInput/FileInput.test.tsx +283 -49
  420. package/src/FileInput/FileInput.tsx +76 -4
  421. package/src/Grid/Grid.doc.mjs +14 -4
  422. package/src/Grid/Grid.tsx +20 -0
  423. package/src/HoverCard/HoverCard.doc.mjs +3 -0
  424. package/src/HoverCard/HoverCard.test.tsx +189 -2
  425. package/src/HoverCard/HoverCard.tsx +20 -16
  426. package/src/HoverCard/useHoverCard.tsx +13 -10
  427. package/src/Icon/Icon.doc.mjs +8 -0
  428. package/src/InputGroup/InputGroup.doc.mjs +2 -2
  429. package/src/InputGroup/InputGroup.test.tsx +98 -60
  430. package/src/InputGroup/InputGroup.tsx +21 -4
  431. package/src/InputGroup/InputGroupContext.ts +9 -4
  432. package/src/InputGroup/index.ts +1 -0
  433. package/src/Kbd/Kbd.test.tsx +22 -4
  434. package/src/Kbd/Kbd.tsx +37 -12
  435. package/src/Layer/anchorName.test.ts +146 -0
  436. package/src/Layer/anchorName.ts +46 -0
  437. package/src/Layer/layerAnimations.stylex.ts +20 -4
  438. package/src/Layer/useLayer.doc.mjs +12 -2
  439. package/src/Layer/useLayer.tsx +100 -15
  440. package/src/Layout/Layout.doc.mjs +1 -1
  441. package/src/Layout/Layout.tsx +8 -16
  442. package/src/Layout/LayoutFooter.doc.mjs +4 -4
  443. package/src/Layout/LayoutFooter.tsx +3 -3
  444. package/src/Layout/LayoutHeader.doc.mjs +4 -4
  445. package/src/Layout/LayoutHeader.tsx +3 -3
  446. package/src/Layout/LayoutPanel.tsx +3 -3
  447. package/src/Layout/padding.stylex.ts +52 -0
  448. package/src/Lightbox/Lightbox.doc.mjs +9 -2
  449. package/src/Lightbox/Lightbox.test.tsx +53 -5
  450. package/src/Lightbox/Lightbox.tsx +9 -4
  451. package/src/Link/Link.doc.mjs +14 -0
  452. package/src/Link/Link.test.tsx +52 -2
  453. package/src/Link/Link.tsx +42 -7
  454. package/src/Link/LinkProvider.tsx +1 -0
  455. package/src/List/List.doc.mjs +7 -0
  456. package/src/Markdown/Markdown.doc.mjs +2 -0
  457. package/src/Markdown/Markdown.test.tsx +28 -26
  458. package/src/Markdown/Markdown.tsx +21 -6
  459. package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
  460. package/src/MobileNav/MobileNav.doc.mjs +8 -8
  461. package/src/MobileNav/MobileNav.tsx +13 -0
  462. package/src/MobileNav/MobileNavReopen.test.tsx +118 -0
  463. package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
  464. package/src/MoreMenu/MoreMenu.tsx +0 -9
  465. package/src/MultiSelector/MultiSelector.doc.mjs +25 -0
  466. package/src/MultiSelector/MultiSelector.test.tsx +375 -8
  467. package/src/MultiSelector/MultiSelector.tsx +145 -21
  468. package/src/MultiSelector/hooks.ts +27 -0
  469. package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
  470. package/src/NavMenu/NavHeadingMenu.tsx +50 -3
  471. package/src/NumberInput/NumberInput.doc.mjs +17 -0
  472. package/src/NumberInput/NumberInput.test.tsx +242 -40
  473. package/src/NumberInput/NumberInput.tsx +89 -11
  474. package/src/OverflowList/OverflowList.doc.mjs +17 -0
  475. package/src/Pagination/Pagination.doc.mjs +3 -3
  476. package/src/Pagination/Pagination.test.tsx +250 -14
  477. package/src/Pagination/Pagination.tsx +54 -29
  478. package/src/Popover/usePopover.doc.mjs +7 -3
  479. package/src/Popover/usePopover.tsx +49 -6
  480. package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
  481. package/src/PowerSearch/PowerSearch.test.tsx +97 -1
  482. package/src/PowerSearch/PowerSearch.tsx +16 -3
  483. package/src/ProgressBar/ProgressBar.test.tsx +45 -27
  484. package/src/ProgressBar/ProgressBar.tsx +3 -4
  485. package/src/RadioList/RadioList.doc.mjs +9 -0
  486. package/src/RadioList/RadioList.test.tsx +252 -16
  487. package/src/RadioList/RadioList.tsx +166 -10
  488. package/src/RadioList/RadioListItem.tsx +14 -2
  489. package/src/Resizable/Resizable.doc.mjs +1 -1
  490. package/src/Section/Section.doc.mjs +11 -0
  491. package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
  492. package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
  493. package/src/SegmentedControl/SegmentedControl.tsx +102 -54
  494. package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
  495. package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
  496. package/src/SelectableCard/SelectableCard.doc.mjs +15 -0
  497. package/src/Selector/Selector.doc.mjs +25 -0
  498. package/src/Selector/Selector.test.tsx +322 -15
  499. package/src/Selector/Selector.tsx +126 -40
  500. package/src/Selector/hooks.ts +23 -0
  501. package/src/SideNav/SideNav.test.tsx +16 -0
  502. package/src/SideNav/SideNavItem.tsx +2 -4
  503. package/src/Skeleton/Skeleton.doc.mjs +11 -1
  504. package/src/Skeleton/Skeleton.test.tsx +25 -0
  505. package/src/Skeleton/Skeleton.tsx +11 -1
  506. package/src/Slider/Slider.doc.mjs +19 -0
  507. package/src/Slider/Slider.test.tsx +158 -18
  508. package/src/Slider/Slider.tsx +54 -6
  509. package/src/Spinner/Spinner.tsx +7 -1
  510. package/src/Stack/Stack.doc.mjs +77 -0
  511. package/src/Stack/Stack.test.tsx +55 -5
  512. package/src/Stack/Stack.tsx +73 -24
  513. package/src/Stack/StackItem.test.tsx +23 -0
  514. package/src/Stack/StackItem.tsx +20 -23
  515. package/src/Switch/Switch.doc.mjs +15 -0
  516. package/src/Switch/Switch.test.tsx +162 -27
  517. package/src/Switch/Switch.tsx +61 -21
  518. package/src/TabList/Tab.tsx +6 -0
  519. package/src/TabList/TabList.doc.mjs +12 -0
  520. package/src/TabList/TabList.test.tsx +208 -0
  521. package/src/TabList/TabList.tsx +102 -12
  522. package/src/TabList/TabListContext.ts +7 -3
  523. package/src/TabList/TabMenu.tsx +6 -3
  524. package/src/Table/BaseTable.tsx +72 -41
  525. package/src/Table/Table.doc.mjs +14 -0
  526. package/src/Table/Table.test.tsx +39 -30
  527. package/src/Table/Table.tsx +27 -1
  528. package/src/Table/TableCell.tsx +25 -23
  529. package/src/Table/TableHeaderCell.tsx +28 -29
  530. package/src/Table/TableRow.tsx +37 -7
  531. package/src/Table/index.ts +6 -2
  532. package/src/Table/plugins/pagination/paginateData.ts +10 -3
  533. package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
  534. package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
  535. package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
  536. package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
  537. package/src/Table/plugins/stickyColumns/index.ts +4 -0
  538. package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +163 -0
  539. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +407 -0
  540. package/src/Table/tableContextMenu.test.tsx +157 -0
  541. package/src/Table/tableContextMenu.tsx +142 -0
  542. package/src/Table/types.ts +175 -4
  543. package/src/Table/useBaseTablePlugins.ts +1 -0
  544. package/src/Table/useTableColumnResize.doc.mjs +96 -0
  545. package/src/Table/useTableStickyColumns.doc.mjs +59 -0
  546. package/src/Text/Heading.doc.mjs +15 -2
  547. package/src/Text/Text.doc.mjs +7 -1
  548. package/src/Text/text.stylex.ts +2 -2
  549. package/src/TextArea/TextArea.doc.mjs +17 -0
  550. package/src/TextArea/TextArea.test.tsx +167 -35
  551. package/src/TextArea/TextArea.tsx +62 -15
  552. package/src/TextInput/TextInput.doc.mjs +17 -0
  553. package/src/TextInput/TextInput.test.tsx +168 -34
  554. package/src/TextInput/TextInput.tsx +77 -9
  555. package/src/TimeInput/TimeInput.doc.mjs +335 -60
  556. package/src/TimeInput/TimeInput.test.tsx +144 -7
  557. package/src/TimeInput/TimeInput.tsx +74 -5
  558. package/src/Timestamp/Timestamp.doc.mjs +9 -0
  559. package/src/Timestamp/Timestamp.test.tsx +44 -18
  560. package/src/Timestamp/Timestamp.tsx +30 -10
  561. package/src/Toast/Toast.tsx +14 -0
  562. package/src/Toast/ToastViewport.test.tsx +204 -0
  563. package/src/Toast/ToastViewport.tsx +167 -21
  564. package/src/ToggleButton/ToggleButton.doc.mjs +9 -3
  565. package/src/ToggleButton/ToggleButton.test.tsx +39 -18
  566. package/src/ToggleButton/ToggleButton.tsx +46 -83
  567. package/src/Tokenizer/Tokenizer.doc.mjs +15 -0
  568. package/src/Tokenizer/Tokenizer.test.tsx +105 -1
  569. package/src/Tokenizer/Tokenizer.tsx +41 -2
  570. package/src/Toolbar/Toolbar.doc.mjs +65 -5
  571. package/src/Toolbar/Toolbar.test.tsx +109 -6
  572. package/src/Toolbar/Toolbar.tsx +59 -5
  573. package/src/Tooltip/Tooltip.test.tsx +81 -0
  574. package/src/Tooltip/useTooltip.tsx +57 -11
  575. package/src/TreeList/TreeList.test.tsx +295 -6
  576. package/src/TreeList/TreeList.tsx +73 -1
  577. package/src/TreeList/TreeListItem.tsx +51 -5
  578. package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
  579. package/src/Typeahead/BaseTypeahead.tsx +86 -9
  580. package/src/Typeahead/Typeahead.doc.mjs +136 -30
  581. package/src/Typeahead/Typeahead.test.tsx +331 -1
  582. package/src/Typeahead/Typeahead.tsx +52 -1
  583. package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
  584. package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
  585. package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
  586. package/src/VisuallyHidden/index.ts +15 -0
  587. package/src/hooks/focusableSelector.ts +25 -0
  588. package/src/hooks/index.ts +28 -2
  589. package/src/hooks/useAnnounce.test.tsx +101 -0
  590. package/src/hooks/useAnnounce.ts +168 -0
  591. package/src/hooks/useClickableContainer.ts +16 -4
  592. package/src/hooks/useEntryAnimation.ts +16 -4
  593. package/src/hooks/useFocusTrap.test.tsx +132 -0
  594. package/src/hooks/useFocusTrap.ts +98 -4
  595. package/src/hooks/useGridFocus.doc.mjs +40 -2
  596. package/src/hooks/useGridFocus.test.tsx +132 -0
  597. package/src/hooks/useGridFocus.ts +343 -67
  598. package/src/hooks/useImageMode.test.ts +133 -0
  599. package/src/hooks/useKeyboardHint.doc.mjs +101 -0
  600. package/src/hooks/useKeyboardHint.test.tsx +70 -0
  601. package/src/hooks/useKeyboardHint.tsx +332 -0
  602. package/src/hooks/useListFocus.doc.mjs +50 -10
  603. package/src/hooks/useListFocus.test.tsx +375 -0
  604. package/src/hooks/useListFocus.ts +395 -57
  605. package/src/hooks/useLongPress.test.tsx +134 -0
  606. package/src/hooks/useLongPress.ts +119 -0
  607. package/src/hooks/useTreeFocus.doc.mjs +140 -0
  608. package/src/hooks/useTreeFocus.test.tsx +214 -0
  609. package/src/hooks/useTreeFocus.ts +559 -0
  610. package/src/hooks/useTypeahead.test.tsx +109 -0
  611. package/src/hooks/useTypeahead.ts +183 -0
  612. package/src/index.ts +1 -0
  613. package/src/theme/derivedVarRegistry.test.ts +4 -0
  614. package/src/theme/generateThemeRules.test.ts +7 -8
  615. package/src/theme/generateThemeRules.ts +1 -1
  616. package/src/theme/syntax/SyntaxTheme.tsx +1 -1
  617. package/src/theme/syntax/defineSyntaxTheme.ts +20 -11
  618. package/src/theme/syntax/presets.ts +5 -2
  619. package/src/theme/syntax/tokens.ts +1 -1
  620. package/src/theme/types.ts +1 -1
  621. package/src/utils/dateTypes.test.ts +40 -0
  622. package/src/utils/dateTypes.ts +40 -0
  623. package/src/utils/index.ts +9 -0
  624. package/src/utils/inputAria.test.ts +39 -0
  625. package/src/utils/inputAria.ts +58 -0
  626. package/src/utils/timeParser.test.ts +10 -0
  627. package/src/utils/timeParser.ts +5 -2
  628. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
  629. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
  630. package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
  631. package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
@@ -26,7 +26,7 @@ import {stack} from '../Stack/stack.stylex';
26
26
  import {stackItem} from '../Stack/stackItem.stylex';
27
27
  import {mergeProps} from '../utils';
28
28
  import type {BaseProps} from '../BaseProps';
29
- import type {SpacingStep} from '../utils/types';
29
+ import type {SizeValue, SpacingStep} from '../utils/types';
30
30
  import {themeProps} from '../utils/themeProps';
31
31
  import {
32
32
  layoutPaddingOuterXVarStyles,
@@ -76,12 +76,12 @@ const styles = stylex.create({
76
76
  });
77
77
 
78
78
  const dynamicStyles = stylex.create({
79
- contentWidthVar: (width: number) => ({
80
- '--layout-content-width': `${width}px`,
79
+ contentWidthVar: (width: SizeValue) => ({
80
+ '--layout-content-width': typeof width === 'number' ? `${width}px` : width,
81
81
  }),
82
- contentWidth: (width: number) => ({
82
+ contentWidth: (width: SizeValue) => ({
83
83
  width: '100%',
84
- maxWidth: width,
84
+ maxWidth: typeof width === 'number' ? `${width}px` : width,
85
85
  marginInline: 'auto',
86
86
  }),
87
87
  });
@@ -102,11 +102,12 @@ export interface LayoutProps extends Omit<BaseProps, 'content'> {
102
102
  * panels). Dividers remain full-bleed. Content is centered with
103
103
  * `margin-inline: auto` when narrower than the available space.
104
104
  *
105
- * Accepts any pixel value. Common page widths from internal patterns:
105
+ * Numbers are treated as pixels, strings are used as-is (e.g., '60ch').
106
+ * Common page widths:
106
107
  * - `640` — forms, settings, text-focused pages
107
108
  * - `960` — content pages, component demos, wider layouts
108
109
  */
109
- contentWidth?: number;
110
+ contentWidth?: SizeValue;
110
111
 
111
112
  /**
112
113
  * End panel slot (right in LTR, left in RTL).
@@ -149,15 +150,6 @@ export interface LayoutProps extends Omit<BaseProps, 'content'> {
149
150
  */
150
151
  defaultHasDividers?: boolean;
151
152
 
152
- /**
153
- * CSS class name(s) appended to the root element.
154
- */
155
- className?: string;
156
- /**
157
- * Inline styles to apply to the root element.
158
- */
159
- style?: React.CSSProperties;
160
-
161
153
  /**
162
154
  * Children are a shorthand for the `content` slot:
163
155
  * `<Layout>{main}</Layout>` is equivalent to `<Layout content={main} />`.
@@ -22,8 +22,8 @@ export const docs = {
22
22
  },
23
23
  {
24
24
  name: 'height',
25
- type: 'number | string',
26
- description: 'Footer height.',
25
+ type: 'SizeValue',
26
+ description: 'Footer height. Numbers are treated as pixels, strings are used as-is.',
27
27
  },
28
28
  {
29
29
  name: 'label',
@@ -57,8 +57,8 @@ export const docsZh = {
57
57
  },
58
58
  {
59
59
  name: 'height',
60
- type: 'number | string',
61
- description: '页脚高度。',
60
+ type: 'SizeValue',
61
+ description: '页脚高度。数字类型会被解释为像素值,字符串类型按原样使用。',
62
62
  },
63
63
  {
64
64
  name: 'label',
@@ -22,7 +22,7 @@ import * as stylex from '@stylexjs/stylex';
22
22
  import {LayoutDividerContext} from './LayoutDividerContext';
23
23
  import {colorVars, spacingVars} from '../theme/tokens.stylex';
24
24
  import {mergeProps} from '../utils';
25
- import type {SpacingStep} from '../utils/types';
25
+ import type {SizeValue, SpacingStep} from '../utils/types';
26
26
  import {themeProps} from '../utils/themeProps';
27
27
  import {
28
28
  paddingStyles,
@@ -71,7 +71,7 @@ const styles = stylex.create({
71
71
 
72
72
  // Dynamic styles for sizing props
73
73
  const dynamicStyles = stylex.create({
74
- sizing: (height: number | string | null) => ({
74
+ sizing: (height: SizeValue | null) => ({
75
75
  height,
76
76
  }),
77
77
  });
@@ -95,7 +95,7 @@ export interface LayoutFooterProps extends BaseProps<HTMLDivElement> {
95
95
  * Height of the footer.
96
96
  * Numbers are treated as pixels, strings are used as-is.
97
97
  */
98
- height?: number | string;
98
+ height?: SizeValue;
99
99
 
100
100
  /**
101
101
  * Internal padding of the footer using the spacing scale.
@@ -22,8 +22,8 @@ export const docs = {
22
22
  },
23
23
  {
24
24
  name: 'height',
25
- type: 'number | string',
26
- description: 'Header height.',
25
+ type: 'SizeValue',
26
+ description: 'Header height. Numbers are treated as pixels, strings are used as-is.',
27
27
  },
28
28
  {
29
29
  name: 'label',
@@ -57,8 +57,8 @@ export const docsZh = {
57
57
  },
58
58
  {
59
59
  name: 'height',
60
- type: 'number | string',
61
- description: '页眉高度。',
60
+ type: 'SizeValue',
61
+ description: '页眉高度。数字类型会被解释为像素值,字符串类型按原样使用。',
62
62
  },
63
63
  {
64
64
  name: 'label',
@@ -22,7 +22,7 @@ import * as stylex from '@stylexjs/stylex';
22
22
  import {LayoutDividerContext} from './LayoutDividerContext';
23
23
  import {colorVars, spacingVars} from '../theme/tokens.stylex';
24
24
  import {mergeProps} from '../utils';
25
- import type {SpacingStep} from '../utils/types';
25
+ import type {SizeValue, SpacingStep} from '../utils/types';
26
26
  import {themeProps} from '../utils/themeProps';
27
27
  import {
28
28
  paddingStyles,
@@ -71,7 +71,7 @@ const styles = stylex.create({
71
71
 
72
72
  // Dynamic styles for sizing props
73
73
  const dynamicStyles = stylex.create({
74
- sizing: (height: number | string | null) => ({
74
+ sizing: (height: SizeValue | null) => ({
75
75
  height,
76
76
  }),
77
77
  });
@@ -95,7 +95,7 @@ export interface LayoutHeaderProps extends BaseProps<HTMLDivElement> {
95
95
  * Height of the header.
96
96
  * Numbers are treated as pixels, strings are used as-is.
97
97
  */
98
- height?: number | string;
98
+ height?: SizeValue;
99
99
 
100
100
  /**
101
101
  * Internal padding of the header using the spacing scale.
@@ -23,7 +23,7 @@ import {colorVars, spacingVars} from '../theme/tokens.stylex';
23
23
  import {LayoutAreaContext} from './LayoutAreaContext';
24
24
  import {LayoutSlotsContext} from './LayoutSlotsContext';
25
25
  import {mergeProps} from '../utils';
26
- import type {SpacingStep} from '../utils/types';
26
+ import type {SizeValue, SpacingStep} from '../utils/types';
27
27
  import type {ResizableProps} from '../Resizable/useResizable';
28
28
  import {themeProps} from '../utils/themeProps';
29
29
  import {
@@ -102,7 +102,7 @@ const styles = stylex.create({
102
102
 
103
103
  // Dynamic styles for sizing props
104
104
  const dynamicStyles = stylex.create({
105
- sizing: (width: number | string | null) => ({
105
+ sizing: (width: SizeValue | null) => ({
106
106
  width,
107
107
  }),
108
108
  });
@@ -158,7 +158,7 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
158
158
  * Numbers are treated as pixels, strings are used as-is.
159
159
  * When `resizable` is provided, this is ignored — the hook controls width.
160
160
  */
161
- width?: number | string;
161
+ width?: SizeValue;
162
162
 
163
163
  /**
164
164
  * Resize props from `useResizable()`. When provided, the panel width
@@ -220,6 +220,58 @@ export const layoutPaddingOuterYVarStyles = stylex.create({
220
220
  10: {'--layout-padding-outer-y': spacingVars['--spacing-10']},
221
221
  });
222
222
 
223
+ /**
224
+ * Inline-only padding styles.
225
+ * Use when a component needs to set inline (horizontal) padding independently
226
+ * of block padding — e.g. the `paddingX` prop on Stack.
227
+ */
228
+ export const paddingInlineStyles = stylex.create({
229
+ 0: {
230
+ paddingInlineStart: spacingVars['--spacing-0'],
231
+ paddingInlineEnd: spacingVars['--spacing-0'],
232
+ },
233
+ 0.5: {
234
+ paddingInlineStart: spacingVars['--spacing-0-5'],
235
+ paddingInlineEnd: spacingVars['--spacing-0-5'],
236
+ },
237
+ 1: {
238
+ paddingInlineStart: spacingVars['--spacing-1'],
239
+ paddingInlineEnd: spacingVars['--spacing-1'],
240
+ },
241
+ 1.5: {
242
+ paddingInlineStart: spacingVars['--spacing-1-5'],
243
+ paddingInlineEnd: spacingVars['--spacing-1-5'],
244
+ },
245
+ 2: {
246
+ paddingInlineStart: spacingVars['--spacing-2'],
247
+ paddingInlineEnd: spacingVars['--spacing-2'],
248
+ },
249
+ 3: {
250
+ paddingInlineStart: spacingVars['--spacing-3'],
251
+ paddingInlineEnd: spacingVars['--spacing-3'],
252
+ },
253
+ 4: {
254
+ paddingInlineStart: spacingVars['--spacing-4'],
255
+ paddingInlineEnd: spacingVars['--spacing-4'],
256
+ },
257
+ 5: {
258
+ paddingInlineStart: spacingVars['--spacing-5'],
259
+ paddingInlineEnd: spacingVars['--spacing-5'],
260
+ },
261
+ 6: {
262
+ paddingInlineStart: spacingVars['--spacing-6'],
263
+ paddingInlineEnd: spacingVars['--spacing-6'],
264
+ },
265
+ 8: {
266
+ paddingInlineStart: spacingVars['--spacing-8'],
267
+ paddingInlineEnd: spacingVars['--spacing-8'],
268
+ },
269
+ 10: {
270
+ paddingInlineStart: spacingVars['--spacing-10'],
271
+ paddingInlineEnd: spacingVars['--spacing-10'],
272
+ },
273
+ });
274
+
223
275
  /**
224
276
  * Block-only padding override styles.
225
277
  * Use when a component needs to override block padding independently
@@ -30,7 +30,6 @@ export const docs = {
30
30
  name: 'index',
31
31
  type: 'number',
32
32
  description: 'Current index in gallery mode (when media is an array).',
33
- default: '0',
34
33
  },
35
34
  {
36
35
  name: 'onIndexChange',
@@ -65,6 +64,15 @@ export const docs = {
65
64
  { guidance: false, description: 'Nest interactive content inside captions; keep them plain text.' },
66
65
  ],
67
66
  },
67
+ playground: {
68
+ defaults: {
69
+ media: {
70
+ src: 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png',
71
+ alt: 'Coastal shoreline with ocean waves',
72
+ caption: 'A scenic coastline with waves rolling onto a sandy beach beneath a clear sky.',
73
+ },
74
+ },
75
+ },
68
76
  };
69
77
 
70
78
  /** @type {import('../docs-types').ComponentDoc} */
@@ -94,7 +102,6 @@ export const docsZh = {
94
102
  name: 'index',
95
103
  type: 'number',
96
104
  description: '画廊模式中当前索引。',
97
- default: '0',
98
105
  },
99
106
  {
100
107
  name: 'onIndexChange',
@@ -177,7 +177,7 @@ describe('Lightbox', () => {
177
177
  expect(screen.getByLabelText('Next')).toBeInTheDocument();
178
178
  });
179
179
 
180
- it('hides prev button on first item', () => {
180
+ it('keeps prev mounted and disabled on first item', () => {
181
181
  render(
182
182
  <Lightbox
183
183
  isOpen={true}
@@ -186,11 +186,16 @@ describe('Lightbox', () => {
186
186
  index={0}
187
187
  />,
188
188
  );
189
- expect(screen.queryByLabelText('Previous')).not.toBeInTheDocument();
190
- expect(screen.getByLabelText('Next')).toBeInTheDocument();
189
+ // The Prev button stays mounted at the range boundary (disabled) rather
190
+ // than unmounting, so navigating to the first item never removes the
191
+ // focused control and drops focus to <body>.
192
+ const prev = screen.getByLabelText('Previous');
193
+ expect(prev).toBeInTheDocument();
194
+ expect(prev).toBeDisabled();
195
+ expect(screen.getByLabelText('Next')).not.toBeDisabled();
191
196
  });
192
197
 
193
- it('hides next button on last item', () => {
198
+ it('keeps next mounted and disabled on last item', () => {
194
199
  render(
195
200
  <Lightbox
196
201
  isOpen={true}
@@ -199,8 +204,51 @@ describe('Lightbox', () => {
199
204
  index={2}
200
205
  />,
201
206
  );
207
+ const next = screen.getByLabelText('Next');
208
+ expect(next).toBeInTheDocument();
209
+ expect(next).toBeDisabled();
210
+ expect(screen.getByLabelText('Previous')).not.toBeDisabled();
211
+ });
212
+
213
+ it('does not drop focus to <body> when navigating to the last item', () => {
214
+ const {rerender} = render(
215
+ <Lightbox
216
+ isOpen={true}
217
+ onOpenChange={() => {}}
218
+ media={media}
219
+ index={1}
220
+ />,
221
+ );
222
+ // Simulate arriving at the final item (Next becomes disabled).
223
+ rerender(
224
+ <Lightbox
225
+ isOpen={true}
226
+ onOpenChange={() => {}}
227
+ media={media}
228
+ index={2}
229
+ />,
230
+ );
231
+ // Both nav buttons remain in the DOM; the dialog stays available so
232
+ // keyboard gallery navigation isn't dead-ended.
202
233
  expect(screen.getByLabelText('Previous')).toBeInTheDocument();
203
- expect(screen.queryByLabelText('Next')).not.toBeInTheDocument();
234
+ expect(screen.getByLabelText('Next')).toBeInTheDocument();
235
+ const dialog = document.querySelector('dialog');
236
+ expect(dialog).toBeInTheDocument();
237
+ // Arrow handling is on the dialog, so navigation still works at the edge.
238
+ const onIndexChange = vi.fn();
239
+ rerender(
240
+ <Lightbox
241
+ isOpen={true}
242
+ onOpenChange={() => {}}
243
+ media={media}
244
+ index={2}
245
+ onIndexChange={onIndexChange}
246
+ />,
247
+ );
248
+ if (dialog instanceof HTMLElement) {
249
+ fireEvent.keyDown(dialog, {key: 'ArrowLeft'});
250
+ }
251
+ expect(onIndexChange).toHaveBeenCalledWith(1);
204
252
  });
205
253
 
206
254
  it('calls onIndexChange when next is clicked', () => {
@@ -496,13 +496,16 @@ export function Lightbox({
496
496
  />
497
497
  </div>
498
498
 
499
- {/* Gallery nav: prev */}
500
- {isGallery && canPrev && (
499
+ {/* Gallery nav: prev — stays mounted and is disabled at the start of
500
+ the range so pressing/arrowing to the boundary doesn't unmount the
501
+ focused control and drop focus to <body>. */}
502
+ {isGallery && (
501
503
  <div {...stylex.props(styles.navButton, styles.navPrev)}>
502
504
  <IconButton
503
505
  icon={<Icon icon="chevronLeft" size="sm" color="inherit" />}
504
506
  label="Previous"
505
507
  variant="ghost"
508
+ isDisabled={!canPrev}
506
509
  onClick={goToPrev}
507
510
  xstyle={styles.controlButton}
508
511
  />
@@ -549,13 +552,15 @@ export function Lightbox({
549
552
  )}
550
553
  </div>
551
554
 
552
- {/* Gallery nav: next */}
553
- {isGallery && canNext && (
555
+ {/* Gallery nav: next — see "prev" above; stays mounted and disabled at
556
+ the end of the range instead of unmounting. */}
557
+ {isGallery && (
554
558
  <div {...stylex.props(styles.navButton, styles.navNext)}>
555
559
  <IconButton
556
560
  icon={<Icon icon="chevronRight" size="sm" color="inherit" />}
557
561
  label="Next"
558
562
  variant="ghost"
563
+ isDisabled={!canNext}
559
564
  onClick={goToNext}
560
565
  xstyle={styles.controlButton}
561
566
  />
@@ -59,6 +59,13 @@ export const docs = {
59
59
  'Opens in new tab with external icon and safe rel tokens',
60
60
  default: 'false',
61
61
  },
62
+ {
63
+ name: 'newTabLabel',
64
+ type: 'string',
65
+ description:
66
+ 'Screen-reader text announcing that an external link opens in a new tab. Override for localization.',
67
+ default: "'(opens in new tab)'",
68
+ },
62
69
  {
63
70
  name: 'target',
64
71
  type: 'string',
@@ -185,6 +192,12 @@ export const docsZh = {
185
192
  description: '在新标签页中打开,带外部图标和安全 rel 标记',
186
193
  default: 'false',
187
194
  },
195
+ {
196
+ name: 'newTabLabel',
197
+ type: 'string',
198
+ description: '向屏幕阅读器announce外部链接将在新标签页打开的文本。可覆盖以本地化。',
199
+ default: "'(opens in new tab)'",
200
+ },
188
201
  {
189
202
  name: 'target',
190
203
  type: 'string',
@@ -296,6 +309,7 @@ export const docsDense = {
296
309
  hasUnderline: 'Always show underline',
297
310
  isDisabled: 'Disables link',
298
311
  isExternalLink: 'Opens new tab w/ external icon and safe rel tokens',
312
+ newTabLabel: 'SR text announcing an external link opens in a new tab',
299
313
  target:
300
314
  'Where to open linked document. target="_blank" auto-adds noopener noreferrer.',
301
315
  rel: 'Link relationship tokens. noopener noreferrer are merged for target="_blank".',
@@ -99,8 +99,8 @@ describe('Link', () => {
99
99
 
100
100
  it('renders with different color values', () => {
101
101
  const {rerender} = render(
102
- <Link href="/test" color="active">
103
- Active
102
+ <Link href="/test" color="accent">
103
+ Accent
104
104
  </Link>,
105
105
  );
106
106
  expect(screen.getByRole('link')).toBeInTheDocument();
@@ -120,6 +120,24 @@ describe('Link', () => {
120
120
  expect(screen.getByRole('link')).toBeInTheDocument();
121
121
  });
122
122
 
123
+ it('defaults the inner text type to body', () => {
124
+ render(<Link href="/test">Body link</Link>);
125
+ expect(screen.getByText('Body link')).toHaveClass('astryx-text', 'body');
126
+ });
127
+
128
+ it('forwards type="inherit" so the link adopts the surrounding text type', () => {
129
+ render(
130
+ <Link href="/test" type="inherit">
131
+ Inline link
132
+ </Link>,
133
+ );
134
+ // The inner Text renders with the `inherit` type, so font-size/line-height
135
+ // inherit from the surrounding text rather than imposing the body type.
136
+ const text = screen.getByText('Inline link');
137
+ expect(text).toHaveClass('astryx-text', 'inherit');
138
+ expect(text).not.toHaveClass('body');
139
+ });
140
+
123
141
  it('applies hasUnderline style when true', () => {
124
142
  render(
125
143
  <Link href="/test" hasUnderline>
@@ -152,6 +170,38 @@ describe('Link', () => {
152
170
  expect(link.querySelector('svg')).toBeInTheDocument();
153
171
  });
154
172
 
173
+ it('announces the new-tab context via screen-reader text (obs-4)', () => {
174
+ render(
175
+ <Link href="https://example.com" isExternalLink>
176
+ Docs
177
+ </Link>,
178
+ );
179
+ // The link's accessible name includes the new-tab hint (the icon is
180
+ // decorative).
181
+ expect(
182
+ screen.getByRole('link', {name: 'Docs (opens in new tab)'}),
183
+ ).toBeInTheDocument();
184
+ });
185
+
186
+ it('supports a custom newTabLabel for localization', () => {
187
+ render(
188
+ <Link
189
+ href="https://example.com"
190
+ isExternalLink
191
+ newTabLabel="(new window)">
192
+ Docs
193
+ </Link>,
194
+ );
195
+ expect(
196
+ screen.getByRole('link', {name: 'Docs (new window)'}),
197
+ ).toBeInTheDocument();
198
+ });
199
+
200
+ it('does not add new-tab text to non-external links', () => {
201
+ render(<Link href="/internal">Internal</Link>);
202
+ expect(screen.getByRole('link', {name: 'Internal'})).toBeInTheDocument();
203
+ });
204
+
155
205
  it('renders external link with existing rel merged', () => {
156
206
  render(
157
207
  <Link href="https://example.com" isExternalLink rel="sponsored">
package/src/Link/Link.tsx CHANGED
@@ -30,6 +30,7 @@ import {
30
30
  import {Icon} from '../Icon';
31
31
  import {Tooltip} from '../Tooltip';
32
32
  import {Text} from '../Text';
33
+ import {VisuallyHidden} from '../VisuallyHidden';
33
34
  import type {
34
35
  TextType,
35
36
  TextSize,
@@ -106,10 +107,20 @@ const styles = stylex.create({
106
107
  */
107
108
  const linkColorStyles = stylex.create({
108
109
  primary: {
109
- color: colorVars['--color-text-primary'],
110
+ color: {
111
+ default: colorVars['--color-text-primary'],
112
+ ':hover': {
113
+ '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-text-primary']}, ${colorVars['--color-tint-hover']} 15%)`,
114
+ },
115
+ },
110
116
  },
111
117
  secondary: {
112
- color: colorVars['--color-text-secondary'],
118
+ color: {
119
+ default: colorVars['--color-text-secondary'],
120
+ ':hover': {
121
+ '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-text-secondary']}, ${colorVars['--color-tint-hover']} 15%)`,
122
+ },
123
+ },
113
124
  },
114
125
  disabled: {
115
126
  color: colorVars['--color-text-disabled'],
@@ -117,8 +128,13 @@ const linkColorStyles = stylex.create({
117
128
  placeholder: {
118
129
  color: colorVars['--color-text-secondary'],
119
130
  },
120
- active: {
121
- color: colorVars['--color-text-accent'],
131
+ accent: {
132
+ color: {
133
+ default: colorVars['--color-text-accent'],
134
+ ':hover': {
135
+ '@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-text-accent']}, ${colorVars['--color-tint-hover']} 15%)`,
136
+ },
137
+ },
122
138
  },
123
139
  inherit: {
124
140
  color: 'inherit',
@@ -167,6 +183,12 @@ export interface LinkProps extends BaseProps<
167
183
  * @default false
168
184
  */
169
185
  isExternalLink?: boolean;
186
+ /**
187
+ * Screen-reader text appended to an external link to announce that it opens
188
+ * in a new tab (the visual icon is decorative). Override for localization.
189
+ * @default '(opens in new tab)'
190
+ */
191
+ newTabLabel?: string;
170
192
  /**
171
193
  * Where to open the linked document.
172
194
  * Overridden to "_blank" when isExternalLink is true.
@@ -203,6 +225,10 @@ export interface LinkProps extends BaseProps<
203
225
  isStandalone?: boolean;
204
226
  /**
205
227
  * Semantic text type for Text. Determines base typography.
228
+ *
229
+ * Use `type="inherit"` for inline links inside an existing `Text` element so
230
+ * the link adopts the surrounding text's size and line-height instead of
231
+ * imposing its own (e.g. a link within a `large` paragraph).
206
232
  * @default 'body'
207
233
  */
208
234
  type?: TextType;
@@ -216,7 +242,7 @@ export interface LinkProps extends BaseProps<
216
242
  weight?: TextWeight;
217
243
  /**
218
244
  * Text color. Forwarded to Text.
219
- * @default 'active'
245
+ * @default 'accent'
220
246
  */
221
247
  color?: TextColor;
222
248
  /**
@@ -248,6 +274,11 @@ export interface LinkProps extends BaseProps<
248
274
  * <Link href="/settings" color="secondary">Settings</Link>
249
275
  * <Link href="/privacy" hasUnderline>Privacy Policy</Link>
250
276
  * <Link label="Close dialog" href="/home"><Icon icon="x" /></Link>
277
+ *
278
+ * // Inline link inside text — inherits the surrounding type/size:
279
+ * <Text type="large">
280
+ * Read our <Link href="/terms" type="inherit">terms</Link> first.
281
+ * </Text>
251
282
  * ```
252
283
  */
253
284
  export function Link({
@@ -257,6 +288,7 @@ export function Link({
257
288
  hasUnderline = false,
258
289
  isDisabled = false,
259
290
  isExternalLink = false,
291
+ newTabLabel = '(opens in new tab)',
260
292
  target: targetFromProps,
261
293
  onClick,
262
294
  tooltip,
@@ -264,7 +296,7 @@ export function Link({
264
296
  type = 'body',
265
297
  size,
266
298
  weight,
267
- color = 'active',
299
+ color = 'accent',
268
300
  display = 'inline',
269
301
  maxLines = 0,
270
302
  children,
@@ -300,7 +332,10 @@ export function Link({
300
332
  {children}
301
333
  </Text>
302
334
  {isExternalLink && !renderAsButton && (
303
- <Icon icon="externalLink" size="xsm" color="inherit" />
335
+ <>
336
+ <Icon icon="externalLink" size="xsm" color="inherit" />
337
+ <VisuallyHidden>{newTabLabel}</VisuallyHidden>
338
+ </>
304
339
  )}
305
340
  </>
306
341
  );
@@ -23,6 +23,7 @@
23
23
  * - /packages/core/src/Link/index.ts
24
24
  * - /packages/core/src/Link/Link.doc.mjs
25
25
  * - /packages/cli/templates/blocks/components/Link/ (showcase blocks)
26
+ * - /packages/cli/templates/blocks/components/LinkProvider/ (example blocks)
26
27
  */
27
28
 
28
29
  import {useMemo, type ReactNode} from 'react';
@@ -61,6 +61,13 @@ export const docs = {
61
61
  description: "List marker style. 'decimal' renders an <ol> element instead of <ul>.",
62
62
  default: "'none'",
63
63
  },
64
+ {
65
+ name: 'start',
66
+ type: 'number',
67
+ description:
68
+ "Starting number for ordered lists (listStyle='decimal'). Sets the CSS counter to begin at this value.",
69
+ default: '1',
70
+ },
64
71
  {
65
72
  name: 'xstyle',
66
73
  type: 'StyleXStyles',
@@ -75,6 +75,7 @@ export const docs = {
75
75
  type: 'number | string',
76
76
  description:
77
77
  'Max width for prose content (paragraphs, headings, lists, blockquotes). Tables and code blocks are unconstrained and can expand to the full container width. Use for readable line lengths in wide layouts.',
78
+ default: '680',
78
79
  },
79
80
  {
80
81
  name: 'contentAlign',
@@ -245,6 +246,7 @@ export const docsZh = {
245
246
  type: 'number | string',
246
247
  description:
247
248
  '正文内容的最大宽度(段落、标题、列表、引用块)。表格和代码块不受限制,可扩展到完整容器宽度。用于在宽布局中保持可读行长。',
249
+ default: '680',
248
250
  },
249
251
  {
250
252
  name: 'contentAlign',