@astryxdesign/core 0.1.2 → 0.1.3-canary.102854d

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 (586) 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 +31 -12
  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 +124 -61
  15. package/dist/Calendar/dayCellUtils.d.ts +67 -5
  16. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  17. package/dist/Calendar/dayCellUtils.js +139 -18
  18. package/dist/Calendar/hooks/index.d.ts +0 -2
  19. package/dist/Calendar/hooks/index.d.ts.map +1 -1
  20. package/dist/Calendar/hooks/index.js +1 -2
  21. package/dist/Calendar/index.d.ts +3 -3
  22. package/dist/Calendar/index.d.ts.map +1 -1
  23. package/dist/Calendar/index.js +1 -1
  24. package/dist/Calendar/styles.d.ts +3 -9
  25. package/dist/Calendar/styles.d.ts.map +1 -1
  26. package/dist/Calendar/styles.js +3 -11
  27. package/dist/Carousel/Carousel.d.ts.map +1 -1
  28. package/dist/Carousel/Carousel.js +17 -3
  29. package/dist/Center/Center.d.ts +11 -1
  30. package/dist/Center/Center.d.ts.map +1 -1
  31. package/dist/Center/Center.js +9 -3
  32. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  33. package/dist/Chat/ChatComposerInput.js +0 -1
  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 +8 -1
  38. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  39. package/dist/Chat/useTriggerMenu.js +15 -3
  40. package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
  41. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.js +51 -9
  43. package/dist/CheckboxList/CheckboxList.d.ts +13 -1
  44. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  45. package/dist/CheckboxList/CheckboxList.js +39 -9
  46. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  47. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  48. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  49. package/dist/CheckboxList/CheckboxListItem.js +0 -1
  50. package/dist/Citation/Citation.d.ts.map +1 -1
  51. package/dist/Citation/Citation.js +9 -5
  52. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  53. package/dist/CodeBlock/CodeBlock.js +51 -37
  54. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  55. package/dist/CommandPalette/CommandPalette.js +5 -5
  56. package/dist/ContextMenu/ContextMenu.d.ts +12 -5
  57. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  58. package/dist/ContextMenu/ContextMenu.js +96 -11
  59. package/dist/DateInput/DateInput.d.ts +23 -1
  60. package/dist/DateInput/DateInput.d.ts.map +1 -1
  61. package/dist/DateInput/DateInput.js +167 -99
  62. package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
  63. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  64. package/dist/DateRangeInput/DateRangeInput.js +42 -9
  65. package/dist/DateTimeInput/DateTimeInput.d.ts +35 -2
  66. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  67. package/dist/DateTimeInput/DateTimeInput.js +78 -15
  68. package/dist/Dialog/Dialog.d.ts.map +1 -1
  69. package/dist/Dialog/Dialog.js +12 -0
  70. package/dist/DropdownMenu/DropdownMenu.d.ts +1 -8
  71. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  72. package/dist/DropdownMenu/DropdownMenu.js +42 -14
  73. package/dist/Field/Field.d.ts +19 -2
  74. package/dist/Field/Field.d.ts.map +1 -1
  75. package/dist/Field/Field.js +4 -0
  76. package/dist/Field/FieldLabel.d.ts +21 -2
  77. package/dist/Field/FieldLabel.d.ts.map +1 -1
  78. package/dist/Field/FieldLabel.js +41 -26
  79. package/dist/FileInput/FileInput.d.ts +22 -1
  80. package/dist/FileInput/FileInput.d.ts.map +1 -1
  81. package/dist/FileInput/FileInput.js +56 -10
  82. package/dist/Grid/Grid.d.ts +11 -1
  83. package/dist/Grid/Grid.d.ts.map +1 -1
  84. package/dist/Grid/Grid.js +32 -6
  85. package/dist/InputGroup/InputGroup.d.ts +4 -3
  86. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  87. package/dist/InputGroup/InputGroup.js +16 -6
  88. package/dist/InputGroup/InputGroupContext.d.ts +4 -0
  89. package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
  90. package/dist/InputGroup/InputGroupContext.js +2 -2
  91. package/dist/InputGroup/groupStyles.d.ts +1 -1
  92. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  93. package/dist/InputGroup/groupStyles.js +3 -3
  94. package/dist/InputGroup/index.d.ts +1 -0
  95. package/dist/InputGroup/index.d.ts.map +1 -1
  96. package/dist/Kbd/Kbd.d.ts.map +1 -1
  97. package/dist/Kbd/Kbd.js +33 -1
  98. package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
  99. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  100. package/dist/Layer/layerAnimations.stylex.js +8 -4
  101. package/dist/Layer/useLayer.d.ts +10 -0
  102. package/dist/Layer/useLayer.d.ts.map +1 -1
  103. package/dist/Layer/useLayer.js +64 -9
  104. package/dist/Layout/Layout.d.ts +4 -11
  105. package/dist/Layout/Layout.d.ts.map +1 -1
  106. package/dist/Layout/Layout.js +10 -11
  107. package/dist/Layout/LayoutFooter.d.ts +2 -2
  108. package/dist/Layout/LayoutFooter.d.ts.map +1 -1
  109. package/dist/Layout/LayoutHeader.d.ts +2 -2
  110. package/dist/Layout/LayoutHeader.d.ts.map +1 -1
  111. package/dist/Layout/LayoutPanel.d.ts +2 -2
  112. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  113. package/dist/Layout/padding.stylex.d.ts +51 -0
  114. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  115. package/dist/Layout/padding.stylex.js +63 -0
  116. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  117. package/dist/Lightbox/Lightbox.js +4 -2
  118. package/dist/Link/Link.d.ts +16 -1
  119. package/dist/Link/Link.d.ts.map +1 -1
  120. package/dist/Link/Link.js +18 -7
  121. package/dist/Markdown/Markdown.d.ts.map +1 -1
  122. package/dist/Markdown/Markdown.js +7 -0
  123. package/dist/MoreMenu/MoreMenu.d.ts +1 -7
  124. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  125. package/dist/MoreMenu/MoreMenu.js +0 -2
  126. package/dist/MultiSelector/MultiSelector.d.ts +27 -2
  127. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  128. package/dist/MultiSelector/MultiSelector.js +141 -42
  129. package/dist/MultiSelector/hooks.d.ts +12 -1
  130. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  131. package/dist/MultiSelector/hooks.js +14 -1
  132. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  133. package/dist/NavMenu/NavHeadingMenu.js +34 -3
  134. package/dist/NumberInput/NumberInput.d.ts +23 -2
  135. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  136. package/dist/NumberInput/NumberInput.js +62 -12
  137. package/dist/Pagination/Pagination.d.ts +1 -1
  138. package/dist/Pagination/Pagination.d.ts.map +1 -1
  139. package/dist/Pagination/Pagination.js +15 -1
  140. package/dist/Popover/Popover.d.ts +18 -2
  141. package/dist/Popover/Popover.d.ts.map +1 -1
  142. package/dist/Popover/Popover.js +5 -2
  143. package/dist/Popover/usePopover.d.ts +38 -3
  144. package/dist/Popover/usePopover.d.ts.map +1 -1
  145. package/dist/Popover/usePopover.js +24 -9
  146. package/dist/PowerSearch/PowerSearch.d.ts +11 -1
  147. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  148. package/dist/PowerSearch/PowerSearch.js +6 -1
  149. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  150. package/dist/ProgressBar/ProgressBar.js +3 -5
  151. package/dist/RadioList/RadioList.d.ts +20 -2
  152. package/dist/RadioList/RadioList.d.ts.map +1 -1
  153. package/dist/RadioList/RadioList.js +105 -9
  154. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  155. package/dist/RadioList/RadioListItem.js +13 -2
  156. package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
  157. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  158. package/dist/SegmentedControl/SegmentedControl.js +78 -44
  159. package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
  160. package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  161. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  162. package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
  163. package/dist/Selector/Selector.d.ts +24 -1
  164. package/dist/Selector/Selector.d.ts.map +1 -1
  165. package/dist/Selector/Selector.js +122 -43
  166. package/dist/Selector/hooks.d.ts +8 -1
  167. package/dist/Selector/hooks.d.ts.map +1 -1
  168. package/dist/Selector/hooks.js +14 -1
  169. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  170. package/dist/SideNav/SideNavHeading.js +2 -0
  171. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  172. package/dist/SideNav/SideNavItem.js +1 -1
  173. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  174. package/dist/Skeleton/Skeleton.js +8 -2
  175. package/dist/Slider/Slider.d.ts +21 -0
  176. package/dist/Slider/Slider.d.ts.map +1 -1
  177. package/dist/Slider/Slider.js +36 -9
  178. package/dist/Spinner/Spinner.d.ts.map +1 -1
  179. package/dist/Spinner/Spinner.js +1 -1
  180. package/dist/Stack/Stack.d.ts +38 -23
  181. package/dist/Stack/Stack.d.ts.map +1 -1
  182. package/dist/Stack/Stack.js +25 -1
  183. package/dist/Stack/StackItem.d.ts +12 -23
  184. package/dist/Stack/StackItem.d.ts.map +1 -1
  185. package/dist/Stack/StackItem.js +8 -1
  186. package/dist/Switch/Switch.d.ts +23 -2
  187. package/dist/Switch/Switch.d.ts.map +1 -1
  188. package/dist/Switch/Switch.js +41 -11
  189. package/dist/TabList/Tab.d.ts.map +1 -1
  190. package/dist/TabList/Tab.js +6 -0
  191. package/dist/TabList/TabList.d.ts +16 -4
  192. package/dist/TabList/TabList.d.ts.map +1 -1
  193. package/dist/TabList/TabList.js +87 -10
  194. package/dist/TabList/TabListContext.d.ts +5 -0
  195. package/dist/TabList/TabListContext.d.ts.map +1 -1
  196. package/dist/TabList/TabListContext.js +5 -0
  197. package/dist/TabList/TabMenu.d.ts.map +1 -1
  198. package/dist/TabList/TabMenu.js +6 -1
  199. package/dist/Table/BaseTable.d.ts.map +1 -1
  200. package/dist/Table/BaseTable.js +13 -9
  201. package/dist/Table/Table.d.ts.map +1 -1
  202. package/dist/Table/Table.js +10 -1
  203. package/dist/Table/TableCell.d.ts +8 -1
  204. package/dist/Table/TableCell.d.ts.map +1 -1
  205. package/dist/Table/TableCell.js +79 -10
  206. package/dist/Table/TableHeaderCell.d.ts +8 -1
  207. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  208. package/dist/Table/TableHeaderCell.js +16 -16
  209. package/dist/Table/index.d.ts +4 -1
  210. package/dist/Table/index.d.ts.map +1 -1
  211. package/dist/Table/index.js +3 -2
  212. package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
  213. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  214. package/dist/Table/plugins/pagination/paginateData.js +8 -3
  215. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  216. package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
  217. package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
  218. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
  219. package/dist/Table/plugins/rowExpansion/index.js +3 -0
  220. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
  221. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
  222. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
  223. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  224. package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
  225. package/dist/Table/tableContextMenu.d.ts +37 -0
  226. package/dist/Table/tableContextMenu.d.ts.map +1 -0
  227. package/dist/Table/tableContextMenu.js +140 -0
  228. package/dist/Table/types.d.ts +66 -0
  229. package/dist/Table/types.d.ts.map +1 -1
  230. package/dist/TextArea/TextArea.d.ts +22 -1
  231. package/dist/TextArea/TextArea.d.ts.map +1 -1
  232. package/dist/TextArea/TextArea.js +41 -9
  233. package/dist/TextInput/TextInput.d.ts +23 -2
  234. package/dist/TextInput/TextInput.d.ts.map +1 -1
  235. package/dist/TextInput/TextInput.js +55 -10
  236. package/dist/TimeInput/TimeInput.d.ts +23 -1
  237. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  238. package/dist/TimeInput/TimeInput.js +147 -76
  239. package/dist/Toast/Toast.d.ts.map +1 -1
  240. package/dist/Toast/Toast.js +14 -0
  241. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  242. package/dist/Toast/ToastViewport.js +131 -3
  243. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  244. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  245. package/dist/Tokenizer/Tokenizer.js +26 -4
  246. package/dist/Toolbar/Toolbar.d.ts +3 -3
  247. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  248. package/dist/Toolbar/Toolbar.js +51 -7
  249. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  250. package/dist/Tooltip/useTooltip.js +56 -9
  251. package/dist/TopNav/TopNavHeading.d.ts +7 -1
  252. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  253. package/dist/TopNav/TopNavHeading.js +8 -0
  254. package/dist/TreeList/TreeList.d.ts +1 -1
  255. package/dist/TreeList/TreeList.d.ts.map +1 -1
  256. package/dist/TreeList/TreeList.js +72 -2
  257. package/dist/TreeList/TreeListItem.d.ts +11 -1
  258. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  259. package/dist/TreeList/TreeListItem.js +51 -12
  260. package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
  261. package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
  262. package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
  263. package/dist/Typeahead/BaseTypeahead.d.ts +13 -0
  264. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  265. package/dist/Typeahead/BaseTypeahead.js +69 -6
  266. package/dist/Typeahead/Typeahead.d.ts +26 -3
  267. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  268. package/dist/Typeahead/Typeahead.js +65 -29
  269. package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
  270. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  271. package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
  272. package/dist/VisuallyHidden/index.d.ts +11 -0
  273. package/dist/VisuallyHidden/index.d.ts.map +1 -0
  274. package/dist/VisuallyHidden/index.js +13 -0
  275. package/dist/astryx.css +22 -0
  276. package/dist/astryx.umd.js +55 -55
  277. package/dist/astryx.umd.js.map +4 -4
  278. package/dist/hooks/focusableSelector.d.ts +22 -0
  279. package/dist/hooks/focusableSelector.d.ts.map +1 -0
  280. package/dist/hooks/focusableSelector.js +24 -0
  281. package/dist/hooks/index.d.ts +12 -2
  282. package/dist/hooks/index.d.ts.map +1 -1
  283. package/dist/hooks/index.js +7 -2
  284. package/dist/hooks/useAnnounce.d.ts +40 -0
  285. package/dist/hooks/useAnnounce.d.ts.map +1 -0
  286. package/dist/hooks/useAnnounce.js +142 -0
  287. package/dist/hooks/useClickableContainer.d.ts +16 -1
  288. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  289. package/dist/hooks/useClickableContainer.js +16 -4
  290. package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
  291. package/dist/hooks/useEntryAnimation.js +4 -4
  292. package/dist/hooks/useFocusTrap.d.ts +18 -0
  293. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  294. package/dist/hooks/useFocusTrap.js +87 -3
  295. package/dist/hooks/useGridFocus.d.ts +88 -1
  296. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  297. package/dist/hooks/useGridFocus.js +261 -62
  298. package/dist/hooks/useKeyboardHint.d.ts +82 -0
  299. package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
  300. package/dist/hooks/useKeyboardHint.js +220 -0
  301. package/dist/hooks/useListFocus.d.ts +78 -7
  302. package/dist/hooks/useListFocus.d.ts.map +1 -1
  303. package/dist/hooks/useListFocus.js +305 -52
  304. package/dist/hooks/useLongPress.d.ts +21 -0
  305. package/dist/hooks/useLongPress.d.ts.map +1 -0
  306. package/dist/hooks/useLongPress.js +89 -0
  307. package/dist/hooks/useTreeFocus.d.ts +157 -0
  308. package/dist/hooks/useTreeFocus.d.ts.map +1 -0
  309. package/dist/hooks/useTreeFocus.js +337 -0
  310. package/dist/hooks/useTypeahead.d.ts +63 -0
  311. package/dist/hooks/useTypeahead.d.ts.map +1 -0
  312. package/dist/hooks/useTypeahead.js +117 -0
  313. package/dist/index.d.ts +1 -0
  314. package/dist/index.d.ts.map +1 -1
  315. package/dist/index.js +1 -0
  316. package/dist/utils/dateTypes.d.ts +12 -0
  317. package/dist/utils/dateTypes.d.ts.map +1 -1
  318. package/dist/utils/dateTypes.js +41 -1
  319. package/dist/utils/index.d.ts +4 -0
  320. package/dist/utils/index.d.ts.map +1 -1
  321. package/dist/utils/index.js +3 -1
  322. package/dist/utils/inputAria.d.ts +29 -0
  323. package/dist/utils/inputAria.d.ts.map +1 -0
  324. package/dist/utils/inputAria.js +30 -0
  325. package/dist/utils/timeParser.d.ts.map +1 -1
  326. package/dist/utils/timeParser.js +5 -2
  327. package/docs.mjs +2 -2
  328. package/package.json +12 -8
  329. package/src/Avatar/Avatar.doc.mjs +2 -2
  330. package/src/Avatar/Avatar.test.tsx +37 -0
  331. package/src/Avatar/Avatar.tsx +10 -5
  332. package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
  333. package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
  334. package/src/Button/Button.tsx +42 -22
  335. package/src/ButtonGroup/ButtonGroup.test.tsx +9 -9
  336. package/src/ButtonGroup/ButtonGroup.tsx +0 -1
  337. package/src/Calendar/Calendar.doc.mjs +4 -4
  338. package/src/Calendar/Calendar.test.tsx +247 -30
  339. package/src/Calendar/Calendar.tsx +173 -86
  340. package/src/Calendar/dayCellUtils.test.ts +306 -1
  341. package/src/Calendar/dayCellUtils.ts +206 -13
  342. package/src/Calendar/hooks/index.ts +0 -6
  343. package/src/Calendar/index.ts +1 -3
  344. package/src/Calendar/styles.ts +4 -9
  345. package/src/Carousel/Carousel.doc.mjs +7 -1
  346. package/src/Carousel/Carousel.test.tsx +20 -0
  347. package/src/Carousel/Carousel.tsx +16 -1
  348. package/src/Center/Center.doc.mjs +12 -2
  349. package/src/Center/Center.tsx +28 -3
  350. package/src/Chat/ChatComposerInput.test.tsx +26 -7
  351. package/src/Chat/ChatComposerInput.tsx +0 -1
  352. package/src/Chat/ChatDictationButton.doc.mjs +1 -1
  353. package/src/Chat/ChatMessageList.doc.mjs +8 -0
  354. package/src/Chat/ChatMessageList.test.tsx +18 -0
  355. package/src/Chat/ChatMessageList.tsx +16 -0
  356. package/src/Chat/useTriggerMenu.tsx +22 -4
  357. package/src/CheckboxInput/CheckboxInput.doc.mjs +10 -0
  358. package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
  359. package/src/CheckboxInput/CheckboxInput.tsx +78 -6
  360. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  361. package/src/CheckboxList/CheckboxList.test.tsx +192 -26
  362. package/src/CheckboxList/CheckboxList.tsx +56 -3
  363. package/src/CheckboxList/CheckboxListContext.tsx +7 -0
  364. package/src/CheckboxList/CheckboxListItem.tsx +0 -3
  365. package/src/Citation/Citation.doc.mjs +10 -0
  366. package/src/Citation/Citation.test.tsx +121 -0
  367. package/src/Citation/Citation.tsx +15 -3
  368. package/src/CodeBlock/CodeBlock.test.tsx +115 -0
  369. package/src/CodeBlock/CodeBlock.tsx +63 -33
  370. package/src/CommandPalette/CommandPalette.test.tsx +47 -1
  371. package/src/CommandPalette/CommandPalette.tsx +9 -21
  372. package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
  373. package/src/ContextMenu/ContextMenu.test.tsx +155 -1
  374. package/src/ContextMenu/ContextMenu.tsx +129 -16
  375. package/src/DateInput/DateInput.doc.mjs +291 -56
  376. package/src/DateInput/DateInput.test.tsx +248 -2
  377. package/src/DateInput/DateInput.tsx +196 -100
  378. package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
  379. package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
  380. package/src/DateRangeInput/DateRangeInput.tsx +63 -5
  381. package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
  382. package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
  383. package/src/DateTimeInput/DateTimeInput.tsx +125 -17
  384. package/src/Dialog/Dialog.doc.mjs +2 -2
  385. package/src/Dialog/Dialog.tsx +12 -0
  386. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
  387. package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
  388. package/src/DropdownMenu/DropdownMenu.tsx +52 -18
  389. package/src/Field/Field.doc.mjs +59 -18
  390. package/src/Field/Field.test.tsx +32 -0
  391. package/src/Field/Field.tsx +23 -5
  392. package/src/Field/FieldLabel.tsx +55 -17
  393. package/src/FileInput/FileInput.doc.mjs +17 -0
  394. package/src/FileInput/FileInput.test.tsx +283 -49
  395. package/src/FileInput/FileInput.tsx +76 -4
  396. package/src/Grid/Grid.doc.mjs +17 -4
  397. package/src/Grid/Grid.test.tsx +43 -30
  398. package/src/Grid/Grid.tsx +38 -3
  399. package/src/Icon/Icon.doc.mjs +3 -3
  400. package/src/InputGroup/InputGroup.doc.mjs +111 -23
  401. package/src/InputGroup/InputGroup.test.tsx +257 -60
  402. package/src/InputGroup/InputGroup.tsx +23 -5
  403. package/src/InputGroup/InputGroupContext.ts +9 -4
  404. package/src/InputGroup/groupStyles.ts +7 -1
  405. package/src/InputGroup/index.ts +1 -0
  406. package/src/Kbd/Kbd.test.tsx +22 -4
  407. package/src/Kbd/Kbd.tsx +35 -3
  408. package/src/Layer/layerAnimations.stylex.ts +20 -4
  409. package/src/Layer/useLayer.doc.mjs +5 -0
  410. package/src/Layer/useLayer.test.tsx +111 -0
  411. package/src/Layer/useLayer.tsx +90 -9
  412. package/src/Layout/Layout.tsx +8 -16
  413. package/src/Layout/LayoutFooter.doc.mjs +4 -4
  414. package/src/Layout/LayoutFooter.tsx +3 -3
  415. package/src/Layout/LayoutHeader.doc.mjs +4 -4
  416. package/src/Layout/LayoutHeader.tsx +3 -3
  417. package/src/Layout/LayoutPanel.tsx +3 -3
  418. package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
  419. package/src/Layout/padding.stylex.ts +52 -0
  420. package/src/Lightbox/Lightbox.doc.mjs +9 -0
  421. package/src/Lightbox/Lightbox.test.tsx +53 -5
  422. package/src/Lightbox/Lightbox.tsx +9 -4
  423. package/src/Link/Link.doc.mjs +14 -0
  424. package/src/Link/Link.test.tsx +50 -0
  425. package/src/Link/Link.tsx +39 -4
  426. package/src/Markdown/Markdown.test.tsx +11 -0
  427. package/src/Markdown/Markdown.tsx +7 -0
  428. package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
  429. package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
  430. package/src/MoreMenu/MoreMenu.tsx +0 -9
  431. package/src/MultiSelector/MultiSelector.doc.mjs +35 -0
  432. package/src/MultiSelector/MultiSelector.test.tsx +375 -8
  433. package/src/MultiSelector/MultiSelector.tsx +194 -48
  434. package/src/MultiSelector/hooks.ts +27 -0
  435. package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
  436. package/src/NavMenu/NavHeadingMenu.tsx +50 -3
  437. package/src/NumberInput/NumberInput.doc.mjs +17 -0
  438. package/src/NumberInput/NumberInput.test.tsx +242 -40
  439. package/src/NumberInput/NumberInput.tsx +89 -11
  440. package/src/Pagination/Pagination.doc.mjs +3 -3
  441. package/src/Pagination/Pagination.test.tsx +117 -5
  442. package/src/Pagination/Pagination.tsx +21 -1
  443. package/src/Popover/Popover.doc.mjs +26 -0
  444. package/src/Popover/Popover.test.tsx +121 -0
  445. package/src/Popover/Popover.tsx +23 -2
  446. package/src/Popover/usePopover.doc.mjs +9 -3
  447. package/src/Popover/usePopover.tsx +70 -12
  448. package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
  449. package/src/PowerSearch/PowerSearch.test.tsx +97 -1
  450. package/src/PowerSearch/PowerSearch.tsx +16 -3
  451. package/src/ProgressBar/ProgressBar.test.tsx +34 -26
  452. package/src/ProgressBar/ProgressBar.tsx +3 -4
  453. package/src/RadioList/RadioList.doc.mjs +9 -0
  454. package/src/RadioList/RadioList.test.tsx +252 -16
  455. package/src/RadioList/RadioList.tsx +166 -10
  456. package/src/RadioList/RadioListItem.tsx +14 -2
  457. package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
  458. package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
  459. package/src/SegmentedControl/SegmentedControl.tsx +102 -54
  460. package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
  461. package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
  462. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  463. package/src/Selector/Selector.doc.mjs +31 -0
  464. package/src/Selector/Selector.test.tsx +387 -15
  465. package/src/Selector/Selector.tsx +175 -67
  466. package/src/Selector/hooks.ts +23 -0
  467. package/src/SideNav/SideNav.test.tsx +48 -0
  468. package/src/SideNav/SideNavHeading.tsx +8 -2
  469. package/src/SideNav/SideNavItem.tsx +2 -4
  470. package/src/Skeleton/Skeleton.test.tsx +25 -0
  471. package/src/Skeleton/Skeleton.tsx +11 -1
  472. package/src/Slider/Slider.doc.mjs +15 -0
  473. package/src/Slider/Slider.test.tsx +155 -2
  474. package/src/Slider/Slider.tsx +53 -5
  475. package/src/Spinner/Spinner.tsx +7 -1
  476. package/src/Stack/Stack.doc.mjs +77 -0
  477. package/src/Stack/Stack.test.tsx +55 -5
  478. package/src/Stack/Stack.tsx +73 -24
  479. package/src/Stack/StackItem.test.tsx +23 -0
  480. package/src/Stack/StackItem.tsx +20 -23
  481. package/src/Switch/Switch.doc.mjs +15 -0
  482. package/src/Switch/Switch.test.tsx +162 -27
  483. package/src/Switch/Switch.tsx +61 -21
  484. package/src/TabList/Tab.tsx +6 -0
  485. package/src/TabList/TabList.doc.mjs +9 -3
  486. package/src/TabList/TabList.test.tsx +251 -0
  487. package/src/TabList/TabList.tsx +103 -12
  488. package/src/TabList/TabListContext.ts +7 -3
  489. package/src/TabList/TabMenu.tsx +6 -3
  490. package/src/Table/BaseTable.tsx +24 -18
  491. package/src/Table/Table.doc.mjs +2 -0
  492. package/src/Table/Table.test.tsx +10 -0
  493. package/src/Table/Table.tsx +8 -0
  494. package/src/Table/TableCell.tsx +105 -24
  495. package/src/Table/TableHeaderCell.tsx +28 -29
  496. package/src/Table/index.ts +8 -2
  497. package/src/Table/plugins/pagination/paginateData.ts +10 -3
  498. package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
  499. package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
  500. package/src/Table/plugins/rowExpansion/index.ts +7 -0
  501. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
  502. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
  503. package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
  504. package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
  505. package/src/Table/tableContextMenu.test.tsx +181 -0
  506. package/src/Table/tableContextMenu.tsx +160 -0
  507. package/src/Table/types.ts +74 -0
  508. package/src/Table/useTableColumnResize.doc.mjs +3 -3
  509. package/src/Table/useTablePagination.doc.mjs +4 -1
  510. package/src/Table/useTableRowExpansion.doc.mjs +63 -0
  511. package/src/Table/useTableSortable.doc.mjs +4 -1
  512. package/src/Table/useTableStickyColumns.doc.mjs +2 -2
  513. package/src/Text/Text.doc.mjs +18 -18
  514. package/src/TextArea/TextArea.doc.mjs +17 -0
  515. package/src/TextArea/TextArea.test.tsx +167 -35
  516. package/src/TextArea/TextArea.tsx +62 -15
  517. package/src/TextInput/TextInput.doc.mjs +17 -0
  518. package/src/TextInput/TextInput.test.tsx +168 -34
  519. package/src/TextInput/TextInput.tsx +77 -9
  520. package/src/Thumbnail/Thumbnail.doc.mjs +4 -4
  521. package/src/TimeInput/TimeInput.doc.mjs +345 -60
  522. package/src/TimeInput/TimeInput.test.tsx +255 -7
  523. package/src/TimeInput/TimeInput.tsx +176 -70
  524. package/src/Timestamp/Timestamp.doc.mjs +19 -19
  525. package/src/Toast/Toast.tsx +14 -0
  526. package/src/Toast/ToastViewport.test.tsx +214 -0
  527. package/src/Toast/ToastViewport.tsx +167 -21
  528. package/src/Tokenizer/Tokenizer.doc.mjs +29 -14
  529. package/src/Tokenizer/Tokenizer.test.tsx +105 -1
  530. package/src/Tokenizer/Tokenizer.tsx +37 -1
  531. package/src/Toolbar/Toolbar.test.tsx +109 -6
  532. package/src/Toolbar/Toolbar.tsx +59 -5
  533. package/src/Tooltip/Tooltip.test.tsx +68 -0
  534. package/src/Tooltip/useTooltip.tsx +55 -8
  535. package/src/TopNav/TopNav.test.tsx +50 -0
  536. package/src/TopNav/TopNavHeading.tsx +17 -1
  537. package/src/TreeList/TreeList.test.tsx +295 -6
  538. package/src/TreeList/TreeList.tsx +73 -1
  539. package/src/TreeList/TreeListItem.tsx +51 -5
  540. package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
  541. package/src/Typeahead/BaseTypeahead.tsx +93 -9
  542. package/src/Typeahead/Typeahead.doc.mjs +146 -30
  543. package/src/Typeahead/Typeahead.test.tsx +331 -1
  544. package/src/Typeahead/Typeahead.tsx +105 -33
  545. package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
  546. package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
  547. package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
  548. package/src/VisuallyHidden/index.ts +15 -0
  549. package/src/docs-script.test.mjs +50 -0
  550. package/src/hooks/focusableSelector.ts +25 -0
  551. package/src/hooks/index.ts +28 -2
  552. package/src/hooks/useAnnounce.test.tsx +101 -0
  553. package/src/hooks/useAnnounce.ts +168 -0
  554. package/src/hooks/useClickableContainer.ts +16 -4
  555. package/src/hooks/useEntryAnimation.ts +16 -4
  556. package/src/hooks/useFocusTrap.test.tsx +132 -0
  557. package/src/hooks/useFocusTrap.ts +98 -4
  558. package/src/hooks/useGridFocus.doc.mjs +40 -2
  559. package/src/hooks/useGridFocus.test.tsx +132 -0
  560. package/src/hooks/useGridFocus.ts +343 -67
  561. package/src/hooks/useKeyboardHint.doc.mjs +101 -0
  562. package/src/hooks/useKeyboardHint.test.tsx +70 -0
  563. package/src/hooks/useKeyboardHint.tsx +332 -0
  564. package/src/hooks/useListFocus.doc.mjs +50 -10
  565. package/src/hooks/useListFocus.test.tsx +375 -0
  566. package/src/hooks/useListFocus.ts +395 -57
  567. package/src/hooks/useLongPress.test.tsx +134 -0
  568. package/src/hooks/useLongPress.ts +119 -0
  569. package/src/hooks/useTreeFocus.doc.mjs +140 -0
  570. package/src/hooks/useTreeFocus.test.tsx +214 -0
  571. package/src/hooks/useTreeFocus.ts +559 -0
  572. package/src/hooks/useTypeahead.test.tsx +109 -0
  573. package/src/hooks/useTypeahead.ts +183 -0
  574. package/src/index.ts +1 -0
  575. package/src/theme/derivedVarRegistry.test.ts +10 -5
  576. package/src/utils/dateTypes.test.ts +40 -0
  577. package/src/utils/dateTypes.ts +40 -0
  578. package/src/utils/index.ts +9 -0
  579. package/src/utils/inputAria.test.ts +39 -0
  580. package/src/utils/inputAria.ts +58 -0
  581. package/src/utils/timeParser.test.ts +10 -0
  582. package/src/utils/timeParser.ts +5 -2
  583. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
  584. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
  585. package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
  586. package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
