@astryxdesign/core 0.5.0 → 0.5.1-canary.f64186a

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 (597) 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/index.d.ts +1 -1
  278. package/dist/index.d.ts.map +1 -1
  279. package/dist/theme/Theme.d.ts.map +1 -1
  280. package/dist/theme/Theme.js +46 -10
  281. package/dist/theme/defineTheme.d.ts +9 -3
  282. package/dist/theme/defineTheme.d.ts.map +1 -1
  283. package/dist/theme/defineTheme.js +5 -0
  284. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  285. package/dist/theme/derivedVarRegistry.js +24 -4
  286. package/dist/theme/generateThemeRules.d.ts +21 -0
  287. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  288. package/dist/theme/generateThemeRules.js +26 -0
  289. package/dist/theme/syntax/tokens.d.ts +1 -1
  290. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  291. package/dist/theme/syntax/tokens.js +5 -2
  292. package/dist/theme/useTheme.d.ts.map +1 -1
  293. package/dist/theme/useTheme.js +6 -7
  294. package/dist/utils/dateParser.d.ts +5 -8
  295. package/dist/utils/dateParser.d.ts.map +1 -1
  296. package/dist/utils/dateParser.js +10 -11
  297. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  298. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  299. package/dist/utils/focusOutline.stylex.js +15 -0
  300. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  301. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  302. package/dist/utils/interactionOverlay.stylex.js +42 -0
  303. package/dist/utils/isApplePlatform.d.ts +18 -0
  304. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  305. package/dist/utils/isApplePlatform.js +37 -0
  306. package/dist/utils/plainDate.d.ts +11 -0
  307. package/dist/utils/plainDate.d.ts.map +1 -1
  308. package/dist/utils/plainDate.js +20 -4
  309. package/locales/af-ZA.json +7 -7
  310. package/locales/ar-SA.json +7 -7
  311. package/locales/ca-ES.json +6 -6
  312. package/locales/cs-CZ.json +7 -7
  313. package/locales/da-DK.json +7 -7
  314. package/locales/de-DE.json +7 -7
  315. package/locales/el-GR.json +7 -7
  316. package/locales/en.json +178 -6
  317. package/locales/es-ES.json +6 -6
  318. package/locales/fi-FI.json +7 -7
  319. package/locales/fr-FR.json +7 -7
  320. package/locales/he-IL.json +7 -7
  321. package/locales/hu-HU.json +7 -7
  322. package/locales/it-IT.json +7 -7
  323. package/locales/ja-JP.json +7 -7
  324. package/locales/ko-KR.json +7 -7
  325. package/locales/nl-NL.json +7 -7
  326. package/locales/no-NO.json +7 -7
  327. package/locales/pl-PL.json +7 -7
  328. package/locales/pseudo.json +130 -1
  329. package/locales/pt-BR.json +7 -7
  330. package/locales/pt-PT.json +7 -7
  331. package/locales/ro-RO.json +7 -7
  332. package/locales/ru-RU.json +7 -7
  333. package/locales/sr-SP.json +7 -7
  334. package/locales/sv-SE.json +7 -7
  335. package/locales/tr-TR.json +7 -7
  336. package/locales/uk-UA.json +7 -7
  337. package/locales/vi-VN.json +7 -7
  338. package/locales/zh-CN.json +7 -7
  339. package/locales/zh-TW.json +7 -7
  340. package/package.json +4 -5
  341. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  342. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  343. package/src/AlertDialog/AlertDialog.tsx +62 -20
  344. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  345. package/src/AspectRatio/AspectRatio.tsx +6 -6
  346. package/src/Avatar/Avatar.doc.mjs +12 -2
  347. package/src/Avatar/Avatar.test.tsx +80 -0
  348. package/src/Avatar/Avatar.tsx +64 -14
  349. package/src/Avatar/index.ts +2 -2
  350. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  351. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  352. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  353. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  354. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  355. package/src/Badge/Badge.doc.mjs +3 -2
  356. package/src/Badge/Badge.test.tsx +32 -3
  357. package/src/Badge/Badge.tsx +42 -1
  358. package/src/Banner/Banner.doc.mjs +9 -0
  359. package/src/Banner/Banner.test.tsx +76 -11
  360. package/src/Banner/Banner.tsx +21 -2
  361. package/src/Button/Button.doc.mjs +2 -1
  362. package/src/Button/Button.test.tsx +19 -4
  363. package/src/Button/Button.tsx +9 -29
  364. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  365. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  366. package/src/Calendar/Calendar.doc.mjs +3 -3
  367. package/src/Calendar/Calendar.test.tsx +112 -0
  368. package/src/Calendar/Calendar.tsx +18 -16
  369. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  370. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  371. package/src/Calendar/styles.ts +48 -42
  372. package/src/Card/Card.doc.mjs +10 -7
  373. package/src/Card/Card.test.tsx +113 -19
  374. package/src/Card/Card.tsx +67 -89
  375. package/src/Card/index.ts +36 -1
  376. package/src/Carousel/Carousel.doc.mjs +3 -0
  377. package/src/Carousel/Carousel.test.tsx +360 -0
  378. package/src/Carousel/Carousel.tsx +116 -15
  379. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  380. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  381. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  382. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  383. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  384. package/src/CodeBlock/CodeBlock.tsx +20 -4
  385. package/src/CodeBlock/highlightRanges.ts +1 -1
  386. package/src/CodeBlock/highlightStyles.ts +13 -13
  387. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  388. package/src/ComplexSelector/ComplexSelector.doc.mjs +7 -0
  389. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  390. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  391. package/src/DateInput/DateInput.doc.mjs +16 -0
  392. package/src/DateInput/DateInput.test.tsx +9 -4
  393. package/src/DateInput/DateInput.tsx +54 -3
  394. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  395. package/src/DateInput/MonthScroller.tsx +5 -1
  396. package/src/DateInput/MonthYearWheels.tsx +7 -4
  397. package/src/DateInput/NativeDateField.test.tsx +635 -0
  398. package/src/DateInput/NativeDateField.tsx +641 -0
  399. package/src/DateInput/TouchDateField.tsx +83 -33
  400. package/src/DateInput/Wheel.tsx +1 -0
  401. package/src/DateInput/index.ts +1 -0
  402. package/src/DateInput/nativeDateSegments.ts +127 -0
  403. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  404. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  405. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  406. package/src/DateTimeInput/DateTimeInput.doc.mjs +38 -21
  407. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  408. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  409. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  410. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  411. package/src/Dialog/Dialog.test.tsx +185 -18
  412. package/src/Dialog/Dialog.tsx +35 -11
  413. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  414. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  415. package/src/Field/FieldLabel.test.tsx +29 -0
  416. package/src/Field/FieldLabel.tsx +7 -0
  417. package/src/Field/InputClearButton.test.tsx +15 -1
  418. package/src/Field/InputClearButton.tsx +28 -4
  419. package/src/Heading/Heading.tsx +0 -1
  420. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  421. package/src/HoverCard/HoverCard.test.tsx +154 -4
  422. package/src/HoverCard/HoverCard.tsx +137 -3
  423. package/src/HoverCard/useHoverCard.tsx +23 -3
  424. package/src/Icon/Icon.test.tsx +55 -1
  425. package/src/Icon/Icon.tsx +5 -3
  426. package/src/Icon/defaultIcons.tsx +11 -2
  427. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  428. package/src/Icon/globalIconRegistry.tsx +37 -6
  429. package/src/Icon/index.ts +1 -0
  430. package/src/Icon/useIcon.ts +9 -2
  431. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  432. package/src/Indicator/Indicator.doc.mjs +2 -0
  433. package/src/Item/Item.tsx +2 -7
  434. package/src/Kbd/Kbd.test.tsx +0 -17
  435. package/src/Kbd/Kbd.tsx +2 -26
  436. package/src/Layer/gestureCounter.ts +57 -0
  437. package/src/Layer/useLayer.test.tsx +368 -16
  438. package/src/Layer/useLayer.tsx +208 -35
  439. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  440. package/src/List/List.test.tsx +38 -0
  441. package/src/List/List.tsx +8 -1
  442. package/src/Markdown/Markdown.test.tsx +37 -0
  443. package/src/Markdown/Markdown.tsx +16 -5
  444. package/src/Markdown/parser.test.ts +33 -0
  445. package/src/Markdown/parser.ts +9 -3
  446. package/src/MetadataList/MetadataList.test.tsx +75 -2
  447. package/src/MetadataList/MetadataListItem.tsx +5 -2
  448. package/src/MultiSelector/MultiSelector.doc.mjs +22 -1
  449. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  450. package/src/MultiSelector/MultiSelector.tsx +103 -16
  451. package/src/MultiSelector/hooks.ts +9 -2
  452. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  453. package/src/NavIcon/NavIcon.test.tsx +9 -0
  454. package/src/NavIcon/NavIcon.tsx +5 -1
  455. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  456. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  457. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  458. package/src/NumberInput/NumberInput.doc.mjs +26 -7
  459. package/src/NumberInput/NumberInput.test.tsx +563 -8
  460. package/src/NumberInput/NumberInput.tsx +77 -131
  461. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  462. package/src/NumberInput/numberInputCommit.ts +103 -0
  463. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  464. package/src/NumberInput/numberParser.test.ts +222 -0
  465. package/src/NumberInput/numberParser.ts +403 -0
  466. package/src/Outline/Outline.tsx +2 -4
  467. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  468. package/src/OverflowList/OverflowList.test.tsx +550 -4
  469. package/src/OverflowList/OverflowList.tsx +100 -2
  470. package/src/Pagination/Pagination.test.tsx +3 -2
  471. package/src/Popover/Popover.doc.mjs +2 -2
  472. package/src/Popover/Popover.test.tsx +38 -0
  473. package/src/Popover/Popover.tsx +28 -66
  474. package/src/Popover/usePopover.tsx +44 -5
  475. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  476. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  477. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  478. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  479. package/src/PowerSearch/formatFilterValue.ts +2 -0
  480. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  481. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  482. package/src/ProgressBar/ProgressBar.tsx +28 -8
  483. package/src/Resizable/Resizable.doc.mjs +2 -2
  484. package/src/Resizable/useResizable.doc.mjs +21 -2
  485. package/src/Resizable/useResizable.test.ts +421 -0
  486. package/src/Resizable/useResizable.ts +133 -48
  487. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  488. package/src/SelectableCard/SelectableCard.tsx +16 -0
  489. package/src/Selector/Selector.doc.mjs +14 -0
  490. package/src/Selector/Selector.source-build.test.mjs +65 -0
  491. package/src/Selector/Selector.test.tsx +301 -0
  492. package/src/Selector/Selector.tsx +145 -32
  493. package/src/Selector/hooks.ts +17 -2
  494. package/src/SideNav/SideNav.doc.mjs +2 -2
  495. package/src/SideNav/SideNav.test.tsx +1069 -6
  496. package/src/SideNav/SideNav.tsx +109 -38
  497. package/src/SideNav/SideNavHeading.tsx +5 -2
  498. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  499. package/src/SideNav/SideNavItem.tsx +134 -44
  500. package/src/Slider/Slider.test.tsx +106 -1
  501. package/src/Slider/Slider.tsx +52 -1
  502. package/src/Spinner/Spinner.doc.mjs +17 -5
  503. package/src/Spinner/Spinner.test.tsx +164 -0
  504. package/src/Spinner/Spinner.tsx +252 -22
  505. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  506. package/src/StatusDot/StatusDot.test.tsx +9 -0
  507. package/src/StatusDot/StatusDot.tsx +7 -1
  508. package/src/Stepper/Step.doc.mjs +1 -1
  509. package/src/Stepper/Step.tsx +7 -14
  510. package/src/Switch/Switch.doc.mjs +2 -0
  511. package/src/Switch/Switch.test.tsx +10 -0
  512. package/src/Switch/Switch.tsx +3 -0
  513. package/src/Table/BaseTable.tsx +6 -1
  514. package/src/Table/Table.doc.mjs +5 -3
  515. package/src/Table/Table.tsx +3 -8
  516. package/src/Table/TableBody.doc.mjs +2 -2
  517. package/src/Table/TableFooter.doc.mjs +1 -1
  518. package/src/Table/TableHeader.doc.mjs +1 -1
  519. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  520. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  521. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  522. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  523. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  524. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  525. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  526. package/src/Table/useTablePagination.doc.mjs +1 -1
  527. package/src/Table/useTableSelection.doc.mjs +1 -1
  528. package/src/Text/Text.test.tsx +44 -0
  529. package/src/Text/Text.tsx +0 -1
  530. package/src/TextArea/TextArea.doc.mjs +12 -2
  531. package/src/TextArea/TextArea.test.tsx +11 -0
  532. package/src/TextArea/TextArea.tsx +34 -22
  533. package/src/Timestamp/Timestamp.test.tsx +89 -0
  534. package/src/Timestamp/Timestamp.tsx +8 -8
  535. package/src/Timestamp/formatInstant.ts +5 -0
  536. package/src/Toast/Toast.doc.mjs +213 -44
  537. package/src/Toast/Toast.tsx +118 -23
  538. package/src/Toast/ToastViewport.test.tsx +1434 -8
  539. package/src/Toast/ToastViewport.tsx +85 -14
  540. package/src/Toast/index.ts +2 -0
  541. package/src/Toast/types.ts +43 -5
  542. package/src/Toast/useToastGesture.ts +361 -0
  543. package/src/Token/Token.test.tsx +95 -0
  544. package/src/Token/Token.tsx +19 -17
  545. package/src/Token/TokenLink.tsx +12 -3
  546. package/src/Tokenizer/Tokenizer.doc.mjs +16 -3
  547. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  548. package/src/Tokenizer/Tokenizer.tsx +49 -24
  549. package/src/TopNav/TopNavHeading.tsx +2 -2
  550. package/src/TopNav/TopNavItem.tsx +3 -7
  551. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  552. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  553. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  554. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  555. package/src/TopNav/TopNavMenu.tsx +38 -5
  556. package/src/TreeList/TreeList.test.tsx +49 -0
  557. package/src/TreeList/TreeList.tsx +7 -2
  558. package/src/TreeList/TreeListItem.tsx +2 -7
  559. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  560. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  561. package/src/Typeahead/Typeahead.doc.mjs +6 -0
  562. package/src/Typeahead/Typeahead.test.tsx +154 -0
  563. package/src/Typeahead/Typeahead.tsx +9 -0
  564. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  565. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  566. package/src/hooks/useAnnounce.doc.mjs +96 -0
  567. package/src/hooks/useDevWarning.doc.mjs +96 -0
  568. package/src/hooks/useHotkeys.test.ts +0 -18
  569. package/src/hooks/useHotkeys.ts +3 -25
  570. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  571. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  572. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  573. package/src/hooks/useLongPress.doc.mjs +123 -0
  574. package/src/hooks/useOverflow.doc.mjs +58 -17
  575. package/src/hooks/useOverflow.ts +16 -4
  576. package/src/hooks/useTypeahead.doc.mjs +153 -0
  577. package/src/index.ts +2 -0
  578. package/src/raw-import.d.ts +14 -0
  579. package/src/theme/Theme.test.tsx +104 -2
  580. package/src/theme/Theme.tsx +49 -14
  581. package/src/theme/defineTheme.test.ts +23 -0
  582. package/src/theme/defineTheme.ts +12 -3
  583. package/src/theme/derivedVarRegistry.test.ts +87 -3
  584. package/src/theme/derivedVarRegistry.ts +23 -4
  585. package/src/theme/generateThemeRules.test.ts +99 -1
  586. package/src/theme/generateThemeRules.ts +28 -0
  587. package/src/theme/syntax/tokens.ts +5 -2
  588. package/src/theme/useTheme.test.tsx +10 -0
  589. package/src/theme/useTheme.ts +16 -10
  590. package/src/utils/dateParser.test.ts +34 -2
  591. package/src/utils/dateParser.ts +11 -14
  592. package/src/utils/focusOutline.stylex.ts +50 -0
  593. package/src/utils/interactionOverlay.stylex.ts +74 -0
  594. package/src/utils/isApplePlatform.test.ts +61 -0
  595. package/src/utils/isApplePlatform.ts +37 -0
  596. package/src/utils/plainDate.test.ts +46 -0
  597. package/src/utils/plainDate.ts +18 -3
