@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
@@ -9,7 +9,7 @@
9
9
  * SYNC: When DateTimeInput.tsx changes, update tests to match new behavior
10
10
  */
11
11
 
12
- import {describe, it, expect, vi, beforeEach} from 'vitest';
12
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
13
13
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {getButton, queryButton} from '../__tests__/fastRoleQueries';
@@ -17,6 +17,16 @@ import {DateTimeInput} from './DateTimeInput';
17
17
  import type {ISODateTimeString} from './DateTimeInput';
18
18
  import {defineTheme} from '../theme/defineTheme';
19
19
  import {generateThemeCSS} from '../theme/generateThemeRules';
20
+ import {InternationalizationProvider} from '../i18n';
21
+ import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
22
+
23
+ function politeRegion(): HTMLElement | null {
24
+ return document.querySelector('[data-astryx-live-region="polite"]');
25
+ }
26
+
27
+ afterEach(() => {
28
+ __resetLiveRegionsForTest();
29
+ });
20
30
 
21
31
  function generateThemeTestCSS(theme: Parameters<typeof generateThemeCSS>[0]) {
22
32
  const {prose, component} = generateThemeCSS(theme);
@@ -626,6 +636,35 @@ describe('DateTimeInput', () => {
626
636
 
627
637
  expect(screen.getByText('Invalid time')).toBeInTheDocument();
628
638
  });
639
+
640
+ it('resolves the invalid date and time announcements from the i18n catalog', () => {
641
+ render(
642
+ <InternationalizationProvider
643
+ locale="en"
644
+ overrides={{
645
+ en: {
646
+ '@astryx.dateInput.invalidDate': 'Ungültiges Datum',
647
+ '@astryx.timeInput.invalidTime': 'Ungültige Zeit',
648
+ },
649
+ }}>
650
+ <DateTimeInput
651
+ label="Meeting"
652
+ value={'2026-03-15T10:00' as ISODateTimeString}
653
+ onChange={() => {}}
654
+ />
655
+ </InternationalizationProvider>,
656
+ );
657
+
658
+ fireEvent.change(screen.getByRole('combobox'), {
659
+ target: {value: '13/45/2024'},
660
+ });
661
+ expect(screen.getByText('Ungültiges Datum')).toBeInTheDocument();
662
+
663
+ fireEvent.change(screen.getByLabelText('Meeting time'), {
664
+ target: {value: '99:99 zz'},
665
+ });
666
+ expect(screen.getByText('Ungültige Zeit')).toBeInTheDocument();
667
+ });
629
668
  });
630
669
  describe('disabledMessage', () => {
631
670
  // jsdom does not implement the Popover API used by the tooltip, so mock
@@ -819,6 +858,101 @@ describe('DateTimeInput', () => {
819
858
  expect(onChange).toHaveBeenCalledTimes(1);
820
859
  expect(onChange.mock.calls[0][0]).toContain('14:31');
821
860
  });
861
+
862
+ // Arrow-key stepping mutates a plain textbox programmatically, and screen
863
+ // readers do not announce programmatic textbox changes — the new value
864
+ // must be announced through the polite live region (WCAG 4.1.2).
865
+ it('politely announces the new time after ArrowUp stepping', async () => {
866
+ render(
867
+ <DateTimeInput
868
+ label="Meeting"
869
+ value={'2026-03-15T14:30' as ISODateTimeString}
870
+ onChange={() => {}}
871
+ />,
872
+ );
873
+
874
+ fireEvent.keyDown(screen.getByLabelText('Meeting time'), {
875
+ key: 'ArrowUp',
876
+ });
877
+
878
+ await waitFor(() => {
879
+ expect(politeRegion()).toHaveTextContent('2:31 PM');
880
+ });
881
+ });
882
+
883
+ it('politely announces the new time after ArrowDown stepping', async () => {
884
+ render(
885
+ <DateTimeInput
886
+ label="Meeting"
887
+ value={'2026-03-15T14:30' as ISODateTimeString}
888
+ onChange={() => {}}
889
+ />,
890
+ );
891
+
892
+ fireEvent.keyDown(screen.getByLabelText('Meeting time'), {
893
+ key: 'ArrowDown',
894
+ });
895
+
896
+ await waitFor(() => {
897
+ expect(politeRegion()).toHaveTextContent('2:29 PM');
898
+ });
899
+ });
900
+ });
901
+
902
+ describe('weekStartsOn', () => {
903
+ // The calendar popover renders in the top layer; jsdom keeps the content in
904
+ // the DOM but role queries skip it, so read the columnheaders directly.
905
+ const openAndReadWeekdays = (container: HTMLElement): (string | null)[] => {
906
+ fireEvent.keyDown(screen.getAllByRole('combobox')[0], {key: 'ArrowDown'});
907
+ return Array.from(container.querySelectorAll('[role="columnheader"]'))
908
+ .slice(0, 7)
909
+ .map(h => h.textContent);
910
+ };
911
+
912
+ it('defaults to a Sunday-first week', () => {
913
+ const {container} = render(
914
+ <DateTimeInput label="When" onChange={() => {}} />,
915
+ );
916
+ expect(openAndReadWeekdays(container)).toEqual([
917
+ 'Su',
918
+ 'Mo',
919
+ 'Tu',
920
+ 'We',
921
+ 'Th',
922
+ 'Fr',
923
+ 'Sa',
924
+ ]);
925
+ });
926
+
927
+ it('forwards a numeric weekStartsOn to the calendar', () => {
928
+ const {container} = render(
929
+ <DateTimeInput label="When" onChange={() => {}} weekStartsOn={1} />,
930
+ );
931
+ expect(openAndReadWeekdays(container)).toEqual([
932
+ 'Mo',
933
+ 'Tu',
934
+ 'We',
935
+ 'Th',
936
+ 'Fr',
937
+ 'Sa',
938
+ 'Su',
939
+ ]);
940
+ });
941
+
942
+ it('accepts a three-letter day name', () => {
943
+ const {container} = render(
944
+ <DateTimeInput label="When" onChange={() => {}} weekStartsOn="mon" />,
945
+ );
946
+ expect(openAndReadWeekdays(container)).toEqual([
947
+ 'Mo',
948
+ 'Tu',
949
+ 'We',
950
+ 'Th',
951
+ 'Fr',
952
+ 'Sa',
953
+ 'Su',
954
+ ]);
955
+ });
822
956
  });
