@astryxdesign/core 0.1.2 → 0.1.3-canary.6d57c8d

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 (567) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README.md +12 -12
  3. package/dist/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/Avatar/Avatar.js +11 -5
  5. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
  6. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  7. package/dist/Breadcrumbs/BreadcrumbItem.js +24 -5
  8. package/dist/Button/Button.d.ts.map +1 -1
  9. package/dist/Button/Button.js +2 -4
  10. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  11. package/dist/ButtonGroup/ButtonGroup.js +0 -1
  12. package/dist/Calendar/Calendar.d.ts +5 -4
  13. package/dist/Calendar/Calendar.d.ts.map +1 -1
  14. package/dist/Calendar/Calendar.js +82 -43
  15. package/dist/Calendar/hooks/index.d.ts +0 -2
  16. package/dist/Calendar/hooks/index.d.ts.map +1 -1
  17. package/dist/Calendar/hooks/index.js +1 -2
  18. package/dist/Calendar/index.d.ts +3 -3
  19. package/dist/Calendar/index.d.ts.map +1 -1
  20. package/dist/Calendar/index.js +1 -1
  21. package/dist/Calendar/styles.d.ts +3 -9
  22. package/dist/Calendar/styles.d.ts.map +1 -1
  23. package/dist/Calendar/styles.js +3 -11
  24. package/dist/Carousel/Carousel.d.ts.map +1 -1
  25. package/dist/Carousel/Carousel.js +17 -3
  26. package/dist/Center/Center.d.ts +11 -1
  27. package/dist/Center/Center.d.ts.map +1 -1
  28. package/dist/Center/Center.js +9 -3
  29. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  30. package/dist/Chat/ChatComposerInput.js +0 -1
  31. package/dist/Chat/ChatMessageList.d.ts +14 -1
  32. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  33. package/dist/Chat/ChatMessageList.js +2 -0
  34. package/dist/Chat/useTriggerMenu.d.ts +8 -1
  35. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  36. package/dist/Chat/useTriggerMenu.js +15 -3
  37. package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
  38. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  39. package/dist/CheckboxInput/CheckboxInput.js +51 -9
  40. package/dist/CheckboxList/CheckboxList.d.ts +13 -1
  41. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  42. package/dist/CheckboxList/CheckboxList.js +39 -9
  43. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  44. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  45. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  46. package/dist/CheckboxList/CheckboxListItem.js +0 -1
  47. package/dist/Citation/Citation.d.ts.map +1 -1
  48. package/dist/Citation/Citation.js +9 -5
  49. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  50. package/dist/CodeBlock/CodeBlock.js +51 -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 +167 -99
  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/Field/Field.d.ts +19 -2
  71. package/dist/Field/Field.d.ts.map +1 -1
  72. package/dist/Field/Field.js +4 -0
  73. package/dist/Field/FieldLabel.d.ts +21 -2
  74. package/dist/Field/FieldLabel.d.ts.map +1 -1
  75. package/dist/Field/FieldLabel.js +41 -26
  76. package/dist/FileInput/FileInput.d.ts +22 -1
  77. package/dist/FileInput/FileInput.d.ts.map +1 -1
  78. package/dist/FileInput/FileInput.js +56 -10
  79. package/dist/Grid/Grid.d.ts +11 -1
  80. package/dist/Grid/Grid.d.ts.map +1 -1
  81. package/dist/Grid/Grid.js +32 -6
  82. package/dist/InputGroup/InputGroup.d.ts +4 -3
  83. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  84. package/dist/InputGroup/InputGroup.js +16 -6
  85. package/dist/InputGroup/InputGroupContext.d.ts +4 -0
  86. package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
  87. package/dist/InputGroup/InputGroupContext.js +2 -2
  88. package/dist/InputGroup/groupStyles.d.ts +1 -1
  89. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  90. package/dist/InputGroup/groupStyles.js +3 -3
  91. package/dist/InputGroup/index.d.ts +1 -0
  92. package/dist/InputGroup/index.d.ts.map +1 -1
  93. package/dist/Kbd/Kbd.d.ts.map +1 -1
  94. package/dist/Kbd/Kbd.js +33 -1
  95. package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
  96. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  97. package/dist/Layer/layerAnimations.stylex.js +8 -4
  98. package/dist/Layer/useLayer.d.ts +10 -0
  99. package/dist/Layer/useLayer.d.ts.map +1 -1
  100. package/dist/Layer/useLayer.js +64 -9
  101. package/dist/Layout/Layout.d.ts +4 -11
  102. package/dist/Layout/Layout.d.ts.map +1 -1
  103. package/dist/Layout/Layout.js +10 -11
  104. package/dist/Layout/LayoutFooter.d.ts +2 -2
  105. package/dist/Layout/LayoutFooter.d.ts.map +1 -1
  106. package/dist/Layout/LayoutHeader.d.ts +2 -2
  107. package/dist/Layout/LayoutHeader.d.ts.map +1 -1
  108. package/dist/Layout/LayoutPanel.d.ts +2 -2
  109. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  110. package/dist/Layout/padding.stylex.d.ts +51 -0
  111. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  112. package/dist/Layout/padding.stylex.js +63 -0
  113. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  114. package/dist/Lightbox/Lightbox.js +4 -2
  115. package/dist/Link/Link.d.ts +16 -1
  116. package/dist/Link/Link.d.ts.map +1 -1
  117. package/dist/Link/Link.js +18 -7
  118. package/dist/Markdown/Markdown.d.ts.map +1 -1
  119. package/dist/Markdown/Markdown.js +7 -0
  120. package/dist/MoreMenu/MoreMenu.d.ts +1 -7
  121. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  122. package/dist/MoreMenu/MoreMenu.js +0 -2
  123. package/dist/MultiSelector/MultiSelector.d.ts +27 -2
  124. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  125. package/dist/MultiSelector/MultiSelector.js +141 -42
  126. package/dist/MultiSelector/hooks.d.ts +12 -1
  127. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  128. package/dist/MultiSelector/hooks.js +14 -1
  129. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  130. package/dist/NavMenu/NavHeadingMenu.js +34 -3
  131. package/dist/NumberInput/NumberInput.d.ts +23 -2
  132. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  133. package/dist/NumberInput/NumberInput.js +62 -12
  134. package/dist/Pagination/Pagination.d.ts +1 -1
  135. package/dist/Pagination/Pagination.d.ts.map +1 -1
  136. package/dist/Pagination/Pagination.js +15 -1
  137. package/dist/Popover/Popover.d.ts +18 -2
  138. package/dist/Popover/Popover.d.ts.map +1 -1
  139. package/dist/Popover/Popover.js +5 -2
  140. package/dist/Popover/usePopover.d.ts +38 -3
  141. package/dist/Popover/usePopover.d.ts.map +1 -1
  142. package/dist/Popover/usePopover.js +24 -9
  143. package/dist/PowerSearch/PowerSearch.d.ts +11 -1
  144. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  145. package/dist/PowerSearch/PowerSearch.js +6 -1
  146. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  147. package/dist/ProgressBar/ProgressBar.js +3 -5
  148. package/dist/RadioList/RadioList.d.ts +20 -2
  149. package/dist/RadioList/RadioList.d.ts.map +1 -1
  150. package/dist/RadioList/RadioList.js +105 -9
  151. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  152. package/dist/RadioList/RadioListItem.js +13 -2
  153. package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
  154. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  155. package/dist/SegmentedControl/SegmentedControl.js +78 -44
  156. package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
  157. package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  158. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  159. package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
  160. package/dist/Selector/Selector.d.ts +24 -1
  161. package/dist/Selector/Selector.d.ts.map +1 -1
  162. package/dist/Selector/Selector.js +122 -43
  163. package/dist/Selector/hooks.d.ts +8 -1
  164. package/dist/Selector/hooks.d.ts.map +1 -1
  165. package/dist/Selector/hooks.js +14 -1
  166. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  167. package/dist/SideNav/SideNavHeading.js +2 -0
  168. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  169. package/dist/SideNav/SideNavItem.js +1 -1
  170. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  171. package/dist/Skeleton/Skeleton.js +8 -2
  172. package/dist/Slider/Slider.d.ts +21 -0
  173. package/dist/Slider/Slider.d.ts.map +1 -1
  174. package/dist/Slider/Slider.js +36 -9
  175. package/dist/Spinner/Spinner.d.ts.map +1 -1
  176. package/dist/Spinner/Spinner.js +1 -1
  177. package/dist/Stack/Stack.d.ts +38 -23
  178. package/dist/Stack/Stack.d.ts.map +1 -1
  179. package/dist/Stack/Stack.js +25 -1
  180. package/dist/Stack/StackItem.d.ts +12 -23
  181. package/dist/Stack/StackItem.d.ts.map +1 -1
  182. package/dist/Stack/StackItem.js +8 -1
  183. package/dist/Switch/Switch.d.ts +23 -2
  184. package/dist/Switch/Switch.d.ts.map +1 -1
  185. package/dist/Switch/Switch.js +41 -11
  186. package/dist/TabList/Tab.d.ts.map +1 -1
  187. package/dist/TabList/Tab.js +6 -0
  188. package/dist/TabList/TabList.d.ts +16 -4
  189. package/dist/TabList/TabList.d.ts.map +1 -1
  190. package/dist/TabList/TabList.js +87 -10
  191. package/dist/TabList/TabListContext.d.ts +5 -0
  192. package/dist/TabList/TabListContext.d.ts.map +1 -1
  193. package/dist/TabList/TabListContext.js +5 -0
  194. package/dist/TabList/TabMenu.d.ts.map +1 -1
  195. package/dist/TabList/TabMenu.js +6 -1
  196. package/dist/Table/BaseTable.d.ts.map +1 -1
  197. package/dist/Table/BaseTable.js +11 -8
  198. package/dist/Table/Table.d.ts.map +1 -1
  199. package/dist/Table/Table.js +10 -1
  200. package/dist/Table/TableCell.d.ts +8 -1
  201. package/dist/Table/TableCell.d.ts.map +1 -1
  202. package/dist/Table/TableCell.js +10 -10
  203. package/dist/Table/TableHeaderCell.d.ts +8 -1
  204. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  205. package/dist/Table/TableHeaderCell.js +16 -16
  206. package/dist/Table/index.d.ts +2 -1
  207. package/dist/Table/index.d.ts.map +1 -1
  208. package/dist/Table/index.js +2 -2
  209. package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
  210. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  211. package/dist/Table/plugins/pagination/paginateData.js +8 -3
  212. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  213. package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
  214. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  215. package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
  216. package/dist/Table/tableContextMenu.d.ts +33 -0
  217. package/dist/Table/tableContextMenu.d.ts.map +1 -0
  218. package/dist/Table/tableContextMenu.js +133 -0
  219. package/dist/Table/types.d.ts +66 -0
  220. package/dist/Table/types.d.ts.map +1 -1
  221. package/dist/TextArea/TextArea.d.ts +22 -1
  222. package/dist/TextArea/TextArea.d.ts.map +1 -1
  223. package/dist/TextArea/TextArea.js +41 -9
  224. package/dist/TextInput/TextInput.d.ts +23 -2
  225. package/dist/TextInput/TextInput.d.ts.map +1 -1
  226. package/dist/TextInput/TextInput.js +55 -10
  227. package/dist/TimeInput/TimeInput.d.ts +23 -1
  228. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  229. package/dist/TimeInput/TimeInput.js +147 -76
  230. package/dist/Toast/Toast.d.ts.map +1 -1
  231. package/dist/Toast/Toast.js +14 -0
  232. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  233. package/dist/Toast/ToastViewport.js +131 -3
  234. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  235. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  236. package/dist/Tokenizer/Tokenizer.js +26 -4
  237. package/dist/Toolbar/Toolbar.d.ts +3 -3
  238. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  239. package/dist/Toolbar/Toolbar.js +51 -7
  240. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  241. package/dist/Tooltip/useTooltip.js +56 -9
  242. package/dist/TopNav/TopNavHeading.d.ts +7 -1
  243. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  244. package/dist/TopNav/TopNavHeading.js +8 -0
  245. package/dist/TreeList/TreeList.d.ts +1 -1
  246. package/dist/TreeList/TreeList.d.ts.map +1 -1
  247. package/dist/TreeList/TreeList.js +72 -2
  248. package/dist/TreeList/TreeListItem.d.ts +11 -1
  249. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  250. package/dist/TreeList/TreeListItem.js +51 -12
  251. package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
  252. package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
  253. package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
  254. package/dist/Typeahead/BaseTypeahead.d.ts +13 -0
  255. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  256. package/dist/Typeahead/BaseTypeahead.js +69 -6
  257. package/dist/Typeahead/Typeahead.d.ts +26 -3
  258. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  259. package/dist/Typeahead/Typeahead.js +65 -29
  260. package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
  261. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  262. package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
  263. package/dist/VisuallyHidden/index.d.ts +11 -0
  264. package/dist/VisuallyHidden/index.d.ts.map +1 -0
  265. package/dist/VisuallyHidden/index.js +13 -0
  266. package/dist/astryx.css +18 -0
  267. package/dist/astryx.umd.js +55 -55
  268. package/dist/astryx.umd.js.map +4 -4
  269. package/dist/hooks/focusableSelector.d.ts +22 -0
  270. package/dist/hooks/focusableSelector.d.ts.map +1 -0
  271. package/dist/hooks/focusableSelector.js +24 -0
  272. package/dist/hooks/index.d.ts +12 -2
  273. package/dist/hooks/index.d.ts.map +1 -1
  274. package/dist/hooks/index.js +7 -2
  275. package/dist/hooks/useAnnounce.d.ts +40 -0
  276. package/dist/hooks/useAnnounce.d.ts.map +1 -0
  277. package/dist/hooks/useAnnounce.js +142 -0
  278. package/dist/hooks/useClickableContainer.d.ts +16 -1
  279. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  280. package/dist/hooks/useClickableContainer.js +16 -4
  281. package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
  282. package/dist/hooks/useEntryAnimation.js +4 -4
  283. package/dist/hooks/useFocusTrap.d.ts +18 -0
  284. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  285. package/dist/hooks/useFocusTrap.js +87 -3
  286. package/dist/hooks/useGridFocus.d.ts +88 -1
  287. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  288. package/dist/hooks/useGridFocus.js +261 -62
  289. package/dist/hooks/useKeyboardHint.d.ts +82 -0
  290. package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
  291. package/dist/hooks/useKeyboardHint.js +220 -0
  292. package/dist/hooks/useListFocus.d.ts +78 -7
  293. package/dist/hooks/useListFocus.d.ts.map +1 -1
  294. package/dist/hooks/useListFocus.js +305 -52
  295. package/dist/hooks/useLongPress.d.ts +21 -0
  296. package/dist/hooks/useLongPress.d.ts.map +1 -0
  297. package/dist/hooks/useLongPress.js +89 -0
  298. package/dist/hooks/useTreeFocus.d.ts +157 -0
  299. package/dist/hooks/useTreeFocus.d.ts.map +1 -0
  300. package/dist/hooks/useTreeFocus.js +337 -0
  301. package/dist/hooks/useTypeahead.d.ts +63 -0
  302. package/dist/hooks/useTypeahead.d.ts.map +1 -0
  303. package/dist/hooks/useTypeahead.js +117 -0
  304. package/dist/index.d.ts +1 -0
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +1 -0
  307. package/dist/utils/dateTypes.d.ts +12 -0
  308. package/dist/utils/dateTypes.d.ts.map +1 -1
  309. package/dist/utils/dateTypes.js +41 -1
  310. package/dist/utils/index.d.ts +4 -0
  311. package/dist/utils/index.d.ts.map +1 -1
  312. package/dist/utils/index.js +3 -1
  313. package/dist/utils/inputAria.d.ts +29 -0
  314. package/dist/utils/inputAria.d.ts.map +1 -0
  315. package/dist/utils/inputAria.js +30 -0
  316. package/dist/utils/timeParser.d.ts.map +1 -1
  317. package/dist/utils/timeParser.js +5 -2
  318. package/docs.mjs +2 -2
  319. package/package.json +12 -8
  320. package/src/Avatar/Avatar.test.tsx +37 -0
  321. package/src/Avatar/Avatar.tsx +10 -5
  322. package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
  323. package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
  324. package/src/Button/Button.tsx +3 -16
  325. package/src/ButtonGroup/ButtonGroup.test.tsx +9 -9
  326. package/src/ButtonGroup/ButtonGroup.tsx +0 -1
  327. package/src/Calendar/Calendar.doc.mjs +4 -4
  328. package/src/Calendar/Calendar.test.tsx +168 -30
  329. package/src/Calendar/Calendar.tsx +121 -66
  330. package/src/Calendar/hooks/index.ts +0 -6
  331. package/src/Calendar/index.ts +1 -3
  332. package/src/Calendar/styles.ts +4 -9
  333. package/src/Carousel/Carousel.doc.mjs +7 -1
  334. package/src/Carousel/Carousel.test.tsx +20 -0
  335. package/src/Carousel/Carousel.tsx +16 -1
  336. package/src/Center/Center.doc.mjs +12 -2
  337. package/src/Center/Center.tsx +28 -3
  338. package/src/Chat/ChatComposerInput.test.tsx +26 -7
  339. package/src/Chat/ChatComposerInput.tsx +0 -1
  340. package/src/Chat/ChatDictationButton.doc.mjs +1 -1
  341. package/src/Chat/ChatMessageList.doc.mjs +8 -0
  342. package/src/Chat/ChatMessageList.test.tsx +18 -0
  343. package/src/Chat/ChatMessageList.tsx +16 -0
  344. package/src/Chat/useTriggerMenu.tsx +22 -4
  345. package/src/CheckboxInput/CheckboxInput.doc.mjs +10 -0
  346. package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
  347. package/src/CheckboxInput/CheckboxInput.tsx +78 -6
  348. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  349. package/src/CheckboxList/CheckboxList.test.tsx +192 -26
  350. package/src/CheckboxList/CheckboxList.tsx +56 -3
  351. package/src/CheckboxList/CheckboxListContext.tsx +7 -0
  352. package/src/CheckboxList/CheckboxListItem.tsx +0 -3
  353. package/src/Citation/Citation.doc.mjs +10 -0
  354. package/src/Citation/Citation.test.tsx +121 -0
  355. package/src/Citation/Citation.tsx +15 -3
  356. package/src/CodeBlock/CodeBlock.test.tsx +115 -0
  357. package/src/CodeBlock/CodeBlock.tsx +63 -33
  358. package/src/CommandPalette/CommandPalette.test.tsx +47 -1
  359. package/src/CommandPalette/CommandPalette.tsx +9 -21
  360. package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
  361. package/src/ContextMenu/ContextMenu.test.tsx +155 -1
  362. package/src/ContextMenu/ContextMenu.tsx +113 -16
  363. package/src/DateInput/DateInput.doc.mjs +286 -56
  364. package/src/DateInput/DateInput.test.tsx +248 -2
  365. package/src/DateInput/DateInput.tsx +196 -100
  366. package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
  367. package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
  368. package/src/DateRangeInput/DateRangeInput.tsx +63 -5
  369. package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
  370. package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
  371. package/src/DateTimeInput/DateTimeInput.tsx +125 -17
  372. package/src/Dialog/Dialog.doc.mjs +2 -2
  373. package/src/Dialog/Dialog.tsx +12 -0
  374. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
  375. package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
  376. package/src/DropdownMenu/DropdownMenu.tsx +52 -18
  377. package/src/Field/Field.doc.mjs +59 -18
  378. package/src/Field/Field.test.tsx +32 -0
  379. package/src/Field/Field.tsx +23 -5
  380. package/src/Field/FieldLabel.tsx +55 -17
  381. package/src/FileInput/FileInput.doc.mjs +17 -0
  382. package/src/FileInput/FileInput.test.tsx +283 -49
  383. package/src/FileInput/FileInput.tsx +76 -4
  384. package/src/Grid/Grid.doc.mjs +17 -4
  385. package/src/Grid/Grid.test.tsx +43 -30
  386. package/src/Grid/Grid.tsx +38 -3
  387. package/src/Icon/Icon.doc.mjs +3 -3
  388. package/src/InputGroup/InputGroup.doc.mjs +111 -23
  389. package/src/InputGroup/InputGroup.test.tsx +257 -60
  390. package/src/InputGroup/InputGroup.tsx +23 -5
  391. package/src/InputGroup/InputGroupContext.ts +9 -4
  392. package/src/InputGroup/groupStyles.ts +7 -1
  393. package/src/InputGroup/index.ts +1 -0
  394. package/src/Kbd/Kbd.test.tsx +22 -4
  395. package/src/Kbd/Kbd.tsx +35 -3
  396. package/src/Layer/layerAnimations.stylex.ts +20 -4
  397. package/src/Layer/useLayer.doc.mjs +5 -0
  398. package/src/Layer/useLayer.test.tsx +111 -0
  399. package/src/Layer/useLayer.tsx +90 -9
  400. package/src/Layout/Layout.tsx +8 -16
  401. package/src/Layout/LayoutFooter.doc.mjs +4 -4
  402. package/src/Layout/LayoutFooter.tsx +3 -3
  403. package/src/Layout/LayoutHeader.doc.mjs +4 -4
  404. package/src/Layout/LayoutHeader.tsx +3 -3
  405. package/src/Layout/LayoutPanel.tsx +3 -3
  406. package/src/Layout/padding.stylex.ts +52 -0
  407. package/src/Lightbox/Lightbox.doc.mjs +9 -0
  408. package/src/Lightbox/Lightbox.test.tsx +53 -5
  409. package/src/Lightbox/Lightbox.tsx +9 -4
  410. package/src/Link/Link.doc.mjs +14 -0
  411. package/src/Link/Link.test.tsx +50 -0
  412. package/src/Link/Link.tsx +39 -4
  413. package/src/Markdown/Markdown.test.tsx +11 -0
  414. package/src/Markdown/Markdown.tsx +7 -0
  415. package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
  416. package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
  417. package/src/MoreMenu/MoreMenu.tsx +0 -9
  418. package/src/MultiSelector/MultiSelector.doc.mjs +30 -0
  419. package/src/MultiSelector/MultiSelector.test.tsx +375 -8
  420. package/src/MultiSelector/MultiSelector.tsx +194 -48
  421. package/src/MultiSelector/hooks.ts +27 -0
  422. package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
  423. package/src/NavMenu/NavHeadingMenu.tsx +50 -3
  424. package/src/NumberInput/NumberInput.doc.mjs +17 -0
  425. package/src/NumberInput/NumberInput.test.tsx +242 -40
  426. package/src/NumberInput/NumberInput.tsx +89 -11
  427. package/src/Pagination/Pagination.doc.mjs +3 -3
  428. package/src/Pagination/Pagination.test.tsx +117 -5
  429. package/src/Pagination/Pagination.tsx +21 -1
  430. package/src/Popover/Popover.doc.mjs +26 -0
  431. package/src/Popover/Popover.test.tsx +121 -0
  432. package/src/Popover/Popover.tsx +23 -2
  433. package/src/Popover/usePopover.doc.mjs +9 -3
  434. package/src/Popover/usePopover.tsx +70 -12
  435. package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
  436. package/src/PowerSearch/PowerSearch.test.tsx +97 -1
  437. package/src/PowerSearch/PowerSearch.tsx +16 -3
  438. package/src/ProgressBar/ProgressBar.test.tsx +34 -26
  439. package/src/ProgressBar/ProgressBar.tsx +3 -4
  440. package/src/RadioList/RadioList.doc.mjs +9 -0
  441. package/src/RadioList/RadioList.test.tsx +252 -16
  442. package/src/RadioList/RadioList.tsx +166 -10
  443. package/src/RadioList/RadioListItem.tsx +14 -2
  444. package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
  445. package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
  446. package/src/SegmentedControl/SegmentedControl.tsx +102 -54
  447. package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
  448. package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
  449. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  450. package/src/Selector/Selector.doc.mjs +26 -0
  451. package/src/Selector/Selector.test.tsx +387 -15
  452. package/src/Selector/Selector.tsx +175 -67
  453. package/src/Selector/hooks.ts +23 -0
  454. package/src/SideNav/SideNav.test.tsx +48 -0
  455. package/src/SideNav/SideNavHeading.tsx +8 -2
  456. package/src/SideNav/SideNavItem.tsx +2 -4
  457. package/src/Skeleton/Skeleton.test.tsx +25 -0
  458. package/src/Skeleton/Skeleton.tsx +11 -1
  459. package/src/Slider/Slider.doc.mjs +15 -0
  460. package/src/Slider/Slider.test.tsx +155 -2
  461. package/src/Slider/Slider.tsx +53 -5
  462. package/src/Spinner/Spinner.tsx +7 -1
  463. package/src/Stack/Stack.doc.mjs +77 -0
  464. package/src/Stack/Stack.test.tsx +55 -5
  465. package/src/Stack/Stack.tsx +73 -24
  466. package/src/Stack/StackItem.test.tsx +23 -0
  467. package/src/Stack/StackItem.tsx +20 -23
  468. package/src/Switch/Switch.doc.mjs +15 -0
  469. package/src/Switch/Switch.test.tsx +162 -27
  470. package/src/Switch/Switch.tsx +61 -21
  471. package/src/TabList/Tab.tsx +6 -0
  472. package/src/TabList/TabList.doc.mjs +6 -0
  473. package/src/TabList/TabList.test.tsx +251 -0
  474. package/src/TabList/TabList.tsx +103 -12
  475. package/src/TabList/TabListContext.ts +7 -3
  476. package/src/TabList/TabMenu.tsx +6 -3
  477. package/src/Table/BaseTable.tsx +21 -17
  478. package/src/Table/Table.doc.mjs +2 -0
  479. package/src/Table/Table.test.tsx +10 -0
  480. package/src/Table/Table.tsx +8 -0
  481. package/src/Table/TableCell.tsx +25 -23
  482. package/src/Table/TableHeaderCell.tsx +28 -29
  483. package/src/Table/index.ts +3 -2
  484. package/src/Table/plugins/pagination/paginateData.ts +10 -3
  485. package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
  486. package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
  487. package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
  488. package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
  489. package/src/Table/tableContextMenu.test.tsx +157 -0
  490. package/src/Table/tableContextMenu.tsx +142 -0
  491. package/src/Table/types.ts +74 -0
  492. package/src/Table/useTableColumnResize.doc.mjs +3 -3
  493. package/src/Table/useTableStickyColumns.doc.mjs +2 -2
  494. package/src/Text/Text.doc.mjs +18 -18
  495. package/src/TextArea/TextArea.doc.mjs +17 -0
  496. package/src/TextArea/TextArea.test.tsx +167 -35
  497. package/src/TextArea/TextArea.tsx +62 -15
  498. package/src/TextInput/TextInput.doc.mjs +17 -0
  499. package/src/TextInput/TextInput.test.tsx +168 -34
  500. package/src/TextInput/TextInput.tsx +77 -9
  501. package/src/Thumbnail/Thumbnail.doc.mjs +4 -4
  502. package/src/TimeInput/TimeInput.doc.mjs +340 -60
  503. package/src/TimeInput/TimeInput.test.tsx +255 -7
  504. package/src/TimeInput/TimeInput.tsx +176 -70
  505. package/src/Timestamp/Timestamp.doc.mjs +19 -19
  506. package/src/Toast/Toast.tsx +14 -0
  507. package/src/Toast/ToastViewport.test.tsx +214 -0
  508. package/src/Toast/ToastViewport.tsx +167 -21
  509. package/src/Tokenizer/Tokenizer.doc.mjs +29 -14
  510. package/src/Tokenizer/Tokenizer.test.tsx +105 -1
  511. package/src/Tokenizer/Tokenizer.tsx +37 -1
  512. package/src/Toolbar/Toolbar.test.tsx +109 -6
  513. package/src/Toolbar/Toolbar.tsx +59 -5
  514. package/src/Tooltip/Tooltip.test.tsx +68 -0
  515. package/src/Tooltip/useTooltip.tsx +55 -8
  516. package/src/TopNav/TopNav.test.tsx +50 -0
  517. package/src/TopNav/TopNavHeading.tsx +17 -1
  518. package/src/TreeList/TreeList.test.tsx +295 -6
  519. package/src/TreeList/TreeList.tsx +73 -1
  520. package/src/TreeList/TreeListItem.tsx +51 -5
  521. package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
  522. package/src/Typeahead/BaseTypeahead.tsx +93 -9
  523. package/src/Typeahead/Typeahead.doc.mjs +141 -30
  524. package/src/Typeahead/Typeahead.test.tsx +331 -1
  525. package/src/Typeahead/Typeahead.tsx +105 -33
  526. package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
  527. package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
  528. package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
  529. package/src/VisuallyHidden/index.ts +15 -0
  530. package/src/docs-script.test.mjs +50 -0
  531. package/src/hooks/focusableSelector.ts +25 -0
  532. package/src/hooks/index.ts +28 -2
  533. package/src/hooks/useAnnounce.test.tsx +101 -0
  534. package/src/hooks/useAnnounce.ts +168 -0
  535. package/src/hooks/useClickableContainer.ts +16 -4
  536. package/src/hooks/useEntryAnimation.ts +16 -4
  537. package/src/hooks/useFocusTrap.test.tsx +132 -0
  538. package/src/hooks/useFocusTrap.ts +98 -4
  539. package/src/hooks/useGridFocus.doc.mjs +40 -2
  540. package/src/hooks/useGridFocus.test.tsx +132 -0
  541. package/src/hooks/useGridFocus.ts +343 -67
  542. package/src/hooks/useKeyboardHint.doc.mjs +101 -0
  543. package/src/hooks/useKeyboardHint.test.tsx +70 -0
  544. package/src/hooks/useKeyboardHint.tsx +332 -0
  545. package/src/hooks/useListFocus.doc.mjs +50 -10
  546. package/src/hooks/useListFocus.test.tsx +375 -0
  547. package/src/hooks/useListFocus.ts +395 -57
  548. package/src/hooks/useLongPress.test.tsx +134 -0
  549. package/src/hooks/useLongPress.ts +119 -0
  550. package/src/hooks/useTreeFocus.doc.mjs +140 -0
  551. package/src/hooks/useTreeFocus.test.tsx +214 -0
  552. package/src/hooks/useTreeFocus.ts +559 -0
  553. package/src/hooks/useTypeahead.test.tsx +109 -0
  554. package/src/hooks/useTypeahead.ts +183 -0
  555. package/src/index.ts +1 -0
  556. package/src/theme/derivedVarRegistry.test.ts +10 -5
  557. package/src/utils/dateTypes.test.ts +40 -0
  558. package/src/utils/dateTypes.ts +40 -0
  559. package/src/utils/index.ts +9 -0
  560. package/src/utils/inputAria.test.ts +39 -0
  561. package/src/utils/inputAria.ts +58 -0
  562. package/src/utils/timeParser.test.ts +10 -0
  563. package/src/utils/timeParser.ts +5 -2
  564. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
  565. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
  566. package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
  567. package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
