@astryxdesign/core 0.3.0 → 0.4.0-canary.3112e99

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 (594) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +10 -2
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +22 -3
  5. package/dist/AppShell/AppShell.d.ts +2 -2
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +40 -9
  8. package/dist/AspectRatio/AspectRatio.d.ts +13 -0
  9. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js +9 -0
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +33 -20
  13. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
  15. package/dist/Banner/Banner.d.ts +3 -0
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -17
  18. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  20. package/dist/Breadcrumbs/index.d.ts +2 -1
  21. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/index.js +1 -0
  23. package/dist/Button/Button.d.ts.map +1 -1
  24. package/dist/Button/Button.js +12 -16
  25. package/dist/Calendar/Calendar.d.ts.map +1 -1
  26. package/dist/Calendar/Calendar.js +2 -1
  27. package/dist/Calendar/styles.d.ts +0 -2
  28. package/dist/Calendar/styles.d.ts.map +1 -1
  29. package/dist/Calendar/styles.js +0 -2
  30. package/dist/Carousel/Carousel.d.ts.map +1 -1
  31. package/dist/Carousel/Carousel.js +8 -12
  32. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  33. package/dist/Chat/ChatDictationButton.js +2 -1
  34. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  35. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  36. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  37. package/dist/Chat/ChatSendButton.js +4 -3
  38. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  39. package/dist/Chat/ChatToolCalls.js +17 -17
  40. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  41. package/dist/Chat/useTriggerMenu.js +2 -6
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  44. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  45. package/dist/ClickableCard/ClickableCard.js +3 -11
  46. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  47. package/dist/CodeBlock/CodeBlock.js +84 -67
  48. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  49. package/dist/Collapsible/Collapsible.js +35 -15
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  52. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  53. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  54. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  56. package/dist/ComplexSelector/ComplexSelector.js +32 -31
  57. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  58. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  59. package/dist/ContextMenu/ContextMenu.js +1 -1
  60. package/dist/ContextMenu/index.d.ts +2 -1
  61. package/dist/ContextMenu/index.d.ts.map +1 -1
  62. package/dist/ContextMenu/index.js +1 -0
  63. package/dist/DateInput/DateInput.d.ts +9 -2
  64. package/dist/DateInput/DateInput.d.ts.map +1 -1
  65. package/dist/DateInput/DateInput.js +47 -33
  66. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  67. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  68. package/dist/DateRangeInput/DateRangeInput.js +55 -32
  69. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  70. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  71. package/dist/DateTimeInput/DateTimeInput.js +54 -30
  72. package/dist/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/Dialog/Dialog.js +4 -4
  74. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  75. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  76. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  77. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  78. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  79. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  80. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  81. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  82. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  83. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  84. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  86. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
  87. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  88. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
  89. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  90. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  91. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  92. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  93. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  94. package/dist/DropdownMenu/index.d.ts +2 -1
  95. package/dist/DropdownMenu/index.d.ts.map +1 -1
  96. package/dist/DropdownMenu/index.js +4 -0
  97. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  98. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  99. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  100. package/dist/EmptyState/EmptyState.js +9 -5
  101. package/dist/Field/InputClearButton.d.ts +16 -3
  102. package/dist/Field/InputClearButton.d.ts.map +1 -1
  103. package/dist/Field/InputClearButton.js +15 -4
  104. package/dist/FileInput/FileInput.d.ts.map +1 -1
  105. package/dist/FileInput/FileInput.js +21 -10
  106. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  107. package/dist/HoverCard/useHoverCard.js +3 -19
  108. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  109. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  110. package/dist/Indicator/CheckIndicator.js +155 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  112. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  113. package/dist/Indicator/CheckboxIndicator.js +173 -0
  114. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  115. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  116. package/dist/Indicator/RadioIndicator.js +137 -0
  117. package/dist/Indicator/index.d.ts +24 -0
  118. package/dist/Indicator/index.d.ts.map +1 -0
  119. package/dist/Indicator/index.js +26 -0
  120. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  121. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  122. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  123. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  124. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  125. package/dist/Indicator/indicatorRegistry.js +93 -0
  126. package/dist/Indicator/types.d.ts +177 -0
  127. package/dist/Indicator/types.d.ts.map +1 -0
  128. package/dist/Indicator/types.js +1 -0
  129. package/dist/Indicator/useIndicator.d.ts +18 -0
  130. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  131. package/dist/Indicator/useIndicator.js +30 -0
  132. package/dist/Item/Item.d.ts.map +1 -1
  133. package/dist/Item/Item.js +4 -8
  134. package/dist/Layer/useLayer.d.ts +14 -0
  135. package/dist/Layer/useLayer.d.ts.map +1 -1
  136. package/dist/Layer/useLayer.js +25 -2
  137. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  138. package/dist/Lightbox/Lightbox.js +80 -103
  139. package/dist/Link/Link.d.ts.map +1 -1
  140. package/dist/Link/Link.js +4 -5
  141. package/dist/MobileNav/MobileNav.js +8 -8
  142. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  143. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  144. package/dist/MoreMenu/MoreMenu.js +4 -0
  145. package/dist/MultiSelector/MultiSelector.d.ts +8 -1
  146. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  147. package/dist/MultiSelector/MultiSelector.js +119 -95
  148. package/dist/NumberInput/NumberInput.d.ts +27 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +230 -42
  151. package/dist/Outline/Outline.d.ts.map +1 -1
  152. package/dist/Outline/Outline.js +2 -3
  153. package/dist/Pagination/Pagination.d.ts.map +1 -1
  154. package/dist/Pagination/Pagination.js +61 -63
  155. package/dist/Popover/Popover.d.ts.map +1 -1
  156. package/dist/Popover/Popover.js +6 -8
  157. package/dist/Popover/usePopover.d.ts +15 -0
  158. package/dist/Popover/usePopover.d.ts.map +1 -1
  159. package/dist/Popover/usePopover.js +14 -2
  160. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  161. package/dist/PowerSearch/PowerSearch.js +1 -1
  162. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  163. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  164. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  165. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  166. package/dist/ProgressBar/ProgressBar.js +95 -6
  167. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  168. package/dist/RadioList/RadioListItem.js +29 -84
  169. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  170. package/dist/Resizable/ResizeHandle.js +2 -3
  171. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  172. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  173. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  174. package/dist/SelectableCard/SelectableCard.js +3 -11
  175. package/dist/Selector/Selector.d.ts +12 -1
  176. package/dist/Selector/Selector.d.ts.map +1 -1
  177. package/dist/Selector/Selector.js +222 -111
  178. package/dist/Selector/hooks.d.ts +18 -6
  179. package/dist/Selector/hooks.d.ts.map +1 -1
  180. package/dist/Selector/hooks.js +57 -40
  181. package/dist/SideNav/SideNav.d.ts.map +1 -1
  182. package/dist/SideNav/SideNav.js +1 -1
  183. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  184. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  185. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  186. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  187. package/dist/SideNav/SideNavHeading.js +56 -20
  188. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  189. package/dist/SideNav/SideNavItem.js +28 -22
  190. package/dist/Slider/Slider.d.ts.map +1 -1
  191. package/dist/Slider/Slider.js +2 -6
  192. package/dist/Stack/stack.stylex.d.ts +3 -3
  193. package/dist/Switch/Switch.d.ts.map +1 -1
  194. package/dist/Switch/Switch.js +14 -13
  195. package/dist/TabList/Tab.d.ts.map +1 -1
  196. package/dist/TabList/Tab.js +2 -3
  197. package/dist/TabList/TabMenu.d.ts.map +1 -1
  198. package/dist/TabList/TabMenu.js +41 -19
  199. package/dist/Table/BaseTable.d.ts.map +1 -1
  200. package/dist/Table/BaseTable.js +8 -0
  201. package/dist/Table/TableRow.d.ts +1 -1
  202. package/dist/Table/TableRow.d.ts.map +1 -1
  203. package/dist/Table/TableRow.js +4 -2
  204. package/dist/Table/index.d.ts +1 -1
  205. package/dist/Table/index.d.ts.map +1 -1
  206. package/dist/Table/index.js +1 -1
  207. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  208. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  210. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  211. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  212. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  213. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  214. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  215. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  216. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  217. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  218. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  219. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  220. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  221. package/dist/Table/tableContextMenu.js +2 -1
  222. package/dist/Table/types.d.ts +11 -0
  223. package/dist/Table/types.d.ts.map +1 -1
  224. package/dist/TextArea/TextArea.d.ts +10 -1
  225. package/dist/TextArea/TextArea.d.ts.map +1 -1
  226. package/dist/TextArea/TextArea.js +16 -6
  227. package/dist/TextInput/TextInput.d.ts +10 -1
  228. package/dist/TextInput/TextInput.d.ts.map +1 -1
  229. package/dist/TextInput/TextInput.js +13 -19
  230. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  231. package/dist/Thumbnail/Thumbnail.js +32 -26
  232. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  233. package/dist/TimeInput/TimeInput.js +14 -17
  234. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  235. package/dist/Timestamp/Timestamp.js +14 -3
  236. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  237. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  238. package/dist/Timestamp/formatInstant.d.ts +11 -1
  239. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  240. package/dist/Timestamp/formatInstant.js +3 -1
  241. package/dist/Token/Token.d.ts.map +1 -1
  242. package/dist/Token/Token.js +20 -11
  243. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  244. package/dist/Tokenizer/Tokenizer.js +4 -2
  245. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  246. package/dist/Tooltip/useTooltip.js +3 -19
  247. package/dist/TopNav/TopNav.d.ts.map +1 -1
  248. package/dist/TopNav/TopNav.js +6 -5
  249. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  250. package/dist/TopNav/TopNavHeading.js +54 -16
  251. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavItem.js +3 -9
  253. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  254. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  255. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  256. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  258. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  259. package/dist/TopNav/TopNavMenu.js +83 -38
  260. package/dist/TreeList/TreeList.d.ts.map +1 -1
  261. package/dist/TreeList/TreeList.js +13 -0
  262. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  263. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  264. package/dist/TreeList/TreeListBranches.js +14 -4
  265. package/dist/TreeList/TreeListItem.d.ts +11 -1
  266. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  267. package/dist/TreeList/TreeListItem.js +57 -30
  268. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  269. package/dist/Typeahead/BaseTypeahead.js +16 -8
  270. package/dist/astryx.css +84 -96
  271. package/dist/astryx.umd.js +56 -56
  272. package/dist/astryx.umd.js.map +4 -4
  273. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  274. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  275. package/dist/hooks/containerReveal.stylex.js +63 -0
  276. package/dist/hooks/index.d.ts +3 -0
  277. package/dist/hooks/index.d.ts.map +1 -1
  278. package/dist/hooks/index.js +2 -0
  279. package/dist/hooks/useClipboard.d.ts +59 -0
  280. package/dist/hooks/useClipboard.d.ts.map +1 -0
  281. package/dist/hooks/useClipboard.js +106 -0
  282. package/dist/hooks/useContainerReveal.d.ts +14 -8
  283. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  284. package/dist/hooks/useContainerReveal.js +28 -69
  285. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  286. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  287. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  288. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  289. package/dist/hooks/useInputStatusIcon.js +17 -4
  290. package/dist/hooks/useLongPress.d.ts.map +1 -1
  291. package/dist/hooks/useLongPress.js +12 -2
  292. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  293. package/dist/hooks/useScrollLock.js +33 -18
  294. package/dist/hooks/useStreamingText.d.ts +18 -3
  295. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  296. package/dist/hooks/useStreamingText.js +47 -7
  297. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  298. package/dist/hooks/useTreeFocus.js +9 -3
  299. package/dist/hooks/useTypeahead.d.ts +3 -2
  300. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  301. package/dist/hooks/useTypeahead.js +19 -7
  302. package/dist/index.d.ts +1 -0
  303. package/dist/index.d.ts.map +1 -1
  304. package/dist/index.js +1 -0
  305. package/dist/theme/defineTheme.d.ts +18 -2
  306. package/dist/theme/defineTheme.d.ts.map +1 -1
  307. package/dist/theme/defineTheme.js +10 -1
  308. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  309. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  310. package/dist/theme/derivedVarRegistry.js +14 -13
  311. package/dist/theme/expandColorScale.d.ts +3 -1
  312. package/dist/theme/expandColorScale.d.ts.map +1 -1
  313. package/dist/theme/expandColorScale.js +17 -7
  314. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  315. package/dist/theme/expandTypeScale.js +17 -0
  316. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  317. package/dist/theme/generateThemeRules.js +11 -0
  318. package/dist/theme/index.d.ts +2 -1
  319. package/dist/theme/index.d.ts.map +1 -1
  320. package/dist/theme/index.js +1 -1
  321. package/dist/theme/tokens.stylex.d.ts +12 -0
  322. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  323. package/dist/theme/tokens.stylex.js +23 -0
  324. package/dist/utils/focusOutline.stylex.d.ts +122 -0
  325. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  326. package/dist/utils/focusOutline.stylex.js +143 -0
  327. package/dist/utils/focusReturn.d.ts +24 -0
  328. package/dist/utils/focusReturn.d.ts.map +1 -0
  329. package/dist/utils/focusReturn.js +29 -0
  330. package/dist/utils/index.d.ts +2 -0
  331. package/dist/utils/index.d.ts.map +1 -1
  332. package/dist/utils/index.js +6 -1
  333. package/dist/utils/mergeRefs.d.ts.map +1 -1
  334. package/dist/utils/mergeRefs.js +7 -5
  335. package/dist/utils/rtlStyles.d.ts +2 -2
  336. package/dist/utils/rtlStyles.js +2 -2
  337. package/dist/utils/themeProps.d.ts +20 -1
  338. package/dist/utils/themeProps.d.ts.map +1 -1
  339. package/dist/utils/themeProps.js +8 -2
  340. package/locales/en.json +52 -0
  341. package/locales/pseudo.json +39 -0
  342. package/package.json +8 -3
  343. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  344. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  345. package/src/AlertDialog/AlertDialog.tsx +21 -3
  346. package/src/AppShell/AppShell.doc.mjs +11 -0
  347. package/src/AppShell/AppShell.test.tsx +139 -0
  348. package/src/AppShell/AppShell.tsx +32 -22
  349. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  350. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  351. package/src/AspectRatio/AspectRatio.tsx +13 -0
  352. package/src/Avatar/Avatar.doc.mjs +2 -13
  353. package/src/Avatar/Avatar.test.tsx +33 -8
  354. package/src/Avatar/Avatar.tsx +52 -50
  355. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  356. package/src/Banner/Banner.test.tsx +58 -1
  357. package/src/Banner/Banner.tsx +33 -11
  358. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  359. package/src/Breadcrumbs/index.ts +5 -1
  360. package/src/Button/Button.doc.mjs +2 -2
  361. package/src/Button/Button.tsx +22 -41
  362. package/src/Calendar/Calendar.tsx +2 -1
  363. package/src/Calendar/styles.ts +0 -8
  364. package/src/Carousel/Carousel.doc.mjs +3 -0
  365. package/src/Carousel/Carousel.tsx +10 -6
  366. package/src/Chat/Chat.doc.mjs +2 -0
  367. package/src/Chat/ChatDictationButton.tsx +7 -1
  368. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  369. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  370. package/src/Chat/ChatSendButton.tsx +2 -3
  371. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  372. package/src/Chat/ChatToolCalls.tsx +36 -16
  373. package/src/Chat/useTriggerMenu.tsx +2 -5
  374. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  375. package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
  376. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  377. package/src/ClickableCard/ClickableCard.tsx +6 -11
  378. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  379. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  380. package/src/CodeBlock/CodeBlock.tsx +57 -80
  381. package/src/Collapsible/Collapsible.tsx +22 -18
  382. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  383. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  384. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  385. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  386. package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
  387. package/src/ComplexSelector/ComplexSelector.tsx +41 -28
  388. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  389. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  390. package/src/ContextMenu/ContextMenu.tsx +3 -3
  391. package/src/ContextMenu/index.ts +5 -1
  392. package/src/DateInput/DateInput.doc.mjs +18 -3
  393. package/src/DateInput/DateInput.test.tsx +112 -11
  394. package/src/DateInput/DateInput.tsx +44 -25
  395. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  396. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  397. package/src/DateRangeInput/DateRangeInput.tsx +27 -21
  398. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  399. package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
  400. package/src/DateTimeInput/DateTimeInput.tsx +58 -17
  401. package/src/Dialog/Dialog.tsx +2 -9
  402. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  403. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  404. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  405. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  406. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  407. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  408. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  409. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  410. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
  411. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  412. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  413. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  414. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  415. package/src/DropdownMenu/index.ts +8 -1
  416. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  417. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  418. package/src/EmptyState/EmptyState.test.tsx +62 -0
  419. package/src/EmptyState/EmptyState.tsx +16 -6
  420. package/src/Field/Field.doc.mjs +1 -0
  421. package/src/Field/InputClearButton.test.tsx +117 -0
  422. package/src/Field/InputClearButton.tsx +30 -3
  423. package/src/FileInput/FileInput.tsx +21 -8
  424. package/src/HoverCard/useHoverCard.tsx +2 -23
  425. package/src/Icon/Icon.doc.mjs +2 -1
  426. package/src/Indicator/CheckIndicator.tsx +174 -0
  427. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  428. package/src/Indicator/Indicator.doc.mjs +344 -0
  429. package/src/Indicator/Indicator.test.tsx +393 -0
  430. package/src/Indicator/RadioIndicator.tsx +206 -0
  431. package/src/Indicator/index.ts +46 -0
  432. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  433. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  434. package/src/Indicator/indicatorRegistry.ts +120 -0
  435. package/src/Indicator/types.ts +197 -0
  436. package/src/Indicator/useIndicator.ts +39 -0
  437. package/src/Item/Item.doc.mjs +1 -1
  438. package/src/Item/Item.tsx +7 -14
  439. package/src/Layer/useLayer.doc.mjs +2 -2
  440. package/src/Layer/useLayer.test.tsx +85 -0
  441. package/src/Layer/useLayer.tsx +39 -1
  442. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  443. package/src/Lightbox/Lightbox.tsx +45 -49
  444. package/src/Link/Link.tsx +4 -11
  445. package/src/MobileNav/MobileNav.tsx +3 -3
  446. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  447. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  448. package/src/MoreMenu/MoreMenu.tsx +19 -0
  449. package/src/MultiSelector/MultiSelector.doc.mjs +16 -1
  450. package/src/MultiSelector/MultiSelector.test.tsx +259 -16
  451. package/src/MultiSelector/MultiSelector.tsx +144 -121
  452. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  453. package/src/NumberInput/NumberInput.test.tsx +726 -21
  454. package/src/NumberInput/NumberInput.tsx +353 -59
  455. package/src/Outline/Outline.tsx +2 -5
  456. package/src/Pagination/Pagination.doc.mjs +1 -1
  457. package/src/Pagination/Pagination.test.tsx +22 -7
  458. package/src/Pagination/Pagination.tsx +38 -35
  459. package/src/Popover/Popover.doc.mjs +2 -0
  460. package/src/Popover/Popover.tsx +6 -7
  461. package/src/Popover/usePopover.tsx +37 -4
  462. package/src/PowerSearch/PowerSearch.tsx +1 -1
  463. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  464. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  465. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  466. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  467. package/src/ProgressBar/ProgressBar.tsx +126 -30
  468. package/src/RadioList/RadioList.doc.mjs +4 -2
  469. package/src/RadioList/RadioListItem.tsx +31 -130
  470. package/src/Resizable/ResizeHandle.tsx +2 -9
  471. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  472. package/src/SelectableCard/SelectableCard.tsx +4 -9
  473. package/src/Selector/Selector.doc.mjs +15 -4
  474. package/src/Selector/Selector.test.tsx +1234 -98
  475. package/src/Selector/Selector.tsx +254 -126
  476. package/src/Selector/hooks.ts +77 -50
  477. package/src/SideNav/SideNav.test.tsx +46 -0
  478. package/src/SideNav/SideNav.tsx +1 -0
  479. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  480. package/src/SideNav/SideNavHeading.tsx +48 -10
  481. package/src/SideNav/SideNavItem.tsx +20 -12
  482. package/src/Slider/Slider.tsx +2 -11
  483. package/src/Stack/Stack.doc.mjs +110 -0
  484. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  485. package/src/Switch/Switch.test.tsx +32 -0
  486. package/src/Switch/Switch.tsx +18 -10
  487. package/src/TabList/Tab.tsx +2 -9
  488. package/src/TabList/TabMenu.tsx +14 -21
  489. package/src/Table/BaseTable.tsx +11 -0
  490. package/src/Table/Table.test.tsx +31 -0
  491. package/src/Table/TableRow.tsx +6 -0
  492. package/src/Table/index.ts +1 -4
  493. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  494. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  495. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  496. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  497. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  498. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  499. package/src/Table/tableContextMenu.test.tsx +27 -0
  500. package/src/Table/tableContextMenu.tsx +1 -0
  501. package/src/Table/types.ts +11 -0
  502. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  503. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  504. package/src/TextArea/TextArea.doc.mjs +42 -2
  505. package/src/TextArea/TextArea.test.tsx +219 -0
  506. package/src/TextArea/TextArea.tsx +34 -7
  507. package/src/TextInput/TextInput.doc.mjs +18 -2
  508. package/src/TextInput/TextInput.test.tsx +189 -0
  509. package/src/TextInput/TextInput.tsx +25 -31
  510. package/src/Thumbnail/Thumbnail.tsx +2 -9
  511. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  512. package/src/TimeInput/TimeInput.test.tsx +84 -3
  513. package/src/TimeInput/TimeInput.tsx +26 -28
  514. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  515. package/src/Timestamp/Timestamp.test.tsx +91 -14
  516. package/src/Timestamp/Timestamp.tsx +14 -2
  517. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  518. package/src/Timestamp/formatInstant.ts +16 -1
  519. package/src/Token/Token.tsx +5 -28
  520. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  521. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  522. package/src/Tokenizer/Tokenizer.tsx +10 -2
  523. package/src/Tooltip/useTooltip.tsx +2 -23
  524. package/src/TopNav/TopNav.tsx +1 -3
  525. package/src/TopNav/TopNavHeading.tsx +42 -13
  526. package/src/TopNav/TopNavItem.tsx +3 -21
  527. package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
  528. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  529. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  530. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  531. package/src/TopNav/TopNavMenu.tsx +34 -37
  532. package/src/TreeList/TreeList.doc.mjs +5 -0
  533. package/src/TreeList/TreeList.test.tsx +208 -8
  534. package/src/TreeList/TreeList.tsx +22 -0
  535. package/src/TreeList/TreeListBranches.tsx +25 -2
  536. package/src/TreeList/TreeListItem.tsx +89 -52
  537. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  538. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  539. package/src/Typeahead/Typeahead.test.tsx +76 -3
  540. package/src/hooks/containerReveal.stylex.ts +102 -0
  541. package/src/hooks/index.ts +4 -0
  542. package/src/hooks/useClipboard.doc.mjs +87 -0
  543. package/src/hooks/useClipboard.test.tsx +151 -0
  544. package/src/hooks/useClipboard.ts +135 -0
  545. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  546. package/src/hooks/useContainerReveal.test.tsx +42 -62
  547. package/src/hooks/useContainerReveal.ts +36 -91
  548. package/src/hooks/useImageMode.test.ts +1 -1
  549. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  550. package/src/hooks/useInputStatusIcon.tsx +8 -8
  551. package/src/hooks/useLongPress.test.tsx +18 -0
  552. package/src/hooks/useLongPress.ts +12 -2
  553. package/src/hooks/useScrollLock.test.ts +72 -0
  554. package/src/hooks/useScrollLock.ts +51 -19
  555. package/src/hooks/useStreamingText.test.ts +46 -1
  556. package/src/hooks/useStreamingText.ts +49 -7
  557. package/src/hooks/useTreeFocus.test.tsx +50 -0
  558. package/src/hooks/useTreeFocus.ts +14 -3
  559. package/src/hooks/useTypeahead.test.tsx +150 -0
  560. package/src/hooks/useTypeahead.ts +24 -9
  561. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  562. package/src/index.ts +1 -0
  563. package/src/theme/defineTheme.ts +27 -0
  564. package/src/theme/derivedVarRegistry.test.ts +21 -1
  565. package/src/theme/derivedVarRegistry.ts +19 -6
  566. package/src/theme/expandColorScale.test.ts +14 -0
  567. package/src/theme/expandColorScale.ts +24 -9
  568. package/src/theme/expandTypeScale.test.ts +43 -0
  569. package/src/theme/expandTypeScale.ts +17 -0
  570. package/src/theme/generateThemeRules.test.ts +78 -20
  571. package/src/theme/generateThemeRules.ts +11 -0
  572. package/src/theme/index.ts +15 -0
  573. package/src/theme/tokens.stylex.ts +18 -0
  574. package/src/theme/tokens.test.ts +37 -0
  575. package/src/utils/focusOutline.stylex.ts +177 -0
  576. package/src/utils/focusReturn.test.ts +42 -0
  577. package/src/utils/focusReturn.ts +31 -0
  578. package/src/utils/index.ts +5 -0
  579. package/src/utils/mergeRefs.test.ts +48 -0
  580. package/src/utils/mergeRefs.ts +12 -6
  581. package/src/utils/rtlStyles.ts +2 -2
  582. package/src/utils/themeProps.ts +26 -4
  583. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  584. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  585. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  586. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  587. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  588. package/dist/RadioList/radio.markers.stylex.js +0 -12
  589. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  590. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  591. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  592. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  593. package/src/RadioList/radio.markers.stylex.ts +0 -10
  594. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -145,6 +145,13 @@ export const docs = {
145
145
  description: 'Number of months in the calendar.',
146
146
  default: '2',
147
147
  },
