@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
@@ -6,26 +6,95 @@ export const docs = {
6
6
  name: 'TimeInput',
7
7
  displayName: 'Time Input',
8
8
  category: 'Data Input',
9
- keywords: ["timeinput","timepicker","time","clock","hour","minute","ampm","timeselect","timefield","schedule"],
9
+ keywords: [
10
+ 'timeinput',
11
+ 'timepicker',
12
+ 'time',
13
+ 'clock',
14
+ 'hour',
15
+ 'minute',
16
+ 'ampm',
17
+ 'timeselect',
18
+ 'timefield',
19
+ 'schedule',
20
+ ],
10
21
 
11
22
  usage: {
12
23
  description:
13
24
  'TimeInput lets users enter a time of day and converts it to a standard format. It also allows users to adjust times using the arrow keys. Use it in forms, scheduling flows, or any interface where users need to select a specific time.',
14
25
  bestPractices: [
15
- {guidance: true, description: 'Choose the hour format (12h or 24h) that matches your audience\u2019s locale \u2014 12-hour with AM/PM for US-centric UIs, 24-hour for international or technical contexts.'},
16
- {guidance: true, description: 'Set min and max constraints when the context has a valid range, like business hours or event windows, so users cannot submit an out-of-bounds time.'},
17
- {guidance: true, description: 'Provide a description or placeholder that hints at the expected format or purpose, like \u201cBusiness hours: 9 AM \u2013 5 PM\u201d.'},
18
- {guidance: true, description: 'Use the status prop to surface validation errors inline \u2014 show a message like \u201cTime must be during business hours\u201d so users know exactly what to fix.'},
19
- {guidance: true, description: 'Enable hasClear when the field is optional, so users can remove a previously selected time.'},
20
- {guidance: false, description: 'Don\u2019t use TimeInput for combined date-and-time selection \u2014 pair it with a separate DateInput instead.'},
21
- {guidance: false, description: 'Don\u2019t hide the label \u2014 even when space is tight, keep the label visible or provide a description so the purpose is clear.'},
26
+ {
27
+ guidance: true,
28
+ description:
29
+ 'Choose the hour format (12h or 24h) that matches your audience\u2019s locale \u2014 12-hour with AM/PM for US-centric UIs, 24-hour for international or technical contexts.',
30
+ },
31
+ {
32
+ guidance: true,
33
+ description:
34
+ 'Set min and max constraints when the context has a valid range, like business hours or event windows, so users cannot submit an out-of-bounds time.',
35
+ },
36
+ {
37
+ guidance: true,
38
+ description:
39
+ 'Provide a description or placeholder that hints at the expected format or purpose, like \u201cBusiness hours: 9 AM \u2013 5 PM\u201d.',
40
+ },
41
+ {
42
+ guidance: true,
43
+ description:
44
+ 'Use the status prop to surface validation errors inline \u2014 show a message like \u201cTime must be during business hours\u201d so users know exactly what to fix.',
45
+ },
46
+ {
47
+ guidance: true,
48
+ description:
49
+ 'Enable hasClear when the field is optional, so users can remove a previously selected time.',
50
+ },
51
+ {
52
+ guidance: false,
53
+ description:
54
+ 'Don\u2019t use TimeInput for combined date-and-time selection \u2014 pair it with a separate DateInput instead.',
55
+ },
56
+ {
57
+ guidance: false,
58
+ description:
59
+ 'Don\u2019t hide the label \u2014 even when space is tight, keep the label visible or provide a description so the purpose is clear.',
60
+ },
61
+ {
62
+ guidance: false,
63
+ description:
64
+ 'Wrap a disabled TimeInput in Tooltip to explain why it is disabled; disabled triggers swallow the hover events the wrapper needs. Use the disabledMessage prop instead.',
65
+ },
22
66
  ],
23
67
  anatomy: [
24
- {name: 'Clock icon', required: false, description: 'A leading clock icon that identifies the field as a time input.'},
25
- {name: 'Text input', required: true, description: 'The editable text field where users type or see the formatted time.'},
26
- {name: 'Clear button', required: false, description: 'A trailing button to reset the value, shown when hasClear is true and a value is set.'},
27
- {name: 'Status icon', required: false, description: 'A trailing icon indicating error, warning, or success state.'},
28
- {name: 'Spinner', required: false, description: 'Replaces trailing content during loading to show an async action is in progress.'},
68
+ {
69
+ name: 'Clock icon',
70
+ required: false,
71
+ description:
72
+ 'A leading clock icon that identifies the field as a time input.',
73
+ },
74
+ {
75
+ name: 'Text input',
76
+ required: true,
77
+ description:
78
+ 'The editable text field where users type or see the formatted time.',
79
+ },
80
+ {
81
+ name: 'Clear button',
82
+ required: false,
83
+ description:
84
+ 'A trailing button to reset the value, shown when hasClear is true and a value is set.',
85
+ },
86
+ {
87
+ name: 'Status icon',
88
+ required: false,
89
+ description:
90
+ 'A trailing icon indicating error, warning, or success state.',
91
+ },
92
+ {
93
+ name: 'Spinner',
94
+ required: false,
95
+ description:
96
+ 'Replaces trailing content during loading to show an async action is in progress.',
97
+ },
29
98
  ],
30
99
  },
31
100
 
@@ -33,8 +102,7 @@ export const docs = {
33
102
  {
34
103
  name: 'label',
35
104
  type: 'string',
36
- description:
37
- 'Label text for the input (required for accessibility).',
105
+ description: 'Label text for the input (required for accessibility).',
38
106
  required: true,
39
107
  },
40
108
  {
@@ -69,6 +137,12 @@ export const docs = {
69
137
  description: 'Disables the input and suppresses interactions.',
70
138
  default: 'false',
71
139
  },
140
+ {
141
+ name: 'disabledMessage',
142
+ type: 'string',
143
+ description:
144
+ 'Explains why the input is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the field focusable via aria-disabled (activation stays blocked). Use this instead of wrapping a disabled TimeInput in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
145
+ },
72
146
  {
73
147
  name: 'value',
74
148
  type: 'ISOTimeString',
@@ -176,27 +250,134 @@ export const docsZh = {
176
250
 
177
251
  displayName: 'Time Input',
178
252
  props: [
179
- {name: 'label', type: 'string', description: '输入框的标签文本(无障碍性所必需)。', required: true},
180
- {name: 'isLabelHidden', type: 'boolean', description: '视觉上隐藏标签,同时保持屏幕阅读器的无障碍性。', default: 'false'},
181
- {name: 'description', type: 'string', description: '显示在标签和输入框之间的描述文本。'},
182
- {name: 'isOptional', type: 'boolean', description: '在标签旁显示"(可选)"指示器。与 isRequired 互斥。', default: 'false'},
183
- {name: 'isRequired', type: 'boolean', description: '将字段标记为必填并设置 aria-required。与 isOptional 互斥。', default: 'false'},
184
- {name: 'isDisabled', type: 'boolean', description: '禁用输入框并抑制交互。', default: 'false'},
185
- {name: 'value', type: 'ISOTimeString', description: 'ISO 格式的受控时间值(HH:MM 或 HH:MM:SS)。'},
186
- {name: 'onChange', type: '(value: ISOTimeString | undefined) => void', description: '时间变化时触发的回调。输入被清除时接收 undefined。'},
187
- {name: 'changeAction', type: '(value: ISOTimeString | undefined) => void | Promise<void>', description: '在 onChange 之后触发的异步操作。包装在 React transition 中以提供乐观 UI;挂起时触发加载旋转器。'},
188
- {name: 'isLoading', type: 'boolean', description: '使输入框进入加载状态,显示旋转器。', default: 'false'},
189
- {name: 'min', type: 'ISOTimeString', description: 'ISO 格式的最小可选时间。超出范围的值将被拒绝。'},
190
- {name: 'max', type: 'ISOTimeString', description: 'ISO 格式的最大可选时间。超出范围的值将被拒绝。'},
191
- {name: 'hasSeconds', type: 'boolean', description: '在时间显示和解析中包含秒。', default: 'false'},
192
- {name: 'hasClear', type: 'boolean', description: '当有值且输入框未被禁用时显示清除按钮。', default: 'false'},
193
- {name: 'hourFormat', type: "'12h' | '24h'", description: "控制显示格式。'12h' 显示 AM/PM(例如 '2:30 PM');'24h' 使用 24 小时制(例如 '14:30')。", default: "'12h'"},
194
- {name: 'increment', type: 'number', description: '用户按上或下方向键时增加或减少的分钟数。', default: '1'},
195
- {name: 'placeholder', type: 'string', description: '未选择时间时显示的占位符文本。当输入框聚焦且为空时,格式提示会覆盖此文本。', default: "'Select a time'"},
196
- {name: 'size', type: "'sm' | 'md' | 'lg'", description: '控制输入框元素的高度。', default: "'md'"},
197
- {name: 'status', type: 'InputStatus', description: '为边框着色并显示图标的状态指示器。当提供消息时,消息渲染在输入框下方。'},
198
- {name: 'labelTooltip', type: 'string', description: '在标签行末尾以信息图标形式渲染的工具提示文本。'},
199
- {name: 'xstyle', type: 'StyleXStyles', description: 'StyleX 样式,用于布局自定义(边距、定位、尺寸)。必须是 stylex.create() 的值,而非内联样式对象如 style={{}}。'},
253
+ {
254
+ name: 'label',
255
+ type: 'string',
256
+ description: '输入框的标签文本(无障碍性所必需)。',
257
+ required: true,
258
+ },
259
+ {
260
+ name: 'isLabelHidden',
261
+ type: 'boolean',
262
+ description: '视觉上隐藏标签,同时保持屏幕阅读器的无障碍性。',
263
+ default: 'false',
264
+ },
265
+ {
266
+ name: 'description',
267
+ type: 'string',
268
+ description: '显示在标签和输入框之间的描述文本。',
269
+ },
270
+ {
271
+ name: 'isOptional',
272
+ type: 'boolean',
273
+ description: '在标签旁显示"(可选)"指示器。与 isRequired 互斥。',
274
+ default: 'false',
275
+ },
276
+ {
277
+ name: 'isRequired',
278
+ type: 'boolean',
279
+ description: '将字段标记为必填并设置 aria-required。与 isOptional 互斥。',
280
+ default: 'false',
281
+ },
282
+ {
283
+ name: 'isDisabled',
284
+ type: 'boolean',
285
+ description: '禁用输入框并抑制交互。',
286
+ default: 'false',
287
+ },
288
+ {
289
+ name: 'disabledMessage',
290
+ type: 'string',
291
+ description:
292
+ '说明输入框为何被禁用。与 isDisabled 一起使用时,在悬停/键盘聚焦时显示提示,并通过 aria-disabled 保持输入框可聚焦(仍阻止输入和调整)。请使用此属性,而不是用 Tooltip 包裹已禁用的 TimeInput。',
293
+ },
294
+ {
295
+ name: 'value',
296
+ type: 'ISOTimeString',
297
+ description: 'ISO 格式的受控时间值(HH:MM 或 HH:MM:SS)。',
298
+ },
299
+ {
300
+ name: 'onChange',
301
+ type: '(value: ISOTimeString | undefined) => void',
302
+ description: '时间变化时触发的回调。输入被清除时接收 undefined。',
303
+ },
304
+ {
305
+ name: 'changeAction',
306
+ type: '(value: ISOTimeString | undefined) => void | Promise<void>',
307
+ description:
308
+ '在 onChange 之后触发的异步操作。包装在 React transition 中以提供乐观 UI;挂起时触发加载旋转器。',
309
+ },
310
+ {
311
+ name: 'isLoading',
312
+ type: 'boolean',
313
+ description: '使输入框进入加载状态,显示旋转器。',
314
+ default: 'false',
315
+ },
316
+ {
317
+ name: 'min',
318
+ type: 'ISOTimeString',
319
+ description: 'ISO 格式的最小可选时间。超出范围的值将被拒绝。',
320
+ },
321
+ {
322
+ name: 'max',
323
+ type: 'ISOTimeString',
324
+ description: 'ISO 格式的最大可选时间。超出范围的值将被拒绝。',
325
+ },
326
+ {
327
+ name: 'hasSeconds',
328
+ type: 'boolean',
329
+ description: '在时间显示和解析中包含秒。',
330
+ default: 'false',
331
+ },
332
+ {
333
+ name: 'hasClear',
334
+ type: 'boolean',
335
+ description: '当有值且输入框未被禁用时显示清除按钮。',
336
+ default: 'false',
337
+ },
338
+ {
339
+ name: 'hourFormat',
340
+ type: "'12h' | '24h'",
341
+ description:
342
+ "控制显示格式。'12h' 显示 AM/PM(例如 '2:30 PM');'24h' 使用 24 小时制(例如 '14:30')。",
343
+ default: "'12h'",
344
+ },
345
+ {
346
+ name: 'increment',
347
+ type: 'number',
348
+ description: '用户按上或下方向键时增加或减少的分钟数。',
349
+ default: '1',
350
+ },
351
+ {
352
+ name: 'placeholder',
353
+ type: 'string',
354
+ description:
355
+ '未选择时间时显示的占位符文本。当输入框聚焦且为空时,格式提示会覆盖此文本。',
356
+ default: "'Select a time'",
357
+ },
358
+ {
359
+ name: 'size',
360
+ type: "'sm' | 'md' | 'lg'",
361
+ description: '控制输入框元素的高度。',
362
+ default: "'md'",
363
+ },
364
+ {
365
+ name: 'status',
366
+ type: 'InputStatus',
367
+ description:
368
+ '为边框着色并显示图标的状态指示器。当提供消息时,消息渲染在输入框下方。',
369
+ },
370
+ {
371
+ name: 'labelTooltip',
372
+ type: 'string',
373
+ description: '在标签行末尾以信息图标形式渲染的工具提示文本。',
374
+ },
375
+ {
376
+ name: 'xstyle',
377
+ type: 'StyleXStyles',
378
+ description:
379
+ 'StyleX 样式,用于布局自定义(边距、定位、尺寸)。必须是 stylex.create() 的值,而非内联样式对象如 style={{}}。',
380
+ },
200
381
  ],
201
382
  theming: {
202
383
  targets: [
@@ -207,61 +388,155 @@ export const docsZh = {
207
388
  description:
208
389
  'TimeInput lets users enter a time of day and converts it to a standard format. It also allows users to adjust times using the arrow keys. Use it in forms, scheduling flows, or any interface where users need to select a specific time.',
209
390
  bestPractices: [
210
- {guidance: true, description: 'Choose the hour format (12h or 24h) that matches your audience\u2019s locale \u2014 12-hour with AM/PM for US-centric UIs, 24-hour for international or technical contexts.'},
211
- {guidance: true, description: 'Set min and max constraints when the context has a valid range, like business hours or event windows, so users cannot submit an out-of-bounds time.'},
212
- {guidance: true, description: 'Provide a description or placeholder that hints at the expected format or purpose, like \u201cBusiness hours: 9 AM \u2013 5 PM\u201d.'},
213
- {guidance: true, description: 'Use the status prop to surface validation errors inline \u2014 show a message like \u201cTime must be during business hours\u201d so users know exactly what to fix.'},
214
- {guidance: true, description: 'Enable hasClear when the field is optional, so users can remove a previously selected time.'},
215
- {guidance: false, description: 'Don\u2019t use TimeInput for combined date-and-time selection \u2014 pair it with a separate DateInput instead.'},
216
- {guidance: false, description: 'Don\u2019t hide the label \u2014 even when space is tight, keep the label visible or provide a description so the purpose is clear.'},
391
+ {
392
+ guidance: true,
393
+ description:
394
+ 'Choose the hour format (12h or 24h) that matches your audience\u2019s locale \u2014 12-hour with AM/PM for US-centric UIs, 24-hour for international or technical contexts.',
395
+ },
396
+ {
397
+ guidance: true,
398
+ description:
399
+ 'Set min and max constraints when the context has a valid range, like business hours or event windows, so users cannot submit an out-of-bounds time.',
400
+ },
401
+ {
402
+ guidance: true,
403
+ description:
404
+ 'Provide a description or placeholder that hints at the expected format or purpose, like \u201cBusiness hours: 9 AM \u2013 5 PM\u201d.',
405
+ },
406
+ {
407
+ guidance: true,
408
+ description:
409
+ 'Use the status prop to surface validation errors inline \u2014 show a message like \u201cTime must be during business hours\u201d so users know exactly what to fix.',
410
+ },
411
+ {
412
+ guidance: true,
413
+ description:
414
+ 'Enable hasClear when the field is optional, so users can remove a previously selected time.',
415
+ },
416
+ {
417
+ guidance: false,
418
+ description:
419
+ 'Don\u2019t use TimeInput for combined date-and-time selection \u2014 pair it with a separate DateInput instead.',
420
+ },
421
+ {
422
+ guidance: false,
423
+ description:
424
+ 'Don\u2019t hide the label \u2014 even when space is tight, keep the label visible or provide a description so the purpose is clear.',
425
+ },
426
+ {
427
+ guidance: false,
428
+ description:
429
+ 'Wrap a disabled TimeInput in Tooltip to explain why it is disabled; disabled triggers swallow the hover events the wrapper needs. Use the disabledMessage prop instead.',
430
+ },
217
431
  ],
218
432
  anatomy: [
219
- {name: 'Clock icon', required: false, description: 'A leading clock icon that identifies the field as a time input.'},
220
- {name: 'Text input', required: true, description: 'The editable text field where users type or see the formatted time.'},
221
- {name: 'Clear button', required: false, description: 'A trailing button to reset the value, shown when hasClear is true and a value is set.'},
222
- {name: 'Status icon', required: false, description: 'A trailing icon indicating error, warning, or success state.'},
223
- {name: 'Spinner', required: false, description: 'Replaces trailing content during loading to show an async action is in progress.'},
433
+ {
434
+ name: 'Clock icon',
435
+ required: false,
436
+ description:
437
+ 'A leading clock icon that identifies the field as a time input.',
438
+ },
439
+ {
440
+ name: 'Text input',
441
+ required: true,
442
+ description:
443
+ 'The editable text field where users type or see the formatted time.',
444
+ },
445
+ {
446
+ name: 'Clear button',
447
+ required: false,
448
+ description:
449
+ 'A trailing button to reset the value, shown when hasClear is true and a value is set.',
450
+ },
451
+ {
452
+ name: 'Status icon',
453
+ required: false,
454
+ description:
455
+ 'A trailing icon indicating error, warning, or success state.',
456
+ },
457
+ {
458
+ name: 'Spinner',
459
+ required: false,
460
+ description:
461
+ 'Replaces trailing content during loading to show an async action is in progress.',
462
+ },
224
463
  ],
225
464
  },
226
465
  };
227
466
 
228
467
  /** @type {import('../docs-types').TranslationDoc} */
229
468
  export const docsDense = {
230
- description: 'Time input that converts free-text entry to standard format with arrow-key adjustment.',
469
+ description:
470
+ 'Time input that converts free-text entry to standard format with arrow-key adjustment.',
231
471
  usage: {
232
472
  description:
233
473
  'TimeInput lets users enter a time of day and converts it to a standard format. It also allows users to adjust times using the arrow keys. Use it in forms, scheduling flows, or any interface where users need to select a specific time.',
234
474
  bestPractices: [
235
- {guidance: true, description: 'Choose hour format (12h/24h) to match locale \u2014 12h for US, 24h for international.'},
236
- {guidance: true, description: 'Set min/max constraints for valid ranges like business hours.'},
237
- {guidance: true, description: 'Provide description or placeholder hinting at expected format.'},
238
- {guidance: true, description: 'Use status prop for inline validation errors.'},
475
+ {
476
+ guidance: true,
477
+ description:
478
+ 'Choose hour format (12h/24h) to match locale \u2014 12h for US, 24h for international.',
479
+ },
480
+ {
481
+ guidance: true,
482
+ description:
483
+ 'Set min/max constraints for valid ranges like business hours.',
484
+ },
485
+ {
486
+ guidance: true,
487
+ description:
488
+ 'Provide description or placeholder hinting at expected format.',
489
+ },
490
+ {
491
+ guidance: true,
492
+ description: 'Use status prop for inline validation errors.',
493
+ },
239
494
  {guidance: true, description: 'Enable hasClear for optional fields.'},
240
- {guidance: false, description: 'Don\u2019t use for date-and-time \u2014 pair with DateInput instead.'},
241
- {guidance: false, description: 'Don\u2019t hide the label \u2014 keep it visible for clarity.'},
495
+ {
496
+ guidance: false,
497
+ description:
498
+ 'Don\u2019t use for date-and-time \u2014 pair with DateInput instead.',
499
+ },
500
+ {
501
+ guidance: false,
502
+ description:
503
+ 'Don\u2019t hide the label \u2014 keep it visible for clarity.',
504
+ },
505
+ {
506
+ guidance: false,
507
+ description:
508
+ 'Don\u2019t wrap a disabled TimeInput in Tooltip; use the disabledMessage prop instead.',
509
+ },
242
510
  ],
243
511
  },
244
512
  propDescriptions: {
245
513
  label: 'Label text (required for a11y).',
246
514
  isLabelHidden: 'Visually hides label; keeps screen reader access.',
247
515
  description: 'Description text between label+input.',
248
- isOptional: 'Shows "(optional)" indicator. Mutually exclusive w/ isRequired.',
249
- isRequired: 'Marks required+sets aria-required. Mutually exclusive w/ isOptional.',
516
+ isOptional:
517
+ 'Shows "(optional)" indicator. Mutually exclusive w/ isRequired.',
518
+ isRequired:
519
+ 'Marks required+sets aria-required. Mutually exclusive w/ isOptional.',
250
520
  isDisabled: 'Disables input, suppresses interactions.',
521
+ disabledMessage:
522
+ 'Reason shown in a tooltip on hover/focus when disabled; keeps input focusable via aria-disabled.',
251
523
  value: 'Controlled time in ISO format (HH:MM or HH:MM:SS).',
252
524
  onChange: 'Fired on time change. Receives undefined when cleared.',
253
- changeAction: 'Async action after onChange in React transition; triggers spinner while pending.',
525
+ changeAction:
526
+ 'Async action after onChange in React transition; triggers spinner while pending.',
254
527
  isLoading: 'Loading state w/ spinner.',
255
528
  min: 'Min selectable time in ISO format. Out-of-range rejected.',
256
529
  max: 'Max selectable time in ISO format. Out-of-range rejected.',
257
530
  hasSeconds: 'Includes seconds in display+parsing.',
258
531
  hasClear: 'Shows clear button when value set+not disabled.',
259
- hourFormat: "Display format. '12h' shows AM/PM; '24h' uses 24-hour notation.",
532
+ hourFormat:
533
+ "Display format. '12h' shows AM/PM; '24h' uses 24-hour notation.",
260
534
  increment: 'Minutes to add/subtract on arrow up/down.',
261
535
  placeholder: 'Placeholder when empty. Focused+empty shows format hint.',
262
536
  size: 'Input element height.',
263
537
  status: 'Colored border+icon. Message rendered below input.',
264
538
  labelTooltip: 'Tooltip as info icon at label row end.',
265
- xstyle: 'StyleX styles for layout customization. Must be stylex.create() value, not inline style.',
539
+ xstyle:
540
+ 'StyleX styles for layout customization. Must be stylex.create() value, not inline style.',
266
541
  },
267
542
  };
@@ -9,8 +9,8 @@
9
9
  * SYNC: When TimeInput.tsx changes, update tests to match new behavior
10
10
  */
11
11
 
12
- import {describe, it, expect, vi} from 'vitest';
13
- import {render, screen, fireEvent} from '@testing-library/react';
12
+ import {describe, it, expect, vi, beforeEach} from 'vitest';
13
+ import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {TimeInput} from './TimeInput';
16
16
  import type {ISOTimeString} from '../utils';
@@ -23,11 +23,7 @@ describe('TimeInput', () => {
23
23
 
24
24
  it('renders with placeholder', () => {
25
25
  render(
26
- <TimeInput
27
- label="Time"
28
- onChange={() => {}}
29
- placeholder="Pick a time"
30
- />,
26
+ <TimeInput label="Time" onChange={() => {}} placeholder="Pick a time" />,
31
27
  );
32
28
  expect(screen.getByPlaceholderText('Pick a time')).toBeInTheDocument();
33
29
  });
@@ -210,4 +206,145 @@ describe('TimeInput', () => {
210
206
  fireEvent.click(wrapper);
211
207
  expect(input).toHaveFocus();
212
208
  });
209
+ describe('disabledMessage', () => {
210
+ // jsdom does not implement the Popover API used by the tooltip, so mock
211
+ // showPopover/hidePopover to toggle a `popover-open` attribute the tests
212
+ // can assert on.
213
+ beforeEach(() => {
214
+ HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
215
+ this.setAttribute('popover-open', '');
216
+ });
217
+ HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
218
+ this.removeAttribute('popover-open');
219
+ });
220
+ });
221
+
222
+ // jsdom popover content is in the DOM but not "visible" in the
223
+ // accessibility tree; use hidden: true to find it.
224
+ const h = {hidden: true} as const;
225
+
226
+ it('shows the reason tooltip on hover when disabled with a reason', async () => {
227
+ render(
228
+ <TimeInput
229
+ label="Time"
230
+ isDisabled
231
+ disabledMessage="You need the Editor role"
232
+ />,
233
+ );
234
+
235
+ const container = screen.getByLabelText('Time')
236
+ .parentElement as HTMLElement;
237
+ const tooltip = screen.getByRole('tooltip', h);
238
+ expect(tooltip).toHaveTextContent('You need the Editor role');
239
+
240
+ fireEvent.mouseEnter(container);
241
+ await waitFor(() => {
242
+ expect(tooltip).toHaveAttribute('popover-open');
243
+ });
244
+
245
+ fireEvent.mouseLeave(container);
246
+ await waitFor(() => {
247
+ expect(tooltip).not.toHaveAttribute('popover-open');
248
+ });
249
+ });
250
+
251
+ it('shows the reason tooltip on keyboard focus', async () => {
252
+ const user = userEvent.setup();
253
+ render(
254
+ <TimeInput
255
+ label="Time"
256
+ isDisabled
257
+ disabledMessage="You need the Editor role"
258
+ />,
259
+ );
260
+
261
+ const tooltip = screen.getByRole('tooltip', h);
262
+ await user.tab();
263
+ expect(screen.getByLabelText('Time')).toHaveFocus();
264
+ await waitFor(() => {
265
+ expect(tooltip).toHaveAttribute('popover-open');
266
+ });
267
+ });
268
+
269
+ it('does not render a tooltip when not disabled', () => {
270
+ render(
271
+ <TimeInput label="Time" disabledMessage="You need the Editor role" />,
272
+ );
273
+ expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
274
+ });
275
+
276
+ it('does not render a tooltip when disabled without a reason', () => {
277
+ render(<TimeInput label="Time" isDisabled />);
278
+ expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
279
+ });
280
+
281
+ it('keeps the input focusable via aria-disabled when a reason is provided', () => {
282
+ render(
283
+ <TimeInput
284
+ label="Time"
285
+ isDisabled
286
+ disabledMessage="You need the Editor role"
287
+ />,
288
+ );
289
+ const input = screen.getByLabelText('Time');
290
+ expect(input).not.toBeDisabled();
291
+ expect(input).toHaveAttribute('aria-disabled', 'true');
292
+ expect(input).toHaveAttribute('readonly');
293
+ });
294
+
295
+ it('links the reason tooltip from the input via aria-describedby', () => {
296
+ render(
297
+ <TimeInput
298
+ label="Time"
299
+ isDisabled
300
+ disabledMessage="You need the Editor role"
301
+ />,
302
+ );
303
+ const input = screen.getByLabelText('Time');
304
+ const tooltip = screen.getByRole('tooltip', h);
305
+ expect(input.getAttribute('aria-describedby')).toContain(tooltip.id);
306
+ });
307
+
308
+ it('blocks typing and arrow-key changes while focusable-disabled', async () => {
309
+ const user = userEvent.setup();
310
+ const onChange = vi.fn();
311
+ render(
312
+ <TimeInput
313
+ label="Time"
314
+ onChange={onChange}
315
+ isDisabled
316
+ disabledMessage="You need the Editor role"
317
+ />,
318
+ );
319
+
320
+ const input = screen.getByLabelText('Time');
321
+ await user.type(input, '2:30 PM');
322
+ expect(input).toHaveValue('');
323
+ input.focus();
324
+ fireEvent.keyDown(input, {key: 'ArrowUp'});
325
+ expect(onChange).not.toHaveBeenCalled();
326
+ });
327
+
328
+ it('remains natively disabled when disabled without a reason', () => {
329
+ render(<TimeInput label="Time" isDisabled />);
330
+ const input = screen.getByLabelText('Time');
331
+ expect(input).toBeDisabled();
332
+ expect(input).not.toHaveAttribute('aria-disabled');
333
+ });
334
+
335
+ it('does not swap in the format-hint placeholder on focus while disabled', () => {
336
+ render(
337
+ <TimeInput
338
+ label="Time"
339
+ isDisabled
340
+ disabledMessage="You need the Editor role"
341
+ placeholder="Select a time"
342
+ />,
343
+ );
344
+ const input = screen.getByLabelText('Time');
345
+ input.focus();
346
+ fireEvent.focus(input);
347
+ expect(input).toHaveAttribute('placeholder', 'Select a time');
348
+ });
349
+ });
213
350
  });