@react-aria/interactions 3.25.6 → 3.27.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 (63) hide show
  1. package/dist/PressResponder.main.js +2 -3
  2. package/dist/PressResponder.main.js.map +1 -1
  3. package/dist/PressResponder.mjs +3 -4
  4. package/dist/PressResponder.module.js +3 -4
  5. package/dist/PressResponder.module.js.map +1 -1
  6. package/dist/focusSafely.main.js +4 -4
  7. package/dist/focusSafely.main.js.map +1 -1
  8. package/dist/focusSafely.mjs +4 -4
  9. package/dist/focusSafely.module.js +4 -4
  10. package/dist/focusSafely.module.js.map +1 -1
  11. package/dist/import.mjs +2 -2
  12. package/dist/main.js +1 -0
  13. package/dist/main.js.map +1 -1
  14. package/dist/module.js +2 -2
  15. package/dist/module.js.map +1 -1
  16. package/dist/types.d.ts +4 -1
  17. package/dist/types.d.ts.map +1 -1
  18. package/dist/useFocusVisible.main.js +19 -8
  19. package/dist/useFocusVisible.main.js.map +1 -1
  20. package/dist/useFocusVisible.mjs +20 -10
  21. package/dist/useFocusVisible.module.js +20 -10
  22. package/dist/useFocusVisible.module.js.map +1 -1
  23. package/dist/useFocusWithin.main.js +3 -3
  24. package/dist/useFocusWithin.main.js.map +1 -1
  25. package/dist/useFocusWithin.mjs +4 -4
  26. package/dist/useFocusWithin.module.js +4 -4
  27. package/dist/useFocusWithin.module.js.map +1 -1
  28. package/dist/useHover.main.js +3 -3
  29. package/dist/useHover.main.js.map +1 -1
  30. package/dist/useHover.mjs +4 -4
  31. package/dist/useHover.module.js +4 -4
  32. package/dist/useHover.module.js.map +1 -1
  33. package/dist/useInteractOutside.main.js +2 -4
  34. package/dist/useInteractOutside.main.js.map +1 -1
  35. package/dist/useInteractOutside.mjs +3 -5
  36. package/dist/useInteractOutside.module.js +3 -5
  37. package/dist/useInteractOutside.module.js.map +1 -1
  38. package/dist/useMove.main.js +110 -74
  39. package/dist/useMove.main.js.map +1 -1
  40. package/dist/useMove.mjs +112 -76
  41. package/dist/useMove.module.js +112 -76
  42. package/dist/useMove.module.js.map +1 -1
  43. package/dist/usePress.main.js +197 -117
  44. package/dist/usePress.main.js.map +1 -1
  45. package/dist/usePress.mjs +199 -119
  46. package/dist/usePress.module.js +199 -119
  47. package/dist/usePress.module.js.map +1 -1
  48. package/dist/utils.main.js +2 -5
  49. package/dist/utils.main.js.map +1 -1
  50. package/dist/utils.mjs +3 -6
  51. package/dist/utils.module.js +3 -6
  52. package/dist/utils.module.js.map +1 -1
  53. package/package.json +4 -4
  54. package/src/PressResponder.tsx +3 -4
  55. package/src/focusSafely.ts +4 -4
  56. package/src/index.ts +1 -0
  57. package/src/useFocusVisible.ts +21 -5
  58. package/src/useFocusWithin.ts +3 -3
  59. package/src/useHover.ts +3 -3
  60. package/src/useInteractOutside.ts +3 -3
  61. package/src/useMove.ts +85 -57
  62. package/src/usePress.ts +199 -151
  63. package/src/utils.ts +3 -7
