@astryxdesign/core 0.7.7-canary.4a8a76e → 0.7.7-canary.4e495ec

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 (266) hide show
  1. package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts +13 -0
  2. package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts.map +1 -0
  3. package/dist/AppShell/useCloseMobileDrawerOnActivate.js +45 -0
  4. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  5. package/dist/BottomSheet/BottomSheet.js +79 -9
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.js +1 -1
  8. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
  9. package/dist/BottomSheet/bottomSheetStack.js +5 -4
  10. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +2 -1
  11. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  12. package/dist/Breadcrumbs/BreadcrumbItem.js +7 -3
  13. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  14. package/dist/CheckboxList/CheckboxList.js +7 -1
  15. package/dist/CheckboxList/CheckboxListContext.d.ts +6 -0
  16. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  17. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  18. package/dist/CheckboxList/CheckboxListItem.js +10 -2
  19. package/dist/DateInput/DateInput.d.ts.map +1 -1
  20. package/dist/DateInput/DateInput.js +5 -2
  21. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  22. package/dist/DateTimeInput/DateTimeInput.js +5 -2
  23. package/dist/Dialog/Dialog.d.ts.map +1 -1
  24. package/dist/Dialog/Dialog.js +16 -14
  25. package/dist/Drawer/Drawer.d.ts.map +1 -1
  26. package/dist/Drawer/Drawer.js +15 -11
  27. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  28. package/dist/Drawer/useDrawerDialogPresence.js +5 -1
  29. package/dist/Field/PanelSearchInput.d.ts +9 -1
  30. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  31. package/dist/Field/PanelSearchInput.js +3 -1
  32. package/dist/InfoTip/InfoTip.d.ts +2 -2
  33. package/dist/InfoTip/InfoTip.js +4 -4
  34. package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
  35. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  36. package/dist/Layer/layerAnimations.stylex.js +25 -20
  37. package/dist/Layer/useBackdropPress.d.ts +27 -0
  38. package/dist/Layer/useBackdropPress.d.ts.map +1 -0
  39. package/dist/Layer/useBackdropPress.js +53 -0
  40. package/dist/Layer/usePressPin.d.ts +3 -5
  41. package/dist/Layer/usePressPin.d.ts.map +1 -1
  42. package/dist/Layer/usePressPin.js +4 -6
  43. package/dist/MobileNav/MobileNav.js +0 -1
  44. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  45. package/dist/MultiSelector/hooks.js +2 -4
  46. package/dist/Outline/Outline.d.ts +2 -4
  47. package/dist/Outline/Outline.d.ts.map +1 -1
  48. package/dist/Outline/Outline.js +4 -52
  49. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  50. package/dist/Outline/useOutlineFromMarkdown.js +1 -0
  51. package/dist/Outline/useScrollSpy.js +3 -3
  52. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  53. package/dist/PowerSearch/PowerSearch.js +134 -179
  54. package/dist/RadioList/RadioList.d.ts.map +1 -1
  55. package/dist/RadioList/RadioList.js +5 -0
  56. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  57. package/dist/Resizable/ResizeHandle.js +118 -260
  58. package/dist/Resizable/resizeGesture.d.ts +91 -0
  59. package/dist/Resizable/resizeGesture.d.ts.map +1 -0
  60. package/dist/Resizable/resizeGesture.js +251 -0
  61. package/dist/SegmentedControl/SegmentedControl.d.ts +3 -1
  62. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  63. package/dist/SegmentedControl/SegmentedControl.js +115 -8
  64. package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
  65. package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  66. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -0
  67. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  68. package/dist/SegmentedControl/SegmentedControlItem.js +8 -1
  69. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts +357 -0
  70. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -0
  71. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +1349 -0
  72. package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts +70 -0
  73. package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts.map +1 -0
  74. package/dist/SegmentedControl/useSegmentedTouchTracking.js +264 -0
  75. package/dist/Selector/Selector.d.ts.map +1 -1
  76. package/dist/Selector/Selector.js +96 -67
  77. package/dist/Selector/optionShape.d.ts +24 -0
  78. package/dist/Selector/optionShape.d.ts.map +1 -0
  79. package/dist/Selector/optionShape.js +48 -0
  80. package/dist/Selector/selectableOptionEntries.d.ts +20 -0
  81. package/dist/Selector/selectableOptionEntries.d.ts.map +1 -0
  82. package/dist/Selector/selectableOptionEntries.js +38 -0
  83. package/dist/Selector/utils.d.ts +2 -17
  84. package/dist/Selector/utils.d.ts.map +1 -1
  85. package/dist/Selector/utils.js +3 -51
  86. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  87. package/dist/SideNav/SideNavItem.js +3 -9
  88. package/dist/Switch/switchTouch.d.ts +0 -7
  89. package/dist/Switch/switchTouch.d.ts.map +1 -1
  90. package/dist/Switch/switchTouch.js +2 -10
  91. package/dist/Switch/useSwitchTouch.d.ts +2 -11
  92. package/dist/Switch/useSwitchTouch.d.ts.map +1 -1
  93. package/dist/Switch/useSwitchTouch.js +26 -85
  94. package/dist/Token/Token.d.ts +2 -2
  95. package/dist/Token/Token.d.ts.map +1 -1
  96. package/dist/Token/Token.js +12 -4
  97. package/dist/Token/TokenNamingContext.d.ts +14 -0
  98. package/dist/Token/TokenNamingContext.d.ts.map +1 -0
  99. package/dist/Token/TokenNamingContext.js +23 -0
  100. package/dist/Tokenizer/Tokenizer.d.ts +46 -59
  101. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  102. package/dist/Tokenizer/Tokenizer.js +35 -58
  103. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +25 -28
  104. package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
  105. package/dist/Tokenizer/TokenizerBottomSheet.js +157 -54
  106. package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -1
  107. package/dist/Tokenizer/TokenizerItemRemovableContext.js +5 -3
  108. package/dist/Tooltip/Tooltip.d.ts +25 -30
  109. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  110. package/dist/Tooltip/Tooltip.js +24 -5
  111. package/dist/Tooltip/index.d.ts +1 -1
  112. package/dist/Tooltip/index.d.ts.map +1 -1
  113. package/dist/Tooltip/useTooltip.d.ts +28 -29
  114. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  115. package/dist/Tooltip/useTooltip.js +20 -8
  116. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  117. package/dist/TopNav/TopNavItem.js +4 -7
  118. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  119. package/dist/TopNav/TopNavMegaMenuItem.js +4 -7
  120. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  121. package/dist/TopNav/TopNavMenu.js +4 -7
  122. package/dist/astryx.css +76 -5
  123. package/dist/gestures/GestureHost.d.ts.map +1 -1
  124. package/dist/gestures/GestureHost.js +53 -5
  125. package/dist/hooks/actionGroupTracker.d.ts +3 -3
  126. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  127. package/dist/hooks/actionGroupTracker.js +6 -53
  128. package/dist/hooks/useHighlightedOptionScroll.d.ts +11 -1
  129. package/dist/hooks/useHighlightedOptionScroll.d.ts.map +1 -1
  130. package/dist/hooks/useHighlightedOptionScroll.js +112 -11
  131. package/dist/hooks/useMediaQuery.d.ts +2 -1
  132. package/dist/hooks/useMediaQuery.d.ts.map +1 -1
  133. package/dist/hooks/useMediaQuery.js +7 -4
  134. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  135. package/dist/hooks/useMenuPress.js +4 -2
  136. package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.d.ts.map +1 -1
  137. package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.js +1 -0
  138. package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.d.ts.map +1 -1
  139. package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.js +7 -1
  140. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  141. package/dist/i18n/generated-locales/en.generated.js +1 -0
  142. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  143. package/dist/i18n/generated-locales/pseudo.generated.js +1 -0
  144. package/dist/internal/SheetConfirmation.d.ts +11 -0
  145. package/dist/internal/SheetConfirmation.d.ts.map +1 -0
  146. package/dist/internal/SheetConfirmation.js +92 -0
  147. package/dist/internal/sheetDraft.d.ts +35 -0
  148. package/dist/internal/sheetDraft.d.ts.map +1 -0
  149. package/dist/internal/sheetDraft.js +65 -0
  150. package/dist/internal/touch-sheet.d.ts +21 -0
  151. package/dist/internal/touch-sheet.d.ts.map +1 -0
  152. package/dist/internal/touch-sheet.js +19 -0
  153. package/dist/internal/useDismissSearchOnTouchDrag.d.ts +24 -0
  154. package/dist/internal/useDismissSearchOnTouchDrag.d.ts.map +1 -0
  155. package/dist/internal/useDismissSearchOnTouchDrag.js +56 -0
  156. package/dist/motion/roles.d.ts +7 -1
  157. package/dist/motion/roles.d.ts.map +1 -1
  158. package/dist/motion/roles.js +20 -1
  159. package/dist/motion/uikit/index.d.ts +6 -5
  160. package/dist/motion/uikit/index.d.ts.map +1 -1
  161. package/dist/motion/uikit/index.js +6 -5
  162. package/dist/motion/uikit/segmented.d.ts +55 -0
  163. package/dist/motion/uikit/segmented.d.ts.map +1 -0
  164. package/dist/motion/uikit/segmented.js +77 -0
  165. package/dist/motion/uikit/springs.d.ts +0 -18
  166. package/dist/motion/uikit/springs.d.ts.map +1 -1
  167. package/dist/motion/uikit/springs.js +5 -21
  168. package/dist/privateAttributes/segmentTitle.stylex.d.ts +5 -0
  169. package/dist/privateAttributes/segmentTitle.stylex.d.ts.map +1 -0
  170. package/dist/privateAttributes/segmentTitle.stylex.js +22 -0
  171. package/dist/utils/browserClickWait.d.ts +35 -0
  172. package/dist/utils/browserClickWait.d.ts.map +1 -0
  173. package/dist/utils/browserClickWait.js +123 -0
  174. package/dist/utils/clickGuard.d.ts +8 -1
  175. package/dist/utils/clickGuard.d.ts.map +1 -1
  176. package/dist/utils/clickGuard.js +24 -1
  177. package/locales/en.json +4 -0
  178. package/locales/pseudo.json +3 -0
  179. package/package.json +8 -8
  180. package/src/AppShell/useCloseMobileDrawerOnActivate.ts +52 -0
  181. package/src/BottomSheet/BottomSheet.tsx +95 -10
  182. package/src/BottomSheet/BottomSheetPanel.tsx +7 -2
  183. package/src/BottomSheet/bottomSheetStack.ts +8 -4
  184. package/src/Breadcrumbs/BreadcrumbItem.tsx +13 -3
  185. package/src/CheckboxList/CheckboxList.doc.mjs +4 -2
  186. package/src/CheckboxList/CheckboxList.tsx +6 -0
  187. package/src/CheckboxList/CheckboxListContext.tsx +6 -0
  188. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  189. package/src/DateInput/DateInput.tsx +8 -2
  190. package/src/DateTimeInput/DateTimeInput.tsx +8 -2
  191. package/src/Dialog/Dialog.tsx +44 -14
  192. package/src/Drawer/Drawer.tsx +28 -11
  193. package/src/Drawer/useDrawerDialogPresence.ts +5 -1
  194. package/src/Field/PanelSearchInput.tsx +11 -0
  195. package/src/InfoTip/InfoTip.doc.mjs +3 -3
  196. package/src/InfoTip/InfoTip.tsx +5 -5
  197. package/src/Layer/layerAnimations.stylex.ts +24 -16
  198. package/src/Layer/useBackdropPress.ts +81 -0
  199. package/src/Layer/usePressPin.ts +5 -11
  200. package/src/MobileNav/MobileNav.tsx +1 -1
  201. package/src/MultiSelector/hooks.ts +2 -4
  202. package/src/Outline/Outline.doc.mjs +177 -51
  203. package/src/Outline/Outline.tsx +5 -57
  204. package/src/Outline/useOutlineFromMarkdown.doc.mjs +157 -0
  205. package/src/Outline/useOutlineFromMarkdown.ts +1 -0
  206. package/src/Outline/useScrollSpy.ts +3 -3
  207. package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
  208. package/src/PowerSearch/PowerSearch.tsx +196 -183
  209. package/src/RadioList/RadioList.doc.mjs +4 -2
  210. package/src/RadioList/RadioList.tsx +4 -0
  211. package/src/Resizable/ResizeHandle.tsx +133 -328
  212. package/src/Resizable/resizeGesture.ts +368 -0
  213. package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
  214. package/src/SegmentedControl/SegmentedControl.tsx +179 -5
  215. package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
  216. package/src/SegmentedControl/SegmentedControlItem.tsx +12 -1
  217. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +1637 -0
  218. package/src/SegmentedControl/useSegmentedTouchTracking.ts +308 -0
  219. package/src/Selector/Selector.tsx +136 -89
  220. package/src/Selector/optionShape.ts +64 -0
  221. package/src/Selector/selectableOptionEntries.ts +39 -0
  222. package/src/Selector/utils.ts +9 -68
  223. package/src/SideNav/SideNavItem.tsx +3 -7
  224. package/src/Switch/switchTouch.ts +2 -10
  225. package/src/Switch/useSwitchTouch.ts +26 -96
  226. package/src/Token/Token.tsx +13 -4
  227. package/src/Token/TokenNamingContext.ts +28 -0
  228. package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
  229. package/src/Tokenizer/Tokenizer.tsx +81 -86
  230. package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
  231. package/src/Tokenizer/TokenizerItemRemovableContext.ts +5 -3
  232. package/src/Tooltip/Tooltip.doc.mjs +123 -54
  233. package/src/Tooltip/Tooltip.tsx +36 -39
  234. package/src/Tooltip/index.ts +0 -1
  235. package/src/Tooltip/useTooltip.doc.mjs +147 -33
  236. package/src/Tooltip/useTooltip.tsx +39 -32
  237. package/src/TopNav/TopNavItem.tsx +6 -5
  238. package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
  239. package/src/TopNav/TopNavMenu.tsx +6 -5
  240. package/src/gestures/GestureHost.ts +73 -4
  241. package/src/hooks/actionGroupTracker.ts +12 -56
  242. package/src/hooks/useHighlightedOptionScroll.ts +123 -15
  243. package/src/hooks/useMediaQuery.doc.mjs +2 -2
  244. package/src/hooks/useMediaQuery.ts +13 -4
  245. package/src/hooks/useMenuPress.ts +8 -2
  246. package/src/i18n/generated-english/PowerSearch/PowerSearch.generated.ts +1 -0
  247. package/src/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.ts +7 -1
  248. package/src/i18n/generated-locales/en.generated.ts +1 -0
  249. package/src/i18n/generated-locales/pseudo.generated.ts +1 -0
  250. package/src/internal/SheetConfirmation.tsx +101 -0
  251. package/src/internal/sheetDraft.ts +80 -0
  252. package/src/internal/touch-sheet.ts +21 -0
  253. package/src/internal/useDismissSearchOnTouchDrag.ts +69 -0
  254. package/src/motion/MEASUREMENTS.md +7 -0
  255. package/src/motion/README.md +1 -0
  256. package/src/motion/roles.ts +20 -1
  257. package/src/motion/uikit/index.ts +5 -5
  258. package/src/motion/uikit/segmented.ts +74 -0
  259. package/src/motion/uikit/springs.ts +5 -21
  260. package/src/privateAttributes/segmentTitle.stylex.ts +22 -0
  261. package/src/utils/browserClickWait.ts +133 -0
  262. package/src/utils/clickGuard.ts +37 -1
  263. package/dist/internal/tokenizer-presentation.d.ts +0 -21
  264. package/dist/internal/tokenizer-presentation.d.ts.map +0 -1
  265. package/dist/internal/tokenizer-presentation.js +0 -21
  266. package/src/internal/tokenizer-presentation.ts +0 -25