148
+ {
149
+ name: 'weekStartsOn',
150
+ type: "0 | 1 | 2 | 3 | 4 | 5 | 6 | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'",
151
+ description:
152
+ 'First day of week in the calendar. A number (0 = Sunday to 6 = Saturday) or a three-letter day name.',
153
+ default: '0',
154
+ },
148
155
  {
149
156
  name: 'width',
150
157
  type: 'SizeValue',
@@ -159,9 +166,9 @@ export const docs = {
159
166
  ],
160
167
  theming: {
161
168
  targets: [
162
- {className: 'astryx-date-range-input', visualProps: ['size', 'status']},
169
+ {className: 'astryx-date-range-input', visualProps: ['size', 'status'], states: ['disabled']},
163
170
  {className: 'astryx-date-range-input-toggle-icon', states: ['state']},
164
- {className: 'astryx-date-range-input-clear-icon'},
171
+ {className: 'astryx-date-range-input-clear-icon', deprecatedFor: 'input-clear-icon'},
165
172
  ],
166
173
  },
167
174
  usage: {
@@ -314,6 +321,7 @@ export const docsDense = {
314
321
  statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing; tooltip hides the box and shows it on the status icon.',
315
322
  labelTooltip: 'tooltip via info icon at label end',
316
323
  numberOfMonths: 'months in calendar (default 2)',
324
+ weekStartsOn: 'first day of week in calendar (0=Sunday, or name e.g. "mon")',
317
325
  changeAction:
318
326
  'async action fired after onChange; drives optimistic UI updates via useTransition',
319
327
  isLoading: 'loading state; disables interaction + shows a spinner',
@@ -511,6 +511,72 @@ describe('DateRangeInput statusVariant forwarding', () => {
511
511
  'detached',
512
512
  );
513
513
  });
514
+
515
+ describe('weekStartsOn', () => {
516
+ // The calendar popover renders in the top layer; jsdom keeps the content in
517
+ // the DOM but role queries skip it, so read the columnheaders directly.
518
+ const openAndReadWeekdays = (container: HTMLElement): (string | null)[] => {
519
+ fireEvent.click(getButton('Open calendar'));
520
+ return Array.from(container.querySelectorAll('[role="columnheader"]'))
521
+ .slice(0, 7)
522
+ .map(h => h.textContent);
523
+ };
524
+
525
+ it('defaults to a Sunday-first week', () => {
526
+ const {container} = render(
527
+ <DateRangeInput label="Range" value={null} onChange={() => {}} />,
528
+ );
529
+ expect(openAndReadWeekdays(container)).toEqual([
530
+ 'Su',
531
+ 'Mo',
532
+ 'Tu',
533
+ 'We',
534
+ 'Th',
535
+ 'Fr',
536
+ 'Sa',
537
+ ]);
538
+ });
539
+
540
+ it('forwards a numeric weekStartsOn to the calendar', () => {
541
+ const {container} = render(
542
+ <DateRangeInput
543
+ label="Range"
544
+ value={null}
545
+ onChange={() => {}}
546
+ weekStartsOn={1}
547
+ />,
548
+ );
549
+ expect(openAndReadWeekdays(container)).toEqual([
550
+ 'Mo',
551
+ 'Tu',
552
+ 'We',
553
+ 'Th',
554
+ 'Fr',
555
+ 'Sa',
556
+ 'Su',
557
+ ]);
558
+ });
559
+
560
+ it('accepts a three-letter day name', () => {
561
+ const {container} = render(
562
+ <DateRangeInput
563
+ label="Range"
564
+ value={null}
565
+ onChange={() => {}}
566
+ weekStartsOn="mon"
567
+ />,
568
+ );
569
+ expect(openAndReadWeekdays(container)).toEqual([
570
+ 'Mo',
571
+ 'Tu',
572
+ 'We',
573
+ 'Th',
574
+ 'Fr',
575
+ 'Sa',
576
+ 'Su',
577
+ ]);
578
+ });
579
+ });
514
580
  });
