@react-aria/interactions 3.25.6 → 3.26.0

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 (45) hide show
  1. package/dist/focusSafely.main.js +4 -4
  2. package/dist/focusSafely.main.js.map +1 -1
  3. package/dist/focusSafely.mjs +4 -4
  4. package/dist/focusSafely.module.js +4 -4
  5. package/dist/focusSafely.module.js.map +1 -1
  6. package/dist/import.mjs +2 -2
  7. package/dist/main.js +1 -0
  8. package/dist/main.js.map +1 -1
  9. package/dist/module.js +2 -2
  10. package/dist/module.js.map +1 -1
  11. package/dist/types.d.ts +3 -1
  12. package/dist/types.d.ts.map +1 -1
  13. package/dist/useFocusVisible.main.js +12 -2
  14. package/dist/useFocusVisible.main.js.map +1 -1
  15. package/dist/useFocusVisible.mjs +13 -4
  16. package/dist/useFocusVisible.module.js +13 -4
  17. package/dist/useFocusVisible.module.js.map +1 -1
  18. package/dist/useInteractOutside.main.js +1 -3
  19. package/dist/useInteractOutside.main.js.map +1 -1
  20. package/dist/useInteractOutside.mjs +1 -3
  21. package/dist/useInteractOutside.module.js +1 -3
  22. package/dist/useInteractOutside.module.js.map +1 -1
  23. package/dist/useMove.main.js +110 -74
  24. package/dist/useMove.main.js.map +1 -1
  25. package/dist/useMove.mjs +112 -76
  26. package/dist/useMove.module.js +112 -76
  27. package/dist/useMove.module.js.map +1 -1
  28. package/dist/usePress.main.js +186 -114
  29. package/dist/usePress.main.js.map +1 -1
  30. package/dist/usePress.mjs +188 -116
  31. package/dist/usePress.module.js +188 -116
  32. package/dist/usePress.module.js.map +1 -1
  33. package/dist/utils.main.js +2 -5
  34. package/dist/utils.main.js.map +1 -1
  35. package/dist/utils.mjs +3 -6
  36. package/dist/utils.module.js +3 -6
  37. package/dist/utils.module.js.map +1 -1
  38. package/package.json +3 -3
  39. package/src/focusSafely.ts +4 -4
  40. package/src/index.ts +1 -0
  41. package/src/useFocusVisible.ts +15 -3
  42. package/src/useInteractOutside.ts +1 -1
  43. package/src/useMove.ts +85 -57
  44. package/src/usePress.ts +183 -147
  45. package/src/utils.ts +3 -7
@@ -4,9 +4,9 @@ import {PressResponderContext as $ae1eeba8b9eafd08$export$5165eccb35aaadb5} from
4
4
  import {_ as $7mdmh$_} from "@swc/helpers/_/_class_private_field_get";
5
5
  import {_ as $7mdmh$_1} from "@swc/helpers/_/_class_private_field_init";
6
6
  import {_ as $7mdmh$_2} from "@swc/helpers/_/_class_private_field_set";
7
- import {mergeProps as $7mdmh$mergeProps, useSyncRef as $7mdmh$useSyncRef, useGlobalListeners as $7mdmh$useGlobalListeners, useEffectEvent as $7mdmh$useEffectEvent, nodeContains as $7mdmh$nodeContains, getEventTarget as $7mdmh$getEventTarget, getOwnerDocument as $7mdmh$getOwnerDocument, chain as $7mdmh$chain, isMac as $7mdmh$isMac, openLink as $7mdmh$openLink, isVirtualClick as $7mdmh$isVirtualClick, isVirtualPointerEvent as $7mdmh$isVirtualPointerEvent, focusWithoutScrolling as $7mdmh$focusWithoutScrolling, getOwnerWindow as $7mdmh$getOwnerWindow} from "@react-aria/utils";
7
+ import {mergeProps as $7mdmh$mergeProps, useSyncRef as $7mdmh$useSyncRef, useGlobalListeners as $7mdmh$useGlobalListeners, useEffectEvent as $7mdmh$useEffectEvent, useLayoutEffect as $7mdmh$useLayoutEffect, getEventTarget as $7mdmh$getEventTarget, nodeContains as $7mdmh$nodeContains, openLink as $7mdmh$openLink, chain as $7mdmh$chain, getOwnerDocument as $7mdmh$getOwnerDocument, focusWithoutScrolling as $7mdmh$focusWithoutScrolling, getOwnerWindow as $7mdmh$getOwnerWindow, isMac as $7mdmh$isMac, isVirtualClick as $7mdmh$isVirtualClick, isVirtualPointerEvent as $7mdmh$isVirtualPointerEvent} from "@react-aria/utils";
8
8
  import {flushSync as $7mdmh$flushSync} from "react-dom";