@@ -41,7 +41,9 @@ function $0294ea432cd92340$var$usePressResponderContext(props) {
41
41
  // Consume context from <PressResponder> and merge with props.
42
42
  let context = (0, $bBqCQ$react.useContext)((0, $01d3f539e91688c8$exports.PressResponderContext));
43
43
  if (context) {
44
- let { register: register, ...contextProps } = context;
44
+ // Prevent mergeProps from merging ref.
45
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
46
+ let { register: register, ref: ref, ...contextProps } = context;
45
47
  props = (0, $bBqCQ$reactariautils.mergeProps)(contextProps, props);
46
48
  register();
47
49
  }
@@ -89,6 +91,7 @@ class $0294ea432cd92340$var$PressEvent {
89
91
  this.altKey = originalEvent.altKey;
90
92
  this.x = x;
91
93
  this.y = y;
94
+ this.key = originalEvent.key;
92
95
  }
93
96
  }
94
97
  const $0294ea432cd92340$var$LINK_CLICKED = Symbol('linkClicked');
@@ -108,8 +111,8 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
108
111
  pointerType: null,
109
112
  disposables: []
110
113
  });
111
- let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners } = (0, $bBqCQ$reactariautils.useGlobalListeners)();
112
- let triggerPressStart = (0, $bBqCQ$reactariautils.useEffectEvent)((originalEvent, pointerType)=>{
114
+ let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners, removeGlobalListener: removeGlobalListener } = (0, $bBqCQ$reactariautils.useGlobalListeners)();
115
+ let triggerPressStart = (0, $bBqCQ$react.useCallback)((originalEvent, pointerType)=>{
113
116
  let state = ref.current;
114
117
  if (isDisabled || state.didFirePressStart) return false;
115
118
  let shouldStopPropagation = true;
@@ -124,8 +127,12 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
124
127
  state.didFirePressStart = true;
125
128
  setPressed(true);
126
129
  return shouldStopPropagation;
127
- });
128
- let triggerPressEnd = (0, $bBqCQ$reactariautils.useEffectEvent)((originalEvent, pointerType, wasPressed = true)=>{
130
+ }, [
131
+ isDisabled,
132
+ onPressStart,
133
+ onPressChange
134
+ ]);
135
+ let triggerPressEnd = (0, $bBqCQ$react.useCallback)((originalEvent, pointerType, wasPressed = true)=>{
129
136
  let state = ref.current;
130
137
  if (!state.didFirePressStart) return false;
131
138
  state.didFirePressStart = false;
@@ -145,8 +152,14 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
145
152
  }
146
153
  state.isTriggeringEvent = false;
147
154
  return shouldStopPropagation;
148
- });
149
- let triggerPressUp = (0, $bBqCQ$reactariautils.useEffectEvent)((originalEvent, pointerType)=>{
155
+ }, [
156
+ isDisabled,
157
+ onPressEnd,
158
+ onPressChange,
159
+ onPress
160
+ ]);
161
+ let triggerPressEndEvent = (0, $bBqCQ$reactariautils.useEffectEvent)(triggerPressEnd);
162
+ let triggerPressUp = (0, $bBqCQ$react.useCallback)((originalEvent, pointerType)=>{
150
163
  let state = ref.current;
151
164
  if (isDisabled) return false;
152
165
  if (onPressUp) {
@@ -157,12 +170,17 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
157
170
  return event.shouldStopPropagation;
158
171
  }
159
172
  return true;
160
- });
161
- let cancel = (0, $bBqCQ$reactariautils.useEffectEvent)((e)=>{
173
+ }, [
174
+ isDisabled,
175
+ onPressUp
176
+ ]);
177
+ let triggerPressUpEvent = (0, $bBqCQ$reactariautils.useEffectEvent)(triggerPressUp);
178
+ let cancel = (0, $bBqCQ$react.useCallback)((e)=>{
162
179
  let state = ref.current;
163
180
  if (state.isPressed && state.target) {
164
181
  if (state.didFirePressStart && state.pointerType != null) triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType, false);
165
182
  state.isPressed = false;
183
+ setIsPointerPressed(null);
166
184
  state.isOverTarget = false;
167
185
  state.activePointerId = null;
168
186
  state.pointerType = null;
@@ -171,15 +189,26 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
171
189
  for (let dispose of state.disposables)dispose();
172
190
  state.disposables = [];
173
191
  }
174
- });
175
- let cancelOnPointerExit = (0, $bBqCQ$reactariautils.useEffectEvent)((e)=>{
192
+ }, [
193
+ allowTextSelectionOnPress,
194
+ removeAllGlobalListeners,
195
+ triggerPressEnd
196
+ ]);
197
+ let cancelEvent = (0, $bBqCQ$reactariautils.useEffectEvent)(cancel);
198
+ let cancelOnPointerExit = (0, $bBqCQ$react.useCallback)((e)=>{
176
199
  if (shouldCancelOnPointerExit) cancel(e);
177
- });
178
- let triggerClick = (0, $bBqCQ$reactariautils.useEffectEvent)((e)=>{
200
+ }, [
201
+ shouldCancelOnPointerExit,
202
+ cancel
203
+ ]);
204
+ let triggerClick = (0, $bBqCQ$react.useCallback)((e)=>{
179
205
  if (isDisabled) return;
180
206
  onClick === null || onClick === void 0 ? void 0 : onClick(e);
181
- });
182
- let triggerSyntheticClick = (0, $bBqCQ$reactariautils.useEffectEvent)((e, target)=>{
207
+ }, [
208
+ isDisabled,
209
+ onClick
210
+ ]);
211
+ let triggerSyntheticClick = (0, $bBqCQ$react.useCallback)((e, target)=>{
183
212
  if (isDisabled) return;
184
213
  // Some third-party libraries pass in onClick instead of onPress.
185
214
  // Create a fake mouse event and trigger onClick as well.
@@ -191,7 +220,147 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
191
220
  (0, $625cf83917e112ad$exports.setEventTarget)(event, target);
192
221
  onClick((0, $625cf83917e112ad$exports.createSyntheticEvent)(event));
193
222
  }
194
- });
223
+ }, [
224
+ isDisabled,
225
+ onClick
226
+ ]);
227
+ let triggerSyntheticClickEvent = (0, $bBqCQ$reactariautils.useEffectEvent)(triggerSyntheticClick);
228
+ let [isElemKeyPressed, setIsElemKeyPressed] = (0, $bBqCQ$react.useState)(false);
229
+ (0, $bBqCQ$reactariautils.useLayoutEffect)(()=>{
230
+ let state = ref.current;
231
+ if (isElemKeyPressed) {
232
+ let onKeyUp = (e)=>{
233
+ var _state_metaKeyEvents;
234
+ if (state.isPressed && state.target && $0294ea432cd92340$var$isValidKeyboardEvent(e, state.target)) {
235
+ var _state_metaKeyEvents1;
236
+ if ($0294ea432cd92340$var$shouldPreventDefaultKeyboard((0, $bBqCQ$reactariautils.getEventTarget)(e), e.key)) e.preventDefault();
237
+ let target = (0, $bBqCQ$reactariautils.getEventTarget)(e);
238
+ let wasPressed = (0, $bBqCQ$reactariautils.nodeContains)(state.target, (0, $bBqCQ$reactariautils.getEventTarget)(e));
239
+ triggerPressEndEvent($0294ea432cd92340$var$createEvent(state.target, e), 'keyboard', wasPressed);
240
+ if (wasPressed) triggerSyntheticClickEvent(e, state.target);
241
+ removeAllGlobalListeners();
242
+ // If a link was triggered with a key other than Enter, open the URL ourselves.
243
+ // This means the link has a role override, and the default browser behavior
244
+ // only applies when using the Enter key.
245
+ if (e.key !== 'Enter' && $0294ea432cd92340$var$isHTMLAnchorLink(state.target) && (0, $bBqCQ$reactariautils.nodeContains)(state.target, target) && !e[$0294ea432cd92340$var$LINK_CLICKED]) {
246
+ // Store a hidden property on the event so we only trigger link click once,
247
+ // even if there are multiple usePress instances attached to the element.
248
+ e[$0294ea432cd92340$var$LINK_CLICKED] = true;
249
+ (0, $bBqCQ$reactariautils.openLink)(state.target, e, false);
250
+ }
251
+ state.isPressed = false;
252
+ setIsElemKeyPressed(false);
253
+ (_state_metaKeyEvents1 = state.metaKeyEvents) === null || _state_metaKeyEvents1 === void 0 ? void 0 : _state_metaKeyEvents1.delete(e.key);
254
+ } else if (e.key === 'Meta' && ((_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.size)) {
255
+ var _state_target;
256
+ // If we recorded keydown events that occurred while the Meta key was pressed,
257
+ // and those haven't received keyup events already, fire keyup events ourselves.
258
+ // See comment above for more info about the macOS bug causing this.
259
+ let events = state.metaKeyEvents;
260
+ state.metaKeyEvents = undefined;
261
+ for (let event of events.values())(_state_target = state.target) === null || _state_target === void 0 ? void 0 : _state_target.dispatchEvent(new KeyboardEvent('keyup', event));
262
+ }
263
+ };
264
+ // Focus may move before the key up event, so register the event on the document
265
+ // instead of the same element where the key down event occurred. Make it capturing so that it will trigger
266
+ // before stopPropagation from useKeyboard on a child element may happen and thus we can still call triggerPress for the parent element.
267
+ let originalTarget = state.target;
268
+ let pressUp = (e)=>{
269
+ if (originalTarget && $0294ea432cd92340$var$isValidKeyboardEvent(e, originalTarget) && !e.repeat && (0, $bBqCQ$reactariautils.nodeContains)(originalTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e)) && state.target) triggerPressUpEvent($0294ea432cd92340$var$createEvent(state.target, e), 'keyboard');
270
+ };
271
+ let listener = (0, $bBqCQ$reactariautils.chain)(pressUp, onKeyUp);
272
+ addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'keyup', listener, true);
273
+ return ()=>{
274
+ removeGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'keyup', listener, true);
275
+ };
276
+ }
277
+ }, [
278
+ isElemKeyPressed,
279
+ addGlobalListener,
280
+ removeAllGlobalListeners,
281
+ removeGlobalListener
282
+ ]);
283
+ let [isPointerPressed, setIsPointerPressed] = (0, $bBqCQ$react.useState)(null);
284
+ (0, $bBqCQ$reactariautils.useLayoutEffect)(()=>{
285
+ let state = ref.current;
286
+ if (isPointerPressed === 'pointer') {
287
+ let onPointerUp = (e)=>{
288
+ if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
289
+ if ((0, $bBqCQ$reactariautils.nodeContains)(state.target, (0, $bBqCQ$reactariautils.getEventTarget)(e)) && state.pointerType != null) {
290
+ // Wait for onClick to fire onPress. This avoids browser issues when the DOM
291
+ // is mutated between onPointerUp and onClick, and is more compatible with third party libraries.
292
+ // https://github.com/adobe/react-spectrum/issues/1513
293
+ // https://issues.chromium.org/issues/40732224
294
+ // However, iOS and Android do not focus or fire onClick after a long press.
295
+ // We work around this by triggering a click ourselves after a timeout.
296
+ // This timeout is canceled during the click event in case the real one fires first.
297
+ // The timeout must be at least 32ms, because Safari on iOS delays the click event on
298
+ // non-form elements without certain ARIA roles (for hover emulation).
299
+ // https://github.com/WebKit/WebKit/blob/dccfae42bb29bd4bdef052e469f604a9387241c0/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm#L875-L892
300
+ let clicked = false;
301
+ let timeout = setTimeout(()=>{
302
+ if (state.isPressed && state.target instanceof HTMLElement) {
303
+ if (clicked) cancelEvent(e);
304
+ else {
305
+ (0, $bBqCQ$reactariautils.focusWithoutScrolling)(state.target);
306
+ state.target.click();
307
+ }
308
+ }
309
+ }, 80);
310
+ // Use a capturing listener to track if a click occurred.
311
+ // If stopPropagation is called it may never reach our handler.
312
+ addGlobalListener(e.currentTarget, 'click', ()=>clicked = true, true);
313
+ state.disposables.push(()=>clearTimeout(timeout));
314
+ } else cancelEvent(e);
315
+ // Ignore subsequent onPointerLeave event before onClick on touch devices.
316
+ state.isOverTarget = false;
317
+ }
318
+ };
319
+ let onPointerCancel = (e)=>{
320
+ cancelEvent(e);
321
+ };
322
+ addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'pointerup', onPointerUp, false);
323
+ addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'pointercancel', onPointerCancel, false);
324
+ return ()=>{
325
+ removeGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'pointerup', onPointerUp, false);
326
+ removeGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'pointercancel', onPointerCancel, false);
327
+ };
328
+ } else if (isPointerPressed === 'mouse' && process.env.NODE_ENV === 'test') {
329
+ let onMouseUp = (e)=>{
330
+ // Only handle left clicks
331
+ if (e.button !== 0) return;
332
+ if (state.ignoreEmulatedMouseEvents) {
333
+ state.ignoreEmulatedMouseEvents = false;
334
+ return;
335
+ }
336
+ if (state.target && (0, $bBqCQ$reactariautils.nodeContains)(state.target, e.target) && state.pointerType != null) ;
337
+ else cancelEvent(e);
338
+ state.isOverTarget = false;
339
+ };
340
+ addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'mouseup', onMouseUp, false);
341
+ return ()=>{
342
+ removeGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(state.target), 'mouseup', onMouseUp, false);
343
+ };
344
+ } else if (isPointerPressed === 'touch' && process.env.NODE_ENV === 'test') {
345
+ let onScroll = (e)=>{
346
+ if (state.isPressed && (0, $bBqCQ$reactariautils.nodeContains)((0, $bBqCQ$reactariautils.getEventTarget)(e), state.target)) cancelEvent({
347
+ currentTarget: state.target,
348
+ shiftKey: false,
349
+ ctrlKey: false,
350
+ metaKey: false,
351
+ altKey: false
352
+ });
353
+ };
354
+ addGlobalListener((0, $bBqCQ$reactariautils.getOwnerWindow)(state.target), 'scroll', onScroll, true);
355
+ return ()=>{
356
+ removeGlobalListener((0, $bBqCQ$reactariautils.getOwnerWindow)(state.target), 'scroll', onScroll, true);
357
+ };
358
+ }
359
+ }, [
360
+ isPointerPressed,
361
+ addGlobalListener,
362
+ removeGlobalListener
363
+ ]);
195
364
  let pressProps = (0, $bBqCQ$react.useMemo)(()=>{
196
365
  let state = ref.current;
197
366
  let pressProps = {
@@ -206,16 +375,9 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
206
375
  if (!state.isPressed && !e.repeat) {
207
376
  state.target = e.currentTarget;
208
377
  state.isPressed = true;
378
+ setIsElemKeyPressed(true);
209
379
  state.pointerType = 'keyboard';
210
380
  shouldStopPropagation = triggerPressStart(e, 'keyboard');
211
- // Focus may move before the key up event, so register the event on the document
212
- // instead of the same element where the key down event occurred. Make it capturing so that it will trigger
213
- // before stopPropagation from useKeyboard on a child element may happen and thus we can still call triggerPress for the parent element.
214
- let originalTarget = e.currentTarget;
215
- let pressUp = (e)=>{
216
- if ($0294ea432cd92340$var$isValidKeyboardEvent(e, originalTarget) && !e.repeat && (0, $bBqCQ$reactariautils.nodeContains)(originalTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e)) && state.target) triggerPressUp($0294ea432cd92340$var$createEvent(state.target, e), 'keyboard');
217
- };
218
- addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'keyup', (0, $bBqCQ$reactariautils.chain)(pressUp, onKeyUp), true);
219
381
  }
220
382
  if (shouldStopPropagation) e.stopPropagation();
221
383
  // Keep track of the keydown events that occur while the Meta (e.g. Command) key is held.
@@ -255,37 +417,6 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
255
417
  }
