@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29

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 (642) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
  6. package/dist/AppShell/AppShell.d.ts +1 -1
  7. package/dist/AppShell/AppShell.d.ts.map +1 -1
  8. package/dist/AppShell/AppShell.js +55 -53
  9. package/dist/AspectRatio/AspectRatio.js +5 -5
  10. package/dist/Avatar/Avatar.d.ts.map +1 -1
  11. package/dist/Avatar/Avatar.js +27 -25
  12. package/dist/Avatar/AvatarStatusDot.js +5 -5
  13. package/dist/AvatarGroup/AvatarGroup.js +5 -5
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
  15. package/dist/Badge/Badge.js +3 -3
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -25
  18. package/dist/Blockquote/Blockquote.js +7 -7
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  20. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  21. package/dist/Button/Button.d.ts.map +1 -1
  22. package/dist/Button/Button.js +47 -26
  23. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +108 -64
  26. package/dist/Calendar/dayCellUtils.d.ts +67 -5
  27. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  28. package/dist/Calendar/dayCellUtils.js +139 -18
  29. package/dist/Calendar/styles.d.ts +2 -2
  30. package/dist/Calendar/styles.d.ts.map +1 -1
  31. package/dist/Calendar/styles.js +2 -2
  32. package/dist/Card/Card.d.ts +4 -2
  33. package/dist/Card/Card.d.ts.map +1 -1
  34. package/dist/Card/Card.js +18 -10
  35. package/dist/Carousel/Carousel.d.ts.map +1 -1
  36. package/dist/Carousel/Carousel.js +20 -19
  37. package/dist/Center/Center.js +3 -3
  38. package/dist/Chat/ChatComposer.js +23 -23
  39. package/dist/Chat/ChatComposerDrawer.js +14 -14
  40. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  41. package/dist/Chat/ChatComposerInput.js +27 -15
  42. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  43. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  44. package/dist/Chat/ChatDictationButton.js +13 -11
  45. package/dist/Chat/ChatLayout.js +17 -17
  46. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  47. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  49. package/dist/Chat/ChatMessage.js +12 -12
  50. package/dist/Chat/ChatMessageBubble.js +7 -7
  51. package/dist/Chat/ChatMessageList.js +14 -14
  52. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  53. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  54. package/dist/Chat/ChatMessageMetadata.js +14 -12
  55. package/dist/Chat/ChatPastedTextToken.js +13 -13
  56. package/dist/Chat/ChatSendButton.js +3 -3
  57. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  58. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  59. package/dist/Chat/ChatSystemMessage.js +17 -17
  60. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  61. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  62. package/dist/Chat/ChatTokenizedText.js +24 -15
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +81 -74
  65. package/dist/Chat/index.d.ts +1 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/useTriggerMenu.js +15 -15
  68. package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
  69. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  70. package/dist/CheckboxInput/CheckboxInput.js +32 -24
  71. package/dist/CheckboxList/CheckboxList.js +9 -9
  72. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  73. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  74. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  75. package/dist/Citation/Citation.js +10 -10
  76. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  77. package/dist/ClickableCard/ClickableCard.js +32 -9
  78. package/dist/Code/Code.d.ts +15 -1
  79. package/dist/Code/Code.d.ts.map +1 -1
  80. package/dist/Code/Code.js +35 -5
  81. package/dist/Code/index.d.ts +1 -1
  82. package/dist/Code/index.d.ts.map +1 -1
  83. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  84. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  85. package/dist/CodeBlock/CodeBlock.js +88 -52
  86. package/dist/CodeBlock/index.d.ts +1 -1
  87. package/dist/CodeBlock/index.d.ts.map +1 -1
  88. package/dist/Collapsible/Collapsible.d.ts +9 -3
  89. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  90. package/dist/Collapsible/Collapsible.js +110 -22
  91. package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
  92. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  93. package/dist/Collapsible/CollapsibleGroup.js +73 -12
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
  95. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  96. package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
  97. package/dist/Collapsible/index.d.ts +1 -0
  98. package/dist/Collapsible/index.d.ts.map +1 -1
  99. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  100. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  101. package/dist/Collapsible/useCollapsible.js +20 -6
  102. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  103. package/dist/CommandPalette/CommandPalette.js +36 -34
  104. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
  105. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  106. package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
  107. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  108. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  109. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  110. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  111. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  112. package/dist/ContextMenu/ContextMenu.d.ts +9 -1
  113. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  114. package/dist/ContextMenu/ContextMenu.js +16 -11
  115. package/dist/DateInput/DateInput.js +18 -18
  116. package/dist/DateRangeInput/DateRangeInput.js +23 -23
  117. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
  118. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  119. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  120. package/dist/DateTimeInput/index.d.ts +1 -1
  121. package/dist/DateTimeInput/index.d.ts.map +1 -1
  122. package/dist/Dialog/Dialog.js +9 -9
  123. package/dist/Dialog/DialogHeader.js +16 -16
  124. package/dist/Dialog/useImperativeDialog.js +3 -3
  125. package/dist/Divider/Divider.d.ts +0 -22
  126. package/dist/Divider/Divider.d.ts.map +1 -1
  127. package/dist/Divider/Divider.js +7 -7
  128. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  129. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  130. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  131. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  132. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  133. package/dist/EmptyState/EmptyState.js +9 -9
  134. package/dist/Field/Field.js +17 -17
  135. package/dist/Field/FieldLabel.js +15 -15
  136. package/dist/Field/InputClearButton.js +5 -5
  137. package/dist/FieldStatus/FieldStatus.js +3 -3
  138. package/dist/FileInput/FileInput.js +29 -29
  139. package/dist/FormLayout/FormLayout.js +5 -5
  140. package/dist/Grid/Grid.d.ts +4 -3
  141. package/dist/Grid/Grid.d.ts.map +1 -1
  142. package/dist/Grid/Grid.js +29 -12
  143. package/dist/Grid/GridSpan.js +3 -3
  144. package/dist/HStack/HStack.js +3 -3
  145. package/dist/Heading/Heading.js +10 -10
  146. package/dist/HoverCard/HoverCard.js +9 -9
  147. package/dist/HoverCard/useHoverCard.js +3 -3
  148. package/dist/Icon/Icon.d.ts.map +1 -1
  149. package/dist/Icon/Icon.js +16 -12
  150. package/dist/Icon/defaultIcons.js +116 -116
  151. package/dist/IconButton/IconButton.js +3 -3
  152. package/dist/InputGroup/InputGroup.js +11 -11
  153. package/dist/InputGroup/InputGroupText.js +3 -3
  154. package/dist/Item/Item.js +18 -18
  155. package/dist/Kbd/Kbd.js +5 -5
  156. package/dist/Layer/LayerProvider.js +7 -7
  157. package/dist/Layer/useLayer.js +5 -5
  158. package/dist/Layout/Layout.js +21 -21
  159. package/dist/Layout/LayoutContent.js +3 -3
  160. package/dist/Layout/LayoutFooter.js +5 -5
  161. package/dist/Layout/LayoutHeader.js +5 -5
  162. package/dist/Layout/LayoutPanel.js +3 -3
  163. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  164. package/dist/Lightbox/Lightbox.js +55 -31
  165. package/dist/Lightbox/useLightbox.js +3 -3
  166. package/dist/Link/Link.js +15 -15
  167. package/dist/Link/LinkProvider.js +3 -3
  168. package/dist/Link/useLinkify.js +3 -3
  169. package/dist/List/List.js +11 -11
  170. package/dist/List/ListItem.js +11 -11
  171. package/dist/Markdown/Markdown.d.ts.map +1 -1
  172. package/dist/Markdown/Markdown.js +102 -102
  173. package/dist/Markdown/parser.d.ts +7 -0
  174. package/dist/Markdown/parser.d.ts.map +1 -1
  175. package/dist/Markdown/parser.js +300 -6
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.js +15 -15
  179. package/dist/MobileNav/MobileNavToggle.js +5 -5
  180. package/dist/MoreMenu/MoreMenu.js +3 -3
  181. package/dist/MultiSelector/MultiSelector.d.ts +7 -1
  182. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  183. package/dist/MultiSelector/MultiSelector.js +64 -55
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.js +3 -3
  194. package/dist/Pagination/Pagination.d.ts +1 -1
  195. package/dist/Pagination/Pagination.d.ts.map +1 -1
  196. package/dist/Pagination/Pagination.js +125 -72
  197. package/dist/Popover/Popover.js +16 -16
  198. package/dist/Popover/usePopover.js +7 -7
  199. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  200. package/dist/PowerSearch/PowerSearch.js +110 -92
  201. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  202. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  203. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  204. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  205. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  206. package/dist/ProgressBar/ProgressBar.js +25 -18
  207. package/dist/RadioList/RadioList.d.ts +7 -1
  208. package/dist/RadioList/RadioList.d.ts.map +1 -1
  209. package/dist/RadioList/RadioList.js +10 -8
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +30 -22
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.d.ts +6 -0
  224. package/dist/Selector/Selector.d.ts.map +1 -1
  225. package/dist/Selector/Selector.js +54 -45
  226. package/dist/Selector/SelectorOption.js +3 -3
  227. package/dist/SideNav/SideNav.d.ts.map +1 -1
  228. package/dist/SideNav/SideNav.js +38 -34
  229. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  230. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  232. package/dist/SideNav/SideNavHeading.js +87 -87
  233. package/dist/SideNav/SideNavItem.js +42 -42
  234. package/dist/SideNav/SideNavSection.d.ts +1 -1
  235. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  236. package/dist/SideNav/SideNavSection.js +18 -16
  237. package/dist/Skeleton/Skeleton.js +3 -3
  238. package/dist/Slider/Slider.d.ts +6 -0
  239. package/dist/Slider/Slider.d.ts.map +1 -1
  240. package/dist/Slider/Slider.js +31 -22
  241. package/dist/Spinner/Spinner.d.ts.map +1 -1
  242. package/dist/Spinner/Spinner.js +10 -10
  243. package/dist/StatusDot/StatusDot.js +5 -5
  244. package/dist/Switch/Switch.d.ts +13 -4
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +41 -30
  247. package/dist/TabList/Tab.js +18 -18
  248. package/dist/TabList/TabList.js +5 -5
  249. package/dist/TabList/TabMenu.d.ts.map +1 -1
  250. package/dist/TabList/TabMenu.js +57 -30
  251. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  252. package/dist/Table/BaseTable.d.ts.map +1 -1
  253. package/dist/Table/BaseTable.js +51 -39
  254. package/dist/Table/Table.js +7 -7
  255. package/dist/Table/TableBody.d.ts +1 -1
  256. package/dist/Table/TableBody.d.ts.map +1 -1
  257. package/dist/Table/TableBody.js +9 -5
  258. package/dist/Table/TableCell.d.ts.map +1 -1
  259. package/dist/Table/TableCell.js +76 -7
  260. package/dist/Table/TableFooter.d.ts +1 -1
  261. package/dist/Table/TableFooter.d.ts.map +1 -1
  262. package/dist/Table/TableFooter.js +9 -5
  263. package/dist/Table/TableHeader.d.ts +1 -1
  264. package/dist/Table/TableHeader.d.ts.map +1 -1
  265. package/dist/Table/TableHeader.js +9 -5
  266. package/dist/Table/TableHeaderCell.js +3 -3
  267. package/dist/Table/TableRow.js +5 -5
  268. package/dist/Table/index.d.ts +2 -0
  269. package/dist/Table/index.d.ts.map +1 -1
  270. package/dist/Table/index.js +1 -0
  271. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  272. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  273. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
  278. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
  279. package/dist/Table/plugins/rowExpansion/index.js +3 -0
  280. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
  281. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
  282. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
  283. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  284. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  285. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  286. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  287. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  288. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  289. package/dist/Table/tableContextMenu.d.ts +5 -1
  290. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  291. package/dist/Table/tableContextMenu.js +19 -12
  292. package/dist/Text/Text.d.ts +1 -1
  293. package/dist/Text/Text.d.ts.map +1 -1
  294. package/dist/Text/Text.js +14 -13
  295. package/dist/Text/text.stylex.d.ts +35 -0
  296. package/dist/Text/text.stylex.d.ts.map +1 -1
  297. package/dist/Text/text.stylex.js +52 -1
  298. package/dist/TextArea/TextArea.js +14 -14
  299. package/dist/TextInput/TextInput.js +15 -15
  300. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  301. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  302. package/dist/Thumbnail/Thumbnail.js +30 -29
  303. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  304. package/dist/TimeInput/TimeInput.js +26 -21
  305. package/dist/Timestamp/Timestamp.d.ts +1 -1
  306. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  307. package/dist/Timestamp/Timestamp.js +37 -26
  308. package/dist/Toast/Toast.d.ts.map +1 -1
  309. package/dist/Toast/Toast.js +25 -17
  310. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  311. package/dist/Toast/ToastViewport.js +23 -11
  312. package/dist/Toast/useToast.js +4 -4
  313. package/dist/ToggleButton/ToggleButton.js +12 -12
  314. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  315. package/dist/Token/Token.js +21 -21
  316. package/dist/Tokenizer/Tokenizer.d.ts +6 -1
  317. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  318. package/dist/Tokenizer/Tokenizer.js +38 -29
  319. package/dist/Toolbar/Toolbar.js +18 -18
  320. package/dist/Tooltip/Tooltip.js +11 -11
  321. package/dist/Tooltip/useTooltip.js +3 -3
  322. package/dist/TopNav/TopNav.js +32 -32
  323. package/dist/TopNav/TopNavHeading.js +67 -67
  324. package/dist/TopNav/TopNavItem.js +5 -5
  325. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  326. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  327. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  328. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  329. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  330. package/dist/TopNav/TopNavMenu.js +32 -32
  331. package/dist/TreeList/TreeList.js +8 -8
  332. package/dist/TreeList/TreeListBranches.js +11 -11
  333. package/dist/TreeList/TreeListItem.js +30 -30
  334. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.js +23 -20
  336. package/dist/Typeahead/Typeahead.js +12 -12
  337. package/dist/Typeahead/TypeaheadItem.js +10 -10
  338. package/dist/VStack/VStack.js +3 -3
  339. package/dist/astryx.css +23 -0
  340. package/dist/astryx.umd.js +60 -58
  341. package/dist/astryx.umd.js.map +4 -4
  342. package/dist/docs-types.d.ts +13 -1
  343. package/dist/docs-types.d.ts.map +1 -1
  344. package/dist/hooks/focusableSelector.d.ts +1 -1
  345. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  346. package/dist/hooks/focusableSelector.js +1 -1
  347. package/dist/hooks/index.d.ts +2 -0
  348. package/dist/hooks/index.d.ts.map +1 -1
  349. package/dist/hooks/index.js +1 -0
  350. package/dist/hooks/useFocusTrap.d.ts +3 -0
  351. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  352. package/dist/hooks/useFocusTrap.js +38 -1
  353. package/dist/hooks/useHotkeys.d.ts +51 -0
  354. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  355. package/dist/hooks/useHotkeys.js +160 -0
  356. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  357. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  358. package/dist/hooks/useInteractiveRole.js +6 -2
  359. package/dist/hooks/useKeyboardHint.js +9 -9
  360. package/dist/hooks/useStreamingText.d.ts +3 -1
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +14 -5
  363. package/dist/theme/MediaTheme.js +3 -3
  364. package/dist/theme/Theme.js +7 -7
  365. package/dist/theme/defineTheme.d.ts +1 -1
  366. package/dist/theme/defineTheme.d.ts.map +1 -1
  367. package/dist/theme/expandColorScale.d.ts.map +1 -1
  368. package/dist/theme/expandColorScale.js +10 -3
  369. package/dist/theme/hct.d.ts +0 -15
  370. package/dist/theme/hct.d.ts.map +1 -1
  371. package/dist/theme/hct.js +9 -9
  372. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  373. package/dist/theme/tokens.d.ts +10 -2
  374. package/dist/theme/tokens.d.ts.map +1 -1
  375. package/dist/theme/tokens.js +220 -4
  376. package/dist/utils/color.d.ts +42 -0
  377. package/dist/utils/color.d.ts.map +1 -0
  378. package/dist/utils/color.js +150 -0
  379. package/dist/utils/composeEventHandlers.d.ts +30 -0
  380. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  381. package/dist/utils/composeEventHandlers.js +40 -0
  382. package/dist/utils/index.d.ts +3 -0
  383. package/dist/utils/index.d.ts.map +1 -1
  384. package/dist/utils/index.js +3 -1
  385. package/dist/utils/timeParser.d.ts.map +1 -1
  386. package/dist/utils/timeParser.js +8 -5
  387. package/package.json +3 -3
  388. package/src/AlertDialog/AlertDialog.tsx +2 -0
  389. package/src/AppShell/AppShell.tsx +2 -0
  390. package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
  391. package/src/Avatar/Avatar.doc.mjs +13 -2
  392. package/src/Avatar/Avatar.test.tsx +32 -1
  393. package/src/Avatar/Avatar.tsx +12 -20
  394. package/src/Banner/Banner.doc.mjs +8 -0
  395. package/src/Banner/Banner.test.tsx +38 -0
  396. package/src/Banner/Banner.tsx +8 -1
  397. package/src/Button/Button.tsx +39 -6
  398. package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
  399. package/src/Calendar/Calendar.doc.mjs +1 -1
  400. package/src/Calendar/Calendar.test.tsx +201 -17
  401. package/src/Calendar/Calendar.tsx +79 -26
  402. package/src/Calendar/dayCellUtils.test.ts +306 -1
  403. package/src/Calendar/dayCellUtils.ts +206 -13
  404. package/src/Calendar/styles.ts +12 -2
  405. package/src/Card/Card.doc.mjs +1 -1
  406. package/src/Card/Card.tsx +16 -6
  407. package/src/Carousel/Carousel.doc.mjs +12 -12
  408. package/src/Carousel/Carousel.test.tsx +13 -0
  409. package/src/Carousel/Carousel.tsx +1 -0
  410. package/src/Chat/Chat.doc.mjs +1 -1
  411. package/src/Chat/ChatComposerInput.test.tsx +24 -0
  412. package/src/Chat/ChatComposerInput.tsx +17 -1
  413. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  414. package/src/Chat/ChatDictationButton.tsx +4 -4
  415. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  416. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  417. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  418. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  419. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  420. package/src/Chat/ChatSystemMessage.tsx +7 -7
  421. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  422. package/src/Chat/ChatTokenizedText.tsx +15 -8
  423. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  424. package/src/Chat/ChatToolCalls.tsx +10 -12
  425. package/src/Chat/index.ts +1 -4
  426. package/src/Chat/useChatNewMessages.test.tsx +4 -4
  427. package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
  428. package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
  429. package/src/CheckboxInput/CheckboxInput.tsx +13 -0
  430. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  431. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  432. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  433. package/src/Citation/Citation.doc.mjs +5 -0
  434. package/src/ClickableCard/ClickableCard.tsx +45 -2
  435. package/src/Code/Code.test.tsx +54 -0
  436. package/src/Code/Code.tsx +48 -4
  437. package/src/Code/index.ts +1 -1
  438. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  439. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  440. package/src/CodeBlock/CodeBlock.tsx +62 -4
  441. package/src/CodeBlock/index.ts +1 -1
  442. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  443. package/src/Collapsible/Collapsible.test.tsx +405 -0
  444. package/src/Collapsible/Collapsible.tsx +86 -10
  445. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  446. package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
  447. package/src/Collapsible/CollapsibleGroup.tsx +107 -9
  448. package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
  449. package/src/Collapsible/index.ts +4 -0
  450. package/src/Collapsible/useCollapsible.ts +20 -6
  451. package/src/CommandPalette/CommandPalette.tsx +5 -3
  452. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  453. package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
  454. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  455. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  456. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  457. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  458. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  459. package/src/ContextMenu/ContextMenu.test.tsx +15 -0
  460. package/src/ContextMenu/ContextMenu.tsx +19 -1
  461. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  462. package/src/DateInput/DateInput.doc.mjs +6 -1
  463. package/src/DateInput/DateInput.test.tsx +11 -20
  464. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  465. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  466. package/src/DateRangeInput/DateRangeInput.tsx +2 -2
  467. package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
  468. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  469. package/src/DateTimeInput/DateTimeInput.tsx +9 -8
  470. package/src/DateTimeInput/index.ts +1 -0
  471. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  472. package/src/Divider/Divider.tsx +1 -23
  473. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  474. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
  475. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  476. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  477. package/src/Field/Field.doc.mjs +1 -1
  478. package/src/Field/FieldLabel.test.tsx +2 -2
  479. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  480. package/src/FileInput/FileInput.doc.mjs +1 -1
  481. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  482. package/src/Grid/Grid.doc.mjs +3 -3
  483. package/src/Grid/Grid.test.tsx +43 -18
  484. package/src/Grid/Grid.tsx +26 -9
  485. package/src/Icon/Icon.test.tsx +41 -29
  486. package/src/Icon/Icon.tsx +6 -2
  487. package/src/InputGroup/InputGroup.tsx +2 -2
  488. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  489. package/src/Item/Item.tsx +1 -1
  490. package/src/Layout/Layout.test.tsx +285 -0
  491. package/src/Layout/LayoutContent.doc.mjs +12 -0
  492. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  493. package/src/Layout/LayoutSlots.test.tsx +364 -0
  494. package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Markdown/Markdown.test.tsx +23 -0
  499. package/src/Markdown/Markdown.tsx +9 -7
  500. package/src/Markdown/incremental.test.ts +36 -0
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/Markdown/parser.test.ts +210 -0
  503. package/src/Markdown/parser.ts +301 -6
  504. package/src/MobileNav/MobileNav.doc.mjs +20 -0
  505. package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
  506. package/src/MultiSelector/MultiSelector.test.tsx +33 -0
  507. package/src/MultiSelector/MultiSelector.tsx +20 -0
  508. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  509. package/src/NumberInput/NumberInput.test.tsx +48 -3
  510. package/src/NumberInput/NumberInput.tsx +32 -15
  511. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  512. package/src/OverflowList/OverflowList.test.tsx +416 -0
  513. package/src/Overlay/Overlay.doc.mjs +6 -0
  514. package/src/Overlay/Overlay.test.tsx +356 -0
  515. package/src/Pagination/Pagination.test.tsx +162 -0
  516. package/src/Pagination/Pagination.tsx +80 -26
  517. package/src/Popover/Popover.test.tsx +65 -0
  518. package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  522. package/src/ProgressBar/ProgressBar.tsx +12 -5
  523. package/src/RadioList/RadioList.doc.mjs +7 -1
  524. package/src/RadioList/RadioList.test.tsx +65 -0
  525. package/src/RadioList/RadioList.tsx +10 -1
  526. package/src/RadioList/RadioListItem.tsx +13 -4
  527. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  528. package/src/Resizable/ResizeHandle.tsx +22 -4
  529. package/src/Section/Section.test.tsx +4 -10
  530. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  531. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  532. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  533. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  534. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  535. package/src/Selector/Selector.doc.mjs +12 -1
  536. package/src/Selector/Selector.test.tsx +30 -0
  537. package/src/Selector/Selector.tsx +18 -0
  538. package/src/SideNav/SideNav.doc.mjs +7 -1
  539. package/src/SideNav/SideNav.test.tsx +66 -0
  540. package/src/SideNav/SideNav.tsx +6 -2
  541. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  542. package/src/SideNav/SideNavSection.tsx +6 -4
  543. package/src/SizeContext/SizeContext.test.tsx +226 -0
  544. package/src/Slider/Slider.doc.mjs +14 -2
  545. package/src/Slider/Slider.test.tsx +30 -0
  546. package/src/Slider/Slider.tsx +20 -0
  547. package/src/Spinner/Spinner.tsx +1 -0
  548. package/src/Switch/Switch.doc.mjs +21 -9
  549. package/src/Switch/Switch.test.tsx +137 -0
  550. package/src/Switch/Switch.tsx +32 -7
  551. package/src/TabList/TabList.doc.mjs +3 -3
  552. package/src/TabList/TabList.test.tsx +185 -1
  553. package/src/TabList/TabMenu.tsx +45 -9
  554. package/src/Table/BaseTable.tsx +16 -3
  555. package/src/Table/Table.test.tsx +87 -0
  556. package/src/Table/TableBody.tsx +15 -2
  557. package/src/Table/TableCell.tsx +87 -8
  558. package/src/Table/TableFooter.tsx +15 -2
  559. package/src/Table/TableHeader.tsx +15 -2
  560. package/src/Table/index.ts +5 -0
  561. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  562. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  563. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  564. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  565. package/src/Table/plugins/rowExpansion/index.ts +7 -0
  566. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
  567. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
  568. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  569. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  570. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  571. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  572. package/src/Table/tableContextMenu.test.tsx +27 -3
  573. package/src/Table/tableContextMenu.tsx +20 -2
  574. package/src/Table/useTablePagination.doc.mjs +4 -1
  575. package/src/Table/useTableRowExpansion.doc.mjs +80 -0
  576. package/src/Table/useTableSortable.doc.mjs +4 -1
  577. package/src/Text/Text.doc.mjs +2 -2
  578. package/src/Text/Text.test.tsx +11 -0
  579. package/src/Text/Text.tsx +4 -2
  580. package/src/Text/text.stylex.ts +41 -0
  581. package/src/TextArea/TextArea.doc.mjs +1 -1
  582. package/src/TextArea/TextArea.test.tsx +3 -3
  583. package/src/TextInput/TextInput.doc.mjs +1 -1
  584. package/src/TextInput/TextInput.test.tsx +3 -3
  585. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  586. package/src/Thumbnail/Thumbnail.tsx +4 -2
  587. package/src/TimeInput/TimeInput.doc.mjs +11 -6
  588. package/src/TimeInput/TimeInput.test.tsx +37 -0
  589. package/src/TimeInput/TimeInput.tsx +11 -1
  590. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  591. package/src/Timestamp/Timestamp.test.tsx +52 -0
  592. package/src/Timestamp/Timestamp.tsx +30 -16
  593. package/src/Toast/Toast.tsx +11 -3
  594. package/src/Toast/ToastViewport.test.tsx +64 -0
  595. package/src/Toast/ToastViewport.tsx +12 -0
  596. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  597. package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
  598. package/src/Tokenizer/Tokenizer.test.tsx +33 -0
  599. package/src/Tokenizer/Tokenizer.tsx +19 -0
  600. package/src/Toolbar/Toolbar.test.tsx +1 -1
  601. package/src/TopNav/TopNav.doc.mjs +1 -1
  602. package/src/TopNav/TopNav.test.tsx +18 -0
  603. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  604. package/src/TreeList/TreeList.doc.mjs +2 -2
  605. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  606. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  607. package/src/Typeahead/Typeahead.doc.mjs +7 -2
  608. package/src/Typeahead/Typeahead.test.tsx +45 -1
  609. package/src/__tests__/TestIcon.tsx +26 -0
  610. package/src/__tests__/fastRoleQueries.ts +66 -0
  611. package/src/docPropReferences.test.ts +178 -0
  612. package/src/docs-types.ts +14 -0
  613. package/src/hooks/focusableSelector.ts +1 -1
  614. package/src/hooks/index.ts +3 -0
  615. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  616. package/src/hooks/useFocusTrap.test.tsx +149 -1
  617. package/src/hooks/useFocusTrap.ts +50 -1
  618. package/src/hooks/useHotkeys.doc.mjs +52 -0
  619. package/src/hooks/useHotkeys.test.ts +245 -0
  620. package/src/hooks/useHotkeys.ts +203 -0
  621. package/src/hooks/useInteractiveRole.ts +12 -4
  622. package/src/hooks/useKeyboardHint.doc.mjs +6 -6
  623. package/src/hooks/useStreamingText.test.ts +54 -19
  624. package/src/hooks/useStreamingText.ts +16 -5
  625. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  626. package/src/theme/defineTheme.ts +4 -13
  627. package/src/theme/derivedVarRegistry.test.ts +2 -2
  628. package/src/theme/expandColorScale.test.ts +29 -0
  629. package/src/theme/expandColorScale.ts +11 -6
  630. package/src/theme/hct.ts +9 -17
  631. package/src/theme/tokens.test.ts +182 -9
  632. package/src/theme/tokens.ts +239 -4
  633. package/src/theme/useTheme.test.tsx +20 -0
  634. package/src/utils/color.test.ts +133 -0
  635. package/src/utils/color.ts +148 -0
  636. package/src/utils/composeEventHandlers.test.ts +71 -0
  637. package/src/utils/composeEventHandlers.ts +44 -0
  638. package/src/utils/index.ts +4 -0
  639. package/src/utils/mergeProps.test.ts +166 -0
  640. package/src/utils/sharedResizeObserver.test.ts +2 -2
  641. package/src/utils/timeParser.test.ts +13 -0
  642. package/src/utils/timeParser.ts +8 -5