@@ -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
  },
@@ -9,8 +9,9 @@
9
9
  * SYNC: When DateRangeInput.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
+ import userEvent from '@testing-library/user-event';
14
15
  import {DateRangeInput} from './DateRangeInput';
15
16
  import type {DateRange} from './DateRangeInput';
16
17
 
@@ -23,9 +24,7 @@ describe('DateRangeInput', () => {
23
24
  });
24
25
 
25
26
  it('renders placeholder when value is null', () => {
26
- render(
27
- <DateRangeInput label="Range" value={null} onChange={() => {}} />,
28
- );
27
+ render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
29
28
  expect(screen.getByText('Select date range')).toBeInTheDocument();
30
29
  });
31
30
 
@@ -99,9 +98,7 @@ describe('DateRangeInput', () => {
99
98
  });
100
99
 
101
100
  it('does not set aria-required when isRequired is false', () => {
102
- render(
103
- <DateRangeInput label="Range" value={null} onChange={() => {}} />,
104
- );
101
+ render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
105
102
  const trigger = screen.getByRole('button', {name: /Range/});
106
103
  expect(trigger).not.toHaveAttribute('aria-required');
107
104
  });
@@ -120,25 +117,19 @@ describe('DateRangeInput', () => {
120
117
  });
121
118
 