256
418
  }
257
419
  };
258
- let onKeyUp = (e)=>{
259
- var _state_metaKeyEvents;
260
- if (state.isPressed && state.target && $0294ea432cd92340$var$isValidKeyboardEvent(e, state.target)) {
261
- var _state_metaKeyEvents1;
262
- if ($0294ea432cd92340$var$shouldPreventDefaultKeyboard((0, $bBqCQ$reactariautils.getEventTarget)(e), e.key)) e.preventDefault();
263
- let target = (0, $bBqCQ$reactariautils.getEventTarget)(e);
264
- let wasPressed = (0, $bBqCQ$reactariautils.nodeContains)(state.target, (0, $bBqCQ$reactariautils.getEventTarget)(e));
265
- triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), 'keyboard', wasPressed);
266
- if (wasPressed) triggerSyntheticClick(e, state.target);
267
- removeAllGlobalListeners();
268
- // If a link was triggered with a key other than Enter, open the URL ourselves.
269
- // This means the link has a role override, and the default browser behavior
270
- // only applies when using the Enter key.
271
- if (e.key !== 'Enter' && $0294ea432cd92340$var$isHTMLAnchorLink(state.target) && (0, $bBqCQ$reactariautils.nodeContains)(state.target, target) && !e[$0294ea432cd92340$var$LINK_CLICKED]) {
272
- // Store a hidden property on the event so we only trigger link click once,
273
- // even if there are multiple usePress instances attached to the element.
274
- e[$0294ea432cd92340$var$LINK_CLICKED] = true;
275
- (0, $bBqCQ$reactariautils.openLink)(state.target, e, false);
276
- }
277
- state.isPressed = false;
278
- (_state_metaKeyEvents1 = state.metaKeyEvents) === null || _state_metaKeyEvents1 === void 0 ? void 0 : _state_metaKeyEvents1.delete(e.key);
279
- } else if (e.key === 'Meta' && ((_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.size)) {
280
- var _state_target;
281
- // If we recorded keydown events that occurred while the Meta key was pressed,
282
- // and those haven't received keyup events already, fire keyup events ourselves.
283
- // See comment above for more info about the macOS bug causing this.
284
- let events = state.metaKeyEvents;
285
- state.metaKeyEvents = undefined;
286
- for (let event of events.values())(_state_target = state.target) === null || _state_target === void 0 ? void 0 : _state_target.dispatchEvent(new KeyboardEvent('keyup', event));
287
- }
288
- };
289
420
  if (typeof PointerEvent !== 'undefined') {
290
421
  pressProps.onPointerDown = (e)=>{
291
422
  // Only handle left clicks, and ignore events that bubbled through portals.
@@ -302,6 +433,7 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
302
433
  let shouldStopPropagation = true;
303
434
  if (!state.isPressed) {
304
435
  state.isPressed = true;
436
+ setIsPointerPressed('pointer');
305
437
  state.isOverTarget = true;
306
438
  state.activePointerId = e.pointerId;
307
439
  state.target = e.currentTarget;
@@ -310,9 +442,11 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
310
442
  // Release pointer capture so that touch interactions can leave the original target.
311
443
  // This enables onPointerLeave and onPointerEnter to fire.
312
444
  let target = (0, $bBqCQ$reactariautils.getEventTarget)(e.nativeEvent);
313
- if ('releasePointerCapture' in target) target.releasePointerCapture(e.pointerId);
314
- addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'pointerup', onPointerUp, false);
315
- addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'pointercancel', onPointerCancel, false);
445
+ if ('releasePointerCapture' in target) {
446
+ if ('hasPointerCapture' in target) {
447
+ if (target.hasPointerCapture(e.pointerId)) target.releasePointerCapture(e.pointerId);
448
+ } else target.releasePointerCapture(e.pointerId);
449
+ }
316
450
  }
