@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052

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 (728) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +6 -2
  4. package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
  5. package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
  6. package/dist/Avatar/Avatar.d.ts +58 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +240 -53
  9. package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
  10. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  11. package/dist/Avatar/AvatarStatusDot.js +144 -19
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +58 -6
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
  17. package/dist/Banner/Banner.d.ts +9 -1
  18. package/dist/Banner/Banner.d.ts.map +1 -1
  19. package/dist/Banner/Banner.js +33 -4
  20. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
  21. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
  23. package/dist/Breadcrumbs/index.d.ts +6 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +10 -1
  26. package/dist/Button/Button.d.ts +8 -2
  27. package/dist/Button/Button.d.ts.map +1 -1
  28. package/dist/Button/Button.js +33 -4
  29. package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
  30. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  31. package/dist/ButtonGroup/ButtonGroup.js +30 -1
  32. package/dist/Calendar/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar/Calendar.js +80 -11
  34. package/dist/Calendar/dayCellUtils.d.ts +4 -4
  35. package/dist/Calendar/dayCellUtils.js +3 -3
  36. package/dist/Calendar/styles.d.ts +30 -31
  37. package/dist/Calendar/styles.d.ts.map +1 -1
  38. package/dist/Calendar/styles.js +30 -31
  39. package/dist/Card/Card.d.ts +8 -2
  40. package/dist/Card/Card.d.ts.map +1 -1
  41. package/dist/Card/Card.js +28 -2
  42. package/dist/Carousel/Carousel.d.ts +4 -1
  43. package/dist/Carousel/Carousel.d.ts.map +1 -1
  44. package/dist/Carousel/Carousel.js +46 -16
  45. package/dist/Chat/ChatComposer.d.ts +8 -0
  46. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  47. package/dist/Chat/ChatComposer.js +46 -7
  48. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  49. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  50. package/dist/Chat/ChatComposerDrawer.js +11 -1
  51. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  52. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  53. package/dist/Chat/ChatComposerInput.js +36 -4
  54. package/dist/Chat/ChatContext.d.ts +33 -0
  55. package/dist/Chat/ChatContext.d.ts.map +1 -1
  56. package/dist/Chat/ChatContext.js +16 -2
  57. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatDictationButton.js +4 -2
  59. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  60. package/dist/Chat/ChatLayout.js +4 -4
  61. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  62. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  63. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  64. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  65. package/dist/Chat/ChatSendButton.js +7 -1
  66. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +27 -11
  69. package/dist/Chat/index.d.ts +2 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/index.js +1 -1
  72. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  73. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  74. package/dist/Chat/useChatStreamScroll.js +22 -8
  75. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  76. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  77. package/dist/Chat/useSpeechRecognition.js +1 -1
  78. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  79. package/dist/Chat/useTriggerMenu.js +2 -2
  80. package/dist/CheckboxInput/CheckboxInput.js +5 -5
  81. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  82. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  83. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  84. package/dist/Citation/Citation.d.ts +22 -1
  85. package/dist/Citation/Citation.d.ts.map +1 -1
  86. package/dist/Citation/Citation.js +20 -6
  87. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  88. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  89. package/dist/ClickableCard/ClickableCard.js +5 -2
  90. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  91. package/dist/CodeBlock/CodeBlock.js +22 -9
  92. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  93. package/dist/Collapsible/Collapsible.js +3 -1
  94. package/dist/CommandPalette/CommandPalette.d.ts +2 -2
  95. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  96. package/dist/CommandPalette/CommandPalette.js +45 -4
  97. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  98. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  99. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  100. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  101. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  102. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  103. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  104. package/dist/ContextMenu/ContextMenu.js +14 -5
  105. package/dist/ContextMenu/index.d.ts +1 -0
  106. package/dist/ContextMenu/index.d.ts.map +1 -1
  107. package/dist/ContextMenu/index.js +3 -1
  108. package/dist/DateInput/DateInput.d.ts +56 -2
  109. package/dist/DateInput/DateInput.d.ts.map +1 -1
  110. package/dist/DateInput/DateInput.js +59 -21
  111. package/dist/DateInput/index.d.ts +1 -1
  112. package/dist/DateInput/index.d.ts.map +1 -1
  113. package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
  114. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  115. package/dist/DateRangeInput/DateRangeInput.js +23 -20
  116. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  117. package/dist/DateTimeInput/DateTimeInput.js +33 -19
  118. package/dist/Dialog/Dialog.d.ts +3 -0
  119. package/dist/Dialog/Dialog.d.ts.map +1 -1
  120. package/dist/Dialog/Dialog.js +57 -6
  121. package/dist/Dialog/DialogContext.d.ts +7 -0
  122. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  123. package/dist/Dialog/DialogContext.js +2 -2
  124. package/dist/Dialog/DialogHeader.d.ts +5 -2
  125. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  126. package/dist/Dialog/DialogHeader.js +6 -1
  127. package/dist/Divider/Divider.js +1 -1
  128. package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
  129. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  130. package/dist/DropdownMenu/DropdownMenu.js +22 -5
  131. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  132. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  133. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
  134. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  135. package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
  136. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  137. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  138. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  139. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  140. package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
  141. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
  142. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
  143. package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
  144. package/dist/DropdownMenu/index.d.ts +10 -0
  145. package/dist/DropdownMenu/index.d.ts.map +1 -1
  146. package/dist/DropdownMenu/index.js +13 -0
  147. package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
  148. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
  149. package/dist/DropdownMenu/menuItemHover.js +33 -0
  150. package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
  151. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
  152. package/dist/DropdownMenu/menuItemRoles.js +10 -1
  153. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  154. package/dist/DropdownMenu/renderDropdownItems.js +21 -6
  155. package/dist/Field/Field.d.ts +3 -1
  156. package/dist/Field/Field.d.ts.map +1 -1
  157. package/dist/Field/Field.js +6 -4
  158. package/dist/Field/FieldLabel.d.ts +1 -1
  159. package/dist/Field/FieldLabel.d.ts.map +1 -1
  160. package/dist/Field/FieldLabel.js +43 -16
  161. package/dist/Field/inputStyles.stylex.d.ts +1 -0
  162. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  163. package/dist/Field/inputStyles.stylex.js +1 -0
  164. package/dist/FieldStatus/FieldStatus.d.ts +18 -0
  165. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  166. package/dist/FieldStatus/FieldStatus.js +60 -6
  167. package/dist/FileInput/FileInput.d.ts +10 -2
  168. package/dist/FileInput/FileInput.d.ts.map +1 -1
  169. package/dist/FileInput/FileInput.js +54 -35
  170. package/dist/HoverCard/HoverCard.d.ts +9 -1
  171. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  172. package/dist/HoverCard/HoverCard.js +2 -0
  173. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  174. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  175. package/dist/HoverCard/useHoverCard.js +17 -6
  176. package/dist/Icon/Icon.d.ts +22 -3
  177. package/dist/Icon/Icon.d.ts.map +1 -1
  178. package/dist/Icon/Icon.js +19 -3
  179. package/dist/Item/Item.d.ts +6 -1
  180. package/dist/Item/Item.d.ts.map +1 -1
  181. package/dist/Item/Item.js +22 -1
  182. package/dist/Layer/useLayer.d.ts +6 -0
  183. package/dist/Layer/useLayer.d.ts.map +1 -1
  184. package/dist/Layer/useLayer.js +2 -0
  185. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  186. package/dist/Lightbox/Lightbox.js +19 -13
  187. package/dist/Markdown/Markdown.d.ts.map +1 -1
  188. package/dist/Markdown/Markdown.js +7 -0
  189. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  190. package/dist/MobileNav/MobileNav.js +6 -1
  191. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  192. package/dist/MobileNav/MobileNavToggle.js +4 -0
  193. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  194. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  195. package/dist/MultiSelector/MultiSelector.js +104 -50
  196. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  197. package/dist/MultiSelector/hooks.js +16 -0
  198. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  199. package/dist/NumberInput/NumberInput.d.ts +10 -2
  200. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  201. package/dist/NumberInput/NumberInput.js +22 -17
  202. package/dist/Outline/Outline.d.ts +0 -1
  203. package/dist/Outline/Outline.d.ts.map +1 -1
  204. package/dist/Outline/Outline.js +0 -1
  205. package/dist/OverflowList/OverflowList.d.ts +20 -3
  206. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  207. package/dist/OverflowList/OverflowList.js +29 -4
  208. package/dist/Pagination/Pagination.d.ts.map +1 -1
  209. package/dist/Pagination/Pagination.js +11 -3
  210. package/dist/Popover/Popover.d.ts.map +1 -1
  211. package/dist/Popover/Popover.js +3 -2
  212. package/dist/Popover/usePopover.d.ts.map +1 -1
  213. package/dist/Popover/usePopover.js +3 -9
  214. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  215. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  216. package/dist/PowerSearch/PowerSearch.js +2 -0
  217. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  218. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  219. package/dist/RadioList/RadioList.d.ts +2 -2
  220. package/dist/RadioList/RadioListItem.js +4 -4
  221. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  222. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  223. package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
  224. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  225. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  226. package/dist/SelectableCard/SelectableCard.js +16 -13
  227. package/dist/Selector/Selector.d.ts +8 -0
  228. package/dist/Selector/Selector.d.ts.map +1 -1
  229. package/dist/Selector/Selector.js +65 -19
  230. package/dist/Selector/hooks.d.ts.map +1 -1
  231. package/dist/Selector/hooks.js +16 -0
  232. package/dist/SideNav/SideNav.d.ts.map +1 -1
  233. package/dist/SideNav/SideNav.js +5 -5
  234. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  235. package/dist/SideNav/SideNavCollapseButton.js +13 -10
  236. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  237. package/dist/SideNav/SideNavHeading.js +21 -8
  238. package/dist/SideNav/SideNavItem.d.ts +1 -1
  239. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  240. package/dist/SideNav/SideNavItem.js +12 -10
  241. package/dist/Slider/Slider.d.ts.map +1 -1
  242. package/dist/Slider/Slider.js +106 -36
  243. package/dist/Stack/stack.stylex.d.ts +9 -9
  244. package/dist/Switch/Switch.d.ts +8 -1
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +160 -91
  247. package/dist/TabList/Tab.js +2 -2
  248. package/dist/TabList/TabMenu.js +1 -1
  249. package/dist/Table/BaseTable.d.ts.map +1 -1
  250. package/dist/Table/BaseTable.js +33 -6
  251. package/dist/Table/TableCell.js +3 -3
  252. package/dist/Table/TableHeaderCell.js +3 -3
  253. package/dist/Table/index.d.ts +2 -0
  254. package/dist/Table/index.d.ts.map +1 -1
  255. package/dist/Table/index.js +1 -0
  256. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  257. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
  258. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  259. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
  260. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  261. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  262. package/dist/Table/plugins/rowStatus/index.js +3 -0
  263. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  264. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  265. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  266. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  267. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  268. package/dist/Table/plugins/selection/useTableSelection.js +7 -1
  269. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  270. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  271. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  272. package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
  273. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  274. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  275. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  276. package/dist/Table/types.d.ts +32 -0
  277. package/dist/Table/types.d.ts.map +1 -1
  278. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  279. package/dist/Table/useBaseTablePlugins.js +5 -3
  280. package/dist/TextArea/TextArea.d.ts +10 -1
  281. package/dist/TextArea/TextArea.d.ts.map +1 -1
  282. package/dist/TextArea/TextArea.js +18 -19
  283. package/dist/TextInput/TextInput.d.ts +10 -2
  284. package/dist/TextInput/TextInput.d.ts.map +1 -1
  285. package/dist/TextInput/TextInput.js +20 -17
  286. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  287. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  288. package/dist/Thumbnail/Thumbnail.js +97 -54
  289. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  290. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  291. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  292. package/dist/TimeInput/TimeInput.d.ts +10 -2
  293. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  294. package/dist/TimeInput/TimeInput.js +32 -21
  295. package/dist/Timestamp/Timestamp.d.ts +3 -1
  296. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  297. package/dist/Timestamp/Timestamp.js +8 -6
  298. package/dist/Toast/useToast.d.ts.map +1 -1
  299. package/dist/Toast/useToast.js +2 -5
  300. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  301. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  302. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  303. package/dist/Token/Token.d.ts +30 -3
  304. package/dist/Token/Token.d.ts.map +1 -1
  305. package/dist/Token/Token.js +17 -2
  306. package/dist/Token/index.d.ts +1 -1
  307. package/dist/Token/index.d.ts.map +1 -1
  308. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  309. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  310. package/dist/Tokenizer/Tokenizer.js +20 -6
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +17 -1
  313. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  314. package/dist/TopNav/TopNavHeading.js +18 -8
  315. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  316. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  319. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  320. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  321. package/dist/TopNav/TopNavMenu.js +68 -6
  322. package/dist/TreeList/TreeList.d.ts +12 -3
  323. package/dist/TreeList/TreeList.d.ts.map +1 -1
  324. package/dist/TreeList/TreeList.js +3 -0
  325. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  326. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  327. package/dist/TreeList/TreeListBranches.js +18 -10
  328. package/dist/TreeList/TreeListItem.d.ts +8 -2
  329. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  330. package/dist/TreeList/TreeListItem.js +59 -21
  331. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  332. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  333. package/dist/TreeList/index.d.ts +2 -2
  334. package/dist/TreeList/index.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  336. package/dist/Typeahead/BaseTypeahead.js +20 -11
  337. package/dist/Typeahead/Typeahead.d.ts +9 -2
  338. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  339. package/dist/Typeahead/Typeahead.js +3 -1
  340. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  341. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  342. package/dist/Typeahead/TypeaheadItem.js +20 -10
  343. package/dist/astryx.css +61 -39
  344. package/dist/astryx.umd.js +53 -53
  345. package/dist/astryx.umd.js.map +4 -4
  346. package/dist/authoring/doc.d.ts.map +1 -1
  347. package/dist/docs-types.d.ts +8 -0
  348. package/dist/docs-types.d.ts.map +1 -1
  349. package/dist/hooks/computeOverflow.d.ts +47 -0
  350. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  351. package/dist/hooks/computeOverflow.js +213 -0
  352. package/dist/hooks/index.d.ts +3 -0
  353. package/dist/hooks/index.d.ts.map +1 -1
  354. package/dist/hooks/index.js +3 -1
  355. package/dist/hooks/isRtlElement.d.ts +18 -0
  356. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  357. package/dist/hooks/isRtlElement.js +27 -0
  358. package/dist/hooks/useDevWarning.d.ts +18 -0
  359. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  360. package/dist/hooks/useDevWarning.js +49 -0
  361. package/dist/hooks/useGridFocus.d.ts +6 -1
  362. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  363. package/dist/hooks/useGridFocus.js +12 -9
  364. package/dist/hooks/useInputStatusIcon.d.ts +38 -0
  365. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
  366. package/dist/hooks/useInputStatusIcon.js +158 -0
  367. package/dist/hooks/useListFocus.d.ts +39 -1
  368. package/dist/hooks/useListFocus.d.ts.map +1 -1
  369. package/dist/hooks/useListFocus.js +54 -9
  370. package/dist/hooks/useOverflow.d.ts +19 -0
  371. package/dist/hooks/useOverflow.d.ts.map +1 -1
  372. package/dist/hooks/useOverflow.js +36 -25
  373. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  374. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  375. package/dist/i18n/InternationalizationContext.js +3 -0
  376. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  377. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  378. package/dist/i18n/InternationalizationProvider.js +5 -1
  379. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  380. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  381. package/dist/i18n/getLocaleDirection.js +29 -0
  382. package/dist/i18n/index.d.ts +6 -0
  383. package/dist/i18n/index.d.ts.map +1 -1
  384. package/dist/i18n/index.js +7 -1
  385. package/dist/i18n/resolve.d.ts.map +1 -1
  386. package/dist/i18n/resolve.js +7 -18
  387. package/dist/i18n/useDirection.d.ts +2 -0
  388. package/dist/i18n/useDirection.d.ts.map +1 -0
  389. package/dist/i18n/useDirection.js +27 -0
  390. package/dist/theme/Theme.d.ts.map +1 -1
  391. package/dist/theme/Theme.js +2 -7
  392. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  393. package/dist/theme/derivedVarRegistry.js +13 -0
  394. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  395. package/dist/theme/generateThemeRules.js +51 -0
  396. package/dist/theme/hct.d.ts +0 -1
  397. package/dist/theme/hct.d.ts.map +1 -1
  398. package/dist/theme/hct.js +1 -1
  399. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  400. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  401. package/dist/utils/devWarning.d.ts +42 -0
  402. package/dist/utils/devWarning.d.ts.map +1 -0
  403. package/dist/utils/devWarning.js +88 -0
  404. package/dist/utils/index.d.ts +4 -1
  405. package/dist/utils/index.d.ts.map +1 -1
  406. package/dist/utils/index.js +4 -2
  407. package/dist/utils/plainDate.d.ts +30 -0
  408. package/dist/utils/plainDate.d.ts.map +1 -1
  409. package/dist/utils/plainDate.js +65 -3
  410. package/dist/utils/rtlStyles.d.ts +24 -0
  411. package/dist/utils/rtlStyles.d.ts.map +1 -0
  412. package/dist/utils/rtlStyles.js +27 -0
  413. package/dist/utils/types.d.ts +13 -0
  414. package/dist/utils/types.d.ts.map +1 -1
  415. package/locales/en.json +104 -0
  416. package/locales/fr-FR.json +14 -0
  417. package/locales/pseudo.json +78 -0
  418. package/package.json +6 -1
  419. package/src/AppShell/AppShell.tsx +6 -0
  420. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  421. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  422. package/src/Avatar/Avatar.doc.mjs +64 -5
  423. package/src/Avatar/Avatar.test.tsx +374 -1
  424. package/src/Avatar/Avatar.tsx +367 -69
  425. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  426. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  427. package/src/Avatar/AvatarStatusDot.tsx +180 -21
  428. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  429. package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
  430. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  431. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  432. package/src/Banner/Banner.doc.mjs +9 -0
  433. package/src/Banner/Banner.test.tsx +30 -0
  434. package/src/Banner/Banner.tsx +53 -9
  435. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  436. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  437. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  438. package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
  439. package/src/Breadcrumbs/index.ts +31 -0
  440. package/src/Button/Button.doc.mjs +9 -4
  441. package/src/Button/Button.test.tsx +49 -0
  442. package/src/Button/Button.tsx +27 -3
  443. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  444. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  445. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  446. package/src/Calendar/Calendar.doc.mjs +12 -1
  447. package/src/Calendar/Calendar.test.tsx +362 -19
  448. package/src/Calendar/Calendar.tsx +111 -32
  449. package/src/Calendar/dayCellUtils.test.ts +23 -18
  450. package/src/Calendar/dayCellUtils.ts +3 -3
  451. package/src/Calendar/styles.ts +33 -39
  452. package/src/Card/Card.doc.mjs +9 -0
  453. package/src/Card/Card.test.tsx +21 -3
  454. package/src/Card/Card.tsx +35 -2
  455. package/src/Carousel/Carousel.doc.mjs +1 -0
  456. package/src/Carousel/Carousel.test.tsx +53 -0
  457. package/src/Carousel/Carousel.tsx +59 -10
  458. package/src/Chat/ChatComposer.doc.mjs +12 -3
  459. package/src/Chat/ChatComposer.test.tsx +115 -0
  460. package/src/Chat/ChatComposer.tsx +73 -9
  461. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  462. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  463. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  464. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  465. package/src/Chat/ChatComposerInput.tsx +51 -5
  466. package/src/Chat/ChatContext.tsx +37 -10
  467. package/src/Chat/ChatDictationButton.tsx +11 -2
  468. package/src/Chat/ChatLayout.tsx +7 -5
  469. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  470. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  471. package/src/Chat/ChatSendButton.tsx +11 -1
  472. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  473. package/src/Chat/ChatToolCalls.tsx +33 -5
  474. package/src/Chat/index.ts +5 -1
  475. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  476. package/src/Chat/useChatStreamScroll.ts +27 -10
  477. package/src/Chat/useSpeechRecognition.ts +1 -1
  478. package/src/Chat/useTriggerMenu.tsx +4 -2
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
  480. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  481. package/src/CheckboxInput/CheckboxInput.tsx +5 -5
  482. package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
  483. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  484. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  485. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  486. package/src/Citation/Citation.doc.mjs +4 -3
  487. package/src/Citation/Citation.test.tsx +97 -0
  488. package/src/Citation/Citation.tsx +43 -11
  489. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  490. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  491. package/src/ClickableCard/ClickableCard.tsx +13 -3
  492. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  493. package/src/CodeBlock/CodeBlock.tsx +45 -10
  494. package/src/Collapsible/Collapsible.doc.mjs +1 -0
  495. package/src/Collapsible/Collapsible.test.tsx +7 -0
  496. package/src/Collapsible/Collapsible.tsx +16 -6
  497. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  498. package/src/CommandPalette/CommandPalette.test.tsx +95 -1
  499. package/src/CommandPalette/CommandPalette.tsx +44 -3
  500. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  501. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  502. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  503. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  504. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  505. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  506. package/src/ContextMenu/ContextMenu.test.tsx +235 -0
  507. package/src/ContextMenu/ContextMenu.tsx +13 -11
  508. package/src/ContextMenu/index.ts +5 -0
  509. package/src/DateInput/DateInput.doc.mjs +41 -0
  510. package/src/DateInput/DateInput.test.tsx +338 -0
  511. package/src/DateInput/DateInput.tsx +119 -32
  512. package/src/DateInput/index.ts +1 -0
  513. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  514. package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
  515. package/src/DateRangeInput/DateRangeInput.tsx +42 -30
  516. package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
  517. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  518. package/src/DateTimeInput/DateTimeInput.tsx +58 -41
  519. package/src/Dialog/Dialog.doc.mjs +2 -2
  520. package/src/Dialog/Dialog.test.tsx +77 -4
  521. package/src/Dialog/Dialog.tsx +89 -5
  522. package/src/Dialog/DialogContext.ts +9 -2
  523. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  524. package/src/Dialog/DialogHeader.tsx +9 -2
  525. package/src/Divider/Divider.tsx +2 -2
  526. package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
  527. package/src/DropdownMenu/DropdownMenu.tsx +31 -12
  528. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
  529. package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
  530. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  531. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
  532. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
  533. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
  534. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
  535. package/src/DropdownMenu/index.ts +16 -0
  536. package/src/DropdownMenu/menuItemHover.ts +39 -0
  537. package/src/DropdownMenu/menuItemRoles.ts +9 -0
  538. package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
  539. package/src/Field/Field.test.tsx +57 -12
  540. package/src/Field/Field.tsx +20 -14
  541. package/src/Field/FieldLabel.tsx +9 -1
  542. package/src/Field/inputStyles.stylex.ts +2 -0
  543. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  544. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  545. package/src/FieldStatus/FieldStatus.tsx +69 -5
  546. package/src/FileInput/FileInput.doc.mjs +23 -2
  547. package/src/FileInput/FileInput.test.tsx +135 -12
  548. package/src/FileInput/FileInput.tsx +65 -51
  549. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  550. package/src/HoverCard/HoverCard.test.tsx +21 -2
  551. package/src/HoverCard/HoverCard.tsx +11 -0
  552. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  553. package/src/HoverCard/useHoverCard.tsx +39 -5
  554. package/src/Icon/Icon.doc.mjs +16 -2
  555. package/src/Icon/Icon.test.tsx +89 -0
  556. package/src/Icon/Icon.tsx +58 -5
  557. package/src/IconButton/IconButton.doc.mjs +8 -0
  558. package/src/IconButton/IconButton.test.tsx +15 -18
  559. package/src/Item/Item.test.tsx +40 -18
  560. package/src/Item/Item.tsx +38 -2
  561. package/src/Layer/useLayer.tsx +8 -0
  562. package/src/Lightbox/Lightbox.tsx +15 -7
  563. package/src/List/List.test.tsx +9 -8
  564. package/src/Markdown/Markdown.test.tsx +21 -0
  565. package/src/Markdown/Markdown.tsx +4 -0
  566. package/src/MobileNav/MobileNav.tsx +12 -1
  567. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  568. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  569. package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
  570. package/src/MultiSelector/MultiSelector.test.tsx +498 -3
  571. package/src/MultiSelector/MultiSelector.tsx +149 -65
  572. package/src/MultiSelector/hooks.ts +17 -0
  573. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  574. package/src/NumberInput/NumberInput.doc.mjs +21 -0
  575. package/src/NumberInput/NumberInput.test.tsx +82 -7
  576. package/src/NumberInput/NumberInput.tsx +36 -28
  577. package/src/Outline/Outline.tsx +0 -1
  578. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  579. package/src/OverflowList/OverflowList.test.tsx +111 -0
  580. package/src/OverflowList/OverflowList.tsx +48 -8
  581. package/src/Pagination/Pagination.tsx +11 -3
  582. package/src/Popover/Popover.tsx +7 -4
  583. package/src/Popover/usePopover.tsx +9 -13
  584. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  585. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  586. package/src/PowerSearch/PowerSearch.tsx +10 -1
  587. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  588. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  589. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  590. package/src/RadioList/RadioList.doc.mjs +6 -0
  591. package/src/RadioList/RadioList.tsx +2 -2
  592. package/src/RadioList/RadioListItem.tsx +4 -4
  593. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
  594. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  595. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  596. package/src/SelectableCard/SelectableCard.tsx +29 -16
  597. package/src/Selector/Selector.doc.mjs +15 -0
  598. package/src/Selector/Selector.test.tsx +417 -0
  599. package/src/Selector/Selector.tsx +86 -21
  600. package/src/Selector/hooks.ts +17 -0
  601. package/src/SideNav/SideNav.test.tsx +119 -3
  602. package/src/SideNav/SideNav.tsx +1 -8
  603. package/src/SideNav/SideNavCollapseButton.tsx +15 -8
  604. package/src/SideNav/SideNavHeading.tsx +24 -8
  605. package/src/SideNav/SideNavItem.tsx +10 -4
  606. package/src/Slider/Slider.doc.mjs +6 -0
  607. package/src/Slider/Slider.test.tsx +314 -13
  608. package/src/Slider/Slider.tsx +117 -28
  609. package/src/Switch/Switch.doc.mjs +142 -42
  610. package/src/Switch/Switch.test.tsx +54 -1
  611. package/src/Switch/Switch.tsx +90 -33
  612. package/src/TabList/Tab.tsx +2 -2
  613. package/src/TabList/TabMenu.tsx +2 -2
  614. package/src/Table/BaseTable.tsx +37 -7
  615. package/src/Table/Table.doc.mjs +11 -0
  616. package/src/Table/Table.test.tsx +85 -0
  617. package/src/Table/TableCell.tsx +3 -3
  618. package/src/Table/TableHeaderCell.tsx +3 -3
  619. package/src/Table/index.ts +5 -0
  620. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
  621. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
  622. package/src/Table/plugins/rowStatus/index.ts +7 -0
  623. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  624. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  625. package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
  626. package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
  627. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  628. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  629. package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
  630. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  631. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  632. package/src/Table/types.ts +33 -0
  633. package/src/Table/useBaseTablePlugins.ts +10 -6
  634. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  635. package/src/Table/useTableSelection.doc.mjs +65 -14
  636. package/src/Table/useTableTreeData.doc.mjs +29 -0
  637. package/src/Table/useTableTreeState.doc.mjs +2 -2
  638. package/src/TextArea/TextArea.doc.mjs +21 -0
  639. package/src/TextArea/TextArea.test.tsx +32 -1
  640. package/src/TextArea/TextArea.tsx +27 -26
  641. package/src/TextInput/TextInput.doc.mjs +21 -0
  642. package/src/TextInput/TextInput.test.tsx +150 -0
  643. package/src/TextInput/TextInput.tsx +28 -25
  644. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  645. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  646. package/src/Thumbnail/Thumbnail.tsx +142 -42
  647. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  648. package/src/TimeInput/TimeInput.doc.mjs +21 -0
  649. package/src/TimeInput/TimeInput.test.tsx +99 -1
  650. package/src/TimeInput/TimeInput.tsx +43 -31
  651. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  652. package/src/Timestamp/Timestamp.test.tsx +32 -0
  653. package/src/Timestamp/Timestamp.tsx +28 -8
  654. package/src/Toast/useToast.tsx +7 -8
  655. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  656. package/src/Token/Token.test.tsx +21 -15
  657. package/src/Token/Token.tsx +31 -14
  658. package/src/Token/index.ts +1 -1
  659. package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
  660. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  661. package/src/Tokenizer/Tokenizer.tsx +30 -6
  662. package/src/Tooltip/Tooltip.test.tsx +46 -0
  663. package/src/Tooltip/useTooltip.tsx +20 -0
  664. package/src/TopNav/TopNav.test.tsx +125 -1
  665. package/src/TopNav/TopNavHeading.tsx +24 -8
  666. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  667. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  668. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  669. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  670. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  671. package/src/TopNav/TopNavMenu.tsx +83 -5
  672. package/src/TreeList/TreeList.doc.mjs +28 -0
  673. package/src/TreeList/TreeList.test.tsx +272 -0
  674. package/src/TreeList/TreeList.tsx +23 -2
  675. package/src/TreeList/TreeListBranches.tsx +24 -8
  676. package/src/TreeList/TreeListItem.tsx +84 -22
  677. package/src/TreeList/TreeListTypes.ts +27 -1
  678. package/src/TreeList/index.ts +2 -2
  679. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  680. package/src/Typeahead/Typeahead.doc.mjs +13 -0
  681. package/src/Typeahead/Typeahead.test.tsx +50 -0
  682. package/src/Typeahead/Typeahead.tsx +11 -1
  683. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  684. package/src/__tests__/inputWidthContract.test.tsx +62 -0
  685. package/src/authoring/doc.ts +1 -3
  686. package/src/doc-mjs.d.ts +19 -0
  687. package/src/docs-types.ts +5 -0
  688. package/src/hooks/computeOverflow.test.ts +422 -0
  689. package/src/hooks/computeOverflow.ts +290 -0
  690. package/src/hooks/index.ts +8 -0
  691. package/src/hooks/isRtlElement.ts +27 -0
  692. package/src/hooks/useDevWarning.test.tsx +45 -0
  693. package/src/hooks/useDevWarning.ts +54 -0
  694. package/src/hooks/useGridFocus.doc.mjs +3 -3
  695. package/src/hooks/useGridFocus.test.tsx +41 -0
  696. package/src/hooks/useGridFocus.ts +21 -10
  697. package/src/hooks/useInputStatusIcon.test.tsx +162 -0
  698. package/src/hooks/useInputStatusIcon.tsx +224 -0
  699. package/src/hooks/useListFocus.doc.mjs +25 -3
  700. package/src/hooks/useListFocus.test.tsx +153 -1
  701. package/src/hooks/useListFocus.ts +102 -9
  702. package/src/hooks/useOverflow.test.ts +96 -4
  703. package/src/hooks/useOverflow.ts +74 -33
  704. package/src/i18n/InternationalizationContext.ts +4 -0
  705. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  706. package/src/i18n/InternationalizationProvider.tsx +12 -2
  707. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  708. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  709. package/src/i18n/getLocaleDirection.ts +29 -0
  710. package/src/i18n/index.ts +6 -0
  711. package/src/i18n/resolve.ts +9 -21
  712. package/src/i18n/useDirection.ts +29 -0
  713. package/src/reset.css +0 -26
  714. package/src/reset.test.ts +60 -0
  715. package/src/theme/Theme.tsx +11 -14
  716. package/src/theme/derivedVarRegistry.test.ts +1 -0
  717. package/src/theme/derivedVarRegistry.ts +6 -0
  718. package/src/theme/generateThemeRules.test.ts +107 -0
  719. package/src/theme/generateThemeRules.ts +56 -0
  720. package/src/theme/hct.ts +1 -1
  721. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  722. package/src/utils/devWarning.test.ts +56 -0
  723. package/src/utils/devWarning.ts +102 -0
  724. package/src/utils/index.ts +8 -0
  725. package/src/utils/plainDate.test.ts +46 -6
  726. package/src/utils/plainDate.ts +69 -3
  727. package/src/utils/rtlStyles.ts +27 -0
  728. package/src/utils/types.ts +14 -0