@@ -5,10 +5,13 @@ import {
5
5
  computeDayCellState,
6
6
  computeRangeRounding,
7
7
  computePreviewRounding,
8
+ computeDayNeighborContinuity,
8
9
  isEndpoint,
10
+ isRangeHighlighted,
11
+ isPreviewHighlighted,
9
12
  type DayCellStateInput,
10
13
  } from './dayCellUtils';
11
- import {plainDateFromISO} from '../utils/plainDate';
14
+ import {plainDateFromISO, plainDateIsEqual} from '../utils/plainDate';
12
15
 
13
16
  function makeInput(
14
17
  overrides: Partial<DayCellStateInput> = {},
@@ -118,6 +121,49 @@ describe('computeDayCellState', () => {
118
121
  expect(stateLast.isFirstColumn).toBe(false);
119
122
  expect(stateLast.isLastColumn).toBe(true);
120
123
  });
124
+
125
+ // Regression (#2715): outside (adjacent-month) days must not receive
126
+ // selection/range/preview state. In the two-month layout the same date
127
+ // renders in both panes, so highlighting the spillover copy would duplicate
128
+ // the selection onto the wrong month's pane.
129
+ it('does not apply range state to outside days', () => {
130
+ const state = computeDayCellState(
131
+ makeInput({
132
+ date: plainDateFromISO('2024-03-17'),
133
+ isOutside: true,
134
+ mode: 'range',
135
+ rangeStart: plainDateFromISO('2024-03-15'),
136
+ rangeEnd: plainDateFromISO('2024-03-20'),
137
+ }),
138
+ );
139
+ expect(state.isInRange).toBe(false);
140
+ expect(state.isRangeStart).toBe(false);
141
+ expect(state.isRangeEnd).toBe(false);
142
+ });
143
+
144
+ it('does not apply preview state to outside days', () => {
145
+ const state = computeDayCellState(
146
+ makeInput({
147
+ date: plainDateFromISO('2024-03-17'),
148
+ isOutside: true,
149
+ previewStart: plainDateFromISO('2024-03-15'),
150
+ previewEnd: plainDateFromISO('2024-03-20'),
151
+ }),
152
+ );
153
+ expect(state.isInPreview).toBe(false);
154
+ expect(state.isPreviewStart).toBe(false);
155
+ expect(state.isPreviewEnd).toBe(false);
156
+ });
157
+
158
+ it('does not mark an outside day as selected', () => {
159
+ const state = computeDayCellState(
160
+ makeInput({
161
+ isOutside: true,
162
+ selectedDate: plainDateFromISO('2024-03-15'),
163
+ }),
164
+ );
165
+ expect(state.isSelected).toBe(false);
166
+ });
121
167
  });
