@astryxdesign/core 0.7.8 → 0.7.9-canary.0200dfe

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 (585) hide show
  1. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -1
  2. package/dist/AppShell/observeMainOverflow.js +9 -6
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +37 -3
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetPanel.js +40 -8
  7. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
  8. package/dist/BottomSheet/bottomSheetStack.js +4 -3
  9. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  10. package/dist/BottomSheet/useSheetGestures.js +61 -21
  11. package/dist/Calendar/Calendar.d.ts +14 -2
  12. package/dist/Calendar/Calendar.d.ts.map +1 -1
  13. package/dist/Calendar/Calendar.js +63 -74
  14. package/dist/Calendar/getInitialFocusDate.d.ts +4 -1
  15. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -1
  16. package/dist/Calendar/getInitialFocusDate.js +7 -5
  17. package/dist/Calendar/hooks/useCalendarDays.d.ts +19 -2
  18. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  19. package/dist/Calendar/hooks/useCalendarDays.js +57 -64
  20. package/dist/Calendar/hooks/useCalendarNavigation.d.ts +28 -3
  21. package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
  22. package/dist/Calendar/hooks/useCalendarNavigation.js +33 -22
  23. package/dist/Calendar/styles.d.ts +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.d.ts +2 -1
  25. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  26. package/dist/CheckboxInput/CheckboxInput.js +74 -18
  27. package/dist/CheckboxInput/CheckboxRowPressContext.d.ts +2 -0
  28. package/dist/CheckboxInput/CheckboxRowPressContext.d.ts.map +1 -0
  29. package/dist/CheckboxInput/CheckboxRowPressContext.js +20 -0
  30. package/dist/CheckboxList/CheckboxListItem.d.ts +2 -1
  31. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  32. package/dist/CheckboxList/CheckboxListItem.js +40 -14
  33. package/dist/ClickableCard/ClickableCard.d.ts +1 -1
  34. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  35. package/dist/ClickableCard/ClickableCard.js +5 -1
  36. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  37. package/dist/ContextMenu/ContextMenu.js +2 -0
  38. package/dist/DateInput/DateInput.d.ts +37 -6
  39. package/dist/DateInput/DateInput.d.ts.map +1 -1
  40. package/dist/DateInput/DateInput.js +97 -124
  41. package/dist/DateInput/MonthScroller.d.ts +5 -2
  42. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  43. package/dist/DateInput/MonthScroller.js +26 -29
  44. package/dist/DateInput/MonthYearWheels.d.ts +10 -1
  45. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  46. package/dist/DateInput/MonthYearWheels.js +54 -42
  47. package/dist/DateInput/PickerWheel.d.ts.map +1 -1
  48. package/dist/DateInput/PickerWheel.js +7 -1
  49. package/dist/DateInput/TouchDateField.d.ts +1 -1
  50. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  51. package/dist/DateInput/TouchDateField.js +26 -21
  52. package/dist/DateInput/monthGeometry.d.ts +42 -8
  53. package/dist/DateInput/monthGeometry.d.ts.map +1 -1
  54. package/dist/DateInput/monthGeometry.js +81 -7
  55. package/dist/DateInput/useCalendarPresentation.d.ts +10 -0
  56. package/dist/DateInput/useCalendarPresentation.d.ts.map +1 -0
  57. package/dist/DateInput/useCalendarPresentation.js +32 -0
  58. package/dist/DateInput/useTypedDate.d.ts +92 -0
  59. package/dist/DateInput/useTypedDate.d.ts.map +1 -0
  60. package/dist/DateInput/useTypedDate.js +269 -0
  61. package/dist/DateInput/wheelStrip.js +2 -2
  62. package/dist/DateRangeInput/DateRangeInput.d.ts +17 -1
  63. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  64. package/dist/DateRangeInput/DateRangeInput.js +15 -8
  65. package/dist/DateTimeInput/DateTimeInput.d.ts +26 -3
  66. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  67. package/dist/DateTimeInput/DateTimeInput.js +92 -88
  68. package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
  69. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  70. package/dist/DateTimeInput/TouchDateTimeField.js +26 -20
  71. package/dist/Dialog/Dialog.d.ts +2 -1
  72. package/dist/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/Dialog/Dialog.js +14 -3
  74. package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
  75. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  76. package/dist/Drawer/useDrawerDialogPresence.js +11 -2
  77. package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
  78. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  79. package/dist/DropdownMenu/DropdownMenu.js +11 -8
  80. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  81. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
  82. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  83. package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
  84. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
  86. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  87. package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
  88. package/dist/Field/inputDisabledFocus.d.ts +4 -4
  89. package/dist/Field/inputStyles.stylex.d.ts +1 -1
  90. package/dist/FileInput/FileInput.d.ts.map +1 -1
  91. package/dist/FileInput/FileInput.js +16 -2
  92. package/dist/HoverCard/useHoverCard.d.ts +3 -1
  93. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  94. package/dist/Icon/Icon.d.ts +1 -1
  95. package/dist/InfoTip/InfoTip.d.ts +1 -0
  96. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  97. package/dist/InfoTip/InfoTip.js +6 -18
  98. package/dist/InputGroup/InputGroup.d.ts +4 -3
  99. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  100. package/dist/InputGroup/InputGroup.js +2 -2
  101. package/dist/InputGroup/InputGroupText.d.ts +2 -1
  102. package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
  103. package/dist/InputGroup/InputGroupText.js +2 -1
  104. package/dist/InputGroup/groupStyles.d.ts +1 -1
  105. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  106. package/dist/InputGroup/groupStyles.js +1 -1
  107. package/dist/Item/Item.d.ts +20 -1
  108. package/dist/Item/Item.d.ts.map +1 -1
  109. package/dist/Item/Item.js +97 -29
  110. package/dist/Item/ItemListRowContext.d.ts +2 -0
  111. package/dist/Item/ItemListRowContext.d.ts.map +1 -0
  112. package/dist/Item/ItemListRowContext.js +16 -0
  113. package/dist/Layer/holdEntranceInput.d.ts +24 -0
  114. package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
  115. package/dist/Layer/holdEntranceInput.js +65 -0
  116. package/dist/Layer/inputHold.d.ts +49 -0
  117. package/dist/Layer/inputHold.d.ts.map +1 -0
  118. package/dist/Layer/inputHold.js +636 -0
  119. package/dist/Layer/outsidePress.d.ts +4 -0
  120. package/dist/Layer/outsidePress.d.ts.map +1 -1
  121. package/dist/Layer/outsidePress.js +18 -1
  122. package/dist/Layer/preserveAnimations.d.ts +1 -5
  123. package/dist/Layer/preserveAnimations.d.ts.map +1 -1
  124. package/dist/Layer/preserveAnimations.js +12 -214
  125. package/dist/Layer/useBackdropPress.d.ts +8 -0
  126. package/dist/Layer/useBackdropPress.d.ts.map +1 -1
  127. package/dist/Layer/useBackdropPress.js +31 -2
  128. package/dist/Layer/useLayer.d.ts +3 -1
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +64 -4
  131. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  132. package/dist/Layer/useTouchTrigger.js +4 -0
  133. package/dist/Layout/LayoutContent.d.ts +3 -1
  134. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  135. package/dist/Layout/LayoutContent.js +12 -4
  136. package/dist/Layout/LayoutPanel.d.ts +13 -10
  137. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  138. package/dist/Layout/LayoutPanel.js +81 -11
  139. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  140. package/dist/Lightbox/Lightbox.js +4 -0
  141. package/dist/List/List.d.ts.map +1 -1
  142. package/dist/List/List.js +1 -0
  143. package/dist/List/ListItem.d.ts +5 -4
  144. package/dist/List/ListItem.d.ts.map +1 -1
  145. package/dist/List/ListItem.js +45 -9
  146. package/dist/Markdown/parser.d.ts.map +1 -1
  147. package/dist/Markdown/parser.js +56 -39
  148. package/dist/MetadataList/MetadataList.js +1 -1
  149. package/dist/MobileNav/MobileNav.d.ts +11 -1
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +39 -1
  152. package/dist/MoreMenu/MoreMenu.d.ts +5 -3
  153. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  154. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  155. package/dist/MultiSelector/MultiSelector.js +6 -9
  156. package/dist/NumberInput/NumberInput.d.ts +4 -2
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +244 -11
  159. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  160. package/dist/OverflowList/OverflowList.js +7 -2
  161. package/dist/Popover/usePopover.d.ts +1 -0
  162. package/dist/Popover/usePopover.d.ts.map +1 -1
  163. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  164. package/dist/PowerSearch/PowerSearch.js +12 -5
  165. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -1
  166. package/dist/PowerSearch/PowerSearchBottomSheet.js +4 -2
  167. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  169. package/dist/PowerSearch/formatFilterValue.d.ts +9 -3
  170. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  171. package/dist/PowerSearch/formatFilterValue.js +14 -11
  172. package/dist/PowerSearch/formatTokenValue.d.ts +6 -2
  173. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -1
  174. package/dist/PowerSearch/formatTokenValue.js +6 -3
  175. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  176. package/dist/RadioList/RadioListItem.js +16 -3
  177. package/dist/Resizable/ResizeHandle.d.ts +5 -5
  178. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  179. package/dist/Resizable/ResizeHandle.js +44 -5
  180. package/dist/Resizable/resizablePane.d.ts +58 -0
  181. package/dist/Resizable/resizablePane.d.ts.map +1 -0
  182. package/dist/Resizable/resizablePane.js +137 -0
  183. package/dist/Resizable/useResizable.d.ts +7 -0
  184. package/dist/Resizable/useResizable.d.ts.map +1 -1
  185. package/dist/Resizable/useResizable.js +13 -0
  186. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  187. package/dist/SelectableCard/SelectableCard.d.ts +1 -1
  188. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  189. package/dist/SelectableCard/SelectableCard.js +5 -1
  190. package/dist/Selector/Selector.d.ts.map +1 -1
  191. package/dist/Selector/Selector.js +51 -10
  192. package/dist/SideNav/SideNav.d.ts +9 -3
  193. package/dist/SideNav/SideNav.d.ts.map +1 -1
  194. package/dist/SideNav/SideNav.js +45 -10
  195. package/dist/Slider/sliderTouchController.js +2 -2
  196. package/dist/Spinner/Spinner.d.ts.map +1 -1
  197. package/dist/Spinner/Spinner.js +14 -71
  198. package/dist/Spinner/index.d.ts +1 -1
  199. package/dist/Spinner/index.d.ts.map +1 -1
  200. package/dist/Spinner/spinnerRotor.d.ts +28 -0
  201. package/dist/Spinner/spinnerRotor.d.ts.map +1 -0
  202. package/dist/Spinner/spinnerRotor.js +98 -0
  203. package/dist/Stack/StackItem.d.ts +8 -4
  204. package/dist/Stack/StackItem.d.ts.map +1 -1
  205. package/dist/Stack/StackItem.js +17 -4
  206. package/dist/Switch/Switch.d.ts.map +1 -1
  207. package/dist/Switch/Switch.js +13 -10
  208. package/dist/Switch/useSwitchTouch.js +4 -4
  209. package/dist/TabList/Tab.d.ts.map +1 -1
  210. package/dist/TabList/Tab.js +5 -1
  211. package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
  212. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  213. package/dist/Timestamp/Timestamp.js +14 -8
  214. package/dist/Timestamp/formatInstant.d.ts +10 -1
  215. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  216. package/dist/Timestamp/formatInstant.js +13 -27
  217. package/dist/Timestamp/tooltipEntries.d.ts +5 -3
  218. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  219. package/dist/Timestamp/tooltipEntries.js +6 -4
  220. package/dist/Token/Token.d.ts.map +1 -1
  221. package/dist/Token/Token.js +9 -0
  222. package/dist/Token/TokenLink.d.ts +1 -1
  223. package/dist/Token/TokenLink.d.ts.map +1 -1
  224. package/dist/Token/TokenLink.js +4 -1
  225. package/dist/Tokenizer/Tokenizer.d.ts +14 -10
  226. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  227. package/dist/Tokenizer/Tokenizer.js +189 -89
  228. package/dist/Tooltip/useTooltip.d.ts +3 -1
  229. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  230. package/dist/Tooltip/useTooltip.js +164 -59
  231. package/dist/TreeList/TreeListItem.d.ts +2 -1
  232. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  233. package/dist/TreeList/TreeListItem.js +27 -3
  234. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  235. package/dist/Typeahead/BaseTypeahead.js +2 -1
  236. package/dist/animator/createAnimator.js +2 -2
  237. package/dist/astryx.css +362 -325
  238. package/dist/gestures/GestureHost.d.ts +2 -2
  239. package/dist/gestures/GestureHost.d.ts.map +1 -1
  240. package/dist/gestures/GestureHost.js +21 -6
  241. package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
  242. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  243. package/dist/gestures/PanGestureRecognizer.js +15 -1
  244. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
  245. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
  246. package/dist/gestures/nativeScroll.d.ts +3 -6
  247. package/dist/gestures/nativeScroll.d.ts.map +1 -1
  248. package/dist/gestures/nativeScroll.js +7 -52
  249. package/dist/gestures/wheelSegmenter.d.ts +68 -1
  250. package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
  251. package/dist/gestures/wheelSegmenter.js +199 -10
  252. package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
  253. package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
  254. package/dist/hooks/StackItemScrollRegion.js +40 -0
  255. package/dist/hooks/computeOverflow.d.ts +2 -0
  256. package/dist/hooks/computeOverflow.d.ts.map +1 -1
  257. package/dist/hooks/computeOverflow.js +1 -1
  258. package/dist/hooks/menuPressGesture.d.ts +133 -21
  259. package/dist/hooks/menuPressGesture.d.ts.map +1 -1
  260. package/dist/hooks/menuPressGesture.js +155 -30
  261. package/dist/hooks/menuPressValues.d.ts +16 -0
  262. package/dist/hooks/menuPressValues.d.ts.map +1 -0
  263. package/dist/hooks/menuPressValues.js +18 -0
  264. package/dist/hooks/useClickableContainer.d.ts +36 -7
  265. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  266. package/dist/hooks/useClickableContainer.js +63 -14
  267. package/dist/hooks/useFocusTrap.d.ts +10 -0
  268. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  269. package/dist/hooks/useFocusTrap.js +225 -132
  270. package/dist/hooks/useKeyboardHighlight.d.ts +17 -0
  271. package/dist/hooks/useKeyboardHighlight.d.ts.map +1 -0
  272. package/dist/hooks/useKeyboardHighlight.js +38 -0
  273. package/dist/hooks/useMediaQuery.d.ts +2 -1
  274. package/dist/hooks/useMediaQuery.d.ts.map +1 -1
  275. package/dist/hooks/useMediaQuery.js +37 -12
  276. package/dist/hooks/useMenuPress.d.ts +34 -1
  277. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  278. package/dist/hooks/useMenuPress.js +93 -5
  279. package/dist/hooks/useOverflow.d.ts +10 -0
  280. package/dist/hooks/useOverflow.d.ts.map +1 -1
  281. package/dist/hooks/useOverflow.js +214 -23
  282. package/dist/hooks/usePressFeedback.d.ts +6 -6
  283. package/dist/hooks/usePressFeedback.js +6 -6
  284. package/dist/hooks/useScrollRegionProps.d.ts +35 -0
  285. package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
  286. package/dist/hooks/useScrollRegionProps.js +51 -0
  287. package/dist/i18n/InternationalizationContext.d.ts +6 -0
  288. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  289. package/dist/i18n/InternationalizationProvider.d.ts +23 -3
  290. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  291. package/dist/i18n/InternationalizationProvider.js +8 -3
  292. package/dist/i18n/generated-english/DateInput/DateInput.generated.d.ts.map +1 -1
  293. package/dist/i18n/generated-english/DateInput/DateInput.generated.js +0 -1
  294. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts +8 -0
  295. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts.map +1 -0
  296. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.js +16 -0
  297. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.d.ts.map +1 -1
  298. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.js +0 -1
  299. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
  300. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
  301. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
  302. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/en.generated.js +5 -0
  304. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  305. package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
  306. package/dist/i18n/index.d.ts +2 -0
  307. package/dist/i18n/index.d.ts.map +1 -1
  308. package/dist/i18n/index.js +1 -0
  309. package/dist/i18n/useCalendarSystem.d.ts +19 -0
  310. package/dist/i18n/useCalendarSystem.d.ts.map +1 -0
  311. package/dist/i18n/useCalendarSystem.js +61 -0
  312. package/dist/internal/calendar-system.d.ts +18 -0
  313. package/dist/internal/calendar-system.d.ts.map +1 -0
  314. package/dist/internal/calendar-system.js +19 -0
  315. package/dist/internal/spinner-rotor.d.ts +16 -0
  316. package/dist/internal/spinner-rotor.d.ts.map +1 -0
  317. package/dist/internal/spinner-rotor.js +16 -0
  318. package/dist/internal/touch.d.ts +20 -2
  319. package/dist/internal/touch.d.ts.map +1 -1
  320. package/dist/internal/touch.js +29 -3
  321. package/dist/motion/animator.d.ts +5 -5
  322. package/dist/motion/animator.d.ts.map +1 -1
  323. package/dist/motion/animator.js +7 -6
  324. package/dist/motion/carryAnimations.d.ts +58 -0
  325. package/dist/motion/carryAnimations.d.ts.map +1 -0
  326. package/dist/motion/carryAnimations.js +305 -0
  327. package/dist/motion/transientCopy.d.ts +4 -2
  328. package/dist/motion/transientCopy.d.ts.map +1 -1
  329. package/dist/motion/transientCopy.js +34 -5
  330. package/dist/motion/uikit/gestures.d.ts +41 -0
  331. package/dist/motion/uikit/gestures.d.ts.map +1 -1
  332. package/dist/motion/uikit/gestures.js +25 -0
  333. package/dist/motion/uikit/index.d.ts +1 -1
  334. package/dist/motion/uikit/index.d.ts.map +1 -1
  335. package/dist/motion/uikit/index.js +1 -1
  336. package/dist/motion/uikit/timing.d.ts +14 -10
  337. package/dist/motion/uikit/timing.d.ts.map +1 -1
  338. package/dist/motion/uikit/timing.js +7 -5
  339. package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
  340. package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
  341. package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
  342. package/dist/privateAttributes/press.stylex.d.ts +142 -0
  343. package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
  344. package/dist/privateAttributes/press.stylex.js +101 -0
  345. package/dist/theme/themeMotion.d.ts +3 -2
  346. package/dist/theme/themeMotion.d.ts.map +1 -1
  347. package/dist/theme/themeMotion.js +3 -2
  348. package/dist/theme/tokens.stylex.d.ts +2 -2
  349. package/dist/theme/tokens.stylex.js +1 -1
  350. package/dist/utils/calendarDateParser.d.ts +110 -0
  351. package/dist/utils/calendarDateParser.d.ts.map +1 -0
  352. package/dist/utils/calendarDateParser.js +1225 -0
  353. package/dist/utils/calendarSystem.d.ts +176 -0
  354. package/dist/utils/calendarSystem.d.ts.map +1 -0
  355. package/dist/utils/calendarSystem.js +569 -0
  356. package/dist/utils/coarsePointer.d.ts +5 -0
  357. package/dist/utils/coarsePointer.d.ts.map +1 -1
  358. package/dist/utils/coarsePointer.js +22 -13
  359. package/dist/utils/flatTree.d.ts +6 -3
  360. package/dist/utils/flatTree.d.ts.map +1 -1
  361. package/dist/utils/flatTree.js +13 -3
  362. package/dist/utils/focusReturn.d.ts +34 -13
  363. package/dist/utils/focusReturn.d.ts.map +1 -1
  364. package/dist/utils/focusReturn.js +64 -17
  365. package/dist/utils/hitArea.d.ts +8 -1
  366. package/dist/utils/hitArea.d.ts.map +1 -1
  367. package/dist/utils/hitArea.js +99 -9
  368. package/dist/utils/inputPresentation.d.ts +9 -1
  369. package/dist/utils/inputPresentation.d.ts.map +1 -1
  370. package/dist/utils/inputPresentation.js +15 -1
  371. package/dist/utils/inputStream.d.ts +14 -1
  372. package/dist/utils/inputStream.d.ts.map +1 -1
  373. package/dist/utils/inputStream.js +40 -9
  374. package/dist/utils/interactionOverlay.stylex.d.ts +5 -9
  375. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  376. package/dist/utils/interactionOverlay.stylex.js +29 -31
  377. package/dist/utils/plainDate.d.ts +38 -7
  378. package/dist/utils/plainDate.d.ts.map +1 -1
  379. package/dist/utils/plainDate.js +92 -18
  380. package/dist/utils/pressFeedback.d.ts +10 -2
  381. package/dist/utils/pressFeedback.d.ts.map +1 -1
  382. package/dist/utils/pressFeedback.js +40 -15
  383. package/dist/utils/pressGesture.d.ts +12 -6
  384. package/dist/utils/pressGesture.d.ts.map +1 -1
  385. package/dist/utils/pressGesture.js +26 -8
  386. package/dist/utils/scrollView.d.ts +25 -0
  387. package/dist/utils/scrollView.d.ts.map +1 -0
  388. package/dist/utils/scrollView.js +108 -0
  389. package/dist/utils/selectionLock.d.ts.map +1 -1
  390. package/dist/utils/selectionLock.js +1 -10
  391. package/dist/utils/touchHitArea.d.ts +30 -0
  392. package/dist/utils/touchHitArea.d.ts.map +1 -0
  393. package/dist/utils/touchHitArea.js +167 -0
  394. package/dist/utils/touchHitArea.stylex.d.ts +38 -0
  395. package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
  396. package/dist/utils/touchHitArea.stylex.js +48 -0
  397. package/dist/utils/triggerFocus.d.ts +5 -0
  398. package/dist/utils/triggerFocus.d.ts.map +1 -1
  399. package/dist/utils/triggerFocus.js +9 -2
  400. package/locales/en.json +21 -1
  401. package/locales/pseudo.json +15 -0
  402. package/package.json +15 -4
  403. package/src/AppShell/observeMainOverflow.ts +9 -6
  404. package/src/BottomSheet/BottomSheet.tsx +45 -3
  405. package/src/BottomSheet/BottomSheetPanel.tsx +64 -7
  406. package/src/BottomSheet/bottomSheetStack.ts +4 -3
  407. package/src/BottomSheet/useSheetGestures.ts +83 -20
  408. package/src/Calendar/Calendar.doc.mjs +76 -6
  409. package/src/Calendar/Calendar.tsx +123 -104
  410. package/src/Calendar/getInitialFocusDate.ts +22 -8
  411. package/src/Calendar/hooks/useCalendarDays.ts +89 -63
  412. package/src/Calendar/hooks/useCalendarNavigation.ts +68 -26
  413. package/src/CheckboxInput/CheckboxInput.doc.mjs +5 -4
  414. package/src/CheckboxInput/CheckboxInput.tsx +105 -20
  415. package/src/CheckboxInput/CheckboxRowPressContext.ts +22 -0
  416. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  417. package/src/CheckboxList/CheckboxListItem.doc.mjs +3 -3
  418. package/src/CheckboxList/CheckboxListItem.tsx +35 -14
  419. package/src/ClickableCard/ClickableCard.tsx +8 -1
  420. package/src/ContextMenu/ContextMenu.tsx +2 -0
  421. package/src/DateInput/DateInput.doc.mjs +45 -12
  422. package/src/DateInput/DateInput.tsx +165 -179
  423. package/src/DateInput/MonthScroller.tsx +39 -37
  424. package/src/DateInput/MonthYearWheels.tsx +68 -47
  425. package/src/DateInput/PickerWheel.tsx +7 -2
  426. package/src/DateInput/TouchDateField.tsx +45 -17
  427. package/src/DateInput/monthGeometry.ts +110 -8
  428. package/src/DateInput/useCalendarPresentation.ts +64 -0
  429. package/src/DateInput/useTypedDate.ts +469 -0
  430. package/src/DateInput/wheelStrip.ts +2 -2
  431. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -0
  432. package/src/DateRangeInput/DateRangeInput.tsx +43 -9
  433. package/src/DateTimeInput/DateTimeInput.doc.mjs +42 -9
  434. package/src/DateTimeInput/DateTimeInput.tsx +138 -148
  435. package/src/DateTimeInput/TouchDateTimeField.tsx +31 -16
  436. package/src/Dialog/Dialog.doc.mjs +1 -1
  437. package/src/Dialog/Dialog.tsx +14 -2
  438. package/src/Drawer/Drawer.doc.mjs +1 -1
  439. package/src/Drawer/useDrawerDialogPresence.ts +9 -2
  440. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
  441. package/src/DropdownMenu/DropdownMenu.tsx +31 -7
  442. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
  443. package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
  444. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
  445. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
  446. package/src/FileInput/FileInput.tsx +16 -2
  447. package/src/HoverCard/useHoverCard.tsx +3 -1
  448. package/src/Icon/useIcon.doc.mjs +94 -0
  449. package/src/InfoTip/InfoTip.doc.mjs +26 -2
  450. package/src/InfoTip/InfoTip.tsx +6 -27
  451. package/src/InputGroup/InputGroup.doc.mjs +4 -3
  452. package/src/InputGroup/InputGroup.tsx +4 -3
  453. package/src/InputGroup/InputGroupText.doc.mjs +45 -3
  454. package/src/InputGroup/InputGroupText.tsx +2 -1
  455. package/src/InputGroup/groupStyles.ts +3 -1
  456. package/src/Item/Item.tsx +139 -35
  457. package/src/Item/ItemListRowContext.tsx +18 -0
  458. package/src/Layer/holdEntranceInput.ts +84 -0
  459. package/src/Layer/inputHold.ts +734 -0
  460. package/src/Layer/outsidePress.ts +18 -1
  461. package/src/Layer/preserveAnimations.ts +12 -275
  462. package/src/Layer/useBackdropPress.ts +41 -1
  463. package/src/Layer/useLayer.tsx +77 -4
  464. package/src/Layer/useTouchTrigger.ts +4 -0
  465. package/src/Layout/LayoutContent.doc.mjs +6 -3
  466. package/src/Layout/LayoutContent.tsx +10 -4
  467. package/src/Layout/LayoutPanel.doc.mjs +14 -11
  468. package/src/Layout/LayoutPanel.tsx +113 -16
  469. package/src/Lightbox/Lightbox.tsx +4 -0
  470. package/src/List/List.doc.mjs +10 -1
  471. package/src/List/List.tsx +5 -0
  472. package/src/List/ListItem.tsx +63 -8
  473. package/src/Markdown/parser.ts +65 -42
  474. package/src/MetadataList/MetadataList.tsx +1 -1
  475. package/src/MobileNav/MobileNav.doc.mjs +3 -3
  476. package/src/MobileNav/MobileNav.tsx +39 -1
  477. package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
  478. package/src/MoreMenu/MoreMenu.tsx +5 -3
  479. package/src/MultiSelector/MultiSelector.tsx +7 -17
  480. package/src/NumberInput/NumberInput.doc.mjs +1 -1
  481. package/src/NumberInput/NumberInput.tsx +259 -11
  482. package/src/OverflowList/OverflowList.tsx +15 -9
  483. package/src/Popover/usePopover.tsx +1 -0
  484. package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
  485. package/src/PowerSearch/PowerSearch.tsx +20 -3
  486. package/src/PowerSearch/PowerSearchBottomSheet.tsx +4 -1
  487. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  488. package/src/PowerSearch/formatFilterValue.ts +21 -11
  489. package/src/PowerSearch/formatTokenValue.ts +7 -1
  490. package/src/RadioList/RadioListItem.doc.mjs +3 -2
  491. package/src/RadioList/RadioListItem.tsx +16 -6
  492. package/src/Resizable/Resizable.doc.mjs +40 -12
  493. package/src/Resizable/ResizeHandle.tsx +68 -6
  494. package/src/Resizable/resizablePane.ts +179 -0
  495. package/src/Resizable/useResizable.ts +15 -0
  496. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +3 -3
  497. package/src/SelectableCard/SelectableCard.tsx +8 -1
  498. package/src/Selector/Selector.tsx +83 -8
  499. package/src/SideNav/SideNav.doc.mjs +2 -2
  500. package/src/SideNav/SideNav.tsx +87 -12
  501. package/src/Slider/sliderTouchController.ts +2 -2
  502. package/src/Spinner/Spinner.tsx +7 -89
  503. package/src/Spinner/index.ts +1 -5
  504. package/src/Spinner/spinnerRotor.ts +113 -0
  505. package/src/Stack/Stack.doc.mjs +1 -1
  506. package/src/Stack/StackItem.tsx +27 -13
  507. package/src/Switch/Switch.tsx +7 -6
  508. package/src/Switch/useSwitchTouch.ts +4 -4
  509. package/src/TabList/Tab.tsx +5 -1
  510. package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
  511. package/src/Timestamp/Timestamp.doc.mjs +3 -3
  512. package/src/Timestamp/Timestamp.tsx +13 -8
  513. package/src/Timestamp/formatInstant.ts +49 -28
  514. package/src/Timestamp/tooltipEntries.ts +7 -3
  515. package/src/Token/Token.tsx +18 -1
  516. package/src/Token/TokenLink.tsx +7 -1
  517. package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
  518. package/src/Tokenizer/Tokenizer.tsx +252 -115
  519. package/src/Tooltip/useTooltip.tsx +180 -80
  520. package/src/TreeList/TreeListItem.tsx +36 -2
  521. package/src/Typeahead/BaseTypeahead.tsx +2 -0
  522. package/src/animator/createAnimator.ts +3 -3
  523. package/src/gestures/GestureHost.ts +21 -5
  524. package/src/gestures/PanGestureRecognizer.ts +19 -2
  525. package/src/gestures/README.md +14 -5
  526. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
  527. package/src/gestures/nativeScroll.ts +12 -68
  528. package/src/gestures/wheelSegmenter.ts +243 -10
  529. package/src/hooks/StackItemScrollRegion.tsx +57 -0
  530. package/src/hooks/computeOverflow.ts +1 -1
  531. package/src/hooks/menuPressGesture.ts +244 -38
  532. package/src/hooks/menuPressValues.ts +18 -0
  533. package/src/hooks/useClickableContainer.doc.mjs +8 -2
  534. package/src/hooks/useClickableContainer.ts +93 -15
  535. package/src/hooks/useFocusTrap.ts +268 -151
  536. package/src/hooks/useKeyboardHighlight.ts +71 -0
  537. package/src/hooks/useMediaQuery.ts +41 -12
  538. package/src/hooks/useMenuPress.ts +118 -11
  539. package/src/hooks/useOverflow.ts +321 -75
  540. package/src/hooks/usePressFeedback.doc.mjs +3 -3
  541. package/src/hooks/usePressFeedback.ts +6 -6
  542. package/src/hooks/useScrollRegionProps.ts +76 -0
  543. package/src/i18n/InternationalizationContext.ts +6 -0
  544. package/src/i18n/InternationalizationProvider.doc.mjs +29 -1
  545. package/src/i18n/InternationalizationProvider.tsx +35 -3
  546. package/src/i18n/generated-english/DateInput/DateInput.generated.ts +0 -1
  547. package/src/i18n/generated-english/DateInput/useTypedDate.generated.ts +17 -0
  548. package/src/i18n/generated-english/DateTimeInput/DateTimeInput.generated.ts +0 -1
  549. package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
  550. package/src/i18n/generated-locales/en.generated.ts +7 -0
  551. package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
  552. package/src/i18n/index.ts +2 -0
  553. package/src/i18n/useCalendarSystem.ts +95 -0
  554. package/src/internal/calendar-system.ts +26 -0
  555. package/src/internal/spinner-rotor.ts +20 -0
  556. package/src/internal/touch.ts +43 -2
  557. package/src/motion/MEASUREMENTS.md +11 -0
  558. package/src/motion/README.md +3 -3
  559. package/src/motion/animator.ts +7 -7
  560. package/src/motion/carryAnimations.ts +389 -0
  561. package/src/motion/transientCopy.ts +45 -5
  562. package/src/motion/uikit/gestures.ts +22 -0
  563. package/src/motion/uikit/index.ts +1 -0
  564. package/src/motion/uikit/timing.ts +7 -5
  565. package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
  566. package/src/privateAttributes/press.stylex.ts +261 -0
  567. package/src/theme/themeMotion.ts +3 -2
  568. package/src/theme/tokens.stylex.ts +1 -1
  569. package/src/utils/calendarDateParser.ts +1385 -0
  570. package/src/utils/calendarSystem.ts +832 -0
  571. package/src/utils/coarsePointer.ts +27 -14
  572. package/src/utils/flatTree.ts +15 -3
  573. package/src/utils/focusReturn.ts +78 -18
  574. package/src/utils/hitArea.ts +138 -9
  575. package/src/utils/inputPresentation.ts +21 -1
  576. package/src/utils/inputStream.ts +47 -10
  577. package/src/utils/interactionOverlay.stylex.ts +19 -22
  578. package/src/utils/plainDate.ts +130 -19
  579. package/src/utils/pressFeedback.ts +46 -14
  580. package/src/utils/pressGesture.ts +35 -9
  581. package/src/utils/scrollView.ts +135 -0
  582. package/src/utils/selectionLock.ts +5 -10
  583. package/src/utils/touchHitArea.stylex.ts +56 -0
  584. package/src/utils/touchHitArea.ts +177 -0
  585. package/src/utils/triggerFocus.ts +17 -4
