@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3

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 (730) hide show
  1. package/CHANGELOG.md +161 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +49 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +62 -20
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +7 -3
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +21 -23
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +12 -12
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +17 -9
  49. package/dist/Card/index.d.ts +35 -1
  50. package/dist/Card/index.d.ts.map +1 -1
  51. package/dist/Card/index.js +21 -1
  52. package/dist/Carousel/Carousel.d.ts.map +1 -1
  53. package/dist/Carousel/Carousel.js +3 -3
  54. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  55. package/dist/Chat/ChatComposerInput.js +2 -3
  56. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  57. package/dist/Chat/ChatLayout.js +3 -3
  58. package/dist/Chat/ChatMessageList.d.ts +22 -3
  59. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  60. package/dist/Chat/ChatMessageList.js +6 -3
  61. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  62. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  63. package/dist/Chat/ChatTokenizedText.js +11 -6
  64. package/dist/Chat/useChatComposerTokens.js +1 -1
  65. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  66. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  67. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  68. package/dist/ClickableCard/ClickableCard.js +3 -3
  69. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  70. package/dist/CodeBlock/CodeBlock.js +15 -4
  71. package/dist/CodeBlock/highlightRanges.js +1 -1
  72. package/dist/CodeBlock/highlightStyles.js +13 -13
  73. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  75. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  76. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +1 -3
  79. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  80. package/dist/ContextMenu/ContextMenu.js +4 -3
  81. package/dist/DateInput/DateInput.d.ts +43 -0
  82. package/dist/DateInput/DateInput.d.ts.map +1 -1
  83. package/dist/DateInput/DateInput.js +22 -2
  84. package/dist/DateInput/NativeDateField.d.ts +10 -0
  85. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  86. package/dist/DateInput/NativeDateField.js +494 -0
  87. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  88. package/dist/DateInput/TouchDateField.js +82 -23
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  92. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  93. package/dist/DateInput/nativeDateSegments.js +111 -0
  94. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  95. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  96. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  97. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  98. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  99. package/dist/DateTimeInput/index.d.ts +1 -1
  100. package/dist/DateTimeInput/index.d.ts.map +1 -1
  101. package/dist/Dialog/Dialog.d.ts +21 -1
  102. package/dist/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/Dialog/Dialog.js +110 -58
  104. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  106. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  108. package/dist/Field/FieldLabel.d.ts.map +1 -1
  109. package/dist/Field/FieldLabel.js +9 -1
  110. package/dist/Field/InputClearButton.d.ts +9 -3
  111. package/dist/Field/InputClearButton.d.ts.map +1 -1
  112. package/dist/Field/InputClearButton.js +14 -3
  113. package/dist/FileInput/FileInput.d.ts.map +1 -1
  114. package/dist/FileInput/FileInput.js +3 -2
  115. package/dist/Heading/Heading.d.ts.map +1 -1
  116. package/dist/Heading/Heading.js +6 -3
  117. package/dist/HoverCard/HoverCard.d.ts +6 -0
  118. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/HoverCard.js +104 -3
  120. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  121. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  122. package/dist/HoverCard/useHoverCard.js +74 -26
  123. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  124. package/dist/Indicator/CheckboxIndicator.js +6 -2
  125. package/dist/Item/Item.d.ts.map +1 -1
  126. package/dist/Item/Item.js +4 -2
  127. package/dist/Kbd/Kbd.d.ts.map +1 -1
  128. package/dist/Kbd/Kbd.js +2 -19
  129. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  130. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  131. package/dist/Layer/LayerDepthContext.js +66 -0
  132. package/dist/Layer/gestureCounter.d.ts +8 -0
  133. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  134. package/dist/Layer/gestureCounter.js +53 -0
  135. package/dist/Layer/index.d.ts +3 -0
  136. package/dist/Layer/index.d.ts.map +1 -1
  137. package/dist/Layer/index.js +4 -0
  138. package/dist/Layer/layerStack.d.ts +98 -0
  139. package/dist/Layer/layerStack.d.ts.map +1 -0
  140. package/dist/Layer/layerStack.js +306 -0
  141. package/dist/Layer/useLayer.d.ts +23 -13
  142. package/dist/Layer/useLayer.d.ts.map +1 -1
  143. package/dist/Layer/useLayer.js +128 -8
  144. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  145. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  146. package/dist/Layer/useLayerDismissal.js +91 -0
  147. package/dist/Lightbox/Lightbox.d.ts +1 -0
  148. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  149. package/dist/Lightbox/Lightbox.js +103 -81
  150. package/dist/List/List.d.ts +1 -1
  151. package/dist/List/List.d.ts.map +1 -1
  152. package/dist/List/List.js +15 -4
  153. package/dist/Markdown/Markdown.d.ts +1 -1
  154. package/dist/Markdown/Markdown.d.ts.map +1 -1
  155. package/dist/Markdown/Markdown.js +20 -7
  156. package/dist/Markdown/index.d.ts +1 -1
  157. package/dist/Markdown/index.d.ts.map +1 -1
  158. package/dist/Markdown/parser.d.ts +38 -1
  159. package/dist/Markdown/parser.d.ts.map +1 -1
  160. package/dist/Markdown/parser.js +182 -32
  161. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  162. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  163. package/dist/MetadataList/MetadataListItem.js +4 -1
  164. package/dist/MobileNav/MobileNav.d.ts +6 -1
  165. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  166. package/dist/MobileNav/MobileNav.js +61 -36
  167. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  168. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  169. package/dist/MultiSelector/MultiSelector.js +73 -15
  170. package/dist/MultiSelector/hooks.d.ts +7 -1
  171. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  172. package/dist/MultiSelector/hooks.js +3 -2
  173. package/dist/MultiSelector/index.d.ts +1 -1
  174. package/dist/MultiSelector/index.d.ts.map +1 -1
  175. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  176. package/dist/NavIcon/NavIcon.js +5 -1
  177. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  178. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  179. package/dist/NavMenu/NavHeadingMenu.js +9 -5
  180. package/dist/NumberInput/NumberInput.d.ts +6 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +54 -104
  183. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  184. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  185. package/dist/NumberInput/numberInputCommit.js +71 -0
  186. package/dist/NumberInput/numberParser.d.ts +64 -0
  187. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  188. package/dist/NumberInput/numberParser.js +350 -0
  189. package/dist/Outline/Outline.d.ts.map +1 -1
  190. package/dist/Outline/Outline.js +3 -2
  191. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  192. package/dist/OverflowList/OverflowList.js +3 -2
  193. package/dist/Overlay/Overlay.d.ts.map +1 -1
  194. package/dist/Overlay/Overlay.js +3 -2
  195. package/dist/Popover/Popover.d.ts.map +1 -1
  196. package/dist/Popover/Popover.js +1 -9
  197. package/dist/Popover/usePopover.d.ts +7 -41
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +40 -21
  200. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +19 -6
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  206. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  207. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  209. package/dist/PowerSearch/types.d.ts +2 -0
  210. package/dist/PowerSearch/types.d.ts.map +1 -1
  211. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  212. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  213. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  214. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  215. package/dist/ProgressBar/ProgressBar.js +18 -5
  216. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  217. package/dist/Resizable/ResizeHandle.js +3 -2
  218. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  219. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  220. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  221. package/dist/SelectableCard/SelectableCard.js +12 -3
  222. package/dist/Selector/Selector.d.ts +18 -1
  223. package/dist/Selector/Selector.d.ts.map +1 -1
  224. package/dist/Selector/Selector.js +91 -18
  225. package/dist/Selector/hooks.d.ts +7 -1
  226. package/dist/Selector/hooks.d.ts.map +1 -1
  227. package/dist/Selector/hooks.js +3 -2
  228. package/dist/SideNav/SideNav.d.ts.map +1 -1
  229. package/dist/SideNav/SideNav.js +4 -3
  230. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavHeading.js +8 -7
  232. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  233. package/dist/SideNav/SideNavItem.js +4 -3
  234. package/dist/Slider/Slider.d.ts.map +1 -1
  235. package/dist/Slider/Slider.js +37 -5
  236. package/dist/Spinner/Spinner.d.ts +3 -3
  237. package/dist/Spinner/Spinner.d.ts.map +1 -1
  238. package/dist/Spinner/Spinner.js +130 -78
  239. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  240. package/dist/StatusDot/StatusDot.js +6 -1
  241. package/dist/Stepper/Step.d.ts +140 -0
  242. package/dist/Stepper/Step.d.ts.map +1 -0
  243. package/dist/Stepper/Step.js +1045 -0
  244. package/dist/Stepper/StepStatus.d.ts +24 -0
  245. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  246. package/dist/Stepper/StepStatus.js +1 -0
  247. package/dist/Stepper/Stepper.d.ts +93 -0
  248. package/dist/Stepper/Stepper.d.ts.map +1 -0
  249. package/dist/Stepper/Stepper.js +184 -0
  250. package/dist/Stepper/StepperContext.d.ts +41 -0
  251. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  252. package/dist/Stepper/StepperContext.js +34 -0
  253. package/dist/Stepper/index.d.ts +8 -0
  254. package/dist/Stepper/index.d.ts.map +1 -0
  255. package/dist/Stepper/index.js +7 -0
  256. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  257. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  258. package/dist/Stepper/stepper.stylex.js +20 -0
  259. package/dist/Switch/Switch.d.ts.map +1 -1
  260. package/dist/Switch/Switch.js +8 -3
  261. package/dist/TabList/Tab.d.ts +15 -2
  262. package/dist/TabList/Tab.d.ts.map +1 -1
  263. package/dist/TabList/Tab.js +32 -7
  264. package/dist/TabList/TabList.d.ts +46 -7
  265. package/dist/TabList/TabList.d.ts.map +1 -1
  266. package/dist/TabList/TabList.js +353 -23
  267. package/dist/TabList/TabListContext.d.ts +11 -1
  268. package/dist/TabList/TabListContext.d.ts.map +1 -1
  269. package/dist/TabList/TabListContext.js +11 -2
  270. package/dist/TabList/TabMenu.d.ts.map +1 -1
  271. package/dist/TabList/TabMenu.js +3 -2
  272. package/dist/TabList/index.d.ts +2 -2
  273. package/dist/TabList/index.d.ts.map +1 -1
  274. package/dist/Table/BaseTable.d.ts.map +1 -1
  275. package/dist/Table/BaseTable.js +10 -2
  276. package/dist/Table/Table.d.ts.map +1 -1
  277. package/dist/Table/Table.js +3 -6
  278. package/dist/Table/TableRow.d.ts +16 -5
  279. package/dist/Table/TableRow.d.ts.map +1 -1
  280. package/dist/Table/TableRow.js +16 -5
  281. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  282. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  283. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  284. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  285. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
  286. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  287. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  288. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  289. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  290. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  291. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  292. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  293. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  294. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  295. package/dist/Table/plugins/selection/useTableSelection.js +43 -5
  296. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  297. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  298. package/dist/Table/types.d.ts +22 -4
  299. package/dist/Table/types.d.ts.map +1 -1
  300. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  301. package/dist/Table/useBaseTablePlugins.js +5 -0
  302. package/dist/Text/Text.d.ts.map +1 -1
  303. package/dist/Text/Text.js +6 -3
  304. package/dist/TextArea/TextArea.d.ts.map +1 -1
  305. package/dist/TextArea/TextArea.js +16 -10
  306. package/dist/TextInput/TextInput.d.ts.map +1 -1
  307. package/dist/TextInput/TextInput.js +3 -2
  308. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  309. package/dist/TimeInput/TimeInput.js +3 -2
  310. package/dist/Timestamp/Timestamp.d.ts +1 -1
  311. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  312. package/dist/Timestamp/Timestamp.js +15 -21
  313. package/dist/Toast/Toast.d.ts.map +1 -1
  314. package/dist/Toast/Toast.js +22 -7
  315. package/dist/Toast/ToastViewport.d.ts +1 -0
  316. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  317. package/dist/Toast/ToastViewport.js +71 -18
  318. package/dist/Token/Token.d.ts +1 -1
  319. package/dist/Token/Token.d.ts.map +1 -1
  320. package/dist/Token/Token.js +20 -9
  321. package/dist/Token/TokenLink.d.ts +1 -1
  322. package/dist/Token/TokenLink.d.ts.map +1 -1
  323. package/dist/Token/TokenLink.js +7 -4
  324. package/dist/Tokenizer/Tokenizer.d.ts +14 -1
  325. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  326. package/dist/Tokenizer/Tokenizer.js +33 -21
  327. package/dist/Tooltip/Tooltip.d.ts +5 -0
  328. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  329. package/dist/Tooltip/useTooltip.d.ts +5 -0
  330. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  331. package/dist/Tooltip/useTooltip.js +39 -24
  332. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  333. package/dist/TopNav/TopNavHeading.js +5 -4
  334. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  335. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  336. package/dist/TopNav/TopNavMegaMenu.js +31 -11
  337. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  338. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  339. package/dist/TopNav/TopNavMenu.js +22 -7
  340. package/dist/TreeList/TreeList.d.ts +1 -1
  341. package/dist/TreeList/TreeList.d.ts.map +1 -1
  342. package/dist/TreeList/TreeList.js +7 -2
  343. package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
  344. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  345. package/dist/Typeahead/BaseTypeahead.js +119 -37
  346. package/dist/Typeahead/Typeahead.d.ts +8 -1
  347. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  348. package/dist/Typeahead/Typeahead.js +5 -2
  349. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  350. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  351. package/dist/Typeahead/TypeaheadItem.js +7 -2
  352. package/dist/astryx.css +113 -11
  353. package/dist/hooks/index.d.ts +1 -0
  354. package/dist/hooks/index.d.ts.map +1 -1
  355. package/dist/hooks/index.js +1 -0
  356. package/dist/hooks/useFocusTrap.d.ts +7 -4
  357. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  358. package/dist/hooks/useFocusTrap.js +60 -95
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -18
  361. package/dist/hooks/useMergedRefs.d.ts +18 -0
  362. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  363. package/dist/hooks/useMergedRefs.js +25 -0
  364. package/dist/index.d.ts +1 -0
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +1 -0
  367. package/dist/theme/Theme.d.ts.map +1 -1
  368. package/dist/theme/Theme.js +46 -10
  369. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  370. package/dist/theme/derivedVarRegistry.js +24 -4
  371. package/dist/theme/generateThemeRules.d.ts +21 -0
  372. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  373. package/dist/theme/generateThemeRules.js +26 -0
  374. package/dist/theme/syntax/tokens.d.ts +1 -1
  375. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  376. package/dist/theme/syntax/tokens.js +5 -2
  377. package/dist/utils/groupItems.d.ts +5 -1
  378. package/dist/utils/groupItems.d.ts.map +1 -1
  379. package/dist/utils/groupItems.js +9 -9
  380. package/dist/utils/index.d.ts +1 -1
  381. package/dist/utils/index.d.ts.map +1 -1
  382. package/dist/utils/isApplePlatform.d.ts +18 -0
  383. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  384. package/dist/utils/isApplePlatform.js +37 -0
  385. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  386. package/dist/utils/sharedResizeObserver.js +10 -1
  387. package/dist/utils/timeParser.d.ts +1 -1
  388. package/dist/utils/timeParser.d.ts.map +1 -1
  389. package/dist/utils/timeParser.js +26 -12
  390. package/locales/af-ZA.json +6 -6
  391. package/locales/ar-SA.json +6 -6
  392. package/locales/ca-ES.json +5 -5
  393. package/locales/cs-CZ.json +6 -6
  394. package/locales/da-DK.json +6 -6
  395. package/locales/de-DE.json +6 -6
  396. package/locales/el-GR.json +6 -6
  397. package/locales/en.json +163 -11
  398. package/locales/es-ES.json +5 -5
  399. package/locales/fi-FI.json +6 -6
  400. package/locales/fr-FR.json +6 -6
  401. package/locales/he-IL.json +6 -6
  402. package/locales/hu-HU.json +6 -6
  403. package/locales/it-IT.json +6 -6
  404. package/locales/ja-JP.json +6 -6
  405. package/locales/ko-KR.json +6 -6
  406. package/locales/nl-NL.json +6 -6
  407. package/locales/no-NO.json +6 -6
  408. package/locales/pl-PL.json +6 -6
  409. package/locales/pseudo.json +114 -0
  410. package/locales/pt-BR.json +6 -6
  411. package/locales/pt-PT.json +6 -6
  412. package/locales/ro-RO.json +6 -6
  413. package/locales/ru-RU.json +6 -6
  414. package/locales/sr-SP.json +6 -6
  415. package/locales/sv-SE.json +6 -6
  416. package/locales/tr-TR.json +6 -6
  417. package/locales/uk-UA.json +6 -6
  418. package/locales/vi-VN.json +6 -6
  419. package/locales/zh-CN.json +6 -6
  420. package/locales/zh-TW.json +6 -6
  421. package/package.json +8 -3
  422. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  423. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  424. package/src/AlertDialog/AlertDialog.tsx +62 -20
  425. package/src/AppShell/AppShell.tsx +3 -2
  426. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  427. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  428. package/src/AspectRatio/AspectRatio.tsx +40 -1
  429. package/src/Avatar/Avatar.doc.mjs +14 -3
  430. package/src/Avatar/Avatar.test.tsx +97 -0
  431. package/src/Avatar/Avatar.tsx +125 -52
  432. package/src/Avatar/index.ts +2 -2
  433. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  434. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  435. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  436. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  437. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  438. package/src/Banner/Banner.doc.mjs +22 -11
  439. package/src/Banner/Banner.test.tsx +177 -25
  440. package/src/Banner/Banner.tsx +93 -27
  441. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  442. package/src/BottomSheet/BottomSheet.tsx +17 -4
  443. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  444. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  445. package/src/Button/Button.doc.mjs +24 -1
  446. package/src/Button/Button.test.tsx +32 -4
  447. package/src/Button/Button.tsx +12 -5
  448. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  449. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  450. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  451. package/src/Calendar/Calendar.doc.mjs +7 -6
  452. package/src/Calendar/Calendar.test.tsx +143 -0
  453. package/src/Calendar/Calendar.tsx +30 -26
  454. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  455. package/src/Calendar/getInitialFocusDate.ts +93 -0
  456. package/src/Calendar/styles.ts +49 -31
  457. package/src/Card/Card.doc.mjs +10 -7
  458. package/src/Card/Card.test.tsx +113 -19
  459. package/src/Card/Card.tsx +67 -89
  460. package/src/Card/index.ts +36 -1
  461. package/src/Carousel/Carousel.tsx +3 -2
  462. package/src/Chat/ChatComposerInput.tsx +5 -1
  463. package/src/Chat/ChatLayout.tsx +3 -2
  464. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  465. package/src/Chat/ChatMessageList.test.tsx +46 -0
  466. package/src/Chat/ChatMessageList.tsx +28 -4
  467. package/src/Chat/ChatTokenizedText.tsx +17 -10
  468. package/src/Chat/useChatComposerTokens.ts +1 -1
  469. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  470. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  471. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  472. package/src/ClickableCard/ClickableCard.tsx +3 -2
  473. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  474. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  475. package/src/CodeBlock/CodeBlock.tsx +20 -4
  476. package/src/CodeBlock/highlightRanges.ts +1 -1
  477. package/src/CodeBlock/highlightStyles.ts +13 -13
  478. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  479. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  480. package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
  481. package/src/ComplexSelector/ComplexSelector.tsx +1 -3
  482. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  483. package/src/ContextMenu/ContextMenu.tsx +4 -3
  484. package/src/DateInput/DateInput.doc.mjs +16 -0
  485. package/src/DateInput/DateInput.tsx +55 -2
  486. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  487. package/src/DateInput/NativeDateField.test.tsx +635 -0
  488. package/src/DateInput/NativeDateField.tsx +641 -0
  489. package/src/DateInput/TouchDateField.tsx +108 -24
  490. package/src/DateInput/index.ts +1 -0
  491. package/src/DateInput/nativeDateSegments.ts +127 -0
  492. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  493. package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
  494. package/src/DateRangeInput/DateRangeInput.tsx +4 -2
  495. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  496. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  497. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  498. package/src/DateTimeInput/index.ts +1 -0
  499. package/src/Dialog/Dialog.doc.mjs +8 -3
  500. package/src/Dialog/Dialog.test.tsx +429 -2
  501. package/src/Dialog/Dialog.tsx +133 -58
  502. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  503. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  504. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  505. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  506. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  507. package/src/Field/Field.doc.mjs +13 -2
  508. package/src/Field/FieldLabel.test.tsx +29 -0
  509. package/src/Field/FieldLabel.tsx +7 -0
  510. package/src/Field/InputClearButton.test.tsx +15 -1
  511. package/src/Field/InputClearButton.tsx +28 -4
  512. package/src/FileInput/FileInput.tsx +3 -2
  513. package/src/Heading/Heading.test.tsx +23 -1
  514. package/src/Heading/Heading.tsx +6 -3
  515. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  516. package/src/HoverCard/HoverCard.test.tsx +154 -4
  517. package/src/HoverCard/HoverCard.tsx +143 -3
  518. package/src/HoverCard/useHoverCard.tsx +104 -33
  519. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  520. package/src/Indicator/Indicator.doc.mjs +2 -0
  521. package/src/Item/Item.tsx +5 -4
  522. package/src/Kbd/Kbd.tsx +2 -19
  523. package/src/Layer/LayerDepthContext.tsx +62 -0
  524. package/src/Layer/gestureCounter.ts +57 -0
  525. package/src/Layer/index.ts +9 -0
  526. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  527. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  528. package/src/Layer/layerStack.ts +362 -0
  529. package/src/Layer/useLayer.test.tsx +324 -15
  530. package/src/Layer/useLayer.tsx +164 -8
  531. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  532. package/src/Layer/useLayerDismissal.ts +173 -0
  533. package/src/Layout/Layout.doc.mjs +2 -2
  534. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  535. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  536. package/src/Lightbox/Lightbox.tsx +124 -102
  537. package/src/Link/Link.doc.mjs +39 -0
  538. package/src/List/List.test.tsx +38 -0
  539. package/src/List/List.tsx +8 -1
  540. package/src/Markdown/Markdown.doc.mjs +5 -0
  541. package/src/Markdown/Markdown.test.tsx +37 -0
  542. package/src/Markdown/Markdown.tsx +16 -5
  543. package/src/Markdown/incremental.test.ts +16 -2
  544. package/src/Markdown/index.ts +1 -0
  545. package/src/Markdown/parser.perf.test.ts +96 -1
  546. package/src/Markdown/parser.test.ts +178 -2
  547. package/src/Markdown/parser.ts +253 -32
  548. package/src/MetadataList/MetadataList.test.tsx +75 -2
  549. package/src/MetadataList/MetadataListItem.tsx +5 -2
  550. package/src/MobileNav/MobileNav.tsx +62 -36
  551. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  552. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  553. package/src/MultiSelector/MultiSelector.test.tsx +311 -0
  554. package/src/MultiSelector/MultiSelector.tsx +151 -15
  555. package/src/MultiSelector/hooks.ts +9 -2
  556. package/src/MultiSelector/index.ts +1 -0
  557. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  558. package/src/NavIcon/NavIcon.test.tsx +9 -0
  559. package/src/NavIcon/NavIcon.tsx +5 -1
  560. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  561. package/src/NavMenu/NavHeadingMenu.tsx +9 -5
  562. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  563. package/src/NumberInput/NumberInput.test.tsx +436 -8
  564. package/src/NumberInput/NumberInput.tsx +62 -114
  565. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  566. package/src/NumberInput/numberInputCommit.ts +103 -0
  567. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  568. package/src/NumberInput/numberParser.test.ts +222 -0
  569. package/src/NumberInput/numberParser.ts +403 -0
  570. package/src/Outline/Outline.tsx +3 -2
  571. package/src/OverflowList/OverflowList.tsx +3 -2
  572. package/src/Overlay/Overlay.tsx +3 -2
  573. package/src/Pagination/Pagination.test.tsx +3 -2
  574. package/src/Popover/Popover.test.tsx +14 -0
  575. package/src/Popover/Popover.tsx +1 -9
  576. package/src/Popover/usePopover.tsx +57 -32
  577. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  578. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  579. package/src/PowerSearch/PowerSearch.tsx +34 -5
  580. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  581. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  582. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  583. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  584. package/src/PowerSearch/types.ts +2 -0
  585. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  586. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  587. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  588. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  589. package/src/ProgressBar/ProgressBar.tsx +28 -8
  590. package/src/Resizable/ResizeHandle.tsx +3 -2
  591. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  592. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  593. package/src/SelectableCard/SelectableCard.tsx +19 -2
  594. package/src/Selector/Selector.doc.mjs +26 -1
  595. package/src/Selector/Selector.test.tsx +346 -1
  596. package/src/Selector/Selector.tsx +148 -21
  597. package/src/Selector/hooks.ts +17 -2
  598. package/src/SideNav/SideNav.doc.mjs +6 -6
  599. package/src/SideNav/SideNav.tsx +4 -2
  600. package/src/SideNav/SideNavHeading.tsx +12 -12
  601. package/src/SideNav/SideNavItem.tsx +4 -2
  602. package/src/Slider/Slider.test.tsx +106 -1
  603. package/src/Slider/Slider.tsx +55 -3
  604. package/src/Spinner/Spinner.test.tsx +147 -1
  605. package/src/Spinner/Spinner.tsx +120 -101
  606. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  607. package/src/StatusDot/StatusDot.test.tsx +9 -0
  608. package/src/StatusDot/StatusDot.tsx +7 -1
  609. package/src/Stepper/Step.doc.mjs +98 -0
  610. package/src/Stepper/Step.tsx +1638 -0
  611. package/src/Stepper/StepStatus.ts +26 -0
  612. package/src/Stepper/Stepper.doc.mjs +370 -0
  613. package/src/Stepper/Stepper.test.tsx +1024 -0
  614. package/src/Stepper/Stepper.tsx +258 -0
  615. package/src/Stepper/StepperContext.ts +71 -0
  616. package/src/Stepper/index.ts +18 -0
  617. package/src/Stepper/stepper.stylex.ts +19 -0
  618. package/src/Switch/Switch.doc.mjs +2 -0
  619. package/src/Switch/Switch.test.tsx +10 -0
  620. package/src/Switch/Switch.tsx +6 -2
  621. package/src/TabList/Tab.doc.mjs +13 -1
  622. package/src/TabList/Tab.tsx +67 -7
  623. package/src/TabList/TabList.doc.mjs +22 -6
  624. package/src/TabList/TabList.test.tsx +559 -0
  625. package/src/TabList/TabList.tsx +490 -22
  626. package/src/TabList/TabListContext.ts +13 -2
  627. package/src/TabList/TabMenu.tsx +3 -2
  628. package/src/TabList/index.ts +6 -2
  629. package/src/Table/BaseTable.tsx +12 -4
  630. package/src/Table/Table.doc.mjs +9 -2
  631. package/src/Table/Table.test.tsx +132 -14
  632. package/src/Table/Table.tsx +3 -8
  633. package/src/Table/TableBody.doc.mjs +40 -0
  634. package/src/Table/TableFooter.doc.mjs +40 -0
  635. package/src/Table/TableHeader.doc.mjs +40 -0
  636. package/src/Table/TableRow.tsx +16 -5
  637. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  638. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  639. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  640. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  641. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
  642. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  643. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  644. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  645. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  646. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  647. package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
  648. package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
  649. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  650. package/src/Table/types.ts +22 -4
  651. package/src/Table/useBaseTablePlugins.ts +5 -0
  652. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  653. package/src/Table/useTablePagination.doc.mjs +7 -0
  654. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  655. package/src/Table/useTableSelection.doc.mjs +31 -0
  656. package/src/Text/Text.test.tsx +67 -1
  657. package/src/Text/Text.tsx +6 -3
  658. package/src/TextArea/TextArea.doc.mjs +12 -2
  659. package/src/TextArea/TextArea.test.tsx +11 -0
  660. package/src/TextArea/TextArea.tsx +37 -24
  661. package/src/TextInput/TextInput.doc.mjs +10 -0
  662. package/src/TextInput/TextInput.tsx +3 -2
  663. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  664. package/src/TimeInput/TimeInput.tsx +2 -2
  665. package/src/Timestamp/Timestamp.test.tsx +58 -0
  666. package/src/Timestamp/Timestamp.tsx +12 -10
  667. package/src/Toast/Toast.doc.mjs +26 -12
  668. package/src/Toast/Toast.tsx +28 -4
  669. package/src/Toast/ToastViewport.test.tsx +536 -8
  670. package/src/Toast/ToastViewport.tsx +81 -12
  671. package/src/Token/Token.test.tsx +95 -0
  672. package/src/Token/Token.tsx +15 -10
  673. package/src/Token/TokenLink.tsx +14 -5
  674. package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
  675. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  676. package/src/Tokenizer/Tokenizer.tsx +53 -24
  677. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  678. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  679. package/src/Tooltip/Tooltip.test.tsx +32 -0
  680. package/src/Tooltip/Tooltip.tsx +5 -0
  681. package/src/Tooltip/useTooltip.tsx +47 -24
  682. package/src/TopNav/TopNavHeading.tsx +5 -4
  683. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  684. package/src/TopNav/TopNavMegaMenu.tsx +47 -5
  685. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  686. package/src/TopNav/TopNavMenu.tsx +38 -7
  687. package/src/TreeList/TreeList.test.tsx +49 -0
  688. package/src/TreeList/TreeList.tsx +7 -2
  689. package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
  690. package/src/Typeahead/BaseTypeahead.tsx +181 -39
  691. package/src/Typeahead/Typeahead.doc.mjs +11 -0
  692. package/src/Typeahead/Typeahead.test.tsx +203 -0
  693. package/src/Typeahead/Typeahead.tsx +12 -2
  694. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  695. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  696. package/src/hooks/index.ts +2 -0
  697. package/src/hooks/useAnnounce.doc.mjs +96 -0
  698. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  699. package/src/hooks/useDevWarning.doc.mjs +96 -0
  700. package/src/hooks/useFocusTrap.test.tsx +14 -0
  701. package/src/hooks/useFocusTrap.ts +62 -111
  702. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  703. package/src/hooks/useHotkeys.ts +3 -18
  704. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  705. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  706. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  707. package/src/hooks/useLongPress.doc.mjs +123 -0
  708. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  709. package/src/hooks/useMergedRefs.test.tsx +62 -0
  710. package/src/hooks/useMergedRefs.ts +36 -0
  711. package/src/hooks/useTypeahead.doc.mjs +153 -0
  712. package/src/index.ts +1 -0
  713. package/src/raw-import.d.ts +14 -0
  714. package/src/theme/MediaTheme.doc.mjs +5 -5
  715. package/src/theme/Theme.test.tsx +104 -2
  716. package/src/theme/Theme.tsx +49 -14
  717. package/src/theme/defineTheme.test.ts +23 -0
  718. package/src/theme/derivedVarRegistry.test.ts +26 -3
  719. package/src/theme/derivedVarRegistry.ts +23 -4
  720. package/src/theme/generateThemeRules.test.ts +99 -1
  721. package/src/theme/generateThemeRules.ts +28 -0
  722. package/src/theme/syntax/tokens.ts +5 -2
  723. package/src/utils/groupItems.ts +12 -6
  724. package/src/utils/index.ts +1 -1
  725. package/src/utils/isApplePlatform.test.ts +61 -0
  726. package/src/utils/isApplePlatform.ts +37 -0
  727. package/src/utils/sharedResizeObserver.ts +10 -2
  728. package/src/utils/timeParser.test.ts +6 -1
  729. package/src/utils/timeParser.ts +35 -13
  730. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -0,0 +1,635 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file NativeDateField.test.tsx
