@astryxdesign/core 0.7.7 → 0.7.8-canary.0588a13

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 (798) 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 +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  10. package/dist/BottomSheet/BottomSheetPanel.js +55 -18
  11. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  12. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  13. package/dist/BottomSheet/bottomSheetStack.js +1 -1
  14. package/dist/BottomSheet/useSheetGestures.d.ts +3 -1
  15. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  16. package/dist/BottomSheet/useSheetGestures.js +16 -1
  17. package/dist/Button/Button.d.ts.map +1 -1
  18. package/dist/Button/Button.js +17 -1
  19. package/dist/Calendar/Calendar.d.ts.map +1 -1
  20. package/dist/Calendar/Calendar.js +18 -22
  21. package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
  22. package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
  23. package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
  24. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  25. package/dist/Calendar/hooks/useCalendarDays.js +2 -10
  26. package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
  27. package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
  28. package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +2 -0
  31. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  32. package/dist/Chat/ChatComposerInput.js +6 -1
  33. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  34. package/dist/Chat/ChatMessageList.js +2 -1
  35. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  36. package/dist/Chat/useChatDictation.js +2 -0
  37. package/dist/Chat/useChatNewMessages.js +1 -1
  38. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  39. package/dist/Chat/useChatStreamScroll.js +2 -0
  40. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  41. package/dist/Chat/useSpeechRecognition.js +3 -0
  42. package/dist/Chat/useTriggerMenu.js +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  44. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  45. package/dist/CheckboxList/CheckboxList.d.ts +20 -2
  46. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  47. package/dist/CheckboxList/CheckboxList.js +12 -4
  48. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  49. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  50. package/dist/CheckboxList/CheckboxListContext.js +2 -1
  51. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  52. package/dist/CheckboxList/CheckboxListItem.js +14 -2
  53. package/dist/CheckboxList/requiredGroup.d.ts +22 -0
  54. package/dist/CheckboxList/requiredGroup.d.ts.map +1 -0
  55. package/dist/CheckboxList/requiredGroup.js +52 -0
  56. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  57. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  58. package/dist/CodeBlock/CodeBlock.js +28 -11
  59. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  60. package/dist/CommandPalette/CommandPalette.js +2 -0
  61. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  62. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  63. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  64. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  65. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  66. package/dist/ContextMenu/ContextMenu.js +2 -2
  67. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  68. package/dist/DateInput/MonthScroller.js +5 -2
  69. package/dist/DateInput/PickerWheel.d.ts +19 -0
  70. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  71. package/dist/DateInput/PickerWheel.js +646 -0
  72. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  73. package/dist/DateInput/TouchDateField.js +9 -30
  74. package/dist/DateInput/Wheel.d.ts +18 -37
  75. package/dist/DateInput/Wheel.d.ts.map +1 -1
  76. package/dist/DateInput/Wheel.js +133 -120
  77. package/dist/DateInput/datePickerTouch.d.ts +13 -0
  78. package/dist/DateInput/datePickerTouch.d.ts.map +1 -0
  79. package/dist/DateInput/datePickerTouch.js +14 -0
  80. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  81. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  82. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  83. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  84. package/dist/DateInput/usePointerDragScroll.js +2 -0
  85. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  86. package/dist/DateInput/useScrollSettle.js +3 -0
  87. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  88. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  89. package/dist/DateInput/useWheelListbox.js +88 -0
  90. package/dist/DateInput/wheelOptions.d.ts +94 -0
  91. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  92. package/dist/DateInput/wheelOptions.js +110 -0
  93. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  94. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  95. package/dist/DateInput/wheelPhysics.js +341 -0
  96. package/dist/DateInput/wheelStrip.d.ts +92 -0
  97. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  98. package/dist/DateInput/wheelStrip.js +258 -0
  99. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  100. package/dist/DateTimeInput/TouchDateTimeField.js +70 -127
  101. package/dist/Dialog/Dialog.d.ts.map +1 -1
  102. package/dist/Dialog/Dialog.js +9 -32
  103. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  104. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  105. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  106. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  107. package/dist/Field/Field.js +2 -2
  108. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  109. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  110. package/dist/FormLayout/FormLayout.d.ts +5 -1
  111. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  112. package/dist/HoverCard/HoverCard.d.ts +6 -4
  113. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  114. package/dist/HoverCard/HoverCard.js +48 -3
  115. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  116. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  117. package/dist/HoverCard/useHoverCard.js +26 -34
  118. package/dist/Icon/Icon.d.ts +5 -1
  119. package/dist/Icon/Icon.d.ts.map +1 -1
  120. package/dist/Icon/Icon.js +20 -3
  121. package/dist/InfoTip/InfoTip.d.ts +5 -5
  122. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  123. package/dist/InfoTip/InfoTip.js +58 -19
  124. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  125. package/dist/Item/useSwipeAction.js +3 -0
  126. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  127. package/dist/Layer/modalOutlet.js +2 -0
  128. package/dist/Layer/outsidePress.d.ts.map +1 -1
  129. package/dist/Layer/outsidePress.js +1 -0
  130. package/dist/Layer/useLayer.d.ts.map +1 -1
  131. package/dist/Layer/useLayer.js +4 -1
  132. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  133. package/dist/Layer/useLayerDismissal.js +3 -0
  134. package/dist/Layer/useTouchTrigger.d.ts +13 -7
  135. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  136. package/dist/Layer/useTouchTrigger.js +20 -6
  137. package/dist/Layout/index.d.ts +1 -1
  138. package/dist/Layout/index.d.ts.map +1 -1
  139. package/dist/Layout/index.js +1 -1
  140. package/dist/Layout/layoutReset.js +1 -1
  141. package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
  142. package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
  143. package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
  144. package/dist/Layout/padding.stylex.d.ts +5 -129
  145. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  146. package/dist/Layout/padding.stylex.js +9 -143
  147. package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
  148. package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
  149. package/dist/Layout/paddingStyles.stylex.js +99 -0
  150. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  151. package/dist/Lightbox/Lightbox.js +20 -1
  152. package/dist/MobileNav/MobileNav.d.ts +3 -2
  153. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  154. package/dist/MobileNav/MobileNav.js +10 -26
  155. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  156. package/dist/MultiSelector/MultiSelector.js +2 -1
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +2 -1
  159. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  160. package/dist/Outline/useOutlineFromDOM.js +3 -0
  161. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  162. package/dist/Outline/useScrollSpy.js +3 -0
  163. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  164. package/dist/OverflowList/OverflowList.js +3 -0
  165. package/dist/Overlay/Overlay.d.ts.map +1 -1
  166. package/dist/Overlay/Overlay.js +7 -2
  167. package/dist/Popover/Popover.d.ts.map +1 -1
  168. package/dist/Popover/Popover.js +6 -0
  169. package/dist/Popover/usePopover.js +2 -2
  170. package/dist/PowerSearch/PowerSearch.d.ts +41 -4
  171. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  172. package/dist/PowerSearch/PowerSearch.js +441 -134
  173. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +125 -0
  174. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  175. package/dist/PowerSearch/PowerSearchBottomSheet.js +2041 -0
  176. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  177. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  178. package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
  179. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  180. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  181. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  182. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  183. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  184. package/dist/PowerSearch/PowerSearchToken.js +3 -2
  185. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  186. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  187. package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
  188. package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
  189. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  190. package/dist/PowerSearch/formatFilterValue.js +31 -23
  191. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  192. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  193. package/dist/PowerSearch/formatTokenValue.js +161 -0
  194. package/dist/PowerSearch/index.d.ts +1 -1
  195. package/dist/PowerSearch/index.d.ts.map +1 -1
  196. package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
  197. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  198. package/dist/PowerSearch/powerSearchDateZone.js +57 -0
  199. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  200. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  201. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  202. package/dist/PowerSearch/types.d.ts +8 -1
  203. package/dist/PowerSearch/types.d.ts.map +1 -1
  204. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  205. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  206. package/dist/RadioList/RadioList.d.ts.map +1 -1
  207. package/dist/RadioList/RadioList.js +3 -2
  208. package/dist/RadioList/RadioListItem.d.ts +1 -1
  209. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  210. package/dist/RadioList/RadioListItem.js +5 -3
  211. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  212. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  213. package/dist/Resizable/ResizeHandle.js +116 -92
  214. package/dist/Resizable/createResizable.d.ts +199 -0
  215. package/dist/Resizable/createResizable.d.ts.map +1 -0
  216. package/dist/Resizable/createResizable.js +733 -0
  217. package/dist/Resizable/separatorAttributes.d.ts +45 -0
  218. package/dist/Resizable/separatorAttributes.d.ts.map +1 -0
  219. package/dist/Resizable/separatorAttributes.js +35 -0
  220. package/dist/Resizable/useResizable.d.ts +3 -3
  221. package/dist/Resizable/useResizable.d.ts.map +1 -1
  222. package/dist/Resizable/useResizable.js +252 -459
  223. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  224. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  225. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  226. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  227. package/dist/SelectableCard/SelectableCard.js +36 -11
  228. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  229. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  230. package/dist/SelectableCard/selectableCardInput.js +20 -0
  231. package/dist/Selector/Selector.d.ts.map +1 -1
  232. package/dist/Selector/Selector.js +7 -9
  233. package/dist/SideNav/SideNav.d.ts.map +1 -1
  234. package/dist/SideNav/SideNav.js +36 -5
  235. package/dist/Slider/Slider.d.ts.map +1 -1
  236. package/dist/Slider/Slider.js +16 -11
  237. package/dist/Slider/sliderTouchController.js +2 -2
  238. package/dist/Spinner/Spinner.d.ts +1 -1
  239. package/dist/Spinner/Spinner.d.ts.map +1 -1
  240. package/dist/Spinner/Spinner.js +60 -58
  241. package/dist/Stepper/Stepper.d.ts.map +1 -1
  242. package/dist/Stepper/Stepper.js +10 -15
  243. package/dist/Switch/Switch.d.ts.map +1 -1
  244. package/dist/Switch/Switch.js +4 -10
  245. package/dist/Switch/useSwitchTouch.js +4 -4
  246. package/dist/Table/BaseTable.d.ts.map +1 -1
  247. package/dist/Table/BaseTable.js +29 -8
  248. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  249. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  250. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  251. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  252. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +12 -0
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +17 -3
  255. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  256. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  257. package/dist/Table/plugins/tree/useTableTreeData.d.ts +11 -0
  258. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  259. package/dist/Table/plugins/tree/useTableTreeData.js +27 -14
  260. package/dist/TextArea/TextArea.d.ts.map +1 -1
  261. package/dist/TextArea/TextArea.js +2 -1
  262. package/dist/TextInput/TextInput.d.ts +2 -2
  263. package/dist/TextInput/TextInput.d.ts.map +1 -1
  264. package/dist/TextInput/TextInput.js +12 -8
  265. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  266. package/dist/TimeInput/TimeInput.js +2 -0
  267. package/dist/TimeInput/TimeWheels.d.ts +32 -0
  268. package/dist/TimeInput/TimeWheels.d.ts.map +1 -0
  269. package/dist/TimeInput/TimeWheels.js +144 -0
  270. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  271. package/dist/TimeInput/TouchTimeField.js +63 -116
  272. package/dist/TimeInput/timeWheelRules.d.ts +124 -0
  273. package/dist/TimeInput/timeWheelRules.d.ts.map +1 -0
  274. package/dist/TimeInput/timeWheelRules.js +277 -0
  275. package/dist/Timer/Timer.d.ts.map +1 -1
  276. package/dist/Timer/Timer.js +2 -0
  277. package/dist/Timestamp/Timestamp.js +1 -1
  278. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  279. package/dist/Timestamp/formatInstant.js +1 -23
  280. package/dist/Toast/Toast.d.ts +11 -1
  281. package/dist/Toast/Toast.d.ts.map +1 -1
  282. package/dist/Toast/Toast.js +25 -15
  283. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  284. package/dist/Toast/ToastViewport.js +97 -34
  285. package/dist/Toast/types.d.ts +9 -3
  286. package/dist/Toast/types.d.ts.map +1 -1
  287. package/dist/Toast/useToast.d.ts.map +1 -1
  288. package/dist/Toast/useToast.js +1 -0
  289. package/dist/Tokenizer/Tokenizer.d.ts +44 -46
  290. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  291. package/dist/Tokenizer/Tokenizer.js +20 -21
  292. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  293. package/dist/Tokenizer/TokenizerBottomSheet.js +12 -18
  294. package/dist/Tokenizer/index.d.ts +1 -1
  295. package/dist/Tokenizer/index.d.ts.map +1 -1
  296. package/dist/Tooltip/Tooltip.d.ts +2 -23
  297. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  298. package/dist/Tooltip/Tooltip.js +5 -29
  299. package/dist/Tooltip/useTooltip.d.ts +23 -30
  300. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  301. package/dist/Tooltip/useTooltip.js +200 -108
  302. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  303. package/dist/Typeahead/BaseTypeahead.js +27 -18
  304. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  305. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  306. package/dist/animator/createAnimator.d.ts +98 -0
  307. package/dist/animator/createAnimator.d.ts.map +1 -0
  308. package/dist/animator/createAnimator.js +259 -0
  309. package/dist/astryx.css +53 -8
  310. package/dist/gestures/GestureHost.d.ts +16 -1
  311. package/dist/gestures/GestureHost.d.ts.map +1 -1
  312. package/dist/gestures/GestureHost.js +4 -1
  313. package/dist/gestures/PressTracker.d.ts.map +1 -1
  314. package/dist/gestures/PressTracker.js +4 -3
  315. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  316. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  317. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  318. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  319. package/dist/hooks/actionGroupTracker.js +18 -7
  320. package/dist/hooks/index.d.ts +1 -0
  321. package/dist/hooks/index.d.ts.map +1 -1
  322. package/dist/hooks/index.js +1 -0
  323. package/dist/hooks/longPressDetector.d.ts +66 -0
  324. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  325. package/dist/hooks/longPressDetector.js +200 -0
  326. package/dist/hooks/pressGroupContext.d.ts +6 -0
  327. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  328. package/dist/hooks/pressGroupContext.js +20 -0
  329. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  330. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  331. package/dist/hooks/rootScrollStyles.js +207 -0
  332. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  333. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  334. package/dist/hooks/scrollLockTouchGuard.js +117 -0
  335. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  336. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  337. package/dist/hooks/scrollbarGutter.js +36 -23
  338. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  339. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  340. package/dist/hooks/useActionGroupTracking.js +174 -0
  341. package/dist/hooks/useAnimator.d.ts +41 -0
  342. package/dist/hooks/useAnimator.d.ts.map +1 -0
  343. package/dist/hooks/useAnimator.js +70 -0
  344. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  345. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  346. package/dist/hooks/useAttachment.d.ts +1 -1
  347. package/dist/hooks/useAttachment.js +1 -1
  348. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  349. package/dist/hooks/useAutoMediaMode.js +1 -0
  350. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  351. package/dist/hooks/useBusyAnnouncement.js +2 -0
  352. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  353. package/dist/hooks/useDevWarning.js +2 -0
  354. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  355. package/dist/hooks/useFocusTrap.js +2 -0
  356. package/dist/hooks/useGridFocus.d.ts +8 -5
  357. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  358. package/dist/hooks/useGridFocus.js +4 -3
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -0
  361. package/dist/hooks/useImageMode.d.ts.map +1 -1
  362. package/dist/hooks/useImageMode.js +3 -0
  363. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  364. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  365. package/dist/hooks/useInputStatusIcon.js +2 -2
  366. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
  367. package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
  368. package/dist/hooks/useKeyboardHint.js +1 -1
  369. package/dist/hooks/useLongPress.d.ts +8 -9
  370. package/dist/hooks/useLongPress.d.ts.map +1 -1
  371. package/dist/hooks/useLongPress.js +23 -106
  372. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  373. package/dist/hooks/useMenuHover.js +2 -0
  374. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  375. package/dist/hooks/useMenuPress.js +3 -0
  376. package/dist/hooks/useOverflow.d.ts.map +1 -1
  377. package/dist/hooks/useOverflow.js +2 -1
  378. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  379. package/dist/hooks/usePressFeedback.js +1 -0
  380. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  381. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  382. package/dist/hooks/useResolvedRequired.js +3 -0
  383. package/dist/hooks/useScrollLock.d.ts +8 -9
  384. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  385. package/dist/hooks/useScrollLock.js +50 -48
  386. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  387. package/dist/hooks/useScrollableArea.js +5 -0
  388. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  389. package/dist/hooks/useStreamingText.js +3 -0
  390. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  391. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  392. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +45 -0
  393. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  394. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  395. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  396. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  397. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  398. package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts +8 -0
  399. package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts.map +1 -0
  400. package/dist/i18n/generated-english/Resizable/createResizable.generated.js +13 -0
  401. package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.d.ts.map +1 -1
  402. package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.js +3 -1
  403. package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.d.ts.map +1 -1
  404. package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.js +3 -1
  405. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts +8 -0
  406. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts.map +1 -0
  407. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.js +17 -0
  408. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  409. package/dist/i18n/generated-locales/en.generated.js +37 -0
  410. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  411. package/dist/i18n/generated-locales/pseudo.generated.js +37 -0
  412. package/dist/index.d.ts +1 -0
  413. package/dist/index.d.ts.map +1 -1
  414. package/dist/index.js +4 -0
  415. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  416. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  417. package/dist/internal/indicatorPress.stylex.js +26 -0
  418. package/dist/internal/selectable-card.d.ts +21 -0
  419. package/dist/internal/selectable-card.d.ts.map +1 -0
  420. package/dist/internal/selectable-card.js +20 -0
  421. package/dist/internal/sheetDraft.d.ts +2 -2
  422. package/dist/internal/sheetDraft.js +2 -2
  423. package/dist/keyboard/index.d.ts +17 -0
  424. package/dist/keyboard/index.d.ts.map +1 -0
  425. package/dist/keyboard/index.js +19 -0
  426. package/dist/keyboard/keyboardHeight.d.ts +149 -0
  427. package/dist/keyboard/keyboardHeight.d.ts.map +1 -0
  428. package/dist/keyboard/keyboardHeight.js +432 -0
  429. package/dist/keyboard/keyboardLayoutGuide.d.ts +59 -0
  430. package/dist/keyboard/keyboardLayoutGuide.d.ts.map +1 -0
  431. package/dist/keyboard/keyboardLayoutGuide.js +207 -0
  432. package/dist/keyboard/keyboardModel.d.ts +93 -0
  433. package/dist/keyboard/keyboardModel.d.ts.map +1 -0
  434. package/dist/keyboard/keyboardModel.js +220 -0
  435. package/dist/keyboard/rideKeyboard.d.ts +42 -0
  436. package/dist/keyboard/rideKeyboard.d.ts.map +1 -0
  437. package/dist/keyboard/rideKeyboard.js +77 -0
  438. package/dist/keyboard/useMobileKeyboard.d.ts +61 -0
  439. package/dist/keyboard/useMobileKeyboard.d.ts.map +1 -0
  440. package/dist/keyboard/useMobileKeyboard.js +699 -0
  441. package/dist/motion/android/index.d.ts +16 -0
  442. package/dist/motion/android/index.d.ts.map +1 -0
  443. package/dist/motion/android/index.js +18 -0
  444. package/dist/motion/android/keyboard.d.ts +83 -0
  445. package/dist/motion/android/keyboard.d.ts.map +1 -0
  446. package/dist/motion/android/keyboard.js +96 -0
  447. package/dist/motion/animatedLayout.d.ts +8 -0
  448. package/dist/motion/animatedLayout.d.ts.map +1 -1
  449. package/dist/motion/animatedLayout.js +246 -53
  450. package/dist/motion/animator.d.ts +14 -14
  451. package/dist/motion/animator.d.ts.map +1 -1
  452. package/dist/motion/animator.js +45 -26
  453. package/dist/motion/frameBlock.d.ts +14 -0
  454. package/dist/motion/frameBlock.d.ts.map +1 -0
  455. package/dist/motion/frameBlock.js +16 -0
  456. package/dist/motion/progress.d.ts +88 -0
  457. package/dist/motion/progress.d.ts.map +1 -0
  458. package/dist/motion/progress.js +128 -0
  459. package/dist/motion/reducedMotion.d.ts.map +1 -1
  460. package/dist/motion/reducedMotion.js +3 -1
  461. package/dist/motion/uikit/alert.d.ts +41 -0
  462. package/dist/motion/uikit/alert.d.ts.map +1 -0
  463. package/dist/motion/uikit/alert.js +43 -0
  464. package/dist/motion/uikit/datePicker.d.ts +58 -0
  465. package/dist/motion/uikit/datePicker.d.ts.map +1 -0
  466. package/dist/motion/uikit/datePicker.js +60 -0
  467. package/dist/motion/uikit/index.d.ts +6 -4
  468. package/dist/motion/uikit/index.d.ts.map +1 -1
  469. package/dist/motion/uikit/index.js +6 -4
  470. package/dist/motion/uikit/picker.d.ts +96 -0
  471. package/dist/motion/uikit/picker.d.ts.map +1 -0
  472. package/dist/motion/uikit/picker.js +117 -0
  473. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  474. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  475. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  476. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  477. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  478. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  479. package/dist/theme/Theme.d.ts.map +1 -1
  480. package/dist/theme/Theme.js +29 -4
  481. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  482. package/dist/theme/generateThemeRules.js +14 -13
  483. package/dist/theme/motionKnobs.d.ts +4 -3
  484. package/dist/theme/motionKnobs.d.ts.map +1 -1
  485. package/dist/theme/motionKnobs.js +3 -2
  486. package/dist/theme/themeMotion.d.ts +6 -0
  487. package/dist/theme/themeMotion.d.ts.map +1 -1
  488. package/dist/theme/themeMotion.js +15 -2
  489. package/dist/theme/tokens.stylex.d.ts +3 -0
  490. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  491. package/dist/theme/tokens.stylex.js +4 -1
  492. package/dist/utils/dateParser.d.ts.map +1 -1
  493. package/dist/utils/dateParser.js +12 -0
  494. package/dist/utils/disabledInteraction.d.ts +10 -2
  495. package/dist/utils/disabledInteraction.d.ts.map +1 -1
  496. package/dist/utils/disabledInteraction.js +16 -2
  497. package/dist/utils/focusReturn.d.ts +22 -25
  498. package/dist/utils/focusReturn.d.ts.map +1 -1
  499. package/dist/utils/focusReturn.js +36 -29
  500. package/dist/utils/index.d.ts +1 -1
  501. package/dist/utils/index.d.ts.map +1 -1
  502. package/dist/utils/index.js +1 -1
  503. package/dist/utils/interactionModality.d.ts.map +1 -1
  504. package/dist/utils/interactionModality.js +4 -0
  505. package/dist/utils/interactionOverlay.stylex.d.ts +6 -4
  506. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  507. package/dist/utils/interactionOverlay.stylex.js +6 -4
  508. package/dist/utils/isFocusDetached.d.ts +27 -0
  509. package/dist/utils/isFocusDetached.d.ts.map +1 -0
  510. package/dist/utils/isFocusDetached.js +32 -0
  511. package/dist/utils/layoutViewport.d.ts +25 -0
  512. package/dist/utils/layoutViewport.d.ts.map +1 -0
  513. package/dist/utils/layoutViewport.js +102 -0
  514. package/dist/utils/plainDate.d.ts +31 -0
  515. package/dist/utils/plainDate.d.ts.map +1 -1
  516. package/dist/utils/plainDate.js +68 -4
  517. package/dist/utils/pressFeedback.d.ts +6 -0
  518. package/dist/utils/pressFeedback.d.ts.map +1 -1
  519. package/dist/utils/pressFeedback.js +97 -18
  520. package/dist/utils/pressGesture.d.ts +4 -2
  521. package/dist/utils/pressGesture.d.ts.map +1 -1
  522. package/dist/utils/pressGesture.js +3 -1
  523. package/dist/utils/selectionLock.d.ts +10 -1
  524. package/dist/utils/selectionLock.d.ts.map +1 -1
  525. package/dist/utils/selectionLock.js +31 -5
  526. package/dist/utils/sharedMutationObserver.d.ts +2 -1
  527. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  528. package/dist/utils/sharedMutationObserver.js +2 -1
  529. package/dist/utils/timeParser.d.ts +2 -1
  530. package/dist/utils/timeParser.d.ts.map +1 -1
  531. package/dist/utils/timeParser.js +29 -3
  532. package/dist/utils/triggerFocus.d.ts +36 -0
  533. package/dist/utils/triggerFocus.d.ts.map +1 -0
  534. package/dist/utils/triggerFocus.js +65 -0
  535. package/locales/en.json +148 -0
  536. package/locales/pseudo.json +111 -0
  537. package/package.json +14 -9
  538. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  539. package/src/AlertDialog/AlertDialog.tsx +46 -5
  540. package/src/AppShell/AppShell.tsx +13 -4
  541. package/src/BottomSheet/BottomSheet.doc.mjs +1 -1
  542. package/src/BottomSheet/BottomSheet.tsx +1 -0
  543. package/src/BottomSheet/BottomSheetPanel.tsx +80 -16
  544. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +5 -0
  545. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  546. package/src/BottomSheet/bottomSheetStack.ts +1 -1
  547. package/src/BottomSheet/useSheetGestures.ts +16 -1
  548. package/src/Button/Button.tsx +26 -4
  549. package/src/Calendar/Calendar.tsx +40 -32
  550. package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
  551. package/src/Calendar/hooks/useCalendarDays.ts +5 -10
  552. package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
  553. package/src/Carousel/Carousel.tsx +1 -0
  554. package/src/Chat/ChatComposerInput.tsx +4 -7
  555. package/src/Chat/ChatMessageList.tsx +2 -1
  556. package/src/Chat/useChatDictation.ts +1 -0
  557. package/src/Chat/useChatNewMessages.ts +1 -1
  558. package/src/Chat/useChatStreamScroll.ts +2 -0
  559. package/src/Chat/useSpeechRecognition.ts +2 -0
  560. package/src/Chat/useTriggerMenu.tsx +1 -1
  561. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  562. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  563. package/src/CheckboxList/CheckboxList.doc.mjs +14 -0
  564. package/src/CheckboxList/CheckboxList.tsx +43 -2
  565. package/src/CheckboxList/CheckboxListContext.tsx +9 -1
  566. package/src/CheckboxList/CheckboxListItem.tsx +23 -2
  567. package/src/CheckboxList/requiredGroup.ts +77 -0
  568. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  569. package/src/CodeBlock/CodeBlock.tsx +41 -4
  570. package/src/CommandPalette/CommandPalette.tsx +1 -0
  571. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  572. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  573. package/src/ContextMenu/ContextMenu.tsx +2 -2
  574. package/src/DateInput/MonthScroller.tsx +8 -2
  575. package/src/DateInput/PickerWheel.tsx +796 -0
  576. package/src/DateInput/TouchDateField.tsx +6 -32
  577. package/src/DateInput/Wheel.tsx +188 -171
  578. package/src/DateInput/datePickerTouch.ts +15 -0
  579. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  580. package/src/DateInput/usePointerDragScroll.ts +1 -0
  581. package/src/DateInput/useScrollSettle.ts +2 -0
  582. package/src/DateInput/useWheelListbox.ts +112 -0
  583. package/src/DateInput/wheelOptions.ts +184 -0
  584. package/src/DateInput/wheelPhysics.ts +406 -0
  585. package/src/DateInput/wheelStrip.ts +341 -0
  586. package/src/DateTimeInput/TouchDateTimeField.tsx +100 -189
  587. package/src/Dialog/Dialog.tsx +12 -32
  588. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  589. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  590. package/src/Field/Field.tsx +2 -2
  591. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  592. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  593. package/src/FormLayout/FormLayout.tsx +5 -1
  594. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  595. package/src/HoverCard/HoverCard.tsx +58 -6
  596. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  597. package/src/HoverCard/useHoverCard.tsx +55 -55
  598. package/src/Icon/Icon.doc.mjs +51 -10
  599. package/src/Icon/Icon.tsx +31 -8
  600. package/src/IconButton/IconButton.doc.mjs +141 -21
  601. package/src/InfoTip/InfoTip.tsx +72 -16
  602. package/src/Item/useSwipeAction.ts +2 -0
  603. package/src/Layer/modalOutlet.ts +2 -0
  604. package/src/Layer/outsidePress.ts +1 -0
  605. package/src/Layer/useLayer.tsx +3 -1
  606. package/src/Layer/useLayerDismissal.ts +2 -0
  607. package/src/Layer/useTouchTrigger.ts +19 -6
  608. package/src/Layout/index.ts +1 -1
  609. package/src/Layout/layoutReset.ts +1 -1
  610. package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
  611. package/src/Layout/padding.stylex.ts +9 -133
  612. package/src/Layout/paddingStyles.stylex.ts +87 -0
  613. package/src/Lightbox/Lightbox.tsx +20 -1
  614. package/src/Lightbox/useLightbox.doc.mjs +167 -0
  615. package/src/MobileNav/MobileNav.tsx +10 -31
  616. package/src/MultiSelector/MultiSelector.tsx +2 -7
  617. package/src/NumberInput/NumberInput.tsx +2 -7
  618. package/src/Outline/useOutlineFromDOM.ts +2 -0
  619. package/src/Outline/useScrollSpy.ts +2 -0
  620. package/src/OverflowList/OverflowList.tsx +2 -0
  621. package/src/Overlay/Overlay.tsx +7 -2
  622. package/src/Popover/Popover.tsx +4 -0
  623. package/src/Popover/usePopover.tsx +2 -2
  624. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  625. package/src/PowerSearch/PowerSearch.tsx +622 -157
  626. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2700 -0
  627. package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
  628. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  629. package/src/PowerSearch/PowerSearchToken.tsx +2 -0
  630. package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
  631. package/src/PowerSearch/formatFilterValue.ts +49 -27
  632. package/src/PowerSearch/formatTokenValue.ts +220 -0
  633. package/src/PowerSearch/index.ts +5 -1
  634. package/src/PowerSearch/powerSearchDateZone.ts +95 -0
  635. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  636. package/src/PowerSearch/types.ts +8 -1
  637. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  638. package/src/RadioList/RadioList.tsx +3 -2
  639. package/src/RadioList/RadioListItem.tsx +5 -3
  640. package/src/Resizable/Resizable.doc.mjs +5 -4
  641. package/src/Resizable/ResizeHandle.tsx +187 -135
  642. package/src/Resizable/createResizable.ts +1046 -0
  643. package/src/Resizable/separatorAttributes.ts +73 -0
  644. package/src/Resizable/useResizable.ts +292 -623
  645. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  646. package/src/SelectableCard/SelectableCard.tsx +39 -10
  647. package/src/SelectableCard/selectableCardInput.ts +30 -0
  648. package/src/Selector/Selector.tsx +7 -19
  649. package/src/SideNav/SideNav.tsx +41 -5
  650. package/src/Slider/Slider.tsx +20 -11
  651. package/src/Slider/sliderTouchController.ts +2 -2
  652. package/src/Spinner/Spinner.tsx +77 -63
  653. package/src/Stepper/Stepper.tsx +10 -27
  654. package/src/Switch/Switch.tsx +2 -6
  655. package/src/Switch/useSwitchTouch.ts +4 -4
  656. package/src/Table/BaseTable.tsx +46 -12
  657. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  658. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  659. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +31 -7
  660. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  661. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -20
  662. package/src/Table/useTableRowExpansion.doc.mjs +9 -0
  663. package/src/Table/useTableTreeData.doc.mjs +15 -3
  664. package/src/TextArea/TextArea.tsx +2 -7
  665. package/src/TextInput/TextInput.tsx +13 -17
  666. package/src/TimeInput/TimeInput.tsx +2 -0
  667. package/src/TimeInput/TimeWheels.tsx +218 -0
  668. package/src/TimeInput/TouchTimeField.tsx +93 -155
  669. package/src/TimeInput/timeWheelRules.ts +352 -0
  670. package/src/Timer/Timer.tsx +1 -0
  671. package/src/Timestamp/Timestamp.tsx +1 -1
  672. package/src/Timestamp/formatInstant.ts +1 -33
  673. package/src/Toast/Toast.doc.mjs +4 -3
  674. package/src/Toast/Toast.tsx +52 -32
  675. package/src/Toast/ToastViewport.tsx +123 -35
  676. package/src/Toast/types.ts +9 -3
  677. package/src/Toast/useToast.tsx +1 -0
  678. package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
  679. package/src/Tokenizer/Tokenizer.tsx +61 -62
  680. package/src/Tokenizer/TokenizerBottomSheet.tsx +17 -23
  681. package/src/Tokenizer/index.ts +1 -0
  682. package/src/Tooltip/Tooltip.tsx +6 -42
  683. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  684. package/src/Tooltip/useTooltip.tsx +243 -134
  685. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  686. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  687. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  688. package/src/animator/createAnimator.doc.mjs +153 -0
  689. package/src/animator/createAnimator.ts +324 -0
  690. package/src/gestures/GestureHost.ts +6 -5
  691. package/src/gestures/PressTracker.ts +4 -3
  692. package/src/gestures/README.md +10 -4
  693. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  694. package/src/hooks/actionGroupTracker.ts +25 -9
  695. package/src/hooks/index.ts +2 -0
  696. package/src/hooks/longPressDetector.ts +273 -0
  697. package/src/hooks/pressGroupContext.ts +21 -0
  698. package/src/hooks/rootScrollStyles.ts +247 -0
  699. package/src/hooks/scrollLockTouchGuard.ts +149 -0
  700. package/src/hooks/scrollbarGutter.ts +41 -26
  701. package/src/hooks/useActionGroupTracking.ts +224 -0
  702. package/src/hooks/useAnimator.doc.mjs +109 -0
  703. package/src/hooks/useAnimator.ts +67 -0
  704. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  705. package/src/hooks/useAttachment.ts +1 -1
  706. package/src/hooks/useAutoMediaMode.ts +1 -0
  707. package/src/hooks/useBusyAnnouncement.ts +2 -0
  708. package/src/hooks/useDevWarning.ts +2 -0
  709. package/src/hooks/useFocusTrap.ts +2 -0
  710. package/src/hooks/useGridFocus.doc.mjs +6 -6
  711. package/src/hooks/useGridFocus.ts +10 -7
  712. package/src/hooks/useHotkeys.ts +2 -0
  713. package/src/hooks/useImageMode.ts +2 -0
  714. package/src/hooks/useInputStatusIcon.tsx +3 -2
  715. package/src/hooks/useKeyboardHint.tsx +1 -1
  716. package/src/hooks/useLongPress.doc.mjs +2 -2
  717. package/src/hooks/useLongPress.ts +32 -122
  718. package/src/hooks/useMenuHover.ts +1 -0
  719. package/src/hooks/useMenuPress.ts +2 -0
  720. package/src/hooks/useOverflow.ts +2 -1
  721. package/src/hooks/usePressFeedback.ts +1 -0
  722. package/src/hooks/useResolvedRequired.ts +3 -0
  723. package/src/hooks/useScrollLock.doc.mjs +51 -12
  724. package/src/hooks/useScrollLock.ts +53 -60
  725. package/src/hooks/useScrollableArea.ts +4 -0
  726. package/src/hooks/useStreamingText.ts +2 -0
  727. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +46 -0
  728. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  729. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  730. package/src/i18n/generated-english/Resizable/createResizable.generated.ts +14 -0
  731. package/src/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.ts +3 -1
  732. package/src/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.ts +3 -1
  733. package/src/i18n/generated-english/TimeInput/TimeWheels.generated.ts +18 -0
  734. package/src/i18n/generated-locales/en.generated.ts +47 -0
  735. package/src/i18n/generated-locales/pseudo.generated.ts +48 -0
  736. package/src/index.ts +13 -0
  737. package/src/internal/indicatorPress.stylex.ts +24 -0
  738. package/src/internal/selectable-card.ts +21 -0
  739. package/src/internal/sheetDraft.ts +2 -2
  740. package/src/keyboard/README.md +197 -0
  741. package/src/keyboard/index.ts +48 -0
  742. package/src/keyboard/keyboardHeight.ts +543 -0
  743. package/src/keyboard/keyboardLayoutGuide.ts +266 -0
  744. package/src/keyboard/keyboardModel.ts +301 -0
  745. package/src/keyboard/rideKeyboard.ts +100 -0
  746. package/src/keyboard/useMobileKeyboard.ts +866 -0
  747. package/src/motion/MEASUREMENTS.md +28 -0
  748. package/src/motion/README.md +12 -5
  749. package/src/motion/android/index.ts +18 -0
  750. package/src/motion/android/keyboard.ts +96 -0
  751. package/src/motion/animatedLayout.ts +323 -60
  752. package/src/motion/animator.ts +66 -37
  753. package/src/motion/frameBlock.ts +16 -0
  754. package/src/motion/progress.ts +155 -0
  755. package/src/motion/reducedMotion.ts +3 -1
  756. package/src/motion/uikit/alert.ts +43 -0
  757. package/src/motion/uikit/datePicker.ts +60 -0
  758. package/src/motion/uikit/index.ts +6 -4
  759. package/src/motion/uikit/picker.ts +116 -0
  760. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  761. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  762. package/src/theme/Theme.tsx +37 -3
  763. package/src/theme/generateThemeRules.ts +14 -12
  764. package/src/theme/motionKnobs.ts +4 -3
  765. package/src/theme/themeMotion.ts +17 -2
  766. package/src/theme/tokens.stylex.ts +2 -0
  767. package/src/utils/dateParser.ts +16 -0
  768. package/src/utils/disabledInteraction.ts +23 -2
  769. package/src/utils/focusReturn.ts +38 -31
  770. package/src/utils/index.ts +1 -1
  771. package/src/utils/interactionModality.ts +4 -0
  772. package/src/utils/interactionOverlay.stylex.ts +6 -4
  773. package/src/utils/isFocusDetached.ts +34 -0
  774. package/src/utils/layoutViewport.ts +104 -0
  775. package/src/utils/plainDate.ts +80 -4
  776. package/src/utils/pressFeedback.ts +126 -30
  777. package/src/utils/pressGesture.ts +4 -2
  778. package/src/utils/selectionLock.ts +40 -6
  779. package/src/utils/sharedMutationObserver.ts +2 -1
  780. package/src/utils/timeParser.ts +40 -3
  781. package/src/utils/triggerFocus.ts +80 -0
  782. package/dist/BottomSheet/useMobileKeyboard.d.ts +0 -21
  783. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +0 -1
  784. package/dist/BottomSheet/useMobileKeyboard.js +0 -407
  785. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
  786. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
  787. package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
  788. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
  789. package/dist/Layer/usePressPin.d.ts +0 -93
  790. package/dist/Layer/usePressPin.d.ts.map +0 -1
  791. package/dist/Layer/usePressPin.js +0 -363
  792. package/dist/internal/touch-sheet.d.ts +0 -21
  793. package/dist/internal/touch-sheet.d.ts.map +0 -1
  794. package/dist/internal/touch-sheet.js +0 -19
  795. package/src/BottomSheet/useMobileKeyboard.ts +0 -538
  796. package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
  797. package/src/Layer/usePressPin.ts +0 -510
  798. package/src/internal/touch-sheet.ts +0 -21
