@astryxdesign/core 0.5.0 → 0.5.1-canary.046f6ea

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 (622) hide show
  1. package/CHANGELOG.md +222 -0
  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/AspectRatio/AspectRatio.d.ts +6 -6
  6. package/dist/Avatar/Avatar.d.ts +25 -1
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +43 -9
  9. package/dist/Avatar/index.d.ts +2 -2
  10. package/dist/Avatar/index.d.ts.map +1 -1
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +5 -2
  15. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  16. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  17. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroupOverflow.js +11 -7
  19. package/dist/Badge/Badge.d.ts.map +1 -1
  20. package/dist/Badge/Badge.js +26 -2
  21. package/dist/Banner/Banner.d.ts +10 -1
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +11 -2
  24. package/dist/Button/Button.d.ts.map +1 -1
  25. package/dist/Button/Button.js +8 -7
  26. package/dist/Calendar/Calendar.d.ts +4 -2
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +15 -21
  29. package/dist/Calendar/hooks/useCalendarDays.js +4 -6
  30. package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
  31. package/dist/Calendar/styles.d.ts +5 -20
  32. package/dist/Calendar/styles.d.ts.map +1 -1
  33. package/dist/Calendar/styles.js +15 -17
  34. package/dist/Card/Card.d.ts +12 -12
  35. package/dist/Card/Card.d.ts.map +1 -1
  36. package/dist/Card/Card.js +17 -9
  37. package/dist/Card/index.d.ts +35 -1
  38. package/dist/Card/index.d.ts.map +1 -1
  39. package/dist/Card/index.js +21 -1
  40. package/dist/Carousel/Carousel.d.ts.map +1 -1
  41. package/dist/Carousel/Carousel.js +108 -7
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +7 -1
  44. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  45. package/dist/CodeBlock/CodeBlock.js +15 -4
  46. package/dist/CodeBlock/highlightRanges.js +1 -1
  47. package/dist/CodeBlock/highlightStyles.js +13 -13
  48. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  49. package/dist/CommandPalette/CommandPaletteItem.js +2 -7
  50. package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +14 -7
  53. package/dist/DateInput/DateInput.d.ts +43 -0
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +22 -5
  56. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  57. package/dist/DateInput/MonthScroller.js +5 -3
  58. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  59. package/dist/DateInput/MonthYearWheels.js +6 -4
  60. package/dist/DateInput/NativeDateField.d.ts +10 -0
  61. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  62. package/dist/DateInput/NativeDateField.js +494 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +52 -25
  65. package/dist/DateInput/Wheel.d.ts.map +1 -1
  66. package/dist/DateInput/Wheel.js +1 -0
  67. package/dist/DateInput/index.d.ts +1 -1
  68. package/dist/DateInput/index.d.ts.map +1 -1
  69. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  70. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  71. package/dist/DateInput/nativeDateSegments.js +111 -0
  72. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  73. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  74. package/dist/DateRangeInput/DateRangeInput.js +3 -5
  75. package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
  76. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  77. package/dist/DateTimeInput/DateTimeInput.js +35 -10
  78. package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
  79. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
  80. package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
  81. package/dist/Dialog/Dialog.d.ts +16 -2
  82. package/dist/Dialog/Dialog.d.ts.map +1 -1
  83. package/dist/Dialog/Dialog.js +28 -7
  84. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  86. package/dist/Field/FieldLabel.d.ts.map +1 -1
  87. package/dist/Field/FieldLabel.js +9 -1
  88. package/dist/Field/InputClearButton.d.ts +9 -3
  89. package/dist/Field/InputClearButton.d.ts.map +1 -1
  90. package/dist/Field/InputClearButton.js +14 -3
  91. package/dist/Heading/Heading.d.ts.map +1 -1
  92. package/dist/Heading/Heading.js +0 -1
  93. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/HoverCard.js +104 -3
  95. package/dist/HoverCard/useHoverCard.d.ts +14 -2
  96. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  97. package/dist/HoverCard/useHoverCard.js +7 -1
  98. package/dist/Icon/Icon.d.ts +4 -2
  99. package/dist/Icon/Icon.d.ts.map +1 -1
  100. package/dist/Icon/defaultIcons.d.ts +3 -2
  101. package/dist/Icon/defaultIcons.d.ts.map +1 -1
  102. package/dist/Icon/defaultIcons.js +7 -0
  103. package/dist/Icon/globalIconRegistry.d.ts +13 -0
  104. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  105. package/dist/Icon/globalIconRegistry.js +34 -6
  106. package/dist/Icon/index.d.ts +1 -1
  107. package/dist/Icon/index.d.ts.map +1 -1
  108. package/dist/Icon/useIcon.d.ts +5 -2
  109. package/dist/Icon/useIcon.d.ts.map +1 -1
  110. package/dist/Icon/useIcon.js +3 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  112. package/dist/Indicator/CheckboxIndicator.js +6 -2
  113. package/dist/Item/Item.d.ts.map +1 -1
  114. package/dist/Item/Item.js +2 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -26
  117. package/dist/Layer/gestureCounter.d.ts +8 -0
  118. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  119. package/dist/Layer/gestureCounter.js +53 -0
  120. package/dist/Layer/useLayer.d.ts +23 -13
  121. package/dist/Layer/useLayer.d.ts.map +1 -1
  122. package/dist/Layer/useLayer.js +146 -24
  123. package/dist/List/List.d.ts +1 -1
  124. package/dist/List/List.d.ts.map +1 -1
  125. package/dist/List/List.js +15 -4
  126. package/dist/Markdown/Markdown.d.ts +1 -1
  127. package/dist/Markdown/Markdown.d.ts.map +1 -1
  128. package/dist/Markdown/Markdown.js +20 -7
  129. package/dist/Markdown/parser.d.ts.map +1 -1
  130. package/dist/Markdown/parser.js +5 -3
  131. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  132. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  133. package/dist/MetadataList/MetadataListItem.js +4 -1
  134. package/dist/MultiSelector/MultiSelector.d.ts +18 -1
  135. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  136. package/dist/MultiSelector/MultiSelector.js +58 -11
  137. package/dist/MultiSelector/hooks.d.ts +7 -1
  138. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  139. package/dist/MultiSelector/hooks.js +3 -2
  140. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  141. package/dist/NavIcon/NavIcon.js +5 -1
  142. package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
  143. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  144. package/dist/NavItem/navItemStyles.stylex.js +0 -2
  145. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  146. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  147. package/dist/NavMenu/NavHeadingMenu.js +7 -4
  148. package/dist/NumberInput/NumberInput.d.ts +6 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +95 -126
  151. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  152. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  153. package/dist/NumberInput/numberInputCommit.js +71 -0
  154. package/dist/NumberInput/numberParser.d.ts +64 -0
  155. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  156. package/dist/NumberInput/numberParser.js +350 -0
  157. package/dist/Outline/Outline.d.ts.map +1 -1
  158. package/dist/Outline/Outline.js +2 -3
  159. package/dist/OverflowList/OverflowList.d.ts +41 -1
  160. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  161. package/dist/OverflowList/OverflowList.js +43 -2
  162. package/dist/Popover/Popover.d.ts.map +1 -1
  163. package/dist/Popover/Popover.js +8 -14
  164. package/dist/Popover/usePopover.d.ts +15 -41
  165. package/dist/Popover/usePopover.d.ts.map +1 -1
  166. package/dist/Popover/usePopover.js +26 -7
  167. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
  169. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  170. package/dist/PowerSearch/formatFilterValue.js +4 -2
  171. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  172. package/dist/ProgressBar/ProgressBar.js +18 -5
  173. package/dist/Resizable/useResizable.d.ts +19 -1
  174. package/dist/Resizable/useResizable.d.ts.map +1 -1
  175. package/dist/Resizable/useResizable.js +104 -38
  176. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.js +9 -0
  178. package/dist/Selector/Selector.d.ts +18 -1
  179. package/dist/Selector/Selector.d.ts.map +1 -1
  180. package/dist/Selector/Selector.js +92 -21
  181. package/dist/Selector/hooks.d.ts +7 -1
  182. package/dist/Selector/hooks.d.ts.map +1 -1
  183. package/dist/Selector/hooks.js +3 -2
  184. package/dist/SideNav/SideNav.d.ts +6 -1
  185. package/dist/SideNav/SideNav.d.ts.map +1 -1
  186. package/dist/SideNav/SideNav.js +57 -27
  187. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  188. package/dist/SideNav/SideNavHeading.js +5 -4
  189. package/dist/SideNav/SideNavItem.d.ts +29 -4
  190. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  191. package/dist/SideNav/SideNavItem.js +75 -20
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +34 -2
  194. package/dist/Spinner/Spinner.d.ts +3 -1
  195. package/dist/Spinner/Spinner.d.ts.map +1 -1
  196. package/dist/Spinner/Spinner.js +199 -20
  197. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  198. package/dist/StatusDot/StatusDot.js +6 -1
  199. package/dist/Stepper/Step.d.ts.map +1 -1
  200. package/dist/Stepper/Step.js +7 -6
  201. package/dist/Switch/Switch.d.ts.map +1 -1
  202. package/dist/Switch/Switch.js +5 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +6 -1
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +3 -6
  207. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  208. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  210. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  211. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +34 -3
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +25 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  215. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  216. package/dist/Text/Text.d.ts.map +1 -1
  217. package/dist/Text/Text.js +0 -1
  218. package/dist/TextArea/TextArea.d.ts.map +1 -1
  219. package/dist/TextArea/TextArea.js +13 -8
  220. package/dist/Timestamp/Timestamp.d.ts +1 -1
  221. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  222. package/dist/Timestamp/Timestamp.js +10 -18
  223. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  224. package/dist/Timestamp/formatInstant.js +10 -5
  225. package/dist/Toast/Toast.d.ts +17 -2
  226. package/dist/Toast/Toast.d.ts.map +1 -1
  227. package/dist/Toast/Toast.js +77 -11
  228. package/dist/Toast/ToastViewport.d.ts +1 -0
  229. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  230. package/dist/Toast/ToastViewport.js +76 -21
  231. package/dist/Toast/index.d.ts +1 -1
  232. package/dist/Toast/index.d.ts.map +1 -1
  233. package/dist/Toast/types.d.ts +38 -0
  234. package/dist/Toast/types.d.ts.map +1 -1
  235. package/dist/Toast/useToastGesture.d.ts +26 -0
  236. package/dist/Toast/useToastGesture.d.ts.map +1 -0
  237. package/dist/Toast/useToastGesture.js +223 -0
  238. package/dist/Token/Token.d.ts +1 -1
  239. package/dist/Token/Token.d.ts.map +1 -1
  240. package/dist/Token/Token.js +23 -12
  241. package/dist/Token/TokenLink.d.ts +1 -1
  242. package/dist/Token/TokenLink.d.ts.map +1 -1
  243. package/dist/Token/TokenLink.js +5 -2
  244. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  245. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  246. package/dist/Tokenizer/Tokenizer.js +31 -21
  247. package/dist/TopNav/TopNavHeading.js +2 -2
  248. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  249. package/dist/TopNav/TopNavItem.js +3 -3
  250. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  251. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavMegaMenu.js +30 -9
  253. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
  255. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +21 -6
  258. package/dist/TreeList/TreeList.d.ts +1 -1
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +7 -2
  261. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  262. package/dist/TreeList/TreeListItem.js +2 -2
  263. package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
  264. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  265. package/dist/Typeahead/BaseTypeahead.js +51 -8
  266. package/dist/Typeahead/Typeahead.d.ts +8 -1
  267. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  268. package/dist/Typeahead/Typeahead.js +2 -0
  269. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  270. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  271. package/dist/Typeahead/TypeaheadItem.js +7 -2
  272. package/dist/astryx.css +87 -22
  273. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  274. package/dist/hooks/useHotkeys.js +3 -25
  275. package/dist/hooks/useOverflow.d.ts.map +1 -1
  276. package/dist/hooks/useOverflow.js +14 -4
  277. package/dist/i18n/InternationalizationContext.d.ts +2 -0
  278. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  279. package/dist/i18n/InternationalizationContext.js +3 -1
  280. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  281. package/dist/i18n/InternationalizationProvider.js +3 -1
  282. package/dist/i18n/resolve.d.ts +1 -1
  283. package/dist/i18n/resolve.d.ts.map +1 -1
  284. package/dist/i18n/resolve.js +37 -38
  285. package/dist/i18n/useTranslator.d.ts.map +1 -1
  286. package/dist/i18n/useTranslator.js +2 -3
  287. package/dist/index.d.ts +1 -1
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/theme/Theme.d.ts.map +1 -1
  290. package/dist/theme/Theme.js +46 -10
  291. package/dist/theme/defineTheme.d.ts +9 -3
  292. package/dist/theme/defineTheme.d.ts.map +1 -1
  293. package/dist/theme/defineTheme.js +5 -0
  294. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  295. package/dist/theme/derivedVarRegistry.js +24 -4
  296. package/dist/theme/generateThemeRules.d.ts +21 -0
  297. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  298. package/dist/theme/generateThemeRules.js +26 -0
  299. package/dist/theme/syntax/tokens.d.ts +1 -1
  300. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  301. package/dist/theme/syntax/tokens.js +5 -2
  302. package/dist/theme/useTheme.d.ts.map +1 -1
  303. package/dist/theme/useTheme.js +6 -7
  304. package/dist/utils/dateParser.d.ts +5 -8
  305. package/dist/utils/dateParser.d.ts.map +1 -1
  306. package/dist/utils/dateParser.js +10 -11
  307. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  308. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  309. package/dist/utils/focusOutline.stylex.js +15 -0
  310. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  311. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  312. package/dist/utils/interactionOverlay.stylex.js +42 -0
  313. package/dist/utils/isApplePlatform.d.ts +18 -0
  314. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  315. package/dist/utils/isApplePlatform.js +37 -0
  316. package/dist/utils/plainDate.d.ts +11 -0
  317. package/dist/utils/plainDate.d.ts.map +1 -1
  318. package/dist/utils/plainDate.js +20 -4
  319. package/locales/af-ZA.json +7 -7
  320. package/locales/ar-SA.json +7 -7
  321. package/locales/ca-ES.json +6 -6
  322. package/locales/cs-CZ.json +7 -7
  323. package/locales/da-DK.json +7 -7
  324. package/locales/de-DE.json +7 -7
  325. package/locales/el-GR.json +7 -7
  326. package/locales/en.json +178 -6
  327. package/locales/es-ES.json +6 -6
  328. package/locales/fi-FI.json +7 -7
  329. package/locales/fr-FR.json +7 -7
  330. package/locales/he-IL.json +7 -7
  331. package/locales/hu-HU.json +7 -7
  332. package/locales/it-IT.json +7 -7
  333. package/locales/ja-JP.json +7 -7
  334. package/locales/ko-KR.json +7 -7
  335. package/locales/nl-NL.json +7 -7
  336. package/locales/no-NO.json +7 -7
  337. package/locales/pl-PL.json +7 -7
  338. package/locales/pseudo.json +130 -1
  339. package/locales/pt-BR.json +7 -7
  340. package/locales/pt-PT.json +7 -7
  341. package/locales/ro-RO.json +7 -7
  342. package/locales/ru-RU.json +7 -7
  343. package/locales/sr-SP.json +7 -7
  344. package/locales/sv-SE.json +7 -7
  345. package/locales/tr-TR.json +7 -7
  346. package/locales/uk-UA.json +7 -7
  347. package/locales/vi-VN.json +7 -7
  348. package/locales/zh-CN.json +7 -7
  349. package/locales/zh-TW.json +7 -7
  350. package/package.json +4 -5
  351. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  352. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  353. package/src/AlertDialog/AlertDialog.tsx +62 -20
  354. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  355. package/src/AspectRatio/AspectRatio.tsx +6 -6
  356. package/src/Avatar/Avatar.doc.mjs +12 -2
  357. package/src/Avatar/Avatar.test.tsx +80 -0
  358. package/src/Avatar/Avatar.tsx +64 -14
  359. package/src/Avatar/index.ts +2 -2
  360. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  361. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  362. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  363. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  364. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  365. package/src/Badge/Badge.doc.mjs +3 -2
  366. package/src/Badge/Badge.test.tsx +32 -3
  367. package/src/Badge/Badge.tsx +42 -1
  368. package/src/Banner/Banner.doc.mjs +9 -0
  369. package/src/Banner/Banner.test.tsx +76 -11
  370. package/src/Banner/Banner.tsx +21 -2
  371. package/src/Button/Button.doc.mjs +2 -1
  372. package/src/Button/Button.test.tsx +19 -4
  373. package/src/Button/Button.tsx +9 -29
  374. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  375. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  376. package/src/Calendar/Calendar.doc.mjs +4 -4
  377. package/src/Calendar/Calendar.test.tsx +112 -0
  378. package/src/Calendar/Calendar.tsx +18 -16
  379. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  380. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  381. package/src/Calendar/styles.ts +48 -42
  382. package/src/Card/Card.doc.mjs +10 -7
  383. package/src/Card/Card.test.tsx +113 -19
  384. package/src/Card/Card.tsx +67 -89
  385. package/src/Card/index.ts +36 -1
  386. package/src/Carousel/Carousel.doc.mjs +3 -0
  387. package/src/Carousel/Carousel.test.tsx +360 -0
  388. package/src/Carousel/Carousel.tsx +116 -15
  389. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -1
  390. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  391. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  392. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  393. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  394. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  395. package/src/CodeBlock/CodeBlock.tsx +20 -4
  396. package/src/CodeBlock/highlightRanges.ts +1 -1
  397. package/src/CodeBlock/highlightStyles.ts +13 -13
  398. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  399. package/src/ComplexSelector/ComplexSelector.doc.mjs +9 -2
  400. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  401. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  402. package/src/DateInput/DateInput.doc.mjs +17 -1
  403. package/src/DateInput/DateInput.test.tsx +9 -4
  404. package/src/DateInput/DateInput.tsx +54 -3
  405. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  406. package/src/DateInput/MonthScroller.tsx +5 -1
  407. package/src/DateInput/MonthYearWheels.tsx +7 -4
  408. package/src/DateInput/NativeDateField.test.tsx +635 -0
  409. package/src/DateInput/NativeDateField.tsx +641 -0
  410. package/src/DateInput/TouchDateField.tsx +83 -33
  411. package/src/DateInput/Wheel.tsx +1 -0
  412. package/src/DateInput/index.ts +1 -0
  413. package/src/DateInput/nativeDateSegments.ts +127 -0
  414. package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -3
  415. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  416. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  417. package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
  418. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  419. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  420. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  421. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  422. package/src/Dialog/Dialog.test.tsx +185 -18
  423. package/src/Dialog/Dialog.tsx +35 -11
  424. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  425. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  426. package/src/Field/Field.doc.mjs +1 -1
  427. package/src/Field/FieldLabel.test.tsx +29 -0
  428. package/src/Field/FieldLabel.tsx +7 -0
  429. package/src/Field/InputClearButton.test.tsx +15 -1
  430. package/src/Field/InputClearButton.tsx +28 -4
  431. package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
  432. package/src/FileInput/FileInput.doc.mjs +1 -1
  433. package/src/Heading/Heading.tsx +0 -1
  434. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  435. package/src/HoverCard/HoverCard.test.tsx +154 -4
  436. package/src/HoverCard/HoverCard.tsx +137 -3
  437. package/src/HoverCard/useHoverCard.tsx +23 -3
  438. package/src/Icon/Icon.test.tsx +55 -1
  439. package/src/Icon/Icon.tsx +5 -3
  440. package/src/Icon/defaultIcons.tsx +11 -2
  441. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  442. package/src/Icon/globalIconRegistry.tsx +37 -6
  443. package/src/Icon/index.ts +1 -0
  444. package/src/Icon/useIcon.ts +9 -2
  445. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  446. package/src/Indicator/Indicator.doc.mjs +3 -1
  447. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  448. package/src/Item/Item.tsx +2 -7
  449. package/src/Kbd/Kbd.test.tsx +0 -17
  450. package/src/Kbd/Kbd.tsx +2 -26
  451. package/src/Layer/gestureCounter.ts +57 -0
  452. package/src/Layer/useLayer.test.tsx +368 -16
  453. package/src/Layer/useLayer.tsx +208 -35
  454. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  455. package/src/List/List.test.tsx +38 -0
  456. package/src/List/List.tsx +8 -1
  457. package/src/Markdown/Markdown.test.tsx +37 -0
  458. package/src/Markdown/Markdown.tsx +16 -5
  459. package/src/Markdown/parser.test.ts +33 -0
  460. package/src/Markdown/parser.ts +9 -3
  461. package/src/MetadataList/MetadataList.test.tsx +75 -2
  462. package/src/MetadataList/MetadataListItem.tsx +5 -2
  463. package/src/MultiSelector/MultiSelector.doc.mjs +23 -2
  464. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  465. package/src/MultiSelector/MultiSelector.tsx +103 -16
  466. package/src/MultiSelector/hooks.ts +9 -2
  467. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  468. package/src/NavIcon/NavIcon.test.tsx +9 -0
  469. package/src/NavIcon/NavIcon.tsx +5 -1
  470. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  471. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  472. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  473. package/src/NumberInput/NumberInput.doc.mjs +27 -8
  474. package/src/NumberInput/NumberInput.test.tsx +563 -8
  475. package/src/NumberInput/NumberInput.tsx +77 -131
  476. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  477. package/src/NumberInput/numberInputCommit.ts +103 -0
  478. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  479. package/src/NumberInput/numberParser.test.ts +222 -0
  480. package/src/NumberInput/numberParser.ts +403 -0
  481. package/src/Outline/Outline.tsx +2 -4
  482. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  483. package/src/OverflowList/OverflowList.test.tsx +550 -4
  484. package/src/OverflowList/OverflowList.tsx +100 -2
  485. package/src/Pagination/Pagination.test.tsx +3 -2
  486. package/src/Popover/Popover.doc.mjs +2 -2
  487. package/src/Popover/Popover.test.tsx +38 -0
  488. package/src/Popover/Popover.tsx +28 -66
  489. package/src/Popover/usePopover.tsx +44 -5
  490. package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
  491. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  492. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  493. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  494. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  495. package/src/PowerSearch/formatFilterValue.ts +2 -0
  496. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  497. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  498. package/src/ProgressBar/ProgressBar.tsx +28 -8
  499. package/src/RadioList/RadioList.doc.mjs +1 -1
  500. package/src/Resizable/Resizable.doc.mjs +2 -2
  501. package/src/Resizable/useResizable.doc.mjs +21 -2
  502. package/src/Resizable/useResizable.test.ts +421 -0
  503. package/src/Resizable/useResizable.ts +133 -48
  504. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  505. package/src/SelectableCard/SelectableCard.tsx +16 -0
  506. package/src/Selector/Selector.doc.mjs +15 -1
  507. package/src/Selector/Selector.source-build.test.mjs +65 -0
  508. package/src/Selector/Selector.test.tsx +301 -0
  509. package/src/Selector/Selector.tsx +145 -32
  510. package/src/Selector/hooks.ts +17 -2
  511. package/src/SideNav/SideNav.doc.mjs +2 -2
  512. package/src/SideNav/SideNav.test.tsx +1069 -6
  513. package/src/SideNav/SideNav.tsx +109 -38
  514. package/src/SideNav/SideNavHeading.tsx +5 -2
  515. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  516. package/src/SideNav/SideNavItem.tsx +134 -44
  517. package/src/Slider/Slider.doc.mjs +2 -2
  518. package/src/Slider/Slider.test.tsx +106 -1
  519. package/src/Slider/Slider.tsx +52 -1
  520. package/src/Spinner/Spinner.doc.mjs +17 -5
  521. package/src/Spinner/Spinner.test.tsx +164 -0
  522. package/src/Spinner/Spinner.tsx +252 -22
  523. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  524. package/src/StatusDot/StatusDot.test.tsx +9 -0
  525. package/src/StatusDot/StatusDot.tsx +7 -1
  526. package/src/Stepper/Step.doc.mjs +1 -1
  527. package/src/Stepper/Step.tsx +7 -14
  528. package/src/Switch/Switch.doc.mjs +3 -1
  529. package/src/Switch/Switch.test.tsx +10 -0
  530. package/src/Switch/Switch.tsx +3 -0
  531. package/src/Table/BaseTable.tsx +6 -1
  532. package/src/Table/Table.doc.mjs +5 -3
  533. package/src/Table/Table.tsx +3 -8
  534. package/src/Table/TableBody.doc.mjs +2 -2
  535. package/src/Table/TableFooter.doc.mjs +1 -1
  536. package/src/Table/TableHeader.doc.mjs +1 -1
  537. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  538. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  539. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  540. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  541. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  542. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  543. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  544. package/src/Table/useTablePagination.doc.mjs +1 -1
  545. package/src/Table/useTableSelection.doc.mjs +1 -1
  546. package/src/Text/Text.test.tsx +44 -0
  547. package/src/Text/Text.tsx +0 -1
  548. package/src/TextArea/TextArea.doc.mjs +13 -3
  549. package/src/TextArea/TextArea.test.tsx +11 -0
  550. package/src/TextArea/TextArea.tsx +34 -22
  551. package/src/TextInput/TextInput.doc.mjs +1 -1
  552. package/src/TimeInput/TimeInput.doc.mjs +1 -1
  553. package/src/Timestamp/Timestamp.test.tsx +89 -0
  554. package/src/Timestamp/Timestamp.tsx +8 -8
  555. package/src/Timestamp/formatInstant.ts +5 -0
  556. package/src/Toast/Toast.doc.mjs +213 -44
  557. package/src/Toast/Toast.tsx +118 -23
  558. package/src/Toast/ToastViewport.test.tsx +1434 -8
  559. package/src/Toast/ToastViewport.tsx +85 -14
  560. package/src/Toast/index.ts +2 -0
  561. package/src/Toast/types.ts +43 -5
  562. package/src/Toast/useToastGesture.ts +361 -0
  563. package/src/Token/Token.test.tsx +95 -0
  564. package/src/Token/Token.tsx +19 -17
  565. package/src/Token/TokenLink.tsx +12 -3
  566. package/src/Tokenizer/Tokenizer.doc.mjs +17 -4
  567. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  568. package/src/Tokenizer/Tokenizer.tsx +49 -24
  569. package/src/TopNav/TopNavHeading.tsx +2 -2
  570. package/src/TopNav/TopNavItem.tsx +3 -7
  571. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  572. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  573. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  574. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  575. package/src/TopNav/TopNavMenu.tsx +38 -5
  576. package/src/TreeList/TreeList.test.tsx +49 -0
  577. package/src/TreeList/TreeList.tsx +7 -2
  578. package/src/TreeList/TreeListItem.tsx +2 -7
  579. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  580. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  581. package/src/Typeahead/Typeahead.doc.mjs +7 -1
  582. package/src/Typeahead/Typeahead.test.tsx +154 -0
  583. package/src/Typeahead/Typeahead.tsx +9 -0
  584. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  585. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  586. package/src/hooks/useAnnounce.doc.mjs +96 -0
  587. package/src/hooks/useDevWarning.doc.mjs +96 -0
  588. package/src/hooks/useHotkeys.test.ts +0 -18
  589. package/src/hooks/useHotkeys.ts +3 -25
  590. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  591. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  592. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  593. package/src/hooks/useLongPress.doc.mjs +123 -0
  594. package/src/hooks/useOverflow.doc.mjs +58 -17
  595. package/src/hooks/useOverflow.ts +16 -4
  596. package/src/hooks/useTypeahead.doc.mjs +153 -0
  597. package/src/i18n/InternationalizationContext.ts +3 -0
  598. package/src/i18n/InternationalizationProvider.tsx +8 -1
  599. package/src/i18n/__tests__/resolve.test.ts +23 -1
  600. package/src/i18n/resolve.ts +46 -49
  601. package/src/i18n/useTranslator.ts +2 -7
  602. package/src/index.ts +2 -0
  603. package/src/raw-import.d.ts +14 -0
  604. package/src/theme/Theme.test.tsx +104 -2
  605. package/src/theme/Theme.tsx +49 -14
  606. package/src/theme/defineTheme.test.ts +23 -0
  607. package/src/theme/defineTheme.ts +12 -3
  608. package/src/theme/derivedVarRegistry.test.ts +87 -3
  609. package/src/theme/derivedVarRegistry.ts +23 -4
  610. package/src/theme/generateThemeRules.test.ts +99 -1
  611. package/src/theme/generateThemeRules.ts +28 -0
  612. package/src/theme/syntax/tokens.ts +5 -2
  613. package/src/theme/useTheme.test.tsx +10 -0
  614. package/src/theme/useTheme.ts +16 -10
  615. package/src/utils/dateParser.test.ts +34 -2
  616. package/src/utils/dateParser.ts +11 -14
  617. package/src/utils/focusOutline.stylex.ts +50 -0
  618. package/src/utils/interactionOverlay.stylex.ts +74 -0
  619. package/src/utils/isApplePlatform.test.ts +61 -0
  620. package/src/utils/isApplePlatform.ts +37 -0
  621. package/src/utils/plainDate.test.ts +46 -0
  622. package/src/utils/plainDate.ts +18 -3