@@ -0,0 +1,133 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file browserClickWait.ts
5
+ * @input An element a tap's lift released on, and the control that acts on
6
+ * its click
7
+ * @output BROWSER_CLICK_WAIT_MS, awaitBrowserClick, clickForLift and
8
+ * clickAndReport
9
+ * @position The one wait for the browser's click after a tap, shared by
10
+ * Switch/useSwitchTouch.ts and SegmentedControl/useSegmentedTouchTracking.ts.
11
+ * It swallows nothing: utils/clickGuard.ts is the one guard for a late click.
12
+ *
13
+ * SYNC: When modified, update browserClickWait.test.ts.
14
+ */
15
+
16
+ import {armClickGuard, withoutClickGuard} from './clickGuard';
17
+ import {subscribeInput} from './inputStream';
18
+
19
+ /**
20
+ * How long a tap's lift waits for the browser's own click, ms. The browser
21
+ * sends that click with the lift when the page has no double-tap delay. The
22
+ * wait runs out for a lift that the browser does not count as a click, such
23
+ * as a hold. It also runs out when a busy main thread holds the click back.
24
+ */
25
+ export const BROWSER_CLICK_WAIT_MS = 300;
26
+
27
+ /** What a control does when the browser's click comes, or does not. */
28
+ export interface BrowserClickWaitHandlers {
29
+ /** The browser's click ran its handlers. `isCancelled`: one cancelled it. */
30
+ readonly onClicked: (isCancelled: boolean) => void;
31
+ /** No browser click came in time. */
32
+ readonly onNoClick: () => void;
33
+ }
34
+
35
+ /**
36
+ * Waits for the browser's own click inside `target` after a tap's lift. That
37
+ * click is the activation: `onClicked` runs once its handlers have run. With
38
+ * no click in time, `onNoClick` runs. The returned call ends the wait at once
39
+ * and leaves no listener or timer behind.
40
+ */
41
+ export function awaitBrowserClick(
42
+ target: Element,
43
+ {onClicked, onNoClick}: BrowserClickWaitHandlers,
44
+ ): () => void {
45
+ const view = target.ownerDocument.defaultView;
46
+ if (view == null) {
47
+ // A document with no window gets no click: the wait runs out at once.
48
+ let isEnded = false;
49
+ queueMicrotask(() => {
50
+ if (!isEnded) {
51
+ onNoClick();
52
+ }
53
+ });
54
+ return () => {
55
+ isEnded = true;
56
+ };
57
+ }
58
+ let isDone = false;
59
+ let report: number | null = null;
60
+ let timer: number | null = null;
61
+ let stopListening: (() => void) | null = null;
62
+ const stop = () => {
63
+ isDone = true;
64
+ stopListening?.();
65
+ stopListening = null;
66
+ if (timer != null) {
67
+ view.clearTimeout(timer);
68
+ timer = null;
69
+ }
70
+ };
71
+ stopListening = subscribeInput(view, 'click', event => {
72
+ if (
73
+ isDone ||
74
+ !event.isTrusted ||
75
+ !target.contains(event.target as Node | null)
76
+ ) {
77
+ return;
78
+ }
79
+ stop();
80
+ // After every handler has run: was it cancelled?
81
+ report = view.setTimeout(() => {
82
+ report = null;
83
+ onClicked(event.defaultPrevented);
84
+ }, 0);
85
+ });
86
+ timer = view.setTimeout(() => {
87
+ if (isDone) {
88
+ return;
89
+ }
90
+ stop();
91
+ onNoClick();
92
+ }, BROWSER_CLICK_WAIT_MS);
93
+ return () => {
94
+ stop();
95
+ if (report != null) {
96
+ view.clearTimeout(report);
97
+ report = null;
98
+ }
99
+ };
100
+ }
101
+
102
+ /**
103
+ * Click `element` (its own `click()`, so its activation behavior and every
104
+ * handler run as for any click) and report whether a handler cancelled it.
105
+ * The event is read from a capture listener that exists only for the call.
106
+ */
107
+ export function clickAndReport(element: HTMLElement): boolean {
108
+ const view = element.ownerDocument.defaultView;
109
+ let clicked: Event | null = null;
110
+ const grab = (event: Event) => {
111
+ if (clicked == null && event.target === element) {
112
+ clicked = event;
113
+ }
114
+ };
115
+ view?.addEventListener('click', grab, true);
116
+ try {
117
+ element.click();
118
+ } finally {
119
+ view?.removeEventListener('click', grab, true);
120
+ }
121
+ return (clicked as Event | null)?.defaultPrevented === true;
122
+ }
123
+
124
+ /**
125
+ * Clicks `element` for a lift the control decided itself, and reports
126
+ * whether a handler cancelled the click. The shared click guard swallows the
127
+ * browser's own click for the same lift, if it comes later, so the lift
128
+ * activates once.
129
+ */
130
+ export function clickForLift(element: HTMLElement): boolean {
131
+ armClickGuard(element.ownerDocument);
132
+ return withoutClickGuard(() => clickAndReport(element));
133
+ }
@@ -26,6 +26,11 @@
26
26
  // `touchend`, aimed at whatever is under the finger by then. They go with