317
451
  if (shouldStopPropagation) e.stopPropagation();
318
452
  };
@@ -345,41 +479,6 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
345
479
  cancelOnPointerExit(e);
346
480
  }
347
481
  };
348
- let onPointerUp = (e)=>{
349
- if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
350
- if ((0, $bBqCQ$reactariautils.nodeContains)(state.target, (0, $bBqCQ$reactariautils.getEventTarget)(e)) && state.pointerType != null) {
351
- // Wait for onClick to fire onPress. This avoids browser issues when the DOM
352
- // is mutated between onPointerUp and onClick, and is more compatible with third party libraries.
353
- // https://github.com/adobe/react-spectrum/issues/1513
354
- // https://issues.chromium.org/issues/40732224
355
- // However, iOS and Android do not focus or fire onClick after a long press.
356
- // We work around this by triggering a click ourselves after a timeout.
357
- // This timeout is canceled during the click event in case the real one fires first.
358
- // The timeout must be at least 32ms, because Safari on iOS delays the click event on
359
- // non-form elements without certain ARIA roles (for hover emulation).
360
- // https://github.com/WebKit/WebKit/blob/dccfae42bb29bd4bdef052e469f604a9387241c0/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm#L875-L892
361
- let clicked = false;
362
- let timeout = setTimeout(()=>{
363
- if (state.isPressed && state.target instanceof HTMLElement) {
364
- if (clicked) cancel(e);
365
- else {
366
- (0, $bBqCQ$reactariautils.focusWithoutScrolling)(state.target);
367
- state.target.click();
368
- }
369
- }
370
- }, 80);
371
- // Use a capturing listener to track if a click occurred.
372
- // If stopPropagation is called it may never reach our handler.
373
- addGlobalListener(e.currentTarget, 'click', ()=>clicked = true, true);
374
- state.disposables.push(()=>clearTimeout(timeout));
375
- } else cancel(e);
376
- // Ignore subsequent onPointerLeave event before onClick on touch devices.
377
- state.isOverTarget = false;
378
- }
379
- };
380
- let onPointerCancel = (e)=>{
381
- cancel(e);
382
- };
383
482
  pressProps.onDragStart = (e)=>{
384
483
  if (!(0, $bBqCQ$reactariautils.nodeContains)(e.currentTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e.nativeEvent))) return;