@@ -17,8 +17,10 @@
17
17
  */
18
18
 
19
19
  import {describe, it, expect, beforeAll, afterAll, vi} from 'vitest';
20
- import {render, screen, within} from '@testing-library/react';
20
+ import {render, screen, within, act, waitFor} from '@testing-library/react';
21
+ import {useState} from 'react';
21
22
  import {OverflowList} from './OverflowList';
23
+ import type {OverflowItem} from './OverflowList';
22
24
 
23
25
  const originalOffsetWidth = Object.getOwnPropertyDescriptor(
24
26
  HTMLElement.prototype,
@@ -28,12 +30,27 @@ const originalResizeObserver = (
28
30
  globalThis as unknown as {ResizeObserver?: unknown}
29
31
  ).ResizeObserver;
30
32
 
31
- /** No-op ResizeObserver — the shared observer fires its initial callback
32
- * synchronously on observe(), so the algorithm still measures on mount. */
33
+ const resizeObservers = new Set<StubResizeObserver>();
34
+
35
+ /** ResizeObserver stub with an explicit trigger for resize-path tests. */
33
36
  class StubResizeObserver {
37
+ constructor(private callback: ResizeObserverCallback) {
38
+ resizeObservers.add(this);
39
+ }
40
+
34
41
  observe(): void {}
35
42
  unobserve(): void {}
36
- disconnect(): void {}
43
+ disconnect(): void {
44
+ resizeObservers.delete(this);
45
+ }
46
+
47
+ takeRecords(): ResizeObserverEntry[] {
48
+ return [];
49
+ }
50
+
51
+ trigger(target: Element): void {
52
+ this.callback([{target} as ResizeObserverEntry], this);
53
+ }
37
54
  }
38
55
 
39
56
  beforeAll(() => {
@@ -88,6 +105,29 @@ const indicator =
88
105
  </span>
89
106
  );
90
107
 
108
+ /** Notify the shared observer that an element's size changed. */
109
+ function triggerResize(target: Element): void {
110
+ act(() => {
111
+ for (const observer of resizeObservers) {
112
+ observer.trigger(target);
113
+ }
114
+ });
115
+ }
116
+
117
+ /** The indices the most recent onOverflowChange call reported. */
118
+ function indicesOf(spy: {mock: {calls: unknown[][]}}): number[] {
119
+ const last = spy.mock.calls[spy.mock.calls.length - 1];
120
+ return (last[0] as {index: number}[]).map(i => i.index);
121
+ }
122
+
123
+ /** The labels the most recent onOverflowChange call reported. */
124
+ function labelsOf(spy: {mock: {calls: unknown[][]}}): string[] {
125
+ const last = spy.mock.calls[spy.mock.calls.length - 1];
126
+ return (last[0] as OverflowItem[]).map(item =>
127
+ String((item.child.props as {children?: unknown}).children),
128
+ );
129
+ }
130
+
91
131
  describe('OverflowList', () => {
92
132
  describe('when all items fit', () => {
93
133
  it('renders every item and no overflow indicator', () => {
@@ -524,4 +564,510 @@ describe('OverflowList', () => {
524
564
  expect(within(vis).queryByText('B')).not.toBeInTheDocument();
525
565
  });
526
566
  });
567
+
568
+ describe('onOverflowChange', () => {
569
+ it('stays silent when nothing overflows', () => {
570
+ const onOverflowChange = vi.fn();
571
+ render(
572
+ <OverflowList
573
+ gap={0}
574
+ data-w="1000"
575
+ data-testid="ov"
576
+ onOverflowChange={onOverflowChange}>
577
+ <button type="button" data-w="40">
578
+ A
579
+ </button>
580
+ <button type="button" data-w="40">
581
+ B
582
+ </button>
583
+ </OverflowList>,
584
+ );
585
+ expect(onOverflowChange).not.toHaveBeenCalled();
586
+ });
587
+
588
+ it('fires once on mount while overflowing, with the measured set', () => {
589
+ const onOverflowChange = vi.fn();
590
+ render(
591
+ <OverflowList
592
+ gap={0}
593
+ data-w="60"
594
+ data-testid="ov"
595
+ onOverflowChange={onOverflowChange}>
596
+ <button type="button" data-w="40">
597
+ A
598
+ </button>
599
+ <button type="button" data-w="40">
600
+ B
601
+ </button>
602
+ <button type="button" data-w="40">
603
+ C
604
+ </button>
605
+ </OverflowList>,
606
+ );
607
+ expect(onOverflowChange).toHaveBeenCalledTimes(1);
608
+ expect(indicesOf(onOverflowChange)).toEqual([1, 2]);
609
+ });
610
+
611
+ it('reports the collapsed items by original index', () => {
612
+ const onOverflowChange = vi.fn();
613
+ render(
614
+ <OverflowList
615
+ gap={0}
616
+ data-w="60"
617
+ data-testid="ov"
618
+ onOverflowChange={onOverflowChange}>
619
+ <button type="button" data-w="40">
620
+ A
621
+ </button>
622
+ <button type="button" data-w="40">
623
+ B
624
+ </button>
625
+ <button type="button" data-w="40">
626
+ C
627
+ </button>
628
+ </OverflowList>,
629
+ );
630
+ expect(indicesOf(onOverflowChange)).toEqual([1, 2]);
631
+ });
632
+
633
+ it('reports an empty set again once the container fits everything', () => {
634
+ const onOverflowChange = vi.fn();
635
+ const items = [
636
+ <button type="button" data-w="40" key="a">
637
+ A
638
+ </button>,
639
+ <button type="button" data-w="40" key="b">
640
+ B
641
+ </button>,
642
+ <button type="button" data-w="40" key="c">
643
+ C
644
+ </button>,
645
+ ];
646
+ const {rerender} = render(
647
+ <OverflowList
648
+ gap={0}
649
+ data-w="60"
650
+ data-testid="ov"
651
+ onOverflowChange={onOverflowChange}>
652
+ {items}
653
+ </OverflowList>,
654
+ );
655
+ expect(indicesOf(onOverflowChange)).toEqual([1, 2]);
656
+
657
+ rerender(
658
+ <OverflowList
659
+ gap={0}
660
+ data-w="1000"
661
+ data-testid="ov"
662
+ onOverflowChange={onOverflowChange}>
663
+ {items}
664
+ </OverflowList>,
665
+ );
666
+ triggerResize(visibleContainer());
667
+ expect(onOverflowChange).toHaveBeenCalledTimes(2);
668
+ expect(indicesOf(onOverflowChange)).toEqual([]);
669
+ });
670
+
671
+ it('does not re-fire when the collapsed set is unchanged', () => {
672
+ const spy = vi.fn();
673
+ const items = [
674
+ <button type="button" data-w="40" key="a">
675
+ A
676
+ </button>,
677
+ <button type="button" data-w="40" key="b">
678
+ B
679
+ </button>,
680
+ ];
681
+ // A fresh inline callback each render — the guard is the collapsed set,
682
+ // not the callback's identity.
683
+ const {rerender} = render(
684
+ <OverflowList
685
+ gap={0}
686
+ data-w="60"
687
+ data-testid="ov"
688
+ onOverflowChange={o => {
689
+ spy(o);
690
+ }}>
691
+ {items}
692
+ </OverflowList>,
693
+ );
694
+ expect(spy).toHaveBeenCalledTimes(1);
695
+ rerender(
696
+ <OverflowList
697
+ gap={0}
698
+ data-w="60"
699
+ data-testid="ov"
700
+ onOverflowChange={o => {
701
+ spy(o);
702
+ }}>
703
+ {items}
704
+ </OverflowList>,
705
+ );
706
+ expect(spy).toHaveBeenCalledTimes(1);
707
+ });
708
+
709
+ it('reports same-count membership and order changes', () => {
710
+ const onOverflowChange = vi.fn();
711
+ const renderItems = (labels: string[]) =>
712
+ labels.map(label => (
713
+ <button type="button" data-w="40" key={label}>
714
+ {label}
715
+ </button>
716
+ ));
717
+ const {rerender} = render(
718
+ <OverflowList
719
+ gap={0}
720
+ data-w="60"
721
+ data-testid="ov"
722
+ onOverflowChange={onOverflowChange}>
723
+ {renderItems(['A', 'B', 'C'])}
724
+ </OverflowList>,
725
+ );
726
+ expect(labelsOf(onOverflowChange)).toEqual(['B', 'C']);
727
+
728
+ rerender(
729
+ <OverflowList
730
+ gap={0}
731
+ data-w="60"
732
+ data-testid="ov"
733
+ onOverflowChange={onOverflowChange}>
734
+ {renderItems(['A', 'C', 'B'])}
735
+ </OverflowList>,
736
+ );
737
+ expect(labelsOf(onOverflowChange)).toEqual(['C', 'B']);
738
+
739
+ rerender(
740
+ <OverflowList
741
+ gap={0}
742
+ data-w="60"
743
+ data-testid="ov"
744
+ onOverflowChange={onOverflowChange}>
745
+ {renderItems(['A', 'D', 'B'])}
746
+ </OverflowList>,
747
+ );
748
+ expect(onOverflowChange).toHaveBeenCalledTimes(3);
749
+ expect(labelsOf(onOverflowChange)).toEqual(['D', 'B']);
750
+ });
751
+
752
+ it('reports one measured set when unequal-width items reorder', async () => {
753
+ const onOverflowChange = vi.fn();
754
+ const items = {
755
+ wide: (
756
+ <button type="button" data-w="200" key="wide">
757
+ Wide
758
+ </button>
759
+ ),
760
+ a: (
761
+ <button type="button" data-w="50" key="a">
762
+ A
763
+ </button>
764
+ ),
765
+ b: (
766
+ <button type="button" data-w="50" key="b">
767
+ B
768
+ </button>
769
+ ),
770
+ };
771
+ const {rerender} = render(
772
+ <OverflowList
773
+ gap={0}
774
+ data-w="150"
775
+ data-testid="ov"
776
+ onOverflowChange={onOverflowChange}>
777
+ {items.wide}
778
+ {items.a}
779
+ {items.b}
780
+ </OverflowList>,
781
+ );
782
+ expect(indicesOf(onOverflowChange)).toEqual([0, 1, 2]);
783
+
784
+ rerender(
785
+ <OverflowList
786
+ gap={0}
787
+ data-w="150"
788
+ data-testid="ov"
789
+ onOverflowChange={onOverflowChange}>
790
+ {items.a}
791
+ {items.b}
792
+ {items.wide}
793
+ </OverflowList>,
794
+ );
795
+
796
+ await waitFor(() => {
797
+ expect(visibleContainer()).toHaveTextContent('AB');
798
+ });
799
+ expect(onOverflowChange).toHaveBeenCalledTimes(2);
800
+ expect(indicesOf(onOverflowChange)).toEqual([2]);
801
+ });
802
+
803
+ it('re-measures same-count content changes with stable keys', () => {
804
+ const onOverflowChange = vi.fn();
805
+ const renderItems = (
806
+ items: {key: string; label: string; width: number}[],
807
+ ) =>
808
+ items.map(item => (
809
+ <button type="button" data-w={item.width} key={item.key}>
810
+ {item.label}
811
+ </button>
812
+ ));
813
+ const {rerender} = render(
814
+ <OverflowList
815
+ gap={0}
816
+ data-w="300"
817
+ data-testid="ov"
818
+ onOverflowChange={onOverflowChange}>
819
+ {renderItems([
820
+ {key: 'a', label: 'A', width: 60},
821
+ {key: 'b', label: 'B', width: 60},
822
+ {key: 'c', label: 'C', width: 60},
823
+ {key: 'd', label: 'D', width: 60},
824
+ ])}
825
+ </OverflowList>,
826
+ );
827
+ expect(onOverflowChange).not.toHaveBeenCalled();
828
+
829
+ rerender(
830
+ <OverflowList
831
+ gap={0}
832
+ data-w="300"
833
+ data-testid="ov"
834
+ onOverflowChange={onOverflowChange}>
835
+ {renderItems([
836
+ {key: 'a', label: 'A', width: 60},
837
+ {key: 'b', label: 'B', width: 60},
838
+ {key: 'c', label: 'Wide', width: 200},
839
+ {key: 'd', label: 'D', width: 60},
840
+ ])}
841
+ </OverflowList>,
842
+ );
843
+ triggerResize(measureContainer());
844
+
845
+ expect(onOverflowChange).toHaveBeenCalledTimes(1);
846
+ expect(indicesOf(onOverflowChange)).toEqual([2, 3]);
847
+ expect(visibleContainer()).toHaveTextContent('AB');
848
+ expect(visibleContainer()).not.toHaveTextContent('Wide');
849
+ });
850
+
851
+ it('reports only the measured set when the number of children changes', () => {
852
+ const onOverflowChange = vi.fn();
853
+ const renderItems = (labels: string[], width: number) =>
854
+ labels.map(label => (
855
+ <button type="button" data-w={width} key={label}>
856
+ {label}
857
+ </button>
858
+ ));
859
+ const {rerender} = render(
860
+ <OverflowList
861
+ gap={0}
862
+ data-w="220"
863
+ data-testid="ov"
864
+ onOverflowChange={onOverflowChange}>
865
+ {renderItems(['A', 'B', 'C', 'D', 'E'], 100)}
866
+ </OverflowList>,
867
+ );
868
+ expect(indicesOf(onOverflowChange)).toEqual([2, 3, 4]);
869
+
870
+ rerender(
871
+ <OverflowList
872
+ gap={0}
873
+ data-w="220"
874
+ data-testid="ov"
875
+ onOverflowChange={onOverflowChange}>
876
+ {renderItems(['Go', 'Up'], 40)}
877
+ </OverflowList>,
878
+ );
879
+ expect(onOverflowChange).toHaveBeenCalledTimes(2);
880
+ expect(indicesOf(onOverflowChange)).toEqual([]);
881
+
882
+ rerender(
883
+ <OverflowList
884
+ gap={0}
885
+ data-w="220"
886
+ data-testid="ov"
887
+ onOverflowChange={onOverflowChange}>
888
+ {renderItems(['A', 'B', 'C', 'D', 'E'], 100)}
889
+ </OverflowList>,
890
+ );
891
+ expect(onOverflowChange).toHaveBeenCalledTimes(3);
892
+ expect(indicesOf(onOverflowChange)).toEqual([2, 3, 4]);
893
+ });
894
+
895
+ it('uses a replacement callback only for the next set change', () => {
896
+ const first = vi.fn();
897
+ const second = vi.fn();
898
+ const items = [
899
+ <button type="button" data-w="40" key="a">
900
+ A
901
+ </button>,
902
+ <button type="button" data-w="40" key="b">
903
+ B
904
+ </button>,
905
+ ];
906
+ const {rerender} = render(
907
+ <OverflowList
908
+ gap={0}
909
+ data-w="60"
910
+ data-testid="ov"
911
+ onOverflowChange={first}>
912
+ {items}
913
+ </OverflowList>,
914
+ );
915
+ expect(first).toHaveBeenCalledTimes(1);
916
+
917
+ rerender(
918
+ <OverflowList
919
+ gap={0}
920
+ data-w="60"
921
+ data-testid="ov"
922
+ onOverflowChange={second}>
923
+ {items}
924
+ </OverflowList>,
925
+ );
926
+ expect(second).not.toHaveBeenCalled();
927
+
928
+ rerender(
929
+ <OverflowList
930
+ gap={0}
931
+ data-w="1000"
932
+ data-testid="ov"
933
+ onOverflowChange={second}>
934
+ {items}
935
+ </OverflowList>,
936
+ );
937
+ triggerResize(visibleContainer());
938
+ expect(first).toHaveBeenCalledTimes(1);
939
+ expect(second).toHaveBeenCalledTimes(1);
940
+ expect(indicesOf(second)).toEqual([]);
941
+ });
942
+
943
+ it('settles when the callback stores the collapsed set in state', () => {
944
+ const onReport = vi.fn();
945
+
946
+ function Harness() {
947
+ const [hidden, setHidden] = useState<OverflowItem[]>([]);
948
+ return (
949
+ <>
950
+ <output data-testid="hidden-count">{hidden.length}</output>
951
+ <OverflowList
952
+ gap={0}
953
+ data-w="60"
954
+ data-testid="ov"
955
+ onOverflowChange={items => {
956
+ onReport(items);
957
+ setHidden(items);
958
+ }}>
959
+ <button type="button" data-w="40">
960
+ A
961
+ </button>
962
+ <button type="button" data-w="40">
963
+ B
964
+ </button>
965
+ </OverflowList>
966
+ </>
967
+ );
968
+ }
969
+
970
+ render(<Harness />);
971
+ expect(onReport).toHaveBeenCalledTimes(1);
972
+ expect(screen.getByTestId('hidden-count')).toHaveTextContent('1');
973
+ });
974
+
975
+ it('does not report after unmount', () => {
976
+ const onOverflowChange = vi.fn();
977
+ const {unmount} = render(
978
+ <OverflowList
979
+ gap={0}
980
+ data-w="60"
981
+ data-testid="ov"
982
+ onOverflowChange={onOverflowChange}>
983
+ <button type="button" data-w="40">
984
+ A
985
+ </button>
986
+ <button type="button" data-w="40">
987
+ B
988
+ </button>
989
+ </OverflowList>,
990
+ );
991
+ const container = visibleContainer();
992
+ const measure = measureContainer();
993
+ expect(onOverflowChange).toHaveBeenCalledTimes(1);
994
+
995
+ unmount();
996
+ triggerResize(container);
997
+ triggerResize(measure);
998
+ expect(onOverflowChange).toHaveBeenCalledTimes(1);
999
+ });
1000
+
1001
+ it('reports the leading items with collapseFrom="start"', () => {
1002
+ const onOverflowChange = vi.fn();
1003
+ render(
1004
+ <OverflowList
1005
+ gap={0}
1006
+ data-w="60"
1007
+ data-testid="ov"
1008
+ collapseFrom="start"
1009
+ onOverflowChange={onOverflowChange}>
1010
+ <button type="button" data-w="40">
1011
+ A
1012
+ </button>
1013
+ <button type="button" data-w="40">
1014
+ B
1015
+ </button>
1016
+ <button type="button" data-w="40">
1017
+ C
1018
+ </button>
1019
+ </OverflowList>,
1020
+ );
1021
+ expect(indicesOf(onOverflowChange)).toEqual([0, 1]);
1022
+ });
1023
+
1024
+ it('adds no indicator of its own, so an outside anchor stands alone', () => {
1025
+ const onOverflowChange = vi.fn();
1026
+ render(
1027
+ <OverflowList
1028
+ gap={0}
1029
+ data-w="60"
1030
+ data-testid="ov"
1031
+ onOverflowChange={onOverflowChange}>
1032
+ <button type="button" data-w="40">
1033
+ A
1034
+ </button>
1035
+ <button type="button" data-w="40">
1036
+ B
1037
+ </button>
1038
+ <button type="button" data-w="40">
1039
+ C
1040
+ </button>
1041
+ </OverflowList>,
1042
+ );
1043
+ expect(indicesOf(onOverflowChange)).toEqual([1, 2]);
1044
+ expect(visibleContainer().textContent).toBe('A');
1045
+ // Nothing beyond the items themselves is measured either.
1046
+ expect(measureContainer().children).toHaveLength(3);
1047
+ });
1048
+
1049
+ it('reports alongside an overflowRenderer without disturbing it', () => {
1050
+ const onOverflowChange = vi.fn();
1051
+ render(
1052
+ <OverflowList
1053
+ gap={0}
1054
+ data-w="100"
1055
+ data-testid="ov"
1056
+ overflowRenderer={indicator('more:')}
1057
+ onOverflowChange={onOverflowChange}>
1058
+ <button type="button" data-w="40">
1059
+ A
1060
+ </button>
1061
+ <button type="button" data-w="40">
1062
+ B
1063
+ </button>
1064
+ <button type="button" data-w="40">
1065
+ C
1066
+ </button>
1067
+ </OverflowList>,
1068
+ );
1069
+ expect(indicesOf(onOverflowChange)).toEqual([1, 2]);
1070
+ expect(visibleContainer().textContent).toBe('Amore:1,2');
1071
+ });
1072
+ });
527
1073
  });