@astryxdesign/core 0.7.7 → 0.7.8-canary.07ee4b5

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 (682) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +4 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +46 -6
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +11 -3
  6. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheet.js +1 -0
  8. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.js +25 -4
  10. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  11. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  12. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
  13. package/dist/BottomSheet/useMobileKeyboard.js +6 -0
  14. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  15. package/dist/BottomSheet/useSheetGestures.js +12 -1
  16. package/dist/Button/Button.d.ts.map +1 -1
  17. package/dist/Button/Button.js +17 -1
  18. package/dist/Calendar/Calendar.d.ts.map +1 -1
  19. package/dist/Calendar/Calendar.js +18 -22
  20. package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
  21. package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
  22. package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
  23. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  24. package/dist/Calendar/hooks/useCalendarDays.js +2 -10
  25. package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
  26. package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
  27. package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
  28. package/dist/Carousel/Carousel.d.ts.map +1 -1
  29. package/dist/Carousel/Carousel.js +2 -0
  30. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  31. package/dist/Chat/ChatComposerInput.js +6 -1
  32. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  33. package/dist/Chat/ChatMessageList.js +2 -1
  34. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  35. package/dist/Chat/useChatDictation.js +2 -0
  36. package/dist/Chat/useChatNewMessages.js +1 -1
  37. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  38. package/dist/Chat/useChatStreamScroll.js +2 -0
  39. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  40. package/dist/Chat/useSpeechRecognition.js +3 -0
  41. package/dist/Chat/useTriggerMenu.js +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  44. package/dist/CheckboxList/CheckboxList.d.ts +8 -1
  45. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  46. package/dist/CheckboxList/CheckboxList.js +2 -0
  47. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  48. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  49. package/dist/CodeBlock/CodeBlock.js +28 -11
  50. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPalette.js +2 -0
  52. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  53. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  54. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  55. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  56. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  57. package/dist/ContextMenu/ContextMenu.js +2 -2
  58. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  59. package/dist/DateInput/MonthScroller.js +5 -2
  60. package/dist/DateInput/PickerWheel.d.ts +19 -0
  61. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  62. package/dist/DateInput/PickerWheel.js +625 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +9 -30
  65. package/dist/DateInput/Wheel.d.ts +18 -37
  66. package/dist/DateInput/Wheel.d.ts.map +1 -1
  67. package/dist/DateInput/Wheel.js +84 -113
  68. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  69. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  70. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  71. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  72. package/dist/DateInput/usePointerDragScroll.js +2 -0
  73. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  74. package/dist/DateInput/useScrollSettle.js +3 -0
  75. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  76. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  77. package/dist/DateInput/useWheelListbox.js +88 -0
  78. package/dist/DateInput/wheelOptions.d.ts +74 -0
  79. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  80. package/dist/DateInput/wheelOptions.js +98 -0
  81. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  82. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  83. package/dist/DateInput/wheelPhysics.js +341 -0
  84. package/dist/DateInput/wheelStrip.d.ts +92 -0
  85. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  86. package/dist/DateInput/wheelStrip.js +258 -0
  87. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  88. package/dist/DateTimeInput/TouchDateTimeField.js +10 -10
  89. package/dist/Dialog/Dialog.d.ts.map +1 -1
  90. package/dist/Dialog/Dialog.js +9 -32
  91. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  92. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  93. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  94. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  95. package/dist/Field/Field.js +2 -2
  96. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  97. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  98. package/dist/FormLayout/FormLayout.d.ts +5 -1
  99. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  100. package/dist/HoverCard/HoverCard.d.ts +6 -4
  101. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  102. package/dist/HoverCard/HoverCard.js +48 -3
  103. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  104. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  105. package/dist/HoverCard/useHoverCard.js +20 -33
  106. package/dist/Icon/Icon.d.ts +5 -1
  107. package/dist/Icon/Icon.d.ts.map +1 -1
  108. package/dist/Icon/Icon.js +5 -2
  109. package/dist/InfoTip/InfoTip.d.ts +5 -5
  110. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  111. package/dist/InfoTip/InfoTip.js +58 -19
  112. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  113. package/dist/Item/useSwipeAction.js +3 -0
  114. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  115. package/dist/Layer/modalOutlet.js +2 -0
  116. package/dist/Layer/outsidePress.d.ts.map +1 -1
  117. package/dist/Layer/outsidePress.js +1 -0
  118. package/dist/Layer/useLayer.d.ts.map +1 -1
  119. package/dist/Layer/useLayer.js +4 -1
  120. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  121. package/dist/Layer/useLayerDismissal.js +3 -0
  122. package/dist/Layer/useTouchTrigger.d.ts +13 -7
  123. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  124. package/dist/Layer/useTouchTrigger.js +20 -6
  125. package/dist/Layout/index.d.ts +1 -1
  126. package/dist/Layout/index.d.ts.map +1 -1
  127. package/dist/Layout/index.js +1 -1
  128. package/dist/Layout/layoutReset.js +1 -1
  129. package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
  130. package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
  131. package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
  132. package/dist/Layout/padding.stylex.d.ts +5 -129
  133. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  134. package/dist/Layout/padding.stylex.js +9 -143
  135. package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
  136. package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
  137. package/dist/Layout/paddingStyles.stylex.js +99 -0
  138. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  139. package/dist/Lightbox/Lightbox.js +20 -1
  140. package/dist/MobileNav/MobileNav.d.ts +3 -2
  141. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  142. package/dist/MobileNav/MobileNav.js +10 -26
  143. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  144. package/dist/MultiSelector/MultiSelector.js +2 -1
  145. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  146. package/dist/NumberInput/NumberInput.js +2 -1
  147. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  148. package/dist/Outline/useOutlineFromDOM.js +3 -0
  149. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  150. package/dist/Outline/useScrollSpy.js +3 -0
  151. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  152. package/dist/OverflowList/OverflowList.js +3 -0
  153. package/dist/Popover/Popover.d.ts.map +1 -1
  154. package/dist/Popover/Popover.js +6 -0
  155. package/dist/Popover/usePopover.js +2 -2
  156. package/dist/PowerSearch/PowerSearch.d.ts +39 -4
  157. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  158. package/dist/PowerSearch/PowerSearch.js +441 -134
  159. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  160. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  161. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  162. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  163. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  164. package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
  165. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  166. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  167. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  168. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  169. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearchToken.js +3 -2
  171. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  172. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
  174. package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
  175. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  176. package/dist/PowerSearch/formatFilterValue.js +31 -23
  177. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  178. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  179. package/dist/PowerSearch/formatTokenValue.js +161 -0
  180. package/dist/PowerSearch/index.d.ts +1 -1
  181. package/dist/PowerSearch/index.d.ts.map +1 -1
  182. package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
  183. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  184. package/dist/PowerSearch/powerSearchDateZone.js +57 -0
  185. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  186. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  187. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  188. package/dist/PowerSearch/types.d.ts +8 -1
  189. package/dist/PowerSearch/types.d.ts.map +1 -1
  190. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  191. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  192. package/dist/RadioList/RadioList.d.ts.map +1 -1
  193. package/dist/RadioList/RadioList.js +3 -2
  194. package/dist/RadioList/RadioListItem.d.ts +1 -1
  195. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  196. package/dist/RadioList/RadioListItem.js +5 -3
  197. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  198. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  199. package/dist/Resizable/ResizeHandle.js +101 -77
  200. package/dist/Resizable/createResizable.d.ts +145 -0
  201. package/dist/Resizable/createResizable.d.ts.map +1 -0
  202. package/dist/Resizable/createResizable.js +575 -0
  203. package/dist/Resizable/useResizable.d.ts +3 -3
  204. package/dist/Resizable/useResizable.d.ts.map +1 -1
  205. package/dist/Resizable/useResizable.js +252 -459
  206. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  207. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  208. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  209. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  210. package/dist/SelectableCard/SelectableCard.js +36 -11
  211. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  212. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  213. package/dist/SelectableCard/selectableCardInput.js +20 -0
  214. package/dist/Selector/Selector.d.ts.map +1 -1
  215. package/dist/Selector/Selector.js +7 -9
  216. package/dist/SideNav/SideNav.d.ts.map +1 -1
  217. package/dist/SideNav/SideNav.js +36 -5
  218. package/dist/Slider/Slider.d.ts.map +1 -1
  219. package/dist/Slider/Slider.js +16 -11
  220. package/dist/Slider/sliderTouchController.js +2 -2
  221. package/dist/Spinner/Spinner.d.ts +1 -1
  222. package/dist/Spinner/Spinner.d.ts.map +1 -1
  223. package/dist/Spinner/Spinner.js +60 -58
  224. package/dist/Stepper/Stepper.d.ts.map +1 -1
  225. package/dist/Stepper/Stepper.js +10 -15
  226. package/dist/Switch/Switch.d.ts.map +1 -1
  227. package/dist/Switch/Switch.js +4 -10
  228. package/dist/Switch/useSwitchTouch.js +4 -4
  229. package/dist/Table/BaseTable.d.ts.map +1 -1
  230. package/dist/Table/BaseTable.js +29 -8
  231. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  232. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  233. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  234. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  235. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  236. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  237. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  238. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  239. package/dist/TextArea/TextArea.d.ts.map +1 -1
  240. package/dist/TextArea/TextArea.js +2 -1
  241. package/dist/TextInput/TextInput.d.ts +2 -2
  242. package/dist/TextInput/TextInput.d.ts.map +1 -1
  243. package/dist/TextInput/TextInput.js +12 -8
  244. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  245. package/dist/TimeInput/TimeInput.js +2 -0
  246. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  247. package/dist/TimeInput/TouchTimeField.js +2 -0
  248. package/dist/Timer/Timer.d.ts.map +1 -1
  249. package/dist/Timer/Timer.js +2 -0
  250. package/dist/Timestamp/Timestamp.js +1 -1
  251. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  252. package/dist/Timestamp/formatInstant.js +1 -23
  253. package/dist/Toast/Toast.d.ts +11 -1
  254. package/dist/Toast/Toast.d.ts.map +1 -1
  255. package/dist/Toast/Toast.js +25 -15
  256. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  257. package/dist/Toast/ToastViewport.js +97 -34
  258. package/dist/Toast/types.d.ts +9 -3
  259. package/dist/Toast/types.d.ts.map +1 -1
  260. package/dist/Toast/useToast.d.ts.map +1 -1
  261. package/dist/Toast/useToast.js +1 -0
  262. package/dist/Tokenizer/Tokenizer.d.ts +44 -46
  263. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  264. package/dist/Tokenizer/Tokenizer.js +20 -21
  265. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  266. package/dist/Tokenizer/TokenizerBottomSheet.js +4 -6
  267. package/dist/Tokenizer/index.d.ts +1 -1
  268. package/dist/Tokenizer/index.d.ts.map +1 -1
  269. package/dist/Tooltip/Tooltip.d.ts +2 -23
  270. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  271. package/dist/Tooltip/Tooltip.js +5 -29
  272. package/dist/Tooltip/useTooltip.d.ts +23 -30
  273. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  274. package/dist/Tooltip/useTooltip.js +194 -108
  275. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  276. package/dist/Typeahead/BaseTypeahead.js +27 -18
  277. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  278. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  279. package/dist/animator/createAnimator.d.ts +98 -0
  280. package/dist/animator/createAnimator.d.ts.map +1 -0
  281. package/dist/animator/createAnimator.js +259 -0
  282. package/dist/astryx.css +41 -7
  283. package/dist/gestures/GestureHost.d.ts +16 -1
  284. package/dist/gestures/GestureHost.d.ts.map +1 -1
  285. package/dist/gestures/GestureHost.js +1 -1
  286. package/dist/gestures/PressTracker.d.ts.map +1 -1
  287. package/dist/gestures/PressTracker.js +4 -3
  288. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  289. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  290. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  291. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  292. package/dist/hooks/actionGroupTracker.js +13 -3
  293. package/dist/hooks/index.d.ts +1 -0
  294. package/dist/hooks/index.d.ts.map +1 -1
  295. package/dist/hooks/index.js +1 -0
  296. package/dist/hooks/longPressDetector.d.ts +66 -0
  297. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  298. package/dist/hooks/longPressDetector.js +200 -0
  299. package/dist/hooks/pressGroupContext.d.ts +6 -0
  300. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  301. package/dist/hooks/pressGroupContext.js +20 -0
  302. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  303. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  304. package/dist/hooks/rootScrollStyles.js +207 -0
  305. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  306. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  307. package/dist/hooks/scrollLockTouchGuard.js +117 -0
  308. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  309. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  310. package/dist/hooks/scrollbarGutter.js +36 -23
  311. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  312. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  313. package/dist/hooks/useActionGroupTracking.js +174 -0
  314. package/dist/hooks/useAnimator.d.ts +41 -0
  315. package/dist/hooks/useAnimator.d.ts.map +1 -0
  316. package/dist/hooks/useAnimator.js +70 -0
  317. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  318. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  319. package/dist/hooks/useAttachment.d.ts +1 -1
  320. package/dist/hooks/useAttachment.js +1 -1
  321. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  322. package/dist/hooks/useAutoMediaMode.js +1 -0
  323. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  324. package/dist/hooks/useBusyAnnouncement.js +2 -0
  325. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  326. package/dist/hooks/useDevWarning.js +2 -0
  327. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  328. package/dist/hooks/useFocusTrap.js +2 -0
  329. package/dist/hooks/useGridFocus.d.ts +8 -5
  330. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  331. package/dist/hooks/useGridFocus.js +4 -3
  332. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  333. package/dist/hooks/useHotkeys.js +3 -0
  334. package/dist/hooks/useImageMode.d.ts.map +1 -1
  335. package/dist/hooks/useImageMode.js +3 -0
  336. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  337. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  338. package/dist/hooks/useInputStatusIcon.js +2 -2
  339. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
  340. package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
  341. package/dist/hooks/useKeyboardHint.js +1 -1
  342. package/dist/hooks/useLongPress.d.ts +8 -9
  343. package/dist/hooks/useLongPress.d.ts.map +1 -1
  344. package/dist/hooks/useLongPress.js +23 -106
  345. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  346. package/dist/hooks/useMenuHover.js +2 -0
  347. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  348. package/dist/hooks/useMenuPress.js +3 -0
  349. package/dist/hooks/useOverflow.d.ts.map +1 -1
  350. package/dist/hooks/useOverflow.js +2 -1
  351. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  352. package/dist/hooks/usePressFeedback.js +1 -0
  353. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  354. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  355. package/dist/hooks/useResolvedRequired.js +3 -0
  356. package/dist/hooks/useScrollLock.d.ts +8 -9
  357. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  358. package/dist/hooks/useScrollLock.js +50 -48
  359. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  360. package/dist/hooks/useScrollableArea.js +5 -0
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +3 -0
  363. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  364. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  365. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  366. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  367. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  368. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  369. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  370. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  371. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  372. package/dist/i18n/generated-locales/en.generated.js +30 -0
  373. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  374. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  375. package/dist/index.d.ts +1 -0
  376. package/dist/index.d.ts.map +1 -1
  377. package/dist/index.js +4 -0
  378. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  379. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  380. package/dist/internal/indicatorPress.stylex.js +26 -0
  381. package/dist/internal/selectable-card.d.ts +21 -0
  382. package/dist/internal/selectable-card.d.ts.map +1 -0
  383. package/dist/internal/selectable-card.js +20 -0
  384. package/dist/internal/sheetDraft.d.ts +2 -2
  385. package/dist/internal/sheetDraft.js +2 -2
  386. package/dist/motion/animatedLayout.d.ts +8 -0
  387. package/dist/motion/animatedLayout.d.ts.map +1 -1
  388. package/dist/motion/animatedLayout.js +246 -53
  389. package/dist/motion/animator.d.ts +14 -14
  390. package/dist/motion/animator.d.ts.map +1 -1
  391. package/dist/motion/animator.js +45 -26
  392. package/dist/motion/frameBlock.d.ts +14 -0
  393. package/dist/motion/frameBlock.d.ts.map +1 -0
  394. package/dist/motion/frameBlock.js +16 -0
  395. package/dist/motion/progress.d.ts +88 -0
  396. package/dist/motion/progress.d.ts.map +1 -0
  397. package/dist/motion/progress.js +128 -0
  398. package/dist/motion/reducedMotion.d.ts.map +1 -1
  399. package/dist/motion/reducedMotion.js +3 -1
  400. package/dist/motion/uikit/alert.d.ts +41 -0
  401. package/dist/motion/uikit/alert.d.ts.map +1 -0
  402. package/dist/motion/uikit/alert.js +43 -0
  403. package/dist/motion/uikit/index.d.ts +4 -3
  404. package/dist/motion/uikit/index.d.ts.map +1 -1
  405. package/dist/motion/uikit/index.js +4 -3
  406. package/dist/motion/uikit/picker.d.ts +96 -0
  407. package/dist/motion/uikit/picker.d.ts.map +1 -0
  408. package/dist/motion/uikit/picker.js +117 -0
  409. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  410. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  411. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  412. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  413. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  414. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  415. package/dist/theme/Theme.d.ts.map +1 -1
  416. package/dist/theme/Theme.js +29 -4
  417. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  418. package/dist/theme/generateThemeRules.js +14 -13
  419. package/dist/theme/motionKnobs.d.ts +4 -3
  420. package/dist/theme/motionKnobs.d.ts.map +1 -1
  421. package/dist/theme/motionKnobs.js +3 -2
  422. package/dist/theme/themeMotion.d.ts +6 -0
  423. package/dist/theme/themeMotion.d.ts.map +1 -1
  424. package/dist/theme/themeMotion.js +15 -2
  425. package/dist/theme/tokens.stylex.d.ts +3 -0
  426. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  427. package/dist/theme/tokens.stylex.js +4 -1
  428. package/dist/utils/dateParser.d.ts.map +1 -1
  429. package/dist/utils/dateParser.js +12 -0
  430. package/dist/utils/disabledInteraction.d.ts +10 -2
  431. package/dist/utils/disabledInteraction.d.ts.map +1 -1
  432. package/dist/utils/disabledInteraction.js +16 -2
  433. package/dist/utils/focusReturn.d.ts +22 -25
  434. package/dist/utils/focusReturn.d.ts.map +1 -1
  435. package/dist/utils/focusReturn.js +36 -29
  436. package/dist/utils/index.d.ts +1 -1
  437. package/dist/utils/index.d.ts.map +1 -1
  438. package/dist/utils/index.js +1 -1
  439. package/dist/utils/interactionModality.d.ts.map +1 -1
  440. package/dist/utils/interactionModality.js +4 -0
  441. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  442. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  443. package/dist/utils/interactionOverlay.stylex.js +3 -2
  444. package/dist/utils/isFocusDetached.d.ts +27 -0
  445. package/dist/utils/isFocusDetached.d.ts.map +1 -0
  446. package/dist/utils/isFocusDetached.js +32 -0
  447. package/dist/utils/plainDate.d.ts +31 -0
  448. package/dist/utils/plainDate.d.ts.map +1 -1
  449. package/dist/utils/plainDate.js +68 -4
  450. package/dist/utils/pressFeedback.d.ts.map +1 -1
  451. package/dist/utils/pressFeedback.js +20 -6
  452. package/dist/utils/triggerFocus.d.ts +36 -0
  453. package/dist/utils/triggerFocus.d.ts.map +1 -0
  454. package/dist/utils/triggerFocus.js +65 -0
  455. package/locales/en.json +120 -0
  456. package/locales/pseudo.json +90 -0
  457. package/package.json +14 -9
  458. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  459. package/src/AlertDialog/AlertDialog.tsx +46 -5
  460. package/src/AppShell/AppShell.tsx +13 -4
  461. package/src/BottomSheet/BottomSheet.tsx +1 -0
  462. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  463. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  464. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  465. package/src/BottomSheet/useSheetGestures.ts +10 -1
  466. package/src/Button/Button.tsx +26 -4
  467. package/src/Calendar/Calendar.tsx +40 -32
  468. package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
  469. package/src/Calendar/hooks/useCalendarDays.ts +5 -10
  470. package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
  471. package/src/Carousel/Carousel.tsx +1 -0
  472. package/src/Chat/ChatComposerInput.tsx +4 -7
  473. package/src/Chat/ChatMessageList.tsx +2 -1
  474. package/src/Chat/useChatDictation.ts +1 -0
  475. package/src/Chat/useChatNewMessages.ts +1 -1
  476. package/src/Chat/useChatStreamScroll.ts +2 -0
  477. package/src/Chat/useSpeechRecognition.ts +2 -0
  478. package/src/Chat/useTriggerMenu.tsx +1 -1
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  480. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  481. package/src/CheckboxList/CheckboxList.doc.mjs +7 -0
  482. package/src/CheckboxList/CheckboxList.tsx +9 -0
  483. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  484. package/src/CodeBlock/CodeBlock.tsx +41 -4
  485. package/src/CommandPalette/CommandPalette.tsx +1 -0
  486. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  487. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  488. package/src/ContextMenu/ContextMenu.tsx +2 -2
  489. package/src/DateInput/MonthScroller.tsx +8 -2
  490. package/src/DateInput/PickerWheel.tsx +765 -0
  491. package/src/DateInput/TouchDateField.tsx +6 -32
  492. package/src/DateInput/Wheel.tsx +94 -150
  493. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  494. package/src/DateInput/usePointerDragScroll.ts +1 -0
  495. package/src/DateInput/useScrollSettle.ts +2 -0
  496. package/src/DateInput/useWheelListbox.ts +112 -0
  497. package/src/DateInput/wheelOptions.ts +155 -0
  498. package/src/DateInput/wheelPhysics.ts +406 -0
  499. package/src/DateInput/wheelStrip.ts +341 -0
  500. package/src/DateTimeInput/TouchDateTimeField.tsx +8 -13
  501. package/src/Dialog/Dialog.tsx +12 -32
  502. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  503. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  504. package/src/Field/Field.tsx +2 -2
  505. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  506. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  507. package/src/FormLayout/FormLayout.tsx +5 -1
  508. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  509. package/src/HoverCard/HoverCard.tsx +58 -6
  510. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  511. package/src/HoverCard/useHoverCard.tsx +49 -54
  512. package/src/Icon/Icon.doc.mjs +51 -10
  513. package/src/Icon/Icon.tsx +15 -7
  514. package/src/IconButton/IconButton.doc.mjs +141 -21
  515. package/src/InfoTip/InfoTip.tsx +72 -16
  516. package/src/Item/useSwipeAction.ts +2 -0
  517. package/src/Layer/modalOutlet.ts +2 -0
  518. package/src/Layer/outsidePress.ts +1 -0
  519. package/src/Layer/useLayer.tsx +3 -1
  520. package/src/Layer/useLayerDismissal.ts +2 -0
  521. package/src/Layer/useTouchTrigger.ts +19 -6
  522. package/src/Layout/index.ts +1 -1
  523. package/src/Layout/layoutReset.ts +1 -1
  524. package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
  525. package/src/Layout/padding.stylex.ts +9 -133
  526. package/src/Layout/paddingStyles.stylex.ts +87 -0
  527. package/src/Lightbox/Lightbox.tsx +20 -1
  528. package/src/Lightbox/useLightbox.doc.mjs +167 -0
  529. package/src/MobileNav/MobileNav.tsx +10 -31
  530. package/src/MultiSelector/MultiSelector.tsx +2 -7
  531. package/src/NumberInput/NumberInput.tsx +2 -7
  532. package/src/Outline/useOutlineFromDOM.ts +2 -0
  533. package/src/Outline/useScrollSpy.ts +2 -0
  534. package/src/OverflowList/OverflowList.tsx +2 -0
  535. package/src/Popover/Popover.tsx +4 -0
  536. package/src/Popover/usePopover.tsx +2 -2
  537. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  538. package/src/PowerSearch/PowerSearch.tsx +620 -157
  539. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  540. package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
  541. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  542. package/src/PowerSearch/PowerSearchToken.tsx +2 -0
  543. package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
  544. package/src/PowerSearch/formatFilterValue.ts +49 -27
  545. package/src/PowerSearch/formatTokenValue.ts +220 -0
  546. package/src/PowerSearch/index.ts +5 -1
  547. package/src/PowerSearch/powerSearchDateZone.ts +95 -0
  548. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  549. package/src/PowerSearch/types.ts +8 -1
  550. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  551. package/src/RadioList/RadioList.tsx +3 -2
  552. package/src/RadioList/RadioListItem.tsx +5 -3
  553. package/src/Resizable/Resizable.doc.mjs +5 -4
  554. package/src/Resizable/ResizeHandle.tsx +169 -109
  555. package/src/Resizable/createResizable.ts +831 -0
  556. package/src/Resizable/useResizable.ts +292 -623
  557. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  558. package/src/SelectableCard/SelectableCard.tsx +39 -10
  559. package/src/SelectableCard/selectableCardInput.ts +30 -0
  560. package/src/Selector/Selector.tsx +7 -19
  561. package/src/SideNav/SideNav.tsx +41 -5
  562. package/src/Slider/Slider.tsx +20 -11
  563. package/src/Slider/sliderTouchController.ts +2 -2
  564. package/src/Spinner/Spinner.tsx +77 -63
  565. package/src/Stepper/Stepper.tsx +10 -27
  566. package/src/Switch/Switch.tsx +2 -6
  567. package/src/Switch/useSwitchTouch.ts +4 -4
  568. package/src/Table/BaseTable.tsx +46 -12
  569. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  570. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  571. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  572. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  573. package/src/TextArea/TextArea.tsx +2 -7
  574. package/src/TextInput/TextInput.tsx +13 -17
  575. package/src/TimeInput/TimeInput.tsx +2 -0
  576. package/src/TimeInput/TouchTimeField.tsx +2 -0
  577. package/src/Timer/Timer.tsx +1 -0
  578. package/src/Timestamp/Timestamp.tsx +1 -1
  579. package/src/Timestamp/formatInstant.ts +1 -33
  580. package/src/Toast/Toast.doc.mjs +4 -3
  581. package/src/Toast/Toast.tsx +52 -32
  582. package/src/Toast/ToastViewport.tsx +123 -35
  583. package/src/Toast/types.ts +9 -3
  584. package/src/Toast/useToast.tsx +1 -0
  585. package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
  586. package/src/Tokenizer/Tokenizer.tsx +61 -62
  587. package/src/Tokenizer/TokenizerBottomSheet.tsx +9 -11
  588. package/src/Tokenizer/index.ts +1 -0
  589. package/src/Tooltip/Tooltip.tsx +6 -42
  590. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  591. package/src/Tooltip/useTooltip.tsx +237 -134
  592. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  593. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  594. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  595. package/src/animator/createAnimator.doc.mjs +153 -0
  596. package/src/animator/createAnimator.ts +324 -0
  597. package/src/gestures/GestureHost.ts +1 -1
  598. package/src/gestures/PressTracker.ts +4 -3
  599. package/src/gestures/README.md +10 -4
  600. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  601. package/src/hooks/actionGroupTracker.ts +20 -5
  602. package/src/hooks/index.ts +2 -0
  603. package/src/hooks/longPressDetector.ts +273 -0
  604. package/src/hooks/pressGroupContext.ts +21 -0
  605. package/src/hooks/rootScrollStyles.ts +247 -0
  606. package/src/hooks/scrollLockTouchGuard.ts +149 -0
  607. package/src/hooks/scrollbarGutter.ts +41 -26
  608. package/src/hooks/useActionGroupTracking.ts +224 -0
  609. package/src/hooks/useAnimator.doc.mjs +109 -0
  610. package/src/hooks/useAnimator.ts +67 -0
  611. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  612. package/src/hooks/useAttachment.ts +1 -1
  613. package/src/hooks/useAutoMediaMode.ts +1 -0
  614. package/src/hooks/useBusyAnnouncement.ts +2 -0
  615. package/src/hooks/useDevWarning.ts +2 -0
  616. package/src/hooks/useFocusTrap.ts +2 -0
  617. package/src/hooks/useGridFocus.doc.mjs +6 -6
  618. package/src/hooks/useGridFocus.ts +10 -7
  619. package/src/hooks/useHotkeys.ts +2 -0
  620. package/src/hooks/useImageMode.ts +2 -0
  621. package/src/hooks/useInputStatusIcon.tsx +3 -2
  622. package/src/hooks/useKeyboardHint.tsx +1 -1
  623. package/src/hooks/useLongPress.doc.mjs +2 -2
  624. package/src/hooks/useLongPress.ts +32 -122
  625. package/src/hooks/useMenuHover.ts +1 -0
  626. package/src/hooks/useMenuPress.ts +2 -0
  627. package/src/hooks/useOverflow.ts +2 -1
  628. package/src/hooks/usePressFeedback.ts +1 -0
  629. package/src/hooks/useResolvedRequired.ts +3 -0
  630. package/src/hooks/useScrollLock.doc.mjs +51 -12
  631. package/src/hooks/useScrollLock.ts +53 -60
  632. package/src/hooks/useScrollableArea.ts +4 -0
  633. package/src/hooks/useStreamingText.ts +2 -0
  634. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  635. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  636. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  637. package/src/i18n/generated-locales/en.generated.ts +41 -0
  638. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  639. package/src/index.ts +13 -0
  640. package/src/internal/indicatorPress.stylex.ts +24 -0
  641. package/src/internal/selectable-card.ts +21 -0
  642. package/src/internal/sheetDraft.ts +2 -2
  643. package/src/motion/MEASUREMENTS.md +18 -0
  644. package/src/motion/README.md +10 -5
  645. package/src/motion/animatedLayout.ts +323 -60
  646. package/src/motion/animator.ts +66 -37
  647. package/src/motion/frameBlock.ts +16 -0
  648. package/src/motion/progress.ts +155 -0
  649. package/src/motion/reducedMotion.ts +3 -1
  650. package/src/motion/uikit/alert.ts +43 -0
  651. package/src/motion/uikit/index.ts +4 -3
  652. package/src/motion/uikit/picker.ts +116 -0
  653. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  654. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  655. package/src/theme/Theme.tsx +37 -3
  656. package/src/theme/generateThemeRules.ts +14 -12
  657. package/src/theme/motionKnobs.ts +4 -3
  658. package/src/theme/themeMotion.ts +17 -2
  659. package/src/theme/tokens.stylex.ts +2 -0
  660. package/src/utils/dateParser.ts +16 -0
  661. package/src/utils/disabledInteraction.ts +23 -2
  662. package/src/utils/focusReturn.ts +38 -31
  663. package/src/utils/index.ts +1 -1
  664. package/src/utils/interactionModality.ts +4 -0
  665. package/src/utils/interactionOverlay.stylex.ts +3 -2
  666. package/src/utils/isFocusDetached.ts +34 -0
  667. package/src/utils/plainDate.ts +80 -4
  668. package/src/utils/pressFeedback.ts +24 -6
  669. package/src/utils/triggerFocus.ts +80 -0
  670. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
  671. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
  672. package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
  673. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
  674. package/dist/Layer/usePressPin.d.ts +0 -93
  675. package/dist/Layer/usePressPin.d.ts.map +0 -1
  676. package/dist/Layer/usePressPin.js +0 -363
  677. package/dist/internal/touch-sheet.d.ts +0 -21
  678. package/dist/internal/touch-sheet.d.ts.map +0 -1
  679. package/dist/internal/touch-sheet.js +0 -19
  680. package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
  681. package/src/Layer/usePressPin.ts +0 -510
  682. package/src/internal/touch-sheet.ts +0 -21