122
168
 
123
169
  describe('computeRangeRounding', () => {
@@ -161,6 +207,96 @@ describe('computeRangeRounding', () => {
161
207
  const rounding = computeRangeRounding(state);
162
208
  expect(rounding.roundRight).toBe(true);
163
209
  });
210
+
211
+ // #2715 follow-up: cap the highlight where the range meets a disabled or
212
+ // adjacent-month (outside) day. A mid-range day (neither endpoint nor grid
213
+ // edge) gets an end cap on the side whose neighbour breaks the run.
214
+ it('caps the right edge when the next day breaks the range (e.g. disabled)', () => {
215
+ const state = computeDayCellState(
216
+ makeInput({
217
+ date: plainDateFromISO('2024-03-17'),
218
+ dayIndex: 3,
219
+ mode: 'range',
220
+ rangeStart: plainDateFromISO('2024-03-15'),
221
+ rangeEnd: plainDateFromISO('2024-03-20'),
222
+ }),
223
+ );
224
+ const rounding = computeRangeRounding(state, {
225
+ prevInRange: true,
226
+ nextInRange: false,
227
+ });
228
+ expect(rounding.roundLeft).toBe(false);
229
+ expect(rounding.roundRight).toBe(true);
230
+ });
231
+
232
+ it('caps the left edge when the previous day breaks the range', () => {
233
+ const state = computeDayCellState(
234
+ makeInput({
235
+ date: plainDateFromISO('2024-03-17'),
236
+ dayIndex: 3,
237
+ mode: 'range',
238
+ rangeStart: plainDateFromISO('2024-03-15'),
239
+ rangeEnd: plainDateFromISO('2024-03-20'),
240
+ }),
241
+ );
242
+ const rounding = computeRangeRounding(state, {
243
+ prevInRange: false,
244
+ nextInRange: true,
245
+ });
246
+ expect(rounding.roundLeft).toBe(true);
247
+ expect(rounding.roundRight).toBe(false);
248
+ });
249
+
250
+ it('does not cap a mid-range day when both neighbours continue the range', () => {
251
+ const state = computeDayCellState(
252
+ makeInput({
253
+ date: plainDateFromISO('2024-03-17'),
254
+ dayIndex: 3,
255
+ mode: 'range',
256
+ rangeStart: plainDateFromISO('2024-03-15'),
257
+ rangeEnd: plainDateFromISO('2024-03-20'),
258
+ }),
259
+ );
260
+ const rounding = computeRangeRounding(state, {
261
+ prevInRange: true,
262
+ nextInRange: true,
263
+ });
264
+ expect(rounding.roundLeft).toBe(false);
265
+ expect(rounding.roundRight).toBe(false);
266
+ });
267
+ });
268
+
269
+ describe('isRangeHighlighted', () => {
270
+ const base = {
271
+ date: plainDateFromISO('2024-03-17'),
272
+ mode: 'range' as const,
273
+ rangeStart: plainDateFromISO('2024-03-15'),
274
+ rangeEnd: plainDateFromISO('2024-03-20'),
275
+ isDisabled: false,
276
+ isOutside: false,
277
+ };
278
+
279
+ it('true for an enabled in-month day inside the range', () => {
280
+ expect(isRangeHighlighted(base)).toBe(true);
281
+ });
282
+
283
+ it('false for a disabled day (breaks continuity)', () => {
284
+ expect(isRangeHighlighted({...base, isDisabled: true})).toBe(false);
285
+ });
286
+
287
+ it('false for an adjacent-month (outside) day', () => {
288
+ expect(isRangeHighlighted({...base, isOutside: true})).toBe(false);
289
+ });
290
+
291
+ it('false outside the range bounds', () => {
292
+ expect(
293
+ isRangeHighlighted({...base, date: plainDateFromISO('2024-03-25')}),
294
+ ).toBe(false);
295
+ });
296
+
297
+ it('false in single mode', () => {
298
+ expect(isRangeHighlighted({...base, mode: 'single'})).toBe(false);
299
+ });
164
300
  });