823
957
  // ===========================================================================
824
958
  // Segment theme targets (#4075)
@@ -931,3 +1065,22 @@ describe('DateTimeInput', () => {
931
1065
  });
932
1066
  });
933
1067
  });
1068
+
1069
+ describe('DateTimeInput disabled theme state', () => {
1070
+ it('reflects disabled on the root target so themes can gate paint on it', () => {
1071
+ const {container} = render(
1072
+ <DateTimeInput label="Meeting" onChange={() => {}} isDisabled />,
1073
+ );
1074
+ const root = container.querySelector('.astryx-date-time-input');
1075
+ expect(root).toHaveAttribute('data-disabled', 'disabled');
1076
+ expect(root).toHaveClass('disabled');
1077
+ });
1078
+
1079
+ it('omits data-disabled when enabled, like status does', () => {
1080
+ const {container} = render(
1081
+ <DateTimeInput label="Meeting" onChange={() => {}} />,
1082
+ );
1083
+ const root = container.querySelector('.astryx-date-time-input');
1084
+ expect(root).not.toHaveAttribute('data-disabled');
1085
+ });
1086
+ });
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file DateTimeInput.tsx
7
- * @input Uses React, Field, Calendar, usePopover, time parsing utilities
7
+ * @input Uses React, Field, Calendar, usePopover, useAnnounce, time parsing utilities
8
8
  * @output Exports DateTimeInput component, DateTimeInputProps
9
9
  * @position Core implementation; consumed by index.ts, tested by DateTimeInput.test.tsx
10
10
  *