385
484
  // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.
@@ -396,6 +495,7 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
396
495
  return;
397
496
  }
398
497
  state.isPressed = true;
498
+ setIsPointerPressed('mouse');
399
499
  state.isOverTarget = true;
400
500
  state.target = e.currentTarget;
401
501
  state.pointerType = (0, $bBqCQ$reactariautils.isVirtualClick)(e.nativeEvent) ? 'virtual' : 'mouse';
@@ -406,7 +506,6 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
406
506
  let dispose = (0, $625cf83917e112ad$exports.preventFocus)(e.target);
407
507
  if (dispose) state.disposables.push(dispose);
408
508
  }
409
- addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'mouseup', onMouseUp, false);
410
509
  };
411
510
  pressProps.onMouseEnter = (e)=>{
412
511
  if (!(0, $bBqCQ$reactariautils.nodeContains)(e.currentTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e.nativeEvent))) return;
@@ -431,17 +530,6 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
431
530
  if (!(0, $bBqCQ$reactariautils.nodeContains)(e.currentTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e.nativeEvent))) return;
432
531
  if (!state.ignoreEmulatedMouseEvents && e.button === 0 && !state.isPressed) triggerPressUp(e, state.pointerType || 'mouse');
433
532
  };
434
- let onMouseUp = (e)=>{
435
- // Only handle left clicks
436
- if (e.button !== 0) return;
437
- if (state.ignoreEmulatedMouseEvents) {
438
- state.ignoreEmulatedMouseEvents = false;
439
- return;
440
- }
441
- if (state.target && state.target.contains(e.target) && state.pointerType != null) ;
442
- else cancel(e);
443
- state.isOverTarget = false;
444
- };
445
533
  pressProps.onTouchStart = (e)=>{
446
534
  if (!(0, $bBqCQ$reactariautils.nodeContains)(e.currentTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e.nativeEvent))) return;