@@ -4,9 +4,9 @@
4
4
 
5
5
  /**
6
6
  * @file useTooltip.tsx
7
- * @input Uses useLayer, usePressPin, React hooks
8
- * @output Exports useTooltip hook with stable trigger refs for hover/focus/tap tooltips,
9
- * and the module-only useTooltipWithTriggerBehavior that InfoTip's press-to-pin uses
7
+ * @input Uses useLayer, useTouchTriggerInternal, React hooks
8
+ * @output Exports useTooltip hook with stable trigger refs for hover/focus/tap tooltips
9
+ * and imperative show() and hide() for an app-built toggle trigger
10
10
  * @position Layer hook; builds on useLayer for tooltip behavior
11
11
  *
12
12
  * SYNC: When modified, update:
@@ -17,9 +17,11 @@ import {
17
17
  useCallback,
18
18
  useEffect,
19
19
  useRef,
20
+ useState,
20
21
  type ReactNode,
21
22
  type RefCallback,
22
23
  } from 'react';
24
+ import {createTriggerFocusGate} from '../utils/triggerFocus';
23
25
  import * as stylex from '@stylexjs/stylex';
24
26
  import {
25
27
  useLayerInternal,
@@ -27,12 +29,14 @@ import {
27
29
  type LayerAlignment,
28
30
  type LayerPlacement,
29
31
  } from '../Layer/useLayer';
30
- import type {LayerTouchTrigger} from '../Layer/useTouchTrigger';
32
+ import {
33
+ useTouchTriggerInternal,
34
+ type LayerTouchTrigger,
35
+ } from '../Layer/useTouchTrigger';
31
36
  import {useAnnounceRenderedText} from '../hooks/useAnnounceRenderedText';
32
37
  import {useMergedRefs} from '../hooks/useMergedRefs';
33
38
  import {layerAnimations} from '../Layer/layerAnimations.stylex';
34
39
  import {registerLayerSurface} from '../Layer/layerSurfacePress';
35
- import {usePressPin, type LayerTriggerBehavior} from '../Layer/usePressPin';
36
40
  import {useLayerDismissal} from '../Layer/useLayerDismissal';
37
41
  import {themeProps} from '../utils/themeProps';
38
42
  import {
@@ -216,29 +220,27 @@ export interface TooltipReturn {
216
220
  children: ReactNode,
217
221
  props?: Omit<ContextRenderProps, 'positioning'>,
218
222
  ) => ReactNode;
219
- }
220
223
 
221
- /**
222
- * Check if an element is naturally focusable
223
- */
224
- function isFocusable(element: HTMLElement): boolean {
225
- // Elements with explicit tabindex
226
- if (element.hasAttribute('tabindex')) {
227
- return element.tabIndex >= 0;
228
- }
229
-
230
- // Naturally focusable elements
231
- const focusableTags = ['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'];
232
- if (focusableTags.includes(element.tagName)) {
233
- return !(element as HTMLButtonElement).disabled;
234
- }
235
-
236
- // Elements with contenteditable
237
- if (element.isContentEditable) {
238
- return true;
239
- }
240
-
241
- return false;
224
+ /**
225
+ * Opens the tooltip now and keeps it open until `hide()`, Escape, a press
226
+ * outside, or focus leaving its trigger. If a press on the trigger is down
227
+ * when you call it, and the press ends off the trigger with no click, the
228
+ * hold ends. The hover rules then decide.
229
+ * Its text is announced once. Reports through `onShow`. Under a controlled `isOpen`,
230
+ * it calls `onShow` and does not change `isOpen`. Does nothing while
231
+ * `isEnabled` is false.
232
+ *
233
+ * Use `show()` and `hide()` to build a toggle-style trigger: your own button
234
+ * calls them, sets `aria-describedby` and `aria-controls` to `describedBy`
235
+ * and `aria-expanded` (true while shown), and keeps its own accessible name.
236
+ */
237
+ show: () => void;
238
+
239
+ /**
240
+ * Closes the tooltip now. Reports through `onHide`. Under a controlled
241
+ * `isOpen`, it calls `onHide` and does not change `isOpen`.
242
+ */
243
+ hide: () => void;
242
244
  }
