@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,104 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file layoutViewport.ts
5
+ * @input A window: its innerHeight and innerWidth, its visual viewport's
6
+ * width and scale, and its document's root box
7
+ * @output layoutViewportHeight, the layout viewport's height in layout px
8
+ * less a classic horizontal scrollbar, and __resetLayoutViewportForTest
9
+ * @position Internal shared measurement, not re-exported from the utils
10
+ * entry. The keyboard module, BottomSheet's keyboard obstruction and any
11
+ * layout that sizes against the layout viewport read it.
12
+ */
13
+
14
+ /**
15
+ * The layout viewport's height, CSS px, in the units of element rects.
16
+ *
17
+ * `innerHeight` is the layout viewport's height in most engines. WebKit
18
+ * reports `innerHeight` and `innerWidth` in the pinch-zoomed visual
19
+ * viewport's px instead. At a 1.33 zoom of a 402 × 714 layout viewport,
20
+ * Safari on iOS 26.2 reports 536 and 302. Element rects and the visual
21
+ * viewport's height times its scale stay in layout px. So, read as is, a zoom
22
+ * shrinks the layout viewport by the zoom, and the function scales the height
23
+ * back.
24
+ */
25
+ export function layoutViewportHeight(win: Window): number {
26
+ const viewport = win.visualViewport;
27
+ const width = viewport?.width ?? 0;
28
+ if (viewport == null || !(width > 0)) {
29
+ return win.innerHeight - horizontalScrollbarHeight(win);
30
+ }
31
+ const scale = viewport.scale;
32
+ // Which units `innerWidth` is in tells the two apart without naming an
33
+ // engine. It is the visual viewport's width where the zoom applies, and
34
+ // that width times the scale where it does not. `innerWidth` is a whole
35
+ // number of px against a fractional width, so it never equals either, and
36
+ // the nearest wins with no tolerance constant. At a scale of 1 the two
37
+ // widths are equal, so the function takes `innerHeight` as it is. A classic
38
+ // scrollbar, which `innerWidth` counts, then changes nothing.
39
+ const fromVisual = Math.abs(win.innerWidth - width);
40
+ const fromLayout = Math.abs(win.innerWidth - width * scale);
41
+ const height =
42
+ fromVisual < fromLayout ? win.innerHeight * scale : win.innerHeight;
43
+ return height - horizontalScrollbarHeight(win);
44
+ }
45
+
46
+ /**
47
+ * The document's classic horizontal scrollbar, CSS px. It is in
48
+ * `innerHeight` but not in the visual viewport's height. On a desktop page
49
+ * wider than its window, Chromium's `innerHeight` is 800 for a 785 px visual
50
+ * viewport. It is the part of `innerHeight` the root's client height leaves
51
+ * out, up to the thickness of a scrollbar that takes room. Where scrollbars
52
+ * overlay the content, as on every phone, that thickness is 0. So the room a
53
+ * hidden toolbar adds to `innerHeight` is never taken for a scrollbar. Chrome
54
+ * on Android sizes the root to the viewport with its toolbar shown.
55
+ */
56
+ function horizontalScrollbarHeight(win: Window): number {
57
+ const root = win.document.documentElement;
58
+ const gap = win.innerHeight - root.clientHeight;
59
+ if (!(gap > 0) || root.scrollWidth <= root.clientWidth) {
60
+ return 0;
61
+ }
62
+ return Math.min(gap, scrollbarThickness(win.document));
63
+ }
64
+
65
+ // The scrollbar thickness each document measured, and the device pixel ratio
66
+ // it measured it at. A browser zoom changes the ratio, and with it how many
67
+ // CSS px a classic scrollbar takes. Measuring writes a probe to the document
68
+ // and forces a layout, so it runs once per document and zoom. Every later
69
+ // measurement stays one layout read.
70
+ let thicknesses = new WeakMap<
71
+ Document,
72
+ {devicePixelRatio: number; thickness: number}
73
+ >();
74
+
75
+ /** How much room a scrollbar takes from a scrolling box: 0 where overlaid. */
76
+ function scrollbarThickness(doc: Document): number {
77
+ const devicePixelRatio = doc.defaultView?.devicePixelRatio ?? 1;
78
+ const known = thicknesses.get(doc);
79
+ if (known != null && known.devicePixelRatio === devicePixelRatio) {
80
+ return known.thickness;
81
+ }
82
+ const thickness = measureScrollbarThickness(doc);
83
+ thicknesses.set(doc, {devicePixelRatio, thickness});
84
+ return thickness;
85
+ }
86
+
87
+ function measureScrollbarThickness(doc: Document): number {
88
+ const probe = doc.createElement('div');
89
+ probe.style.position = 'absolute';
90
+ probe.style.top = '-200px';
91
+ probe.style.width = '100px';
92
+ probe.style.height = '100px';
93
+ probe.style.overflow = 'scroll';
94
+ probe.style.visibility = 'hidden';
95
+ (doc.body ?? doc.documentElement).append(probe);
96
+ const thickness = probe.offsetHeight - probe.clientHeight;
97
+ probe.remove();
98
+ return thickness;
99
+ }
100
+
101
+ /** Forgets every measured scrollbar thickness. Tests only. */
102
+ export function __resetLayoutViewportForTest(): void {
103
+ thicknesses = new WeakMap();
104
+ }
@@ -173,6 +173,38 @@ export function getTimeZoneParts(
173
173
  };