447
535
  let touch = $0294ea432cd92340$var$getTouchFromEvent(e.nativeEvent);
@@ -450,12 +538,12 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
450
538
  state.ignoreEmulatedMouseEvents = true;
451
539
  state.isOverTarget = true;
452
540
  state.isPressed = true;
541
+ setIsPointerPressed('touch');
453
542
  state.target = e.currentTarget;
454
543
  state.pointerType = 'touch';
455
544
  if (!allowTextSelectionOnPress) (0, $f7e14e656343df57$exports.disableTextSelection)(state.target);
456
545
  let shouldStopPropagation = triggerPressStart($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType);
457
546
  if (shouldStopPropagation) e.stopPropagation();
458
- addGlobalListener((0, $bBqCQ$reactariautils.getOwnerWindow)(e.currentTarget), 'scroll', onScroll, true);
459
547
  };
460
548
  pressProps.onTouchMove = (e)=>{
461
549
  if (!(0, $bBqCQ$reactariautils.nodeContains)(e.currentTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e.nativeEvent))) return;
@@ -492,6 +580,7 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
492
580
  } else if (state.isOverTarget && state.pointerType != null) shouldStopPropagation = triggerPressEnd($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType, false);
493
581
  if (shouldStopPropagation) e.stopPropagation();