@@ -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,
@@ -74,8 +82,10 @@ import {
74
82
 
75
83
  import type {BaseProps} from '../BaseProps';
76
84
  import type {SizeValue} from '../utils/types';
85
+ import {useAnnounce} from '../hooks/useAnnounce';
77
86
  import {useSize} from '../SizeContext/SizeContext';
78
87
  import {themeProps} from '../utils/themeProps';
88
+ import {focusOutlineStyles} from '../utils/focusOutline.stylex';
79
89
  import {useTranslator} from '../i18n';
80
90
 
81
91
  export type ISODateTimeString = string & {
@@ -110,11 +120,6 @@ const styles = stylex.create({
110
120
  backgroundColor: 'transparent',
111
121
  cursor: 'pointer',
112
122
  borderRadius: radiusVars['--radius-element'],
113
- outline: {
114
- default: 'none',
115
- ':focus-visible': `${borderVars['--border-width']} solid ${colorVars['--color-accent']}`,
116
- },
117
- outlineOffset: 1,
118
123
  },
119
124
  iconButtonDisabled: {
120
125
  cursor: 'not-allowed',
@@ -348,6 +353,14 @@ export interface DateTimeInputProps extends Omit<
348
353
  * @default 1
349
354
  */
350
355
  numberOfMonths?: 1 | 2;
356
+
357
+ /**
358
+ * First day of week in the calendar. Accepts a number
359
+ * (0 = Sunday … 6 = Saturday) or a three-letter day name ('sun'–'sat',
360
+ * case-insensitive).
361
+ * @default 0
362
+ */
363
+ weekStartsOn?: DayOfWeek | DayOfWeekName;
351
364
  }
352
365
 
353
366
  function splitDateTime(dt: ISODateTimeString | undefined): {
@@ -425,6 +438,7 @@ export function DateTimeInput({
425
438
  status,
426
439
  labelTooltip,
427
440
  numberOfMonths = 1,
441
+ weekStartsOn,
428
442
  width,
429
443
  xstyle,
430
444
  className,
@@ -433,6 +447,10 @@ export function DateTimeInput({
433
447
  ...rest
434
448
  }: DateTimeInputProps) {
435
449
  const t = useTranslator();
450
+ // Speaks arrow-key stepping results through the persistent live regions:
451
+ // stepping programmatically rewrites a plain textbox's value, which screen
452
+ // readers do not announce on their own (WCAG 4.1.2).
453
+ const announce = useAnnounce();
436
454
  const placeholder =
437
455
  placeholderFromProps ?? t('@astryx.dateTimeInput.placeholder');
438
456
  const timePlaceholder =
@@ -602,7 +620,18 @@ export function DateTimeInput({
602
620
  const popover = usePopover({
603
621
  dialogLabel: t('@astryx.dateTimeInput.dialogLabel'),
604
622
  closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
605
- onHide: () => dateInputRef.current?.focus(),
623
+ // Return focus to the date input when the calendar closes — but only when
624
+ // the dismiss left focus detached (Escape, or a click on non-focusable
625
+ // empty space), which the focus trap can't restore on its own. A native
626
+ // popover="auto" light-dismiss fires synchronously with the pointer event
627
+ // that moved focus, so if the user clicked another control — the time
628
+ // input, the clear button, another field, anywhere — focus has already
629
+ // landed there; reclaiming it would fight their click.
630
+ onHide: () => {
631
+ if (isFocusDetached()) {
632
+ dateInputRef.current?.focus();
633
+ }
634
+ },
606
635
  });
607
636
 
608
637
  const handleCalendarToggle = useCallback(() => {
@@ -827,11 +856,23 @@ export function DateTimeInput({
827
856
  const combined = combineDateTime(valueParts.date, newTime);
828
857
  if (combined) {
829
858
  fireChange(combined);
859
+ // Screen readers do not announce the programmatic value rewrite,
860
+ // so speak the new time explicitly (WCAG 4.1.2).
861
+ announce(formatDisplayTime(newTime, hasSeconds));
830
862
  }
831
863
  }
832
864
  }
833
865
  },
834
- [valueParts, hasSeconds, timeIncrement, timeMin, timeMax, fireChange],
866
+ [
867
+ valueParts,
868
+ hasSeconds,
869
+ timeIncrement,
870
+ timeMin,
871
+ timeMax,
872
+ fireChange,
873
+ announce,
874
+ formatDisplayTime,
875
+ ],
835
876
  );
836
877
 
837
878
  // --- Clear ---
@@ -877,6 +918,7 @@ export function DateTimeInput({
877
918
  themeProps('date-time-input', {
878
919
  size,
879
920
  status: status?.type ?? null,
921
+ disabled: isDisabled ? 'disabled' : null,
880
922
  }),
881
923
  stylex.props(styles.row, xstyle),
882
924
  className,
@@ -912,6 +954,7 @@ export function DateTimeInput({
912
954
  : t('@astryx.dateInput.openCalendar')
913
955
  }
914
956
  {...stylex.props(
957
+ focusOutlineStyles.focusVisible,
915
958
  styles.iconButton,
916
959
  isEffectivelyDisabled && styles.iconButtonDisabled,
917
960
  )}>
@@ -959,16 +1002,13 @@ export function DateTimeInput({
959
1002
  rejected (WCAG 3.3.1).
960
1003
  */}
961
1004
  <VisuallyHidden as="div" role="alert" aria-live="assertive">
962
- {!isDateInputValid ? 'Invalid date' : ''}
1005
+ {!isDateInputValid ? t('@astryx.dateInput.invalidDate') : ''}
963
1006
  </VisuallyHidden>
964
1007
  {hasClear && value !== undefined && !isEffectivelyDisabled && (
965
- <button
966
- type="button"
1008
+ <InputClearButton
1009
+ label={t('@astryx.dateInput.clear', {label})}
967
1010
  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>
1011
+ />
972
1012
  )}
973
1013
  {isBusy && <Spinner size="sm" />}
974
1014
  {statusIcon}
@@ -1035,7 +1075,7 @@ export function DateTimeInput({
1035
1075
  technology (WCAG 3.3.1).
1036
1076
  */}
1037
1077
  <VisuallyHidden as="div" role="alert" aria-live="assertive">
1038
- {!isTimeInputValid ? 'Invalid time' : ''}
1078
+ {!isTimeInputValid ? t('@astryx.timeInput.invalidTime') : ''}
1039
1079
  </VisuallyHidden>
1040
1080
  </div>
1041
1081
  </div>
@@ -1050,6 +1090,7 @@ export function DateTimeInput({
1050
1090
  max={calendarMax}
1051
1091
  dateConstraints={dateConstraints}
1052
1092
  numberOfMonths={numberOfMonths}
1093
+ weekStartsOn={weekStartsOn}
1053
1094
  />,
1054
1095
  {placement: 'below', alignment: 'start'},
1055
1096
  )}
@@ -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: [