@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
@@ -9,8 +9,9 @@
9
9
  * @position Core hook; used by OverflowList and consumers for overflow patterns
10
10
  *
11
11
  * Measures children rendered in a hidden container to determine how many fit
12
- * in the available width, without flickering. Uses ResizeObserver to react
13
- * to container size changes. Supports an optional item cap (`maxVisibleItems`)
12
+ * in the available width, without flickering. Observes both the visible and
13
+ * hidden measurement containers so changes to available width or measured child
14
+ * sizes recalculate the result. Supports an optional item cap (`maxVisibleItems`)
14
15
  * and bounded multi-row wrapping (`maxRows`); the fit/clamp/row-packing math
15
16
  * lives in the pure `computeOverflow` helper.
16
17
  *
@@ -136,6 +137,7 @@ export function useOverflow(
136
137
  const containerElRef = useRef<HTMLElement | null>(null);
137
138
  const measureElRef = useRef<HTMLElement | null>(null);
138
139
  const observedElRef = useRef<HTMLElement | null>(null);
140
+ const observedMeasureElRef = useRef<HTMLElement | null>(null);
139
141
 
140
142
  const calculate = useCallback(() => {
141
143
  const container = containerElRef.current;
@@ -236,10 +238,20 @@ export function useOverflow(
236
238
 
237
239
  const measureRef = useCallback(
238
240
  (el: HTMLElement | null) => {
241
+ if (observedMeasureElRef.current) {
242
+ unobserveResize(observedMeasureElRef.current);
243
+ observedMeasureElRef.current = null;
244
+ }
245
+
239
246
  measureElRef.current = el;
240
- if (el) {
241
- calculate();
247
+ if (!el) {
248
+ return;
242
249
  }
250
+
251
+ observeResize(el, () => {
252
+ calculate();
253
+ });
254
+ observedMeasureElRef.current = el;
243
255
  },
244
256
  [calculate],
245
257
  );
@@ -0,0 +1,153 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /** @type {import('@astryxdesign/cli/authoring').HookDoc} */
4
+ export const docs = {
5
+ name: 'useTypeahead',
6
+ displayName: 'useTypeahead',
7
+ keywords: [
8
+ 'typeahead',
9
+ 'type to focus',
10
+ 'first character',
11
+ 'keyboard',
12
+ 'search',
13
+ 'jump',
14
+ 'menu',
15
+ 'listbox',
16
+ 'select',
17
+ 'apg',
18
+ 'accessibility',
19
+ 'a11y',
20
+ ],
21
+ params: [
22
+ {
23
+ name: 'options',
24
+ type: 'UseTypeaheadOptions',
25
+ description: 'Configuration object.',
26
+ required: true,
27
+ },
28
+ {
29
+ name: 'options.getItemLabels',
30
+ type: '() => ReadonlyArray<string | null | undefined>',
31
+ description:
32
+ "Returns the item labels in DOM order. A null or empty entry marks a non-matchable slot and keeps indices aligned with the caller's items.",
33
+ required: true,
34
+ },
35
+ {
36
+ name: 'options.onMatch',
37
+ type: '(index: number) => void',
38
+ description:
39
+ "Called with the index of the matched item so the caller can focus or select it; typically useListFocus's focusItem.",
40
+ required: true,
41
+ },
42
+ {
43
+ name: 'options.getCurrentIndex',
44
+ type: '() => number',
45
+ description:
46
+ 'The index to search from, usually the focused item, so repeated presses of one letter cycle through matches. A negative value means nothing is current.',
47
+ default: '() => -1',
48
+ },
49
+ {
50
+ name: 'options.resetMs',
51
+ type: 'number',
52
+ description:
53
+ 'Milliseconds of inactivity after which the typed buffer resets.',
54
+ default: '750',
55
+ },
56
+ {
57
+ name: 'options.isDisabled',
58
+ type: '(index: number) => boolean',
59
+ description: 'Whether an index should be skipped, e.g. disabled items.',
60
+ },
61
+ ],
62
+ returns: [
63
+ {
64
+ name: 'onKeyDown',
65
+ type: '(e: React.KeyboardEvent | KeyboardEvent) => boolean',
66
+ description:
67
+ 'Keydown handler. Returns true when it consumed a printable character, so the caller can stop its own key handling.',
68
+ },
69
+ {
70
+ name: 'reset',
71
+ type: '() => void',
72
+ description:
73
+ 'Clears the pending buffer, e.g. when the collection closes.',
74
+ },
75
+ ],
76
+ usage: {
77
+ description:
78
+ "Adds APG type-to-focus search to a collection: printable keystrokes are buffered (resetting after a pause), and the first item whose label starts with the buffer is reported through onMatch. Pressing the same letter repeatedly cycles through the matches rather than filtering deeper. It moves nothing itself; pair it with the collection's own focus management, most often useListFocus or useGridFocus.",
79
+ bestPractices: [
80
+ {
81
+ guidance: true,
82
+ description:
83
+ 'Wire onMatch to the focus manager you already have (useListFocus.focusItem) instead of moving focus yourself.',
84
+ },
85
+ {
86
+ guidance: true,
87
+ description:
88
+ 'Let it see the key event first and fall through to arrow-key navigation only when it returns false.',
89
+ },
90
+ {
91
+ guidance: true,
92
+ description:
93
+ 'Pass getCurrentIndex so repeated presses of one letter walk through matches instead of sticking on the first.',
94
+ },
95
+ {
96
+ guidance: false,
97
+ description:
98
+ 'Use it on a text input; the field already receives the characters, and typeahead would fight the value.',
99
+ },
100
+ ],
101
+ },
102
+ relatedComponents: ['DropdownMenu', 'Selector', 'TreeList'],
103
+ relatedHooks: ['useListFocus', 'useGridFocus', 'useTreeFocus'],
104
+ importPath: '@astryxdesign/core/hooks',
105
+ category: 'focus',
106
+ };
107
+
108
+ /** @type {import('@astryxdesign/cli/authoring').HookTranslationDoc} */
109
+ export const docsDense = {
110
+ description:
111
+ 'APG type-to-focus search for a collection. Buffers printable keys (resets after pause), matches labels by prefix, reports index via onMatch. Same letter pressed repeatedly cycles matches. Moves nothing itself; pair w/ useListFocus / useGridFocus.',
112
+ paramDescriptions: {
113
+ options: 'config.',
114
+ 'options.getItemLabels':
115
+ 'item labels in DOM order; null / empty = non-matchable slot, indices stay aligned.',
116
+ 'options.onMatch':
117
+ 'called w/ matched index so caller focuses / selects (e.g. useListFocus focusItem).',
118
+ 'options.getCurrentIndex':
119
+ 'index to search from (usually focused item) so repeat presses cycle. negative = nothing current.',
120
+ 'options.resetMs': 'ms of inactivity before typed buffer resets.',
121
+ 'options.isDisabled': 'whether an index is skipped (e.g. disabled items).',
122
+ },
123
+ returnDescriptions: {
124
+ onKeyDown:
125
+ 'keydown handler; true = consumed a printable char, caller can stop its own handling.',
126
+ reset: 'clears pending buffer (e.g. on close).',
127
+ },
128
+ usage: {
129
+ description:
130
+ 'Type-to-jump for menus / listboxes / trees. Buffered prefix match w/ APG same-letter cycling; reports index, caller owns focus.',
131
+ bestPractices: [
132
+ {
133
+ guidance: true,
134
+ description:
135
+ 'Wire onMatch to existing focus manager (useListFocus.focusItem), do not move focus yourself.',
136
+ },
137
+ {
138
+ guidance: true,
139
+ description:
140
+ 'Give it the key event first; fall through to arrow navigation when it returns false.',
141
+ },
142
+ {
143
+ guidance: true,
144
+ description:
145
+ 'Pass getCurrentIndex so repeat presses walk matches instead of sticking on first.',
146
+ },
147
+ {
148
+ guidance: false,
149
+ description: 'Use on a text input; field already gets the characters.',
150
+ },
151
+ ],
152
+ },
153
+ };
@@ -23,6 +23,7 @@
23
23
  */
24
24
 
25
25
  import {createContext} from 'react';
26
+ import {getResolve} from './resolve';
26
27
  import type {Locale, MessagesByLocale, Overrides} from './types';
27
28
 
28
29
  export interface InternationalizationContextValue {
@@ -30,6 +31,7 @@ export interface InternationalizationContextValue {
30
31
  direction: 'ltr' | 'rtl';
31
32
  messages: MessagesByLocale;
32
33
  overrides?: Overrides;
34
+ translate: ReturnType<typeof getResolve>;
33
35
  }
34
36
 
35
37
  /**
@@ -41,5 +43,6 @@ export const InternationalizationContext =
41
43
  locale: 'en',
42
44
  direction: 'ltr',
43
45
  messages: {},
46
+ translate: getResolve('en', {}),
44
47
  });
45
48
  InternationalizationContext.displayName = 'InternationalizationContext';
@@ -23,6 +23,7 @@ import {useMemo, type ReactNode} from 'react';
23
23
  import {InternationalizationContext} from './InternationalizationContext';
24
24
  import {getLocaleDirection} from './getLocaleDirection';
25
25
  import type {Locale, MessagesByLocale, Overrides} from './types';
26
+ import {getResolve} from './resolve';
26
27
 
27
28
  export interface InternationalizationProviderProps {
28
29
  /**
@@ -85,7 +86,13 @@ export function InternationalizationProvider({
85
86
  }: InternationalizationProviderProps) {
86
87
  const direction = dir ?? getLocaleDirection(locale);
87
88
  const value = useMemo(
88
- () => ({locale, direction, messages: messages ?? {}, overrides}),
89
+ () => ({
90
+ locale,
91
+ direction,
92
+ messages: messages ?? {},
93
+ overrides,
94
+ translate: getResolve(locale, messages ?? {}, overrides),
95
+ }),
89
96
  [locale, direction, messages, overrides],
90
97
  );
91
98
  return (
@@ -9,9 +9,16 @@
9
9
  */
10
10
 
11
11
  import {describe, expect, test, beforeEach, vi} from 'vitest';
12
- import {__resetForTests, resolve, resolveLocaleChain} from '../resolve';
12
+ import {__resetForTests, getResolve, resolveLocaleChain} from '../resolve';
13
13
  import type {Catalog, MessagesByLocale, Overrides} from '../types';
14
14
 
15
+ const resolve = (
16
+ ...[key, values, locale, messages, overrides]: [
17
+ ...Parameters<ReturnType<typeof getResolve>>,
18
+ ...Parameters<typeof getResolve>,
19
+ ]
20
+ ) => getResolve(locale, messages, overrides)(key, values);
21
+
15
22
  // Reset caches between tests so warn-once and formatter cache don't bleed.
16
23
  beforeEach(() => {
17
24
  __resetForTests();
@@ -209,6 +216,21 @@ describe('resolve — overrides', () => {
209
216
  // Should fall through to en since fr has no messages and es override doesn't apply
210
217
  expect(out).toBe('Go to next page');
211
218
  });
219
+
220
+ test('override `pt` should take precedence over message `pt-BR`', () => {
221
+ const overrides: Overrides = {
222
+ pt: {key: 'override'},
223
+ };
224
+ const messages: MessagesByLocale = {
225
+ 'pt-BR': {
226
+ key: {
227
+ defaultMessage: 'shipped',
228
+ },
229
+ },
230
+ };
231
+ const out = resolve('key', undefined, 'pt-BR', messages, overrides);
232
+ expect(out).toBe('override');
233
+ });
212
234
  });
213
235
 
214
236
  describe('resolve — ICU MessageFormat', () => {
@@ -73,74 +73,71 @@ export function resolveLocaleChain(locale: Locale): Locale[] {
73
73
  return chain;
74
74
  }
75
75
 
76
- function lookup(
77
- key: string,
76
+ function getLookup(
78
77
  locale: Locale,
79
78
  messages: MessagesByLocale,
80
- overrides: Overrides | undefined,
81
- ): string | null {
79
+ overrides?: Overrides,
80
+ ): Record<string, string> {
81
+ const lookup: Record<string, string> = {};
82
82
  const chain = resolveLocaleChain(locale);
83
-
84
83
  // 1 + 2. Overrides (most specific to least specific in the chain)
85
84
  if (overrides !== undefined) {
86
85
  for (const tag of chain) {
87
- const value = overrides[tag]?.[key];
88
- if (value !== undefined) {
89
- return value;
86
+ if (overrides[tag]) {
87
+ for (const [key, value] of Object.entries(overrides[tag])) {
88
+ if (lookup[key] === undefined && value !== null) {
89
+ lookup[key] = value;
90
+ }
91
+ }
90
92
  }
91
93
  }
92
94
  }
93
-
94
- // 3 + 4. Shipped catalogs (most specific to least specific)
95
95
  for (const tag of chain) {
96
- const entry = messages[tag]?.[key];
97
- if (entry !== undefined) {
98
- return entry.defaultMessage;
96
+ if (messages[tag]) {
97
+ for (const [key, value] of Object.entries(messages[tag])) {
98
+ if (lookup[key] === undefined && value?.defaultMessage !== null) {
99
+ lookup[key] = value?.defaultMessage;
100
+ }
101
+ }
99
102
  }
100
103
  }
101
104
 
102
- // 5. Shipped en catalog — always present
103
- const enEntry = EN_CATALOG[key];
104
- if (enEntry !== undefined) {
105
- return enEntry.defaultMessage;
106
- }
107
-
108
- // 6. Nothing found
109
- return null;
105
+ return lookup;
110
106
  }
111
107
 
112
- export function resolve(
113
- key: string,
114
- values: Record<string, unknown> | undefined,
108
+ export function getResolve(
115
109
  locale: Locale,
116
110
  messages: MessagesByLocale,
117
- overrides: Overrides | undefined,
118
- ): string {
119
- const result = lookup(key, locale, messages, overrides);
120
-
121
- if (result === null) {
122
- // Fires ONLY when a key is missing from every source including the
123
- // shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
124
- // Fallback to `en` from a non-en locale is expected and stays silent,
125
- // matching the FormatJS / i18next default.
126
- warnOnce(
127
- `astryx-i18n:${locale}::${key}`,
128
- 'astryx-i18n',
129
- `missing key: ${key} (locale: ${locale})`,
130
- );
131
- return key;
132
- }
111
+ overrides?: Overrides,
112
+ ) {
113
+ const lookup = getLookup(locale, messages, overrides);
114
+
115
+ return (key: string, values: Record<string, unknown> | undefined) => {
116
+ const result = lookup[key] ?? EN_CATALOG[key]?.defaultMessage;
117
+ if (result === undefined) {
118
+ // Fires ONLY when a key is missing from every source including the
119
+ // shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
120
+ // Fallback to `en` from a non-en locale is expected and stays silent,
121
+ // matching the FormatJS / i18next default.
122
+ warnOnce(
123
+ `astryx-i18n:${locale}::${key}`,
124
+ 'astryx-i18n',
125
+ `missing key: ${key} (locale: ${locale})`,
126
+ );
127
+ return key;
128
+ }
133
129
 
134
- if (values === undefined) {
135
- // Static string — skip the parser entirely for the common case
136
- return result;
137
- }
130
+ if (values === undefined) {
131
+ // Static string — skip the parser entirely for the common case
132
+ return result;
133
+ }
138
134
 
139
- const formatted = getFormatter(result, locale).format(values);
140
- // IntlMessageFormat.format returns string | (string | React elements) — we
141
- // only ever pass string values so it will be a string; assert for the type
142
- // system.
143
- return formatted as string;
135
+ const formatted = getFormatter(result, locale).format(values);
136
+ // IntlMessageFormat.format returns string | (string | React elements) — we
137
+ // only ever pass string values so it will be a string; assert for the type
138
+ // system.
139
+ return formatted as string;
140
+ };
144
141
  }
145
142
 
146
143
  /**
@@ -19,9 +19,8 @@
19
19
  * - /packages/core/src/i18n/t.client.ts
20
20
  */
21
21
 
22
- import {use, useCallback} from 'react';
22
+ import {use} from 'react';
23
23
  import {InternationalizationContext} from './InternationalizationContext';
24
- import {resolve} from './resolve';
25
24
 
26
25
  export type TranslatorFn = (
27
26
  key: string,
@@ -42,9 +41,5 @@ export type TranslatorFn = (
42
41
  */
43
42
  export function useTranslator(): TranslatorFn {
44
43
  const ctx = use(InternationalizationContext);
45
- return useCallback(
46
- (key: string, values?: Record<string, unknown>) =>
47
- resolve(key, values, ctx.locale, ctx.messages, ctx.overrides),
48
- [ctx.locale, ctx.messages, ctx.overrides],
49
- );
44
+ return ctx.translate;
50
45
  }
package/src/index.ts CHANGED
@@ -135,6 +135,8 @@ export type {
135
135
  ToastOptions,
136
136
  ToastDismissFn,
137
137
  ShowToastFn,
138
+ ToastContentRenderProps,
139
+ ToastContentRenderFn,
138
140
  } from './Toast';
139
141
 
140
142
  // Popover component and hook
@@ -0,0 +1,14 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Ambient module declaration for Vite's `?raw` imports.
5
+ *
6
+ * numberParser.docblock.test.ts reads its own subject's source as text, to
7
+ * check the prose in it against the parser's behaviour. Vite serves that with
8
+ * the `?raw` query; without this declaration TypeScript fails with TS2307.
9
+ */
10
+
11
+ declare module '*?raw' {
12
+ const content: string;
13
+ export default content;
14
+ }
@@ -1,10 +1,22 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- import {describe, it, expect, beforeEach, afterEach} from 'vitest';
3
+ import {describe, it, expect, beforeEach, afterEach, vi} from 'vitest';
4
4
  import {render, cleanup} from '@testing-library/react';
5
5
  import React from 'react';
6
6
  import {Theme} from './Theme';
7
7
  import {defineTheme} from './defineTheme';
8
+ import {dataTokenDefaults} from './domainTokens';
9
+ import type * as DefineThemeModule from './defineTheme';
10
+
11
+ const {generateThemeCSSSpy} = vi.hoisted(() => ({
12
+ generateThemeCSSSpy: vi.fn(),
13
+ }));
14
+
15
+ vi.mock('./defineTheme', async importOriginal => {
16
+ const actual = await importOriginal<typeof DefineThemeModule>();
17
+ generateThemeCSSSpy.mockImplementation(actual.generateThemeCSS);
18
+ return {...actual, generateThemeCSS: generateThemeCSSSpy};
19
+ });
8
20
 
9
21
  const testTheme = defineTheme({
10
22
  name: 'test',
@@ -25,6 +37,7 @@ describe('Theme', () => {
25
37
  // Clean up documentElement state before each test
26
38
  document.documentElement.removeAttribute('data-theme');
27
39
  document.documentElement.removeAttribute('data-astryx-theme');
40
+ generateThemeCSSSpy.mockClear();
28
41
  });
29
42
 
30
43
  afterEach(() => {
@@ -120,7 +133,9 @@ describe('Theme', () => {
120
133
  'test',
121
134
  );
122
135
  unmount();
123
- expect(document.documentElement.hasAttribute('data-astryx-theme')).toBe(false);
136
+ expect(document.documentElement.hasAttribute('data-astryx-theme')).toBe(
137
+ false,
138
+ );
124
139
  });
125
140
 
126
141
  // =========================================================================
@@ -166,4 +181,91 @@ describe('Theme', () => {
166
181
  expect(nestedWrapper).toBeTruthy();
167
182
  expect(nestedWrapper?.getAttribute('data-theme')).toBe('light');
168
183
  });
184
+
185
+ // =========================================================================
186
+ // Data token defaults — one shared :root block, not one per theme scope
187
+ // =========================================================================
188
+
189
+ const baseTags = () =>
190
+ Array.from(document.head.querySelectorAll('style[data-astryx-theme-base]'));
191
+
192
+ it('injects the data token defaults into @layer astryx-base', () => {
193
+ render(
194
+ <Theme theme={testTheme}>
195
+ <span>child</span>
196
+ </Theme>,
197
+ );
198
+
199
+ expect(baseTags()).toHaveLength(1);
200
+ const css = baseTags()[0].textContent ?? '';
201
+ expect(css).toContain('@layer astryx-base {');
202
+ expect(css).toContain(':root {');
203
+ expect(css).toContain(
204
+ `--color-data-categorical-blue: ${dataTokenDefaults['--color-data-categorical-blue']};`,
205
+ );
206
+ });
207
+
208
+ it('injects one shared block for nested themes, not one per scope', () => {
209
+ render(
210
+ <Theme theme={testTheme}>
211
+ <Theme theme={altTheme}>
212
+ <span>nested</span>
213
+ </Theme>
214
+ </Theme>,
215
+ );
216
+
217
+ expect(baseTags()).toHaveLength(1);
218
+
219
+ // The nested theme declares no --color-data-* of its own, so nothing
220
+ // shadows a value the parent theme set: that is what lets the override
221
+ // inherit through the ordinary cascade.
222
+ const themeTags = Array.from(
223
+ document.head.querySelectorAll('style[data-astryx-theme]'),
224
+ );
225
+ for (const tag of themeTags) {
226
+ expect(tag.textContent).not.toContain('--color-data-');
227
+ }
228
+ });
229
+
230
+ it('keeps the defaults while any theme is still mounted', () => {
231
+ const outer = render(
232
+ <Theme theme={testTheme}>
233
+ <span>a</span>
234
+ </Theme>,
235
+ );
236
+ render(
237
+ <Theme theme={altTheme}>
238
+ <span>b</span>
239
+ </Theme>,
240
+ );
241
+
242
+ outer.unmount();
243
+ expect(baseTags()).toHaveLength(1);
244
+
245
+ cleanup();
246
+ expect(baseTags()).toHaveLength(0);
247
+ });
248
+
249
+ it('generates a theme once across nested and sibling mounts', () => {
250
+ render(
251
+ <Theme theme={testTheme}>
252
+ <Theme theme={testTheme}>
253
+ <span>nested</span>
254
+ </Theme>
255
+ </Theme>,
256
+ );
257
+ render(
258
+ <Theme theme={testTheme}>
259
+ <span>sibling</span>
260
+ </Theme>,
261
+ );
262
+
263
+ expect(generateThemeCSSSpy).toHaveBeenCalledTimes(1);
264
+ expect(baseTags()).toHaveLength(1);
265
+
266
+ const injected = Array.from(document.querySelectorAll('style'))
267
+ .map(tag => tag.textContent ?? '')
268
+ .join('\n');
269
+ expect(injected.match(/:root\s*\{/g)).toHaveLength(1);
270
+ });
169
271
  });