@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
@@ -0,0 +1,183 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useTypeahead.ts
7
+ * @input Uses React useCallback/useRef
8
+ * @output Exports useTypeahead hook for first-character (type-to-focus) search
9
+ * @position Core hook; adds APG typeahead to menus, listboxes, and other
10
+ * collections. Composes with useListFocus/useGridFocus (or any collection)
11
+ * via a caller-supplied getItemLabels + onMatch.
12
+ *
13
+ * SYNC: When modified, update:
14
+ * - /packages/core/src/hooks/index.ts
15
+ */
16
+
17
+ import {useCallback, useRef} from 'react';
18
+
19
+ export interface UseTypeaheadOptions {
20
+ /**
21
+ * Returns the current, in-DOM-order list of item labels to match against.
22
+ * An entry may be `null`/empty to mark a non-matchable slot (its index is
23
+ * preserved so it maps 1:1 to the caller's items).
24
+ */
25
+ getItemLabels: () => ReadonlyArray<string | null | undefined>;
26
+
27
+ /**
28
+ * Called with the index of the matched item so the caller can focus/select
29
+ * it (e.g. `useListFocus`'s `focusItem`).
30
+ */
31
+ onMatch: (index: number) => void;
32
+
33
+ /**
34
+ * The index to start searching from — typically the currently focused item,
35
+ * so repeated presses of the same letter cycle through matches. Defaults to
36
+ * -1 (search from the top).
37
+ */
38
+ getCurrentIndex?: () => number;
39
+
40
+ /**
41
+ * Milliseconds of inactivity after which the typed buffer resets.
42
+ * @default 750
43
+ */
44
+ resetMs?: number;
45
+
46
+ /**
47
+ * Whether an index should be skipped (e.g. disabled items).
48
+ */
49
+ isDisabled?: (index: number) => boolean;
50
+ }
51
+
52
+ export interface UseTypeaheadReturn {
53
+ /**
54
+ * Keydown handler. Call it (or let it fall through) from the collection's
55
+ * own key handler. Returns `true` when it handled a printable character (so
56
+ * the caller can `preventDefault`/stop further handling), `false` otherwise.
57
+ */
58
+ onKeyDown: (e: React.KeyboardEvent | KeyboardEvent) => boolean;
59
+ /** Clear the pending buffer (e.g. on close). */
60
+ reset: () => void;
61
+ }
62
+
63
+ /**
64
+ * Whether a key event represents a single printable character (a type-to-focus
65
+ * candidate) rather than a control/navigation key or a shortcut chord.
66
+ */
67
+ function isPrintableCharacter(e: React.KeyboardEvent | KeyboardEvent): boolean {
68
+ return (
69
+ e.key.length === 1 &&
70
+ !e.ctrlKey &&
71
+ !e.metaKey &&
72
+ !e.altKey &&
73
+ // A lone space is used for activation in menus, not typeahead-from-empty.
74
+ e.key !== ' '
75
+ );
76
+ }
77
+
78
+ /**
79
+ * First-character ("type-ahead") search for a collection.
80
+ *
81
+ * Buffers printable keystrokes (resetting after `resetMs` of inactivity),
82
+ * matches items whose label starts with the buffer, and cycles from the
83
+ * current index — so pressing "s" repeatedly walks through the "s" items
84
+ * instead of sticking on the first. Space is reserved for activation and is
85
+ * only treated as typeahead while a buffer is already active.
86
+ *
87
+ * Additive and collection-agnostic: it does not move focus itself; the caller
88
+ * wires `onMatch` to its own focus/selection (e.g. `useListFocus.focusItem`).
89
+ *
90
+ * @example
91
+ * ```
92
+ * const {listRef, handleKeyDown, focusItem, getItems} = useListFocus(...);
93
+ * const typeahead = useTypeahead({
94
+ * getItemLabels: () => getItems().map(el => el.textContent),
95
+ * onMatch: focusItem,
96
+ * getCurrentIndex: () => getItems().findIndex(el => el === document.activeElement),
97
+ * });
98
+ * const onKeyDown = (e) => { if (!typeahead.onKeyDown(e)) handleKeyDown(e); };
99
+ * ```
100
+ */
101
+ export function useTypeahead(options: UseTypeaheadOptions): UseTypeaheadReturn {
102
+ const {
103
+ getItemLabels,
104
+ onMatch,
105
+ getCurrentIndex,
106
+ resetMs = 750,
107
+ isDisabled,
108
+ } = options;
109
+
110
+ const bufferRef = useRef('');
111
+ const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(
112
+ undefined,
113
+ );
114
+
115
+ const reset = useCallback(() => {
116
+ bufferRef.current = '';
117
+ if (timeoutRef.current) {
118
+ clearTimeout(timeoutRef.current);
119
+ timeoutRef.current = undefined;
120
+ }
121
+ }, []);
122
+
123
+ const scheduleReset = useCallback(() => {
124
+ if (timeoutRef.current) {
125
+ clearTimeout(timeoutRef.current);
126
+ }
127
+ timeoutRef.current = setTimeout(() => {
128
+ bufferRef.current = '';
129
+ timeoutRef.current = undefined;
130
+ }, resetMs);
131
+ }, [resetMs]);
132
+
133
+ const onKeyDown = useCallback(
134
+ (e: React.KeyboardEvent | KeyboardEvent): boolean => {
135
+ // A bare Space with no active buffer is not typeahead (menus activate on
136
+ // Space); once the user is mid-typing, Space extends the query.
137
+ const isSpaceMidType = e.key === ' ' && bufferRef.current.length > 0;
138
+ if (!isPrintableCharacter(e) && !isSpaceMidType) {
139
+ return false;
140
+ }
141
+
142
+ const labels = getItemLabels();
143
+ if (labels.length === 0) {
144
+ return false;
145
+ }
146
+
147
+ // Pressing the SAME single character repeatedly cycles to the next match
148
+ // rather than filtering deeper (APG behavior).
149
+ const char = e.key.toLowerCase();
150
+ const isRepeatSameChar =
151
+ bufferRef.current.length > 0 &&
152
+ bufferRef.current.split('').every(c => c === char);
153
+ const nextBuffer = isRepeatSameChar ? char : bufferRef.current + char;
154
+ bufferRef.current = nextBuffer;
155
+ scheduleReset();
156
+
157
+ const start = getCurrentIndex?.() ?? -1;
158
+ const count = labels.length;
159
+ // When repeating a single char, start the search AFTER the current item
160
+ // so we advance; otherwise include the current item.
161
+ const offset = isRepeatSameChar ? 1 : 0;
162
+
163
+ for (let i = 0; i < count; i++) {
164
+ const index = (start + offset + i + count) % count;
165
+ if (isDisabled?.(index)) {
166
+ continue;
167
+ }
168
+ const label = labels[index];
169
+ if (
170
+ label != null &&
171
+ label.trim().toLowerCase().startsWith(nextBuffer)
172
+ ) {
173
+ onMatch(index);
174
+ return true;
175
+ }
176
+ }
177
+ return true;
178
+ },
179
+ [getItemLabels, onMatch, getCurrentIndex, scheduleReset, isDisabled],
180
+ );
181
+
182
+ return {onKeyDown, reset};
183
+ }
package/src/index.ts CHANGED
@@ -42,6 +42,7 @@ export * from './Collapsible';
42
42
  export * from './RadioList';