@@ -0,0 +1,350 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file numberParser.ts
5
+ * @input Text a person typed or pasted, plus the resolved BCP 47 locale
6
+ * @output Exports parseLocaleNumber and formatEditableNumber
7
+ * @position Internal to NumberInput; not part of the public surface
8
+ *
9
+ * People paste numbers out of spreadsheets, and a spreadsheet writes them
10
+ * grouped, signed, and decorated. This reads those back. Everything locale
11
+ * specific — the grouping and decimal separators, the group sizes, the digit
12
+ * script — is derived from Intl and Unicode rather than a table, and text that
13
+ * no reading fits returns null so the field stays visibly invalid instead of
14
+ * committing a guess. Where both readings are well formed the locale's wins,
15
+ * the way utils/dateParser.ts settles an ambiguous date by locale preference.
16
+ * Grouping is well formed only when every group fits the locale's own sizes:
17
+ * the last exactly the primary size, each inner one exactly the secondary, the
18
+ * first no longer than that. So de-DE `1.234` is 1234, while `1.2345` (last
19
+ * group too long) and `1234.567` (too much ahead of it) keep the full stop as
20
+ * a decimal point. Groups of three fit every locale, so a separator repeated
21
+ * with three-digit groups is grouping in all of them and `1,234,567` reads the
22
+ * same everywhere; for a space or apostrophe, which no locale writes as a
23
+ * decimal point, one occurrence is enough, so en-US `1 234` is 1234.
24
+ *
25
+ * That paragraph is executable: numberParser.docblock.test.ts implements it as
26
+ * code, quote by quote, and fails when the parser and the words disagree.
27
+ *
28
+ * Which characters may separate digits at all is the one thing that is NOT
29
+ * read off the input: SEPARATOR_CHARS below is a bounded alphabet, the same
30
+ * shape utils/dateParser.ts uses for its `[-/.]` date separators.
31
+ *
32
+ * SYNC: When modified, update these files to stay in sync:
33
+ * - /packages/core/src/NumberInput/NumberInput.tsx
34
+ * - /packages/core/src/NumberInput/numberParser.test.ts
35
+ * - /packages/core/src/NumberInput/numberParser.docblock.test.ts
36
+ */
37
+
38
+ const symbolsByLocale = new Map();
39
+ function getLocaleNumberSymbols(locale) {
40
+ const key = locale ?? '';
41
+ let symbols = symbolsByLocale.get(key);
42
+ if (symbols === undefined) {
43
+ let format;
44
+ try {
45
+ format = new Intl.NumberFormat(locale);
46
+ } catch {
47
+ format = new Intl.NumberFormat('en');
48
+ }
49
+ const parts = format.formatToParts(12345.6);
50
+ // A probe long enough to expose a second grouping size where one exists.
51
+ const groupSizes = format.formatToParts(11111111111).filter(part => part.type === 'integer').map(part => part.value.length);
52
+ const hasGrouping = groupSizes.length > 1;
53
+ symbols = {
54
+ // Normalized so the space-family separators compare equal to the plain
55
+ // space that input text is normalized to.
56
+ group: (parts.find(p => p.type === 'group')?.value ?? ',').normalize('NFKC'),
57
+ decimal: parts.find(p => p.type === 'decimal')?.value ?? '.',
58
+ primaryGroupSize: hasGrouping ? groupSizes[groupSizes.length - 1] : 3,
59
+ secondaryGroupSize: hasGrouping ? groupSizes[groupSizes.length - 2] : 3
60
+ };
61
+ symbolsByLocale.set(key, symbols);
62
+ }
63
+ return symbols;
64
+ }
65
+
66
+ // Built at runtime rather than written as literals: Babel's
67
+ // transform-unicode-property-regex rewrites a `\p{...}` regex LITERAL into an
68
+ // enumerated character class, and the copy bundled with Next rejects the
69
+ // General_Category short names, failing the sandbox build. Property escapes are
70
+ // ES2018 and need no transform in any browser this package supports.
71
+ const DECIMAL_DIGIT = new RegExp('\\p{Nd}', 'u');
72
+ const CURRENCY = new RegExp('\\p{Sc}', 'u');
73
+ // Zero-width joiners, bidi isolates and the BOM Excel prepends.
74
+ const INVISIBLES = /[\u200B-\u200D\u200E\u200F\u061C\u2066-\u2069\uFEFF]/g;
75
+ // Hyphen last: inside the character class this builds, a leading one would
76
+ // open a range.
77
+ const MINUS_SIGNS = '\u2212\u2012\u2013-';
78
+
79
+ /**
80
+ * Every character a locale writes between digits. Sweeping every language ICU
81
+ * resolves, in every region, yields seven: comma, full stop, apostrophe,
82
+ * space (the whole space family folds to it under NFKC), the Arabic decimal
83
+ * and thousands separators, and U+060C — which only nqo writes, and which
84
+ * this alphabet leaves out. U+2019 is here in its place: no locale writes it,
85
+ * but the corpus pins it as the Swiss spelling.
86
+ *
87
+ * The alphabet is bounded on purpose. Read the candidates off the input
88
+ * instead and any repeated character is grouping, so a hyphenated ID commits
89
+ * as a number. It bounds characters and not shapes: a full stop is a real
90
+ * separator, so `192.168.100.200` is four well-formed groups.
91
+ */
92
+ const SEPARATOR_CHARS = ",.' \u2019\u066B\u066C";
93
+ const NUMBER_BODY = new RegExp(`^[0-9${SEPARATOR_CHARS}]+$`);
94
+ /** No grouping and at most one full stop: the format `Number()` reads. */
95
+ const MACHINE_NUMBER = /^(?:\d+\.?\d*|\.\d+)$/;
96
+
97
+ /**
98
+ * Value of any Unicode decimal digit. Each digit script lays its ten digits
99
+ * out consecutively, so walking back to the script's zero derives the value
100
+ * for Arabic-Indic, Devanagari, full-width and the rest without shipping a
101
+ * table of them. Returns null in the one shape the walk cannot resolve: two
102
+ * digit blocks adjacent in code space (the mathematical alphanumerics).
103
+ */
104
+ function digitValue(char) {
105
+ const codePoint = char.codePointAt(0);
106
+ if (codePoint == null) {
107
+ return null;
108
+ }
109
+ for (let zero = codePoint; codePoint - zero < 10; zero--) {
110
+ if (!DECIMAL_DIGIT.test(String.fromCodePoint(zero - 1))) {
111
+ return codePoint - zero;
112
+ }
113
+ }
114
+ return null;
115
+ }
116
+ function toAsciiDigits(text) {
117
+ let out = '';
118
+ for (const char of text) {
119
+ if (!DECIMAL_DIGIT.test(char)) {
120
+ out += char;
121
+ continue;
122
+ }
123
+ const value = digitValue(char);
124
+ if (value == null) {
125
+ return null;
126
+ }
127
+ out += String(value);
128
+ }
129
+ return out;
130
+ }
131
+
132
+ /**
133
+ * Reduce a digits-and-separators string to a plain machine number under one
134
+ * candidate reading, or null when it is not well formed under that reading.
135
+ * `minGroups` is how many grouping separators the reading has to see before it
136
+ * believes the separator is grouping at all.
137
+ */
138
+ function readUnder(core, group, decimal, primaryGroupSize, secondaryGroupSize, minGroups) {
139
+ let intText = core;
140
+ let fracText = null;
141
+ if (decimal !== '' && core.includes(decimal)) {
142
+ const at = core.indexOf(decimal);
143
+ if (core.includes(decimal, at + decimal.length)) {
144
+ return null;
145
+ }
146
+ intText = core.slice(0, at);
147
+ fracText = core.slice(at + decimal.length);
148
+ if (!/^\d*$/.test(fracText)) {
149
+ return null;
150
+ }
151
+ }
152
+ let digits;
153
+ if (group !== '' && intText.includes(group)) {
154
+ const chunks = intText.split(group);
155
+ if (chunks.length - 1 < minGroups || !chunks.every(chunk => /^\d+$/.test(chunk))) {
156
+ return null;
157
+ }
158
+ const first = chunks[0];
159
+ const last = chunks[chunks.length - 1];
160
+ if (last.length !== primaryGroupSize || first.length > secondaryGroupSize) {
161
+ return null;
162
+ }
163
+ for (let i = 1; i < chunks.length - 1; i++) {
164
+ if (chunks[i].length !== secondaryGroupSize) {
165
+ return null;
166
+ }
167
+ }
168
+ digits = chunks.join('');
169
+ } else {
170
+ if (!/^\d*$/.test(intText)) {
171
+ return null;
172
+ }
173
+ digits = intText;
174
+ }
175
+ if (digits === '' && (fracText == null || fracText === '')) {
176
+ return null;
177
+ }
178
+ return fracText == null ? digits : `${digits}.${fracText}`;
179
+ }
180
+
181
+ /**
182
+ * A separator that no locale uses as a decimal point, so one well-formed group
183
+ * of it is already unambiguous. Everything else needs two before grouping
184
+ * beats the decimal-point reading.
185
+ */
186
+ function isGroupOnlySeparator(separator) {
187
+ return /^[\s'\u2019]$/.test(separator);
188
+ }
189
+ function toPlainNumber(core, locale) {
190
+ if (!NUMBER_BODY.test(core)) {
191
+ return null;
192
+ }
193
+ const {
194
+ group,
195
+ decimal,
196
+ primaryGroupSize,
197
+ secondaryGroupSize
198
+ } = getLocaleNumberSymbols(locale);
199
+ const inLocale = readUnder(core, group, decimal, primaryGroupSize, secondaryGroupSize, 1);
200
+ if (inLocale != null) {
201
+ return inLocale;
202
+ }
203
+
204
+ // The machine format, which is what the field read before this parser
205
+ // existed. It comes after the locale rather than before it — dateParser.ts
206
+ // can put ISO first because `2026-01-25` has no second reading, while
207
+ // `1.234` in de-DE has one and grouping is the reading a German means. What
208
+ // reaches here is a full stop the locale could NOT read, so it is not
209
+ // well-formed grouping either, and exactly one reading is left.
210
+ if (MACHINE_NUMBER.test(core)) {
211
+ return core;
212
+ }
213
+
214
+ // A repeated separator with three digits after each occurrence can only be
215
+ // grouping — a decimal point appears once — so that shape reads the same in
216
+ // every locale, which is what lets a `1,234,234,234` pasted out of a
217
+ // spreadsheet land in a de-DE app.
218
+ const separators = [...new Set(core.replace(/\d/g, ''))];
219
+ if (separators.length === 0 || separators.length > 2) {
220
+ return null;
221
+ }
222
+ for (const candidate of separators) {
223
+ const occurrences = core.split(candidate).length - 1;
224
+ const minGroups = isGroupOnlySeparator(candidate) ? 1 : 2;
225
+ if (occurrences < minGroups) {
226
+ continue;
227
+ }
228
+ const other = separators.find(s => s !== candidate) ?? '';
229
+ if (other !== '' && core.split(other).length - 1 !== 1) {
230
+ continue;
231
+ }
232
+ const read = readUnder(core, candidate, other, 3, 3, minGroups);
233
+ if (read != null) {
234
+ return read;
235
+ }
236
+ }
237
+ return null;
238
+ }
239
+
240
+ /**
241
+ * Read a number out of text the way a person in `locale` writes one: their
242
+ * grouping and decimal separators, their group sizes, their digit script, an
243
+ * optional currency symbol, and the shapes a spreadsheet pastes.
244
+ *
245
+ * Returns null rather than a guess. Grouping is validated, so en-US `1,23` —
246
+ * a comma that is neither a decimal point nor a well-formed group — is not
247
+ * silently read as 123, and neither is a number written for another locale.
248
+ * Only the characters some locale writes between digits count as separators,
249
+ * so `123-456-789` is not a number at all.
250
+ *
251
+ * @example
252
+ * ```
253
+ * parseLocaleNumber('1,234,234,234', 'en-US') // 1234234234
254
+ * parseLocaleNumber('1,234,234,234', 'de-DE') // 1234234234
255
+ * parseLocaleNumber('1,5', 'de-DE') // 1.5
256
+ * parseLocaleNumber('1.5', 'de-DE') // 1.5
257
+ * parseLocaleNumber('1,5', 'en-US') // null
258
+ * parseLocaleNumber('123-456-789', 'en-US') // null
259
+ * ```
260
+ */
261
+ export function parseLocaleNumber(text, locale) {
262
+ const normalized = toAsciiDigits(text.normalize('NFKC').replace(INVISIBLES, ''));
263
+ if (normalized == null) {
264
+ return null;
265
+ }
266
+ let rest = normalized.trim();
267
+ let sign = 1;
268
+
269
+ // Accounting negatives: spreadsheets write -1234 as (1,234).
270
+ const accounting = /^\((.*)\)$/s.exec(rest);
271
+ if (accounting) {
272
+ sign = -1;
273
+ rest = accounting[1].trim();
274
+ }
275
+ rest = stripCurrency(rest);
276
+
277
+ // The sign lands on either end — RTL locales trail it, and Intl writes
278
+ // U+2212 where a keyboard writes a hyphen.
279
+ let hasWrittenSign = false;
280
+ const leadingSign = new RegExp(`^([+${MINUS_SIGNS}])\\s*`).exec(rest);
281
+ if (leadingSign) {
282
+ hasWrittenSign = true;
283
+ sign = leadingSign[1] === '+' ? sign : -sign;
284
+ rest = rest.slice(leadingSign[0].length);
285
+ } else {
286
+ const trailingSign = new RegExp(`\\s*([+${MINUS_SIGNS}])$`).exec(rest);
287
+ if (trailingSign) {
288
+ hasWrittenSign = true;
289
+ sign = trailingSign[1] === '+' ? sign : -sign;
290
+ rest = rest.slice(0, rest.length - trailingSign[0].length);
291
+ }
292
+ }
293
+
294
+ // The parens already say negative, so a sign inside them contradicts or
295
+ // doubles it: `(-1,234)` is -1234 to one reader and +1234 to another.
296
+ if (accounting && hasWrittenSign) {
297
+ return null;
298
+ }
299
+ rest = stripCurrency(rest);
300
+ let exponent = 0;
301
+ const exponentMatch = /\s*[eE]\s*([+-]?\d+)$/.exec(rest);
302
+ if (exponentMatch) {
303
+ exponent = Number(exponentMatch[1]);
304
+ rest = rest.slice(0, rest.length - exponentMatch[0].length);
305
+ }
306
+ const core = rest.trim();
307
+ if (core === '') {
308
+ return null;
309
+ }
310
+ const plain = toPlainNumber(core, locale);
311
+ if (plain == null) {
312
+ return null;
313
+ }
314
+ const magnitude = Number(plain);
315
+ if (!Number.isFinite(magnitude)) {
316
+ return null;
317
+ }
318
+ const scaled = exponent === 0 ? magnitude :
319
+ // 1.23 * 1e3 is 1229.9999999999998 in binary floating point, and a
320
+ // field that commits that instead of 1230 has not round-tripped.
321
+ Number((magnitude * 10 ** exponent).toPrecision(15));
322
+ if (!Number.isFinite(scaled)) {
323
+ return null;
324
+ }
325
+ const result = sign * scaled;
326
+ return Object.is(result, -0) ? 0 : result;
327
+ }
328
+ function stripCurrency(text) {
329
+ let out = text.trim();
330
+ if (CURRENCY.test(out.charAt(0))) {
331
+ out = out.slice(1).trim();
332
+ }
333
+ if (CURRENCY.test(out.charAt(out.length - 1))) {
334
+ out = out.slice(0, -1).trim();
335
+ }
336
+ return out;
337
+ }
338
+
339
+ /**
340
+ * The text shown while the field is focused: the plain machine number in the
341
+ * locale's decimal separator, so what a person sees mid-edit is what the
342
+ * parser reads back on blur.
343
+ */
344
+ export function formatEditableNumber(value, locale) {
345
+ const {
346
+ decimal
347
+ } = getLocaleNumberSymbols(locale);
348
+ const raw = String(value);
349
+ return decimal === '.' ? raw : raw.replace('.', decimal);
350
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Outline.d.ts","sourceRoot":"","sources":["../../src/Outline/Outline.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAMzC,YAAY,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,WAAW,CAAC;IAC1D,6CAA6C;IAC7C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE7B,+CAA+C;IAC/C,KAAK,EAAE,WAAW,EAAE,CAAC;IAErB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAEhC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAErC;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAEzD;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA+ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,KAAK,EAAE,cAAc,EACrB,OAAmB,EACnB,eAAe,EACf,aAAa,EACb,MAAU,EACV,kBAAkB,EAClB,gBAAuB,EACvB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,MAAM,EACrB,GAAG,KAAK,EACT,EAAE,YAAY,+BAiLd;yBAlMe,OAAO"}
1
+ {"version":3,"file":"Outline.d.ts","sourceRoot":"","sources":["../../src/Outline/Outline.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAOzC,YAAY,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,WAAW,CAAC;IAC1D,6CAA6C;IAC7C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE7B,+CAA+C;IAC/C,KAAK,EAAE,WAAW,EAAE,CAAC;IAErB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAEhC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAErC;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAEzD;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,KAAK,EAAE,cAAc,EACrB,OAAmB,EACnB,eAAe,EACf,aAAa,EACb,MAAU,EACV,kBAAkB,EAClB,gBAAuB,EACvB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,MAAM,EACrB,GAAG,KAAK,EACT,EAAE,YAAY,+BAkLd;yBAnMe,OAAO"}
@@ -33,6 +33,7 @@ import { mergeProps } from "../utils/index.js";
33
33
  import { useScrollSpy } from "./useScrollSpy.js";
34
34
  import { themeProps } from "../utils/themeProps.js";
35
35
  import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
36
+ import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
36
37
  import { useTranslator } from "../i18n/index.js";
37
38
  import { useMergedRefs } from "../hooks/useMergedRefs.js";
38
39
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -71,9 +72,7 @@ const styles = {
71
72
  kzqmXN: "xh8yej3",
72
73
  kGuDYH: "xjm74w1",
73
74
  kLWn49: "xw6l6zx",
74
- kRL5z6: "xoevpu5",
75
75
  kZC7kL: "xo5jvnm",
76
- kSReZ0: "xyxi2l3",
77
76
  $$css: true
78
77
  },
79
78
  activeLink: {
@@ -332,7 +331,7 @@ export function Outline({
332
331
  ...mergeProps(themeProps('outline-item', {
333
332
  active: isActive ? 'active' : null,
334
333
  level: item.level
335
- }), focusOutlineProps.focusVisible(styles.link, densityStyles[density], getIndentStyle(item.level), isActive && styles.activeLink, isActive && styles.activeAnchor)),
334
+ }), focusOutlineProps.focusVisible(styles.link, interactionOverlayStyles.backgroundColor, densityStyles[density], getIndentStyle(item.level), isActive && styles.activeLink, isActive && styles.activeAnchor)),
336
335
  children: /*#__PURE__*/_jsx("span", {
337
336
  ...{
338
337
  className: "xb3r6kr xlyipyv xuxw1ft"
@@ -95,6 +95,46 @@ export interface OverflowListProps extends BaseProps<HTMLDivElement> {
95
95
  * ```
96
96
  */
97
97
  overflowRenderer?: (overflowItems: OverflowItem[]) => ReactNode;
98
+ /**
99
+ * Called with the items that are currently collapsed, whenever that set
100
+ * changes.
101
+ *
102
+ * Use it when the collapsed items belong in a menu the surrounding UI
103
+ * already renders (a row that already has its own "…" button), so the list
104
+ * does not grow a second anchor beside it. `overflowRenderer` cannot serve
105
+ * that case: it is only rendered while items overflow, and its measurement
106
+ * copy always receives every item.
107
+ *
108
+ * The contract:
109
+ * - It fires once measurement has collapsed something, and again with an
110
+ * empty array once the row widens back out and everything fits.
111
+ * - It is **silent while nothing overflows** — including on mount, so a list
112
+ * that fits from the start never calls it. There is no report of the
113
+ * pre-measurement state, which would always be an empty set whether or not
114
+ * the row actually overflows. Hold the collapsed set in state initialised
115
+ * to `[]` and it is correct at every moment; if you remount the list while
116
+ * keeping that state, reset it yourself.
117
+ * - Reports are keyed on the collapsed items' original indices and React
118
+ * keys. Membership and order changes report even when the count stays the
119
+ * same; unrelated re-renders and callback identity changes do not.
120
+ *
121
+ * Give dynamic children stable React keys. Items include their current
122
+ * original `index`; use it to look up your own data rather than storing
123
+ * `child`.
124
+ *
125
+ * @example
126
+ * ```
127
+ * const [hidden, setHidden] = useState<OverflowItem[]>([]);
128
+ * <>
129
+ * <OverflowList onOverflowChange={setHidden}>{items}</OverflowList>
130
+ * <DropdownMenu
131
+ * button={{label: 'More', variant: 'ghost'}}
132
+ * items={[...alwaysThere, ...hidden.map(({index}) => actions[index])]}
133
+ * />
134
+ * </>
135
+ * ```
136
+ */
137
+ onOverflowChange?: (overflowItems: OverflowItem[]) => void;
98
138
  }
99
139
  /**
100
140
  * A horizontal list that hides items that don't fit and shows an overflow indicator.
@@ -117,7 +157,7 @@ export interface OverflowListProps extends BaseProps<HTMLDivElement> {
117
157
  * </OverflowList>
118
158
  * ```
119
159
  */
120
- export declare function OverflowList({ children, gap, minVisibleItems, maxVisibleItems, maxRows, collapseFrom, behavior, overflowRenderer, xstyle, className, style, ref, ...props }: OverflowListProps): import("react").JSX.Element;
160
+ export declare function OverflowList({ children, gap, minVisibleItems, maxVisibleItems, maxRows, collapseFrom, behavior, overflowRenderer, onOverflowChange, xstyle, className, style, ref, ...props }: OverflowListProps): import("react").JSX.Element;
121
161
  export declare namespace OverflowList {
122
162
  var displayName: string;
123
163
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OverflowList.d.ts","sourceRoot":"","sources":["../../src/OverflowList/OverflowList.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAC,KAAK,SAAS,EAAE,KAAK,YAAY,EAAW,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AA+EhD,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,KAAK,EAAE,YAAY,CAAC;IACpB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAClE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC;IAElB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAE/B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC;IAE3C;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,SAAS,CAAC;CACjE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,GAAO,EACP,eAAmB,EACnB,eAAe,EACf,OAAO,EACP,YAAoB,EACpB,QAAwB,EACxB,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,iBAAiB,+BAoFnB;yBAlGe,YAAY"}
1
+ {"version":3,"file":"OverflowList.d.ts","sourceRoot":"","sources":["../../src/OverflowList/OverflowList.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,KAAK,SAAS,EACd,KAAK,YAAY,EAKlB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAgFhD,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,KAAK,EAAE,YAAY,CAAC;IACpB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAClE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC;IAElB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAE/B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC;IAE3C;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,SAAS,CAAC;IAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;CAC5D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,GAAO,EACP,eAAmB,EACnB,eAAe,EACf,OAAO,EACP,YAAoB,EACpB,QAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,iBAAiB,+BAoInB;yBAnJe,YAAY"}
@@ -17,10 +17,11 @@
17
17
  * - /packages/core/src/OverflowList/index.ts (exports if types change)
18
18
  * - /packages/cli/assets/templates/blocks/components/OverflowList/ (showcase blocks)
19
19
  */
20
- import { Children } from 'react';
20
+ import { Children, useCallback, useRef, useState } from 'react';
21
21
  import * as stylex from '@stylexjs/stylex';
22
22
  import { mergeProps } from "../utils/index.js";
23
23
  import { useOverflow } from "../hooks/useOverflow.js";
24
+ import { useIsomorphicLayoutEffect } from "../hooks/useIsomorphicLayoutEffect.js";
24
25
  import "../theme/tokens.stylex.js";
25
26
  import { spacingVars } from "../theme/tokens.stylex.js";
26
27
  import { themeProps } from "../utils/themeProps.js";
@@ -162,6 +163,7 @@ export function OverflowList({
162
163
  collapseFrom = 'end',
163
164
  behavior = 'observeSelf',
164
165
  overflowRenderer,
166
+ onOverflowChange,
165
167
  xstyle,
166
168
  className,
167
169
  style,
@@ -204,9 +206,48 @@ export function OverflowList({
204
206
  // Render a placeholder for measurement — uses all items as overflow
205
207
  // so the indicator renders at its maximum possible width.
206
208
  const measureIndicator = overflowRenderer?.(allItems);
209
+
210
+ // Re-run measurement when keyed children change without resizing the row.
211
+ // The measured key delays reporting until that measurement has committed.
212
+ // Lists without the callback skip all identity work.
213
+ const measurementKey = onOverflowChange ? JSON.stringify({
214
+ children: childArray.map((child, index) => [index, child.key]),
215
+ gap,
216
+ minVisibleItems,
217
+ maxVisibleItems,
218
+ maxRows,
219
+ collapseFrom,
220
+ behavior
221
+ }) : '';
222
+ const [measuredKey, setMeasuredKey] = useState(measurementKey);
223
+ const reportMeasureRef = useCallback(element => {
224
+ measureRef(element);
225
+ if (element) {
226
+ setMeasuredKey(measurementKey);
227
+ }
228
+ }, [measureRef, measurementKey]);
229
+
230
+ // Report after measurement, before paint, so a standing menu updates in the
231
+ // same frame as the visible row. Keys distinguish membership and order while
232
+ // suppressing callback-only or unrelated re-renders. The initial empty key
233
+ // suppresses the optimistic pre-measurement render.
234
+ const overflowKey = onOverflowChange ? JSON.stringify(overflowItems.map(({
235
+ child,
236
+ index
237
+ }) => [index, child.key])) : '[]';
238
+ const reportedKeyRef = useRef('[]');
239
+ const overflowItemsRef = useRef(overflowItems);
240
+ overflowItemsRef.current = overflowItems;
241
+ useIsomorphicLayoutEffect(() => {
242
+ if (!onOverflowChange || measuredKey !== measurementKey || reportedKeyRef.current === overflowKey) {
243
+ return;
244
+ }
245
+ reportedKeyRef.current = overflowKey;
246
+ onOverflowChange(overflowItemsRef.current);
247
+ }, [measuredKey, measurementKey, overflowKey, onOverflowChange]);
207
248
  return /*#__PURE__*/_jsxs(_Fragment, {
208
249
  children: [/*#__PURE__*/_jsxs("div", {
209
- ref: measureRef,
250
+ ref: reportMeasureRef,
210
251
  "aria-hidden": "true",
211
252
  inert: true,
212
253
  ...stylex.props(styles.measureContainer, gapStyles[gap]),
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/Popover/Popover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EAGZ,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AA4BtE;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,sCAAsC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,+DAA+D;IAC/D,eAAe,EAAE,QAAQ,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CACxC,SAAS,EACT,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC;IACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,yBAAyB,KAAK,SAAS,CAAC,CAAC;IAEzE;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEzC;;OAEG;IACH,OAAO,EAAE,SAAS,CAAC;IAEnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAmB,EACnB,SAAmB,EACnB,MAAM,EACN,YAAY,EACZ,SAAgB,EAChB,KAAK,EACL,KAAK,EACL,IAAe,EACf,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,eAAsB,EACtB,gBAAuB,EACvB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,GACtB,EAAE,YAAY,GAAG,YAAY,CAuR7B;yBA7Se,OAAO"}
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/Popover/Popover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EAGZ,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AA2BtE;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,sCAAsC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,+DAA+D;IAC/D,eAAe,EAAE,QAAQ,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CACxC,SAAS,EACT,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC;IACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,yBAAyB,KAAK,SAAS,CAAC,CAAC;IAEzE;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEzC;;OAEG;IACH,OAAO,EAAE,SAAS,CAAC;IAEnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAmB,EACnB,SAAmB,EACnB,MAAM,EACN,YAAY,EACZ,SAAgB,EAChB,KAAK,EACL,KAAK,EACL,IAAe,EACf,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,eAAsB,EACtB,gBAAuB,EACvB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,GACtB,EAAE,YAAY,GAAG,YAAY,CAkP7B;yBAxQe,OAAO"}
@@ -19,14 +19,12 @@
19
19
  import React, { useCallback, useRef } from 'react';
20
20
  import { useIsomorphicLayoutEffect } from "../hooks/useIsomorphicLayoutEffect.js";
21
21
  import * as stylex from '@stylexjs/stylex';
22
- import { mergeProps } from "../utils/index.js";
23
22
  import { devWarn } from "../utils/devWarning.js";
24
23
  import { usePopover } from "./usePopover.js";
25
24
  import { layerAnimations } from "../Layer/layerAnimations.stylex.js";
26
25
  import "../theme/tokens.stylex.js";
27
26
  import { spacingVars } from "../theme/tokens.stylex.js";
28
27
  import { InteractiveRoleContext } from "../InteractiveRoleContext/InteractiveRoleContext.js";
29
- import { themeProps } from "../utils/themeProps.js";
30
28
 
31
29
  // =============================================================================
32
30
  // Helpers
@@ -142,14 +140,10 @@ export function Popover({
142
140
  }) {
143
141
  const wrapperRef = useRef(null);
144
142
  const isControlled = isOpen !== undefined;
145
- // Track when the popover was last hidden by light dismiss to prevent
146
- // the trigger click from immediately re-opening it.
147
- const lastHideTimeRef = useRef(0);
148
143
  const handlePopoverShow = useCallback(() => {
149
144
  onOpenChange?.(true);
150
145
  }, [onOpenChange]);
151
146
  const handlePopoverHide = useCallback(() => {
152
- lastHideTimeRef.current = Date.now();
153
147
  onOpenChange?.(false);
154
148
  }, [onOpenChange]);
155
149
  const popover = usePopover({
@@ -161,6 +155,13 @@ export function Popover({
161
155
  hasCloseButton,
162
156
  closeButtonLabel,
163
157
  hasAutoFocus,
158
+ // The surface is the box that paints background, radius and elevation, so
159
+ // it is the element the `popover` theme target has to sit on — a target on
160
+ // the content div inside it styles a box that paints nothing.
161
+ surfaceTarget: 'popover',
162
+ xstyle: [styles.contentPadding, xstyle],
163
+ className,
164
+ style,
164
165
  onShow: handlePopoverShow,
165
166
  onHide: handlePopoverHide
166
167
  });
@@ -170,11 +171,7 @@ export function Popover({
170
171
  if (!isEnabled) {
171
172
  return;
172
173
  }
173
- // If the popover was just closed by light dismiss (clicking outside),
174
- // the trigger click fires in the same event — skip re-opening.
175
- if (Date.now() - lastHideTimeRef.current < 50) {
176
- return;
177
- }
174
+ // `toggle` absorbs a click that belongs to its own light dismiss.
178
175
  popover.toggle();
179
176
  }, [isEnabled, popover]);
180
177
 
@@ -299,7 +296,6 @@ export function Popover({
299
296
  return /*#__PURE__*/_jsx(_Fragment, {
300
297
  children: popover.render(/*#__PURE__*/_jsx("div", {
301
298
  "data-testid": testId,
302
- ...mergeProps(themeProps('popover'), stylex.props(styles.contentPadding, xstyle), className, style),
303
299
  children: content
304
300
  }), {
305
301
  placement,
@@ -323,7 +319,6 @@ export function Popover({
323
319
  return /*#__PURE__*/_jsxs(_Fragment, {
324
320
  children: [children(triggerProps), popover.render(/*#__PURE__*/_jsx("div", {
325
321
  "data-testid": testId,
326
- ...mergeProps(themeProps('popover'), stylex.props(styles.contentPadding, xstyle), className, style),
327
322
  children: content
328
323
  }), {
329
324
  placement,
@@ -347,7 +342,6 @@ export function Popover({
347
342
  })
348
343
  }), popover.render(/*#__PURE__*/_jsx("div", {
349
344
  "data-testid": testId,
350
- ...mergeProps(themeProps('popover'), stylex.props(styles.contentPadding, xstyle), className, style),
351
345
  children: content
352
346
  }), {
353
347
  placement,