@astryxdesign/core 0.3.0 → 0.4.0

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 (551) 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 +11 -15
  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 +35 -33
  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 +24 -23
  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 +11 -16
  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 +22 -17
  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 +167 -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 +56 -53
  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.map +1 -1
  140. package/dist/MultiSelector/MultiSelector.js +78 -75
  141. package/dist/NumberInput/NumberInput.d.ts +27 -1
  142. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  143. package/dist/NumberInput/NumberInput.js +230 -42
  144. package/dist/Outline/Outline.d.ts.map +1 -1
  145. package/dist/Outline/Outline.js +2 -3
  146. package/dist/Pagination/Pagination.d.ts.map +1 -1
  147. package/dist/Pagination/Pagination.js +61 -63
  148. package/dist/Popover/Popover.d.ts.map +1 -1
  149. package/dist/Popover/Popover.js +6 -8
  150. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  151. package/dist/PowerSearch/PowerSearch.js +1 -1
  152. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  153. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  154. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  155. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  156. package/dist/ProgressBar/ProgressBar.js +96 -6
  157. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  158. package/dist/RadioList/RadioListItem.js +29 -84
  159. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  160. package/dist/Resizable/ResizeHandle.js +2 -3
  161. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  162. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  163. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  164. package/dist/SelectableCard/SelectableCard.js +3 -11
  165. package/dist/Selector/Selector.d.ts +2 -1
  166. package/dist/Selector/Selector.d.ts.map +1 -1
  167. package/dist/Selector/Selector.js +164 -94
  168. package/dist/Selector/hooks.d.ts +18 -6
  169. package/dist/Selector/hooks.d.ts.map +1 -1
  170. package/dist/Selector/hooks.js +57 -40
  171. package/dist/SideNav/SideNav.d.ts.map +1 -1
  172. package/dist/SideNav/SideNav.js +1 -1
  173. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  174. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  175. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  176. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  177. package/dist/SideNav/SideNavHeading.js +56 -20
  178. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  179. package/dist/SideNav/SideNavItem.js +28 -22
  180. package/dist/Stack/stack.stylex.d.ts +3 -3
  181. package/dist/Switch/Switch.js +11 -10
  182. package/dist/TabList/Tab.d.ts.map +1 -1
  183. package/dist/TabList/Tab.js +2 -3
  184. package/dist/TabList/TabMenu.d.ts.map +1 -1
  185. package/dist/TabList/TabMenu.js +41 -19
  186. package/dist/Table/BaseTable.d.ts.map +1 -1
  187. package/dist/Table/BaseTable.js +8 -0
  188. package/dist/Table/index.d.ts +1 -1
  189. package/dist/Table/index.d.ts.map +1 -1
  190. package/dist/Table/index.js +1 -1
  191. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  192. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  193. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  194. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  195. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  196. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  197. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  198. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  199. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  200. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  201. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  202. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  203. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  204. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  205. package/dist/Table/tableContextMenu.js +2 -1
  206. package/dist/Table/types.d.ts +11 -0
  207. package/dist/Table/types.d.ts.map +1 -1
  208. package/dist/TextArea/TextArea.d.ts +10 -1
  209. package/dist/TextArea/TextArea.d.ts.map +1 -1
  210. package/dist/TextArea/TextArea.js +16 -6
  211. package/dist/TextInput/TextInput.d.ts +10 -1
  212. package/dist/TextInput/TextInput.d.ts.map +1 -1
  213. package/dist/TextInput/TextInput.js +13 -19
  214. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  215. package/dist/Thumbnail/Thumbnail.js +32 -26
  216. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  217. package/dist/TimeInput/TimeInput.js +7 -15
  218. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  219. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  220. package/dist/Token/Token.d.ts.map +1 -1
  221. package/dist/Token/Token.js +20 -11
  222. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  223. package/dist/Tokenizer/Tokenizer.js +4 -2
  224. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  225. package/dist/Tooltip/useTooltip.js +3 -19
  226. package/dist/TopNav/TopNav.d.ts.map +1 -1
  227. package/dist/TopNav/TopNav.js +6 -5
  228. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  229. package/dist/TopNav/TopNavHeading.js +54 -16
  230. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  231. package/dist/TopNav/TopNavItem.js +3 -9
  232. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  233. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  234. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  235. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  236. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  237. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  238. package/dist/TopNav/TopNavMenu.js +83 -38
  239. package/dist/TreeList/TreeList.d.ts.map +1 -1
  240. package/dist/TreeList/TreeList.js +13 -0
  241. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  242. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  243. package/dist/TreeList/TreeListBranches.js +14 -4
  244. package/dist/TreeList/TreeListItem.d.ts +11 -1
  245. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  246. package/dist/TreeList/TreeListItem.js +57 -30
  247. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  248. package/dist/Typeahead/BaseTypeahead.js +16 -8
  249. package/dist/astryx.css +74 -85
  250. package/dist/astryx.umd.js +56 -56
  251. package/dist/astryx.umd.js.map +4 -4
  252. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  253. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  254. package/dist/hooks/containerReveal.stylex.js +63 -0
  255. package/dist/hooks/index.d.ts +3 -0
  256. package/dist/hooks/index.d.ts.map +1 -1
  257. package/dist/hooks/index.js +2 -0
  258. package/dist/hooks/useClipboard.d.ts +59 -0
  259. package/dist/hooks/useClipboard.d.ts.map +1 -0
  260. package/dist/hooks/useClipboard.js +106 -0
  261. package/dist/hooks/useContainerReveal.d.ts +14 -8
  262. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  263. package/dist/hooks/useContainerReveal.js +28 -69
  264. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  265. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  266. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  267. package/dist/hooks/useLongPress.d.ts.map +1 -1
  268. package/dist/hooks/useLongPress.js +12 -2
  269. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  270. package/dist/hooks/useScrollLock.js +33 -18
  271. package/dist/hooks/useStreamingText.d.ts +18 -3
  272. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  273. package/dist/hooks/useStreamingText.js +47 -7
  274. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  275. package/dist/hooks/useTreeFocus.js +9 -3
  276. package/dist/hooks/useTypeahead.d.ts +3 -2
  277. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  278. package/dist/hooks/useTypeahead.js +19 -7
  279. package/dist/index.d.ts +1 -0
  280. package/dist/index.d.ts.map +1 -1
  281. package/dist/index.js +1 -0
  282. package/dist/theme/defineTheme.d.ts +16 -0
  283. package/dist/theme/defineTheme.d.ts.map +1 -1
  284. package/dist/theme/defineTheme.js +8 -0
  285. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  286. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  287. package/dist/theme/derivedVarRegistry.js +14 -13
  288. package/dist/theme/expandColorScale.d.ts +3 -1
  289. package/dist/theme/expandColorScale.d.ts.map +1 -1
  290. package/dist/theme/expandColorScale.js +17 -7
  291. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  292. package/dist/theme/expandTypeScale.js +17 -0
  293. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  294. package/dist/theme/generateThemeRules.js +11 -0
  295. package/dist/theme/index.d.ts +1 -0
  296. package/dist/theme/index.d.ts.map +1 -1
  297. package/dist/utils/focusOutline.stylex.d.ts +107 -0
  298. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  299. package/dist/utils/focusOutline.stylex.js +130 -0
  300. package/dist/utils/focusReturn.d.ts +24 -0
  301. package/dist/utils/focusReturn.d.ts.map +1 -0
  302. package/dist/utils/focusReturn.js +29 -0
  303. package/dist/utils/index.d.ts +1 -0
  304. package/dist/utils/index.d.ts.map +1 -1
  305. package/dist/utils/index.js +1 -0
  306. package/dist/utils/mergeRefs.d.ts.map +1 -1
  307. package/dist/utils/mergeRefs.js +7 -5
  308. package/dist/utils/rtlStyles.d.ts +2 -2
  309. package/dist/utils/rtlStyles.js +2 -2
  310. package/dist/utils/themeProps.d.ts +20 -1
  311. package/dist/utils/themeProps.d.ts.map +1 -1
  312. package/dist/utils/themeProps.js +8 -2
  313. package/locales/en.json +12 -0
  314. package/locales/pseudo.json +9 -0
  315. package/package.json +7 -2
  316. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  317. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  318. package/src/AlertDialog/AlertDialog.tsx +21 -3
  319. package/src/AppShell/AppShell.doc.mjs +11 -0
  320. package/src/AppShell/AppShell.test.tsx +139 -0
  321. package/src/AppShell/AppShell.tsx +32 -22
  322. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  323. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  324. package/src/AspectRatio/AspectRatio.tsx +13 -0
  325. package/src/Avatar/Avatar.doc.mjs +2 -13
  326. package/src/Avatar/Avatar.test.tsx +33 -8
  327. package/src/Avatar/Avatar.tsx +52 -50
  328. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  329. package/src/Banner/Banner.tsx +9 -6
  330. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  331. package/src/Breadcrumbs/index.ts +5 -1
  332. package/src/Button/Button.tsx +21 -41
  333. package/src/Calendar/Calendar.tsx +2 -1
  334. package/src/Calendar/styles.ts +0 -8
  335. package/src/Carousel/Carousel.doc.mjs +3 -0
  336. package/src/Carousel/Carousel.tsx +10 -6
  337. package/src/Chat/Chat.doc.mjs +2 -0
  338. package/src/Chat/ChatDictationButton.tsx +7 -1
  339. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  340. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  341. package/src/Chat/ChatSendButton.tsx +2 -3
  342. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  343. package/src/Chat/ChatToolCalls.tsx +36 -16
  344. package/src/Chat/useTriggerMenu.tsx +2 -5
  345. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  346. package/src/CheckboxInput/CheckboxInput.test.tsx +115 -0
  347. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  348. package/src/ClickableCard/ClickableCard.tsx +6 -11
  349. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  350. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  351. package/src/CodeBlock/CodeBlock.tsx +57 -80
  352. package/src/Collapsible/Collapsible.tsx +22 -18
  353. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  354. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  355. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  356. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  357. package/src/ComplexSelector/ComplexSelector.test.tsx +64 -0
  358. package/src/ComplexSelector/ComplexSelector.tsx +46 -29
  359. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  360. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  361. package/src/ContextMenu/ContextMenu.tsx +3 -3
  362. package/src/ContextMenu/index.ts +5 -1
  363. package/src/DateInput/DateInput.doc.mjs +18 -3
  364. package/src/DateInput/DateInput.test.tsx +93 -11
  365. package/src/DateInput/DateInput.tsx +41 -19
  366. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  367. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  368. package/src/DateRangeInput/DateRangeInput.tsx +24 -12
  369. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  370. package/src/DateTimeInput/DateTimeInput.test.tsx +75 -0
  371. package/src/DateTimeInput/DateTimeInput.tsx +35 -8
  372. package/src/Dialog/Dialog.tsx +2 -9
  373. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  374. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  375. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  376. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  377. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  378. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  379. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  380. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  381. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  382. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  383. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  384. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  385. package/src/DropdownMenu/index.ts +8 -1
  386. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  387. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  388. package/src/EmptyState/EmptyState.test.tsx +62 -0
  389. package/src/EmptyState/EmptyState.tsx +16 -6
  390. package/src/Field/Field.doc.mjs +1 -0
  391. package/src/Field/InputClearButton.test.tsx +117 -0
  392. package/src/Field/InputClearButton.tsx +30 -3
  393. package/src/HoverCard/useHoverCard.tsx +2 -23
  394. package/src/Icon/Icon.doc.mjs +2 -1
  395. package/src/Indicator/CheckIndicator.tsx +174 -0
  396. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  397. package/src/Indicator/Indicator.doc.mjs +344 -0
  398. package/src/Indicator/Indicator.test.tsx +393 -0
  399. package/src/Indicator/RadioIndicator.tsx +206 -0
  400. package/src/Indicator/index.ts +45 -0
  401. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  402. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  403. package/src/Indicator/indicatorRegistry.ts +120 -0
  404. package/src/Indicator/types.ts +186 -0
  405. package/src/Indicator/useIndicator.ts +39 -0
  406. package/src/Item/Item.doc.mjs +1 -1
  407. package/src/Item/Item.tsx +7 -14
  408. package/src/Layer/useLayer.doc.mjs +2 -2
  409. package/src/Layer/useLayer.test.tsx +85 -0
  410. package/src/Layer/useLayer.tsx +39 -1
  411. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  412. package/src/Lightbox/Lightbox.tsx +43 -38
  413. package/src/Link/Link.tsx +4 -11
  414. package/src/MobileNav/MobileNav.tsx +3 -3
  415. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  416. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  417. package/src/MoreMenu/MoreMenu.tsx +19 -0
  418. package/src/MultiSelector/MultiSelector.doc.mjs +9 -1
  419. package/src/MultiSelector/MultiSelector.test.tsx +255 -16
  420. package/src/MultiSelector/MultiSelector.tsx +103 -99
  421. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  422. package/src/NumberInput/NumberInput.test.tsx +726 -21
  423. package/src/NumberInput/NumberInput.tsx +353 -59
  424. package/src/Outline/Outline.tsx +2 -5
  425. package/src/Pagination/Pagination.doc.mjs +1 -1
  426. package/src/Pagination/Pagination.test.tsx +22 -7
  427. package/src/Pagination/Pagination.tsx +38 -35
  428. package/src/Popover/Popover.tsx +6 -7
  429. package/src/PowerSearch/PowerSearch.tsx +1 -1
  430. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  431. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  432. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  433. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  434. package/src/ProgressBar/ProgressBar.tsx +124 -22
  435. package/src/RadioList/RadioList.doc.mjs +4 -2
  436. package/src/RadioList/RadioListItem.tsx +31 -130
  437. package/src/Resizable/ResizeHandle.tsx +2 -9
  438. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  439. package/src/SelectableCard/SelectableCard.tsx +4 -9
  440. package/src/Selector/Selector.doc.mjs +7 -4
  441. package/src/Selector/Selector.test.tsx +935 -25
  442. package/src/Selector/Selector.tsx +189 -106
  443. package/src/Selector/hooks.ts +77 -50
  444. package/src/SideNav/SideNav.test.tsx +46 -0
  445. package/src/SideNav/SideNav.tsx +1 -0
  446. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  447. package/src/SideNav/SideNavHeading.tsx +48 -10
  448. package/src/SideNav/SideNavItem.tsx +20 -12
  449. package/src/Stack/Stack.doc.mjs +110 -0
  450. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  451. package/src/Switch/Switch.test.tsx +32 -0
  452. package/src/Switch/Switch.tsx +8 -8
  453. package/src/TabList/Tab.tsx +2 -9
  454. package/src/TabList/TabMenu.tsx +14 -21
  455. package/src/Table/BaseTable.tsx +11 -0
  456. package/src/Table/index.ts +1 -4
  457. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  458. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  459. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  460. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  461. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  462. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  463. package/src/Table/tableContextMenu.test.tsx +27 -0
  464. package/src/Table/tableContextMenu.tsx +1 -0
  465. package/src/Table/types.ts +11 -0
  466. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  467. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  468. package/src/TextArea/TextArea.doc.mjs +42 -2
  469. package/src/TextArea/TextArea.test.tsx +219 -0
  470. package/src/TextArea/TextArea.tsx +34 -7
  471. package/src/TextInput/TextInput.doc.mjs +18 -2
  472. package/src/TextInput/TextInput.test.tsx +189 -0
  473. package/src/TextInput/TextInput.tsx +25 -31
  474. package/src/Thumbnail/Thumbnail.tsx +2 -9
  475. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  476. package/src/TimeInput/TimeInput.test.tsx +30 -3
  477. package/src/TimeInput/TimeInput.tsx +9 -26
  478. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  479. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  480. package/src/Token/Token.tsx +5 -28
  481. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  482. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  483. package/src/Tokenizer/Tokenizer.tsx +10 -2
  484. package/src/Tooltip/useTooltip.tsx +2 -23
  485. package/src/TopNav/TopNav.tsx +1 -3
  486. package/src/TopNav/TopNavHeading.tsx +42 -13
  487. package/src/TopNav/TopNavItem.tsx +3 -21
  488. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  489. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  490. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  491. package/src/TopNav/TopNavMenu.tsx +34 -37
  492. package/src/TreeList/TreeList.doc.mjs +5 -0
  493. package/src/TreeList/TreeList.test.tsx +206 -7
  494. package/src/TreeList/TreeList.tsx +22 -0
  495. package/src/TreeList/TreeListBranches.tsx +25 -2
  496. package/src/TreeList/TreeListItem.tsx +89 -52
  497. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  498. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  499. package/src/Typeahead/Typeahead.test.tsx +76 -3
  500. package/src/hooks/containerReveal.stylex.ts +102 -0
  501. package/src/hooks/index.ts +4 -0
  502. package/src/hooks/useClipboard.doc.mjs +87 -0
  503. package/src/hooks/useClipboard.test.tsx +151 -0
  504. package/src/hooks/useClipboard.ts +135 -0
  505. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  506. package/src/hooks/useContainerReveal.test.tsx +42 -62
  507. package/src/hooks/useContainerReveal.ts +36 -91
  508. package/src/hooks/useImageMode.test.ts +1 -1
  509. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  510. package/src/hooks/useLongPress.test.tsx +18 -0
  511. package/src/hooks/useLongPress.ts +12 -2
  512. package/src/hooks/useScrollLock.test.ts +72 -0
  513. package/src/hooks/useScrollLock.ts +51 -19
  514. package/src/hooks/useStreamingText.test.ts +46 -1
  515. package/src/hooks/useStreamingText.ts +49 -7
  516. package/src/hooks/useTreeFocus.test.tsx +50 -0
  517. package/src/hooks/useTreeFocus.ts +14 -3
  518. package/src/hooks/useTypeahead.test.tsx +150 -0
  519. package/src/hooks/useTypeahead.ts +24 -9
  520. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  521. package/src/index.ts +1 -0
  522. package/src/theme/defineTheme.ts +24 -0
  523. package/src/theme/derivedVarRegistry.test.ts +21 -1
  524. package/src/theme/derivedVarRegistry.ts +19 -6
  525. package/src/theme/expandColorScale.test.ts +14 -0
  526. package/src/theme/expandColorScale.ts +24 -9
  527. package/src/theme/expandTypeScale.test.ts +43 -0
  528. package/src/theme/expandTypeScale.ts +17 -0
  529. package/src/theme/generateThemeRules.test.ts +61 -20
  530. package/src/theme/generateThemeRules.ts +11 -0
  531. package/src/theme/index.ts +13 -0
  532. package/src/utils/focusOutline.stylex.ts +163 -0
  533. package/src/utils/focusReturn.test.ts +42 -0
  534. package/src/utils/focusReturn.ts +31 -0
  535. package/src/utils/index.ts +1 -0
  536. package/src/utils/mergeRefs.test.ts +48 -0
  537. package/src/utils/mergeRefs.ts +12 -6
  538. package/src/utils/rtlStyles.ts +2 -2
  539. package/src/utils/themeProps.ts +26 -4
  540. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  541. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  542. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  543. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  544. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  545. package/dist/RadioList/radio.markers.stylex.js +0 -12
  546. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  547. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  548. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  549. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  550. package/src/RadioList/radio.markers.stylex.ts +0 -10
  551. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -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,7 @@ 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 {stableClassName} from '../naming';