27
27
  // the click, the next `pointerdown` or the window, as the guard does.
28
28
  //
29
+ // The menu press model's arm at a finger's release also cancels that touch's
30
+ // `touchend`, so the browser creates no click and no compatibility mouse
31
+ // events. A busy main thread can otherwise hold that click past the window,
32
+ // when a drill-in has put another row under the finger.
33
+ //
29
34
  // Some clicks always pass:
30
35
  // - a click with `detail` 0: a keyboard's, a screen reader's, or one that the
31
36
  // page dispatches;
@@ -56,6 +61,13 @@ export interface ClickGuardOptions {
56
61
  * @default false
57
62
  */
58
63
  readonly takesLateMouse?: boolean;
64
+ /**
65
+ * The menu press model's arm at a finger's release: the guard also cancels
66
+ * that touch's `touchend`, so the browser creates no click for it. A
67
+ * cancelled `touchend` disarms the guard.
68
+ * @default false
69
+ */
70
+ readonly cancelsTouchEnd?: boolean;
59
71
  }
60
72
 
61
73
  interface Guard {
@@ -89,7 +101,11 @@ function listenForClicks(view: Window): () => void {
89
101
  /** Swallow the browser's next click on `doc` (see the file header). */
90
102
  export function armClickGuard(
91
103
  doc: Document,
92
- {staysInstalled = false, takesLateMouse = false}: ClickGuardOptions = {},
104
+ {
105
+ staysInstalled = false,
106
+ takesLateMouse = false,
107
+ cancelsTouchEnd = false,
108
+ }: ClickGuardOptions = {},
93
109
  ): void {
94
110
  const view = doc.defaultView;
95
111
  if (view == null) {
@@ -116,6 +132,26 @@ export function armClickGuard(
116
132
  );
117
133
  }
118
134
  }
135
+ if (cancelsTouchEnd) {
136
+ // A touch sends its pointerup before its touchend, so the next touchend is
137
+ // that touch's own. The next pointerdown disarms the guard first.
138
+ const stopTouchEnd = subscribeInput(
139
+ view,
140
+ 'touchend',
141
+ event => {
142
+ stopTouchEnd();
143
+ // A touchend that the browser took for a scroll is not cancelable.
144
+ // The guard stays armed for a click that may follow it.
145
+ if (event.cancelable) {
146
+ event.preventDefault();
147
+ // No click follows a cancelled touchend.
148
+ disarmClickGuard(doc);
149
+ }
150
+ },
151
+ {cancels: true},
152
+ );
153
+ guard.unsubscribers.push(stopTouchEnd);
154
+ }
119
155
  guard.timer = setTimeout(() => disarmClickGuard(doc), CLICK_GUARD_WINDOW_MS);
120
156
  }
121
157
 
@@ -1,21 +0,0 @@
1
- /**
2
- * @file tokenizer-presentation.ts
3
- * @input Tokenizer's sheet-capable signature
4
- * @output `@astryxdesign/core/internal/tokenizer-presentation`: the Tokenizer
5
- * with its `presentation` options reachable, for Astryx's own packages
6
- * @position An internal entry reserved for Astryx's own packages:
7
- * undocumented, outside the public API and its compatibility promise
8
- * (spec:AST-017 FR21), versioned in lockstep with Core, and allowed only in
9
- * Core and Lab by the `@astryx/no-core-internal-import` lint rule
10
- * (architecture:react-component-runtime INV13). The sheet presentation is
11
- * implemented but not yet exposed: the public `TokenizerProps` offers no
12
- * `experimental.presentation` while its user experience is being finished
13
- * (`component:Tokenizer` DEC-3, implementation gap), and every public field
14
- * renders the popover presentation. Named re-exports only.
15
- *
16
- * SYNC: When modified, update tokenizer-presentation.test.ts and
17
- * scripts/sync-exports.js.
18
- */
19
- export { TokenizerWithPresentation } from '../Tokenizer/Tokenizer.js';
20
- export type { TokenizerPresentationOptions, TokenizerWithPresentationProps, } from '../Tokenizer/Tokenizer.js';
21
- //# sourceMappingURL=tokenizer-presentation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenizer-presentation.d.ts","sourceRoot":"","sources":["../../src/internal/tokenizer-presentation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAC,yBAAyB,EAAC,MAAM,wBAAwB,CAAC;AACjE,YAAY,EACV,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC"}
@@ -1,21 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- /**
4
- * @file tokenizer-presentation.ts
5
- * @input Tokenizer's sheet-capable signature
6
- * @output `@astryxdesign/core/internal/tokenizer-presentation`: the Tokenizer
7
- * with its `presentation` options reachable, for Astryx's own packages
8
- * @position An internal entry reserved for Astryx's own packages:
9
- * undocumented, outside the public API and its compatibility promise
10
- * (spec:AST-017 FR21), versioned in lockstep with Core, and allowed only in
11
- * Core and Lab by the `@astryx/no-core-internal-import` lint rule
12
- * (architecture:react-component-runtime INV13). The sheet presentation is
13
- * implemented but not yet exposed: the public `TokenizerProps` offers no
14
- * `experimental.presentation` while its user experience is being finished
15
- * (`component:Tokenizer` DEC-3, implementation gap), and every public field
16
- * renders the popover presentation. Named re-exports only.
17
- *
18
- * SYNC: When modified, update tokenizer-presentation.test.ts and
19
- * scripts/sync-exports.js.
20
- */
21
- export { TokenizerWithPresentation } from "../Tokenizer/Tokenizer.js";
@@ -1,25 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- /**
4
- * @file tokenizer-presentation.ts
5
- * @input Tokenizer's sheet-capable signature
6
- * @output `@astryxdesign/core/internal/tokenizer-presentation`: the Tokenizer
7
- * with its `presentation` options reachable, for Astryx's own packages
8
- * @position An internal entry reserved for Astryx's own packages:
9
- * undocumented, outside the public API and its compatibility promise
10
- * (spec:AST-017 FR21), versioned in lockstep with Core, and allowed only in
11
- * Core and Lab by the `@astryx/no-core-internal-import` lint rule
12
- * (architecture:react-component-runtime INV13). The sheet presentation is
13
- * implemented but not yet exposed: the public `TokenizerProps` offers no
14
- * `experimental.presentation` while its user experience is being finished
15
- * (`component:Tokenizer` DEC-3, implementation gap), and every public field
16
- * renders the popover presentation. Named re-exports only.
17
- *
18
- * SYNC: When modified, update tokenizer-presentation.test.ts and
19
- * scripts/sync-exports.js.
20
- */
21
- export {TokenizerWithPresentation} from '../Tokenizer/Tokenizer';
22
- export type {
23
- TokenizerPresentationOptions,
24
- TokenizerWithPresentationProps,
25
- } from '../Tokenizer/Tokenizer';