@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
@@ -44,14 +44,12 @@ import {
44
44
  inputStatusFocusWithinStyles,
45
45
  } from '../Field';
46
46
  import {Icon} from '../Icon';
47
+ import {VisuallyHidden} from '../VisuallyHidden';
47
48
  import {Spinner} from '../Spinner';
48
- import {
49
- Calendar,
50
- type ISODateString,
51
- type CalendarHandle,
52
- } from '../Calendar';
49
+ import {Calendar, type ISODateString, type CalendarHandle} from '../Calendar';
53
50
  import {useCalendarConstraints} from '../Calendar/hooks';
54
51
  import {usePopover} from '../Popover';
52
+ import {useTooltip} from '../Tooltip';
55
53
  import {parseDateInput} from '../utils';
56
54
  import {
57
55
  plainDateFromISO,
@@ -177,6 +175,29 @@ export interface DateInputProps extends Omit<
177
175
  */
178
176
  isDisabled?: boolean;
179
177
 
178
+ /**
179
+ * Explains why the input is disabled. When set together with
180
+ * `isDisabled`, the input shows a tooltip with this text on hover and
181
+ * keyboard focus, and the field stays focusable (via `aria-disabled`)
182
+ * so the reason is discoverable by keyboard and assistive technology.
183
+ * Typing and calendar activation stay blocked.
184
+ *
185
+ * Use this instead of wrapping a disabled input in `Tooltip` — disabled
186
+ * controls don't emit the pointer events an external tooltip needs.
187
+ *
188
+ * @example
189
+ * ```
190
+ * <DateInput
191
+ * label="Event date"
192
+ * value={date}
193
+ * onChange={setDate}
194
+ * isDisabled
195
+ * disabledMessage="You need the Editor role to change this"
196
+ * />
197
+ * ```
198
+ */
199
+ disabledMessage?: string;
200
+
180
201
  /**
181
202
  * The selected date in ISO format (YYYY-MM-DD).
182
203
  */
@@ -279,6 +300,7 @@ export function DateInput({
279
300
  isOptional = false,
280
301
  isRequired = false,
281
302
  isDisabled = false,
303
+ disabledMessage,
282
304
  value,
283
305
  onChange,
284
306
  changeAction,
@@ -311,6 +333,22 @@ export function DateInput({
311
333
  const isBusy = isLoading || optimisticValue !== value;
312
334
  const isEffectivelyDisabled = isDisabled || isBusy;
313
335
 
336
+ // Disabled-reason tooltip. Disabled controls swallow pointer events, so the
337
+ // tooltip listeners attach to the input container (which already exists) and
338
+ // the text input stays perceivable via aria-disabled instead of the disabled
339
+ // attribute. Typing is blocked with readOnly and value mutation guards;
340
+ // calendar activation is blocked by the isEffectivelyDisabled guards. Only
341
+ // the persistent isDisabled state (not the transient busy state) surfaces a
342
+ // reason.
343
+ const showsDisabledMessage = isDisabled && !!disabledMessage;
344
+ const disabledMessageTooltip = useTooltip({
345
+ placement: 'above',
346
+ // The container div is not naturally focusable; focusin bubbles up from
347
+ // the input, so always attach focus listeners.
348
+ focusTrigger: 'always',
349
+ isEnabled: showsDisabledMessage,
350
+ });
351
+
314
352
  // Status icon mapping
315
353
  const statusIconMap: Record<InputStatusType, IconName> = {
316
354
  warning: 'warning',
@@ -334,6 +372,7 @@ export function DateInput({
334
372
  [
335
373
  description ? descriptionID : null,
336
374
  status?.message ? statusMessageID : null,
375
+ showsDisabledMessage ? disabledMessageTooltip.describedBy : null,
337
376
  ]
338
377
  .filter(Boolean)
339
378
  .join(' ') || undefined;
@@ -428,6 +467,11 @@ export function DateInput({
428
467
  // Handle input text change - update immediately if valid and allowed
429
468
  const handleInputChange = useCallback(
430
469
  (e: React.ChangeEvent<HTMLInputElement>) => {
470
+ // With a disabledMessage the input drops `disabled` for focusability, so
471
+ // guard value mutation explicitly (readOnly also blocks typing).
472
+ if (isEffectivelyDisabled) {
473
+ return;
474
+ }
431
475
  const newValue = e.target.value;
432
476
  setPendingInput(newValue);
433
477
 
@@ -445,7 +489,7 @@ export function DateInput({
445
489
  calendarRef.current?.navigateTo(parsedISO);
446
490
  }
447
491
  },
448
- [value, fireChange, isDateDisabled],
492
+ [value, fireChange, isDateDisabled, isEffectivelyDisabled],
449
493
  );
450
494
 
451
495
  // Commit pending input (shared by blur and Enter key)
@@ -483,12 +527,22 @@ export function DateInput({
483
527
  if (e.key === 'Escape' && popover.isOpen) {
484
528
  e.preventDefault();
485
529
  popover.hide();
530
+ } else if (
531
+ (e.key === 'ArrowDown' || (e.altKey && e.key === 'ArrowDown')) &&
532
+ !popover.isOpen
533
+ ) {
534
+ // APG combobox: ArrowDown (and Alt+ArrowDown) opens the calendar
535
+ // popover from the keyboard, keeping focus in the input (forms-13).
536
+ e.preventDefault();
537
+ if (!isEffectivelyDisabled) {
538
+ popover.show({skipAutoFocus: true});
539
+ }
486
540
  } else if (e.key === 'Enter') {
487
541
  e.preventDefault();
488
542
  commitPendingInput();
489
543
  }
490
544
  },
491
- [popover, commitPendingInput],
545
+ [popover, commitPendingInput, isEffectivelyDisabled],
492
546
  );
493
547
 
494
548
  return (
@@ -513,7 +567,13 @@ export function DateInput({
513
567
  labelTooltip={labelTooltip}
514
568
  width={width}>
515
569
  <div
516
- ref={popover.triggerRef}
570
+ ref={el => {
571
+ popover.triggerRef(el);
572
+ // Anchor + hover/focus listeners for the disabled-message tooltip.
573
+ // Handlers are gated internally by isEnabled, and anchor names
574
+ // compose, so attaching unconditionally is safe.
575
+ disabledMessageTooltip.ref(el);
576
+ }}
517
577
  {...rest}
518
578
  {...mergeProps(
519
579
  themeProps('date-input', {size, status: status?.type ?? null}),
@@ -551,10 +611,18 @@ export function DateInput({
551
611
  onClick={handleInputClick}
552
612
  onKeyDown={handleInputKeyDown}
553
613
  placeholder={placeholder}
554
- disabled={isEffectivelyDisabled}
614
+ // With a disabledMessage the input keeps focusability via
615
+ // aria-disabled so the reason is focus-discoverable; typing is
616
+ // blocked with readOnly and the mutation guards, and calendar
617
+ // activation is blocked by the isEffectivelyDisabled guards.
618
+ disabled={isEffectivelyDisabled && !showsDisabledMessage}
619
+ aria-disabled={showsDisabledMessage ? 'true' : undefined}
620
+ readOnly={showsDisabledMessage || undefined}
555
621
  aria-describedby={ariaDescribedBy}
556
622
  aria-required={isRequired === true ? 'true' : undefined}
557
- aria-invalid={status?.type === 'error' ? 'true' : undefined}
623
+ aria-invalid={
624
+ status?.type === 'error' || !isInputValid ? 'true' : undefined
625
+ }
558
626
  aria-busy={isBusy || undefined}
559
627
  aria-expanded={popover.isOpen}
560
628
  aria-haspopup="dialog"
@@ -567,6 +635,14 @@ export function DateInput({
567
635
  !isInputValid && styles.inputInvalid,
568
636
  )}
569
637
  />
638
+ {/*
639
+ Live region announcing invalid typed input to assistive technology.
640
+ The value silently reverts on blur, so without this a screen-reader
641
+ user would get no feedback that their entry was rejected (WCAG 3.3.1).
642
+ */}
643
+ <VisuallyHidden as="div" role="alert" aria-live="assertive">
644
+ {!isInputValid ? 'Invalid date' : ''}
645
+ </VisuallyHidden>
570
646
  {hasClear && value !== undefined && !isEffectivelyDisabled && (
571
647
  <button
572
648
  type="button"
@@ -598,6 +674,9 @@ export function DateInput({
598
674
  />,
599
675
  {placement: 'below', alignment: 'start'},
600
676
  )}
677
+
678
+ {showsDisabledMessage &&
679
+ disabledMessageTooltip.renderTooltip(disabledMessage)}
601
680
  </Field>
602
681
  );
603
682
  }
@@ -7,69 +7,271 @@ export const docs = {
7
7
  displayName: 'Date Range Input',
8
8
  group: 'DateInput',
9
9
  category: 'Data Input',
10
- keywords: ["daterangepicker","daterange","range","calendar","filter","analytics","period","schedule"],
10
+ keywords: [
11
+ 'daterangepicker',
12
+ 'daterange',
13
+ 'range',
14
+ 'calendar',
15
+ 'filter',
16
+ 'analytics',
17
+ 'period',
18
+ 'schedule',
19
+ ],
11
20
  props: [
12
- { name: 'label', type: 'string', description: 'Label text.', required: true },
13
- { name: 'isLabelHidden', type: 'boolean', description: 'Visually hide the label.', default: 'false' },
14
- { name: 'description', type: 'string', description: 'Helper text displayed below the label.' },
15
- { name: 'isOptional', type: 'boolean', description: 'Show an "(optional)" indicator.', default: 'false' },
16
- { name: 'isRequired', type: 'boolean', description: 'Mark the field as required.', default: 'false' },
17
- { name: 'isDisabled', type: 'boolean', description: 'Disable the trigger and picker.', default: 'false' },
18
- { name: 'value', type: 'DateRange | null', description: 'Selected date range ({start, end} in ISO format), or null.', required: true },
19
- { name: 'onChange', type: '(value: DateRange | null) => void', description: 'Callback when the range changes. Called with null on clear.', required: true },
20
- { name: 'changeAction', type: '(value: DateRange | null) => void | Promise<void>', description: 'Async action fired after onChange. Drives optimistic UI updates via useTransition.' },
21
- { name: 'isLoading', type: 'boolean', description: 'Whether the input is in a loading state. Disables interaction and shows a spinner.', default: 'false' },
22
- { name: 'min', type: 'ISODateString', description: 'Minimum selectable date.' },
23
- { name: 'max', type: 'ISODateString', description: 'Maximum selectable date.' },
24
- { name: 'dateConstraints', type: 'Array<(date: Date) => boolean>', description: 'Custom constraint functions to disable specific dates.' },
25
- { name: 'presets', type: 'Array<DateRangePreset>', description: 'Preset ranges shown as quick-select options beside the calendar.' },
26
- { name: 'hasClear', type: 'boolean', description: 'Shows a clear button when a range is selected.', default: 'true' },
27
- { name: 'placeholder', type: 'string', description: 'Placeholder text when no range is selected.', default: "'Select date range'" },
28
- { name: 'size', type: "'sm' | 'md' | 'lg'", description: 'Size of the trigger.', default: "'md'" },
29
- { name: 'status', type: 'InputStatus', description: 'Status indicator for error, warning, or success states.' },
30
- { name: 'labelTooltip', type: 'string', description: 'Tooltip text via info icon at label end.' },
31
- { name: 'numberOfMonths', type: '1 | 2', description: 'Number of months in the calendar.', default: '2' },
32
- { name: 'xstyle', type: 'StyleXStyles', description: 'StyleX styles for layout customization.' },
21
+ {name: 'label', type: 'string', description: 'Label text.', required: true},
22
+ {
23
+ name: 'isLabelHidden',
24
+ type: 'boolean',
25
+ description: 'Visually hide the label.',
26
+ default: 'false',
27
+ },
28
+ {
29
+ name: 'description',
30
+ type: 'string',
31
+ description: 'Helper text displayed below the label.',
32
+ },
33
+ {
34
+ name: 'isOptional',
35
+ type: 'boolean',
36
+ description: 'Show an "(optional)" indicator.',
37
+ default: 'false',
38
+ },
39
+ {
40
+ name: 'isRequired',
41
+ type: 'boolean',
42
+ description: 'Mark the field as required.',
43
+ default: 'false',
44
+ },
45
+ {
46
+ name: 'isDisabled',
47
+ type: 'boolean',
48
+ description: 'Disable the trigger and picker.',
49
+ default: 'false',
50
+ },
51
+ {
52
+ name: 'disabledMessage',
53
+ type: 'string',
54
+ description:
55
+ '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 DateRangeInput in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
56
+ },
57
+ {
58
+ name: 'value',
59
+ type: 'DateRange | null',
60
+ description: 'Selected date range ({start, end} in ISO format), or null.',
61
+ required: true,
62
+ },
63
+ {
64
+ name: 'onChange',
65
+ type: '(value: DateRange | null) => void',
66
+ description:
67
+ 'Callback when the range changes. Called with null on clear.',
68
+ required: true,
69
+ },
70
+ {
71
+ name: 'changeAction',
72
+ type: '(value: DateRange | null) => void | Promise<void>',
73
+ description:
74
+ 'Async action fired after onChange. Drives optimistic UI updates via useTransition.',
75
+ },
76
+ {
77
+ name: 'isLoading',
78
+ type: 'boolean',
79
+ description:
80
+ 'Whether the input is in a loading state. Disables interaction and shows a spinner.',
81
+ default: 'false',
82
+ },
83
+ {
84
+ name: 'min',
85
+ type: 'ISODateString',
86
+ description: 'Minimum selectable date.',
87
+ },
88
+ {
89
+ name: 'max',
90
+ type: 'ISODateString',
91
+ description: 'Maximum selectable date.',
92
+ },
93
+ {
94
+ name: 'dateConstraints',
95
+ type: 'Array<(date: Date) => boolean>',
96
+ description: 'Custom constraint functions to disable specific dates.',
97
+ },
98
+ {
99
+ name: 'presets',
100
+ type: 'Array<DateRangePreset>',
101
+ description:
102
+ 'Preset ranges shown as quick-select options beside the calendar.',
103
+ },
104
+ {
105
+ name: 'hasClear',
106
+ type: 'boolean',
107
+ description: 'Shows a clear button when a range is selected.',
108
+ default: 'true',
109
+ },
110
+ {
111
+ name: 'placeholder',
112
+ type: 'string',
113
+ description: 'Placeholder text when no range is selected.',
114
+ default: "'Select date range'",
115
+ },
116
+ {
117
+ name: 'size',
118
+ type: "'sm' | 'md' | 'lg'",
119
+ description: 'Size of the trigger.',
120
+ default: "'md'",
121
+ },
122
+ {
123
+ name: 'status',
124
+ type: 'InputStatus',
125
+ description: 'Status indicator for error, warning, or success states.',
126
+ },
127
+ {
128
+ name: 'labelTooltip',
129
+ type: 'string',
130
+ description: 'Tooltip text via info icon at label end.',
131
+ },
132
+ {
133
+ name: 'numberOfMonths',
134
+ type: '1 | 2',
135
+ description: 'Number of months in the calendar.',
136
+ default: '2',
137
+ },
138
+ {
139
+ name: 'xstyle',
140
+ type: 'StyleXStyles',
141
+ description: 'StyleX styles for layout customization.',
142
+ },
33
143
  ],
34
144
  theming: {
35
145
  targets: [
36
- { className: 'astryx-date-range-input', visualProps: ['size', 'status'] },
146
+ {className: 'astryx-date-range-input', visualProps: ['size', 'status']},
37
147
  ],
38
148
  },
39
149
  usage: {
40
- description: 'DateRangeInput lets users select a start and end date from a dual-month calendar popover. Use it for filtering data by time period, report generation, analytics dashboards, and booking flows.',
150
+ description:
151
+ 'DateRangeInput lets users select a start and end date from a dual-month calendar popover. Use it for filtering data by time period, report generation, analytics dashboards, and booking flows.',
41
152
  bestPractices: [
42
- { guidance: true, description: 'Use presets for common ranges like "Last 7 days" to speed up selection.' },
43
- { guidance: true, description: 'Use min/max to constrain selectable dates to valid ranges.' },
44
- { guidance: true, description: 'Keep hasClear enabled (default) so users can reset the filter.' },
45
- { guidance: true, description: 'Provide clear labels and descriptions so users understand what the range controls.' },
46
- { guidance: false, description: 'Use DateRangeInput when only a single date is needed; use DateInput instead.' },
47
- { guidance: false, description: 'Hide the label without surrounding context that makes the purpose obvious.' },
153
+ {
154
+ guidance: true,
155
+ description:
156
+ 'Use presets for common ranges like "Last 7 days" to speed up selection.',
157
+ },
158
+ {
159
+ guidance: true,
160
+ description:
161
+ 'Use min/max to constrain selectable dates to valid ranges.',
162
+ },
163
+ {
164
+ guidance: true,
165
+ description:
166
+ 'Keep hasClear enabled (default) so users can reset the filter.',
167
+ },
168
+ {
169
+ guidance: true,
170
+ description:
171
+ 'Provide clear labels and descriptions so users understand what the range controls.',
172
+ },
173
+ {
174
+ guidance: false,
175
+ description:
176
+ 'Use DateRangeInput when only a single date is needed; use DateInput instead.',
177
+ },
178
+ {
179
+ guidance: false,
180
+ description:
181
+ 'Hide the label without surrounding context that makes the purpose obvious.',
182
+ },
183
+ {
184
+ guidance: false,
185
+ description:
186
+ 'Wrap a disabled DateRangeInput in Tooltip to explain why it is disabled; disabled triggers swallow the hover events the wrapper needs. Use the disabledMessage prop instead.',
187
+ },
48
188
  ],
49
189
  anatomy: [
50
- { name: 'Label', required: true, description: 'Text above the trigger describing what date range is expected.' },
51
- { name: 'Trigger button', required: true, description: 'A button showing the formatted range or placeholder. Clicking opens the popover.' },
52
- { name: 'Calendar icon', required: true, description: 'A trailing icon that also opens the popover.' },
53
- { name: 'Calendar popover', required: true, description: 'A dual-month calendar grid with range selection and hover preview.' },
54
- { name: 'Preset sidebar', required: false, description: 'A list of preset range options beside the calendar.' },
55
- { name: 'Clear button', required: false, description: 'A × button that resets the range to null.' },
56
- { name: 'Status message', required: false, description: 'An error, warning, or success message below the trigger.' },
190
+ {
191
+ name: 'Label',
192
+ required: true,
193
+ description:
194
+ 'Text above the trigger describing what date range is expected.',
195
+ },
196
+ {
197
+ name: 'Trigger button',
198
+ required: true,
199
+ description:
200
+ 'A button showing the formatted range or placeholder. Clicking opens the popover.',
201
+ },
202
+ {
203
+ name: 'Calendar icon',
204
+ required: true,
205
+ description: 'A trailing icon that also opens the popover.',
206
+ },
207
+ {
208
+ name: 'Calendar popover',
209
+ required: true,
210
+ description:
211
+ 'A dual-month calendar grid with range selection and hover preview.',
212
+ },
213
+ {
214
+ name: 'Preset sidebar',
215
+ required: false,
216
+ description: 'A list of preset range options beside the calendar.',
217
+ },
218
+ {
219
+ name: 'Clear button',
220
+ required: false,
221
+ description: 'A × button that resets the range to null.',
222
+ },
223
+ {
224
+ name: 'Status message',
225
+ required: false,
226
+ description: 'An error, warning, or success message below the trigger.',
227
+ },
57
228
  ],
58
229
  },
59
230
  };
60
231
 
61
232
  /** @type {import('../docs-types').TranslationDoc} */
62
233
  export const docsDense = {
63
- description: 'date range picker with dual-month calendar popover and preset ranges',
234
+ description:
235
+ 'date range picker with dual-month calendar popover and preset ranges',
64
236
  usage: {
65
- description: 'DateRangeInput lets users select start+end dates from a dual-month calendar. Use for filtering, reports, analytics, and booking.',
237
+ description:
238
+ 'DateRangeInput lets users select start+end dates from a dual-month calendar. Use for filtering, reports, analytics, and booking.',
66
239
  bestPractices: [
67
- { guidance: true, description: 'Use presets for common ranges like "Last 7 days" to speed up selection.' },
68
- { guidance: true, description: 'Use min/max to constrain selectable dates to valid ranges.' },
69
- { guidance: true, description: 'Keep hasClear enabled (default) so users can reset the filter.' },
70
- { guidance: true, description: 'Provide clear labels + descriptions so users understand what the range controls.' },
71
- { guidance: false, description: 'Use DateRangeInput when only a single date is needed; use DateInput instead.' },
72
- { guidance: false, description: 'Hide the label without surrounding context that makes the purpose obvious.' },
240
+ {
241
+ guidance: true,
242
+ description:
243
+ 'Use presets for common ranges like "Last 7 days" to speed up selection.',
244
+ },
245
+ {
246
+ guidance: true,
247
+ description:
248
+ 'Use min/max to constrain selectable dates to valid ranges.',
249
+ },
250
+ {
251
+ guidance: true,
252
+ description:
253
+ 'Keep hasClear enabled (default) so users can reset the filter.',
254
+ },
255
+ {
256
+ guidance: true,
257
+ description:
258
+ 'Provide clear labels + descriptions so users understand what the range controls.',
259
+ },
260
+ {
261
+ guidance: false,
262
+ description:
263
+ 'Use DateRangeInput when only a single date is needed; use DateInput instead.',
264
+ },
265
+ {
266
+ guidance: false,
267
+ description:
268
+ 'Hide the label without surrounding context that makes the purpose obvious.',
269
+ },
270
+ {
271
+ guidance: false,
272
+ description:
273
+ 'Wrap a disabled DateRangeInput in Tooltip to explain why it is disabled; disabled triggers swallow the hover events the wrapper needs. Use the disabledMessage prop instead.',
274
+ },
73
275
  ],
74
276
  },
75
277
  propDescriptions: {
@@ -79,6 +281,8 @@ export const docsDense = {
79
281
  isOptional: 'show "(optional)" indicator',
80
282
  isRequired: 'mark field required',
81
283
  isDisabled: 'disable trigger+picker',
284
+ disabledMessage:
285
+ 'reason shown in a tooltip on hover/focus when disabled; keeps trigger focusable via aria-disabled',
82
286
  value: 'selected range {start, end} or null',
83
287
  onChange: 'callback on range change; null on clear',
84
288
  min: 'min selectable date',
@@ -91,7 +295,8 @@ export const docsDense = {
91
295
  status: 'error/warning/success status',
92
296
  labelTooltip: 'tooltip via info icon at label end',
93
297
  numberOfMonths: 'months in calendar (default 2)',
94
- changeAction: 'async action fired after onChange; drives optimistic UI updates via useTransition',
298
+ changeAction:
299
+ 'async action fired after onChange; drives optimistic UI updates via useTransition',
95
300
  isLoading: 'loading state; disables interaction + shows a spinner',
96
301
  xstyle: 'StyleX styles for layout',
97
302
  },