57
65
  import {useTranslator} from '../i18n';
58
66
 
59
67
  export type {DateRange} from '../Calendar';
@@ -355,6 +363,14 @@ export interface DateRangeInputProps extends Omit<
355
363
  * @default 2
356
364
  */
357
365
  numberOfMonths?: 1 | 2;
366
+
367
+ /**
368
+ * First day of week in the calendar. Accepts a number
369
+ * (0 = Sunday … 6 = Saturday) or a three-letter day name ('sun'–'sat',
370
+ * case-insensitive).
371
+ * @default 0
372
+ */
373
+ weekStartsOn?: DayOfWeek | DayOfWeekName;
358
374
  }
359
375
 
360
376
  /**
@@ -396,6 +412,7 @@ export function DateRangeInput({
396
412
  statusVariant = 'attached',
397
413
  labelTooltip,
398
414
  numberOfMonths = 2,
415
+ weekStartsOn,
399
416
  width,
400
417
  xstyle,
401
418
  className,
@@ -548,6 +565,7 @@ export function DateRangeInput({
548
565
  themeProps('date-range-input', {
549
566
  size,
550
567
  status: status?.type ?? null,
568
+ disabled: isDisabled ? 'disabled' : null,
551
569
  }),
552
570
  stylex.props(
553
571
  inputWrapperStyles.base,
@@ -612,18 +630,11 @@ export function DateRangeInput({
612
630
  {displayValue || placeholder}
613
631
  </button>
614
632
  {hasClear && value !== null && !isEffectivelyDisabled && (
615
- <button
616
- type="button"
633
+ <InputClearButton
634
+ label={t('@astryx.dateInput.clear', {label})}
617
635
  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>
636
+ iconClassName={stableClassName('date-range-input-clear-icon')}
637
+ />
627
638
  )}
628
639
  {isBusy && <Spinner size="sm" />}
629
640
  {statusIcon}
@@ -667,6 +678,7 @@ export function DateRangeInput({
667
678
  max={max}
668
679
  dateConstraints={dateConstraints}
669
680
  numberOfMonths={numberOfMonths}
681
+ weekStartsOn={weekStartsOn}
670
682
  />
671
683
  </div>,
672
684
  {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
  };
@@ -820,6 +820,62 @@ describe('DateTimeInput', () => {
820
820
  expect(onChange.mock.calls[0][0]).toContain('14:31');
821
821
  });
822
822
  });
823
+
824
+ describe('weekStartsOn', () => {
825
+ // The calendar popover renders in the top layer; jsdom keeps the content in
826
+ // the DOM but role queries skip it, so read the columnheaders directly.
827
+ const openAndReadWeekdays = (container: HTMLElement): (string | null)[] => {
828
+ fireEvent.keyDown(screen.getAllByRole('combobox')[0], {key: 'ArrowDown'});
829
+ return Array.from(container.querySelectorAll('[role="columnheader"]'))
830
+ .slice(0, 7)
831
+ .map(h => h.textContent);
832
+ };
833
+
834
+ it('defaults to a Sunday-first week', () => {
835
+ const {container} = render(
836
+ <DateTimeInput label="When" onChange={() => {}} />,
837
+ );
838
+ expect(openAndReadWeekdays(container)).toEqual([
839
+ 'Su',
840
+ 'Mo',
841
+ 'Tu',
842
+ 'We',
843
+ 'Th',
844
+ 'Fr',
845
+ 'Sa',
846
+ ]);
847
+ });
848
+
849
+ it('forwards a numeric weekStartsOn to the calendar', () => {
850
+ const {container} = render(
851
+ <DateTimeInput label="When" onChange={() => {}} weekStartsOn={1} />,
852
+ );
853
+ expect(openAndReadWeekdays(container)).toEqual([
854
+ 'Mo',
855
+ 'Tu',
856
+ 'We',
857
+ 'Th',
858
+ 'Fr',
859
+ 'Sa',
860
+ 'Su',
861
+ ]);
862
+ });
863
+
864
+ it('accepts a three-letter day name', () => {
865
+ const {container} = render(
866
+ <DateTimeInput label="When" onChange={() => {}} weekStartsOn="mon" />,
867
+ );
868
+ expect(openAndReadWeekdays(container)).toEqual([
869
+ 'Mo',
870
+ 'Tu',
871
+ 'We',
872
+ 'Th',
873
+ 'Fr',
874
+ 'Sa',
875
+ 'Su',
876
+ ]);
877
+ });
878
+ });
823
879
  // ===========================================================================
824
880
  // Segment theme targets (#4075)
825
881
  // ===========================================================================
@@ -931,3 +987,22 @@ describe('DateTimeInput', () => {
931
987
  });
932
988
  });
933
989
  });
990
+
991
+ describe('DateTimeInput disabled theme state', () => {
992
+ it('reflects disabled on the root target so themes can gate paint on it', () => {
993
+ const {container} = render(
994
+ <DateTimeInput label="Meeting" onChange={() => {}} isDisabled />,
995
+ );
996
+ const root = container.querySelector('.astryx-date-time-input');
997
+ expect(root).toHaveAttribute('data-disabled', 'disabled');
998
+ expect(root).toHaveClass('disabled');
999
+ });
1000
+
1001
+ it('omits data-disabled when enabled, like status does', () => {
1002
+ const {container} = render(
1003
+ <DateTimeInput label="Meeting" onChange={() => {}} />,
1004
+ );
1005
+ const root = container.querySelector('.astryx-date-time-input');
1006
+ expect(root).not.toHaveAttribute('data-disabled');
1007
+ });
1008
+ });
@@ -38,6 +38,7 @@ import {
38
38
  } from '../theme/tokens.stylex';
39
39
  import {
40
40
  Field,
41
+ InputClearButton,
41
42
  type InputStatus,
42
43
  inputWrapperStyles,
43
44
  inputStatusBorderStyles,
@@ -47,7 +48,13 @@ import {
47
48
  import {Icon} from '../Icon';
48
49
  import {VisuallyHidden} from '../VisuallyHidden';
49
50
  import {Spinner} from '../Spinner';
50
- import {Calendar, type ISODateString, type CalendarHandle} from '../Calendar';
51
+ import {
52
+ Calendar,
53
+ type ISODateString,
54
+ type CalendarHandle,
55
+ type DayOfWeek,
56
+ type DayOfWeekName,
57
+ } from '../Calendar';
51
58
  import {useCalendarConstraints} from '../Calendar/hooks';
52
59
  import {usePopover} from '../Popover';
53
60
  import {useTooltip} from '../Tooltip';
@@ -64,6 +71,7 @@ import {
64
71
  adjustTime,
65
72
  mergeProps,
66
73
  mergeRefs,
74
+ isFocusDetached,
67
75
  } from '../utils';
68
76
  import {
69
77
  plainDateFromISO,
@@ -348,6 +356,14 @@ export interface DateTimeInputProps extends Omit<
348
356
  * @default 1
349
357
  */
