@react-aria/interactions 3.25.5 → 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 +188 -114
  29. package/dist/usePress.main.js.map +1 -1
  30. package/dist/usePress.mjs +190 -116
  31. package/dist/usePress.module.js +190 -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 +4 -4
  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 +192 -148
  45. package/src/utils.ts +3 -7
package/dist/usePress.mjs CHANGED
@@ -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,14 +180,27 @@ 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)=>{
196
+ if (isDisabled) return;
173
197
  onClick === null || onClick === void 0 ? void 0 : onClick(e);
174
- });
175
- let triggerSyntheticClick = (0, $7mdmh$useEffectEvent)((e, target)=>{
198
+ }, [
199
+ isDisabled,
200
+ onClick
201
+ ]);
202
+ let triggerSyntheticClick = (0, $7mdmh$useCallback)((e, target)=>{
203
+ if (isDisabled) return;
176
204
  // Some third-party libraries pass in onClick instead of onPress.
177
205
  // Create a fake mouse event and trigger onClick as well.
178
206
  // This matches the browser's native activation behavior for certain elements (e.g. button).
@@ -183,7 +211,147 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
183
211
  (0, $8a9cb279dc87e130$export$c2b7abe5d61ec696)(event, target);
184
212
  onClick((0, $8a9cb279dc87e130$export$525bc4921d56d4a)(event));
185
213
  }
186
- });
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
+ ]);
187
355
  let pressProps = (0, $7mdmh$useMemo)(()=>{
188
356
  let state = ref.current;
189
357
  let pressProps = {
@@ -198,16 +366,9 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
198
366
  if (!state.isPressed && !e.repeat) {
199
367
  state.target = e.currentTarget;
200
368
  state.isPressed = true;
369
+ setIsElemKeyPressed(true);
201
370
  state.pointerType = 'keyboard';
202
371
  shouldStopPropagation = triggerPressStart(e, 'keyboard');
203
- // Focus may move before the key up event, so register the event on the document
204
- // instead of the same element where the key down event occurred. Make it capturing so that it will trigger
205
- // before stopPropagation from useKeyboard on a child element may happen and thus we can still call triggerPress for the parent element.
206
- let originalTarget = e.currentTarget;
207
- let pressUp = (e)=>{
208
- 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');
209
- };
210
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'keyup', (0, $7mdmh$chain)(pressUp, onKeyUp), true);
211
372
  }
212
373
  if (shouldStopPropagation) e.stopPropagation();
213
374
  // Keep track of the keydown events that occur while the Meta (e.g. Command) key is held.
@@ -247,37 +408,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
247
408
  }
248
409
  }
249
410
  };
