@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
@@ -3,11 +3,12 @@
3
3
  /**
4
4
  * @file coarsePointer.ts
5
5
  * @input A window
6
- * @output Exports isCoarsePointer and watchCoarsePointer: whether the
7
- * primary pointer is coarse (TOUCH_QUERY), and when it changes
6
+ * @output Exports isCoarsePointer, watchCoarsePointer and watchMediaQuery:
7
+ * whether the primary pointer is coarse (TOUCH_QUERY), and when it or any
8
+ * media query changes
8
9
  * @position The coarse-pointer gate of packages/core/src/gestures and of
9
10
  * the press controller (pressFeedback.ts): touch-only work registers only
10
- * while it holds
11
+ * while it holds. useMediaQuery watches through watchMediaQuery
11
12
  *
12
13
  * Under a coarse primary pointer, a phone's touch work stays registered: the
13
14
  * gesture host's page listeners, the page hold and the finger scroll. Under a
@@ -29,23 +30,35 @@ export function isCoarsePointer(view: Window | null | undefined): boolean {
29
30
  }
30
31
 
31
32
  /**
32
- * Call `listener` with the new answer each time the primary pointer of
33
- * `view` turns coarse or fine, until the returned function is called.
33
+ * Call `listener` with the new answer each time `query` starts or stops
34
+ * matching in `view`, until the returned function is called.
34
35
  */