165
301
 
166
302
  describe('computePreviewRounding', () => {
@@ -175,6 +311,175 @@ describe('computePreviewRounding', () => {
175
311
  expect(rounding.roundLeft).toBe(true);
176
312
  expect(rounding.roundRight).toBe(false);
177
313
  });
314
+
315
+ // #2715: the hover preview needs the same disabled/outside caps as the
316
+ // committed range, so the transient highlight terminates cleanly at the gap.
317
+ it('caps the right edge when the next day breaks the preview run', () => {
318
+ const state = computeDayCellState(
319
+ makeInput({
320
+ date: plainDateFromISO('2024-03-17'),
321
+ dayIndex: 3,
322
+ previewStart: plainDateFromISO('2024-03-15'),
323
+ previewEnd: plainDateFromISO('2024-03-20'),
324
+ }),
325
+ );
326
+ const rounding = computePreviewRounding(state, {
327
+ prevInPreview: true,
328
+ nextInPreview: false,
329
+ });
330
+ expect(rounding.roundLeft).toBe(false);
331
+ expect(rounding.roundRight).toBe(true);
332
+ });
333
+
334
+ it('caps the left edge when the previous day breaks the preview run', () => {
335
+ const state = computeDayCellState(
336
+ makeInput({
337
+ date: plainDateFromISO('2024-03-17'),
338
+ dayIndex: 3,
339
+ previewStart: plainDateFromISO('2024-03-15'),
340
+ previewEnd: plainDateFromISO('2024-03-20'),
341
+ }),
342
+ );
343
+ const rounding = computePreviewRounding(state, {
344
+ prevInPreview: false,
345
+ nextInPreview: true,
346
+ });
347
+ expect(rounding.roundLeft).toBe(true);
348
+ expect(rounding.roundRight).toBe(false);
349
+ });
350
+
351
+ it('does not cap a mid-preview day when both neighbours continue', () => {
352
+ const state = computeDayCellState(
353
+ makeInput({
354
+ date: plainDateFromISO('2024-03-17'),
355
+ dayIndex: 3,
356
+ previewStart: plainDateFromISO('2024-03-15'),
357
+ previewEnd: plainDateFromISO('2024-03-20'),
358
+ }),
359
+ );
360
+ const rounding = computePreviewRounding(state, {
361
+ prevInPreview: true,
362
+ nextInPreview: true,
363
+ });
364
+ expect(rounding.roundLeft).toBe(false);
365
+ expect(rounding.roundRight).toBe(false);
366
+ });
367
+ });
368
+
369
+ describe('isPreviewHighlighted', () => {
370
+ const base = {
371
+ date: plainDateFromISO('2024-03-17'),
372
+ previewStart: plainDateFromISO('2024-03-15'),
373
+ previewEnd: plainDateFromISO('2024-03-20'),
374
+ isDisabled: false,
375
+ isOutside: false,
376
+ };
377
+
378
+ it('true for an enabled in-month day inside the preview span', () => {
379
+ expect(isPreviewHighlighted(base)).toBe(true);
380
+ });
381
+
382
+ it('false for a disabled day', () => {
383
+ expect(isPreviewHighlighted({...base, isDisabled: true})).toBe(false);
384
+ });
385
+
386
+ it('false for an adjacent-month (outside) day', () => {
387
+ expect(isPreviewHighlighted({...base, isOutside: true})).toBe(false);
388
+ });
389
+
390
+ it('false outside the preview bounds', () => {
391
+ expect(
392
+ isPreviewHighlighted({...base, date: plainDateFromISO('2024-03-25')}),
393
+ ).toBe(false);
394
+ });
395
+
396
+ it('false with no preview span', () => {
397
+ expect(
398
+ isPreviewHighlighted({...base, previewStart: null, previewEnd: null}),
399
+ ).toBe(false);
400
+ });
401
+ });
402
+
403
+ describe('computeDayNeighborContinuity', () => {
404
+ // A week row of 5 consecutive in-month days, Mar 15–19.
405
+ const week = (
406
+ [
407
+ '2024-03-15',
408
+ '2024-03-16',
409
+ '2024-03-17',
410
+ '2024-03-18',
411
+ '2024-03-19',
412
+ ] as const
413
+ ).map(iso => ({
414
+ date: plainDateFromISO(iso),
415
+ isOutside: false,
416
+ }));
417
+
418
+ const baseInput = {
419
+ week,
420
+ mode: 'range' as const,
421
+ rangeStart: plainDateFromISO('2024-03-15'),
422
+ rangeEnd: plainDateFromISO('2024-03-19'),
423
+ previewStart: null,
424
+ previewEnd: null,
425
+ isDisabled: () => false,
426
+ };
427
+
428
+ it('reports both range neighbours continuing for a mid-range day', () => {
429
+ const c = computeDayNeighborContinuity({...baseInput, dayIndex: 2});
430
+ expect(c.prevInRange).toBe(true);
431
+ expect(c.nextInRange).toBe(true);
432
+ });
433
+
434
+ it('breaks continuity where a neighbour is disabled', () => {
435
+ // Disable Mar 18 (index 3): its neighbour Mar 17 (index 2) sees a break to
436
+ // the right.
437
+ const disabledDay = plainDateFromISO('2024-03-18');
438
+ const c = computeDayNeighborContinuity({
439
+ ...baseInput,
440
+ dayIndex: 2,
441
+ isDisabled: date => plainDateIsEqual(date, disabledDay),
442
+ });
443
+ expect(c.prevInRange).toBe(true);
444
+ expect(c.nextInRange).toBe(false);
445
+ });
446
+
447
+ it('breaks continuity where a neighbour is an outside day', () => {
448
+ const weekWithOutside = week.map((d, i) =>
449
+ i === 3 ? {...d, isOutside: true} : d,
450
+ );
451
+ const c = computeDayNeighborContinuity({
452
+ ...baseInput,
453
+ week: weekWithOutside,
454
+ dayIndex: 2,
455
+ });
456
+ expect(c.nextInRange).toBe(false);
457
+ });
458
+
459
+ it('treats a missing neighbour (row edge) as a break', () => {
460
+ const first = computeDayNeighborContinuity({...baseInput, dayIndex: 0});
461
+ expect(first.prevInRange).toBe(false);
462
+ const last = computeDayNeighborContinuity({
463
+ ...baseInput,
464
+ dayIndex: week.length - 1,
465
+ });
466
+ expect(last.nextInRange).toBe(false);
467
+ });
468
+
469
+ it('derives preview continuity independently of range', () => {
470
+ const c = computeDayNeighborContinuity({
471
+ ...baseInput,
472
+ rangeStart: null,
473
+ rangeEnd: null,
474
+ previewStart: plainDateFromISO('2024-03-15'),
475
+ previewEnd: plainDateFromISO('2024-03-19'),
476
+ dayIndex: 2,
477
+ });
478
+ expect(c.prevInRange).toBe(false);
479
+ expect(c.nextInRange).toBe(false);
480
+ expect(c.prevInPreview).toBe(true);
481
+ expect(c.nextInPreview).toBe(true);
482
+ });
178
483
  });