250
- let onKeyUp = (e)=>{
251
- var _state_metaKeyEvents;
252
- if (state.isPressed && state.target && $f6c31cce2adf654f$var$isValidKeyboardEvent(e, state.target)) {
253
- var _state_metaKeyEvents1;
254
- if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard((0, $7mdmh$getEventTarget)(e), e.key)) e.preventDefault();
255
- let target = (0, $7mdmh$getEventTarget)(e);
256
- let wasPressed = (0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e));
257
- triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard', wasPressed);
258
- if (wasPressed) triggerSyntheticClick(e, state.target);
259
- removeAllGlobalListeners();
260
- // If a link was triggered with a key other than Enter, open the URL ourselves.
261
- // This means the link has a role override, and the default browser behavior
262
- // only applies when using the Enter key.
263
- if (e.key !== 'Enter' && $f6c31cce2adf654f$var$isHTMLAnchorLink(state.target) && (0, $7mdmh$nodeContains)(state.target, target) && !e[$f6c31cce2adf654f$var$LINK_CLICKED]) {
264
- // Store a hidden property on the event so we only trigger link click once,
265
- // even if there are multiple usePress instances attached to the element.
266
- e[$f6c31cce2adf654f$var$LINK_CLICKED] = true;
267
- (0, $7mdmh$openLink)(state.target, e, false);
268
- }
269
- state.isPressed = false;
270
- (_state_metaKeyEvents1 = state.metaKeyEvents) === null || _state_metaKeyEvents1 === void 0 ? void 0 : _state_metaKeyEvents1.delete(e.key);
271
- } else if (e.key === 'Meta' && ((_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.size)) {
272
- var _state_target;
273
- // If we recorded keydown events that occurred while the Meta key was pressed,
274
- // and those haven't received keyup events already, fire keyup events ourselves.
275
- // See comment above for more info about the macOS bug causing this.
276
- let events = state.metaKeyEvents;
277
- state.metaKeyEvents = undefined;
278
- for (let event of events.values())(_state_target = state.target) === null || _state_target === void 0 ? void 0 : _state_target.dispatchEvent(new KeyboardEvent('keyup', event));
279
- }
280
- };
281
411
  if (typeof PointerEvent !== 'undefined') {
282
412
  pressProps.onPointerDown = (e)=>{
283
413
  // Only handle left clicks, and ignore events that bubbled through portals.
@@ -294,6 +424,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
294
424
  let shouldStopPropagation = true;
295
425
  if (!state.isPressed) {
296
426
  state.isPressed = true;
427
+ setIsPointerPressed('pointer');
297
428
  state.isOverTarget = true;
298
429
  state.activePointerId = e.pointerId;
299
430
  state.target = e.currentTarget;
@@ -303,8 +434,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
303
434
  // This enables onPointerLeave and onPointerEnter to fire.
304
435
  let target = (0, $7mdmh$getEventTarget)(e.nativeEvent);
305
436
  if ('releasePointerCapture' in target) target.releasePointerCapture(e.pointerId);
306
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'pointerup', onPointerUp, false);
307
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'pointercancel', onPointerCancel, false);
308
437
  }
309
438
  if (shouldStopPropagation) e.stopPropagation();
310
439
  };
@@ -337,41 +466,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
337
466
  cancelOnPointerExit(e);
338
467
  }
339
468
  };
340
- let onPointerUp = (e)=>{
341
- if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
342
- if ((0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e)) && state.pointerType != null) {
343
- // Wait for onClick to fire onPress. This avoids browser issues when the DOM
344
- // is mutated between onPointerUp and onClick, and is more compatible with third party libraries.
345
- // https://github.com/adobe/react-spectrum/issues/1513
346
- // https://issues.chromium.org/issues/40732224
347
- // However, iOS and Android do not focus or fire onClick after a long press.
348
- // We work around this by triggering a click ourselves after a timeout.
349
- // This timeout is canceled during the click event in case the real one fires first.
350
- // The timeout must be at least 32ms, because Safari on iOS delays the click event on
351
- // non-form elements without certain ARIA roles (for hover emulation).
352
- // https://github.com/WebKit/WebKit/blob/dccfae42bb29bd4bdef052e469f604a9387241c0/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm#L875-L892
353
- let clicked = false;
354
- let timeout = setTimeout(()=>{
355
- if (state.isPressed && state.target instanceof HTMLElement) {
356
- if (clicked) cancel(e);
357
- else {
358
- (0, $7mdmh$focusWithoutScrolling)(state.target);
359
- state.target.click();
360
- }
361
- }
362
- }, 80);
363
- // Use a capturing listener to track if a click occurred.
364
- // If stopPropagation is called it may never reach our handler.
365
- addGlobalListener(e.currentTarget, 'click', ()=>clicked = true, true);
366
- state.disposables.push(()=>clearTimeout(timeout));
367
- } else cancel(e);
368
- // Ignore subsequent onPointerLeave event before onClick on touch devices.
369
- state.isOverTarget = false;
370
- }
371
- };
372
- let onPointerCancel = (e)=>{
373
- cancel(e);
374
- };
375
469
  pressProps.onDragStart = (e)=>{
376
470
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
377
471
  // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.
@@ -388,6 +482,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
388
482
  return;
389
483
  }