@@ -0,0 +1,866 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useMobileKeyboard.ts
7
+ * @input A target element and its scroll area, the keyboard module's reports
8
+ * and focus claim, and the layout guide
9
+ * @output useMobileKeyboard, which keeps a focused field in the target above
10
+ * the on-screen keyboard and returns the inset and a dismiss
11
+ * @position Keyboard module, internal to core. BottomSheet passes its panel.
12
+ *
13
+ * SYNC: When modified, update /packages/core/src/keyboard/README.md
14
+ */
15
+
16
+ import {useCallback, useEffect, useRef, useState, type RefObject} from 'react';
17
+ import {flushSync} from 'react-dom';
18
+ import {useAttachment} from '../hooks/useAttachment';
19
+ import {useMediaQuery} from '../hooks/useMediaQuery';
20
+ import {animatorFor, type Animator} from '../motion/animator';
21
+ import {subscribeInput} from '../utils/inputStream';
22
+ import {layoutViewportHeight} from '../utils/layoutViewport';
23
+ import {observeResize} from '../utils/sharedResizeObserver';
24
+ import {TOUCH_QUERY} from '../utils/touchPresentation';
25
+ import {
26
+ KEYBOARD_EPSILON,
27
+ findTextEntryControl,
28
+ getKeyboardHeight,
29
+ isKeyboardMeasurable,
30
+ isNodeTarget,
31
+ isTextEntryControl,
32
+ refuseFocusReveal,
33
+ subscribeKeyboardHeight,
34
+ watchRevealPan,
35
+ } from './keyboardHeight';
36
+ import {getKeyboardLayoutGuide, keyboardProfileOf} from './keyboardLayoutGuide';
37
+ import type {KeyboardTransition} from './keyboardModel';
38
+ import {rideKeyboard} from './rideKeyboard';
39
+
40
+ // Chrome on Android pans the page itself if the keyboard still covers the
41
+ // focused field about 100 to 170 ms after the report. A field a fraction of a
42
+ // pixel under the keyboard's top still counts as covered. So the reveal sets
43
+ // the field 4 px above that top in the report's own commit, and only the rest
44
+ // rides.
45
+ const FIELD_CLEARANCE_AT_REPORT = 4;
46
+
47
+ /** How a target keeps a focused field above the on-screen keyboard. */
48
+ export interface MobileKeyboardOptions {
49
+ /**
50
+ * How the target moves the field: `'ride'` reveals it with the scroller
51
+ * and rides the scroller's content on the keyboard's slide.
52
+ */
53
+ move: 'ride';
54
+ /**
55
+ * Reserves the keyboard's inset at the end of the target's scroll area,
56
+ * the first element inside it that `useScrollableArea` marks with
57
+ * `data-scroll-axis`.
58
+ */
59
+ inset?: boolean;
60
+ /** The gap kept between the focused field and the keyboard, CSS px. */
61
+ offset: number;
62
+ /** Whether the target follows the keyboard at all. */
63
+ isEnabled: boolean;
64
+ /** Whether the target is at its full height, where it reveals fields. */
65
+ isExpanded: boolean;
66
+ /** Whether the target is open. Focus that leaves for nothing parks on it. */
67
+ isOpen: boolean;
68
+ /** Whether the page's own scroll is locked under the target. */
69
+ isPageScrollLocked: boolean;
70
+ }
71
+
72
+ /** What useMobileKeyboard returns. */
73
+ export interface MobileKeyboard {
74
+ /** The inset the target lays out at its scroller's content end, CSS px. */
75
+ readonly inset: number;
76
+ /**
77
+ * Dismisses the keyboard, keeping the inset while the keyboard goes. The
78
+ * focused field blurs, or `focusTarget` takes focus.
79
+ */
80
+ readonly dismiss: (focusTarget?: HTMLElement) => void;
81
+ }
82
+
83
+ interface KeyboardGeometry {
84
+ bodyBottom: number;
85
+ }
86
+
87
+ function getObstructionTop(): number {
88
+ return layoutViewportHeight(window) - getKeyboardHeight(window);
89
+ }
90
+
91
+ // Windows whose browser revealed a focused field itself right after the
92
+ // keyboard's report, by panning the visual viewport to it. Firefox for
93
+ // Android does so 54 to 143 ms after the report while the field is under the
94
+ // keyboard. The module learns this from the behavior, never from the user
95
+ // agent.
96
+ // From then on, a sheet there reveals its field at once, in the report's own
97
+ // frame.
98
+ let revealsAtReport = new WeakSet<Window>();
99
+
100
+ /** Forgets every window's recorded reveal, for tests. */
101
+ export function __resetRevealsAtReportForTest(): void {
102
+ revealsAtReport = new WeakSet<Window>();
103
+ }
104
+
105
+ // How far the body runs under the keyboard's top, CSS px. The keyboard's top
106
+ // comes from `innerHeight`, a whole number of CSS px, but the visual viewport
107
+ // and element rects are fractional. On the Android emulator, Chrome's visual
108
+ // viewport is 754.3 px over a 754 px layout viewport. A sheet sized to it
109
+ // then ends 0.3 px below `innerHeight` with no keyboard up. So an overlap
110
+ // under one CSS px is `innerHeight`'s precision, not an obstruction.
111
+ function overlapOf(bodyBottom: number, obstructionTop: number): number {
112
+ const overlap = bodyBottom - obstructionTop;
113
+ return overlap > KEYBOARD_EPSILON ? overlap : 0;
114
+ }
115
+
116
+ // Under half a pixel is rounding, not a keyboard.
117
+ function isVisualViewportRecovered(): boolean {
118
+ return getKeyboardHeight(window) <= 0.5;
119
+ }
120
+
121
+ /**
122
+ * Keeps a focused field in `targetRef`'s element above the on-screen
123
+ * keyboard (see README.md). A sheet passes its panel, and the hook reserves
124
+ * the inset in the panel's scroll area. Returns the inset the keyboard takes
125
+ * at the end of that area's content, CSS px, or 0 without a keyboard, and a
126
+ * dismiss.
127
+ *
128
+ * @example
129
+ * ```
130
+ * const keyboard = useMobileKeyboard(panelRef, {move: 'ride', inset: true, offset: 48, isEnabled, isExpanded, isOpen, isPageScrollLocked});
131
+ * ```
132
+ */
133
+ export function useMobileKeyboard(
134
+ targetRef: RefObject<HTMLElement | null>,
135
+ {
136
+ inset: reservesInset = false,
137
+ offset,
138
+ isEnabled,
139
+ isExpanded,
140
+ isOpen,
141
+ isPageScrollLocked,
142
+ }: MobileKeyboardOptions,
143
+ ): MobileKeyboard {
144
+ // The inset the keyboard takes at the end of the body's content, CSS px.
145
+ // The target lays it out after its content box's children, through a
146
+ // functional style.
147
+ const [keyboardInset, setKeyboardInset] = useState(0);
148
+ const hasKeyboardLayoutRef = useRef(false);
149
+ const retainKeyboardLayoutRef = useRef(false);
150
+ const isEnabledRef = useRef(isEnabled);
151
+ const isExpandedRef = useRef(isExpanded);
152
+ const isOpenRef = useRef(isOpen);
153
+ isEnabledRef.current = isEnabled;
154
+ isExpandedRef.current = isExpanded;
155
+ isOpenRef.current = isOpen;
156
+ // Touch-only work, the ride and the reveal-pan watch, attaches only under a
157
+ // coarse primary pointer (the touch query). Under a fine one, the hook
158
+ // registers no touch listener.
159
+ const isTouch = useMediaQuery(TOUCH_QUERY, false);
160
+
161
+ const dismiss = useCallback(
162
+ (focusTarget?: HTMLElement) => {
163
+ const target = targetRef.current;
164
+ const activeElement = document.activeElement;
165
+ if (
166
+ !isEnabledRef.current ||
167
+ target == null ||
168
+ !(activeElement instanceof HTMLElement) ||
169
+ activeElement === target ||
170
+ !target.contains(activeElement)
171
+ ) {
172
+ return;
173
+ }
174
+ // Keep the current keyboard scroll range while the keyboard goes.
175
+ // Viewport resize events unwind that layout as the visual viewport
176
+ // recovers, avoiding a content jump on the first drag frame.
177
+ retainKeyboardLayoutRef.current = hasKeyboardLayoutRef.current;
178
+ if (focusTarget == null) {
179
+ activeElement.blur();
180
+ } else {
181
+ focusTarget.focus({preventScroll: true});
182
+ }
183
+ },
184
+ [targetRef],
185
+ );
186
+
187
+ // Syncs the on-screen keyboard with closing: a target that closes blurs its
188
+ // focused field, which dismisses the keyboard.
189
+ useEffect(() => {
190
+ if (isEnabled && !isOpen) {
191
+ dismiss();
192
+ }
193
+ }, [dismiss, isEnabled, isOpen]);
194
+
195
+ useAttachment(
196
+ targetRef,
197
+ sheet => {
198
+ const body = sheet.querySelector<HTMLElement>('[data-scroll-axis]');
199
+ if (!isEnabled || !reservesInset || body == null) {
200
+ return () => {};
201
+ }
202
+
203
+ let keyboardGeometry: KeyboardGeometry | null = null;
204
+ // Where a smooth reveal under way is taking the body's scrollTop.
205
+ let smoothTarget: number | null = null;
206
+ // The inset laid out at the end of the body's content, CSS px, and the
207
+ // scroll range it adds there. The inset's drop takes that range back. The
208
+ // two can differ: Chrome 124 added 344 px of range for a 360 px inset.
209
+ let laidOutInset = 0;
210
+ let insetRange = 0;
211
+ // Where the keyboard layout guide publishes the keyboard's own slide, as
212
+ // Gboard's in Chrome on Android, the sheet's content rides it. This needs
213
+ // a coarse primary pointer and Chrome's schedule. Under a fine pointer
214
+ // nothing of the ride attaches. In a browser without the VirtualKeyboard
215
+ // API, such as iOS Safari or Firefox for Android, the guide never starts.
216
+ // There the inset follows the reports. The hook subscribes to the guide
217
+ // before the keyboard module below, so the guide publishes a report's
218
+ // transition before the reveal reads it.
219
+ const guide =
220
+ isTouch && keyboardProfileOf(window) === 'chromium'
221
+ ? getKeyboardLayoutGuide(window)
222
+ : null;
223
+ const contentAnimator = (): Animator | null => {
224
+ const content = body.firstElementChild;
225
+ return guide != null && content instanceof HTMLElement
226
+ ? animatorFor(content)
227
+ : null;
228
+ };
229
+ // How far a ride has moved the content from where its layout puts it, as
230
+ // the page draws it now. The reveal reads a control's rect in the same
231
+ // frame.
232
+ const rideOffset = () => {
233
+ const content = body.firstElementChild;
234
+ if (!(content instanceof HTMLElement)) {
235
+ return 0;
236
+ }
237
+ const translate = getComputedStyle(content).translate;
238
+ return parseFloat(translate.split(' ')[1] ?? '') || 0;
239
+ };
240
+ // The keyboard's show the guide plays on its slide right now, if any. At
241
+ // a report, a show whose slide has ended counts too. A busy page can read
242
+ // the report that late, and the ride then lands at once.
243
+ const showOnSlide = (atReport: boolean): KeyboardTransition | null => {
244
+ const transition = guide?.transition;
245
+ return transition != null &&
246
+ transition.kind === 'show' &&
247
+ transition.animated &&
248
+ transition.curve != null &&
249
+ (atReport ||
250
+ performance.now() < transition.start + transition.curve.durationMs)
251
+ ? transition
252
+ : null;
253
+ };
254
+ // A hide the hook holds the inset through (see holdInsetThrough).
255
+ let heldHide: {readonly release: () => void} | null = null;
256
+ let documentScrollAtKeyboard: {x: number; y: number} | null = null;
257
+ // The keyboard's top and the body's scroll when the keyboard came up. A
258
+ // keyboard that closes puts the body back at that scroll.
259
+ let keyboardObstructionTop: number | null = null;
260
+ let bodyScrollTopAtKeyboard: number | null = null;
261
+ // The hook takes focus moves over where this window measures the
262
+ // keyboard, never by user agent, and only under a coarse primary pointer.
263
+ // Under a fine one, it registers no touch-only listener.
264
+ // Desktop Safari and Firefox measure too, but show no on-screen keyboard
265
+ // and keep the browser's own focus. The effect runs again when the
266
+ // pointer changes, so a tablet that docks a mouse drops the claim.
267
+ const ownsFocusTransitions = isTouch && isKeyboardMeasurable(window);
268
+
269
+ // Lays the inset out before anything measures or scrolls the body: the
270
+ // reveal scrolls into the inset it adds in the same frame.
271
+ const writeInset = (inset: number) => {
272
+ const changes = inset !== laidOutInset;
273
+ const rangeBefore = changes ? body.scrollHeight : 0;
274
+ laidOutInset = inset;
275
+ // eslint-disable-next-line @eslint-react/dom-no-flush-sync -- the reveal scrolls into this inset in the same frame, so it must be laid out before the reveal measures
276
+ flushSync(() => setKeyboardInset(inset));
277
+ if (changes) {
278
+ insetRange =
279
+ inset === 0
280
+ ? 0
281
+ : Math.max(0, insetRange + body.scrollHeight - rangeBefore);
282
+ }
283
+ };
284
+
285
+ const clearKeyboardLayout = () => {
286
+ writeInset(0);
287
+ if (bodyScrollTopAtKeyboard != null) {
288
+ smoothTarget = null;
289
+ body.scrollTop = bodyScrollTopAtKeyboard;
290
+ }
291
+ keyboardGeometry = null;
292
+ keyboardObstructionTop = null;
293
+ bodyScrollTopAtKeyboard = null;
294
+ documentScrollAtKeyboard = null;
295
+ hasKeyboardLayoutRef.current = false;
296
+ retainKeyboardLayoutRef.current = false;
297
+ };
298
+
299
+ // `within` is how far below its resting place the control can sit and
300
+ // still clear the keyboard.
301
+ const scrollBodyBy = (
302
+ distance: number,
303
+ smoothly: boolean,
304
+ ride: KeyboardTransition | null = null,
305
+ within: number | null = null,
306
+ ) => {
307
+ smoothTarget = null;
308
+ const animator = ride == null ? null : contentAnimator();
309
+ if (ride != null && animator != null) {
310
+ // The body lands at once, and its content rides the keyboard's slide
311
+ // up from the slide's start. The content starts no lower than
312
+ // `within`, so the control clears the keyboard in this commit. Content
313
+ // that joins the slide late is where the keyboard is (rideKeyboard). A
314
+ // further scroll during the slide adds to the same ride.
315
+ const before = body.scrollTop;
316
+ body.scrollTop = before + distance;
317
+ const moved = body.scrollTop - before;
318
+ // Only what the body actually scrolled rides. A remainder under the
319
+ // scroll position's precision moves nothing, so the ride under way
320
+ // stays on its curve.
321
+ if (moved !== 0) {
322
+ const from = animator.get('y', ride.start) + moved;
323
+ animator.set({y: within == null ? from : Math.min(from, within)});
324
+ rideKeyboard(animator, {y: 0}, ride, {entrance: within != null});
325
+ }
326
+ return;
327
+ }
328
+ if (typeof body.scrollBy !== 'function') {
329
+ body.scrollTop += distance;
330
+ return;
331
+ }
332
+ // Reduce Motion applies on any pointer.
333
+ const reduceMotion =
334
+ typeof window.matchMedia === 'function' &&
335
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches;
336
+ const behavior = smoothly && !reduceMotion ? 'smooth' : 'instant';
337
+ if (behavior === 'smooth') {
338
+ smoothTarget = body.scrollTop + distance;
339
+ }
340
+ body.scrollBy({
341
+ top: distance,
342
+ // Not 'auto', which defers to the element's computed
343
+ // `scroll-behavior`. A consumer's `scroll-behavior: smooth` would then
344
+ // animate a scroll this hook needs to land in the same frame.
345
+ behavior,
346
+ });
347
+ };
348
+
349
+ // The distance a smooth reveal under way has still to scroll, as far as
350
+ // the body can scroll. It is 0 once it has landed, or with none under way.
351
+ const smoothDistanceLeft = () => {
352
+ if (smoothTarget == null) {
353
+ return 0;
354
+ }
355
+ const maxScroll = Math.max(
356
+ body.scrollTop,
357
+ body.scrollHeight - body.clientHeight,
358
+ );
359
+ const target = Math.min(smoothTarget, maxScroll);
360
+ const left = target - body.scrollTop;
361
+ return Math.abs(left) < 1 ? 0 : left;
362
+ };
363
+
364
+ // Scroll `control` into the part of the body the keyboard leaves visible,
365
+ // reading live geometry each time.
366
+ const scrollControlIntoSafeArea = (
367
+ control: HTMLElement,
368
+ smoothly: boolean,
369
+ ride: KeyboardTransition | null = null,
370
+ ) => {
371
+ const measuredBodyRect = body.getBoundingClientRect();
372
+ const measuredControlRect = control.getBoundingClientRect();
373
+ const obstructionTop = getObstructionTop();
374
+ // Under a pixel of overhang is `innerHeight`'s precision, not a
375
+ // keyboard: no suggestion clearance then (overlapOf).
376
+ const overlap = overlapOf(measuredBodyRect.bottom, obstructionTop);
377
+ const clearance = overlap > 0 ? offset : 0;
378
+ const safeTop = measuredBodyRect.top;
379
+ const safeBottom = Math.min(
380
+ measuredBodyRect.bottom,
381
+ obstructionTop - clearance,
382
+ );
383
+ if (safeBottom <= safeTop) {
384
+ return;
385
+ }
386
+
387
+ // Where the control will be once a smooth reveal under way lands. If
388
+ // that lands the control, a second scroll would overshoot in Firefox.
389
+ // Firefox keeps adding a smooth scrollBy's distance after another
390
+ // scroll. A ride's translate is not where the layout puts the control
391
+ // either.
392
+ const pending = smoothDistanceLeft() + rideOffset();
393
+ const controlBottom = measuredControlRect.bottom - pending;
394
+ const controlTop = measuredControlRect.top - pending;
395
+ if (controlBottom > safeBottom) {
396
+ scrollBodyBy(
397
+ controlBottom - safeBottom,
398
+ smoothly,
399
+ ride,
400
+ Math.max(
401
+ 0,
402
+ obstructionTop - safeBottom - FIELD_CLEARANCE_AT_REPORT,
403
+ ),
404
+ );
405
+ } else if (controlTop < safeTop) {
406
+ scrollBodyBy(controlTop - safeTop, smoothly, ride);
407
+ }
408
+ };
409
+
410
+ const applyKeyboardGeometry = (geometry: KeyboardGeometry) => {
411
+ const obstructionTop = getObstructionTop();
412
+ // A collapsed detent can extend the body below the layout viewport even
413
+ // after the keyboard closes, so body overlap alone cannot identify
414
+ // recovery. Once the visual viewport is full height again, release the
415
+ // retained keyboard layout unconditionally.
416
+ if (isVisualViewportRecovered()) {
417
+ clearKeyboardLayout();
418
+ return;
419
+ }
420
+ const overlap = overlapOf(geometry.bodyBottom, obstructionTop);
421
+ if (overlap === 0) {
422
+ clearKeyboardLayout();
423
+ return;
424
+ }
425
+
426
+ const inset = Math.max(
427
+ 0,
428
+ geometry.bodyBottom - (obstructionTop - offset),
429
+ );
430
+ writeInset(inset);
431
+ };
432
+
433
+ // Take every focus move into a field over before the browser performs it
434
+ // (refuseFocusReveal). That handler does not reveal the field. Focusing
435
+ // it raises focusin, and the viewport report that follows the keyboard
436
+ // raises another. Both schedule the reveal below, which knows the safe
437
+ // area and scrolls only the sheet's own body.
438
+ //
439
+ // The keyboard's Done button parks focus on the body. The handler parks
440
+ // focus that leaves for nothing on the sheet instead. Then a second tap on
441
+ // the same field is still a move the handler sees. Left on the body, the field
442
+ // is already `document.activeElement` on the next tap. Then no blur fires,
443
+ // and the browser reveals the field its own way. This applies only while
444
+ // the sheet is open. Closing blurs the field too, and no next tap needs a
445
+ // claim. The host restores focus to whatever opened the sheet.
446
+ const claimFocusTransitions = () =>
447
+ refuseFocusReveal(document, {
448
+ isActive: () => isExpandedRef.current,
449
+ claim: destination => findTextEntryControl(destination, body),
450
+ park: origin => {
451
+ if (isOpenRef.current && findTextEntryControl(origin, body)) {
452
+ sheet.focus({preventScroll: true});
453
+ }
454
+ },
455
+ });
456
+
457
+ const revealFocusedControl = (atReport = false) => {
458
+ // Through a hide the sheet rides, its layout holds until the end.
459
+ if (heldHide != null) {
460
+ return;
461
+ }
462
+ const obstructionTop = getObstructionTop();
463
+ const activeElement = document.activeElement;
464
+ const focusedControl =
465
+ activeElement instanceof HTMLElement &&
466
+ body.contains(activeElement) &&
467
+ isTextEntryControl(activeElement)
468
+ ? activeElement
469
+ : null;
470
+ // The keyboard can close while its field keeps focus, as a downward
471
+ // dismissal does on iOS. The full clear puts back the inset and the
472
+ // body's scroll. The hook then reveals the field still focused in the
473
+ // restored body, because it may not be the field that opened the
474
+ // keyboard.
475
+ if (hasKeyboardLayoutRef.current && isVisualViewportRecovered()) {
476
+ clearKeyboardLayout();
477
+ if (isExpandedRef.current && focusedControl != null) {
478
+ scrollControlIntoSafeArea(focusedControl, false);
479
+ }
480
+ return;
481
+ }
482
+ if (!isExpandedRef.current || focusedControl == null) {
483
+ if (retainKeyboardLayoutRef.current && keyboardGeometry) {
484
+ applyKeyboardGeometry(keyboardGeometry);
485
+ return;
486
+ }
487
+ clearKeyboardLayout();
488
+ return;
489
+ }
490
+
491
+ // An iOS keyboard dismissed by a drag can leave its accessory bar, so
492
+ // the visual viewport grows short of full height. The body goes back
493
+ // to its scroll from before the keyboard as soon as that starts. The
494
+ // reveal below still clears what covers a low field. The new top is
495
+ // kept, so a later content change does not repeat this.
496
+ if (
497
+ hasKeyboardLayoutRef.current &&
498
+ keyboardObstructionTop != null &&
499
+ obstructionTop > keyboardObstructionTop + 0.5 &&
500
+ bodyScrollTopAtKeyboard != null
501
+ ) {
502
+ smoothTarget = null;
503
+ body.scrollTop = bodyScrollTopAtKeyboard;
504
+ keyboardObstructionTop = obstructionTop;
505
+ }
506
+
507
+ retainKeyboardLayoutRef.current = false;
508
+
509
+ const measuredBodyRect = body.getBoundingClientRect();
510
+ const overlap = overlapOf(measuredBodyRect.bottom, obstructionTop);
511
+ // The extra clearance leaves space for mobile suggestion UI, but only
512
+ // while the visual viewport actually overlaps the sheet. With no
513
+ // obstruction, ordinary desktop and hardware-keyboard focus must not
514
+ // shift an already visible control.
515
+ const clearance = overlap > 0 ? offset : 0;
516
+ keyboardGeometry =
517
+ overlap > 0
518
+ ? {
519
+ bodyBottom: measuredBodyRect.bottom,
520
+ }
521
+ : null;
522
+ // Where the document sits with the keyboard up and nothing yet shifted:
523
+ // the position handleDocumentScroll returns to. Captured on the
524
+ // transition only — a reveal that runs after the browser has already
525
+ // scrolled would otherwise record the shifted position as correct.
526
+ if (overlap > 0 && !hasKeyboardLayoutRef.current) {
527
+ keyboardObstructionTop = obstructionTop;
528
+ bodyScrollTopAtKeyboard = body.scrollTop;
529
+ if (isPageScrollLocked) {
530
+ documentScrollAtKeyboard = {x: window.scrollX, y: window.scrollY};
531
+ }
532
+ }
533
+ hasKeyboardLayoutRef.current = overlap > 0;
534
+
535
+ const inset =
536
+ overlap > 0
537
+ ? Math.max(
538
+ 0,
539
+ measuredBodyRect.bottom - (obstructionTop - clearance),
540
+ )
541
+ : 0;
542
+ writeInset(inset);
543
+
544
+ scrollControlIntoSafeArea(
545
+ focusedControl,
546
+ overlap > 0 && !revealsAtReport.has(window),
547
+ overlap > 0 ? showOnSlide(atReport) : null,
548
+ );
549
+ };
550
+
551
+ // Where the body's scroll rests once the keyboard is gone, as
552
+ // revealFocusedControl leaves it. The clear puts back the scroll from
553
+ // before the keyboard, within the range left once the inset drops. The
554
+ // reveal then brings a field that keeps focus into the body's view.
555
+ const restingScrollTop = (): number => {
556
+ const scrollTop = body.scrollTop;
557
+ const maxAtRest = Math.max(
558
+ 0,
559
+ body.scrollHeight - insetRange - body.clientHeight,
560
+ );
561
+ let resting = Math.min(maxAtRest, bodyScrollTopAtKeyboard ?? scrollTop);
562
+ const active = document.activeElement;
563
+ if (
564
+ isExpandedRef.current &&
565
+ active instanceof HTMLElement &&
566
+ body.contains(active) &&
567
+ isTextEntryControl(active)
568
+ ) {
569
+ const bodyRect = body.getBoundingClientRect();
570
+ const rect = active.getBoundingClientRect();
571
+ // Where the layout puts the control at the resting scroll.
572
+ const shift = scrollTop - resting - rideOffset();
573
+ if (rect.bottom + shift > bodyRect.bottom) {
574
+ resting += rect.bottom + shift - bodyRect.bottom;
575
+ } else if (rect.top + shift < bodyRect.top) {
576
+ resting += rect.top + shift - bodyRect.top;
577
+ }
578
+ resting = Math.min(maxAtRest, Math.max(0, resting));
579
+ }
580
+ return resting;
581
+ };
582
+
583
+ // Through a hide on the keyboard's slide, the inset stays, so nothing
584
+ // drops while the keyboard still covers the sheet's bottom. The content
585
+ // rides down on the hide's curve by the scroll the body drops at rest. At
586
+ // rest, the inset drops, the scroll goes back, and the translate clears in
587
+ // one commit.
588
+ const holdInsetThrough = (transition: KeyboardTransition) => {
589
+ heldHide?.release();
590
+ const animator = contentAnimator();
591
+ const drop = body.scrollTop - restingScrollTop();
592
+ const handle =
593
+ animator != null && drop !== 0
594
+ ? rideKeyboard(animator, {y: drop}, transition)
595
+ : null;
596
+ let timer: ReturnType<typeof setTimeout> | undefined;
597
+ const hold = {
598
+ release: () => {
599
+ clearTimeout(timer);
600
+ if (heldHide === hold) {
601
+ heldHide = null;
602
+ }
603
+ },
604
+ };
605
+ heldHide = hold;
606
+ const commit = () => {
607
+ if (heldHide !== hold) {
608
+ return;
609
+ }
610
+ heldHide = null;
611
+ revealFocusedControl();
612
+ animator?.set({y: 0});
613
+ };
614
+ if (handle == null) {
615
+ const end = transition.start + (transition.curve?.durationMs ?? 0);
616
+ timer = setTimeout(commit, Math.max(0, end - performance.now()));
617
+ } else {
618
+ void handle.finished.then(commit);
619
+ }
620
+ };
621
+ const unsubscribeGuide = guide?.subscribe(transition => {
622
+ // A jump lands with the reports: only a slide rides.
623
+ if (transition.curve == null) {
624
+ return;
625
+ }
626
+ if (transition.kind === 'hide') {
627
+ if (hasKeyboardLayoutRef.current && transition.animated) {
628
+ holdInsetThrough(transition);
629
+ }
630
+ return;
631
+ }
632
+ if (heldHide != null) {
633
+ // The keyboard comes back before it is down (focus returns): the
634
+ // inset never left, so the content rides back to its place with it.
635
+ heldHide.release();
636
+ const animator = contentAnimator();
637
+ if (animator != null) {
638
+ rideKeyboard(animator, {y: 0}, transition);
639
+ }
640
+ }
641
+ });
642
+
643
+ let animationFrame = 0;
644
+ const scheduleReveal = () => {
645
+ cancelAnimationFrame(animationFrame);
646
+ animationFrame = requestAnimationFrame(() => revealFocusedControl());
647
+ };
648
+
649
+ // Resuming the app re-reveals the focused field with no focus event to
650
+ // claim. The reveal above never runs, and the document scrolls with the
651
+ // fixed sheet. Put that scroll back on the event that reports it, and
652
+ // reveal again inside the sheet.
653
+ //
654
+ // This applies only while the page is locked. Only then can a document
655
+ // scroll not be the user's own. Behind a non-modal sheet the page stays
656
+ // scrollable, and a revert there would fight the user.
657
+ const handleDocumentScroll = () => {
658
+ const expected = documentScrollAtKeyboard;
659
+ if (
660
+ expected == null ||
661
+ (window.scrollX === expected.x && window.scrollY === expected.y)
662
+ ) {
663
+ return;
664
+ }
665
+ window.scrollTo(expected.x, expected.y);
666
+ const activeElement = document.activeElement;
667
+ if (
668
+ activeElement instanceof HTMLElement &&
669
+ body.contains(activeElement) &&
670
+ isTextEntryControl(activeElement)
671
+ ) {
672
+ scrollControlIntoSafeArea(activeElement, false);
673
+ }
674
+ };
675
+
676
+ let stopObserving: (() => void)[] = [];
677
+ const refreshObservedLayout = () => {
678
+ if (typeof ResizeObserver === 'undefined') {
679
+ return;
680
+ }
681
+ for (const stop of stopObserving) {
682
+ stop();
683
+ }
684
+ stopObserving = [];
685
+
686
+ // Body and sheet box changes include public height and xstyle updates.
687
+ // The inset pseudo-element is the content box's last box. Where the
688
+ // content grows with it, the observation runs the reveal again. The
689
+ // reveal computes the same inset from the body's unchanged box, so
690
+ // nothing feeds back into the sheet's geometry.
691
+ const targets = new Set<Element>([body, sheet]);
692
+ for (const child of body.children) {
693
+ targets.add(child);
694
+ }
695
+ const activeElement = document.activeElement;
696
+ if (
697
+ activeElement instanceof HTMLElement &&
698
+ body.contains(activeElement)
699
+ ) {
700
+ for (
701
+ let element: HTMLElement | null = activeElement;
702
+ element && element !== body;
703
+ element = element.parentElement
704
+ ) {
705
+ targets.add(element);
706
+ }
707
+ }
708
+ for (const target of targets) {
709
+ stopObserving.push(observeResize(target, scheduleReveal));
710
+ }
711
+ };
712
+ const mutationObserver =
713
+ typeof MutationObserver === 'undefined'
714
+ ? null
715
+ : new MutationObserver(records => {
716
+ // Skip the sheet's own attribute writes on the body. Consumer
717
+ // DOM, text, class, style, or visibility changes can all move the
718
+ // focused control without a viewport event. The inset's write on
719
+ // the content box schedules one more reveal, which finds the same
720
+ // inset and settles.
721
+ if (
722
+ records.every(
723
+ record =>
724
+ record.type === 'attributes' && record.target === body,
725
+ )
726
+ ) {
727
+ return;
728
+ }
729
+ refreshObservedLayout();
730
+ scheduleReveal();
731
+ });
732
+ const handleFocusIn = () => {
733
+ refreshObservedLayout();
734
+ scheduleReveal();
735
+ };
736
+ const handleFocusOut = () => {
737
+ // Keep the added scroll range while the keyboard animates away. A focus
738
+ // transition to another text-entry control cancels this in focusin.
739
+ retainKeyboardLayoutRef.current = hasKeyboardLayoutRef.current;
740
+ scheduleReveal();
741
+ };
742
+ const handleSheetTransitionEnd = (event: TransitionEvent) => {
743
+ if (event.target === sheet && event.propertyName === 'transform') {
744
+ scheduleReveal();
745
+ }
746
+ };
747
+
748
+ const stopClaiming = ownsFocusTransitions
749
+ ? claimFocusTransitions()
750
+ : null;
751
+ // The hook reveals a keyboard report in its own frame, not the next. A browser
752
+ // that reveals a focused field itself pans the visual viewport to it a few
753
+ // frames after the report. It does so if the keyboard still covers the
754
+ // field. Such a pan moves the visual viewport down within the layout
755
+ // viewport, with no touch, document scroll or zoom since the report. Once
756
+ // the sheet lands the field itself, the hook puts the pan back: it scrolls
757
+ // the full-viewport dialog's top into view. On every later report, the field
758
+ // lands at once.
759
+ let lastHeight = getKeyboardHeight(window);
760
+ // Under a coarse primary pointer only: the watch reads touches, and an
761
+ // on-screen keyboard's pan comes with a touch screen.
762
+ const revealPan = isTouch
763
+ ? watchRevealPan(window, {
764
+ owns: focused =>
765
+ hasKeyboardLayoutRef.current && body.contains(focused),
766
+ // The reader's own scroll may stop a smooth reveal short: forget
767
+ // where it was going.
768
+ onTouch: () => {
769
+ smoothTarget = null;
770
+ },
771
+ })
772
+ : null;
773
+ // Every keyboard report reaches the reveal through the keyboard module's
774
+ // one set of listeners.
775
+ const unsubscribe = subscribeKeyboardHeight(window, event => {
776
+ if (event.type !== 'viewport') {
777
+ return;
778
+ }
779
+ if (event.height !== lastHeight) {
780
+ lastHeight = event.height;
781
+ revealPan?.report();
782
+ cancelAnimationFrame(animationFrame);
783
+ revealFocusedControl(true);
784
+ return;
785
+ }
786
+ if (revealPan?.isRevealPan(event.height) === true) {
787
+ revealsAtReport.add(window);
788
+ cancelAnimationFrame(animationFrame);
789
+ // A smooth reveal still under way lands the field where it is going.
790
+ // Another scroll on top of it would overshoot in Firefox, which keeps
791
+ // adding a smooth scrollBy's distance after an instant scroll. The
792
+ // field ended 244 px too high there. With none under way, the field
793
+ // lands at once.
794
+ const distanceLeft = smoothDistanceLeft();
795
+ if (distanceLeft === 0) {
796
+ revealFocusedControl();
797
+ }
798
+ // The hook puts the pan back only if the sheet holds the field above
799
+ // the keyboard with its own scroller. Rects are in layout-viewport
800
+ // coordinates, which the pan does not move. A ride still draws the
801
+ // field lower than its layout, so its offset does not count. A field
802
+ // the sheet cannot bring up keeps the browser's reveal.
803
+ const activeElement = document.activeElement;
804
+ const dialog = sheet.closest('dialog');
805
+ if (
806
+ dialog != null &&
807
+ activeElement instanceof HTMLElement &&
808
+ activeElement.getBoundingClientRect().bottom -
809
+ rideOffset() -
810
+ distanceLeft <=
811
+ getObstructionTop()
812
+ ) {
813
+ // The full-viewport dialog is fixed at the layout viewport's top.
814
+ revealPan?.putBack(dialog);
815
+ }
816
+ return;
817
+ }
818
+ scheduleReveal();
819
+ });
820
+ body.addEventListener('focusin', handleFocusIn);
821
+ body.addEventListener('focusout', handleFocusOut);
822
+ sheet.addEventListener('transitionend', handleSheetTransitionEnd);
823
+ // The window's capture phase hears every element's scroll too, and only
824
+ // the page's own scroll moves the document.
825
+ const stopDocumentScroll = subscribeInput(window, 'scroll', event => {
826
+ const target = event.target;
827
+ if (!isNodeTarget(target) || (target as Node).nodeType === 9) {
828
+ handleDocumentScroll();
829
+ }
830
+ });
831
+ mutationObserver?.observe(body, {
832
+ attributes: true,
833
+ characterData: true,
834
+ childList: true,
835
+ subtree: true,
836
+ });
837
+ refreshObservedLayout();
838
+ // The dialog enters the top layer in a later effect. Wait until the next
839
+ // frame so flex geometry is final before measuring the body.
840
+ scheduleReveal();
841
+
842
+ return () => {
843
+ cancelAnimationFrame(animationFrame);
844
+ stopClaiming?.();
845
+ unsubscribe();
846
+ unsubscribeGuide?.();
847
+ heldHide?.release();
848
+ contentAnimator()?.set({y: 0});
849
+ revealPan?.stop();
850
+ body.removeEventListener('focusin', handleFocusIn);
851
+ body.removeEventListener('focusout', handleFocusOut);
852
+ sheet.removeEventListener('transitionend', handleSheetTransitionEnd);
853
+ stopDocumentScroll();
854
+ for (const stop of stopObserving) {
855
+ stop();
856
+ }
857
+ mutationObserver?.disconnect();
858
+ setKeyboardInset(0);
859
+ hasKeyboardLayoutRef.current = false;
860
+ retainKeyboardLayoutRef.current = false;
861
+ };
862
+ },
863
+ `${isEnabled}|${reservesInset}|${isPageScrollLocked}|${isTouch}|${offset}`,
864
+ );
865
+ return {inset: keyboardInset, dismiss};
866
+ }