@@ -0,0 +1,734 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file inputHold.ts
7
+ * @input A layer root, what ends its hold (a promise or an animator handle),
8
+ * and the hold's scope
9
+ * @output holdInput, holdsTouch, isInHeldLayer and isInputShield: input held
10
+ * away from a layer while it presents or dismisses
11
+ * @position The Layer module's one input hold, for components whose layer
12
+ * presents under a finger
13
+ *
14
+ * SYNC: When modified, update inputHold.test.tsx,
15
+ * __tests__/inputHold.interaction.browser.spec.ts and the holdInput callers.
16
+ */
17
+
18
+ import {
19
+ containsAlongFlatTree,
20
+ deepActiveElement,
21
+ parentAcrossShadow,
22
+ } from '../utils/flatTree';
23
+ import {getLastPointerType, subscribeInput} from '../utils/inputStream';
24
+
25
+ /**
26
+ * What a hold does. `'viewport'` and `'layer'` add one shield over the whole
27
+ * viewport. `'layer'` also makes the layer's content inert and moves focus
28
+ * out of it. `'surface'` shields only the layer's own box, and the page
29
+ * around it stays live.
30
+ */
31
+ export type InputHoldScope = 'viewport' | 'layer' | 'surface';
32
+
33
+ /** What ends a hold: a promise, or an animator handle (its `finished`). */
34
+ export type InputHoldEnd =
35
+ PromiseLike<unknown> | {readonly finished: PromiseLike<unknown>};
36
+
37
+ export interface InputHoldOptions {
38
+ /** The hold ends when this settles. */
39
+ until: InputHoldEnd;
40
+ /**
41
+ * `'viewport'` while presenting, `'layer'` while dismissing, `'surface'`
42
+ * while a non-modal layer presents.
43
+ */
44
+ scope: InputHoldScope;
45
+ }
46
+
47
+ interface HeldLayer {
48
+ viewport: number;
49
+ layer: number;
50
+ surface: number;
51
+ shield: HTMLElement | null;
52
+ /** Whether the shield covers the viewport, or only the layer's box. */
53
+ isShieldFull: boolean;
54
+ /** The content a dismissal made inert, and whether each was already. */
55
+ inertContent: Map<Element, boolean> | null;
56
+ }
57
+
58
+ /** A document while any of its layers is held. */
59
+ interface HeldDocument {
60
+ /** Its held layers, oldest first. */
61
+ readonly layers: Set<Element>;
62
+ }
63
+
64
+ /** A document's press hold, while its window listeners are on. */
65
+ interface PressHold {
66
+ /** New presses are held again (a layer is held). */
67
+ hold: () => void;
68
+ /** No new press is held; held ones are followed to their end. */
69
+ release: () => void;
70
+ }
71
+
72
+ const held = new WeakMap<Element, HeldLayer>();
73
+ const heldDocuments = new WeakMap<Document, HeldDocument>();
74
+ const pressHolds = new WeakMap<Document, PressHold>();
75
+ const liveShields = new WeakSet<Node>();
76
+
77
+ /** Whether the shared input stream last delivered a mouse's pointer event. */
78
+ function isMouseLast(doc: Document | null): boolean {
79
+ const view = doc?.defaultView;
80
+ return view != null && getLastPointerType(view) === 'mouse';
81
+ }
82
+
83
+ /**
84
+ * Whether `node` is the shield of a live hold. A hit test that must see past
85
+ * held input takes the first element of `elementsFromPoint` that is not one.
86
+ */
87
+ export function isInputShield(node: Node | null): boolean {
88
+ return node != null && liveShields.has(node);
89
+ }
90
+
91
+ /**
92
+ * Whether `target` is inside a held layer. It walks the flat tree as the
93
+ * gesture host does: a slotted node goes to its slot, and a shadow root to
94
+ * its host.
95
+ */
96
+ export function isInHeldLayer(target: Node | null): boolean {
97
+ for (
98
+ let node: Node | null = target;
99
+ node != null;
100
+ node = parentAcrossShadow(node)
101
+ ) {
102
+ if (node instanceof Element && held.has(node)) {
103
+ return true;
104
+ }
105
+ }
106
+ return false;
107
+ }
108
+
109
+ /**
110
+ * Whether the gesture host holds `target` away for the current pointer. A
111
+ * dismissing layer holds every pointer. A presenting layer holds every
112
+ * pointer but a mouse, which keeps today's behavior. The host asks this for
113
+ * every touch. So this module imports nothing from gestures/, and a
114
+ * root-entry component can hold its layer without gesture code. With nothing
115
+ * held, this answers false.
116
+ */
117
+ export function holdsTouch(target: Node): boolean {
118
+ const doc = target instanceof Document ? target : target.ownerDocument;
119
+ // The gesture host asks for every touch: with nothing held, answer at once.
120
+ if (doc == null || !heldDocuments.has(doc)) {
121
+ return false;
122
+ }
123
+ // What lands on a shield is held, a mouse's press included.
124
+ if (isInputShield(target)) {
125
+ return true;
126
+ }
127
+ let isHeld = false;
128
+ for (
129
+ let node: Node | null = target;
130
+ node != null;
131
+ node = parentAcrossShadow(node)
132
+ ) {
133
+ const state = node instanceof Element ? held.get(node) : undefined;
134
+ if (state != null) {
135
+ if (state.layer > 0) {
136
+ return true;
137
+ }
138
+ isHeld = true;
139
+ }
140
+ }
141
+ return isHeld && !isMouseLast(doc);
142
+ }
143
+
144
+ /**
145
+ * Starts holding `layer`. A document's first held layer turns its press hold
146
+ * on, with one stream subscription per event type, however many layers are
147
+ * held. The hold subscribes to nothing while nothing is held.
148
+ */
149
+ function startHolding(layer: Element): void {
150
+ const doc = layer.ownerDocument;
151
+ let state = heldDocuments.get(doc);
152
+ if (state == null) {
153
+ state = {layers: new Set()};
154
+ heldDocuments.set(doc, state);
155
+ }
156
+ state.layers.add(layer);
157
+ pressHoldFor(doc)?.hold();
158
+ }
159
+
160
+ /** Stops holding `layer`; after the document's last one, ends its holding. */
161
+ function stopHolding(layer: Element): void {
162
+ heldDocuments.get(layer.ownerDocument)?.layers.delete(layer);
163
+ liveLayers(layer.ownerDocument);
164
+ }
165
+
166
+ /**
167
+ * The document's held layers still in it, oldest first. A layer that has
168
+ * left the document holds nothing more. When none is left, `holdsTouch`
169
+ * answers false and the press hold takes no new press. Its subscriptions end
170
+ * once the presses it holds have ended.
171
+ */
172
+ function liveLayers(doc: Document): Element[] {
173
+ const state = heldDocuments.get(doc);
174
+ if (state == null) {
175
+ return [];
176
+ }
177
+ for (const layer of state.layers) {
178
+ if (!layer.isConnected) {
179
+ state.layers.delete(layer);
180
+ }
181
+ }
182
+ if (state.layers.size > 0) {
183
+ return [...state.layers];
184
+ }
185
+ heldDocuments.delete(doc);
186
+ pressHolds.get(doc)?.release();
187
+ return [];
188
+ }
189
+
190
+ const SWALLOWED = [
191
+ 'pointerdown',
192
+ 'pointerup',
193
+ 'touchstart',
194
+ 'touchend',
195
+ 'mousedown',
196
+ 'mouseup',
197
+ 'click',
198
+ 'contextmenu',
199
+ ] as const;
200
+
201
+ const swallow = (event: Event) => {
202
+ // A touch's start stays uncancelled: cancelling it would cancel the page's
203
+ // pinch-zoom too. The shield's `touch-action: pinch-zoom` keeps a finger
204
+ // from panning. A tap's mouse events and click land on the shield, which
205
+ // swallows them.
206
+ if (event.cancelable && event.type !== 'touchstart') {
207
+ event.preventDefault();
208
+ }
209
+ event.stopPropagation();
210
+ };
211
+
212
+ /**
213
+ * A transparent cover inside `layer`: of the viewport from the top layer
214
+ * (`isFull`), or of the layer's own box alone. Because the cover is inside
215
+ * the layer, a tap on it lands in the layer, and a light-dismissing layer
216
+ * stays open.
217
+ */
218
+ function addShield(layer: Element, isFull: boolean): HTMLElement {
219
+ const shield = layer.ownerDocument.createElement('div');
220
+ if (isFull) {
221
+ shield.setAttribute('popover', 'manual');
222
+ }
223
+ shield.setAttribute('aria-hidden', 'true');
224
+ Object.assign(shield.style, {
225
+ position: isFull ? 'fixed' : 'absolute',
226
+ inset: '0',
227
+ width: isFull ? '100vw' : '100%',
228
+ height: isFull ? '100vh' : '100%',
229
+ // Above the layer's own content.
230
+ zIndex: isFull ? 'auto' : '2147483647',
231
+ maxWidth: 'none',
232
+ maxHeight: 'none',
233
+ margin: '0',
234
+ padding: '0',
235
+ border: '0',
236
+ background: 'transparent',
237
+ overflow: 'hidden',
238
+ touchAction: 'pinch-zoom',
239
+ // These two inherited properties decide hit-testing. A layer root can opt
240
+ // out of hits, as a full-viewport layer does when a backdrop child takes
241
+ // them. Inherited from such a root, they would let a held tap fall through
242
+ // to the page.
243
+ pointerEvents: 'auto',
244
+ visibility: 'visible',
245
+ });
246
+ for (const type of SWALLOWED) {
247
+ shield.addEventListener(type, swallow, {capture: true, passive: false});
248
+ }
249
+ layer.append(shield);
250
+ liveShields.add(shield);
251
+ if (isFull && typeof shield.showPopover === 'function') {
252
+ try {
253
+ shield.showPopover();
254
+ } catch {
255
+ // Not connected, or popovers unsupported: the shield still covers
256
+ // what it can as a fixed element.
257
+ }
258
+ }
259
+ return shield;
260
+ }
261
+
262
+ /**
263
+ * Holds input away from `layer` until `until` settles. Returns the release
264
+ * (idempotent), for a hold that ends early. Holds on one layer stack, and
265
+ * the layer comes back when the last one ends. Each event is judged by its
266
+ * own pointer, never by the primary pointer. So a mouse on a touch screen
267
+ * keeps its clicks during a presentation.
268
+ */
269
+ export function holdInput(
270
+ layer: Element,
271
+ {until, scope}: InputHoldOptions,
272
+ ): () => void {
273
+ let state = held.get(layer);
274
+ if (state == null) {
275
+ state = {
276
+ viewport: 0,
277
+ layer: 0,
278
+ surface: 0,
279
+ shield: null,
280
+ isShieldFull: false,
281
+ inertContent: null,
282
+ };
283
+ held.set(layer, state);
284
+ }
285
+ startHolding(layer);
286
+ const isFull = scope !== 'surface';
287
+ if (state.shield != null && isFull && !state.isShieldFull) {
288
+ // A surface hold's shield gives way to one over the viewport.
289
+ liveShields.delete(state.shield);
290
+ state.shield.remove();
291
+ state.shield = null;
292
+ }
293
+ if (state.shield == null) {
294
+ state.isShieldFull = isFull || state.viewport + state.layer > 0;
295
+ state.shield = addShield(layer, state.isShieldFull);
296
+ // A presentation lets a mouse through from the start when the stream's
297
+ // last pointer was a mouse. A press where the mouse rests then acts.
298
+ if (scope !== 'layer' && isMouseLast(layer.ownerDocument)) {
299
+ state.shield.style.pointerEvents = 'none';
300
+ }
301
+ }
302
+ if (scope === 'viewport') {
303
+ state.viewport += 1;
304
+ } else if (scope === 'surface') {
305
+ state.surface += 1;
306
+ } else {
307
+ state.layer += 1;
308
+ // A dismissal's shield takes every hit, a mouse's included.
309
+ state.shield.style.pointerEvents = 'auto';
310
+ if (state.layer === 1) {
311
+ state.inertContent = makeContentInert(layer, state.shield);
312
+ }
313
+ }
314
+ let isReleased = false;
315
+ const release = () => {
316
+ if (isReleased) {
317
+ return;
318
+ }
319
+ isReleased = true;
320
+ const current = held.get(layer);
321
+ if (current == null) {
322
+ return;
323
+ }
324
+ if (scope === 'viewport') {
325
+ current.viewport -= 1;
326
+ } else if (scope === 'surface') {
327
+ current.surface -= 1;
328
+ } else {
329
+ current.layer -= 1;
330
+ if (current.layer === 0 && current.inertContent != null) {
331
+ restoreInert(current.inertContent);
332
+ current.inertContent = null;
333
+ }
334
+ }
335
+ if (
336
+ current.viewport === 0 &&
337
+ current.layer === 0 &&
338
+ current.surface === 0
339
+ ) {
340
+ if (current.shield != null) {
341
+ liveShields.delete(current.shield);
342
+ current.shield.remove();
343
+ }
344
+ held.delete(layer);
345
+ stopHolding(layer);
346
+ }
347
+ };
348
+ const end = 'finished' in until ? until.finished : until;
349
+ void Promise.resolve(end).then(release, release);
350
+ return release;
351
+ }
352
+
353
+ const HELD_POINTERS: ReadonlySet<string> = new Set(['touch', 'pen']);
354
+
355
+ /**
356
+ * How long after a held press ends its click and compatibility mouse events
357
+ * still count as its own (WebKit sends them after `touchend`).
358
+ */
359
+ const CLICK_WINDOW_MS = 800;
360
+
361
+ /** How long a held press is followed past the hold's end, at most. */
362
+ const STRAY_PRESS_MS = 10_000;
363
+
364
+ const POINTER_EVENTS = [
365
+ 'pointerdown',
366
+ 'pointermove',
367
+ 'pointerup',
368
+ 'pointercancel',
369
+ ] as const;
370
+ const TOUCH_EVENTS = [
371
+ 'touchstart',
372
+ 'touchmove',
373
+ 'touchend',
374
+ 'touchcancel',
375
+ ] as const;
376
+ const PRESS_EVENTS = [
377
+ 'mousedown',
378
+ 'mouseup',
379
+ 'click',
380
+ 'auxclick',
381
+ 'dblclick',
382
+ 'contextmenu',
383
+ ] as const;
384
+
385
+ /** The document's press hold, turned on if it is off. */
386
+ function pressHoldFor(doc: Document): PressHold | null {
387
+ let hold = pressHolds.get(doc) ?? null;
388
+ if (hold == null) {
389
+ hold = createPressHold(doc);
390
+ if (hold != null) {
391
+ pressHolds.set(doc, hold);
392
+ }
393
+ }
394
+ return hold;
395
+ }
396
+
397
+ /**
398
+ * Holds each finger or pen press that lands in `doc`'s window while any of
399
+ * its layers is held. Each press is held to its own end, even past the
400
+ * hold's end. A moving mouse passes through a presentation's shield. The
401
+ * hold hears input through the shared input stream, before its other
402
+ * subscribers, and stops each held event there. So no document or element
403
+ * listener hears it, and neither does press feedback or the gesture host.
404
+ * There is one per document. Its subscriptions end once nothing is held and
405
+ * the held presses and their clicks have ended.
406
+ */
407
+ function createPressHold(doc: Document): PressHold | null {
408
+ const view = doc.defaultView;
409
+ if (view == null) {
410
+ return null;
411
+ }
412
+ /** Whether a new press is held: until the release. */
413
+ let isHolding = true;
414
+ let isListening = true;
415
+ /** The held presses still down, by pointer id and by touch identifier. */
416
+ const pointers = new Set<number>();
417
+ const touches = new Set<number>();
418
+ /** Whose press the next click is: a held one's, or any other's. */
419
+ let lastPress: 'held' | 'free' | null = null;
420
+ /** Until when a click with no pointer type is a held press's. */
421
+ let clickUntil = -Infinity;
422
+ let timer: ReturnType<typeof setTimeout> | undefined;
423
+
424
+ const now = () => view.performance.now();
425
+ const isPressDown = () => pointers.size > 0 || touches.size > 0;
426
+
427
+ const swallow = (event: Event) => {
428
+ if (event.cancelable) {
429
+ event.preventDefault();
430
+ }
431
+ event.stopImmediatePropagation();
432
+ };
433
+
434
+ /** After the release: stops once the last held press and its click end. */
435
+ const settle = () => {
436
+ if (isHolding || !isListening) {
437
+ return;
438
+ }
439
+ if (timer !== undefined) {
440
+ clearTimeout(timer);
441
+ }
442
+ if (isPressDown()) {
443
+ timer = setTimeout(stop, STRAY_PRESS_MS);
444
+ return;
445
+ }
446
+ const wait = clickUntil - now();
447
+ if (wait > 0) {
448
+ timer = setTimeout(stop, wait);
449
+ } else {
450
+ stop();
451
+ }
452
+ };
453
+
454
+ /** Whether a layer is still held (one that left the document is not). */
455
+ const holdsNewPress = () => {
456
+ if (isHolding) {
457
+ liveLayers(doc);
458
+ }
459
+ return isHolding;
460
+ };
461
+
462
+ /**
463
+ * Whether a new press that lands on `target` is held. While a layer is held
464
+ * over the viewport, a press anywhere is held. While a layer is held only
465
+ * to its box (a `'surface'` hold), only a press on the layer is held. The
466
+ * page around it stays live.
467
+ */
468
+ const holdsPressAt = (target: EventTarget | null) => {
469
+ if (!holdsNewPress()) {
470
+ return false;
471
+ }
472
+ for (const layer of liveLayers(doc)) {
473
+ const state = held.get(layer);
474
+ if (state == null) {
475
+ continue;
476
+ }
477
+ if (state.viewport > 0 || state.layer > 0) {
478
+ return true;
479
+ }
480
+ if (
481
+ state.surface > 0 &&
482
+ target instanceof Node &&
483
+ containsAlongFlatTree(layer, target)
484
+ ) {
485
+ return true;
486
+ }
487
+ }
488
+ return false;
489
+ };
490
+
491
+ const pressEnded = () => {
492
+ clickUntil = now() + CLICK_WINDOW_MS;
493
+ settle();
494
+ };
495
+
496
+ /** A shield takes hits for a finger or a pen, not for a moving mouse. */
497
+ const followPointer = (pointerType: string) => {
498
+ for (const layer of liveLayers(doc)) {
499
+ const state = held.get(layer);
500
+ if (state?.shield == null) {
501
+ continue;
502
+ }
503
+ const value =
504
+ pointerType === 'mouse' && state.layer === 0 ? 'none' : 'auto';
505
+ if (state.shield.style.pointerEvents !== value) {
506
+ state.shield.style.pointerEvents = value;
507
+ }
508
+ }
509
+ };
510
+
511
+ /**
512
+ * A held press that landed past the shield, which had let a mouse through,
513
+ * is captured to the shield. Its release then stays the hold's, and a
514
+ * light-dismissing layer stays open. A synthetic press has no active
515
+ * pointer to capture, so `setPointerCapture` throws NotFoundError. Its
516
+ * events are swallowed all the same.
517
+ */
518
+ const captureToShield = (event: PointerEvent) => {
519
+ if (!event.isTrusted) {
520
+ return;
521
+ }
522
+ const top = liveLayers(doc).at(-1);
523
+ const shield = top == null ? null : held.get(top)?.shield;
524
+ if (shield == null || isInputShield(event.target as Node | null)) {
525
+ return;
526
+ }
527
+ shield.setPointerCapture(event.pointerId);
528
+ };
529
+
530
+ const onPointer = (event: Event): boolean => {
531
+ const {pointerId, pointerType, type} = event as PointerEvent;
532
+ // A finger or a pen raises the shields. Only a mouse that moves with no
533
+ // button down lowers them. So a mouse press that began on a shield stays
534
+ // the shield's to its end. Otherwise its click would go to the two
535
+ // targets' common ancestor, a dialog that reads it as a backdrop click.
536
+ const isFollowed = HELD_POINTERS.has(pointerType)
537
+ ? type === 'pointerdown' || type === 'pointermove'
538
+ : pointerType === 'mouse' &&
539
+ type === 'pointermove' &&
540
+ (event as PointerEvent).buttons === 0;
541
+ if (isFollowed && holdsNewPress()) {
542
+ followPointer(pointerType);
543
+ }
544
+ if (type === 'pointerdown') {
545
+ if (!HELD_POINTERS.has(pointerType) || !holdsPressAt(event.target)) {
546
+ // A mouse's press, or one after the hold: its click is its own, and a
547
+ // held press with its id ended unheard.
548
+ pointers.delete(pointerId);
549
+ lastPress = 'free';
550
+ clickUntil = -Infinity;
551
+ settle();
552
+ return false;
553
+ }
554
+ pointers.add(pointerId);
555
+ lastPress = 'held';
556
+ captureToShield(event as PointerEvent);
557
+ } else if (!pointers.has(pointerId)) {
558
+ return false;
559
+ }
560
+ // Canceling the press keeps the browser from sending its compatibility
561
+ // mouse events, and with them a focus move.
562
+ swallow(event);
563
+ if (type === 'pointerup' || type === 'pointercancel') {
564
+ pointers.delete(pointerId);
565
+ pressEnded();
566
+ }
567
+ return true;
568
+ };
569
+
570
+ const onTouch = (event: Event): boolean => {
571
+ const {changedTouches, touches: down, type} = event as TouchEvent;
572
+ const changed = Array.from(changedTouches);
573
+ if (type === 'touchstart') {
574
+ // A held touch that the screen no longer has ended unheard. Its target,
575
+ // the shield, left the document at the release, so its end reached no
576
+ // listener here.
577
+ const live = new Set(Array.from(down, touch => touch.identifier));
578
+ for (const identifier of touches) {
579
+ if (!live.has(identifier)) {
580
+ touches.delete(identifier);
581
+ }
582
+ }
583
+ const heldTouches = changed.filter(touch => holdsPressAt(touch.target));
584
+ if (heldTouches.length === 0) {
585
+ // A touch after the hold, or one beside a layer held only to its
586
+ // box, is a new one, whatever its identifier.
587
+ for (const touch of changed) {
588
+ touches.delete(touch.identifier);
589
+ }
590
+ lastPress = 'free';
591
+ clickUntil = -Infinity;
592
+ settle();
593
+ return false;
594
+ }
595
+ for (const touch of heldTouches) {
596
+ touches.add(touch.identifier);
597
+ }
598
+ lastPress = 'held';
599
+ // Never canceled: canceling a touch's start would cancel the page's
600
+ // pinch-zoom with it.
601
+ event.stopImmediatePropagation();
602
+ return true;
603
+ }
604
+ if (!changed.some(touch => touches.has(touch.identifier))) {
605
+ return false;
606
+ }
607
+ if (type === 'touchmove') {
608
+ event.stopImmediatePropagation();
609
+ // One finger pans nothing; two still zoom the page.
610
+ if (down.length === 1 && event.cancelable) {
611
+ event.preventDefault();
612
+ }
613
+ return true;
614
+ }
615
+ // A canceled end sends no click and no compatibility mouse events.
616
+ swallow(event);
617
+ for (const touch of changed) {
618
+ touches.delete(touch.identifier);
619
+ }
620
+ pressEnded();
621
+ return true;
622
+ };
623
+
624
+ const onPress = (event: Event): boolean => {
625
+ // A click a key or assistive technology sends counts no press.
626
+ if ((event as MouseEvent).detail === 0) {
627
+ return false;
628
+ }
629
+ // A click that names its pointer is judged by that pointer. A
630
+ // compatibility mouse event, or a click sent as a plain mouse event,
631
+ // belongs to the last press.
632
+ const {pointerType} = event as Partial<PointerEvent>;
633
+ const isHeldPress =
634
+ lastPress === 'held' &&
635
+ (pointerType == null ||
636
+ pointerType === '' ||
637
+ HELD_POINTERS.has(pointerType));
638
+ if (isHeldPress && (isPressDown() || now() <= clickUntil)) {
639
+ swallow(event);
640
+ return true;
641
+ }
642
+ return false;
643
+ };
644
+
645
+ function stop(): void {
646
+ if (!isListening) {
647
+ return;
648
+ }
649
+ isListening = false;
650
+ if (pressHolds.get(doc) === pressHold) {
651
+ pressHolds.delete(doc);
652
+ }
653
+ if (timer !== undefined) {
654
+ clearTimeout(timer);
655
+ }
656
+ for (const unsubscribe of unsubscribers.splice(0)) {
657
+ unsubscribe();
658
+ }
659
+ }
660
+
661
+ // A touch's start and cancel are never canceled, so their subscriptions
662
+ // keep the stream passive for them. The hold hears each event first, so a
663
+ // held one reaches no other subscriber: press feedback and the gesture host
664
+ // never hear it.
665
+ const unsubscribers = [
666
+ ...POINTER_EVENTS.map(type =>
667
+ subscribeInput(view, type, onPointer, {cancels: true, first: true}),
668
+ ),
669
+ ...TOUCH_EVENTS.map(type =>
670
+ subscribeInput(view, type, onTouch, {
671
+ cancels: type === 'touchmove' || type === 'touchend',
672
+ first: true,
673
+ }),
674
+ ),
675
+ ...PRESS_EVENTS.map(type =>
676
+ subscribeInput(view, type, onPress, {cancels: true, first: true}),
677
+ ),
678
+ ];
679
+
680
+ const pressHold: PressHold = {
681
+ hold() {
682
+ isHolding = true;
683
+ if (timer !== undefined) {
684
+ clearTimeout(timer);
685
+ timer = undefined;
686
+ }
687
+ },
688
+ release() {
689
+ if (!isHolding) {
690
+ return;
691
+ }
692
+ isHolding = false;
693
+ settle();
694
+ },
695
+ };
696
+ return pressHold;
697
+ }
698
+
699
+ /**
700
+ * Makes the layer's content inert, except the shield, and moves focus out of
701
+ * it. An element that turns inert while focused keeps its focus and its key
702
+ * activation. Enter and Space still click such a button until the engine's
703
+ * focus fixup runs, if it runs. Blurring it leaves focus on the document, as
704
+ * that fixup does. The layer element itself stays live. An inert subtree is
705
+ * no hit target, so the shield inside the layer still catches every hit.
706
+ */
707
+ function makeContentInert(
708
+ layer: Element,
709
+ shield: Element,
710
+ ): Map<Element, boolean> {
711
+ const content = new Map<Element, boolean>();
712
+ for (const child of layer.children) {
713
+ if (child !== shield) {
714
+ content.set(child, child.hasAttribute('inert'));
715
+ child.setAttribute('inert', '');
716
+ }
717
+ }
718
+ const focused = deepActiveElement(layer.ownerDocument);
719
+ if (
720
+ focused instanceof HTMLElement &&
721
+ [...content.keys()].some(child => containsAlongFlatTree(child, focused))
722
+ ) {
723
+ focused.blur();
724
+ }
725
+ return content;
726
+ }
727
+
728
+ function restoreInert(content: Map<Element, boolean>): void {
729
+ for (const [element, wasInert] of content) {
730
+ if (!wasInert) {
731
+ element.removeAttribute('inert');
732
+ }
733
+ }
734
+ }