515
581
 
516
582
  describe('DateRangeInput icon theme targets', () => {
@@ -526,7 +592,7 @@ describe('DateRangeInput icon theme targets', () => {
526
592
  return icon as HTMLElement;
527
593
  };
528
594
 
529
- it('renders astryx-date-range-input-clear-icon on the clear glyph', () => {
595
+ it('renders astryx-input-clear-icon (plus the legacy alias) on the clear glyph', () => {
530
596
  render(
531
597
  <DateRangeInput
532
598
  label="Range"
@@ -535,10 +601,13 @@ describe('DateRangeInput icon theme targets', () => {
535
601
  hasClear
536
602
  />,
537
603
  );
538
- // The stable target lands on the icon element itself (not the button), so a
539
- // theme can restyle just this glyph (color, size, hover) via defineTheme —
540
- // a button-level target could not reach the icon's own color/size.
604
+ // The canonical target lands on the icon element itself (not the button),
605
+ // so a theme can restyle just this glyph (color, size, hover) via
606
+ // defineTheme — a button-level target could not reach the icon's own
607
+ // color/size. The original per-component name rides along for a
608
+ // deprecation window.
541
609
  const icon = iconIn(getButton('Clear Range'));
610
+ expect(icon).toHaveClass('astryx-input-clear-icon');
542
611
  expect(icon).toHaveClass('astryx-date-range-input-clear-icon');
543
612
  expect(icon).toHaveClass('astryx-icon');
544
613
  });
@@ -552,11 +621,12 @@ describe('DateRangeInput icon theme targets', () => {
552
621
  expect(icon).toHaveAttribute('data-state', 'collapsed');
553
622
  });
554
623
 
555
- it('renders the default icons (secondary color, sm size) byte-identically', () => {
556
- // Pixel-identical default guard: the glyphs must carry the exact same
557
- // StyleX color/size classes as a standalone secondary/sm icon. The added
558
- // target class is purely additive — it changes nothing until a theme
559
- // targets it.
624
+ it('routes the clear glyph through the shared clear button (default look unchanged)', () => {
625
+ // Default-look guard for the clear affordance. It now composes the shared
626
+ // InputClearButton (a ghost Button with a secondary/sm glyph), so aside
627
+ // from its target classes the glyph matches a standalone `secondary`/`sm`
628
+ // close icon — the default clear look is defined once, in InputClearButton.
629
+ // (The calendar-toggle glyph is covered separately.)
560
630
  render(
561
631
  <DateRangeInput
562
632
  label="Range"
@@ -567,22 +637,24 @@ describe('DateRangeInput icon theme targets', () => {
567
637
  );
568
638
  const clearIcon = iconIn(getButton('Clear Range'));
569
639
 
570
- const {container: refContainer} = render(
640
+ const {container: clearRefContainer} = render(
571
641
  <Icon icon="close" size="sm" color="secondary" />,
572
642
  );
573
- const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
643
+ const clearRefIcon = clearRefContainer.querySelector(
644
+ '.astryx-icon',
645
+ ) as HTMLElement;
574
646
 
575
647
  const styleClasses = (el: HTMLElement) =>
576
648
  el.className
577
649
  .split(' ')
578
650
  .filter(
579
651
  c =>
580
- c !== 'astryx-date-range-input-clear-icon' &&
581
- c !== 'astryx-date-range-input-toggle-icon',
652
+ c !== 'astryx-input-clear-icon' &&
653
+ c !== 'astryx-date-range-input-clear-icon',
582
654
  )
583
655
  .sort();
584
656
 
585
- expect(styleClasses(clearIcon)).toEqual(styleClasses(refIcon));
657
+ expect(styleClasses(clearIcon)).toEqual(styleClasses(clearRefIcon));
586
658
  });
587
659
 
588
660
  it('exposes the icon targets so a theme reaches icon color, size, and hover', () => {
@@ -616,3 +688,27 @@ describe('DateRangeInput icon theme targets', () => {
616
688
  expect(css).toContain('14px');
617
689
  });
618
690
  });
691
+
692
+ describe('DateRangeInput disabled theme state', () => {
693
+ it('reflects disabled on the root target so themes can gate paint on it', () => {
694
+ const {container} = render(
695
+ <DateRangeInput
696
+ label="Range"
697
+ value={null}
698
+ onChange={() => {}}
699
+ isDisabled
700
+ />,
701
+ );
702
+ const root = container.querySelector('.astryx-date-range-input');
703
+ expect(root).toHaveAttribute('data-disabled', 'disabled');
704
+ expect(root).toHaveClass('disabled');
705
+ });
706
+
707
+ it('omits data-disabled when enabled, like status does', () => {
708
+ const {container} = render(
709
+ <DateRangeInput label="Range" value={null} onChange={() => {}} />,
710
+ );
711
+ const root = container.querySelector('.astryx-date-range-input');
712
+ expect(root).not.toHaveAttribute('data-disabled');
713
+ });
714
+ });
@@ -36,6 +36,7 @@ import {
36
36
  } from '../theme/tokens.stylex';
37
37
  import {
38
38
  Field,
39
+ InputClearButton,
39
40
  type InputStatus,
40
41
  inputWrapperStyles,
41
42
  inputStatusBorderStyles,
@@ -45,7 +46,13 @@ import {
45
46
  } from '../Field';
46
47
  import {Icon} from '../Icon';
47
48
  import {Spinner} from '../Spinner';
48
- import {Calendar, type ISODateString, type DateRange} from '../Calendar';
49
+ import {
50
+ Calendar,
51
+ type ISODateString,
52
+ type DateRange,
53
+ type DayOfWeek,
54
+ type DayOfWeekName,
55
+ } from '../Calendar';
49
56
  import {usePopover} from '../Popover';
50
57
  import {useTooltip} from '../Tooltip';
51
58
  import {mergeProps} from '../utils';
@@ -54,6 +61,8 @@ import type {SizeValue} from '../utils/types';
54
61
  import {useSize} from '../SizeContext/SizeContext';
55
62
  import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
56
63
  import {themeProps} from '../utils/themeProps';
64
+ import {focusOutlineStyles} from '../utils/focusOutline.stylex';
65
+ import {stableClassName} from '../naming';
57
66
  import {useTranslator} from '../i18n';
58
67
 
59
68
  export type {DateRange} from '../Calendar';
@@ -110,11 +119,6 @@ const styles = stylex.create({
110
119
  backgroundColor: 'transparent',
111
120
  cursor: 'pointer',
112
121
  borderRadius: radiusVars['--radius-element'],
113
- outline: {
114
- default: 'none',
115
- ':focus-visible': `${borderVars['--border-width']} solid ${colorVars['--color-accent']}`,
116
- },
117
- outlineOffset: 1,
118
122
  },
119
123
  iconButtonDisabled: {
120
124
  cursor: 'not-allowed',
@@ -152,10 +156,6 @@ const styles = stylex.create({
152
156
  color: colorVars['--color-text-primary'],
153
157
  cursor: 'pointer',
154
158
  textAlign: 'start',
155
- outline: {
156
- default: 'none',
157
- ':focus-visible': `${borderVars['--border-width']} solid ${colorVars['--color-accent']}`,
158
- },
159
159
  },
160
160
  presetButtonActive: {
161
161
  backgroundColor: colorVars['--color-accent-muted'],
@@ -355,6 +355,14 @@ export interface DateRangeInputProps extends Omit<
355
355
  * @default 2
356
356
  */
357
357
  numberOfMonths?: 1 | 2;
358
+
359
+ /**
360
+ * First day of week in the calendar. Accepts a number
361
+ * (0 = Sunday … 6 = Saturday) or a three-letter day name ('sun'–'sat',
362
+ * case-insensitive).
363
+ * @default 0
364
+ */
365
+ weekStartsOn?: DayOfWeek | DayOfWeekName;
358
366
  }
359
367
 
360
368
  /**
@@ -396,6 +404,7 @@ export function DateRangeInput({
396
404
  statusVariant = 'attached',
397
405
  labelTooltip,
398
406
  numberOfMonths = 2,
407
+ weekStartsOn,
399
408
  width,
400
409
  xstyle,
401
410
  className,
@@ -548,6 +557,7 @@ export function DateRangeInput({
548
557
  themeProps('date-range-input', {
549
558
  size,
550
559
  status: status?.type ?? null,
560
+ disabled: isDisabled ? 'disabled' : null,
551
561
  }),
552
562
  stylex.props(
553
563
  inputWrapperStyles.base,
@@ -574,6 +584,7 @@ export function DateRangeInput({
574
584
  }
575
585
  tabIndex={-1}
576
586
  {...stylex.props(
587
+ focusOutlineStyles.focusVisible,
577
588
  styles.iconButton,
578
589
  isEffectivelyDisabled && styles.iconButtonDisabled,
579
590
  )}>
@@ -612,18 +623,11 @@ export function DateRangeInput({
612
623
  {displayValue || placeholder}
613
624
  </button>
614
625
  {hasClear && value !== null && !isEffectivelyDisabled && (
615
- <button
616
- type="button"
626
+ <InputClearButton
627
+ label={t('@astryx.dateInput.clear', {label})}
617
628
  onClick={handleClear}
618
- aria-label={t('@astryx.dateInput.clear', {label})}
619
- {...stylex.props(styles.iconButton)}>
620
- <Icon
621
- icon="close"
622
- size="sm"
623
- color="secondary"
624
- {...themeProps('date-range-input-clear-icon')}
625
- />
626
- </button>
629
+ iconClassName={stableClassName('date-range-input-clear-icon')}
630
+ />
627
631
  )}
628
632
  {isBusy && <Spinner size="sm" />}
629
633
  {statusIcon}
@@ -650,6 +654,7 @@ export function DateRangeInput({
650
654
  aria-current={isActive ? 'true' : undefined}
651
655
  onClick={() => handlePresetClick(preset)}
652
656
  {...stylex.props(
657
+ focusOutlineStyles.focusVisible,
653
658
  styles.presetButton,
654
659
  isActive && styles.presetButtonActive,
655
660
  )}>
@@ -667,6 +672,7 @@ export function DateRangeInput({
667
672
  max={max}
668
673
  dateConstraints={dateConstraints}
669
674
  numberOfMonths={numberOfMonths}
675
+ weekStartsOn={weekStartsOn}
670
676
  />
671
677
  </div>,
672
678
  {placement: 'below', alignment: 'start'},
@@ -173,6 +173,13 @@ export const docs = {
173
173
  description: 'Number of months displayed simultaneously in the calendar.',
174
174
  default: '1',
175
175
  },
176
+ {
177
+ name: 'weekStartsOn',
178
+ type: "0 | 1 | 2 | 3 | 4 | 5 | 6 | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'",
179
+ description:
180
+ 'First day of week in the calendar. A number (0 = Sunday to 6 = Saturday) or a three-letter day name.',
181
+ default: '0',
182
+ },
176
183
  {
177
184
  name: 'width',
178
185
  type: 'SizeValue',
@@ -188,7 +195,7 @@ export const docs = {
188
195
  ],
189
196
  theming: {
190
197
  targets: [
191
- {className: 'astryx-date-time-input', visualProps: ['size', 'status']},
198
+ {className: 'astryx-date-time-input', visualProps: ['size', 'status'], states: ['disabled']},
192
199
  {
193
200
  className: 'astryx-date-time-input-date-segment',
194
201
  visualProps: ['size', 'status'],
@@ -477,6 +484,12 @@ export const docsZh = {
477
484
  description: '日历中同时显示的月份数量。',
478
485
  default: '1',
479
486
  },
487
+ {
488
+ name: 'weekStartsOn',
489
+ type: "0 | 1 | 2 | 3 | 4 | 5 | 6 | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'",
490
+ description: '日历中每周的起始日。可为数字(0=周日……6=周六)或三字母星期缩写。',
491
+ default: '0',
492
+ },
480
493
  {
481
494
  name: 'xstyle',
482
495
  type: 'StyleXStyles',
@@ -486,7 +499,7 @@ export const docsZh = {
486
499
  ],
487
500
  theming: {
488
501
  targets: [
489
- {className: 'astryx-date-time-input', visualProps: ['size', 'status']},
502
+ {className: 'astryx-date-time-input', visualProps: ['size', 'status'], states: ['disabled']},
490
503
  {
491
504
  className: 'astryx-date-time-input-date-segment',
492
505
  visualProps: ['size', 'status'],
@@ -577,6 +590,7 @@ export const docsDense = {
577
590
  status: 'error/warning/success status w/ message',
578
591
  labelTooltip: 'tooltip text via info icon at label end',
579
592
  numberOfMonths: 'months shown simultaneously in calendar',
593
+ weekStartsOn: 'first day of week in calendar (0=Sunday, or name e.g. "mon")',
580
594
  xstyle: 'StyleX styles for layout; must be stylex.create() value',
581
595
  },
582
596
  };
@@ -9,7 +9,7 @@
9
9
  * SYNC: When DateTimeInput.tsx changes, update tests to match new behavior
10
10
  */
11
11
 
12
- import {describe, it, expect, vi, beforeEach} from 'vitest';
12
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
13
13
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {getButton, queryButton} from '../__tests__/fastRoleQueries';
@@ -17,6 +17,16 @@ import {DateTimeInput} from './DateTimeInput';
17
17
  import type {ISODateTimeString} from './DateTimeInput';
18
18
  import {defineTheme} from '../theme/defineTheme';
19
19
  import {generateThemeCSS} from '../theme/generateThemeRules';
20
+ import {InternationalizationProvider} from '../i18n';
21
+ import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
22
+
23
+ function politeRegion(): HTMLElement | null {
24
+ return document.querySelector('[data-astryx-live-region="polite"]');
25
+ }
26
+
27
+ afterEach(() => {
28
+ __resetLiveRegionsForTest();
29
+ });
20
30
 
21
31
  function generateThemeTestCSS(theme: Parameters<typeof generateThemeCSS>[0]) {
22
32
  const {prose, component} = generateThemeCSS(theme);
@@ -626,6 +636,35 @@ describe('DateTimeInput', () => {
626
636
 
627
637
  expect(screen.getByText('Invalid time')).toBeInTheDocument();
628
638
  });
639
+
640
+ it('resolves the invalid date and time announcements from the i18n catalog', () => {
641
+ render(
642
+ <InternationalizationProvider
643
+ locale="en"
644
+ overrides={{
645
+ en: {
646
+ '@astryx.dateInput.invalidDate': 'Ungültiges Datum',
647
+ '@astryx.timeInput.invalidTime': 'Ungültige Zeit',
648
+ },
649
+ }}>
650
+ <DateTimeInput
651
+ label="Meeting"
652
+ value={'2026-03-15T10:00' as ISODateTimeString}
653
+ onChange={() => {}}
654
+ />
655
+ </InternationalizationProvider>,
656
+ );
657
+
658
+ fireEvent.change(screen.getByRole('combobox'), {
659
+ target: {value: '13/45/2024'},
660
+ });
661
+ expect(screen.getByText('Ungültiges Datum')).toBeInTheDocument();
662
+
663
+ fireEvent.change(screen.getByLabelText('Meeting time'), {
664
+ target: {value: '99:99 zz'},
665
+ });
666
+ expect(screen.getByText('Ungültige Zeit')).toBeInTheDocument();
667
+ });
629
668
  });
630
669
  describe('disabledMessage', () => {
631
670
  // jsdom does not implement the Popover API used by the tooltip, so mock
@@ -819,6 +858,101 @@ describe('DateTimeInput', () => {
819
858
  expect(onChange).toHaveBeenCalledTimes(1);
820
859
  expect(onChange.mock.calls[0][0]).toContain('14:31');
821
860
  });
861
+
862
+ // Arrow-key stepping mutates a plain textbox programmatically, and screen
863
+ // readers do not announce programmatic textbox changes — the new value
864
+ // must be announced through the polite live region (WCAG 4.1.2).
865
+ it('politely announces the new time after ArrowUp stepping', async () => {
866
+ render(
867
+ <DateTimeInput
868
+ label="Meeting"
869
+ value={'2026-03-15T14:30' as ISODateTimeString}
870
+ onChange={() => {}}
871
+ />,
872
+ );
873
+
874
+ fireEvent.keyDown(screen.getByLabelText('Meeting time'), {
875
+ key: 'ArrowUp',
876
+ });
877
+
878
+ await waitFor(() => {
879
+ expect(politeRegion()).toHaveTextContent('2:31 PM');
880
+ });
881
+ });
882
+
883
+ it('politely announces the new time after ArrowDown stepping', async () => {
884
+ render(
885
+ <DateTimeInput
886
+ label="Meeting"
887
+ value={'2026-03-15T14:30' as ISODateTimeString}
888
+ onChange={() => {}}
889
+ />,
890
+ );
891
+
892
+ fireEvent.keyDown(screen.getByLabelText('Meeting time'), {
893
+ key: 'ArrowDown',
894
+ });
895
+
896
+ await waitFor(() => {
897
+ expect(politeRegion()).toHaveTextContent('2:29 PM');
898
+ });
899
+ });
900
+ });
901
+
902
+ describe('weekStartsOn', () => {
903
+ // The calendar popover renders in the top layer; jsdom keeps the content in
904
+ // the DOM but role queries skip it, so read the columnheaders directly.
905
+ const openAndReadWeekdays = (container: HTMLElement): (string | null)[] => {
906
+ fireEvent.keyDown(screen.getAllByRole('combobox')[0], {key: 'ArrowDown'});
907
+ return Array.from(container.querySelectorAll('[role="columnheader"]'))
908
+ .slice(0, 7)
909
+ .map(h => h.textContent);
910
+ };
911
+
912
+ it('defaults to a Sunday-first week', () => {
913
+ const {container} = render(
914
+ <DateTimeInput label="When" onChange={() => {}} />,
915
+ );
916
+ expect(openAndReadWeekdays(container)).toEqual([
917
+ 'Su',
918
+ 'Mo',
919
+ 'Tu',
920
+ 'We',
921
+ 'Th',
922
+ 'Fr',
923
+ 'Sa',
924
+ ]);
925
+ });
926
+
927
+ it('forwards a numeric weekStartsOn to the calendar', () => {
928
+ const {container} = render(
929
+ <DateTimeInput label="When" onChange={() => {}} weekStartsOn={1} />,
930
+ );
931
+ expect(openAndReadWeekdays(container)).toEqual([
932
+ 'Mo',
933
+ 'Tu',
934
+ 'We',
935
+ 'Th',
936
+ 'Fr',
937
+ 'Sa',
938
+ 'Su',
939
+ ]);
940
+ });
941
+
942
+ it('accepts a three-letter day name', () => {
943
+ const {container} = render(
944
+ <DateTimeInput label="When" onChange={() => {}} weekStartsOn="mon" />,
945
+ );
946
+ expect(openAndReadWeekdays(container)).toEqual([
947
+ 'Mo',
948
+ 'Tu',
949
+ 'We',
950
+ 'Th',
951
+ 'Fr',
952
+ 'Sa',
953
+ 'Su',
954
+ ]);
955
+ });
822
956
  });
823
957
  // ===========================================================================
824
958
  // Segment theme targets (#4075)
@@ -931,3 +1065,22 @@ describe('DateTimeInput', () => {
931
1065
  });
932
1066
  });
933
1067
  });
1068
+
1069
+ describe('DateTimeInput disabled theme state', () => {
1070
+ it('reflects disabled on the root target so themes can gate paint on it', () => {
1071
+ const {container} = render(
1072
+ <DateTimeInput label="Meeting" onChange={() => {}} isDisabled />,
1073
+ );
1074
+ const root = container.querySelector('.astryx-date-time-input');
1075
+ expect(root).toHaveAttribute('data-disabled', 'disabled');
1076
+ expect(root).toHaveClass('disabled');
1077
+ });
1078
+
1079
+ it('omits data-disabled when enabled, like status does', () => {
1080
+ const {container} = render(
1081
+ <DateTimeInput label="Meeting" onChange={() => {}} />,
1082
+ );
1083
+ const root = container.querySelector('.astryx-date-time-input');
1084
+ expect(root).not.toHaveAttribute('data-disabled');
1085
+ });
1086
+ });