@astryxdesign/core 0.3.0 → 0.4.0-canary.41f53a0

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 (579) 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.map +1 -1
  16. package/dist/Banner/Banner.js +15 -14
  17. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  18. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  19. package/dist/Breadcrumbs/index.d.ts +2 -1
  20. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  21. package/dist/Breadcrumbs/index.js +1 -0
  22. package/dist/Button/Button.d.ts.map +1 -1
  23. package/dist/Button/Button.js +12 -16
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +2 -1
  26. package/dist/Calendar/styles.d.ts +0 -2
  27. package/dist/Calendar/styles.d.ts.map +1 -1
  28. package/dist/Calendar/styles.js +0 -2
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +8 -12
  31. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  32. package/dist/Chat/ChatDictationButton.js +2 -1
  33. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  34. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  35. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  36. package/dist/Chat/ChatSendButton.js +4 -3
  37. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  38. package/dist/Chat/ChatToolCalls.js +17 -17
  39. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  40. package/dist/Chat/useTriggerMenu.js +2 -6
  41. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  43. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  44. package/dist/ClickableCard/ClickableCard.js +3 -11
  45. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  46. package/dist/CodeBlock/CodeBlock.js +84 -67
  47. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  48. package/dist/Collapsible/Collapsible.js +35 -15
  49. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  52. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  53. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  54. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.js +32 -31
  56. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  57. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  58. package/dist/ContextMenu/ContextMenu.js +1 -1
  59. package/dist/ContextMenu/index.d.ts +2 -1
  60. package/dist/ContextMenu/index.d.ts.map +1 -1
  61. package/dist/ContextMenu/index.js +1 -0
  62. package/dist/DateInput/DateInput.d.ts +9 -2
  63. package/dist/DateInput/DateInput.d.ts.map +1 -1
  64. package/dist/DateInput/DateInput.js +47 -33
  65. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  66. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  67. package/dist/DateRangeInput/DateRangeInput.js +55 -32
  68. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  69. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  70. package/dist/DateTimeInput/DateTimeInput.js +54 -30
  71. package/dist/Dialog/Dialog.d.ts.map +1 -1
  72. package/dist/Dialog/Dialog.js +4 -4
  73. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  74. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  75. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  76. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  77. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  78. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  79. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  80. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  81. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  82. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  83. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  84. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  85. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  86. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  87. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  88. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  89. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  90. package/dist/DropdownMenu/index.d.ts +2 -1
  91. package/dist/DropdownMenu/index.d.ts.map +1 -1
  92. package/dist/DropdownMenu/index.js +4 -0
  93. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  94. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  95. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  96. package/dist/EmptyState/EmptyState.js +9 -5
  97. package/dist/Field/InputClearButton.d.ts +16 -3
  98. package/dist/Field/InputClearButton.d.ts.map +1 -1
  99. package/dist/Field/InputClearButton.js +15 -4
  100. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  101. package/dist/HoverCard/useHoverCard.js +3 -19
  102. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  103. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  104. package/dist/Indicator/CheckIndicator.js +155 -0
  105. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  106. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  107. package/dist/Indicator/CheckboxIndicator.js +173 -0
  108. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  109. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  110. package/dist/Indicator/RadioIndicator.js +137 -0
  111. package/dist/Indicator/index.d.ts +24 -0
  112. package/dist/Indicator/index.d.ts.map +1 -0
  113. package/dist/Indicator/index.js +26 -0
  114. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  115. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  116. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  117. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  118. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  119. package/dist/Indicator/indicatorRegistry.js +93 -0
  120. package/dist/Indicator/types.d.ts +177 -0
  121. package/dist/Indicator/types.d.ts.map +1 -0
  122. package/dist/Indicator/types.js +1 -0
  123. package/dist/Indicator/useIndicator.d.ts +18 -0
  124. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  125. package/dist/Indicator/useIndicator.js +30 -0
  126. package/dist/Item/Item.d.ts.map +1 -1
  127. package/dist/Item/Item.js +4 -8
  128. package/dist/Layer/useLayer.d.ts +14 -0
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +25 -2
  131. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  132. package/dist/Lightbox/Lightbox.js +80 -103
  133. package/dist/Link/Link.d.ts.map +1 -1
  134. package/dist/Link/Link.js +4 -5
  135. package/dist/MobileNav/MobileNav.js +8 -8
  136. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  137. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  138. package/dist/MoreMenu/MoreMenu.js +4 -0
  139. package/dist/MultiSelector/MultiSelector.d.ts +8 -1
  140. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  141. package/dist/MultiSelector/MultiSelector.js +119 -95
  142. package/dist/NumberInput/NumberInput.d.ts +27 -1
  143. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  144. package/dist/NumberInput/NumberInput.js +230 -42
  145. package/dist/Outline/Outline.d.ts.map +1 -1
  146. package/dist/Outline/Outline.js +2 -3
  147. package/dist/Pagination/Pagination.d.ts.map +1 -1
  148. package/dist/Pagination/Pagination.js +61 -63
  149. package/dist/Popover/Popover.d.ts.map +1 -1
  150. package/dist/Popover/Popover.js +6 -8
  151. package/dist/Popover/usePopover.d.ts +15 -0
  152. package/dist/Popover/usePopover.d.ts.map +1 -1
  153. package/dist/Popover/usePopover.js +14 -2
  154. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  155. package/dist/PowerSearch/PowerSearch.js +1 -1
  156. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  157. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  158. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  159. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  160. package/dist/ProgressBar/ProgressBar.js +95 -6
  161. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  162. package/dist/RadioList/RadioListItem.js +29 -84
  163. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  164. package/dist/Resizable/ResizeHandle.js +2 -3
  165. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  166. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  167. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  168. package/dist/SelectableCard/SelectableCard.js +3 -11
  169. package/dist/Selector/Selector.d.ts +12 -1
  170. package/dist/Selector/Selector.d.ts.map +1 -1
  171. package/dist/Selector/Selector.js +222 -111
  172. package/dist/Selector/hooks.d.ts +18 -6
  173. package/dist/Selector/hooks.d.ts.map +1 -1
  174. package/dist/Selector/hooks.js +57 -40
  175. package/dist/SideNav/SideNav.d.ts.map +1 -1
  176. package/dist/SideNav/SideNav.js +1 -1
  177. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  178. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  179. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  180. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  181. package/dist/SideNav/SideNavHeading.js +56 -20
  182. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  183. package/dist/SideNav/SideNavItem.js +28 -22
  184. package/dist/Slider/Slider.d.ts.map +1 -1
  185. package/dist/Slider/Slider.js +2 -6
  186. package/dist/Stack/stack.stylex.d.ts +3 -3
  187. package/dist/Switch/Switch.d.ts.map +1 -1
  188. package/dist/Switch/Switch.js +14 -13
  189. package/dist/TabList/Tab.d.ts.map +1 -1
  190. package/dist/TabList/Tab.js +2 -3
  191. package/dist/TabList/TabMenu.d.ts.map +1 -1
  192. package/dist/TabList/TabMenu.js +41 -19
  193. package/dist/Table/BaseTable.d.ts.map +1 -1
  194. package/dist/Table/BaseTable.js +8 -0
  195. package/dist/Table/index.d.ts +1 -1
  196. package/dist/Table/index.d.ts.map +1 -1
  197. package/dist/Table/index.js +1 -1
  198. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  199. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  200. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  201. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  202. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  203. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  204. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  205. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  206. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  207. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  208. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  209. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  210. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  211. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  212. package/dist/Table/tableContextMenu.js +2 -1
  213. package/dist/Table/types.d.ts +11 -0
  214. package/dist/Table/types.d.ts.map +1 -1
  215. package/dist/TextArea/TextArea.d.ts +10 -1
  216. package/dist/TextArea/TextArea.d.ts.map +1 -1
  217. package/dist/TextArea/TextArea.js +16 -6
  218. package/dist/TextInput/TextInput.d.ts +10 -1
  219. package/dist/TextInput/TextInput.d.ts.map +1 -1
  220. package/dist/TextInput/TextInput.js +13 -19
  221. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  222. package/dist/Thumbnail/Thumbnail.js +32 -26
  223. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  224. package/dist/TimeInput/TimeInput.js +14 -17
  225. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  226. package/dist/Timestamp/Timestamp.js +14 -3
  227. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  228. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  229. package/dist/Timestamp/formatInstant.d.ts +11 -1
  230. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  231. package/dist/Timestamp/formatInstant.js +3 -1
  232. package/dist/Token/Token.d.ts.map +1 -1
  233. package/dist/Token/Token.js +20 -11
  234. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  235. package/dist/Tokenizer/Tokenizer.js +4 -2
  236. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  237. package/dist/Tooltip/useTooltip.js +3 -19
  238. package/dist/TopNav/TopNav.d.ts.map +1 -1
  239. package/dist/TopNav/TopNav.js +6 -5
  240. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  241. package/dist/TopNav/TopNavHeading.js +54 -16
  242. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  243. package/dist/TopNav/TopNavItem.js +3 -9
  244. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  245. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  246. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  247. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  248. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  249. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  250. package/dist/TopNav/TopNavMenu.js +83 -38
  251. package/dist/TreeList/TreeList.d.ts.map +1 -1
  252. package/dist/TreeList/TreeList.js +13 -0
  253. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  254. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  255. package/dist/TreeList/TreeListBranches.js +14 -4
  256. package/dist/TreeList/TreeListItem.d.ts +11 -1
  257. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  258. package/dist/TreeList/TreeListItem.js +57 -30
  259. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  260. package/dist/Typeahead/BaseTypeahead.js +16 -8
  261. package/dist/astryx.css +84 -96
  262. package/dist/astryx.umd.js +56 -56
  263. package/dist/astryx.umd.js.map +4 -4
  264. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  265. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  266. package/dist/hooks/containerReveal.stylex.js +63 -0
  267. package/dist/hooks/index.d.ts +3 -0
  268. package/dist/hooks/index.d.ts.map +1 -1
  269. package/dist/hooks/index.js +2 -0
  270. package/dist/hooks/useClipboard.d.ts +59 -0
  271. package/dist/hooks/useClipboard.d.ts.map +1 -0
  272. package/dist/hooks/useClipboard.js +106 -0
  273. package/dist/hooks/useContainerReveal.d.ts +14 -8
  274. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  275. package/dist/hooks/useContainerReveal.js +28 -69
  276. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  277. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  278. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  279. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  280. package/dist/hooks/useInputStatusIcon.js +17 -4
  281. package/dist/hooks/useLongPress.d.ts.map +1 -1
  282. package/dist/hooks/useLongPress.js +12 -2
  283. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  284. package/dist/hooks/useScrollLock.js +33 -18
  285. package/dist/hooks/useStreamingText.d.ts +18 -3
  286. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  287. package/dist/hooks/useStreamingText.js +47 -7
  288. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  289. package/dist/hooks/useTreeFocus.js +9 -3
  290. package/dist/hooks/useTypeahead.d.ts +3 -2
  291. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  292. package/dist/hooks/useTypeahead.js +19 -7
  293. package/dist/index.d.ts +1 -0
  294. package/dist/index.d.ts.map +1 -1
  295. package/dist/index.js +1 -0
  296. package/dist/theme/defineTheme.d.ts +18 -2
  297. package/dist/theme/defineTheme.d.ts.map +1 -1
  298. package/dist/theme/defineTheme.js +10 -1
  299. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  300. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  301. package/dist/theme/derivedVarRegistry.js +14 -13
  302. package/dist/theme/expandColorScale.d.ts +3 -1
  303. package/dist/theme/expandColorScale.d.ts.map +1 -1
  304. package/dist/theme/expandColorScale.js +17 -7
  305. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  306. package/dist/theme/expandTypeScale.js +17 -0
  307. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  308. package/dist/theme/generateThemeRules.js +11 -0
  309. package/dist/theme/index.d.ts +2 -1
  310. package/dist/theme/index.d.ts.map +1 -1
  311. package/dist/theme/index.js +1 -1
  312. package/dist/theme/tokens.stylex.d.ts +12 -0
  313. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  314. package/dist/theme/tokens.stylex.js +23 -0
  315. package/dist/utils/focusOutline.stylex.d.ts +122 -0
  316. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  317. package/dist/utils/focusOutline.stylex.js +143 -0
  318. package/dist/utils/focusReturn.d.ts +24 -0
  319. package/dist/utils/focusReturn.d.ts.map +1 -0
  320. package/dist/utils/focusReturn.js +29 -0
  321. package/dist/utils/index.d.ts +2 -0
  322. package/dist/utils/index.d.ts.map +1 -1
  323. package/dist/utils/index.js +6 -1
  324. package/dist/utils/mergeRefs.d.ts.map +1 -1
  325. package/dist/utils/mergeRefs.js +7 -5
  326. package/dist/utils/rtlStyles.d.ts +2 -2
  327. package/dist/utils/rtlStyles.js +2 -2
  328. package/dist/utils/themeProps.d.ts +20 -1
  329. package/dist/utils/themeProps.d.ts.map +1 -1
  330. package/dist/utils/themeProps.js +8 -2
  331. package/locales/en.json +20 -0
  332. package/locales/pseudo.json +15 -0
  333. package/package.json +8 -3
  334. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  335. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  336. package/src/AlertDialog/AlertDialog.tsx +21 -3
  337. package/src/AppShell/AppShell.doc.mjs +11 -0
  338. package/src/AppShell/AppShell.test.tsx +139 -0
  339. package/src/AppShell/AppShell.tsx +32 -22
  340. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  341. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  342. package/src/AspectRatio/AspectRatio.tsx +13 -0
  343. package/src/Avatar/Avatar.doc.mjs +2 -13
  344. package/src/Avatar/Avatar.test.tsx +33 -8
  345. package/src/Avatar/Avatar.tsx +52 -50
  346. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  347. package/src/Banner/Banner.tsx +9 -6
  348. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  349. package/src/Breadcrumbs/index.ts +5 -1
  350. package/src/Button/Button.doc.mjs +2 -2
  351. package/src/Button/Button.tsx +22 -41
  352. package/src/Calendar/Calendar.tsx +2 -1
  353. package/src/Calendar/styles.ts +0 -8
  354. package/src/Carousel/Carousel.doc.mjs +3 -0
  355. package/src/Carousel/Carousel.tsx +10 -6
  356. package/src/Chat/Chat.doc.mjs +2 -0
  357. package/src/Chat/ChatDictationButton.tsx +7 -1
  358. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  359. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  360. package/src/Chat/ChatSendButton.tsx +2 -3
  361. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  362. package/src/Chat/ChatToolCalls.tsx +36 -16
  363. package/src/Chat/useTriggerMenu.tsx +2 -5
  364. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  365. package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
  366. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  367. package/src/ClickableCard/ClickableCard.tsx +6 -11
  368. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  369. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  370. package/src/CodeBlock/CodeBlock.tsx +57 -80
  371. package/src/Collapsible/Collapsible.tsx +22 -18
  372. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  373. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  374. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  375. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  376. package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
  377. package/src/ComplexSelector/ComplexSelector.tsx +41 -28
  378. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  379. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  380. package/src/ContextMenu/ContextMenu.tsx +3 -3
  381. package/src/ContextMenu/index.ts +5 -1
  382. package/src/DateInput/DateInput.doc.mjs +18 -3
  383. package/src/DateInput/DateInput.test.tsx +112 -11
  384. package/src/DateInput/DateInput.tsx +44 -25
  385. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  386. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  387. package/src/DateRangeInput/DateRangeInput.tsx +27 -21
  388. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  389. package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
  390. package/src/DateTimeInput/DateTimeInput.tsx +58 -17
  391. package/src/Dialog/Dialog.tsx +2 -9
  392. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  393. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  394. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  395. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  396. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  397. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  398. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  399. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  400. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  401. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  402. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  403. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  404. package/src/DropdownMenu/index.ts +8 -1
  405. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  406. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  407. package/src/EmptyState/EmptyState.test.tsx +62 -0
  408. package/src/EmptyState/EmptyState.tsx +16 -6
  409. package/src/Field/Field.doc.mjs +1 -0
  410. package/src/Field/InputClearButton.test.tsx +117 -0
  411. package/src/Field/InputClearButton.tsx +30 -3
  412. package/src/HoverCard/useHoverCard.tsx +2 -23
  413. package/src/Icon/Icon.doc.mjs +2 -1
  414. package/src/Indicator/CheckIndicator.tsx +174 -0
  415. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  416. package/src/Indicator/Indicator.doc.mjs +344 -0
  417. package/src/Indicator/Indicator.test.tsx +393 -0
  418. package/src/Indicator/RadioIndicator.tsx +206 -0
  419. package/src/Indicator/index.ts +46 -0
  420. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  421. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  422. package/src/Indicator/indicatorRegistry.ts +120 -0
  423. package/src/Indicator/types.ts +197 -0
  424. package/src/Indicator/useIndicator.ts +39 -0
  425. package/src/Item/Item.doc.mjs +1 -1
  426. package/src/Item/Item.tsx +7 -14
  427. package/src/Layer/useLayer.doc.mjs +2 -2
  428. package/src/Layer/useLayer.test.tsx +85 -0
  429. package/src/Layer/useLayer.tsx +39 -1
  430. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  431. package/src/Lightbox/Lightbox.tsx +45 -49
  432. package/src/Link/Link.tsx +4 -11
  433. package/src/MobileNav/MobileNav.tsx +3 -3
  434. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  435. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  436. package/src/MoreMenu/MoreMenu.tsx +19 -0
  437. package/src/MultiSelector/MultiSelector.doc.mjs +16 -1
  438. package/src/MultiSelector/MultiSelector.test.tsx +259 -16
  439. package/src/MultiSelector/MultiSelector.tsx +144 -121
  440. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  441. package/src/NumberInput/NumberInput.test.tsx +726 -21
  442. package/src/NumberInput/NumberInput.tsx +353 -59
  443. package/src/Outline/Outline.tsx +2 -5
  444. package/src/Pagination/Pagination.doc.mjs +1 -1
  445. package/src/Pagination/Pagination.test.tsx +22 -7
  446. package/src/Pagination/Pagination.tsx +38 -35
  447. package/src/Popover/Popover.doc.mjs +2 -0
  448. package/src/Popover/Popover.tsx +6 -7
  449. package/src/Popover/usePopover.tsx +37 -4
  450. package/src/PowerSearch/PowerSearch.tsx +1 -1
  451. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  452. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  453. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  454. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  455. package/src/ProgressBar/ProgressBar.tsx +126 -30
  456. package/src/RadioList/RadioList.doc.mjs +4 -2
  457. package/src/RadioList/RadioListItem.tsx +31 -130
  458. package/src/Resizable/ResizeHandle.tsx +2 -9
  459. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  460. package/src/SelectableCard/SelectableCard.tsx +4 -9
  461. package/src/Selector/Selector.doc.mjs +15 -4
  462. package/src/Selector/Selector.test.tsx +1234 -98
  463. package/src/Selector/Selector.tsx +254 -126
  464. package/src/Selector/hooks.ts +77 -50
  465. package/src/SideNav/SideNav.test.tsx +46 -0
  466. package/src/SideNav/SideNav.tsx +1 -0
  467. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  468. package/src/SideNav/SideNavHeading.tsx +48 -10
  469. package/src/SideNav/SideNavItem.tsx +20 -12
  470. package/src/Slider/Slider.tsx +2 -11
  471. package/src/Stack/Stack.doc.mjs +110 -0
  472. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  473. package/src/Switch/Switch.test.tsx +32 -0
  474. package/src/Switch/Switch.tsx +18 -10
  475. package/src/TabList/Tab.tsx +2 -9
  476. package/src/TabList/TabMenu.tsx +14 -21
  477. package/src/Table/BaseTable.tsx +11 -0
  478. package/src/Table/index.ts +1 -4
  479. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  480. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  481. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  482. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  483. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  484. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  485. package/src/Table/tableContextMenu.test.tsx +27 -0
  486. package/src/Table/tableContextMenu.tsx +1 -0
  487. package/src/Table/types.ts +11 -0
  488. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  489. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  490. package/src/TextArea/TextArea.doc.mjs +42 -2
  491. package/src/TextArea/TextArea.test.tsx +219 -0
  492. package/src/TextArea/TextArea.tsx +34 -7
  493. package/src/TextInput/TextInput.doc.mjs +18 -2
  494. package/src/TextInput/TextInput.test.tsx +189 -0
  495. package/src/TextInput/TextInput.tsx +25 -31
  496. package/src/Thumbnail/Thumbnail.tsx +2 -9
  497. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  498. package/src/TimeInput/TimeInput.test.tsx +84 -3
  499. package/src/TimeInput/TimeInput.tsx +26 -28
  500. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  501. package/src/Timestamp/Timestamp.test.tsx +91 -14
  502. package/src/Timestamp/Timestamp.tsx +14 -2
  503. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  504. package/src/Timestamp/formatInstant.ts +16 -1
  505. package/src/Token/Token.tsx +5 -28
  506. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  507. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  508. package/src/Tokenizer/Tokenizer.tsx +10 -2
  509. package/src/Tooltip/useTooltip.tsx +2 -23
  510. package/src/TopNav/TopNav.tsx +1 -3
  511. package/src/TopNav/TopNavHeading.tsx +42 -13
  512. package/src/TopNav/TopNavItem.tsx +3 -21
  513. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  514. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  515. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  516. package/src/TopNav/TopNavMenu.tsx +34 -37
  517. package/src/TreeList/TreeList.doc.mjs +5 -0
  518. package/src/TreeList/TreeList.test.tsx +208 -8
  519. package/src/TreeList/TreeList.tsx +22 -0
  520. package/src/TreeList/TreeListBranches.tsx +25 -2
  521. package/src/TreeList/TreeListItem.tsx +89 -52
  522. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  523. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  524. package/src/Typeahead/Typeahead.test.tsx +76 -3
  525. package/src/hooks/containerReveal.stylex.ts +102 -0
  526. package/src/hooks/index.ts +4 -0
  527. package/src/hooks/useClipboard.doc.mjs +87 -0
  528. package/src/hooks/useClipboard.test.tsx +151 -0
  529. package/src/hooks/useClipboard.ts +135 -0
  530. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  531. package/src/hooks/useContainerReveal.test.tsx +42 -62
  532. package/src/hooks/useContainerReveal.ts +36 -91
  533. package/src/hooks/useImageMode.test.ts +1 -1
  534. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  535. package/src/hooks/useInputStatusIcon.tsx +8 -8
  536. package/src/hooks/useLongPress.test.tsx +18 -0
  537. package/src/hooks/useLongPress.ts +12 -2
  538. package/src/hooks/useScrollLock.test.ts +72 -0
  539. package/src/hooks/useScrollLock.ts +51 -19
  540. package/src/hooks/useStreamingText.test.ts +46 -1
  541. package/src/hooks/useStreamingText.ts +49 -7
  542. package/src/hooks/useTreeFocus.test.tsx +50 -0
  543. package/src/hooks/useTreeFocus.ts +14 -3
  544. package/src/hooks/useTypeahead.test.tsx +150 -0
  545. package/src/hooks/useTypeahead.ts +24 -9
  546. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  547. package/src/index.ts +1 -0
  548. package/src/theme/defineTheme.ts +27 -0
  549. package/src/theme/derivedVarRegistry.test.ts +21 -1
  550. package/src/theme/derivedVarRegistry.ts +19 -6
  551. package/src/theme/expandColorScale.test.ts +14 -0
  552. package/src/theme/expandColorScale.ts +24 -9
  553. package/src/theme/expandTypeScale.test.ts +43 -0
  554. package/src/theme/expandTypeScale.ts +17 -0
  555. package/src/theme/generateThemeRules.test.ts +78 -20
  556. package/src/theme/generateThemeRules.ts +11 -0
  557. package/src/theme/index.ts +15 -0
  558. package/src/theme/tokens.stylex.ts +18 -0
  559. package/src/theme/tokens.test.ts +37 -0
  560. package/src/utils/focusOutline.stylex.ts +177 -0
  561. package/src/utils/focusReturn.test.ts +42 -0
  562. package/src/utils/focusReturn.ts +31 -0
  563. package/src/utils/index.ts +5 -0
  564. package/src/utils/mergeRefs.test.ts +48 -0
  565. package/src/utils/mergeRefs.ts +12 -6
  566. package/src/utils/rtlStyles.ts +2 -2
  567. package/src/utils/themeProps.ts +26 -4
  568. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  569. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  570. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  571. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  572. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  573. package/dist/RadioList/radio.markers.stylex.js +0 -12
  574. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  575. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  576. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  577. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  578. package/src/RadioList/radio.markers.stylex.ts +0 -10
  579. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -35,6 +35,7 @@ import {
35
35
  } from '../theme/tokens.stylex';