243
245
 
244
246
  /**
@@ -267,42 +269,6 @@ function isFocusable(element: HTMLElement): boolean {
267
269
  */
268
270
 
269
271
  export function useTooltip(options: TooltipOptions = {}): TooltipReturn {
270
- // The option is fixed to `adaptive`, so an options object that carries it at
271
- // runtime cannot reach the press-to-pin path.
272
- return useTooltipWithTriggerBehavior({
273
- ...options,
274
- triggerBehavior: 'adaptive',
275
- });
276
- }
277
-
278
- /**
279
- * Module-only options for `useTooltipWithTriggerBehavior`. Not exported from
280
- * the package.
281
- */
282
- export interface TooltipWithTriggerBehaviorOptions extends TooltipOptions {
283
- /**
284
- * How the trigger opens the tooltip:
285
- * - `adaptive` (the default): hover and focus preview it. `touchTrigger`
286
- * decides taps.
287
- * - `toggle`: on a button trigger, a click, a tap, Enter, or Space pins the
288
- * tooltip open, and the same press closes it. Hover and keyboard focus
289
- * still preview it. A pinned tooltip stays until Escape, a second press,
290
- * a press outside, or focus leaving. The trigger reports `aria-expanded`
291
- * and `aria-controls`, and the tooltip's text is announced once when it
292
- * pins. `touchTrigger` is ignored. InfoTip uses it.
293
- *
294
- * @default 'adaptive'
295
- */
296
- triggerBehavior?: LayerTriggerBehavior;
297
- }
298
-
299
- /**
300
- * `useTooltip` with a trigger behavior. Module-only: InfoTip's press-to-pin
301
- * goes through it, and the package does not export it.
302
- */
303
- export function useTooltipWithTriggerBehavior(
304
- options: TooltipWithTriggerBehaviorOptions = {},
305
- ): TooltipReturn {
306
272
  const {
307
273
  placement = 'above',
308
274
  alignment = 'center',
@@ -310,7 +276,6 @@ export function useTooltipWithTriggerBehavior(
310
276
  hideDelay = 0,
311
277
  focusTrigger = 'auto',
312
278
  touchTrigger = 'auto',
313
- triggerBehavior = 'adaptive',
314
279
  isEnabled = true,
315
280
  isOpen,
316
281
  isDefaultOpen = false,
@@ -368,39 +333,122 @@ export function useTooltipWithTriggerBehavior(
368
333
  hideLayer();
369
334
  }, [clearTimeouts, hideLayer]);
370
335
 
371
- // A press pins the tooltip under `triggerBehavior="toggle"`. The pin also
372
- // owns the tooltip's touch trigger, so this one call wires both.
336
+ // DOM listeners read the latest controlled state through a ref.
337
+ const latestRef = useRef({isOpen, isLayerOpen, onShow, onHide});
338
+ latestRef.current = {isOpen, isLayerOpen, onShow, onHide};
339
+
340
+ // The app's show() holds the tooltip open until hide(), Escape, a press or
341
+ // scroll outside, or focus leaving the trigger and the tooltip.
342
+ const isHeldRef = useRef(false);
343
+ const [isHeldState, setIsHeldState] = useState(false);
344
+ const setHeld = useCallback((next: boolean) => {
345
+ isHeldRef.current = next;
346
+ setIsHeldState(next);
347
+ }, []);
348
+
349
+ // Whether the current hold began during a press on the trigger. Such a
350
+ // hold ends with the press when the press ends off the trigger, as no click
351
+ // pins it. The hover rules then decide. isHoldInThisTaskRef covers a show()
352
+ // that runs before the hook's own pointerdown listener.
353
+ const isHoldFromPressRef = useRef(false);
354
+ const isHoldInThisTaskRef = useRef(false);
355
+ const handleReleaseInLayer = useCallback(() => {
356
+ if (isHoldFromPressRef.current && isHeldRef.current) {
357
+ isHoldFromPressRef.current = false;
358
+ setHeld(false);
359
+ }
360
+ }, [setHeld]);
361
+
362
+ // The touch trigger's outside dismissal (a press or scroll outside) ends a
363
+ // hold with the tooltip.
364
+ const hideFromTouch = useCallback(() => {
365
+ if (isHeldRef.current) {
366
+ setHeld(false);
367
+ const latest = latestRef.current;
368
+ if (latest.isOpen !== undefined) {
369
+ latest.onHide?.();
370
+ return;
371
+ }
372
+ }
373
+ hideNow();
374
+ }, [setHeld, hideNow]);
375
+
373
376
  const {
374
- isToggleTrigger,
375
- isHeldOpen: isPressHeldOpen,
376
- attach: attachPressPin,
377
- unpin: unpinPress,
378
- isPinShown,
379
- touch: {
380
- isTouchPointerRef,
381
- isTouchInteraction,
382
- handlePointerEnter,
383
- handlePointerDown: handleTouchPointerDown,
384
- clearTapOpen,
377
+ isTouchPointerRef,
378
+ isTouchInteraction,
379
+ handlePointerEnter,
380
+ handlePointerDown: handleTouchPointerDown,
381
+ clearTapOpen,
382
+ armOutsideDismiss,
383
+ } = useTouchTriggerInternal(
384
+ {
385
+ touchTrigger,
386
+ isEnabled,
387
+ isControlled: isOpen !== undefined,
388
+ isOpen: isLayerOpen,
389
+ layerId,
390
+ triggerRef,
391
+ show: showNow,
392
+ hide: hideFromTouch,
385
393
  },
386
- } = usePressPin({
387
- triggerBehavior,
388
- touchTrigger,
389
- isEnabled,
390
- isOpen,
391
- isLayerOpen,
392
- layerId,
393
- triggerRef,
394
- component: 'Tooltip',
395
- show: showNow,
396
- hide: hideNow,
397
- report: next => (next ? onShow?.() : onHide?.()),
398
- });
394
+ handleReleaseInLayer,
395
+ );
396
+
397
+ const isHeldOpen = useCallback(() => {
398
+ const latest = latestRef.current;
399
+ return isHeldRef.current && latest.isLayerOpen && latest.isOpen !== false;
400
+ }, []);
401
+
402
+ const releaseHold = useCallback(() => {
403
+ clearTapOpen();
404
+ setHeld(false);
405
+ const latest = latestRef.current;
406
+ if (latest.isOpen !== undefined) {
407
+ latest.onHide?.();
408
+ return;
409
+ }
410
+ hideNow();
411
+ }, [clearTapOpen, setHeld, hideNow]);
399
412
 
400
- // Only a pin announces the text: a preview is already the trigger's
413
+ const dropHold = useCallback(() => {
414
+ if (isHeldRef.current) {
415
+ setHeld(false);
416
+ }
417
+ }, [setHeld]);
418
+
419
+ // Focus leaving the trigger and the tooltip ends a hold, whatever
420
+ // `focusTrigger` is. Focus that leaves for no element is a press's to
421
+ // decide. The trigger can sit in another document, so the check uses its
422
+ // own window.
423
+ const handleHeldFocusOut = useCallback(
424
+ (event: FocusEvent) => {
425
+ if (!isHeldOpen()) {
426
+ return;
427
+ }
428
+ const next = event.relatedTarget;
429
+ const trigger = triggerRef.current;
430
+ const view = trigger?.ownerDocument.defaultView;
431
+ if (view == null || !(next instanceof view.Node)) {
432
+ return;
433
+ }
434
+ const surface = trigger?.ownerDocument.getElementById(layerId) ?? null;
435
+ if (
436
+ trigger?.contains(next) === true ||
437
+ surface?.contains(next) === true
438
+ ) {
439
+ return;
440
+ }
441
+ releaseHold();
442
+ },
443
+ [isHeldOpen, layerId, releaseHold],
444
+ );
445
+
446
+ const isHoldShown = isHeldState && isLayerOpen && isOpen !== false;
447
+
448
+ // Only a hold announces the text: a preview is already the trigger's
401
449
  // description.
402
450
  const contentRef = useRef<HTMLDivElement | null>(null);
403
- useAnnounceRenderedText(contentRef, isPinShown, 'pinned');
451
+ useAnnounceRenderedText(contentRef, isHoldShown, 'pinned');
404
452
  const contentRefs = useMergedRefs<HTMLDivElement>(
405
453
  contentRef,
406
454
  registerLayerSurface,
@@ -433,7 +481,7 @@ export function useTooltipWithTriggerBehavior(
433
481
  // trigger onto the tooltip surface without the tooltip vanishing — required
434
482
  // for WCAG 1.4.13 (Content on Hover or Focus: hoverable).
435
483
  const scheduleHide = useCallback(() => {
436
- if (isOpen === true || isPressHeldOpen()) {
484
+ if (isOpen === true || isHeldOpen()) {
437
485
  return;
438
486
  }
439
487
  clearTimeouts();
@@ -441,7 +489,7 @@ export function useTooltipWithTriggerBehavior(
441
489
  hideTimeoutRef.current = setTimeout(() => {
442
490
  hideLayer();
443
491
  }, effectiveHideDelay);
444
- }, [isOpen, isPressHeldOpen, clearTimeouts, hideLayer, hideDelay]);
492
+ }, [isOpen, isHeldOpen, clearTimeouts, hideLayer, hideDelay]);
445
493
 
446
494
  // Cancel a pending hide (e.g. the pointer entered the tooltip surface).
447
495
  const cancelHide = useCallback(() => {
@@ -485,32 +533,13 @@ export function useTooltipWithTriggerBehavior(
485
533
  [isTouchPointerRef, layerId, scheduleHide],
486
534
  );
487
535
 
488
- // Under `auto`, whether focus counts is decided when it arrives, not when
489
- // the listeners attach: a roving-tabindex member that was `tabindex="-1"`
490
- // then can be the tab stop now. A trigger that receives focus is focusable
491
- // by definition; focus inside it counts only while the trigger is
492
- // focusable too, so a plain wrapper still ignores its children's focus.
493
- const isFocusForTrigger = useCallback(
494
- (e: Event): boolean => {
495
- if (focusTrigger === 'always') {
496
- return true;
497
- }
498
- const triggerEl = e.currentTarget as HTMLElement | null;
499
- return (
500
- triggerEl != null && (e.target === triggerEl || isFocusable(triggerEl))
501
- );
502
- },
503
- [focusTrigger],
504
- );
505
-
506
- // Whether the trigger's current focus counted when it arrived, so its blur
507
- // hides the tooltip even if the trigger has since left the tab order.
508
- const focusCountedRef = useRef(false);
536
+ // Under `auto`, whether focus counts is decided when it arrives, and a
537
+ // focus that counted still hides on blur (utils/triggerFocus.ts).
538
+ const [focusGate] = useState(createTriggerFocusGate);
509
539
 
510
540
  const handleFocusIn = useCallback(
511
541
  (e: Event) => {
512
- focusCountedRef.current = isFocusForTrigger(e);
513
- if (!isEnabled || !focusCountedRef.current) {
542
+ if (!focusGate.focusIn(e, focusTrigger) || !isEnabled) {
514
543
  return;
515
544
  }
516
545
  // A tap focuses the trigger it activates, and `:focus-visible` does not
@@ -531,26 +560,26 @@ export function useTooltipWithTriggerBehavior(
531
560
  showLayer();
532
561
  },
533
562
  [
563
+ focusGate,
564
+ focusTrigger,
534
565
  isEnabled,
535
- isFocusForTrigger,
536
566
  isTouchInteraction,
537
567
  clearTimeouts,
538
568
  showLayer,
539
569
  ],
540
570
  );
541
571
 
542
- // A pinned tooltip's focus-leave close is the pin's own: it listens on the
543
- // trigger whatever `focusTrigger` is. This schedules the unpinned hide,
544
- // which a held tooltip skips.
572
+ // A held tooltip's focus-leave close is the hold's own: it listens on the
573
+ // trigger whatever `focusTrigger` is. This schedules the unheld hide, which
574
+ // a held tooltip skips.
545
575
  const handleFocusOut = useCallback(
546
576
  (e: Event) => {
547
- if (!focusCountedRef.current && !isFocusForTrigger(e)) {
577
+ if (!focusGate.focusOut(e, focusTrigger)) {
548
578
  return;
549
579
  }
550
- focusCountedRef.current = false;
551
580
  scheduleHide();
552
581
  },
553
- [isFocusForTrigger, scheduleHide],
582
+ [focusGate, focusTrigger, scheduleHide],
554
583
  );
555
584
 
556
585
  // Pressing the trigger hides its own tooltip: once the control is activated
@@ -560,11 +589,47 @@ export function useTooltipWithTriggerBehavior(
560
589
  // is owned by the consumer. `hideLayer()` self-guards when already closed.
561
590
  // A touch press is a different gesture (it may be the only way to open the
562
591
  // tooltip at all), so the touch path answers it first.
592
+ // Whether a press on the trigger is down, from the hook's pointerdown to
593
+ // the press's end.
594
+ const isTriggerPressedRef = useRef(false);
595
+ const stopPressTrackingRef = useRef<(() => void) | null>(null);
596
+ const trackTriggerPress = useCallback(() => {
597
+ stopPressTrackingRef.current?.();
598
+ const view = triggerRef.current?.ownerDocument.defaultView;
599
+ if (view == null) {
600
+ return;
601
+ }
602
+ isTriggerPressedRef.current = true;
603
+ const trigger = triggerRef.current;
604
+ const stop = (event?: Event) => {
605
+ // A press that ends on the trigger keeps its hold, as a click does.
606
+ if (
607
+ event?.type === 'pointerup' &&
608
+ event.target instanceof view.Node &&
609
+ trigger?.contains(event.target) === true
610
+ ) {
611
+ isHoldFromPressRef.current = false;
612
+ }
613
+ view.removeEventListener('pointerup', stop, true);
614
+ view.removeEventListener('pointercancel', stop, true);
615
+ isTriggerPressedRef.current = false;
616
+ stopPressTrackingRef.current = null;
617
+ };
618
+ view.addEventListener('pointerup', stop, true);
619
+ view.addEventListener('pointercancel', stop, true);
620
+ stopPressTrackingRef.current = stop;
621
+ }, []);
622
+
563
623
  const handlePointerDown = useCallback(
564
624
  (event: PointerEvent) => {
565
- // A press on a toggle trigger pins or closes through its click. It
566
- // neither hides the preview here nor waits for a tap verdict.
567
- if (isToggleTrigger(triggerRef.current)) {
625
+ trackTriggerPress();
626
+ // The app's hide() closes a held tooltip. A press neither hides it here
627
+ // nor waits for a tap verdict. A show() in a capture handler of this
628
+ // press runs before this listener. Tie that hold to the press.
629
+ if (isHeldRef.current) {
630
+ if (isHoldInThisTaskRef.current) {
631
+ isHoldFromPressRef.current = true;
632
+ }
568
633
  return;
569
634
  }
570
635
  if (handleTouchPointerDown(event)) {
@@ -576,7 +641,13 @@ export function useTooltipWithTriggerBehavior(
576
641
  clearTimeouts();
577
642
  hideLayer();
578
643
  },
579
- [isToggleTrigger, handleTouchPointerDown, isOpen, clearTimeouts, hideLayer],
644
+ [
645
+ handleTouchPointerDown,
646
+ trackTriggerPress,
647
+ isOpen,
648
+ clearTimeouts,
649
+ hideLayer,
650
+ ],
580
651
  );
581
652
 
582
653
  // Interaction ref that handles event listeners only
@@ -588,6 +659,8 @@ export function useTooltipWithTriggerBehavior(
588
659
  triggerRef.current.removeEventListener('mouseleave', handleMouseLeave);
589
660
  triggerRef.current.removeEventListener('focusin', handleFocusIn);
590
661
  triggerRef.current.removeEventListener('focusout', handleFocusOut);
662
+ triggerRef.current.removeEventListener('focusout', handleHeldFocusOut);
663
+ stopPressTrackingRef.current?.();
591
664
  triggerRef.current.removeEventListener(
592
665
  'pointerenter',
593
666
  handlePointerEnter,
@@ -609,18 +682,19 @@ export function useTooltipWithTriggerBehavior(
609
682
  el.addEventListener('pointerdown', handlePointerDown);
610
683
 
611
684
  // Focus listeners unless focus never opens the tooltip; `auto` decides
612
- // per event (isFocusForTrigger).
685
+ // per event (utils/triggerFocus.ts).
613
686
  if (focusTrigger !== 'never') {
614
687
  el.addEventListener('focusin', handleFocusIn);
615
688
  el.addEventListener('focusout', handleFocusOut);
616
689
  }
617
690
  }
618
691
 
692
+ // Its own focus-leave listener: `focusTrigger="never"` attaches none.
693
+ el?.addEventListener('focusout', handleHeldFocusOut);
619
694
  triggerRef.current = el;
620
- attachPressPin(el);
621
695
  },
622
696
  [
623
- attachPressPin,
697
+ handleHeldFocusOut,
624
698
  focusTrigger,
625
699
  handleMouseEnter,
626
700
  handleMouseLeave,
@@ -665,9 +739,11 @@ export function useTooltipWithTriggerBehavior(
665
739
  showLayer();
666
740
  } else {
667
741
  clearTimeouts();
742
+ // A hold ends when the consumer closes the tooltip.
743
+ dropHold();
668
744
  hideLayer();
669
745
  }
670
- }, [isOpen, clearTimeouts, showLayer, hideLayer]);
746
+ }, [isOpen, clearTimeouts, showLayer, hideLayer, dropHold]);
671
747
 
672
748
  // Dismiss on Escape (WCAG 1.4.13 — dismissible) through the shared layer
673
749
  // stack. A visible tip is the top-most layer, so it takes the press and
@@ -708,7 +784,7 @@ export function useTooltipWithTriggerBehavior(
708
784
  onDismiss: () => {
709
785
  clearTimeouts();
710
786
  clearTapOpen();
711
- unpinPress();
787
+ dropHold();
712
788
  if (isOpen !== undefined) {
713
789
  onHide?.();
714
790
  return;
@@ -745,7 +821,7 @@ export function useTooltipWithTriggerBehavior(
745
821
  // something else in the shared interactive-ancestor walk, so a
746
822
  // clickable container around the trigger leaves the press alone while
747
823
  // document listeners still see it.
748
- // The pin's announcement reads this element's text.
824
+ // The hold's announcement reads this element's text.
749
825
  <div ref={contentRefs} {...stylex.props(styles.content)}>
750
826
  {children}
751
827
  </div>,
@@ -763,6 +839,31 @@ export function useTooltipWithTriggerBehavior(
763
839
  ],
764
840
  );
765
841
 
842
+ const show = useCallback(() => {
843
+ clearTimeouts();
844
+ if (!isEnabled) {
845
+ return;
846
+ }
847
+ setHeld(true);
848
+ armOutsideDismiss();
849
+ isHoldFromPressRef.current = isTriggerPressedRef.current;
850
+ isHoldInThisTaskRef.current = true;
851
+ triggerRef.current?.ownerDocument.defaultView?.setTimeout(() => {
852
+ isHoldInThisTaskRef.current = false;
853
+ }, 0);
854
+ const latest = latestRef.current;
855
+ if (latest.isOpen !== undefined) {
856
+ latest.onShow?.();
857
+ return;
858
+ }
859
+ showLayer();
860
+ }, [clearTimeouts, isEnabled, setHeld, armOutsideDismiss, showLayer]);
861
+
862
+ const hide = useCallback(() => {
863
+ clearTimeouts();
864
+ releaseHold();
865
+ }, [clearTimeouts, releaseHold]);
866
+
766
867
  return {
767
868
  ref,
768
869
  positionRef: layerRef,
@@ -770,5 +871,7 @@ export function useTooltipWithTriggerBehavior(
770
871
  anchorId: layerAnchorId,
771
872
  describedBy: layerId,
772
873
  renderTooltip,
874
+ show,
875
+ hide,
773
876
  };
774
877
  }
@@ -24,6 +24,7 @@ import React, {
24
24
  useCallback,
25
25
  useEffect,
26
26
  useId,
27
+ useInsertionEffect,
27
28
  useMemo,
28
29
  useRef,
29
30
  useState,
@@ -775,15 +776,6 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
775
776
  // source: they can never be re-shown, so focus bootstraps the new source.
776
777
  const sourceGenRef = useRef(0);
777
778
 
778
- // Results still arriving from a replaced source must not land in the new
779
- // one's menu.
780
- const prevSearchSourceRef = useRef(searchSource);
781
- if (prevSearchSourceRef.current !== searchSource) {
782
- prevSearchSourceRef.current.cancel?.();
783
- prevSearchSourceRef.current = searchSource;
784
- sourceGenRef.current = ++searchGenRef.current;
785
- }
786
-
787
779
  // The previous source is remembered in state, not a ref, so a render React
788
780
  // discards cannot consume the comparison without its state updates.
789
781
  const [sourceOfState, setSourceOfState] = useState(searchSource);
@@ -793,7 +785,6 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
793
785
  setIsLoading(false);
794
786
  setHasSearched(false);
795
787
  }
796
- loadingRef.current = false;
797
788
  }
798
789
  // A field that becomes disabled stops showing a search as busy in the same
799
790
  // render, and the dropped query shows no outcome, so no empty state; the
@@ -807,15 +798,34 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
807
798
  }
808
799
  }
809
800
 
810
- // When the search source is replaced, any in-flight load from the previous
811
- // source is abandoned (generation bumped above). Notify the wrapper's busy lane
812
- // in an effect so external store listeners run safely after commit.
813
- const isInitialMountRef = useRef(true);
814
- useEffect(() => {
815
- if (isInitialMountRef.current) {
816
- isInitialMountRef.current = false;
801
+ // Results that arrive from a replaced source must not land in the new
802
+ // source's menu, so the replacement starts a new generation. That happens
803
+ // when the replacement commits, not in render. React can render a
804
+ // replacement and then discard it, for example when a transition suspends
805
+ // and a newer update replaces it. The source that stays then keeps its read.
806
+ // An insertion effect runs before every layout effect and ref callback of
807
+ // its commit. A read that one of them starts against the replacement gets a
808
+ // later generation, after the replaced source stopped its requests.
809
+ const prevSearchSourceRef = useRef(searchSource);
810
+ const isSourceReplacedRef = useRef(false);
811
+ useInsertionEffect(() => {
812
+ if (prevSearchSourceRef.current === searchSource) {
813
+ return;
814
+ }
815
+ prevSearchSourceRef.current.cancel?.();
816
+ prevSearchSourceRef.current = searchSource;
817
+ sourceGenRef.current = ++searchGenRef.current;
818
+ // The replacing render cleared the busy state.
819
+ loadingRef.current = false;
820
+ isSourceReplacedRef.current = true;
821
+ }, [searchSource]);
822
+ // Syncs the wrapper's busy lane. A read of the replacement that already
823
+ // started keeps the lane busy.
824
+ useIsomorphicLayoutEffect(() => {
825
+ if (!isSourceReplacedRef.current) {
817
826
  return;
818
827
  }
828
+ isSourceReplacedRef.current = false;
819
829
  if (!loadingRef.current) {
820
830
  onLoadingChangeRef.current?.(false);
821
831
  }
@@ -43,7 +43,8 @@ export const docs = {
43
43
  {
44
44
  name: 'group',
45
45
  type: 'string',
46
- description: 'Group label for grouping items visually.',
46
+ description:
47
+ 'This prop has no effect. Set `item.auxiliaryData.group` on search-source items to group results in Typeahead or BaseTypeahead.',
47
48
  },
48
49
  ],
49
50
  };
@@ -79,7 +80,8 @@ export const docsZh = {
79
80
  {
80
81
  name: 'group',
81
82
  type: 'string',
82
- description: '用于视觉分组的分组标签。',
83
+ description:
84
+ '此属性不影响渲染。要在 Typeahead 或 BaseTypeahead 中分组,请在搜索源返回的结果项上设置 `item.auxiliaryData.group`。',
83
85
  },
84
86
  ],
85
87
  };
@@ -94,6 +96,7 @@ export const docsDense = {
94
96
  icon: 'Icon/avatar before label.',
95
97
  description: 'Text below label.',
96
98
  isDisabled: 'Visually disabled.',
97
- group: 'Group label for visual grouping.',
99
+ group:
100
+ 'No effect. Group results via `item.auxiliaryData.group` in the search source.',
98
101
  },
99
102
  };
@@ -54,7 +54,8 @@ export interface TypeaheadItemProps<
54
54
  isDisabled?: boolean;
55
55
 
56
56
  /**
57
- * Group label for grouping items visually.
57
+ * This prop has no effect. Set `item.auxiliaryData.group` on search-source
58
+ * items to group results in Typeahead or BaseTypeahead.
58
59
  */
59
60
  group?: string;
60
61
  }