350
358
  numberOfMonths?: 1 | 2;
359
+
360
+ /**
361
+ * First day of week in the calendar. Accepts a number
362
+ * (0 = Sunday … 6 = Saturday) or a three-letter day name ('sun'–'sat',
363
+ * case-insensitive).
364
+ * @default 0
365
+ */
366
+ weekStartsOn?: DayOfWeek | DayOfWeekName;
351
367
  }
352
368
 
353
369
  function splitDateTime(dt: ISODateTimeString | undefined): {
@@ -425,6 +441,7 @@ export function DateTimeInput({
425
441
  status,
426
442
  labelTooltip,
427
443
  numberOfMonths = 1,
444
+ weekStartsOn,
428
445
  width,
429
446
  xstyle,
430
447
  className,
@@ -602,7 +619,18 @@ export function DateTimeInput({
602
619
  const popover = usePopover({
603
620
  dialogLabel: t('@astryx.dateTimeInput.dialogLabel'),
604
621
  closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
605
- onHide: () => dateInputRef.current?.focus(),
622
+ // Return focus to the date input when the calendar closes — but only when
623
+ // the dismiss left focus detached (Escape, or a click on non-focusable
624
+ // empty space), which the focus trap can't restore on its own. A native
625
+ // popover="auto" light-dismiss fires synchronously with the pointer event
626
+ // that moved focus, so if the user clicked another control — the time
627
+ // input, the clear button, another field, anywhere — focus has already
628
+ // landed there; reclaiming it would fight their click.
629
+ onHide: () => {
630
+ if (isFocusDetached()) {
631
+ dateInputRef.current?.focus();
632
+ }
633
+ },
606
634
  });
607
635
 
608
636
  const handleCalendarToggle = useCallback(() => {
@@ -877,6 +905,7 @@ export function DateTimeInput({
877
905
  themeProps('date-time-input', {
878
906
  size,
879
907
  status: status?.type ?? null,
908
+ disabled: isDisabled ? 'disabled' : null,
880
909
  }),
881
910
  stylex.props(styles.row, xstyle),
882
911
  className,
@@ -962,13 +991,10 @@ export function DateTimeInput({
962
991
  {!isDateInputValid ? 'Invalid date' : ''}
963
992
  </VisuallyHidden>
964
993
  {hasClear && value !== undefined && !isEffectivelyDisabled && (
965
- <button
966
- type="button"
994
+ <InputClearButton
995
+ label={t('@astryx.dateInput.clear', {label})}
967
996
  onClick={handleClear}
968
- aria-label={t('@astryx.dateInput.clear', {label})}
969
- {...stylex.props(styles.iconButton)}>
970
- <Icon icon="close" size="sm" color="secondary" />
971
- </button>
997
+ />
972
998
  )}
973
999
  {isBusy && <Spinner size="sm" />}
974
1000
  {statusIcon}
@@ -1050,6 +1076,7 @@ export function DateTimeInput({
1050
1076
  max={calendarMax}
1051
1077
  dateConstraints={dateConstraints}
1052
1078
  numberOfMonths={numberOfMonths}
1079
+ weekStartsOn={weekStartsOn}
1053
1080
  />,
1054
1081
  {placement: 'below', alignment: 'start'},
1055
1082
  )}
@@ -50,6 +50,7 @@ import {devWarn} from '../utils/devWarning';
50
50
  import {DialogContext} from './DialogContext';
51
51
  import {themeProps} from '../utils/themeProps';
52
52
  import type {DialogVariantMap} from './index';
53
+ import {focusOutlineProps} from '../utils/focusOutline.stylex';
53
54
 
54
55
  /**
55
56
  * Calculate a directional translate offset for dialog entry animation.
@@ -137,14 +138,6 @@ const styles = stylex.create({
137
138
  animationDuration: durationVars['--duration-medium-max'],
138
139
  animationTimingFunction: easeVars['--ease-standard'],
139
140
  animationFillMode: 'backwards' as const,
140
- outline: {
141
- default: null,
142
- ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
143
- },
144
- outlineOffset: {
145
- default: '0',
146
- ':focus-visible': '2px',
147
- },
148
141
  },
149
142
  // Applied via isOpen prop — avoids :where([open]) attribute selectors
150
143
  // which have zero specificity and can lose to default styles depending
@@ -640,7 +633,7 @@ export function Dialog({
640
633
  {...safeProps}
641
634
  {...mergeProps(
642
635
  themeProps('dialog', {variant}),
643
- stylex.props(
636
+ focusOutlineProps.focusVisible(
644
637
  styles.dialog,
645
638
  isOpen && styles.open,
646
639
  styles.backdrop,
@@ -24,17 +24,12 @@ export const docs = {
24
24
  theming: {
25
25
  targets: [
26
26
  {className: 'astryx-dropdown-menu'},
27
- {className: 'astryx-dropdown-menu-item', visualProps: ['size']},
27
+ {className: 'astryx-dropdown-menu-item', visualProps: ['size', 'variant']},
28
28
  {
29
29
  className: 'astryx-dropdown-menu-radio',
30
30
  visualProps: ['size'],
31
31
  states: ['checked', 'disabled'],
32
32
  },
33
- {
34
- className: 'astryx-dropdown-menu-radio-dot',
35
- visualProps: ['size'],
36
- states: ['checked', 'disabled'],
37
- },
38
33
  {className: 'astryx-dropdown-menu-section-heading'},
39
34
  {className: 'astryx-dropdown-menu-divider'},
40
35
  {className: 'astryx-dropdown-menu-indicator-icon'},
@@ -59,7 +54,7 @@ export const docs = {
59
54
  {
60
55
  name: 'items',
61
56
  type: 'DropdownMenuOption[]',
62
- description: 'Array of menu entries. Each entry is one of: an action item `{label, onClick?, icon?, isDisabled?}`, a divider `{type: "divider"}`, or a section `{type: "section", title?, items: [...action items]}`.',
57
+ description: 'Array of menu entries. Each entry is one of: an action item `{label, onClick?, icon?, description?, endContent?, isDisabled?, variant?, hasCloseOnSelect?, id?}` (variant `"destructive"` renders it in the error color; `endContent` holds trailing content such as a keyboard-shortcut hint; `id` is the row\'s stable React key, needed only when the array reorders or filters), a divider `{type: "divider"}`, or a section `{type: "section", title?, id?, items: [...action items]}`.',
63
58
  required: true,
64
59
  },
65
60
  {
@@ -101,8 +96,9 @@ export const docs = {
101
96
  default: 'true',
102
97
  }, {
103
98
  name: 'children',
104
- type: '(item: DropdownMenuItemData) => ReactNode',
105
- description: 'Custom render function for each item in the list.',
99
+ type: 'ReactNode',
100
+ description:
101
+ 'Compound-mode menu content: DropdownMenuItem, DropdownMenuDivider, DropdownMenuSubMenu, and the selectable items. Mutually exclusive with `items`.',
106
102
  },
107
103
  ],
108
104
  components: [