5
+ * @input Uses vitest, @testing-library/react, DateInput
6
+ * @output Unit tests for the OS-picker surface (`nativePicker`)
7
+ * @position Testing; validates NativeDateField.tsx
8
+ *
9
+ * Every test renders through `DateInput` with a pointer stubbed, so the
10
+ * surface selection in DateInput.tsx is exercised too. `nativePicker`
11
+ * defaults to `'touch'`, so a coarse pointer alone gets the native control.
12
+ *
13
+ * The iOS behaviours these pin — the picker detaching from the field on a
14
+ * programmatic write, React's synthetic change not firing for the picker's
15
+ * edits, `text-overflow` being inert on a flex box — were all measured on a
16
+ * real device and none reproduce in jsdom. Where a test asserts a CSS rule
17
+ * rather than a behaviour, that is why.
18
+ *
19
+ * SYNC: When NativeDateField.tsx changes, update tests to match new behavior
20
+ */
21
+
22
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
23
+ import {render, screen, fireEvent} from '@testing-library/react';
24
+ import {DateInput} from './DateInput';
25
+ import type * as NativeDateSegments from './nativeDateSegments';
26
+ import {
27
+ hasEditableDateSegments,
28
+ resetDateSegmentProbe,
29
+ } from './nativeDateSegments';
30
+ import {InternationalizationProvider} from '../i18n';
31
+
32
+ /**
33
+ * Lets a test say which kind of `<input type="date">` the engine draws.
34
+ * `null` (the default) runs the real probe, so every other test in this file
35
+ * exercises the shipping path: jsdom lays nothing out, so the probe reports
36
+ * `'unknown'` and the coarse pointer resolves it to picker-only.
37
+ */
38
+ const {segmentState} = vi.hoisted(() => ({
39
+ segmentState: {editable: null as boolean | null},
40
+ }));
41
+
42
+ vi.mock('./nativeDateSegments', async importOriginal => {
43
+ const actual = await importOriginal<typeof NativeDateSegments>();
44
+ return {
45
+ ...actual,
46
+ hasEditableDateSegments: (isTouchPointer: boolean) =>
47
+ segmentState.editable ?? actual.hasEditableDateSegments(isTouchPointer),
48
+ };
49
+ });
50
+
51
+ const HOVER_CAPABLE = /\(\s*hover\s*:\s*hover\s*\)/;
52
+
53
+ /**
54
+ * Astryx's touch picker mounts a month scroller that observes its own size;
55
+ * jsdom ships no ResizeObserver. Only the `nativePicker="never"` test reaches
56
+ * it, but stubbing it for the file keeps that test honest about which surface
57
+ * it got.
58
+ */
59
+ class MockResizeObserver {
60
+ observe() {}
61
+ unobserve() {}
62
+ disconnect() {}
63
+ }
64
+
65
+ /** Point `(pointer: coarse)` at a touch or mouse device. */
66
+ function stubPointer(isCoarse: boolean): void {
67
+ vi.stubGlobal('matchMedia', (query: string) => ({
68
+ matches: /pointer:\s*coarse/.test(query)
69
+ ? isCoarse
70
+ : /pointer:\s*fine/.test(query)
71
+ ? !isCoarse
72
+ : HOVER_CAPABLE.test(query),
73
+ media: query,
74
+ onchange: null,
75
+ addListener: () => {},
76
+ removeListener: () => {},
77
+ addEventListener: () => {},
78
+ removeEventListener: () => {},
79
+ dispatchEvent: () => false,
80
+ }));
81
+ }
82
+
83
+ function getInput(): HTMLInputElement {
84
+ const input = document.querySelector('input');
85
+ if (!input) {
86
+ throw new Error('DateInput rendered no input element');
87
+ }
88
+ return input;
89
+ }
90
+
91
+ /** The CSS rules that apply to an element, for the paint-level assertions. */
92
+ function rulesFor(el: Element): string {
93
+ const classes = new Set(el.className.split(/\s+/).filter(Boolean));
94
+ return Array.from(document.styleSheets)
95
+ .flatMap(sheet => {
96
+ try {
97
+ return Array.from(sheet.cssRules);
98
+ } catch {
99
+ return [];
100
+ }
101
+ })
102
+ .map(rule => rule.cssText)
103
+ .filter(text => [...classes].some(cls => text.includes(`.${cls}`)))
104
+ .join(' ');
105
+ }
106
+
107
+ beforeEach(() => {
108
+ vi.stubGlobal('ResizeObserver', MockResizeObserver);
109
+ });
110
+
111
+ afterEach(() => {
112
+ vi.unstubAllGlobals();
113
+ vi.restoreAllMocks();
114
+ segmentState.editable = null;
115
+ resetDateSegmentProbe();
116
+ });
117
+
118
+ describe('DateInput nativePicker', () => {
119
+ // ===========================================================================
120
+ // Which surface renders
121
+ // ===========================================================================
122
+
123
+ it('renders the native control on touch by default', () => {
124
+ stubPointer(true);
125
+ render(<DateInput label="Date" onChange={() => {}} />);
126
+
127
+ expect(getInput()).toHaveAttribute('type', 'date');
128
+ });
129
+
130
+ it('keeps the calendar popover on a mouse-driven device', () => {
131
+ stubPointer(false);
132
+ render(<DateInput label="Date" onChange={() => {}} />);
133
+
134
+ const input = getInput();
135
+ expect(input).toHaveAttribute('type', 'text');
136
+ expect(input).toHaveAttribute('role', 'combobox');
137
+ });
138
+
139
+ it('falls back to Astryx\u2019s touch picker when told never', () => {
140
+ stubPointer(true);
141
+ render(<DateInput label="Date" nativePicker="never" onChange={() => {}} />);
142
+
143
+ const input = getInput();
144
+ expect(input).toHaveAttribute('type', 'text');
145
+ expect(input).toHaveAttribute('role', 'combobox');
146
+ });
147
+
148
+ it('uses the native control on a mouse device when told always', () => {
149
+ stubPointer(false);
150
+ render(
151
+ <DateInput label="Date" nativePicker="always" onChange={() => {}} />,
152
+ );
153
+
154
+ expect(getInput()).toHaveAttribute('type', 'date');
155
+ });
156
+
157
+ it('drops the popup ARIA the other surfaces carry', () => {
158
+ // There is no in-page popup to describe: the OS draws the picker.
159
+ stubPointer(true);
160
+ render(<DateInput label="Date" onChange={() => {}} />);
161
+
162
+ const input = getInput();
163
+ expect(input).not.toHaveAttribute('role', 'combobox');
164
+ expect(input).not.toHaveAttribute('aria-expanded');
165
+ expect(input).not.toHaveAttribute('aria-haspopup');
166
+ });
167
+
168
+ // ===========================================================================
169
+ // Value round-trip
170
+ // ===========================================================================
171
+
172
+ it('keeps the control\u2019s own value ISO', () => {
173
+ stubPointer(true);
174
+ render(
175
+ <DateInput
176
+ label="Date"
177
+ value="2026-01-25"
178
+ format="date_long"
179
+ onChange={() => {}}
180
+ />,
181
+ );
182
+
183
+ // ISO is the only form the control accepts, and what the picker reads and
184
+ // writes; `format` rides on the overlay instead.
185
+ expect(getInput()).toHaveValue('2026-01-25');
186
+ expect(screen.getByText('January 25, 2026')).toBeInTheDocument();
187
+ });
188
+
189
+ it('fires onChange with the ISO date the control reports', () => {
190
+ stubPointer(true);
191
+ const onChange = vi.fn();
192
+ render(<DateInput label="Date" onChange={onChange} />);
193
+
194
+ fireEvent.change(getInput(), {target: {value: '2026-03-21'}});
195
+
196
+ expect(onChange).toHaveBeenCalledExactlyOnceWith('2026-03-21');
197
+ });
198
+
199
+ it('fires onChange with undefined when the control is emptied', () => {
200
+ stubPointer(true);
201
+ const onChange = vi.fn();
202
+ render(<DateInput label="Date" value="2026-03-21" onChange={onChange} />);
203
+
204
+ fireEvent.change(getInput(), {target: {value: ''}});
205
+
206
+ expect(onChange).toHaveBeenCalledWith(undefined);
207
+ });
208
+
209
+ it('commits an edit React\u2019s synthetic change does not see', () => {
210
+ // The iOS failure, reproduced: the picker edits the field and a native
211
+ // `input` event fires, but React's synthetic `onChange` never runs — so
212
+ // React re-renders and writes its stale value back over the picker's.
213
+ // Assigning `.value` first updates React's internal value tracker, which
214
+ // is what makes React skip the synthetic event; the native listener still
215
+ // sees the real one.
216
+ stubPointer(true);
217
+ const onChange = vi.fn();
218
+ render(<DateInput label="Date" value="2026-03-21" onChange={onChange} />);
219
+
220
+ const input = getInput();
221
+ input.value = '2026-03-09';
222
+ input.dispatchEvent(new Event('input', {bubbles: true}));
223
+
224
+ expect(onChange).toHaveBeenCalledExactlyOnceWith('2026-03-09');
225
+ });
226
+
227
+ it('fires one change when both commit paths see the same edit', () => {
228
+ stubPointer(true);
229
+ const onChange = vi.fn();
230
+ render(<DateInput label="Date" value="2026-03-21" onChange={onChange} />);
231
+
232
+ fireEvent.change(getInput(), {target: {value: '2026-03-09'}});
233
+
234
+ expect(onChange).toHaveBeenCalledExactlyOnceWith('2026-03-09');
235
+ });
236
+
237
+ it('does not write to the control while it has focus', () => {
238
+ // The iOS bug this guards: while the picker sheet is open, ANY
239
+ // programmatic write to the field detaches the sheet from it, and the
240
+ // user's pick silently stops reaching the input.
241
+ stubPointer(true);
242
+ const {rerender} = render(
243
+ <DateInput label="Date" value="2026-03-21" onChange={() => {}} />,
244
+ );
245
+ const input = getInput();
246
+
247
+ fireEvent.focus(input);
248
+ rerender(<DateInput label="Date" value="2026-12-25" onChange={() => {}} />);
249
+
250
+ expect(input).toHaveValue('2026-03-21');
251
+ });
252
+
253
+ it('applies an external value once the control loses focus', () => {
254
+ stubPointer(true);
255
+ const {rerender} = render(
256
+ <DateInput label="Date" value="2026-03-21" onChange={() => {}} />,
257
+ );
258
+ const input = getInput();
259
+
260
+ fireEvent.focus(input);
261
+ rerender(<DateInput label="Date" value="2026-12-25" onChange={() => {}} />);
262
+ fireEvent.blur(input);
263
+
264
+ expect(input).toHaveValue('2026-12-25');
265
+ });
266
+
267
+ // ===========================================================================
268
+ // Constraints
269
+ // ===========================================================================
270
+
271
+ it('forwards min and max to the native control', () => {
272
+ stubPointer(true);
273
+ render(
274
+ <DateInput
275
+ label="Date"
276
+ min="2026-01-01"
277
+ max="2026-12-31"
278
+ onChange={() => {}}
279
+ />,
280
+ );
281
+
282
+ const input = getInput();
283
+ expect(input).toHaveAttribute('min', '2026-01-01');
284
+ expect(input).toHaveAttribute('max', '2026-12-31');
285
+ });
286
+
287
+ it('refuses an out-of-range date and announces it', () => {
288
+ // iOS does not enforce min/max in its picker — it lets the user land on
289
+ // any date — so the refusal has to happen here.
290
+ stubPointer(true);
291
+ const onChange = vi.fn();
292
+ render(
293
+ <DateInput
294
+ label="Date"
295
+ min="2026-03-10"
296
+ max="2026-03-20"
297
+ value="2026-03-15"
298
+ onChange={onChange}
299
+ />,
300
+ );
301
+
302
+ fireEvent.change(getInput(), {target: {value: '2026-03-25'}});
303
+
304
+ expect(onChange).not.toHaveBeenCalled();
305
+ expect(screen.getByRole('alert')).toHaveTextContent('Invalid date');
306
+ expect(getInput()).toHaveAttribute('aria-invalid', 'true');
307
+ });
308
+
309
+ it('refuses a date dateConstraints rejects', () => {
310
+ stubPointer(true);
311
+ const onChange = vi.fn();
312
+ render(
313
+ <DateInput
314
+ label="Date"
315
+ // 2026-03-22 is a Sunday.
316
+ dateConstraints={[date => date.getDay() !== 0]}
317
+ value="2026-03-23"
318
+ onChange={onChange}
319
+ />,
320
+ );
321
+
322
+ fireEvent.change(getInput(), {target: {value: '2026-03-22'}});
323
+
324
+ expect(onChange).not.toHaveBeenCalled();
325
+ expect(screen.getByRole('alert')).toHaveTextContent('Invalid date');
326
+ });
327
+
328
+ it('drops the rejection once the field reverts', () => {
329
+ // The refused date is reverted the moment focus leaves, so the field is
330
+ // showing a valid date again. Marking that date invalid would be a lie
331
+ // about data the user never chose.
332
+ stubPointer(true);
333
+ render(
334
+ <DateInput
335
+ label="Date"
336
+ dateConstraints={[date => date.getDay() !== 0]}
337
+ value="2026-03-23"
338
+ onChange={() => {}}
339
+ />,
340
+ );
341
+
342
+ const input = getInput();
343
+ fireEvent.focus(input);
344
+ fireEvent.change(input, {target: {value: '2026-03-22'}});
345
+ expect(input).toHaveAttribute('aria-invalid', 'true');
346
+
347
+ fireEvent.blur(input);
348
+
349
+ expect(input).toHaveValue('2026-03-23');
350
+ expect(input).not.toHaveAttribute('aria-invalid');
351
+ expect(screen.getByRole('alert')).toHaveTextContent('');
352
+ });
353
+
354
+ // ===========================================================================
355
+ // The text overlay: format, placeholder, paint
356
+ // ===========================================================================
357
+
358
+ it('honours every named format', () => {
359
+ stubPointer(true);
360
+ const {rerender} = render(
361
+ <DateInput
362
+ label="Date"
363
+ value="2026-01-25"
364
+ format="date"
365
+ onChange={() => {}}
366
+ />,
367
+ );
368
+ expect(screen.getByText('Jan 25, 2026')).toBeInTheDocument();
369
+
370
+ rerender(
371
+ <DateInput
372
+ label="Date"
373
+ value="2026-01-25"
374
+ format="date_weekday"
375
+ onChange={() => {}}
376
+ />,
377
+ );
378
+ expect(screen.getByText('Sun, Jan 25, 2026')).toBeInTheDocument();
379
+ });
380
+
381
+ it('honours a function format', () => {
382
+ stubPointer(true);
383
+ render(
384
+ <DateInput
385
+ label="Date"
386
+ value="2026-01-25"
387
+ format={iso => `ships ${iso}`}
388
+ onChange={() => {}}
389
+ />,
390
+ );
391
+
392
+ expect(screen.getByText('ships 2026-01-25')).toBeInTheDocument();
393
+ });
394
+
395
+ it('formats in the provider locale', () => {
396
+ stubPointer(true);
397
+ render(
398
+ <InternationalizationProvider locale="de-DE">
399
+ <DateInput label="Date" value="2026-03-21" onChange={() => {}} />
400
+ </InternationalizationProvider>,
401
+ );
402
+
403
+ expect(screen.getByText('21. März 2026')).toBeInTheDocument();
404
+ expect(getInput()).toHaveValue('2026-03-21');
405
+ });
406
+
407
+ it('keeps painting the value while the picker is open', () => {
408
+ // The OS picker has no segments to reveal, so `format` holds throughout.
409
+ stubPointer(true);
410
+ render(<DateInput label="Date" value="2026-01-25" onChange={() => {}} />);
411
+
412
+ fireEvent.focus(getInput());
413
+
414
+ expect(screen.getByText('January 25, 2026')).toBeInTheDocument();
415
+ });
416
+
417
+ it('shows the placeholder when empty, and drops it when filled', () => {
418
+ stubPointer(true);
419
+ const {rerender} = render(<DateInput label="Date" onChange={() => {}} />);
420
+ expect(screen.getByText('Select a date')).toBeInTheDocument();
421
+
422
+ rerender(<DateInput label="Date" value="2026-01-25" onChange={() => {}} />);
423
+
424
+ expect(screen.queryByText('Select a date')).toBeNull();
425
+ });
426
+
427
+ it('keeps the overlay out of the accessibility tree', () => {
428
+ // The input still holds the value and carries the label, so announcing
429
+ // the overlay too would double-speak.
430
+ stubPointer(true);
431
+ render(<DateInput label="Date" value="2026-01-25" onChange={() => {}} />);
432
+
433
+ expect(screen.getByText('January 25, 2026')).toHaveAttribute(
434
+ 'aria-hidden',
435
+ 'true',
436
+ );
437
+ });
438
+
439
+ it('hides the engine\u2019s own text under the overlay', () => {
440
+ stubPointer(true);
441
+ render(<DateInput label="Date" value="2026-01-25" onChange={() => {}} />);
442
+
443
+ const rules = rulesFor(getInput());
444
+ // One transparent colour covers Chromium's `::-webkit-datetime-edit` and
445
+ // Firefox's plain text; `-webkit-text-fill-color` is what wins in WebKit.
446
+ expect(rules).toContain('color: transparent');
447
+ expect(rules).toContain('-webkit-text-fill-color: transparent');
448
+ });
449
+
450
+ it('bounds the overlay so a long date cannot paint past it', () => {
451
+ stubPointer(true);
452
+ render(
453
+ <DateInput
454
+ label="Date"
455
+ value="2026-09-30"
456
+ hasClear
457
+ onChange={() => {}}
458
+ />,
459
+ );
460
+
461
+ const rules = rulesFor(screen.getByText('September 30, 2026'));
462
+ // Without the end inset the overlay is shrink-to-fit and a long date runs
463
+ // over the clear button — measured 24px across it on an iPhone.
464
+ expect(rules).toContain('inset-inline-end: 0');
465
+ // `text-overflow` only applies to a BLOCK container: on a flex one a
466
+ // too-long date hard-clips mid-glyph instead (measured identical to
467
+ // `text-overflow: clip` in WebKit and Chromium). Centring then comes from
468
+ // the line box, so the overlay must carry the input's own leading.
469
+ expect(rules).toContain('display: block');
470
+ expect(rules).toContain('text-overflow: ellipsis');
471
+ expect(rules).toContain('line-height: var(--text-body-leading)');
472
+ });
473
+
474
+ // ===========================================================================
475
+ // Toggle, clear, disabled
476
+ // ===========================================================================
477
+
478
+ it('asks the browser for its picker from the toggle button', () => {
479
+ stubPointer(true);
480
+ render(<DateInput label="Date" onChange={() => {}} />);
481
+
482
+ const input = getInput();
483
+ const showPicker = vi.fn();
484
+ // jsdom implements no picker; attach one so the call is observable.
485
+ (input as HTMLInputElement & {showPicker: () => void}).showPicker =
486
+ showPicker;
487
+
488
+ fireEvent.click(screen.getByLabelText('Open calendar'));
489
+
490
+ expect(showPicker).toHaveBeenCalledTimes(1);
491
+ expect(input).toHaveFocus();
492
+ });
493
+
494
+ it('survives a browser that refuses showPicker', () => {
495
+ // Chrome throws NotAllowedError without transient user activation, and
496
+ // iOS implements no showPicker for type=date at all. Focus is the
497
+ // fallback, and on iOS it is the whole mechanism.
498
+ stubPointer(true);
499
+ render(<DateInput label="Date" onChange={() => {}} />);
500
+
501
+ const input = getInput();
502
+ (input as HTMLInputElement & {showPicker: () => void}).showPicker = () => {
503
+ throw new DOMException('not allowed', 'NotAllowedError');
504
+ };
505
+
506
+ expect(() =>
507
+ fireEvent.click(screen.getByLabelText('Open calendar')),
508
+ ).not.toThrow();
509
+ expect(input).toHaveFocus();
510
+ });
511
+
512
+ it('clears the value without taking focus back', () => {
513
+ // Focusing a date control is what raises the OS picker, so reclaiming
514
+ // focus would pop the wheel the clear tap just dismissed.
515
+ stubPointer(true);
516
+ const onChange = vi.fn();
517
+ render(
518
+ <DateInput
519
+ label="Date"
520
+ value="2026-03-21"
521
+ hasClear
522
+ onChange={onChange}
523
+ />,
524
+ );
525
+
526
+ fireEvent.click(screen.getByLabelText('Clear Date'));
527
+
528
+ expect(onChange).toHaveBeenCalledWith(undefined);
529
+ expect(getInput()).not.toHaveFocus();
530
+ });
531
+
532
+ it('disables the control and its toggle when isDisabled', () => {
533
+ stubPointer(true);
534
+ render(<DateInput label="Date" isDisabled onChange={() => {}} />);
535
+
536
+ expect(getInput()).toBeDisabled();
537
+ expect(screen.getByLabelText('Open calendar')).toBeDisabled();
538
+ });
539
+
540
+ it('ignores a change while disabled', () => {
541
+ stubPointer(true);
542
+ const onChange = vi.fn();
543
+ render(
544
+ <DateInput
545
+ label="Date"
546
+ isDisabled
547
+ disabledMessage="Ask an editor"
548
+ onChange={onChange}
549
+ />,
550
+ );
551
+
552
+ // With a disabledMessage the field stays focusable via aria-disabled, so
553
+ // the mutation guard is what has to hold.
554
+ fireEvent.change(getInput(), {target: {value: '2026-03-21'}});
555
+
556
+ expect(onChange).not.toHaveBeenCalled();
557
+ });
558
+
559
+ it('keeps the field labelled, required-marked, and ref-forwarded', () => {
560
+ stubPointer(true);
561
+ const ref = vi.fn();
562
+ render(
563
+ <DateInput ref={ref} label="Event date" isRequired onChange={() => {}} />,
564
+ );
565
+
566
+ const input = screen.getByLabelText(/Event date/);
567
+ expect(input).toHaveAttribute('type', 'date');
568
+ expect(input).toHaveAttribute('aria-required', 'true');
569
+ expect(ref).toHaveBeenCalledWith(expect.any(HTMLInputElement));
570
+ });
571
+
572
+ // ===========================================================================
573
+ // Engines that draw editable segments
574
+ //
575
+ // Chrome's touch simulator, a Windows tablet and a ChromeOS convertible all
576
+ // render `<input type="date">` as typable fields while reporting a coarse
577
+ // pointer. See ./nativeDateSegments.
578
+ // ===========================================================================
579
+
580
+ it('reveals the engine’s own segments while an editable control has focus', () => {
581
+ // Measured in Chrome: with the overlay up, typing paints nothing but a
582
+ // selection highlight drifting across the placeholder.
583
+ segmentState.editable = true;
584
+ stubPointer(true);
585
+ render(<DateInput label="Date" value="2026-01-25" onChange={() => {}} />);
586
+
587
+ expect(screen.getByText('January 25, 2026')).toBeInTheDocument();
588
+
589
+ fireEvent.focus(getInput());
590
+
591
+ expect(screen.queryByText('January 25, 2026')).toBeNull();
592
+ // `-webkit-text-fill-color` is what wins inside a date control, and
593
+ // unlike a bare `color:` cannot be confused with the wrapper's
594
+ // `background-color: transparent`.
595
+ expect(rulesFor(getInput())).not.toContain(
596
+ '-webkit-text-fill-color: transparent',
597
+ );
598
+ });
599
+
600
+ it('paints the formatted date again once the segments lose focus', () => {
601
+ segmentState.editable = true;
602
+ stubPointer(true);
603
+ render(<DateInput label="Date" value="2026-01-25" onChange={() => {}} />);
604
+
605
+ fireEvent.focus(getInput());
606
+ fireEvent.blur(getInput());
607
+
608
+ expect(screen.getByText('January 25, 2026')).toBeInTheDocument();
609
+ expect(rulesFor(getInput())).toContain(
610
+ '-webkit-text-fill-color: transparent',
611
+ );
612
+ });
613
+
614
+ it('stands aside for the engine’s placeholder while empty and focused', () => {
615
+ // `mm/dd/yyyy` says which order to type in, which ours cannot.
616
+ segmentState.editable = true;
617
+ stubPointer(true);
618
+ render(<DateInput label="Date" onChange={() => {}} />);
619
+
620
+ expect(screen.getByText('Select a date')).toBeInTheDocument();
621
+
622
+ fireEvent.focus(getInput());
623
+
624
+ expect(screen.queryByText('Select a date')).toBeNull();
625
+ });
626
+
627
+ it('resolves an unprobeable engine with the pointer', () => {
628
+ // jsdom lays nothing out, so neither pseudo can be measured — the same
629
+ // answer Firefox gives, which exposes neither.
630
+ resetDateSegmentProbe();
631
+
632
+ expect(hasEditableDateSegments(true)).toBe(false);
633
+ expect(hasEditableDateSegments(false)).toBe(true);
634
+ });
635
+ });