122
119
  it('is not disabled by default', () => {
123
- render(
124
- <DateRangeInput label="Range" value={null} onChange={() => {}} />,
125
- );
120
+ render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
126
121
  const trigger = screen.getByRole('button', {name: /Range/});
127
122
  expect(trigger).not.toBeDisabled();
128
123
  });
129
124
 
130
125
  it('trigger has aria-haspopup="dialog"', () => {
131
- render(
132
- <DateRangeInput label="Range" value={null} onChange={() => {}} />,
133
- );
126
+ render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
134
127
  const trigger = screen.getByRole('button', {name: /Range/});
135
128
  expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
136
129
  });
137
130
 
138
131
  it('trigger has aria-expanded=false by default', () => {
139
- render(
140
- <DateRangeInput label="Range" value={null} onChange={() => {}} />,
141
- );
132
+ render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
142
133
  const trigger = screen.getByRole('button', {name: /Range/});
143
134
  expect(trigger).toHaveAttribute('aria-expanded', 'false');
144
135
  });
@@ -201,9 +192,7 @@ describe('DateRangeInput', () => {
201
192
  });
202
193
 
203
194
  it('calendar icon button is present', () => {
204
- render(
205
- <DateRangeInput label="Range" value={null} onChange={() => {}} />,
206
- );
195
+ render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
207
196
  expect(
208
197
  screen.getByRole('button', {name: 'Open calendar'}),
209
198
  ).toBeInTheDocument();
@@ -321,4 +310,177 @@ describe('DateRangeInput', () => {
321
310
  expect(onChange).toHaveBeenCalledWith(null);
322
311
  });
323
312
  });