@@ -24,6 +24,8 @@
24
24
  import {useMemo, type ReactNode} from 'react';
25
25
  import * as stylex from '@stylexjs/stylex';
26
26
  import type {ButtonSize} from '../Button';
27
+ import {radiusVars, shadowVars} from '../theme/tokens.stylex';
28
+ import type {Elevation} from '../utils/types';
27
29
  import {SizeProvider, useSize} from '../SizeContext/SizeContext';
28
30
  import {useListFocus} from '../hooks/useListFocus';
29
31
  import {mergeProps, mergeRefs, composeEventHandlers} from '../utils';
@@ -63,6 +65,14 @@ export interface ButtonGroupProps extends BaseProps<HTMLDivElement> {
63
65
  */
64
66
  size?: ButtonSize;
65
67
 
68
+ /**
69
+ * Resting elevation for the group. The connected buttons share one surface,
70
+ * so the shadow sits on the group and lifts them together. Use for a floating
71
+ * group of actions above content.
72
+ * @default 'none'
73
+ */
74
+ elevation?: Elevation;
75
+
66
76
  /**
67
77
  * Whether all buttons in the group are disabled.
68
78
  * @default false
@@ -89,6 +99,26 @@ const styles = stylex.create({
89
99
  },
90
100
  });
91
101
 
102
+ // Resting elevation for the whole group — the connected buttons share one
103
+ // surface, so the shadow sits on the group wrapper and lifts them as a unit.
104
+ // The wrapper takes the element radius so the shadow follows the group's
105
+ // rounded outer corners rather than a bare rectangle. 'none' is the default.
106
+ const elevationStyles = stylex.create({
107
+ none: {boxShadow: 'none'},
108
+ low: {
109
+ boxShadow: shadowVars['--shadow-low'],
110
+ borderRadius: radiusVars['--radius-element'],
111
+ },
112
+ med: {
113
+ boxShadow: shadowVars['--shadow-med'],
114
+ borderRadius: radiusVars['--radius-element'],
115
+ },
116
+ high: {
117
+ boxShadow: shadowVars['--shadow-high'],
118
+ borderRadius: radiusVars['--radius-element'],
119
+ },
120
+ });
121
+
92
122
  // =============================================================================
93
123
  // Component
94
124
  // =============================================================================
@@ -129,6 +159,7 @@ export function ButtonGroup({
129
159
  orientation = 'horizontal',
130
160
  size: sizeProp,
131
161
  isDisabled = false,
162
+ elevation = 'none',
132
163
  xstyle,
133
164
  className,
134
165
  style,
@@ -160,6 +191,7 @@ export function ButtonGroup({
160
191
  stylex.props(
161
192
  styles.group,
162
193
  orientation === 'vertical' && styles.vertical,
194
+ elevationStyles[elevation],
163
195
  xstyle,
164
196
  ),
165
197
  className,
@@ -111,7 +111,8 @@ export const docs = {
111
111
  theming: {
112
112
  targets: [
113
113
  {className: 'astryx-calendar', visualProps: ['mode']},
114
- {className: 'astryx-calendar-day', states: ['selected', 'today', 'disabled', 'in-range']},
114
+ {className: 'astryx-calendar-nav', visualProps: ['nav'], states: ['disabled']},
115
+ {className: 'astryx-calendar-day', states: ['selected', 'today', 'disabled', 'in-range', 'marker']},
115
116
  ],
116
117
  },
117
118
  };
@@ -157,6 +158,15 @@ export const docsZh = {
157
158
  'mode',
158
159
  ],
159
160
  },
161
+ {
162
+ className: 'astryx-calendar-nav',
163
+ visualProps: [
164
+ 'nav',
165
+ ],
166
+ states: [
167
+ 'disabled',
168
+ ],
169
+ },
160
170
  {
161
171
  className: 'astryx-calendar-day',
162
172
  states: [
@@ -164,6 +174,7 @@ export const docsZh = {
164
174
  'today',
165
175
  'disabled',
166
176
  'in-range',
177
+ 'marker',
167
178
  ],
168
179
  },
169
180
  ],
@@ -16,7 +16,10 @@ import {getButton} from '../__tests__/fastRoleQueries';
16
16
  import * as stylex from '@stylexjs/stylex';
17
17
  import {Calendar} from './Calendar';
18
18
  import type {CalendarHandle} from './Calendar';
19
+ import type {ISODateString} from './Calendar';
19
20
  import {calendarStyles} from './styles';
21
+ import {defineTheme} from '../theme/defineTheme';
22
+ import {generateThemeCSSFlat} from '../theme/generateThemeRules';
20
23
  import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
21
24
 
22
25
  afterEach(() => {
@@ -391,10 +394,10 @@ describe('Calendar', () => {
391
394
 
392
395
  it('caps the range highlight next to a disabled mid-range day (#2715)', () => {
393
396
  // Disable Jan 13. With Jan 10–15 selected, day 12 (immediately before the
394
- // disabled day) should get a rounded end cap on its right edge, and day 14
395
- // (immediately after) a rounded cap on its left edge — so the highlight
396
- // reads as terminating at the disabled gap rather than running square-edged
397
- // into it.
397
+ // disabled day) should get a rounded end cap on its inline-end edge, and
398
+ // day 14 (immediately after) a rounded cap on its inline-start edge — so
399
+ // the highlight reads as terminating at the disabled gap rather than
400
+ // running square-edged into it.
398
401
  const disableJan13 = (d: Date) =>
399
402
  !(d.getFullYear() === 2026 && d.getMonth() === 0 && d.getDate() === 13);
400
403
  render(
@@ -419,10 +422,11 @@ describe('Calendar', () => {
419
422
  const day14Bg = rangeBgFor(14);
420
423
 
421
424
  // Capped edges have a border radius; the un-capped edge stays square.
422
- expect(getComputedStyle(day12Bg).borderTopRightRadius).not.toBe('');
423
- expect(getComputedStyle(day12Bg).borderTopRightRadius).not.toBe('0px');
424
- expect(getComputedStyle(day14Bg).borderTopLeftRadius).not.toBe('');
425
- expect(getComputedStyle(day14Bg).borderTopLeftRadius).not.toBe('0px');
425
+ // Radii are logical (inline start/end), so they follow reading direction.
426
+ expect(getComputedStyle(day12Bg).borderStartEndRadius).not.toBe('');
427
+ expect(getComputedStyle(day12Bg).borderStartEndRadius).not.toBe('0px');
428
+ expect(getComputedStyle(day14Bg).borderStartStartRadius).not.toBe('');
429
+ expect(getComputedStyle(day14Bg).borderStartStartRadius).not.toBe('0px');
426
430
  });
427
431
 
428
432
  it('does not range-highlight adjacent-month spillover days in two-month view', () => {
@@ -646,6 +650,150 @@ describe('Calendar', () => {
646
650
  });
647
651
  });
648
652
 
653
+ // ─── Selection Semantics for AT (WCAG 4.1.2 / 1.3.1) ────────
654
+
655
+ describe('selection state in day accessible names', () => {
656
+ it("appends 'selected' to the selected day's button name in single mode", () => {
657
+ render(<Calendar value="2026-01-15" focusDate="2026-01-01" />);
658
+
659
+ // Roving focus lands on the day <button>, which cannot carry
660
+ // aria-selected (invalid on role="button") — the selection state must
661
+ // be encoded in the button's accessible name instead.
662
+ expect(getDayButton(15).getAttribute('aria-label')).toBe(
663
+ 'Thursday, January 15, 2026, selected',
664
+ );
665
+ // Unselected days carry the plain date name.
666
+ expect(getDayButton(20).getAttribute('aria-label')).toBe(
667
+ 'Tuesday, January 20, 2026',
668
+ );
669
+ });
670
+
671
+ it('marks range start, end, and in-range days in their accessible names', () => {
672
+ render(
673
+ <Calendar
674
+ mode="range"
675
+ value={{start: '2026-01-10', end: '2026-01-15'}}
676
+ focusDate="2026-01-01"
677
+ />,
678
+ );
679
+
680
+ expect(getDayButton(10).getAttribute('aria-label')).toBe(
681
+ 'Saturday, January 10, 2026, range start',
682
+ );
683
+ expect(getDayButton(15).getAttribute('aria-label')).toBe(
684
+ 'Thursday, January 15, 2026, range end',
685
+ );
686
+ expect(getDayButton(12).getAttribute('aria-label')).toBe(
687
+ 'Monday, January 12, 2026, in range',
688
+ );
689
+ // Days outside the range keep the plain date name.
690
+ expect(getDayButton(20).getAttribute('aria-label')).toBe(
691
+ 'Tuesday, January 20, 2026',
692
+ );
693
+ });
694
+
695
+ it('labels a one-day range as both range start and range end', () => {
696
+ render(
697
+ <Calendar
698
+ mode="range"
699
+ value={{start: '2026-01-10', end: '2026-01-10'}}
700
+ focusDate="2026-01-01"
701
+ />,
702
+ );
703
+
704
+ expect(getDayButton(10).getAttribute('aria-label')).toBe(
705
+ 'Saturday, January 10, 2026, range start and range end',
706
+ );
707
+ });
708
+
709
+ it("labels the in-progress first pick as 'range start' only", async () => {
710
+ const user = userEvent.setup();
711
+ render(<Calendar mode="range" focusDate="2026-01-01" />);
712
+
713
+ await user.click(getDayButton(10));
714
+
715
+ // While the range is in progress the picked day is only the start —
716
+ // not a completed one-day range.
717
+ expect(getDayButton(10).getAttribute('aria-label')).toBe(
718
+ 'Saturday, January 10, 2026, range start',
719
+ );
720
+ });
721
+ });
722
+
723
+ describe('range selection announcements', () => {
724
+ it('announces the start pick and prompts for an end date', async () => {
725
+ const user = userEvent.setup();
726
+ render(<Calendar mode="range" focusDate="2026-01-01" />);
727
+
728
+ await user.click(getDayButton(10));
729
+
730
+ await waitFor(() => {
731
+ expect(politeRegion()).toHaveTextContent(
732
+ 'Start date Saturday, January 10, 2026. Select an end date.',
733
+ );
734
+ });
735
+ });
736
+
737
+ it('announces the completed range after the second pick', async () => {
738
+ const user = userEvent.setup();
739
+ render(<Calendar mode="range" focusDate="2026-01-01" />);
740
+
741
+ await user.click(getDayButton(10));
742
+ await user.click(getDayButton(15));
743
+
744
+ await waitFor(() => {
745
+ expect(politeRegion()).toHaveTextContent(
746
+ 'Selected range: Saturday, January 10, 2026 to Thursday, January 15, 2026.',
747
+ );
748
+ });
749
+ });
750
+
751
+ it('announces the completed range in chronological order for a reverse pick', async () => {
752
+ const user = userEvent.setup();
753
+ render(<Calendar mode="range" focusDate="2026-01-01" />);
754
+
755
+ await user.click(getDayButton(20));
756
+ await user.click(getDayButton(10));
757
+
758
+ await waitFor(() => {
759
+ expect(politeRegion()).toHaveTextContent(
760
+ 'Selected range: Saturday, January 10, 2026 to Tuesday, January 20, 2026.',
761
+ );
762
+ });
763
+ });
764
+ });
765
+
766
+ describe('aria-multiselectable', () => {
767
+ it('sets aria-multiselectable="true" on the grid in range mode', () => {
768
+ render(<Calendar mode="range" focusDate="2026-01-01" />);
769
+
770
+ expect(screen.getByRole('grid')).toHaveAttribute(
771
+ 'aria-multiselectable',
772
+ 'true',
773
+ );
774
+ });
775
+
776
+ it('does not set aria-multiselectable in single mode', () => {
777
+ render(<Calendar focusDate="2026-01-01" />);
778
+
779
+ expect(screen.getByRole('grid')).not.toHaveAttribute(
780
+ 'aria-multiselectable',
781
+ );
782
+ });
783
+
784
+ it('sets aria-multiselectable on both grids in a two-month range view', () => {
785
+ render(
786
+ <Calendar mode="range" numberOfMonths={2} focusDate="2026-01-01" />,
787
+ );
788
+
789
+ const grids = screen.getAllByRole('grid');
790
+ expect(grids.length).toBe(2);
791
+ for (const grid of grids) {
792
+ expect(grid).toHaveAttribute('aria-multiselectable', 'true');
793
+ }
794
+ });
795
+ });
796
+
649
797
  // ─── Bug Regression Tests ───────────────────────────────────
650
798
 
651
799
  it('day buttons have data-date attribute with ISO string', () => {
@@ -841,21 +989,22 @@ describe('Calendar', () => {
841
989
  // ─── RTL (#3388) ─────────────────────────────────────────────
842
990
 
843
991
  describe('RTL month navigation', () => {
844
- // jsdom does not apply compiled StyleX CSS, so the scaleX(-1) mirror
845
- // itself is only observable in a browser (see the dir="rtl" Storybook
846
- // story). These tests pin the structure the fix depends on: both nav
847
- // chevrons render inside the navIcon wrapper that carries the
848
- // ':is([dir="rtl"] *)' conditional transform.
849
- it('wraps both nav chevrons in the RTL-mirroring navIcon wrapper', () => {
992
+ // jsdom does not apply compiled StyleX CSS, so the RTL scaleX mirror is
993
+ // only observable in a browser (see the dir="rtl" Storybook story). These
994
+ // tests pin the structure the mirror relies on: both nav chevrons render
995
+ // inside the navIcon wrapper (which composes the shared rtlStyles.mirror
996
+ // transform), and navigation semantics stay identical under dir="rtl".
997
+ it('wraps both nav chevrons in the navIcon wrapper', () => {
850
998
  render(<Calendar focusDate="2026-01-01" />);
851
999
 
852
1000
  const {className: navIconClass} = stylex.props(calendarStyles.navIcon);
853
1001
  expect(navIconClass).toBeTruthy();
1002
+ const navIconAtoms = navIconClass!.split(' ');
854
1003
 
855
1004
  for (const name of ['Previous month', 'Next month']) {
856
1005
  const button = getButton(name);
857
1006
  const wrappers = Array.from(button.querySelectorAll('span')).filter(
858
- span => span.className === navIconClass,
1007
+ span => navIconAtoms.every(atom => span.classList.contains(atom)),
859
1008
  );
860
1009
  expect(wrappers.length).toBe(1);
861
1010
  }
@@ -864,21 +1013,215 @@ describe('Calendar', () => {
864
1013
  it('keeps navigation semantics unchanged under dir="rtl"', async () => {
865
1014
  const user = userEvent.setup();
866
1015
 
867
- render(
1016
+ // Scope month-label queries to the rendered tree: month navigation also
1017
+ // announces the month name through the body-level polite live region,
1018
+ // and whether that text has landed by assertion time depends on jsdom's
1019
+ // 16ms rAF frame phase — an unscoped getByText intermittently finds two
1020
+ // matches ("February 2026" in both the header and the live region).
1021
+ const {container} = render(
868
1022
  <div dir="rtl">
869
1023
  <Calendar focusDate="2026-02-01" />
870
1024
  </div>,
871
1025
  );
872
1026
 
873
- expect(screen.getByText('February 2026')).toBeInTheDocument();
1027
+ expect(within(container).getByText('February 2026')).toBeInTheDocument();
874
1028
 
875
1029
  // DOM order and handlers must not change in RTL: flexbox already
876
1030
  // places "Previous month" at the visual right; only the glyph mirrors.
877
1031
  await user.click(getButton('Previous month'));
878
- expect(screen.getByText('January 2026')).toBeInTheDocument();
1032
+ expect(within(container).getByText('January 2026')).toBeInTheDocument();
879
1033
 
880
1034
  await user.click(getButton('Next month'));
881
- expect(screen.getByText('February 2026')).toBeInTheDocument();
1035
+ expect(within(container).getByText('February 2026')).toBeInTheDocument();
1036
+ });
1037
+ });
1038
+
1039
+ // ─── Day-cell marker theming (#4286) ─────────────────────────
1040
+ describe('day-cell marker theme state', () => {
1041
+ // Tests use the real "today" (as the existing aria-current tests do) since
1042
+ // Calendar derives it internally. Helpers pin the exact ISO strings.
1043
+ function todayISO(): ISODateString {
1044
+ const n = new Date();
1045
+ return `${n.getFullYear()}-${String(n.getMonth() + 1).padStart(2, '0')}-${String(n.getDate()).padStart(2, '0')}` as ISODateString;
1046
+ }
1047
+ function isoOffsetFromToday(deltaDays: number): ISODateString {
1048
+ const n = new Date();
1049
+ n.setDate(n.getDate() + deltaDays);
1050
+ return `${n.getFullYear()}-${String(n.getMonth() + 1).padStart(2, '0')}-${String(n.getDate()).padStart(2, '0')}` as ISODateString;
1051
+ }
1052
+ function todayCell(): HTMLElement {
1053
+ const el = document.querySelector<HTMLElement>(
1054
+ `button[data-date="${todayISO()}"]`,
1055
+ );
1056
+ expect(el).not.toBeNull();
1057
+ return el as HTMLElement;
1058
+ }
1059
+
1060
+ it('reflects marker="today-only" for a plain today cell (no selection)', () => {
1061
+ render(<Calendar />);
1062
+ const cell = todayCell();
1063
+ expect(cell).toHaveAttribute('data-marker', 'today-only');
1064
+ expect(cell).toHaveAttribute('data-today', 'today');
1065
+ expect(cell).not.toHaveAttribute('data-selected');
1066
+ expect(cell).not.toHaveAttribute('data-in-range');
1067
+ });
1068
+
1069
+ it('reflects marker="today-in-range" when today is strictly inside a range', () => {
1070
+ render(
1071
+ <Calendar
1072
+ mode="range"
1073
+ value={{start: isoOffsetFromToday(-2), end: isoOffsetFromToday(2)}}
1074
+ />,
1075
+ );
1076
+ const cell = todayCell();
1077
+ // Today is inside the range but not an endpoint: the today-in-range ring
1078
+ // is shown, so `marker` reflects that compound state precisely.
1079
+ expect(cell).toHaveAttribute('data-marker', 'today-in-range');
1080
+ expect(cell).toHaveAttribute('data-in-range', 'in-range');
1081
+ expect(cell).not.toHaveAttribute('data-selected');
1082
+ });
1083
+
1084
+ it('shows no marker state when today is the single-selected date', () => {
1085
+ render(<Calendar mode="single" value={todayISO()} />);
1086
+ const cell = todayCell();
1087
+ // A single-mode selected cell shows no ring by default — `marker` is
1088
+ // absent, while `selected` (which owns the selected treatment) is present.
1089
+ expect(cell).not.toHaveAttribute('data-marker');
1090
+ expect(cell).toHaveAttribute('data-selected', 'selected');
1091
+ expect(cell).toHaveAttribute('data-today', 'today');
1092
+ });
1093
+
1094
+ it('preserves the today-in-range ring on a today range endpoint', () => {
1095
+ render(
1096
+ <Calendar
1097
+ mode="range"
1098
+ value={{start: todayISO(), end: isoOffsetFromToday(3)}}
1099
+ />,
1100
+ );
1101
+ const cell = todayCell();
1102
+ // A range endpoint is NOT `isSelected` (that flag is single-mode only),
1103
+ // so by default the today-in-range ring IS drawn on a today endpoint
1104
+ // alongside the endpoint styling. `marker` mirrors that exactly — this
1105
+ // asserts the default rendering is preserved, byte-for-byte.
1106
+ expect(cell).toHaveAttribute('data-marker', 'today-in-range');
1107
+ expect(cell).toHaveAttribute('data-in-range', 'in-range');
1108
+ });
1109
+
1110
+ it('omits the marker state for non-today cells', () => {
1111
+ render(<Calendar />);
1112
+ const other = document.querySelector(
1113
+ `button[data-date="${isoOffsetFromToday(1)}"]`,
1114
+ );
1115
+ // Guard against the +1 day landing in an adjacent month with outside days
1116
+ // hidden; if present it must carry no marker.
1117
+ if (other) {
1118
+ expect(other).not.toHaveAttribute('data-marker');
1119
+ }
1120
+ });
1121
+
1122
+ it('exposes the marker states as themeable defineTheme targets', () => {
1123
+ // jsdom can't resolve the @layer cascade, so the DOM-reflection tests
1124
+ // above cover that the right state renders; this asserts the state is
1125
+ // reachable by a theme via the sanctioned defineTheme channel.
1126
+ const theme = defineTheme({
1127
+ name: 'calendar-marker-test',
1128
+ components: {
1129
+ 'calendar-day': {
1130
+ 'marker:today-only': {
1131
+ boxShadow: 'inset 0 0 0 2px var(--color-accent)',
1132
+ },
1133
+ 'marker:today-in-range': {
1134
+ boxShadow: 'inset 0 0 0 2px var(--color-text-primary)',
1135
+ },
1136
+ },
1137
+ },
1138
+ });
1139
+ const css = generateThemeCSSFlat(theme);
1140
+ expect(css).toContain('.astryx-calendar-day.today-only');
1141
+ expect(css).toContain('.astryx-calendar-day.today-in-range');
1142
+ expect(css).toContain('box-shadow: inset 0 0 0 2px var(--color-accent)');
1143
+ expect(css).toContain(
1144
+ 'box-shadow: inset 0 0 0 2px var(--color-text-primary)',
1145
+ );
1146
+ });
1147
+ });
1148
+
1149
+ // ─── Theming targets ─────────────────────────────────────────
1150
+ describe('theming targets', () => {
1151
+ it('renders the astryx-calendar-nav target on both month-nav buttons', () => {
1152
+ render(<Calendar focusDate="2026-01-01" />);
1153
+
1154
+ const prev = getButton('Previous month');
1155
+ const next = getButton('Next month');
1156
+
1157
+ // Dedicated, stable theme target — scoped to the nav controls, not the
1158
+ // global astryx-button handle that hits every Button in the app.
1159
+ expect(prev).toHaveClass('astryx-calendar-nav');
1160
+ expect(next).toHaveClass('astryx-calendar-nav');
1161
+
1162
+ // Direction is reflected so a theme can target one arrow alone.
1163
+ expect(prev).toHaveAttribute('data-nav', 'prev');
1164
+ expect(next).toHaveAttribute('data-nav', 'next');
1165
+ });
1166
+
1167
+ it('reflects the disabled nav state as a data attribute at the range edges', () => {
1168
+ // Clamp navigation so "Previous month" is disabled and "Next" is not.
1169
+ render(
1170
+ <Calendar focusDate="2026-01-15" min="2026-01-01" max="2026-03-31" />,
1171
+ );
1172
+
1173
+ const prev = getButton('Previous month');
1174
+ const next = getButton('Next month');
1175
+
1176
+ expect(prev).toHaveAttribute('data-disabled', 'disabled');
1177
+ expect(next).not.toHaveAttribute('data-disabled');
1178
+ });
1179
+
1180
+ it('keeps the default nav rendering unchanged (still a ghost icon button)', () => {
1181
+ render(<Calendar focusDate="2026-01-01" />);
1182
+
1183
+ // The new target is additive — the nav still carries the stock Button
1184
+ // classes, so default appearance is preserved.
1185
+ const prev = getButton('Previous month');
1186
+ expect(prev).toHaveClass('astryx-button');
1187
+ expect(prev).toHaveClass('ghost');
1188
+ expect(prev.tagName).toBe('BUTTON');
1189
+ });
1190
+
1191
+ it('renders the astryx-calendar-day target with its reflected states', () => {
1192
+ render(
1193
+ <Calendar mode="single" value="2026-01-15" focusDate="2026-01-01" />,
1194
+ );
1195
+
1196
+ const selected = getDayButton(15);
1197
+ expect(selected).toHaveClass('astryx-calendar-day');
1198
+ expect(selected).toHaveAttribute('data-selected', 'selected');
1199
+
1200
+ // A non-selected weekday cell still carries the base target and no
1201
+ // selected/today reflection.
1202
+ const plain = getDayButton(20);
1203
+ expect(plain).toHaveClass('astryx-calendar-day');
1204
+ expect(plain).not.toHaveAttribute('data-selected');
1205
+ });
1206
+
1207
+ it('exposes calendar-nav as a themeable defineTheme target', () => {
1208
+ // The generated CSS is what proves the target is reachable by a theme:
1209
+ // jsdom cannot resolve the @layer cascade, so the DOM-class assertions
1210
+ // above and this generation assertion together cover the seam.
1211
+ const theme = defineTheme({
1212
+ name: 'calendar-nav-test',
1213
+ components: {
1214
+ 'calendar-nav': {
1215
+ base: {color: 'var(--color-accent)'},
1216
+ 'nav:next': {backgroundColor: 'var(--color-accent-muted)'},
1217
+ },
1218
+ },
1219
+ });
1220
+ const css = generateThemeCSSFlat(theme);
1221
+ expect(css).toContain('.astryx-calendar-nav {');
1222
+ expect(css).toContain('color: var(--color-accent)');
1223
+ expect(css).toContain('.astryx-calendar-nav.next');
1224
+ expect(css).toContain('background-color: var(--color-accent-muted)');
882
1225
  });
883
1226
  });
884
1227
  });