174
174
  }
175
175
 
176
+ /** The wall-clock fields of an instant: in a zone, or in the viewer's. */
177
+ export interface WallClock {
178
+ year: number;
179
+ month: number;
180
+ day: number;
181
+ hour: number;
182
+ minute: number;
183
+ second: number;
184
+ }
185
+
186
+ /**
187
+ * Wall-clock fields for an instant, in the named zone or in the viewer's
188
+ * zone (`undefined`, `null` or ""). The zone-less branch reads plain `Date`
189
+ * getters, so the default rendering needs no `Intl` zone data. The explicit
190
+ * return type keeps both branches on one shape.
191
+ */
192
+ export function getWallClock(
193
+ date: Date,
194
+ timeZone: string | null | undefined,
195
+ ): WallClock {
196
+ return !timeZone
197
+ ? {
198
+ year: date.getFullYear(),
199
+ month: date.getMonth() + 1,
200
+ day: date.getDate(),
201
+ hour: date.getHours(),
202
+ minute: date.getMinutes(),
203
+ second: date.getSeconds(),
204
+ }
205
+ : getTimeZoneParts(date.getTime(), timeZone);
206
+ }
207
+
176
208
  function getTimezoneOffsetMS(timezoneID: string, instant: number): number {
177
209
  const parts = getTimeZoneParts(instant, timezoneID);
178
210
  return (
@@ -359,14 +391,37 @@ export function plainDateFormatStandaloneMonthYear(
359
391
 
360
392
  // e.g. "Sun" (locale-dependent) — the weekday on its own, abbreviated.
361
393
  //
362
- // This is CLDR's `abbreviated` width, which `Intl` reaches natively. Note
363
- // that Calendar's 2-letter header ("Su") is CLDR's *short* width, a
364
- // different thing that `Intl` cannot express at all — which is why that one
365
- // needs the generated lookup table beside it and this one does not.
394
+ // This is CLDR's `abbreviated` width. Weekday headers prefer a generated
395
+ // table, because `Intl` has no short width.
366
396
  export const DATE_FORMAT_WEEKDAY_ONLY: Intl.DateTimeFormatOptions = {
367
397
  weekday: 'short',
368
398
  };
369
399
 
400
+ /**
401
+ * The platform's weekday names for a locale, Sunday first, in `Intl`'s
402
+ * `short` width (CLDR's abbreviated) or its `narrow` width. Returns `null`
403
+ * when the platform has no data for the locale's language, so a caller uses
404
+ * its own fallback instead of the host's default locale.
405
+ */
406
+ export function plainDateWeekdayNames(
407
+ locale: Locale,
408
+ width: 'short' | 'narrow' = 'short',
409
+ ): string[] | null {
410
+ const options: Intl.DateTimeFormatOptions = {weekday: width};
411
+ // A language the platform lacks resolves to the host's default locale.
412
+ const resolved = dateTimeFormatFor(locale, {
413
+ ...options,
414
+ calendar: 'gregory',
415
+ }).resolvedOptions().locale;
416
+ if (new Intl.Locale(resolved).language !== new Intl.Locale(locale).language) {
417
+ return null;
418
+ }
419
+ // January 4, 1970 was a Sunday.
420
+ return Array.from({length: 7}, (_, day) =>
421
+ plainDateFormat({year: 1970, month: 1, day: 4 + day}, options, locale),
422
+ );
423
+ }
424
+
370
425
  // e.g. "January" (locale-dependent) — the month on its own, for a control
371
426
  // that shows a list of months and carries the year separately.
372
427
  export const DATE_FORMAT_MONTH_ONLY: Intl.DateTimeFormatOptions = {
@@ -488,6 +543,27 @@ export function plainDateWeekFieldName(locale: Locale = 'en'): string {
488
543
  return 'week';
489
544
  }
490
545
 
546
+ const dayNumberFormats = new Map<Locale, Intl.NumberFormat>();
547
+
548
+ /**
549
+ * A day of the month or a week number in the locale's own digits: `15` in
550
+ * English, `۱۵` in Persian, `١٥` in Egyptian Arabic. Only the digits follow the
551
+ * locale. The number stays the Gregorian day or ISO week that it names, so no
552
+ * other calendar applies, and no grouping separator or unit word is added.
553
+ * Internal: not re-exported from `utils/index.ts`.
554
+ */
555
+ export function plainDateFormatDayNumber(
556
+ value: number,
557
+ locale: Locale,
558
+ ): string {
559
+ let format = dayNumberFormats.get(locale);
560
+ if (format == null) {
561
+ format = new Intl.NumberFormat(locale, {useGrouping: false});
562
+ dayNumberFormats.set(locale, format);
563
+ }
564
+ return format.format(value);
565
+ }
566
+
491
567
  // =============================================================================
492
568
  // Shared date-only format vocabulary
493
569
  // =============================================================================
@@ -2,11 +2,11 @@
2
2
 
3
3
  /**
4
4
  * @file pressFeedback.ts
5
- * @input The press state machine (pressGesture.ts), the menu-press marker
6
- * (hooks/menuPressMarker.ts) and the document's pointer, keyboard, scroll and
5
+ * @input The press state machine (pressGesture.ts), the menu-press and
6
+ * press-group markers and the document's pointer, keyboard, scroll and
7
7
  * visibility events
8
- * @output PRESSABLE_ATTRIBUTE, PRESSED_ATTRIBUTE, pressableProps and
9
- * installPressFeedback
8
+ * @output PRESSABLE_ATTRIBUTE, PRESSED_ATTRIBUTE, pressableProps,
9
+ * pressFadeMs and installPressFeedback
10
10
  * @position The DOM half of the touch press model. usePressFeedback installs
11
11
  * it, and the CSS arms live in interactionOverlay.stylex.ts.
12
12
  *
@@ -46,6 +46,7 @@ import {isCoarsePointer, watchCoarsePointer} from './coarsePointer';
46
46
  import {subscribeInput} from './inputStream';
47
47
  import {TOUCH_QUERY} from './touchPresentation';
48
48
  import {holdsPressThroughDrag} from '../privateAttributes/pressHoldsDrag.stylex';
49
+ import {isTrackedByGroup} from '../privateAttributes/pressGroupItem.stylex';
49
50
 
50
51
  /**
51
52
  * The marker the controller finds with `closest()`. Every Astryx component
@@ -108,7 +109,8 @@ interface LiveGesture {
108
109
  * for a press of the Space key.
109
110
  */
110
111
  pointerId: number | null;
111
- timer: ReturnType<typeof setTimeout> | null;
112
+ /** Cancels the clock the current phase owes, or the release it waits for. */
113
+ timer: (() => void) | null;
112
114
  }
113
115
 
114
116
  /**
@@ -152,7 +154,7 @@ const TIMER_MS: Record<NonNullable<PressStep['timer']>, number> = {
152
154
  * property its stylesheet reads: the theme's `--_astryx-motion-tempo`. Under
153
155
  * Reduce Motion a tempo may shorten the fade, never lengthen it past 200 ms.
154
156
  */
155
- function fadeMs(element: Element): number {
157
+ export function pressFadeMs(element: Element): number {
156
158
  const style = getComputedStyle(element);
157
159
  const value = style.getPropertyValue('--_astryx-motion-tempo').trim();
158
160
  const read = value === '' ? Number.NaN : Number(value);
@@ -164,6 +166,76 @@ function fadeMs(element: Element): number {
164
166
  return reduced ? Math.min(scaled, PRESS_FADE_MS) : scaled;
165
167
  }
166
168
 
169
+ /**
170
+ * The release animations that still run for `element`'s press. Each is a
171
+ * finite CSS animation that has not finished. It runs on the element, on its
172
+ * `::before` or `::after`, or on a descendant whose nearest press owner is
173
+ * the element, because a component can draw its release on a part inside the
174
+ * surface. A press owner nested inside plays the release of its own press,
175
+ * so it never extends this one. The list is empty where the engine has no Web
176
+ * Animations.
177
+ */
178
+ function releaseAnimationsOf(element: Element): Animation[] {
179
+ if (typeof element.getAnimations !== 'function') {
180
+ return [];
181
+ }
182
+ return element.getAnimations({subtree: true}).filter(animation => {
183
+ // The effect of a CSS animation is a KeyframeEffect. Its target is the
184
+ // element, also when the animation runs on a pseudo-element.
185
+ const effect = animation.effect as KeyframeEffect | null;
186
+ const target = effect?.target ?? null;
187
+ if (
188
+ effect == null ||
189
+ target == null ||
190
+ !('animationName' in animation) ||
191
+ (target !== element &&
192
+ target.closest(`[${PRESSABLE_ATTRIBUTE}]`) !== element)
193
+ ) {
194
+ return false;
195
+ }
196
+ if (!Number.isFinite(Number(effect.getComputedTiming().endTime))) {
197
+ return false;
198
+ }
199
+ return animation.playState !== 'finished';
200
+ });
201
+ }
202
+
203
+ /**
204
+ * Calls `end` when the release on `element` is over. A busy main thread
205
+ * delays the first frame of the release animation, and with it the end. So a
206
+ * clock that starts at the `fading` write can cut the release short. When
207
+ * `clockMs` runs out, the release waits for each release animation that still
208
+ * runs or still waits for its first frame. It ends when those finish or are
209
+ * cancelled, as when the surface is unmounted or restyled. With no release
210
+ * animation (an instant release, a surface without one, an engine without Web
211
+ * Animations), the release ends at the clock. Returns a cancel.
212
+ */
213
+ function endAfterRelease(
214
+ element: Element,
215
+ clockMs: number,
216
+ end: () => void,
217
+ ): () => void {
218
+ let waiting = true;
219
+ const timer = setTimeout(() => {
220
+ const running = releaseAnimationsOf(element);
221
+ if (running.length === 0) {
222
+ end();
223
+ return;
224
+ }
225
+ void Promise.allSettled(
226
+ running.map(async animation => animation.finished),
227
+ ).then(() => {
228
+ if (waiting) {
229
+ end();
230
+ }
231
+ });
232
+ }, clockMs);
233
+ return () => {
234
+ waiting = false;
235
+ clearTimeout(timer);
236
+ };
237
+ }
238
+
167
239
  const TIMER_EVENT = {
168
240
  fade: 'fadeEnd',
169
241
  flash: 'flashEnd',
@@ -180,7 +252,7 @@ function paintElement(element: HTMLElement, paint: PressPaint): void {
180
252
 
181
253
  function clearTimer(slot: Slot): void {
182
254
  if (slot.live?.timer != null) {
183
- clearTimeout(slot.live.timer);
255
+ slot.live.timer();
184
256
  slot.live.timer = null;
185
257
  }
186
258
  }
@@ -216,25 +288,32 @@ function apply(slot: Slot, step: PressStep): void {
216
288
  }
217
289
  if (step.timer != null) {
218
290
  const kind = step.timer;
219
- // A TIMER, never `requestAnimationFrame`: iOS throttles frame callbacks
220
- // while a scroll runs, so a frame-based delay would fire late, after the
221
- // scroll, and paint a control nobody is pressing any more.
222
- live.timer = setTimeout(
223
- () => {
224
- if (slot.live != null) {
225
- slot.live.timer = null;
226
- }
227
- apply(
228
- slot,
229
- pressGestureStep(slot.live?.gesture ?? idlePressGesture(), {
230
- kind: TIMER_EVENT[kind],
231
- }),
232
- );
233
- },
234
- // The release fade follows the theme's tempo (AST-108). The onset delay
235
- // and the tap flash do not.
236
- kind === 'fade' ? fadeMs(live.element) : TIMER_MS[kind],
237
- );
291
+ const fire = () => {
292
+ if (slot.live != null) {
293
+ slot.live.timer = null;
294
+ }
295
+ apply(
296
+ slot,
297
+ pressGestureStep(slot.live?.gesture ?? idlePressGesture(), {
298
+ kind: TIMER_EVENT[kind],
299
+ }),
300
+ );
301
+ };
302
+ if (kind === 'fade') {
303
+ // The release fade follows the theme's tempo (AST-108). It ends when
304
+ // its animation ends, however late a busy main thread let it start.
305
+ live.timer = endAfterRelease(
306
+ live.element,
307
+ pressFadeMs(live.element),
308
+ fire,
309
+ );
310
+ } else {
311
+ // A TIMER, never `requestAnimationFrame`: iOS throttles frame callbacks
312
+ // while a scroll runs, so a frame-based delay would fire late, after the
313
+ // scroll, and paint a control nobody is pressing any more.
314
+ const timer = setTimeout(fire, TIMER_MS[kind]);
315
+ live.timer = () => clearTimeout(timer);
316
+ }
238
317
  }
239
318
  }
240
319
 
@@ -325,8 +404,9 @@ function stylesheetDroppedActive(): boolean {
325
404
 
326
405
  /**
327
406
  * The surface a mouse button's or the Space key's press paints, if any: the
328
- * innermost marked surface, outside a menu. A key's press paints only a
329
- * focused element that is itself the surface, as `:active` does.
407
+ * innermost marked surface, outside a menu and off a tracked action. A key's
408
+ * press paints only a focused element that is itself the surface, as
409
+ * `:active` does.
330
410
  */
331
411
  function buttonSurfaceAt(
332
412
  target: EventTarget | null,
@@ -336,6 +416,10 @@ function buttonSurfaceAt(
336
416
  if (element == null || element.closest(MENU_PRESS_ROOT) != null) {
337
417
  return null;
338
418
  }
419
+ // A tracker that follows a mouse paints a mouse press on its own actions.
420
+ if (pointerId != null && isTrackedByGroup(element, 'mouse')) {
421
+ return null;
422
+ }
339
423
  if (pointerId == null && element !== target) {
340
424
  return null;
341
425
  }
@@ -414,7 +498,14 @@ function onPointerDown(event: PointerEvent): void {
414
498
  const braking = element != null && scrollerIsBraking(element);
415
499
  lastTouchAt = Date.now();
416
500
  lastTouchTarget = event.target instanceof Node ? event.target : null;
417
- if (element == null || braking) {
501
+ // A group's tracker that follows this pointer paints its action, so two
502
+ // writers would erase each other's paint. The touch still counts for the
503
+ // brake above.
504
+ if (
505
+ element == null ||
506
+ braking ||
507
+ isTrackedByGroup(element, event.pointerType)
508
+ ) {
418
509
  return;
419
510
  }
420
511
  takeOver(button, element);
@@ -560,6 +651,11 @@ function activatesOnSpace(target: EventTarget | null): boolean {
560
651
  );
561
652
  }
562
653
 
654
+ /** A tracked action takes no `:active` paint, so a key's press paints here. */
655
+ function isTrackedAction(target: EventTarget | null): boolean {
656
+ return target instanceof Element && isTrackedByGroup(target);
657
+ }
658
+
563
659
  /**
564
660
  * Space went down on a focused button that is itself a pressable surface.
565
661
  * Heard in the BUBBLE phase, after the page's own handlers, so a press the
@@ -573,7 +669,7 @@ function onKeyDown(event: KeyboardEvent): void {
573
669
  event.isComposing ||
574
670
  event.defaultPrevented ||
575
671
  !activatesOnSpace(event.target) ||
576
- !stylesheetDroppedActive()
672
+ !(stylesheetDroppedActive() || isTrackedAction(event.target))
577
673
  ) {
578
674
  return;
579
675
  }
@@ -62,7 +62,9 @@ export const PRESS_FLASH_MS = 100;
62
62
  * How long the paint takes to leave after a release: UIKit's deselect
63
63
  * crossfade. The one number, shared with the stylesheet: the release
64
64
  * animation in interactionOverlay.stylex.ts runs on the same constant, so the
65
- * timer that removes the attribute and the fade cannot drift apart.
65
+ * controller's release clock and the fade cannot drift apart. When the clock
66
+ * runs out, the controller waits for a release animation that still runs,
67
+ * then removes the attribute.
66
68
  */
67
69
  export const PRESS_FADE_MS: number = pressConsts.releaseMs;
68
70
 
@@ -119,7 +121,7 @@ export type PressEvent =
119
121
  | {kind: 'onset'}
120
122
  /** {@link PRESS_FLASH_MS} elapsed on a too-quick tap. */
121
123
  | {kind: 'flashEnd'}
122
- /** {@link PRESS_FADE_MS} elapsed; the paint is gone. */
124
+ /** The release is over: its animation ended, or its clock ran out with none running. */
123
125
  | {kind: 'fadeEnd'};
124
126
 
125
127
  export interface PressStep {
@@ -116,6 +116,16 @@ export interface DragSelectionReleaseOptions {
116
116
  isCancel?: boolean;
117
117
  }
118
118
 
119
+ /** A drag's selection hold: call it to release the hold. */
120
+ export interface DragSelectionHold {
121
+ (options?: DragSelectionReleaseOptions): void;
122
+ /**
123
+ * Called after the lift's own handlers ran. A selection they made since
124
+ * the release stays: the hold then puts it back, not the press's.
125
+ */
126
+ keepLiftSelection(): void;
127
+ }
128
+
119
129
  /**
120
130
  * Refuse a new selection while a mouse or pen drag that a recognizer claimed
121
131
  * runs, until the returned function runs. `kept` is the page's selection
@@ -140,9 +150,13 @@ export function lockDragSelection(
140
150
  view: Window | null | undefined,
141
151
  kept: ReadonlyArray<AbstractRange>,
142
152
  onReleased?: () => void,
143
- ): (options?: DragSelectionReleaseOptions) => void {
153
+ ): DragSelectionHold {
144
154
  const doc = view?.document ?? null;
145
- const roots = shadowRootsOfRanges(kept);
155
+ let keptRanges = kept;
156
+ let roots = shadowRootsOfRanges(keptRanges);
157
+ // The selection when the lift released the hold, until the lift's
158
+ // handlers ran.
159
+ let atLift: ReadonlyArray<AbstractRange> | null = null;
146
160
  const restore = () => {
147
161
  const selection = view?.getSelection();
148
162
  // The focused field keeps its own selection (a drag never starts in one).
@@ -150,7 +164,7 @@ export function lockDragSelection(
150
164
  return;
151
165
  }
152
166
  const held = heldRanges(selection, roots);
153
- if (kept.length === 0) {
167
+ if (keptRanges.length === 0) {
154
168
  if (held.some(range => !range.collapsed)) {
155
169
  selection.removeAllRanges();
156
170
  }
@@ -158,10 +172,10 @@ export function lockDragSelection(
158
172
  }
159
173
  // A render can remove what the kept selection held: then there is
160
174
  // nothing to put back.
161
- if (sameRanges(held, kept) || !kept.every(isValidRange)) {
175
+ if (sameRanges(held, keptRanges) || !keptRanges.every(isValidRange)) {
162
176
  return;
163
177
  }
164
- selectRanges(selection, kept);
178
+ selectRanges(selection, keptRanges);
165
179
  };
166
180
  restore();
167
181
  const set = new Set(elements);
@@ -201,9 +215,10 @@ export function lockDragSelection(
201
215
  onReleased?.();
202
216
  }
203
217
  };
204
- return ({isCancel = false}: DragSelectionReleaseOptions = {}) => {
218
+ const release = (({isCancel = false}: DragSelectionReleaseOptions = {}) => {
205
219
  if (stage === 'held') {
206
220
  stage = 'lifted';
221
+ atLift = selectionRangesOf(view);
207
222
  for (const element of set) {
208
223
  element.removeEventListener('selectstart', refuse);
209
224
  }
@@ -218,7 +233,26 @@ export function lockDragSelection(
218
233
  } else if (stage === 'lifted' && isCancel) {
219
234
  releaseDocument();
220
235
  }
236
+ }) as DragSelectionHold;
237
+ release.keepLiftSelection = () => {
238
+ if (stage !== 'lifted' || atLift == null) {
239
+ return;
240
+ }
241
+ const before = atLift;
242
+ atLift = null;
243
+ const keepIfChanged = () => {
244
+ const now = selectionRangesOf(view);
245
+ if (stage !== 'done' && !sameRanges(now, before)) {
246
+ keptRanges = now;
247
+ roots = shadowRootsOfRanges(now);
248
+ }
249
+ };
250
+ keepIfChanged();
251
+ // A click's state update renders in a microtask, and its layout effect
252
+ // may select then. That still runs before the press's own mouseup.
253
+ queueMicrotask(keepIfChanged);
221
254
  };
255
+ return release;
222
256
  }
223
257
 
224
258
  /**
@@ -8,7 +8,8 @@
8
8
  * @output Exports observeMutations (one shared observer per set of options)
9
9
  * and observeContent, its text-and-children form
10
10
  * @position Internal utility; consumed by useTruncation, hitArea, AppShell's
11
- * main-overflow observer and ModalAnnounceProvider's presentation watch. The mutation counterpart of sharedResizeObserver:
11
+ * main-overflow observer, ModalAnnounceProvider's presentation watch and
12
+ * CheckboxList's required group. The mutation counterpart of sharedResizeObserver:
12
13
  * one observer for every element observed with the same options, so a
13
14
  * repeated cell, row or region does not create one observer per instance.
14
15
  */
@@ -341,7 +341,8 @@ export function isTimeInRange(
341
341
  }
342
342
 
343
343
  /**
344
- * Clamps a time to a min/max range.
344
+ * Clamps a time to a min/max range. Without seconds, a bound that falls
345
+ * between whole minutes gives the nearest whole minute inside the range.
345
346
  */
346
347
  export function clampTime(
347
348
  time: ISOTimeString,
@@ -357,19 +358,55 @@ export function clampTime(
357
358
  if (min && compareTime(time, min) < 0) {
358
359
  const parsedMin = parseISOTime(min);
359
360
  if (parsedMin) {
360
- return formatISOTime(parsedMin, includeSeconds);
361
+ return formatISOTime(
362
+ onWholeMinute(parsedMin, 1, includeSeconds, max),
363
+ includeSeconds,
364
+ );
361
365
  }
362
366
  }
363
367
  if (max && compareTime(time, max) > 0) {
364
368
  const parsedMax = parseISOTime(max);
365
369
  if (parsedMax) {
366
- return formatISOTime(parsedMax, includeSeconds);
370
+ return formatISOTime(
371
+ onWholeMinute(parsedMax, -1, includeSeconds, min),
372
+ includeSeconds,
373
+ );
367
374
  }
368
375
  }
369
376
 
370
377
  return time;
371
378
  }
372
379
 
380
+ /**
381
+ * A bound as a time without seconds reaches it: the next whole minute up from
382
+ * a minimum, or the whole minute down from a maximum. With no whole minute
383
+ * before the other bound, the bound stays as it is.
384
+ */
385
+ function onWholeMinute(
386
+ bound: ParsedTime,
387
+ direction: 1 | -1,
388
+ includeSeconds: boolean,
389
+ other: ISOTimeString | undefined,
390
+ ): ParsedTime {
391
+ if (includeSeconds || bound.second === 0) {
392
+ return bound;
393
+ }
394
+ const minutes = bound.hour * 60 + bound.minute + (direction === 1 ? 1 : 0);
395
+ if (minutes > 23 * 60 + 59) {
396
+ return bound;
397
+ }
398
+ const rounded = {
399
+ hour: Math.floor(minutes / 60),
400
+ minute: minutes % 60,
401
+ second: 0,
402
+ };
403
+ const order = compareTime(formatISOTime(rounded, true), other);
404
+ if (other && (direction === 1 ? order > 0 : order < 0)) {
405
+ return bound;
406
+ }
407
+ return rounded;
408
+ }
409
+
373
410
  /**
374
411
  * Adjusts a time by adding/subtracting minutes.
375
412
  *