179
484
 
180
485
  describe('isEndpoint', () => {
@@ -31,7 +31,14 @@ export interface DayCellStateInput {
31
31
  isOutside: boolean;
32
32
  }
33
33
 
34
- /** Derives all visual/interaction states for a single day cell. */
34
+ /**
35
+ * Derives all visual/interaction states for a single day cell.
36
+ *
37
+ * Outside (adjacent-month) days never receive selection, range, or preview
38
+ * state: in the two-month layout the same date renders in both panes, and
39
+ * highlighting the spillover copy would duplicate the selection onto the wrong
40
+ * month's pane (#2715).
41
+ */
35
42
  export function computeDayCellState(input: DayCellStateInput): DayCellState {
36
43
  const {
37
44
  date,
@@ -51,55 +58,241 @@ export function computeDayCellState(input: DayCellStateInput): DayCellState {
51
58
  effectivelyDisabled: isDisabled || isOutside,
52
59
  isToday: plainDateIsEqual(date, today),
53
60
  isSelected: !!(
61
+ !isOutside &&
54
62
  mode === 'single' &&
55
63
  selectedDate &&
56
64
  plainDateIsEqual(date, selectedDate)
57
65
  ),
58
66
  isInRange: !!(
67
+ !isOutside &&
59
68
  mode === 'range' &&
60
69
  rangeStart &&
61
70
  rangeEnd &&
62
71
  plainDateIsInRange(date, [rangeStart, rangeEnd])
63
72
  ),
64
73
  isRangeStart: !!(
74
+ !isOutside &&
65
75
  mode === 'range' &&
66
76
  rangeStart &&
67
77
  plainDateIsEqual(date, rangeStart)
68
78
  ),
69
79
  isRangeEnd: !!(
80
+ !isOutside &&
70
81
  mode === 'range' &&
71
82
  rangeEnd &&
72
83
  plainDateIsEqual(date, rangeEnd)
73
84
  ),
74
85
  isInPreview: !!(
86
+ !isOutside &&
75
87
  previewStart &&
76
88
  previewEnd &&
77
89
  plainDateIsInRange(date, [previewStart, previewEnd])
78
90
  ),
79
- isPreviewStart: !!(previewStart && plainDateIsEqual(date, previewStart)),
80
- isPreviewEnd: !!(previewEnd && plainDateIsEqual(date, previewEnd)),
91
+ isPreviewStart: !!(
92
+ !isOutside &&
93
+ previewStart &&
94
+ plainDateIsEqual(date, previewStart)
95
+ ),
96
+ isPreviewEnd: !!(
97
+ !isOutside &&
98
+ previewEnd &&
99
+ plainDateIsEqual(date, previewEnd)
100
+ ),
81
101
  isFirstColumn: dayIndex === 0,
82
102
  isLastColumn: dayIndex === 6,
83
103
  };
84
104
  }
85
105
 
86
- /** Edge rounding for range background (rounds at grid edges and range endpoints). */
87
- export function computeRangeRounding(state: DayCellState) {
106
+ /**
107
+ * Generic rounding for a highlight run (range or preview).
108
+ *
109
+ * Rounds at the run's endpoints and the grid row edges, and also caps the
110
+ * highlight where the run meets a break in continuity — a neighbouring cell
111
+ * that is disabled or an adjacent-month (outside) day (#2715).
112
+ */
113
+ function computeHighlightRounding(input: {
114
+ isStart: boolean;
115
+ isEnd: boolean;
116
+ isFirstColumn: boolean;
117
+ isLastColumn: boolean;
118
+ prevContinues?: boolean;
119
+ nextContinues?: boolean;
120
+ }) {
121
+ const prevBreaks =
122
+ input.prevContinues !== undefined ? !input.prevContinues : false;
123
+ const nextBreaks =
124
+ input.nextContinues !== undefined ? !input.nextContinues : false;
88
125
  return {
89
- roundLeft: state.isRangeStart || state.isFirstColumn,
90
- roundRight: state.isRangeEnd || state.isLastColumn,
126
+ roundLeft: input.isStart || input.isFirstColumn || prevBreaks,
127
+ roundRight: input.isEnd || input.isLastColumn || nextBreaks,
91
128
  };
92
129
  }
93
130
 
94
- /** Edge rounding for preview background. */
95
- export function computePreviewRounding(state: DayCellState) {
96
- return {
97
- roundLeft: state.isPreviewStart || state.isFirstColumn,
98
- roundRight: state.isPreviewEnd || state.isLastColumn,
99
- };
131
+ /** Rounding for the committed range background. */
132
+ export function computeRangeRounding(
133
+ state: DayCellState,
134
+ neighbors?: {prevInRange?: boolean; nextInRange?: boolean},
135
+ ) {
136
+ return computeHighlightRounding({
137
+ isStart: state.isRangeStart,
138
+ isEnd: state.isRangeEnd,
139
+ isFirstColumn: state.isFirstColumn,
140
+ isLastColumn: state.isLastColumn,
141
+ prevContinues: neighbors?.prevInRange,
142
+ nextContinues: neighbors?.nextInRange,
143
+ });
144
+ }
145
+
146
+ /** Rounding for the hover-preview background. */
147
+ export function computePreviewRounding(
148
+ state: DayCellState,
149
+ neighbors?: {prevInPreview?: boolean; nextInPreview?: boolean},
150
+ ) {
151
+ return computeHighlightRounding({
152
+ isStart: state.isPreviewStart,
153
+ isEnd: state.isPreviewEnd,
154
+ isFirstColumn: state.isFirstColumn,
155
+ isLastColumn: state.isLastColumn,
156
+ prevContinues: neighbors?.prevInPreview,
157
+ nextContinues: neighbors?.nextInPreview,
158
+ });
100
159
  }
101
160
 
102
161
  /** Whether a day is a selection endpoint (selected, range start, or range end). */
103
162
  export function isEndpoint(state: DayCellState): boolean {
104
163
  return state.isSelected || state.isRangeStart || state.isRangeEnd;
105
164
  }
165
+
166
+ /**
167
+ * Whether a day is part of an unbroken highlight run (enabled, in-month, inside
168
+ * the given span). Outside and disabled days break the run, producing end caps.
169
+ */
170
+ function isSpanHighlighted(input: {
171
+ date: PlainDate;
172
+ spanStart: PlainDate | null;
173
+ spanEnd: PlainDate | null;
174
+ isDisabled: boolean;
175
+ isOutside: boolean;
176
+ }): boolean {
177
+ const {date, spanStart, spanEnd, isDisabled, isOutside} = input;
178
+ return !!(
179
+ !isOutside &&
180
+ !isDisabled &&
181
+ spanStart &&
182
+ spanEnd &&
183
+ plainDateIsInRange(date, [spanStart, spanEnd])
184
+ );
185
+ }
186
+
187
+ /** Whether a day participates in the continuous committed-range highlight. */
188
+ export function isRangeHighlighted(input: {
189
+ date: PlainDate;
190
+ mode: 'single' | 'range';
191
+ rangeStart: PlainDate | null;
192
+ rangeEnd: PlainDate | null;
193
+ isDisabled: boolean;
194
+ isOutside: boolean;
195
+ }): boolean {
196
+ if (input.mode !== 'range') {return false;}
197
+ return isSpanHighlighted({
198
+ date: input.date,
199
+ spanStart: input.rangeStart,
200
+ spanEnd: input.rangeEnd,
201
+ isDisabled: input.isDisabled,
202
+ isOutside: input.isOutside,
203
+ });
204
+ }
205
+
206
+ /** Whether a day participates in the continuous hover-preview highlight. */
207
+ export function isPreviewHighlighted(input: {
208
+ date: PlainDate;
209
+ previewStart: PlainDate | null;
210
+ previewEnd: PlainDate | null;
211
+ isDisabled: boolean;
212
+ isOutside: boolean;
213
+ }): boolean {
214
+ return isSpanHighlighted({
215
+ date: input.date,
216
+ spanStart: input.previewStart,
217
+ spanEnd: input.previewEnd,
218
+ isDisabled: input.isDisabled,
219
+ isOutside: input.isOutside,
220
+ });
221
+ }
222
+
223
+ /**
224
+ * Continuity of the highlighted run through a day's immediate neighbours in the
225
+ * same week row, for both the committed range and the hover preview. A day gets
226
+ * an end cap on whichever side its neighbour does not continue the run (see
227
+ * {@link computeRangeRounding} / {@link computePreviewRounding}).
228
+ */
229
+ export interface DayNeighborContinuity {
230
+ prevInRange: boolean;
231
+ nextInRange: boolean;
232
+ prevInPreview: boolean;
233
+ nextInPreview: boolean;
234
+ }
235
+
236
+ /** Minimal shape needed from a week's day cells to derive neighbour continuity. */
237
+ export interface NeighborDay {
238
+ date: PlainDate;
239
+ isOutside: boolean;
240
+ }
241
+
242
+ /**
243
+ * Derives whether the previous/next day in the same week row continues the
244
+ * highlighted run, for both range and preview. Broken out from the render path
245
+ * so the neighbour logic is unit-testable in isolation.
246
+ */
247
+ export function computeDayNeighborContinuity(input: {
248
+ week: ReadonlyArray<NeighborDay>;
249
+ dayIndex: number;
250
+ mode: 'single' | 'range';
251
+ rangeStart: PlainDate | null;
252
+ rangeEnd: PlainDate | null;
253
+ previewStart: PlainDate | null;
254
+ previewEnd: PlainDate | null;
255
+ isDisabled: (date: PlainDate) => boolean;
256
+ }): DayNeighborContinuity {
257
+ const {
258
+ week,
259
+ dayIndex,
260
+ mode,
261
+ rangeStart,
262
+ rangeEnd,
263
+ previewStart,
264
+ previewEnd,
265
+ isDisabled,
266
+ } = input;
267
+
268
+ const prev = week[dayIndex - 1];
269
+ const next = week[dayIndex + 1];
270
+
271
+ const rangeContinues = (day: NeighborDay | undefined): boolean =>
272
+ day != null &&
273
+ isRangeHighlighted({
274
+ date: day.date,
275
+ mode,
276
+ rangeStart,
277
+ rangeEnd,
278
+ isDisabled: isDisabled(day.date),
279
+ isOutside: day.isOutside,
280
+ });
281
+
282
+ const previewContinues = (day: NeighborDay | undefined): boolean =>
283
+ day != null &&
284
+ isPreviewHighlighted({
285
+ date: day.date,
286
+ previewStart,
287
+ previewEnd,
288
+ isDisabled: isDisabled(day.date),
289
+ isOutside: day.isOutside,
290
+ });
291
+
292
+ return {
293
+ prevInRange: rangeContinues(prev),
294
+ nextInRange: rangeContinues(next),
295
+ prevInPreview: previewContinues(prev),
296
+ nextInPreview: previewContinues(next),
297
+ };
298
+ }
@@ -27,9 +27,3 @@ export type {
27
27
  UseCalendarNavigationOptions,
28
28
  UseCalendarNavigationReturn,
29
29
  } from './useCalendarNavigation';
30
-
31
- export {useCalendarRovingTabindex} from './useCalendarRovingTabindex';
32
- export type {
33
- UseCalendarRovingTabindexOptions,
34
- UseCalendarRovingTabindexReturn,
35
- } from './useCalendarRovingTabindex';
@@ -17,6 +17,7 @@ export type {
17
17
  CalendarHandle,
18
18
  ISODateString,
19
19
  DayOfWeek,
20
+ DayOfWeekName,
20
21
  DateRange,
21
22
  } from './Calendar';
22
23
 
@@ -25,7 +26,6 @@ export {
25
26
  useCalendarDays,
26
27
  useCalendarConstraints,
27
28
  useCalendarNavigation,
28
- useCalendarRovingTabindex,
29
29
  } from './hooks';
30
30
  export type {
31
31
  CalendarDay,
@@ -35,8 +35,6 @@ export type {
35
35
  UseCalendarConstraintsReturn,
36
36
  UseCalendarNavigationOptions,
37
37
  UseCalendarNavigationReturn,
38
- UseCalendarRovingTabindexOptions,
39
- UseCalendarRovingTabindexReturn,
40
38
  } from './hooks';
41
39
 
42
40
  // Re-export calendar-specific utilities for advanced usage
@@ -78,17 +78,12 @@ export const monthGridStyles = stylex.create({
78
78
  monthGrid: {
79
79
  flex: '1 1 0',
80
80
  },
81
- weekHeader: {
82
- display: 'grid',
83
- gridTemplateColumns: 'repeat(7, 1fr)',
84
- marginBottom: spacingVars['--spacing-1'],
85
- },
86
- weekHeaderWithNumbers: {
87
- gridTemplateColumns: 'auto repeat(7, 1fr)',
88
- },
89
81
  dayName: {
90
82
  width: sizeVars['--size-element-md'],
91
- height: sizeVars['--size-element-md'],
83
+ // Restores the small gap the standalone header used to have below it.
84
+ height: `calc(${sizeVars['--size-element-md']} + ${spacingVars['--spacing-1']})`,
85
+ paddingBottom: spacingVars['--spacing-1'],
86
+ boxSizing: 'border-box',
92
87
  display: 'flex',
93
88
  alignItems: 'center',
94
89
  justifyContent: 'center',
@@ -21,7 +21,7 @@ export const docs = {
21
21
  anatomy: [
22
22
  {name: 'Scroll container', required: true, description: 'The horizontal overflow area that holds all items.'},
23
23
  {name: 'Items', required: true, description: 'The children rendered in a row. Each item is animated with a scroll-driven scale effect.'},
24
- {name: 'Fade edges', required: true, description: 'Gradient fades on the left and right edges that indicate more content is available.'},
24
+ {name: 'Fade edges', required: false, description: 'Gradient fades on the left and right edges that indicate more content is available. Enabled by default, disable with hasEdgeFade={false}.'},
25
25
  {name: 'Navigation buttons', required: false, description: 'Prev/next buttons that appear on hover. Enabled by default, disable with hasButtons={false}.'},
26
26
  ],
27
27
  },
@@ -29,7 +29,9 @@ export const docs = {
29
29
  {name: 'children', type: 'ReactNode', description: 'Carousel items rendered in a horizontal scroll container.', required: true},
30
30
  {name: 'gap', type: "0 | 0.5 | 1 | 1.5 | 2 | 3 | 4", description: 'Gap between items using the spacing token scale.', default: '1'},
31
31
  {name: 'hasButtons', type: 'boolean', description: 'Show prev/next navigation buttons on hover (desktop only).', default: 'true'},
32
+ {name: 'hasEdgeFade', type: 'boolean', description: 'Show a gradient edge-fade mask when content overflows, signalling that more items exist off-screen.', default: 'true'},
32
33
  {name: 'hasSnap', type: 'boolean', description: 'Enable scroll-snap so each child snaps to the start edge.', default: 'false'},
34
+ {name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inline padding inside the scroll container, with matching scroll-padding so snap points align to the content edge.'},
33
35
  {name: 'aria-label', type: 'string', description: 'Accessible label for the carousel region.', default: "\'Carousel\'"},
34
36
  {name: 'ref', type: 'React.Ref<HTMLDivElement>', description: 'Ref forwarded to the root element.'},
35
37
  {name: 'xstyle', type: 'StyleXStyles', description: 'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value.'},
@@ -71,7 +73,9 @@ export const docsZh = {
71
73
  children: '在水平滚动容器中渲染的轮播项目。',
72
74
  gap: '使用间距令牌比例的项目间距。',
73
75
  hasButtons: '悬停时显示上一个/下一个导航按钮(仅桌面端)。',
76
+ hasEdgeFade: '内容溢出时显示渐变边缘遮罩,提示屏幕外还有更多项目。',
74
77
  hasSnap: '启用滚动吸附,使每个子元素吸附到起始边缘。',
78
+ padding: '滚动容器内的内联内边距,并设置匹配的 scroll-padding,使吸附点与内容边缘对齐。',
75
79
  'aria-label': '轮播区域的无障碍标签。',
76
80
  },
77
81
  };
@@ -95,7 +99,9 @@ export const docsDense = {
95
99
  children: 'carousel items in horizontal scroll',
96
100
  gap: 'item spacing via spacing token scale',
97
101
  hasButtons: 'prev/next buttons on hover (desktop)',
102
+ hasEdgeFade: 'gradient edge-fade mask on overflow',
98
103
  hasSnap: 'scroll-snap; children snap to start edge',
104
+ padding: 'inline padding; scroll-padding keeps snap points on content edge',
99
105
  'aria-label': 'accessible label for carousel region',
100
106
  'data-testid': 'test selector for automated testing frameworks',
101
107
  },