313
+
314
+ describe('presets', () => {
315
+ const presets = [
316
+ {
317
+ label: 'Last 7 days',
318
+ getRange: (): DateRange => ({
319
+ start: '2026-03-01',
320
+ end: '2026-03-07',
321
+ }),
322
+ },
323
+ {
324
+ label: 'This month',
325
+ getRange: (): DateRange => ({
326
+ start: '2026-03-01',
327
+ end: '2026-03-31',
328
+ }),
329
+ },
330
+ ];
331
+
332
+ it('renders presets as a labeled group of buttons, not a listbox (forms-5)', () => {
333
+ render(
334
+ <DateRangeInput
335
+ label="Range"
336
+ value={null}
337
+ onChange={() => {}}
338
+ presets={presets}
339
+ />,
340
+ );
341
+ // The preset sidebar is a group of action buttons — not a listbox of
342
+ // options (which would announce a Tab-navigable listbox it isn't).
343
+ expect(
344
+ screen.queryByRole('listbox', {hidden: true}),
345
+ ).not.toBeInTheDocument();
346
+ expect(
347
+ screen.getByRole('group', {name: 'Preset date ranges', hidden: true}),
348
+ ).toBeInTheDocument();
349
+ expect(
350
+ screen.getByRole('button', {name: 'Last 7 days', hidden: true}),
351
+ ).toBeInTheDocument();
352
+ });
353
+
354
+ it('marks the applied preset with aria-current, not aria-selected', () => {
355
+ render(
356
+ <DateRangeInput
357
+ label="Range"
358
+ value={{start: '2026-03-01', end: '2026-03-07'}}
359
+ onChange={() => {}}
360
+ presets={presets}
361
+ />,
362
+ );
363
+ const active = screen.getByRole('button', {
364
+ name: 'Last 7 days',
365
+ hidden: true,
366
+ });
367
+ expect(active).toHaveAttribute('aria-current', 'true');
368
+ expect(active).not.toHaveAttribute('aria-selected');
369
+ const inactive = screen.getByRole('button', {
370
+ name: 'This month',
371
+ hidden: true,
372
+ });
373
+ expect(inactive).not.toHaveAttribute('aria-current');
374
+ });
375
+ });
376
+ describe('disabledMessage', () => {
377
+ // jsdom does not implement the Popover API used by the tooltip, so mock
378
+ // showPopover/hidePopover to toggle a `popover-open` attribute the tests
379
+ // can assert on.
380
+ beforeEach(() => {
381
+ HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
382
+ this.setAttribute('popover-open', '');
383
+ });
384
+ HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
385
+ this.removeAttribute('popover-open');
386
+ });
387
+ });
388
+
389
+ // jsdom popover content is in the DOM but not "visible" in the
390
+ // accessibility tree; use hidden: true to find it.
391
+ const h = {hidden: true} as const;
392
+
393
+ function renderDisabled(props?: {disabledMessage?: string}) {
394
+ return render(
395
+ <DateRangeInput
396
+ label="Range"
397
+ value={null}
398
+ onChange={() => {}}
399
+ isDisabled
400
+ {...props}
401
+ />,
402
+ );
403
+ }
404
+
405
+ it('shows the reason tooltip on hover when disabled with a reason', async () => {
406
+ renderDisabled({disabledMessage: 'You need the Editor role'});
407
+
408
+ const trigger = screen.getByRole('button', {name: /Range:/, ...h});
409
+ const container = trigger.parentElement as HTMLElement;
410
+ const tooltip = screen.getByRole('tooltip', h);
411
+ expect(tooltip).toHaveTextContent('You need the Editor role');
412
+
413
+ fireEvent.mouseEnter(container);
414
+ await waitFor(() => {
415
+ expect(tooltip).toHaveAttribute('popover-open');
416
+ });
417
+
418
+ fireEvent.mouseLeave(container);
419
+ await waitFor(() => {
420
+ expect(tooltip).not.toHaveAttribute('popover-open');
421
+ });
422
+ });
423
+
424
+ it('shows the reason tooltip on keyboard focus', async () => {
425
+ const user = userEvent.setup();
426
+ renderDisabled({disabledMessage: 'You need the Editor role'});
427
+
428
+ const tooltip = screen.getByRole('tooltip', h);
429
+ await user.tab();
430
+ expect(screen.getByRole('button', {name: /Range:/, ...h})).toHaveFocus();
431
+ await waitFor(() => {
432
+ expect(tooltip).toHaveAttribute('popover-open');
433
+ });
434
+ });
435
+
436
+ it('does not render a tooltip when not disabled', () => {
437
+ render(
438
+ <DateRangeInput
439
+ label="Range"
440
+ value={null}
441
+ onChange={() => {}}
442
+ disabledMessage="You need the Editor role"
443
+ />,
444
+ );
445
+ expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
446
+ });
447
+
448
+ it('does not render a tooltip when disabled without a reason', () => {
449
+ renderDisabled();
450
+ expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
451
+ });
452
+
453
+ it('keeps the trigger focusable via aria-disabled when a reason is provided', () => {
454
+ renderDisabled({disabledMessage: 'You need the Editor role'});
455
+ const trigger = screen.getByRole('button', {name: /Range:/, ...h});
456
+ expect(trigger).not.toBeDisabled();
457
+ expect(trigger).toHaveAttribute('aria-disabled', 'true');
458
+ });
459
+
460
+ it('links the reason tooltip from the trigger via aria-describedby', () => {
461
+ renderDisabled({disabledMessage: 'You need the Editor role'});
462
+ const trigger = screen.getByRole('button', {name: /Range:/, ...h});
463
+ const tooltip = screen.getByRole('tooltip', h);
464
+ expect(trigger.getAttribute('aria-describedby')).toContain(tooltip.id);
465
+ });
466
+
467
+ it('blocks activation while focusable-disabled', async () => {
468
+ const user = userEvent.setup();
469
+ renderDisabled({disabledMessage: 'You need the Editor role'});
470
+
471
+ const trigger = screen.getByRole('button', {name: /Range:/, ...h});
472
+ await user.click(trigger);
473
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
474
+
475
+ await user.keyboard('{Enter}');
476
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
477
+ });
478
+
479
+ it('remains natively disabled when disabled without a reason', () => {
480
+ renderDisabled();
481
+ const trigger = screen.getByRole('button', {name: /Range:/, ...h});
482
+ expect(trigger).toBeDisabled();
483
+ expect(trigger).not.toHaveAttribute('aria-disabled');
484
+ });
485
+ });
324
486
  });