36
36
  import {
37
37
  Field,
38
+ InputClearButton,
38
39
  type InputStatus,
39
40
  inputWrapperStyles,
40
41
  inputStatusBorderStyles,
@@ -48,7 +49,13 @@ import {useInputGroup} from '../InputGroup/InputGroupContext';
48
49
  import {groupStyles} from '../InputGroup/groupStyles';
49
50
  import {useSize} from '../SizeContext/SizeContext';
50
51
  import {Spinner} from '../Spinner';
51
- import {Calendar, type ISODateString, type CalendarHandle} from '../Calendar';
52
+ import {
53
+ Calendar,
54
+ type ISODateString,
55
+ type CalendarHandle,
56
+ type DayOfWeek,
57
+ type DayOfWeekName,
58
+ } from '../Calendar';
52
59
  import {useCalendarConstraints} from '../Calendar/hooks';
53
60
  import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
54
61
  import {usePopover} from '../Popover';
@@ -73,11 +80,6 @@ const styles = stylex.create({
73
80
  backgroundColor: 'transparent',
74
81
  cursor: 'pointer',
75
82
  borderRadius: radiusVars['--radius-element'],
76
- outline: {
77
- default: 'none',
78
- ':focus-visible': `${borderVars['--border-width']} solid ${colorVars['--color-accent']}`,
79
- },
80
- outlineOffset: 1,
81
83
  },
82
84
  iconButtonDisabled: {
83
85
  cursor: 'not-allowed',
@@ -152,10 +154,12 @@ export type {
152
154
  InputStatus as DateInputStatus,
153
155
  InputStatusType as DateInputStatusType,
154
156
  } from '../Field';
155
- import {mergeProps, mergeRefs} from '../utils';
157
+ import {mergeProps, mergeRefs, isFocusDetached} from '../utils';
156
158
  import type {BaseProps} from '../BaseProps';
157
159
  import type {SizeValue} from '../utils/types';
158
160
  import {themeProps} from '../utils/themeProps';
161
+ import {focusOutlineStyles} from '../utils/focusOutline.stylex';
162
+ import {stableClassName} from '../naming';
159
163
  import {useTranslator} from '../i18n';
160
164
 
161
165
  export interface DateInputProps extends Omit<
@@ -311,6 +315,14 @@ export interface DateInputProps extends Omit<
311
315
  */
312
316
  numberOfMonths?: 1 | 2;
313
317
 
318
+ /**
319
+ * First day of week in the calendar popover. Accepts a number
320
+ * (0 = Sunday … 6 = Saturday) or a three-letter day name ('sun'–'sat',
321
+ * case-insensitive).
322
+ * @default 0
323
+ */
324
+ weekStartsOn?: DayOfWeek | DayOfWeekName;
325
+
314
326
  /**
315
327
  * How the committed date value is displayed in the text field. Accepts a
316
328
  * named format reused from `Timestamp`'s `format` vocabulary (so the same
@@ -377,6 +389,7 @@ export function DateInput({
377
389
  labelTooltip,
378
390
  hasClear = false,
379
391
  numberOfMonths = 1,
392
+ weekStartsOn,
380
393
  format = 'date_long',
381
394
  width,
382
395
  xstyle,
@@ -489,7 +502,18 @@ export function DateInput({
489
502
  const popover = usePopover({
490
503
  dialogLabel: t('@astryx.dateInput.dialogLabel'),
491
504
  closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
492
- onHide: () => inputRef.current?.focus(),
505
+ // Return focus to the input when the calendar closes — but only when the
506
+ // dismiss left focus detached (Escape, or a click on non-focusable empty
507
+ // space), which the focus trap can't restore on its own. A native
508
+ // popover="auto" light-dismiss fires synchronously with the pointer event
509
+ // that moved focus, so if the user clicked another control — the clear
510
+ // button, another field, anywhere — focus has already landed there;
511
+ // reclaiming it would fight their click.
512
+ onHide: () => {
513
+ if (isFocusDetached()) {
514
+ inputRef.current?.focus();
515
+ }
516
+ },
493
517
  });
494
518
 
495
519
  // Handle toggling the popover from button click (focus calendar)
@@ -635,7 +659,11 @@ export function DateInput({
635
659
  }}
636
660
  {...rest}
637
661
  {...mergeProps(
638
- themeProps('date-input', {size, status: status?.type ?? null}),
662
+ themeProps('date-input', {
663
+ size,
664
+ status: status?.type ?? null,
665
+ disabled: isDisabled ? 'disabled' : null,
666
+ }),
639
667
  stylex.props(
640
668
  inputWrapperStyles.base,
641
669
  sizeStyles[size],
@@ -662,6 +690,7 @@ export function DateInput({
662
690
  : t('@astryx.dateInput.openCalendar')
663
691
  }
664
692
  {...stylex.props(
693
+ focusOutlineStyles.focusVisible,
665
694
  styles.iconButton,
666
695
  isEffectivelyDisabled && styles.iconButtonDisabled,
667
696
  )}>
@@ -722,25 +751,14 @@ export function DateInput({
722
751
  user would get no feedback that their entry was rejected (WCAG 3.3.1).
723
752
  */}
724
753
  <VisuallyHidden as="div" role="alert" aria-live="assertive">
725
- {!isInputValid ? 'Invalid date' : ''}
754
+ {!isInputValid ? t('@astryx.dateInput.invalidDate') : ''}
726
755
  </VisuallyHidden>
727
756
  {hasClear && value !== undefined && !isEffectivelyDisabled && (
728
- <button
729
- type="button"
757
+ <InputClearButton
758
+ label={t('@astryx.dateInput.clear', {label})}
730
759
  onClick={handleClear}
731
- aria-label={t('@astryx.dateInput.clear', {label})}
732
- {...stylex.props(styles.iconButton)}>
733
- <Icon
734
- icon="close"
735
- size="sm"
736
- color="secondary"
737
- // Stable theme target on the clear glyph itself, so a theme can
738
- // restyle just this icon (color, size, hover) via `defineTheme`.
739
- // Same-element rules in @layer astryx-theme win over the icon's own
740
- // base color/size, which a button-level target could not reach.
741
- {...themeProps('date-input-clear-icon')}
742
- />
743
- </button>
760
+ iconClassName={stableClassName('date-input-clear-icon')}
761
+ />
744
762
  )}
745
763
  {isBusy && <Spinner size="sm" />}
746
764
  {statusIcon}
@@ -754,6 +772,7 @@ export function DateInput({
754
772
  max={max}
755
773
  dateConstraints={dateConstraints}
756
774
  numberOfMonths={numberOfMonths}
775
+ weekStartsOn={weekStartsOn}
757
776
  />,
758
777
  {placement: 'below', alignment: 'start'},
759
778
  )}
@@ -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
  };