9
- import {useContext as $7mdmh$useContext, useState as $7mdmh$useState, useRef as $7mdmh$useRef, useMemo as $7mdmh$useMemo, useEffect as $7mdmh$useEffect} from "react";
9
+ import {useContext as $7mdmh$useContext, useState as $7mdmh$useState, useRef as $7mdmh$useRef, useCallback as $7mdmh$useCallback, useMemo as $7mdmh$useMemo, useEffect as $7mdmh$useEffect} from "react";
10
10
 
11
11
  /*
12
12
  * Copyright 2020 Adobe. All rights reserved.
@@ -102,8 +102,8 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
102
102
  pointerType: null,
103
103
  disposables: []
104
104
  });
105
- let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners } = (0, $7mdmh$useGlobalListeners)();
106
- let triggerPressStart = (0, $7mdmh$useEffectEvent)((originalEvent, pointerType)=>{
105
+ let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners, removeGlobalListener: removeGlobalListener } = (0, $7mdmh$useGlobalListeners)();
106
+ let triggerPressStart = (0, $7mdmh$useCallback)((originalEvent, pointerType)=>{
107
107
  let state = ref.current;
108
108
  if (isDisabled || state.didFirePressStart) return false;
109
109
  let shouldStopPropagation = true;
@@ -118,8 +118,12 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
118
118
  state.didFirePressStart = true;
119
119
  setPressed(true);
120
120
  return shouldStopPropagation;
121
- });
122
- let triggerPressEnd = (0, $7mdmh$useEffectEvent)((originalEvent, pointerType, wasPressed = true)=>{
121
+ }, [
122
+ isDisabled,
123
+ onPressStart,
124
+ onPressChange
125
+ ]);
126
+ let triggerPressEnd = (0, $7mdmh$useCallback)((originalEvent, pointerType, wasPressed = true)=>{
123
127
  let state = ref.current;
124
128
  if (!state.didFirePressStart) return false;
125
129
  state.didFirePressStart = false;
@@ -139,8 +143,14 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
139
143
  }
140
144
  state.isTriggeringEvent = false;
141
145
  return shouldStopPropagation;
142
- });
143
- let triggerPressUp = (0, $7mdmh$useEffectEvent)((originalEvent, pointerType)=>{
146
+ }, [
147
+ isDisabled,
148
+ onPressEnd,
149
+ onPressChange,
150
+ onPress
151
+ ]);
152
+ let triggerPressEndEvent = (0, $7mdmh$useEffectEvent)(triggerPressEnd);
153
+ let triggerPressUp = (0, $7mdmh$useCallback)((originalEvent, pointerType)=>{
144
154
  let state = ref.current;
145
155
  if (isDisabled) return false;
146
156
  if (onPressUp) {
@@ -151,12 +161,17 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
151
161
  return event.shouldStopPropagation;
152
162
  }
153
163
  return true;
154
- });
155
- let cancel = (0, $7mdmh$useEffectEvent)((e)=>{
164
+ }, [
165
+ isDisabled,
166
+ onPressUp
167
+ ]);
168
+ let triggerPressUpEvent = (0, $7mdmh$useEffectEvent)(triggerPressUp);
169
+ let cancel = (0, $7mdmh$useCallback)((e)=>{
156
170
  let state = ref.current;
157
171
  if (state.isPressed && state.target) {
158
172
  if (state.didFirePressStart && state.pointerType != null) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);
159
173
  state.isPressed = false;
174
+ setIsPointerPressed(null);
160
175
  state.isOverTarget = false;
161
176
  state.activePointerId = null;
162
177
  state.pointerType = null;
@@ -165,15 +180,26 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
165
180
  for (let dispose of state.disposables)dispose();
166
181
  state.disposables = [];
167
182
  }
168
- });
169
- let cancelOnPointerExit = (0, $7mdmh$useEffectEvent)((e)=>{
183
+ }, [
184
+ allowTextSelectionOnPress,
185
+ removeAllGlobalListeners,
186
+ triggerPressEnd
187
+ ]);
188
+ let cancelEvent = (0, $7mdmh$useEffectEvent)(cancel);
189
+ let cancelOnPointerExit = (0, $7mdmh$useCallback)((e)=>{
170
190
  if (shouldCancelOnPointerExit) cancel(e);
171
- });
172
- let triggerClick = (0, $7mdmh$useEffectEvent)((e)=>{
191
+ }, [
192
+ shouldCancelOnPointerExit,
193
+ cancel
194
+ ]);
195
+ let triggerClick = (0, $7mdmh$useCallback)((e)=>{
173
196
  if (isDisabled) return;
174
197
  onClick === null || onClick === void 0 ? void 0 : onClick(e);
175
- });
176
- let triggerSyntheticClick = (0, $7mdmh$useEffectEvent)((e, target)=>{
198
+ }, [
199
+ isDisabled,
200
+ onClick
201
+ ]);
202
+ let triggerSyntheticClick = (0, $7mdmh$useCallback)((e, target)=>{
177
203
  if (isDisabled) return;
178
204
  // Some third-party libraries pass in onClick instead of onPress.
179
205
  // Create a fake mouse event and trigger onClick as well.
@@ -185,7 +211,147 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
185
211
  (0, $8a9cb279dc87e130$export$c2b7abe5d61ec696)(event, target);
186
212
  onClick((0, $8a9cb279dc87e130$export$525bc4921d56d4a)(event));
187
213
  }
188
- });
214
+ }, [
215
+ isDisabled,
216
+ onClick
217
+ ]);
218
+ let triggerSyntheticClickEvent = (0, $7mdmh$useEffectEvent)(triggerSyntheticClick);
219
+ let [isElemKeyPressed, setIsElemKeyPressed] = (0, $7mdmh$useState)(false);
220
+ (0, $7mdmh$useLayoutEffect)(()=>{
221
+ let state = ref.current;
222
+ if (isElemKeyPressed) {
223
+ let onKeyUp = (e)=>{
224
+ var _state_metaKeyEvents;
225
+ if (state.isPressed && state.target && $f6c31cce2adf654f$var$isValidKeyboardEvent(e, state.target)) {
226
+ var _state_metaKeyEvents1;
227
+ if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard((0, $7mdmh$getEventTarget)(e), e.key)) e.preventDefault();
228
+ let target = (0, $7mdmh$getEventTarget)(e);
229
+ let wasPressed = (0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e));
230
+ triggerPressEndEvent($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard', wasPressed);
231
+ if (wasPressed) triggerSyntheticClickEvent(e, state.target);
232
+ removeAllGlobalListeners();
233
+ // If a link was triggered with a key other than Enter, open the URL ourselves.
234
+ // This means the link has a role override, and the default browser behavior
235
+ // only applies when using the Enter key.
236
+ if (e.key !== 'Enter' && $f6c31cce2adf654f$var$isHTMLAnchorLink(state.target) && (0, $7mdmh$nodeContains)(state.target, target) && !e[$f6c31cce2adf654f$var$LINK_CLICKED]) {
237
+ // Store a hidden property on the event so we only trigger link click once,
238
+ // even if there are multiple usePress instances attached to the element.
239
+ e[$f6c31cce2adf654f$var$LINK_CLICKED] = true;
240
+ (0, $7mdmh$openLink)(state.target, e, false);
241
+ }
242
+ state.isPressed = false;
243
+ setIsElemKeyPressed(false);
244
+ (_state_metaKeyEvents1 = state.metaKeyEvents) === null || _state_metaKeyEvents1 === void 0 ? void 0 : _state_metaKeyEvents1.delete(e.key);
245
+ } else if (e.key === 'Meta' && ((_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.size)) {
246
+ var _state_target;
247
+ // If we recorded keydown events that occurred while the Meta key was pressed,
248
+ // and those haven't received keyup events already, fire keyup events ourselves.
249
+ // See comment above for more info about the macOS bug causing this.
250
+ let events = state.metaKeyEvents;
251
+ state.metaKeyEvents = undefined;
252
+ for (let event of events.values())(_state_target = state.target) === null || _state_target === void 0 ? void 0 : _state_target.dispatchEvent(new KeyboardEvent('keyup', event));
253
+ }
254
+ };
255
+ // Focus may move before the key up event, so register the event on the document
256
+ // instead of the same element where the key down event occurred. Make it capturing so that it will trigger
257
+ // before stopPropagation from useKeyboard on a child element may happen and thus we can still call triggerPress for the parent element.
258
+ let originalTarget = state.target;
259
+ let pressUp = (e)=>{
260
+ if (originalTarget && $f6c31cce2adf654f$var$isValidKeyboardEvent(e, originalTarget) && !e.repeat && (0, $7mdmh$nodeContains)(originalTarget, (0, $7mdmh$getEventTarget)(e)) && state.target) triggerPressUpEvent($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard');
261
+ };
262
+ let listener = (0, $7mdmh$chain)(pressUp, onKeyUp);
263
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'keyup', listener, true);
264
+ return ()=>{
265
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'keyup', listener, true);
266
+ };
267
+ }
268
+ }, [
269
+ isElemKeyPressed,
270
+ addGlobalListener,
271
+ removeAllGlobalListeners,
272
+ removeGlobalListener
273
+ ]);
274
+ let [isPointerPressed, setIsPointerPressed] = (0, $7mdmh$useState)(null);
275
+ (0, $7mdmh$useLayoutEffect)(()=>{
276
+ let state = ref.current;
277
+ if (isPointerPressed === 'pointer') {
278
+ let onPointerUp = (e)=>{
279
+ if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
280
+ if ((0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e)) && state.pointerType != null) {
281
+ // Wait for onClick to fire onPress. This avoids browser issues when the DOM
282
+ // is mutated between onPointerUp and onClick, and is more compatible with third party libraries.
283
+ // https://github.com/adobe/react-spectrum/issues/1513
284
+ // https://issues.chromium.org/issues/40732224
285
+ // However, iOS and Android do not focus or fire onClick after a long press.
286
+ // We work around this by triggering a click ourselves after a timeout.
287
+ // This timeout is canceled during the click event in case the real one fires first.
288
+ // The timeout must be at least 32ms, because Safari on iOS delays the click event on
289
+ // non-form elements without certain ARIA roles (for hover emulation).
290
+ // https://github.com/WebKit/WebKit/blob/dccfae42bb29bd4bdef052e469f604a9387241c0/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm#L875-L892
291
+ let clicked = false;
292
+ let timeout = setTimeout(()=>{
293
+ if (state.isPressed && state.target instanceof HTMLElement) {
294
+ if (clicked) cancelEvent(e);
295
+ else {
296
+ (0, $7mdmh$focusWithoutScrolling)(state.target);
297
+ state.target.click();
298
+ }
299
+ }
300
+ }, 80);
301
+ // Use a capturing listener to track if a click occurred.
302
+ // If stopPropagation is called it may never reach our handler.
303
+ addGlobalListener(e.currentTarget, 'click', ()=>clicked = true, true);
304
+ state.disposables.push(()=>clearTimeout(timeout));
305
+ } else cancelEvent(e);
306
+ // Ignore subsequent onPointerLeave event before onClick on touch devices.
307
+ state.isOverTarget = false;
308
+ }
309
+ };
310
+ let onPointerCancel = (e)=>{
311
+ cancelEvent(e);
312
+ };
313
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointerup', onPointerUp, false);
314
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointercancel', onPointerCancel, false);
315
+ return ()=>{
316
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointerup', onPointerUp, false);
317
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointercancel', onPointerCancel, false);
318
+ };
319
+ } else if (isPointerPressed === 'mouse' && process.env.NODE_ENV === 'test') {
320
+ let onMouseUp = (e)=>{
321
+ // Only handle left clicks
322
+ if (e.button !== 0) return;
323
+ if (state.ignoreEmulatedMouseEvents) {
324
+ state.ignoreEmulatedMouseEvents = false;
325
+ return;
326
+ }
327
+ if (state.target && state.target.contains(e.target) && state.pointerType != null) ;
328
+ else cancelEvent(e);
329
+ state.isOverTarget = false;
330
+ };
331
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'mouseup', onMouseUp, false);
332
+ return ()=>{
333
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'mouseup', onMouseUp, false);
334
+ };
335
+ } else if (isPointerPressed === 'touch' && process.env.NODE_ENV === 'test') {
336
+ let onScroll = (e)=>{
337
+ if (state.isPressed && (0, $7mdmh$nodeContains)((0, $7mdmh$getEventTarget)(e), state.target)) cancelEvent({
338
+ currentTarget: state.target,
339
+ shiftKey: false,
340
+ ctrlKey: false,
341
+ metaKey: false,
342
+ altKey: false
343
+ });
344
+ };
345
+ addGlobalListener((0, $7mdmh$getOwnerWindow)(state.target), 'scroll', onScroll, true);
346
+ return ()=>{
347
+ removeGlobalListener((0, $7mdmh$getOwnerWindow)(state.target), 'scroll', onScroll, true);
348
+ };
349
+ }
350
+ }, [
351
+ isPointerPressed,
352
+ addGlobalListener,
353
+ removeGlobalListener
354
+ ]);
189
355
  let pressProps = (0, $7mdmh$useMemo)(()=>{
190
356
  let state = ref.current;
191
357
  let pressProps = {
@@ -200,16 +366,9 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
200
366
  if (!state.isPressed && !e.repeat) {
201
367
  state.target = e.currentTarget;
202
368
  state.isPressed = true;
369
+ setIsElemKeyPressed(true);
203
370
  state.pointerType = 'keyboard';
204
371
  shouldStopPropagation = triggerPressStart(e, 'keyboard');
205
- // Focus may move before the key up event, so register the event on the document
206
- // instead of the same element where the key down event occurred. Make it capturing so that it will trigger
207
- // before stopPropagation from useKeyboard on a child element may happen and thus we can still call triggerPress for the parent element.
208
- let originalTarget = e.currentTarget;
209
- let pressUp = (e)=>{
210
- if ($f6c31cce2adf654f$var$isValidKeyboardEvent(e, originalTarget) && !e.repeat && (0, $7mdmh$nodeContains)(originalTarget, (0, $7mdmh$getEventTarget)(e)) && state.target) triggerPressUp($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard');
211
- };
212
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'keyup', (0, $7mdmh$chain)(pressUp, onKeyUp), true);
213
372
  }
214
373
  if (shouldStopPropagation) e.stopPropagation();
215
374
  // Keep track of the keydown events that occur while the Meta (e.g. Command) key is held.
@@ -249,37 +408,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
249
408
  }
250
409
  }
251
410
  };
252
- let onKeyUp = (e)=>{
253
- var _state_metaKeyEvents;
254
- if (state.isPressed && state.target && $f6c31cce2adf654f$var$isValidKeyboardEvent(e, state.target)) {
255
- var _state_metaKeyEvents1;
256
- if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard((0, $7mdmh$getEventTarget)(e), e.key)) e.preventDefault();
257
- let target = (0, $7mdmh$getEventTarget)(e);
258
- let wasPressed = (0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e));
259
- triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard', wasPressed);
260
- if (wasPressed) triggerSyntheticClick(e, state.target);
261
- removeAllGlobalListeners();
262
- // If a link was triggered with a key other than Enter, open the URL ourselves.
263
- // This means the link has a role override, and the default browser behavior
264
- // only applies when using the Enter key.
265
- if (e.key !== 'Enter' && $f6c31cce2adf654f$var$isHTMLAnchorLink(state.target) && (0, $7mdmh$nodeContains)(state.target, target) && !e[$f6c31cce2adf654f$var$LINK_CLICKED]) {
266
- // Store a hidden property on the event so we only trigger link click once,
267
- // even if there are multiple usePress instances attached to the element.
268
- e[$f6c31cce2adf654f$var$LINK_CLICKED] = true;
269
- (0, $7mdmh$openLink)(state.target, e, false);
270
- }
271
- state.isPressed = false;
272
- (_state_metaKeyEvents1 = state.metaKeyEvents) === null || _state_metaKeyEvents1 === void 0 ? void 0 : _state_metaKeyEvents1.delete(e.key);
273
- } else if (e.key === 'Meta' && ((_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.size)) {
274
- var _state_target;
275
- // If we recorded keydown events that occurred while the Meta key was pressed,
276
- // and those haven't received keyup events already, fire keyup events ourselves.
277
- // See comment above for more info about the macOS bug causing this.
278
- let events = state.metaKeyEvents;
279
- state.metaKeyEvents = undefined;
280
- for (let event of events.values())(_state_target = state.target) === null || _state_target === void 0 ? void 0 : _state_target.dispatchEvent(new KeyboardEvent('keyup', event));
281
- }
282
- };
283
411
  if (typeof PointerEvent !== 'undefined') {
284
412
  pressProps.onPointerDown = (e)=>{
285
413
  // Only handle left clicks, and ignore events that bubbled through portals.
@@ -296,6 +424,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
296
424
  let shouldStopPropagation = true;
297
425
  if (!state.isPressed) {
298
426
  state.isPressed = true;
427
+ setIsPointerPressed('pointer');
299
428
  state.isOverTarget = true;
300
429
  state.activePointerId = e.pointerId;
301
430
  state.target = e.currentTarget;
@@ -305,8 +434,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
305
434
  // This enables onPointerLeave and onPointerEnter to fire.
306
435
  let target = (0, $7mdmh$getEventTarget)(e.nativeEvent);
307
436
  if ('releasePointerCapture' in target) target.releasePointerCapture(e.pointerId);
308
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'pointerup', onPointerUp, false);
309
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'pointercancel', onPointerCancel, false);
310
437
  }
311
438
  if (shouldStopPropagation) e.stopPropagation();
312
439
  };
@@ -339,41 +466,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
339
466
  cancelOnPointerExit(e);
340
467
  }
341
468
  };
342
- let onPointerUp = (e)=>{
343
- if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
344
- if ((0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e)) && state.pointerType != null) {
345
- // Wait for onClick to fire onPress. This avoids browser issues when the DOM
346
- // is mutated between onPointerUp and onClick, and is more compatible with third party libraries.
347
- // https://github.com/adobe/react-spectrum/issues/1513
348
- // https://issues.chromium.org/issues/40732224
349
- // However, iOS and Android do not focus or fire onClick after a long press.
350
- // We work around this by triggering a click ourselves after a timeout.
351
- // This timeout is canceled during the click event in case the real one fires first.
352
- // The timeout must be at least 32ms, because Safari on iOS delays the click event on
353
- // non-form elements without certain ARIA roles (for hover emulation).
354
- // https://github.com/WebKit/WebKit/blob/dccfae42bb29bd4bdef052e469f604a9387241c0/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm#L875-L892
355
- let clicked = false;
356
- let timeout = setTimeout(()=>{
357
- if (state.isPressed && state.target instanceof HTMLElement) {
358
- if (clicked) cancel(e);
359
- else {
360
- (0, $7mdmh$focusWithoutScrolling)(state.target);
361
- state.target.click();
362
- }
363
- }
364
- }, 80);
365
- // Use a capturing listener to track if a click occurred.
366
- // If stopPropagation is called it may never reach our handler.
367
- addGlobalListener(e.currentTarget, 'click', ()=>clicked = true, true);
368
- state.disposables.push(()=>clearTimeout(timeout));
369
- } else cancel(e);
370
- // Ignore subsequent onPointerLeave event before onClick on touch devices.
371
- state.isOverTarget = false;
372
- }
373
- };
374
- let onPointerCancel = (e)=>{
375
- cancel(e);
376
- };
377
469
  pressProps.onDragStart = (e)=>{
378
470
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
379
471
  // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.
@@ -390,6 +482,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
390
482
  return;
391
483
  }
392
484
  state.isPressed = true;
485
+ setIsPointerPressed('mouse');
393
486
  state.isOverTarget = true;
394
487
  state.target = e.currentTarget;
395
488
  state.pointerType = (0, $7mdmh$isVirtualClick)(e.nativeEvent) ? 'virtual' : 'mouse';
@@ -400,7 +493,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
400
493
  let dispose = (0, $8a9cb279dc87e130$export$cabe61c495ee3649)(e.target);
401
494
  if (dispose) state.disposables.push(dispose);
402
495
  }
403
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'mouseup', onMouseUp, false);
404
496
  };
405
497
  pressProps.onMouseEnter = (e)=>{
406
498
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
@@ -425,17 +517,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
425
517
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
426
518
  if (!state.ignoreEmulatedMouseEvents && e.button === 0 && !state.isPressed) triggerPressUp(e, state.pointerType || 'mouse');
427
519
  };
428
- let onMouseUp = (e)=>{
429
- // Only handle left clicks
430
- if (e.button !== 0) return;
431
- if (state.ignoreEmulatedMouseEvents) {
432
- state.ignoreEmulatedMouseEvents = false;
433
- return;
434
- }
435
- if (state.target && state.target.contains(e.target) && state.pointerType != null) ;
436
- else cancel(e);
437
- state.isOverTarget = false;
438
- };
439
520
  pressProps.onTouchStart = (e)=>{
440
521
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
441
522
  let touch = $f6c31cce2adf654f$var$getTouchFromEvent(e.nativeEvent);
@@ -444,12 +525,12 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
444
525
  state.ignoreEmulatedMouseEvents = true;
445
526
  state.isOverTarget = true;
446
527
  state.isPressed = true;
528
+ setIsPointerPressed('touch');
447
529
  state.target = e.currentTarget;
448
530
  state.pointerType = 'touch';
449
531
  if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$16a4697467175487)(state.target);
450
532
  let shouldStopPropagation = triggerPressStart($f6c31cce2adf654f$var$createTouchEvent(state.target, e), state.pointerType);
451
533
  if (shouldStopPropagation) e.stopPropagation();
452
- addGlobalListener((0, $7mdmh$getOwnerWindow)(e.currentTarget), 'scroll', onScroll, true);
453
534
  };
454
535
  pressProps.onTouchMove = (e)=>{
455
536
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
@@ -486,6 +567,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
486
567
  } else if (state.isOverTarget && state.pointerType != null) shouldStopPropagation = triggerPressEnd($f6c31cce2adf654f$var$createTouchEvent(state.target, e), state.pointerType, false);
487
568
  if (shouldStopPropagation) e.stopPropagation();
488
569
  state.isPressed = false;
570
+ setIsPointerPressed(null);
489
571
  state.activePointerId = null;
490
572
  state.isOverTarget = false;
491
573
  state.ignoreEmulatedMouseEvents = true;
@@ -497,15 +579,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
497
579
  e.stopPropagation();
498
580
  if (state.isPressed) cancel($f6c31cce2adf654f$var$createTouchEvent(state.target, e));
499
581
  };
500
- let onScroll = (e)=>{
501
- if (state.isPressed && (0, $7mdmh$nodeContains)((0, $7mdmh$getEventTarget)(e), state.target)) cancel({
502
- currentTarget: state.target,
503
- shiftKey: false,
504
- ctrlKey: false,
505
- metaKey: false,
506
- altKey: false
507
- });
508
- };
509
582
  pressProps.onDragStart = (e)=>{
510
583
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
511
584
  cancel(e);
@@ -513,7 +586,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
513
586
  }
514
587
  return pressProps;
515
588
  }, [
516
- addGlobalListener,
517
589
  isDisabled,
518
590
  preventFocusOnPress,
519
591
  removeAllGlobalListeners,