494
582
  state.isPressed = false;
583
+ setIsPointerPressed(null);
495
584
  state.activePointerId = null;
496
585
  state.isOverTarget = false;
497
586
  state.ignoreEmulatedMouseEvents = true;
@@ -503,15 +592,6 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
503
592
  e.stopPropagation();
504
593
  if (state.isPressed) cancel($0294ea432cd92340$var$createTouchEvent(state.target, e));
505
594
  };
506
- let onScroll = (e)=>{
507
- if (state.isPressed && (0, $bBqCQ$reactariautils.nodeContains)((0, $bBqCQ$reactariautils.getEventTarget)(e), state.target)) cancel({
508
- currentTarget: state.target,
509
- shiftKey: false,
510
- ctrlKey: false,
511
- metaKey: false,
512
- altKey: false
513
- });
514
- };
515
595
  pressProps.onDragStart = (e)=>{
516
596
  if (!(0, $bBqCQ$reactariautils.nodeContains)(e.currentTarget, (0, $bBqCQ$reactariautils.getEventTarget)(e.nativeEvent))) return;
517
597
  cancel(e);
@@ -519,7 +599,6 @@ function $0294ea432cd92340$export$45712eceda6fad21(props) {
519
599
  }
520
600
  return pressProps;
521
601
  }, [
522
- addGlobalListener,
523
602
  isDisabled,
524
603
  preventFocusOnPress,
525
604
  removeAllGlobalListeners,
@@ -624,7 +703,8 @@ function $0294ea432cd92340$var$createEvent(target, e) {
624
703
  metaKey: e.metaKey,
625
704
  altKey: e.altKey,
626
705
  clientX: clientX,
627
- clientY: clientY
706
+ clientY: clientY,
707
+ key: e.key
628
708
  };
629
709
  }
630
710
  function $0294ea432cd92340$var$getPointClientRect(point) {