390
484
  state.isPressed = true;
485
+ setIsPointerPressed('mouse');
391
486
  state.isOverTarget = true;
392
487
  state.target = e.currentTarget;
393
488
  state.pointerType = (0, $7mdmh$isVirtualClick)(e.nativeEvent) ? 'virtual' : 'mouse';
@@ -398,7 +493,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
398
493
  let dispose = (0, $8a9cb279dc87e130$export$cabe61c495ee3649)(e.target);
399
494
  if (dispose) state.disposables.push(dispose);
400
495
  }
401
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'mouseup', onMouseUp, false);
402
496
  };
403
497
  pressProps.onMouseEnter = (e)=>{
404
498
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
@@ -423,17 +517,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
423
517
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
424
518
  if (!state.ignoreEmulatedMouseEvents && e.button === 0 && !state.isPressed) triggerPressUp(e, state.pointerType || 'mouse');
425
519
  };
426
- let onMouseUp = (e)=>{
427
- // Only handle left clicks
428
- if (e.button !== 0) return;
429
- if (state.ignoreEmulatedMouseEvents) {
430
- state.ignoreEmulatedMouseEvents = false;
431
- return;
432
- }
433
- if (state.target && state.target.contains(e.target) && state.pointerType != null) ;
434
- else cancel(e);
435
- state.isOverTarget = false;
436
- };
437
520
  pressProps.onTouchStart = (e)=>{
438
521
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
439
522
  let touch = $f6c31cce2adf654f$var$getTouchFromEvent(e.nativeEvent);
@@ -442,12 +525,12 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
442
525
  state.ignoreEmulatedMouseEvents = true;
443
526
  state.isOverTarget = true;
444
527
  state.isPressed = true;
528
+ setIsPointerPressed('touch');
445
529
  state.target = e.currentTarget;
446
530
  state.pointerType = 'touch';
447
531
  if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$16a4697467175487)(state.target);
448
532
  let shouldStopPropagation = triggerPressStart($f6c31cce2adf654f$var$createTouchEvent(state.target, e), state.pointerType);
449
533
  if (shouldStopPropagation) e.stopPropagation();
450
- addGlobalListener((0, $7mdmh$getOwnerWindow)(e.currentTarget), 'scroll', onScroll, true);
451
534
  };
452
535
  pressProps.onTouchMove = (e)=>{
453
536
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
@@ -484,6 +567,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
484
567
  } else if (state.isOverTarget && state.pointerType != null) shouldStopPropagation = triggerPressEnd($f6c31cce2adf654f$var$createTouchEvent(state.target, e), state.pointerType, false);
485
568
  if (shouldStopPropagation) e.stopPropagation();
486
569
  state.isPressed = false;
570
+ setIsPointerPressed(null);
487
571
  state.activePointerId = null;
488
572
  state.isOverTarget = false;
489
573
  state.ignoreEmulatedMouseEvents = true;
@@ -495,15 +579,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
495
579
  e.stopPropagation();
496
580
  if (state.isPressed) cancel($f6c31cce2adf654f$var$createTouchEvent(state.target, e));
497
581
  };
498
- let onScroll = (e)=>{
499
- if (state.isPressed && (0, $7mdmh$nodeContains)((0, $7mdmh$getEventTarget)(e), state.target)) cancel({
500
- currentTarget: state.target,
501
- shiftKey: false,
502
- ctrlKey: false,
503
- metaKey: false,
504
- altKey: false
505
- });
506
- };
507
582
  pressProps.onDragStart = (e)=>{
508
583
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
509
584
  cancel(e);
@@ -511,7 +586,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
511
586
  }
512
587
  return pressProps;
513
588
  }, [
514
- addGlobalListener,
515
589
  isDisabled,
516
590
  preventFocusOnPress,
517
591
  removeAllGlobalListeners,