43
43
  export * from './Resizable';
44
44
  export * from './Divider';
45
+ export * from './VisuallyHidden';
45
46
  export * from './EmptyState';
46
47
  export * from './Lightbox';
47
48
  export * from './Link';
@@ -64,6 +64,10 @@ const STRUCTURAL_VARS = new Set([
64
64
  '--indicator-color',
65
65
  '--indicator-width',
66
66
  '--table-resize-height',
67
+ // sticky-columns plugin: opaque backdrop (overridable) + the row overlay it
68
+ // replays on pinned cells. Structural/runtime, not themeable design tokens.
69
+ '--table-sticky-background',
70
+ '--table-row-overlay',
67
71
  '--separator-display',
68
72
  '--astryx-section-padding',
69
73
  ]);
@@ -101,7 +101,9 @@ describe('generateThemeRules', () => {
101
101
 
102
102
  it('includes .astryx-heading.level-* rules for all 6 levels', () => {
103
103
  for (let level = 1; level <= 6; level++) {
104
- const rule = rules.find(r => r.includes(`.astryx-heading.level-${level}`));
104
+ const rule = rules.find(r =>
105
+ r.includes(`.astryx-heading.level-${level}`),
106
+ );
105
107
  expect(rule).toBeDefined();
106
108
  expect(rule).toContain('font-family');
107
109
  expect(rule).toContain(`var(--text-heading-${level}-size)`);
@@ -137,9 +139,7 @@ describe('generateThemeRules', () => {
137
139
  });
138
140
  const pseudoRules = generateThemeRules(pseudoTheme);
139
141
  expect(
140
- pseudoRules.some(rule =>
141
- rule.includes('.astryx-button:hover'),
142
- ),
142
+ pseudoRules.some(rule => rule.includes('.astryx-button:hover')),
143
143
  ).toBe(true);
144
144
  });
145
145
 
@@ -186,7 +186,8 @@ describe('generateThemeRules', () => {
186
186
  expect(rules.some(r => r.includes('.astryx-text.secondary'))).toBe(true);
187
187
  expect(rules.some(r => r.includes('.astryx-heading.primary'))).toBe(true);
188
188
  expect(rules.some(r => r.includes('.astryx-heading.disabled'))).toBe(true);
189
- expect(rules.some(r => r.includes('.astryx-text.active'))).toBe(true);
189
+ expect(rules.some(r => r.includes('.astryx-text.active'))).toBe(false);
190
+ expect(rules.some(r => r.includes('.astryx-text.accent'))).toBe(true);
190
191
  });
191
192
 
192
193
  // --- Consistency ---
@@ -194,9 +195,7 @@ describe('generateThemeRules', () => {
194
195
  it('generateThemeCSS returns prose and component blocks with @scope', () => {
195
196
  const {prose, component} = generateThemeCSS(theme);
196
197
  const combined = prose + component;
197
- expect(combined).toContain(
198
- '@scope ([data-astryx-theme="default"])',
199
- );
198
+ expect(combined).toContain('@scope ([data-astryx-theme="default"])');
200
199
  expect(combined).toContain('to ([data-astryx-theme])');
201
200
  // Every rule from generateThemeRules should appear in one of the blocks
202
201
  for (const rule of rules) {
@@ -472,7 +472,7 @@ function generateColorOverrides(
472
472
  secondary: 'var(--color-text-secondary)',
473
473
  disabled: 'var(--color-text-disabled)',
474
474
  placeholder: 'var(--color-text-secondary)',
475
- active: 'var(--color-accent)',
475
+ accent: 'var(--color-text-accent)',
476
476
  };
477
477
 
478
478
  const touchesText = 'text' in components;
@@ -8,7 +8,7 @@
8
8
  * @output SyntaxTheme provider, useSyntaxTheme hook
9
9
  * @position Provider component; wraps code surfaces to apply syntax coloring
10
10
  *
11
- * @see https://github.com/facebookexperimental/xds/issues/1148
11
+ * @see https://github.com/facebook/astryx/issues/1148
12
12
  */
13
13
 
14
14
  import React, {createContext, use, useMemo} from 'react';
@@ -1,6 +1,6 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- "use strict";
3
+ 'use strict';
4
4
 
5
5
  /**
6
6
  * @file defineSyntaxTheme.ts
@@ -8,7 +8,7 @@
8
8
  * @output defineSyntaxTheme, SyntaxTheme, syntaxThemeStyle
9
9
  * @position Syntax theme definition API; consumed by presets, SyntaxTheme, defineTheme
10
10
  *
11
- * @see https://github.com/facebookexperimental/xds/issues/1148
11
+ * @see https://github.com/facebook/astryx/issues/1148
12
12
  */
13
13
 
14
14
  import {syntaxTokenDefaults, type SyntaxTokenName} from './tokens';
@@ -41,7 +41,10 @@ export type SyntaxThemeTokenKey =
41
41
  export type SyntaxTokenValue = string | [light: string, dark: string];
42
42
 
43
43
  /** Token map for defineSyntaxTheme input — values can be strings or tuples. */
44
- export type SyntaxThemeTokenInput = Record<SyntaxThemeTokenKey, SyntaxTokenValue>;
44
+ export type SyntaxThemeTokenInput = Record<
45
+ SyntaxThemeTokenKey,
46
+ SyntaxTokenValue
47
+ >;
45
48
 
46
49
  /** Resolved token map — all values are CSS strings (tuples resolved to light-dark()). */
47
50
  export type SyntaxThemeTokenMap = Record<SyntaxThemeTokenKey, string>;
@@ -73,8 +76,9 @@ function toCSSProperty(key: SyntaxThemeTokenKey): SyntaxTokenName {
73
76
  }
74
77
 
75
78
  /** All valid human-readable token keys, derived from the defaults. */
76
- export const ALL_SYNTAX_KEYS: SyntaxThemeTokenKey[] = Object.keys(syntaxTokenDefaults)
77
- .map(k => k.replace(CSS_PREFIX, '') as SyntaxThemeTokenKey);
79
+ export const ALL_SYNTAX_KEYS: SyntaxThemeTokenKey[] = Object.keys(
80
+ syntaxTokenDefaults,
81
+ ).map(k => k.replace(CSS_PREFIX, '') as SyntaxThemeTokenKey);
78
82
 
79
83
  // =============================================================================
80
84
  // Helpers
@@ -130,12 +134,17 @@ export function resolveSyntaxTokenForMode(
130
134
  * },
131
135
  * });
132
136
  */
133
- export function defineSyntaxTheme(input: SyntaxThemeInput): SyntaxThemeDefinition {
137
+ export function defineSyntaxTheme(
138
+ input: SyntaxThemeInput,
139
+ ): SyntaxThemeDefinition {
134
140
  const missing = ALL_SYNTAX_KEYS.filter(key => !(key in input.tokens));
135
141
  if (missing.length > 0) {
136
142
  console.warn(
137
- '[Astryx] defineSyntaxTheme("' + input.name + '"): missing tokens: ' +
138
- missing.join(', ') + '. All 14 syntax tokens are required.',
143
+ '[Astryx] defineSyntaxTheme("' +
144
+ input.name +
145
+ '"): missing tokens: ' +
146
+ missing.join(', ') +
147
+ '. All 14 syntax tokens are required.',
139
148
  );
140
149
  }
141
150
 
@@ -169,7 +178,7 @@ export function syntaxThemeStyle(
169
178
 
170
179
  /** Convert a syntax theme to CSS declarations (no selector wrapper). */
171
180
  export function syntaxThemeToCSS(theme: SyntaxThemeDefinition): string {
172
- return ALL_SYNTAX_KEYS
173
- .map(key => toCSSProperty(key) + ': ' + theme.tokens[key] + ';')
174
- .join('\n ');
181
+ return ALL_SYNTAX_KEYS.map(
182
+ key => toCSSProperty(key) + ': ' + theme.tokens[key] + ';',
183
+ ).join('\n ');
175
184
  }
@@ -8,10 +8,13 @@
8
8
  * All original themes are MIT licensed. Only color values are extracted.
9
9
  * See THIRD_PARTY_LICENSES.md for full attribution.
10
10
  *
11
- * @see https://github.com/facebookexperimental/xds/issues/1148
11
+ * @see https://github.com/facebook/astryx/issues/1148
12
12
  */
13
13
 
14
- import {defineSyntaxTheme, type SyntaxThemeDefinition} from './defineSyntaxTheme';
14
+ import {
15
+ defineSyntaxTheme,
16
+ type SyntaxThemeDefinition,
17
+ } from './defineSyntaxTheme';
15
18
 
16
19
  /** One Dark Pro (Binaryify) — MIT */
17
20
  export const oneDarkPro: SyntaxThemeDefinition = defineSyntaxTheme({
@@ -16,7 +16,7 @@
16
16
  * 14-token architecture validated against 11 community code themes.
17
17
  * All themes map cleanly to these 14 slots.
18
18
  *
19
- * @see https://github.com/facebookexperimental/xds/issues/1148
19
+ * @see https://github.com/facebook/astryx/issues/1148
20
20
  */
21
21
 
22
22
  export const syntaxTokenDefaults = {
@@ -162,7 +162,7 @@ export type TextColor =
162
162
  | 'secondary'
163
163
  | 'disabled'
164
164
  | 'placeholder'
165
- | 'active'
165
+ | 'accent'
166
166
  | 'inherit';
167
167
 
168
168
  /**
@@ -0,0 +1,40 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file dateTypes.test.ts
5
+ * @input Uses vitest
6
+ * @output Test suite for date type helpers
7
+ * @position Tests for dateTypes.ts (normalizeDayOfWeek)
8
+ *
9
+ * SYNC: When dateTypes.ts changes, update tests accordingly
10
+ */
11
+
12
+ import {describe, it, expect} from 'vitest';
13
+ import {normalizeDayOfWeek} from './dateTypes';
14
+
15
+ describe('normalizeDayOfWeek', () => {
16
+ it('passes numeric days through unchanged', () => {
17
+ expect(normalizeDayOfWeek(0)).toBe(0);
18
+ expect(normalizeDayOfWeek(1)).toBe(1);
19
+ expect(normalizeDayOfWeek(6)).toBe(6);
20
+ });
21
+
22
+ it('maps three-letter day names to their index', () => {
23
+ expect(normalizeDayOfWeek('sun')).toBe(0);
24
+ expect(normalizeDayOfWeek('mon')).toBe(1);
25
+ expect(normalizeDayOfWeek('tue')).toBe(2);
26
+ expect(normalizeDayOfWeek('wed')).toBe(3);
27
+ expect(normalizeDayOfWeek('thu')).toBe(4);
28
+ expect(normalizeDayOfWeek('fri')).toBe(5);
29
+ expect(normalizeDayOfWeek('sat')).toBe(6);
30
+ });
31
+
32
+ it('is case-insensitive for day names', () => {
33
+ expect(normalizeDayOfWeek('MON' as 'mon')).toBe(1);
34
+ expect(normalizeDayOfWeek('Sat' as 'sat')).toBe(6);
35
+ });
36
+
37
+ it('falls back to 0 (Sunday) for an unrecognized name', () => {
38
+ expect(normalizeDayOfWeek('xyz' as 'mon')).toBe(0);
39
+ });
40
+ });
@@ -17,6 +17,46 @@ export type ISODateString =
17
17
  /** Day of week: 0 = Sunday through 6 = Saturday */
18
18
  export type DayOfWeek = 0 | 1 | 2 | 3 | 4 | 5 | 6;
19
19
 
20
+ /**
21
+ * Three-letter lowercase weekday name, 'sun' through 'sat'.
22
+ * A more self-documenting alternative to the numeric {@link DayOfWeek}.
23
+ */
24
+ export type DayOfWeekName =
25
+ | 'sun'
26
+ | 'mon'
27
+ | 'tue'
28
+ | 'wed'
29
+ | 'thu'
30
+ | 'fri'
31
+ | 'sat';
32
+
33
+ /** Weekday names indexed by {@link DayOfWeek} (0 = Sunday). */
34
+ const WEEKDAY_NAMES: ReadonlyArray<DayOfWeekName> = [
35
+ 'sun',
36
+ 'mon',
37
+ 'tue',
38
+ 'wed',
39
+ 'thu',
40
+ 'fri',
41
+ 'sat',
42
+ ];
43
+
44
+ /**
45
+ * Normalize a weekday to its numeric {@link DayOfWeek}. Accepts either a
46
+ * number (0–6) or a three-letter day name ('sun'–'sat', case-insensitive),
47
+ * so APIs like `weekStartsOn` can take whichever is more readable at the
48
+ * call site. Unrecognized values fall back to 0 (Sunday).
49
+ */
50
+ export function normalizeDayOfWeek(
51
+ value: DayOfWeek | DayOfWeekName,
52
+ ): DayOfWeek {
53
+ if (typeof value === 'number') {
54
+ return value;
55
+ }
56
+ const index = WEEKDAY_NAMES.indexOf(value.toLowerCase() as DayOfWeekName);
57
+ return index === -1 ? 0 : (index as DayOfWeek);
58
+ }
59
+
20
60
  /** Immutable date record with 1-based month. */
21
61
  export interface PlainDate {
22
62
  readonly year: number;
@@ -68,7 +68,16 @@ export {getKey, type Key, type KeyFallback} from './getKey';
68
68
 
69
69
  export {mergeProps} from './mergeProps';
70
70
  export {mergeRefs} from './mergeRefs';
71
+ export {themeProps, themeDataAttributes} from './themeProps';
72
+ export type {
73
+ ClassValue,
74
+ ClassProps,
75
+ ThemeDataAttributes,
76
+ ThemeProps,
77
+ } from './themeProps';
71
78
  export {groupItems, getItemGroup} from './groupItems';
72
79
  export type {ItemGroup} from './groupItems';
73
80
  export {observeResize, unobserveResize} from './sharedResizeObserver';
74
81
  export {isRenderable} from './isRenderable';
82
+ export {getInputARIA} from './inputAria';
83
+ export type {InputARIA, InputARIAInputGroup} from './inputAria';
@@ -0,0 +1,39 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import {getInputARIA} from './inputAria';
5
+
6
+ describe('getInputARIA', () => {
7
+ it('keeps standalone input labeling native while composing descriptions', () => {
8
+ expect(
9
+ getInputARIA('input-label', ['input-help', undefined, 'input-error']),
10
+ ).toEqual({
11
+ ariaLabelledBy: undefined,
12
+ ariaDescribedBy: 'input-help input-error',
13
+ });
14
+ });
15
+
16
+ it('composes InputGroup context before input labels and descriptions', () => {
17
+ expect(
18
+ getInputARIA('input-label', ['input-help'], {
19
+ labelID: 'group-label',
20
+ describedByIDs: 'group-help group-error',
21
+ }),
22
+ ).toEqual({
23
+ ariaLabelledBy: 'group-label input-label',
24
+ ariaDescribedBy: 'group-help group-error input-help',
25
+ });
26
+ });
27
+
28
+ it('deduplicates repeated IDs', () => {
29
+ expect(
30
+ getInputARIA('group-label', ['shared', 'input-help'], {
31
+ labelID: 'group-label',
32
+ describedByIDs: 'shared group-error',
33
+ }),
34
+ ).toEqual({
35
+ ariaLabelledBy: 'group-label',
36
+ ariaDescribedBy: 'shared group-error input-help',
37
+ });
38
+ });
39
+ });
@@ -0,0 +1,58 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file inputAria.ts
5
+ * @input Receives input label/description IDs and optional InputGroup context
6
+ * @output Exports helpers for consistent input ARIA composition
7
+ * @position Internal utility; used by inputs that compose labels/descriptions
8
+ */
9
+
10
+ export interface InputARIAInputGroup {
11
+ /** ID of the visible InputGroup label. */
12
+ labelID: string;
13
+ /** Space-separated IDs for InputGroup description/status text. */
14
+ describedByIDs?: string;
15
+ }
16
+
17
+ export interface InputARIA {
18
+ /** Value for aria-labelledby on the input. */
19
+ ariaLabelledBy?: string;
20
+ /** Value for aria-describedby on the input. */
21
+ ariaDescribedBy?: string;
22
+ }
23
+
24
+ type AriaID = string | null | undefined | false;
25
+
26
+ function joinAriaIDs(...values: AriaID[]): string | undefined {
27
+ const ids = values
28
+ .flatMap(value =>
29
+ typeof value === 'string' ? value.trim().split(/\s+/) : [],
30
+ )
31
+ .filter(Boolean);
32
+
33
+ if (ids.length === 0) {
34
+ return undefined;
35
+ }
36
+
37
+ return Array.from(new Set(ids)).join(' ');
38
+ }
39
+
40
+ /**
41
+ * Builds ARIA label/description wiring for an input.
42
+ *
43
+ * Standalone inputs keep their normal native label association. Grouped inputs
44
+ * are named by the visible InputGroup label plus their own input label, and
45
+ * inherit group description/status text in addition to input-local text.
46
+ */
47
+ export function getInputARIA(
48
+ labelID: string,
49
+ describedByIDs: AriaID[] = [],
50
+ inputGroup?: InputARIAInputGroup | null,
51
+ ): InputARIA {
52
+ return {
53
+ ariaLabelledBy: inputGroup
54
+ ? joinAriaIDs(inputGroup.labelID, labelID)
55
+ : undefined,
56
+ ariaDescribedBy: joinAriaIDs(inputGroup?.describedByIDs, ...describedByIDs),
57
+ };
58
+ }
@@ -144,11 +144,21 @@ describe('parseTimeInput', () => {
144
144
  expect(parseTimeInput('12pm')).toBe('12:00');
145
145
  });
146
146
 
147
+ it('parses dotted meridiems (a.m./p.m.)', () => {
148
+ expect(parseTimeInput('2:30 p.m.')).toBe('14:30');
149
+ expect(parseTimeInput('2:30 P.M.')).toBe('14:30');
150
+ expect(parseTimeInput('2:30 p.m')).toBe('14:30');
151
+ expect(parseTimeInput('12 a.m.')).toBe('00:00');
152
+ expect(parseTimeInput('12 p.m.')).toBe('12:00');
153
+ expect(parseTimeInput('2 p.m.')).toBe('14:00');
154
+ });
155
+
147
156
  it('returns null for invalid input', () => {
148
157
  expect(parseTimeInput('')).toBeNull();
149
158
  expect(parseTimeInput('abc')).toBeNull();
150
159
  expect(parseTimeInput('25:00')).toBeNull();
151
160
  expect(parseTimeInput('13:00 PM')).toBeNull(); // 13 is invalid in 12h format
161
+ expect(parseTimeInput('13:00 p.m.')).toBeNull(); // dotted variant rejected too
152
162
  });
153
163
  });
154
164
 
@@ -164,10 +164,13 @@ export function parseTimeInput(
164
164
 
165
165
  const trimmed = input.trim().toLowerCase();
166
166
 
167
- // Check for AM/PM
168
- const hasMeridiem = /[ap]m?\s*$/i.test(trimmed);
167
+ // Check for AM/PM. hasMeridiem is derived from isPM/isAM so the detection
168
+ // can never drift from them: it previously used its own regex without the
169
+ // optional dots, so dotted meridiems ("2:30 p.m.") skipped the 12h -> 24h
170
+ // conversion and parsed 12 hours off.
169
171
  const isPM = /p\.?m?\.?\s*$/i.test(trimmed);
170
172
  const isAM = /a\.?m?\.?\s*$/i.test(trimmed);
173
+ const hasMeridiem = isPM || isAM;
171
174
 
172
175
  // Remove AM/PM suffix
173
176
  const timeStr = trimmed.replace(/\s*[ap]\.?m?\.?\s*$/i, '').trim();
@@ -1,57 +0,0 @@
1
- import type { ISODateString } from '../../utils/dateTypes';
2
- import { type PlainDate } from '../../utils/plainDate';
3
- import type { CalendarDay } from './useCalendarDays';
4
- /**
5
- * Configuration for calendar roving tabindex
6
- */
7
- export interface UseCalendarRovingTabindexOptions {
8
- /** All days in the grid */
9
- days: CalendarDay[];
10
- /** Today's date as a PlainDate */
11
- today: PlainDate;
12
- /** The year being displayed */
13
- year: number;
14
- /** The month being displayed (1-based: 1 = January, 12 = December) */
15
- month: number;
16
- /** Function to check if a date is disabled */
17
- isDateDisabled: (date: PlainDate) => boolean;
18
- /** Currently selected date (if any) */
19
- selectedDate?: PlainDate | null;
20
- }
21
- /**
22
- * Return type for useCalendarRovingTabindex hook
23
- */
24
- export interface UseCalendarRovingTabindexReturn {
25
- /** The ISO date string of the tabbable element, or null */
26
- tabbableDate: ISODateString | null;
27
- /** Check if a specific date is the tabbable one */
28
- isTabbable: (iso: ISODateString) => boolean;
29
- }
30
- /**
31
- * Hook for managing roving tabindex in calendar grids.
32
- *
33
- * Implements the WAI-ARIA roving tabindex pattern where only one element
34
- * in a group has tabindex="0" while others have tabindex="-1".
35
- *
36
- * Priority for tabbable element:
37
- * 1. Today if visible in the current month and enabled
38
- * 2. First enabled day in the month
39
- *
40
- * @example
41
- * ```
42
- * const {tabbableDate, isTabbable} = useCalendarRovingTabindex({
43
- * days,
44
- * today: {year: 2026, month: 1, day: 20},
45
- * year: 2026,
46
- * month: 1, // January (1-based)
47
- * isDateDisabled,
48
- * });
49
- *
50
- * // In day rendering:
51
- * <button tabIndex={isTabbable(day.iso) ? 0 : -1}>
52
- * {day.dayNumber}
53
- * </button>
54
- * ```
55
- */
56
- export declare function useCalendarRovingTabindex(options: UseCalendarRovingTabindexOptions): UseCalendarRovingTabindexReturn;
57
- //# sourceMappingURL=useCalendarRovingTabindex.d.ts.map