35
- export function watchCoarsePointer(
36
+ export function watchMediaQuery(
36
37
  view: Window | null | undefined,
37
- listener: (isCoarse: boolean) => void,
38
+ query: string,
39
+ listener: (matches: boolean) => void,
38
40
  ): () => void {
39
41
  if (typeof view?.matchMedia !== 'function') {
40
42
  return () => {};
41
43
  }
42
- const query = view.matchMedia(TOUCH_QUERY);
43
- const onChange = (): void => listener(query.matches);
44
- if (typeof query.addEventListener === 'function') {
45
- query.addEventListener('change', onChange);
46
- return () => query.removeEventListener('change', onChange);
44
+ const list = view.matchMedia(query);
45
+ const onChange = (): void => listener(list.matches);
46
+ if (typeof list.addEventListener === 'function') {
47
+ list.addEventListener('change', onChange);
48
+ return () => list.removeEventListener('change', onChange);
47
49
  }
48
50
  // Safari before 14 only has the older pair.
49
- query.addListener(onChange);
50
- return () => query.removeListener(onChange);
51
+ list.addListener(onChange);
52
+ return () => list.removeListener(onChange);
53
+ }
54
+
55
+ /**
56
+ * Call `listener` with the new answer each time the primary pointer of
57
+ * `view` turns coarse or fine, until the returned function is called.
58
+ */
59
+ export function watchCoarsePointer(
60
+ view: Window | null | undefined,
61
+ listener: (isCoarse: boolean) => void,
62
+ ): () => void {
63
+ return watchMediaQuery(view, TOUCH_QUERY, listener);
51
64
  }
@@ -3,11 +3,12 @@
3
3
  /**
4
4
  * @file flatTree.ts
5
5
  * @input A DOM node
6
- * @output Exports parentAcrossShadow, and containsAlongFlatTree, which walks it
6
+ * @output Exports parentAcrossShadow, containsAlongFlatTree, which walks it,
7
+ * and deepActiveElement
7
8
  * @position The flat-tree parent the browser scrolls and dispatches
8
- * through, shared by the gesture host's native-scroll probe and the
9
+ * through, shared by the gesture host's native-scroll probe, the
9
10
  * selection lock (which the press feedback controller uses without the
10
- * gesture system)
11
+ * gesture system) and the Layer module's input hold
11
12
  */
12
13
 
13
14
  /** The node's parent, crossing out of shadow roots. */
@@ -38,3 +39,14 @@ export function containsAlongFlatTree(ancestor: Node, node: Node): boolean {
38
39
  }
39
40
  return false;
40
41
  }
42
+
43
+ /** The focused element of `doc`, inside open shadow roots too. */
44
+ export function deepActiveElement(
45
+ doc: Document | null | undefined,
46
+ ): Element | null {
47
+ let active = doc?.activeElement ?? null;
48
+ while (active?.shadowRoot?.activeElement != null) {
49
+ active = active.shadowRoot.activeElement;
50
+ }
51
+ return active;
52
+ }
@@ -5,8 +5,9 @@
5
5
  * @input The document's current active element and the shared interaction
6
6
  * modality.
7
7
  * @output Whether focus would be lost if a surface hid now; a focus move whose
8
- * ring follows the last input; and the one path that moves focus out of
9
- * content a change removed or hid (`noteFocusWithin`, `moveFocusLeftBehind`).
8
+ * ring follows the last input; the focus return of a closed overlay, which
9
+ * never scrolls the page; and the one path that moves focus out of content a
10
+ * change removed or hid (`noteFocusWithin`, `moveFocusLeftBehind`).
10
11
  * @position Utility; used by overlays (BottomSheet, Dialog, DropdownMenu) that
11
12
  * move focus programmatically, and by disclosures that hide focused
12
13
  * content. isFocusDetached lives in isFocusDetached.ts, so the utils entry,
@@ -130,30 +131,89 @@ export function focusForLastInput(
130
131
  }
131
132
 
132
133
  /**
133
- * Prepares the focus return for an open surface that may be removed while
134
- * open (rendered only while open, or removed with its view). Removing a
135
- * `<dialog>` runs no close and no browser focus return. Call this while the
136
- * surface is mounted: it reads the frame that hosts the surface now, because a
137
- * removed frame's document has no window. Call the returned function from the
138
- * effect cleanup with the opener.
134
+ * Returns focus to `opener` after an overlay closes, without a scroll and with
135
+ * the ring the last input calls for. WebKit records the nearest focusable
136
+ * ancestor of a tapped button as the opener, such as a `tabindex="-1"` main
137
+ * region. A reveal of that region scrolls the page to its top edge.
138
+ */
139
+ export function returnFocusForLastInput(
140
+ opener: HTMLElement,
141
+ modality?: InteractionModality,
142
+ ): void {
143
+ focusForLastInput(opener, {preventScroll: true}, modality);
144
+ }
145
+
146
+ /**
147
+ * Prepares a focus repair for an open surface that may be removed while open
148
+ * (rendered only while open, or removed with its view). Removing a `<dialog>`
149
+ * runs no close and no browser focus return. Call this while the surface is
150
+ * mounted: it reads the frame that hosts the surface now, because a removed
151
+ * frame's document has no window. Call the returned function from the effect
152
+ * cleanup with the repair to run.
139
153
  *
140
- * Once the commit has finished, focus moves to the opener only when the
141
- * surface really left the document (StrictMode's simulated unmount keeps it),
142
- * the opener is still on the page, and the removal lost focus, both in the
143
- * surface's document and in the document that hosts its frame. A control the
144
- * user pressed outside the surface, or outside its frame, keeps its focus.
154
+ * Once the commit has finished, the repair runs only when the surface really
155
+ * left the document (StrictMode's simulated unmount keeps it) and the removal
156
+ * lost focus, both in the surface's document and in the document that hosts
157
+ * its frame. A control the user pressed outside the surface, or outside its
158
+ * frame, keeps its focus, and so does a surface that took focus in the same
159
+ * commit.
145
160
  */
146
- export function prepareFocusReturnOnRemoval(
161
+ export function prepareFocusRepairOnRemoval(
147
162
  surface: Element,
148
- ): (opener: Element | null) => void {
163
+ options?: {
164
+ /**
165
+ * Skip the repair when focus already rested on the page body before the
166
+ * commit's first removal: the removal did not lose that focus.
167
+ */
168
+ keepRestingFocus?: boolean;
169
+ },
170
+ ): (repair: () => void) => void {
149
171
  const host = surface.ownerDocument.defaultView?.frameElement ?? null;
150
- return opener => {
172
+ return repair => {
173
+ if (
174
+ options?.keepRestingFocus === true &&
175
+ wasFocusDetachedBeforeRemoval(surface.ownerDocument)
176
+ ) {
177
+ return;
178
+ }
151
179
  queueMicrotask(() => {
152
- if (surface.isConnected || opener == null || !opener.isConnected) {
180
+ if (surface.isConnected) {
153
181
  return;
154
182
  }
155
183
  if (isFocusLost(surface) && (host == null || isFocusLost(host))) {
156
- focusForLastInput(opener as HTMLElement);
184
+ repair();
185
+ }
186
+ });
187
+ };
188
+ }
189
+
190
+ // Whether focus rested on the page body when the current commit began
191
+ // removing surfaces, per document. One removal can drop focus before a later
192
+ // surface's cleanup runs, so every cleanup of the commit reads the first value.
193
+ const focusDetachedAtRemovalStart = new WeakMap<Document, boolean>();
194
+ function wasFocusDetachedBeforeRemoval(doc: Document): boolean {
195
+ let wasDetached = focusDetachedAtRemovalStart.get(doc);
196
+ if (wasDetached === undefined) {
197
+ wasDetached = isFocusDetached(doc);
198
+ focusDetachedAtRemovalStart.set(doc, wasDetached);
199
+ queueMicrotask(() => focusDetachedAtRemovalStart.delete(doc));
200
+ }
201
+ return wasDetached;
202
+ }
203
+
204
+ /**
205
+ * The focus repair above that returns focus to `opener` while the opener is
206
+ * still on the page. Call the returned function from the effect cleanup with
207
+ * the opener.
208
+ */
209
+ export function prepareFocusReturnOnRemoval(
210
+ surface: Element,
211
+ ): (opener: Element | null) => void {
212
+ const repairOnRemoval = prepareFocusRepairOnRemoval(surface);
213
+ return opener => {
214
+ repairOnRemoval(() => {
215
+ if (opener != null && opener.isConnected) {
216
+ returnFocusForLastInput(opener as HTMLElement);
157
217
  }
158
218
  });
159
219
  };
@@ -24,6 +24,9 @@
24
24
  // live control measures: only under a coarse primary pointer (AST-094), only on
25
25
  // screen, and in one read pass per frame within a 4 ms budget. Until the first
26
26
  // pass the insets are 0, so first paint never overlaps anything.
27
+ // The insets are lengths in the control's own box, so a pass measures in its
28
+ // layout px. A layer that opens from a smaller scale then keeps the insets of
29
+ // the size it settles at.
27
30
 
28
31
  import {observeContent} from './sharedMutationObserver';
29
32
 
@@ -264,6 +267,7 @@ function now(): number {
264
267
  interface Watch {
265
268
  readonly element: Element;
266
269
  readonly minSize: number;
270
+ readonly ownsDescendantTouches: boolean;
267
271
  readonly onInsets: (insets: HitInsets) => void;
268
272
  isVisible: boolean;
269
273
  last: HitInsets;
@@ -284,6 +288,8 @@ const observedSizes = new WeakMap<Element, string>();
284
288
  const scopeTimers = new Map<Element, ReturnType<typeof setTimeout>>();
285
289
  let frame: number | null = null;
286
290
  let view: Window | null = null;
291
+ /** The document the shared press listener is on, while it is on one. */
292
+ let pressDocument: Document | null = null;
287
293
  let pointer: MediaQueryList | null = null;
288
294
  let visibility: IntersectionObserver | null = null;
289
295
  let resize: ResizeObserver | null = null;
@@ -330,6 +336,95 @@ function plainRect(element: Element): HitRect {
330
336
  return {left, top, right, bottom};
331
337
  }
332
338
 
339
+ /** A box that the transforms around it leave at its layout size. */
340
+ const UNSCALED = {x: 1, y: 1} as const;
341
+
342
+ /** One axis of a box's scale on screen: its client size over its layout size. */
343
+ function axisScale(onScreen: number, layout: number): number {
344
+ if (!(layout > 0) || !(onScreen > 0)) {
345
+ return 1;
346
+ }
347
+ const scale = onScreen / layout;
348
+ // Within rounding of 1 the box is at its layout size: no change to the rects.
349
+ return Math.abs(scale - 1) < 1e-3 ? 1 : scale;
350
+ }
351
+
352
+ /**
353
+ * How far the transforms around `element` scale its box on screen, per axis.
354
+ * A layer that opens from a smaller scale scales every rect inside it, while
355
+ * the layout box keeps the size the layer settles at. Only a scale is
356
+ * expected: a rotated or skewed box would read as a larger scale.
357
+ */
358
+ function screenScale(
359
+ element: Element,
360
+ onScreen: HitRect,
361
+ ): {x: number; y: number} {
362
+ // The offset size is the layout size in whole pixels, unaffected by
363
+ // transforms, and costs no style resolution. A box with none, such as an SVG
364
+ // element or a jsdom box, reads as unscaled.
365
+ const box = element as Partial<HTMLElement>;
366
+ const offsetWidth = box.offsetWidth ?? 0;
367
+ const offsetHeight = box.offsetHeight ?? 0;
368
+ if (offsetWidth === 0 || offsetHeight === 0) {
369
+ return UNSCALED;
370
+ }
371
+ // Within a pixel of its layout size the box reads as unscaled, which bounds
372
+ // the inset error at about a pixel. Only a box that a transform shrinks or
373
+ // grows reads its exact size from the computed style.
374
+ if (
375
+ Math.abs(onScreen.right - onScreen.left - offsetWidth) <= 1 &&
376
+ Math.abs(onScreen.bottom - onScreen.top - offsetHeight) <= 1
377
+ ) {
378
+ return UNSCALED;
379
+ }
380
+ const style = element.ownerDocument.defaultView?.getComputedStyle(element);
381
+ if (style == null || !style.width.endsWith('px')) {
382
+ return UNSCALED;
383
+ }
384
+ const px = (value: string) => Number.parseFloat(value) || 0;
385
+ const isContentBox = style.boxSizing !== 'border-box';
386
+ const width =
387
+ px(style.width) +
388
+ (isContentBox
389
+ ? px(style.paddingLeft) +
390
+ px(style.paddingRight) +
391
+ px(style.borderLeftWidth) +
392
+ px(style.borderRightWidth)
393
+ : 0);
394
+ const height =
395
+ px(style.height) +
396
+ (isContentBox
397
+ ? px(style.paddingTop) +
398
+ px(style.paddingBottom) +
399
+ px(style.borderTopWidth) +
400
+ px(style.borderBottomWidth)
401
+ : 0);
402
+ return {
403
+ x: axisScale(onScreen.right - onScreen.left, width),
404
+ y: axisScale(onScreen.bottom - onScreen.top, height),
405
+ };
406
+ }
407
+
408
+ /**
409
+ * `rect` in the layout px of the box at `origin`: its offset from `origin`,
410
+ * divided by that box's scale on screen.
411
+ */
412
+ function inLayout(
413
+ rect: HitRect,
414
+ origin: HitRect,
415
+ scale: {x: number; y: number},
416
+ ): HitRect {
417
+ if (scale.x === 1 && scale.y === 1) {
418
+ return rect;
419
+ }
420
+ return {
421
+ left: origin.left + (rect.left - origin.left) / scale.x,
422
+ top: origin.top + (rect.top - origin.top) / scale.y,
423
+ right: origin.left + (rect.right - origin.left) / scale.x,
424
+ bottom: origin.top + (rect.bottom - origin.top) / scale.y,
425
+ };
426
+ }
427
+
333
428
  interface Candidate {
334
429
  readonly element: Element;
335
430
  readonly rect: HitRect;
@@ -373,14 +468,15 @@ function measureOne(
373
468
  candidates: ReadonlyArray<Candidate>,
374
469
  ): {target: HitRect; insets: HitInsets; neighbours: HitRect[]} {
375
470
  const target = plainRect(watch.element);
471
+ const scale = screenScale(watch.element, target);
376
472
  // Two targets each growing up to half the minimum reach each other from a
377
473
  // minimum apart.
378
474
  const reach = Math.max(0, watch.minSize);
379
475
  const band = grown(target, {
380
- top: reach,
381
- right: reach,
382
- bottom: reach,
383
- left: reach,
476
+ top: reach * scale.y,
477
+ right: reach * scale.x,
478
+ bottom: reach * scale.y,
479
+ left: reach * scale.x,
384
480
  });
385
481
  const neighbours = candidates
386
482
  .filter(
@@ -393,7 +489,16 @@ function measureOne(
393
489
  .map(({rect}) => rect);
394
490
  return {
395
491
  target,
396
- insets: clampedHitInsets(target, neighbours, watch.minSize),
492
+ // The insets are in the control's layout px. The returned rects stay in
493
+ // screen px for a touch's distance checks. A neighbour maps by the
494
+ // control's scale, as if it is in the same layer. A neighbour outside that
495
+ // layer then reads farther away. A touch compares screen distances, so it
496
+ // still counts that neighbour.
497
+ insets: clampedHitInsets(
498
+ inLayout(target, target, scale),
499
+ neighbours.map(rect => inLayout(rect, target, scale)),
500
+ watch.minSize,
501
+ ),
397
502
  neighbours,
398
503
  };
399
504
  }
@@ -497,7 +602,16 @@ function checkPress(element: Element, event: PointerEvent): void {
497
602
  const own = distanceTo(target, x, y);
498
603
  isNearerNeighbour ||= neighbours.some(rect => distanceTo(rect, x, y) < own);
499
604
  }
500
- if (isNearerNeighbour) {
605
+ // A watch can own its descendants' touches. Then a press that the browser
606
+ // hit-tests onto a descendant lands on content the element paints, even
607
+ // past its own box. A swipe panel's entry beside a moved row is such
608
+ // content. That touch is the element's.
609
+ const isOnOwnContent =
610
+ [...entry.watches].some(watch => watch.ownsDescendantTouches) &&
611
+ press.target instanceof Node &&
612
+ press.target !== element &&
613
+ element.contains(press.target);
614
+ if (isNearerNeighbour && !isOnOwnContent) {
501
615
  const swallow = (click: Event) => {
502
616
  disarm();
503
617
  // A keyboard or assistive-technology activation (detail 0) is never
@@ -585,7 +699,8 @@ function startObserving(): void {
585
699
  return;
586
700
  }
587
701
  view.addEventListener('resize', scheduleAll);
588
- view.document.addEventListener('pointerdown', onPress, PASSIVE_CAPTURE);
702
+ pressDocument = view.document;
703
+ pressDocument.addEventListener('pointerdown', onPress, PASSIVE_CAPTURE);
589
704
  if (typeof IntersectionObserver === 'function') {
590
705
  visibility = new IntersectionObserver(entries => {
591
706
  for (const entry of entries) {
@@ -641,7 +756,10 @@ function stopObserving(): void {
641
756
  entry.release = null;
642
757
  }
643
758
  view?.removeEventListener('resize', scheduleAll);
644
- view?.document.removeEventListener('pointerdown', onPress, PASSIVE_CAPTURE);
759
+ // The listener leaves the document it went on. A window can close first, as
760
+ // a removed iframe's, and then it has no document to read.
761
+ pressDocument?.removeEventListener('pointerdown', onPress, PASSIVE_CAPTURE);
762
+ pressDocument = null;
645
763
  visibility?.disconnect();
646
764
  resize?.disconnect();
647
765
  visibility = null;
@@ -675,6 +793,13 @@ function onPointerChange(): void {
675
793
  export interface WatchHitAreaOptions {
676
794
  /** The size to grow toward, px. @default 44 */
677
795
  readonly minSize?: number;
796
+ /**
797
+ * A touch that the browser hit-tests onto a descendant is the element's,
798
+ * however near a neighbour is. Set it for a host whose content can paint
799
+ * past its box, such as a list row with a swipe panel. A control whose
800
+ * grown input is its descendant leaves it off. @default false
801
+ */
802
+ readonly ownsDescendantTouches?: boolean;
678
803
  }
679
804
 
680
805
  /**
@@ -706,7 +831,10 @@ export function resetHitAreaForTests(): void {
706
831
  export function watchHitArea(
707
832
  element: Element,
708
833
  onInsets: (insets: HitInsets) => void,
709
- {minSize = MIN_TOUCH_TARGET}: WatchHitAreaOptions = {},
834
+ {
835
+ minSize = MIN_TOUCH_TARGET,
836
+ ownsDescendantTouches = false,
837
+ }: WatchHitAreaOptions = {},
710
838
  ): () => void {
711
839
  const owner = element.ownerDocument.defaultView;
712
840
  if (owner == null) {
@@ -726,6 +854,7 @@ export function watchHitArea(
726
854
  const watch: Watch = {
727
855
  element,
728
856
  minSize,
857
+ ownsDescendantTouches,
729
858
  onInsets,
730
859
  isVisible: isCoarse && visibility == null,
731
860
  last: NO_HIT_INSETS,
@@ -2,7 +2,8 @@
2
2
 
3
3
  /**
4
4
  * @file inputPresentation.ts
5
- * @input A presentation policy, the deprecated nativePicker value, and pointer type
5
+ * @input A presentation policy, the deprecated nativePicker value, whether the
6
+ * native date control can show the calendar, and pointer type
6
7
  * @output The resolved picker surface for DateInput, DateTimeInput, and TimeInput
7
8
  * @position Shared presentation vocabulary (AST-043)
8
9
  *
@@ -113,6 +114,25 @@ export function effectiveInputPresentation(
113
114
  return DEFAULT_INPUT_PRESENTATION;
114
115
  }
115
116
 
117
+ /**
118
+ * The policy a date picker follows in its calendar. `<input type="date">` is
119
+ * Gregorian, so in a calendar it cannot show, the policies that use it
120
+ * (`native` and `adaptive-native`) use the Astryx popover on a fine pointer and
121
+ * the bottom sheet on a coarse one instead.
122
+ */
123
+ export function calendarPickerPresentation(
124
+ presentation: PickerPresentation,
125
+ isNativeCalendar: boolean,
126
+ ): PickerPresentation {
127
+ if (
128
+ !isNativeCalendar &&
129
+ (presentation === 'native' || presentation === 'adaptive-native')
130
+ ) {
131
+ return 'adaptive-bottom-sheet';
132
+ }
133
+ return presentation;
134
+ }
135
+
116
136
  /** Resolve a picker-only policy to the surface rendered for the current pointer. */
117
137
  export function resolvePickerPresentation(
118
138
  presentation: PickerPresentation,
@@ -4,7 +4,8 @@
4
4
  * @file inputStream.ts
5
5
  * @input A window, and subscribers to its input events (the press feedback
6
6
  * controller, the gesture host)
7
- * @output subscribeInput
7
+ * @output subscribeInput, and getLastPointerType: the type of the latest
8
+ * pointer event the stream delivered
8
9
  * @position The one entry for document-wide input listeners in core: one
9
10
  * native listener per event type on the window's capture phase, shared by
10
11
  * every subscriber
@@ -22,18 +23,21 @@
22
23
  // `blur` or `focus`. A subscriber for the window's own event checks
23
24
  // `event.target`.
24
25
  //
25
- // Subscribers run in subscription order. One that throws is reported, and
26
- // the rest still run.
26
+ // Subscribers run in subscription order, after the ones subscribed `first`.
27
+ // A first subscriber that returns `true` ends the dispatch: no later
28
+ // subscriber hears the event. One that throws is reported, and the rest still
29
+ // run.
27
30
  //
28
31
  // A type's native listener is passive, so it blocks no scroll. It is
29
32
  // non-passive only while a subscriber that cancels the event
30
33
  // (`{cancels: true}`) is subscribed. With no subscriber left, it is removed.
31
34
 
32
- type InputListener = (event: Event) => void;
35
+ type InputListener = (event: Event) => unknown;
33
36
 
34
37
  interface Subscriber {
35
38
  readonly listener: InputListener;
36
39
  readonly cancels: boolean;
40
+ readonly isFirst: boolean;
37
41
  }
38
42
 
39
43
  interface Channel {
@@ -50,12 +54,30 @@ export interface InputSubscriptionOptions {
50
54
  * @default false
51
55
  */
52
56
  readonly cancels?: boolean;
57
+ /**
58
+ * The subscriber runs before every subscriber that is not first. When it
59
+ * returns `true`, no later subscriber hears the event.
60
+ * @default false
61
+ */
62
+ readonly first?: boolean;
53
63
  }
54
64
 
55
65
  /** The events a window's capture phase sees: its own, and the document's. */
56
66
  export type InputEventMap = WindowEventMap & DocumentEventMap;
57
67
 
58
68
  const streams = new WeakMap<Window, Map<string, Channel>>();
69
+ /** The type of the latest pointer event each window's stream delivered. */
70
+ const lastPointerTypes = new WeakMap<Window, string>();
71
+
72
+ /**
73
+ * The type of the latest pointer event `view`'s stream delivered: `mouse`,
74
+ * `pen` or `touch`, or `null` before any. The stream hears a pointer event
75
+ * type only while a subscriber listens to it, as press feedback does on any
76
+ * page with a pressable. Reading it adds no listener.
77
+ */
78
+ export function getLastPointerType(view: Window): string | null {
79
+ return lastPointerTypes.get(view) ?? null;
80
+ }
59
81
 
60
82
  /**
61
83
  * Listen to `type` on `view`'s capture phase through its shared native
@@ -64,8 +86,8 @@ const streams = new WeakMap<Window, Map<string, Channel>>();
64
86
  export function subscribeInput<K extends keyof InputEventMap>(
65
87
  view: Window,
66
88
  type: K,
67
- listener: (event: InputEventMap[K]) => void,
68
- {cancels = false}: InputSubscriptionOptions = {},
89
+ listener: (event: InputEventMap[K]) => unknown,
90
+ {cancels = false, first = false}: InputSubscriptionOptions = {},
69
91
  ): () => void {
70
92
  let channels = streams.get(view);
71
93
  if (channels == null) {
@@ -80,8 +102,16 @@ export function subscribeInput<K extends keyof InputEventMap>(
80
102
  const subscriber: Subscriber = {
81
103
  listener: listener as InputListener,
82
104
  cancels,
105
+ isFirst: first,
83
106
  };
84
- channel.subscribers.push(subscriber);
107
+ const firstLater = first
108
+ ? channel.subscribers.findIndex(other => !other.isFirst)
109
+ : -1;
110
+ if (firstLater === -1) {
111
+ channel.subscribers.push(subscriber);
112
+ } else {
113
+ channel.subscribers.splice(firstLater, 0, subscriber);
114
+ }
85
115
  register(view, type, channel);
86
116
  let isSubscribed = true;
87
117
  return () => {
@@ -124,12 +154,17 @@ function register(view: Window, type: string, channel: Channel): void {
124
154
  if (wanted == null) {
125
155
  return;
126
156
  }
127
- const listener: InputListener = event => dispatch(channel, event);
157
+ const listener: InputListener = event => dispatch(view, channel, event);
128
158
  view.addEventListener(type, listener, {capture: true, passive: !wanted});
129
159
  channel.native = {listener, cancels: wanted};
130
160
  }
131
161
 
132
- function dispatch(channel: Channel, event: Event): void {
162
+ function dispatch(view: Window, channel: Channel, event: Event): void {
163
+ // Recorded before any subscriber runs, so each reads the pointer at hand.
164
+ const {pointerType} = event as Partial<PointerEvent>;
165
+ if (typeof pointerType === 'string' && pointerType !== '') {
166
+ lastPointerTypes.set(view, pointerType);
167
+ }
133
168
  // A subscriber may subscribe or unsubscribe while the event runs; the
134
169
  // event goes to those subscribed when it arrived.
135
170
  for (const subscriber of [...channel.subscribers]) {
@@ -137,7 +172,9 @@ function dispatch(channel: Channel, event: Event): void {
137
172
  continue;
138
173
  }
139
174
  try {
140
- subscriber.listener(event);
175
+ if (subscriber.listener(event) === true && subscriber.isFirst) {
176
+ return;
177
+ }
141
178
  } catch (error) {
142
179
  report(error);
143
180
  }