@@ -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
+ }
@@ -64,9 +64,19 @@ export const calendarStyles = stylex.create({
64
64
  whiteSpace: 'nowrap',
65
65
  borderWidth: 0,
66
66
  },
67
+ /**
68
+ * Wrapper for the month nav chevrons. In RTL the flex header already
69
+ * swaps the buttons' visual sides; the glyphs must mirror with them so
70
+ * "Previous month" points outward (visually right) instead of inward.
71
+ * Keyed on the dir attribute (dir="rtl"), same as MobileNav's drawer
72
+ * transform — bare CSS `direction: rtl` alone won't trigger it.
73
+ */
67
74
  navIcon: {
68
- width: spacingVars['--spacing-4'],
69
- height: spacingVars['--spacing-4'],
75
+ display: 'inline-flex',
76
+ transform: {
77
+ default: null,
78
+ ':is([dir="rtl"] *)': 'scaleX(-1)',
79
+ },
70
80
  },
71
81
  });
72
82
 
@@ -84,7 +84,7 @@ export const docs = {
84
84
  theming: {
85
85
  container: true,
86
86
  targets: [
87
- {className: 'astryx-card'},
87
+ {className: 'astryx-card', visualProps: ['variant']},
88
88
  ],
89
89
  vars: [
90
90
  {name: '--_card-radius', description: 'Border radius of the card', default: 'var(--radius-container)', private: true},
package/src/Card/Card.tsx CHANGED
@@ -44,8 +44,10 @@ import {themeProps} from '../utils/themeProps';
44
44
  * - Non-semantic palette: `blue | cyan | gray | green | orange | pink | purple | red | teal | yellow`
45
45
  * Each uses the corresponding `--color-background-<name>` token (20% opacity tint).
46
46
  *
47
- * All variants include a transparent border to prevent layout jitter
48
- * when switching variants. Themes can override borderWidth/borderColor.
47
+ * Only `default` draws a visible border. Its border width is subtracted from
48
+ * the padding so the total inset (border + padding) equals the padding token —
49
+ * keeping content geometry faithful to the spacing scale and identical to the
50
+ * borderless variants. Themes can override borderWidth/borderColor.
49
51
  */
50
52
  export type CardVariant =
51
53
  | 'default'
@@ -71,12 +73,18 @@ const styles = stylex.create({
71
73
  '--_card-radius': radiusVars['--radius-container'],
72
74
  borderRadius: 'var(--_card-radius)',
73
75
  overflow: 'clip',
74
- borderWidth: borderVars['--border-width'],
75
- borderStyle: 'solid',
76
- borderColor: 'transparent',
77
76
  },
77
+ // The border is drawn *inside* the padding — its width is subtracted from
78
+ // each side — so total inset (border + padding) equals the padding token
79
+ // rather than exceeding it by the border width.
78
80
  withBorder: {
81
+ borderWidth: borderVars['--border-width'],
82
+ borderStyle: 'solid',
79
83
  borderColor: colorVars['--color-border-emphasized'],
84
+ paddingInlineStart: `calc(var(--container-padding-inline-start) - ${borderVars['--border-width']})`,
85
+ paddingInlineEnd: `calc(var(--container-padding-inline-end) - ${borderVars['--border-width']})`,
86
+ paddingBlockStart: `calc(var(--container-padding-block-start) - ${borderVars['--border-width']})`,
87
+ paddingBlockEnd: `calc(var(--container-padding-block-end) - ${borderVars['--border-width']})`,
80
88
  },
81
89
  // Fixed-height cards scroll content; overflow: auto also clips to border-radius
82
90
  scrollable: {
@@ -266,7 +274,6 @@ export function Card({
266
274
  stylex.props(
267
275
  styles.card,
268
276
  variantStyles[variant],
269
- variant === 'default' && styles.withBorder,
270
277
  hasFixedHeight && styles.scrollable,
271
278
  dynamicStyles.sizing(
272
279
  width ?? null,
@@ -296,6 +303,9 @@ export function Card({
296
303
  !useThemeDefault &&
297
304
  effectivePadding !== 4 &&
298
305
  containerPaddingBlockEndVarStyles[effectivePadding],
306
+ // Applied after the container padding so the border-inset calc wins;
307
+ // it reads the --container-padding-* vars set above.
308
+ variant === 'default' && styles.withBorder,
299
309
  xstyle,
300
310
  ),
301
311
  className,