@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
@@ -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.
@@ -35,7 +35,9 @@ function $f6c31cce2adf654f$var$usePressResponderContext(props) {
35
35
  // Consume context from <PressResponder> and merge with props.
36
36
  let context = (0, $7mdmh$useContext)((0, $ae1eeba8b9eafd08$export$5165eccb35aaadb5));
37
37
  if (context) {
38
- let { register: register, ...contextProps } = context;
38
+ // Prevent mergeProps from merging ref.
39
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
40
+ let { register: register, ref: ref, ...contextProps } = context;
39
41
  props = (0, $7mdmh$mergeProps)(contextProps, props);
40
42
  register();
41
43
  }
@@ -83,6 +85,7 @@ class $f6c31cce2adf654f$var$PressEvent {
83
85
  this.altKey = originalEvent.altKey;
84
86
  this.x = x;
85
87
  this.y = y;
88
+ this.key = originalEvent.key;
86
89
  }
87
90
  }
88
91
  const $f6c31cce2adf654f$var$LINK_CLICKED = Symbol('linkClicked');
@@ -102,8 +105,8 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
102
105
  pointerType: null,
103
106
  disposables: []
104
107
  });
105
- let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners } = (0, $7mdmh$useGlobalListeners)();
106
- let triggerPressStart = (0, $7mdmh$useEffectEvent)((originalEvent, pointerType)=>{
108
+ let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners, removeGlobalListener: removeGlobalListener } = (0, $7mdmh$useGlobalListeners)();
109
+ let triggerPressStart = (0, $7mdmh$useCallback)((originalEvent, pointerType)=>{
107
110
  let state = ref.current;
108
111
  if (isDisabled || state.didFirePressStart) return false;
109
112
  let shouldStopPropagation = true;
@@ -118,8 +121,12 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
118
121
  state.didFirePressStart = true;
119
122
  setPressed(true);
120
123
  return shouldStopPropagation;
121
- });
122
- let triggerPressEnd = (0, $7mdmh$useEffectEvent)((originalEvent, pointerType, wasPressed = true)=>{
124
+ }, [
125
+ isDisabled,
126
+ onPressStart,
127
+ onPressChange
128
+ ]);
129
+ let triggerPressEnd = (0, $7mdmh$useCallback)((originalEvent, pointerType, wasPressed = true)=>{
123
130
  let state = ref.current;
124
131
  if (!state.didFirePressStart) return false;
125
132
  state.didFirePressStart = false;
@@ -139,8 +146,14 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
139
146
  }
140
147
  state.isTriggeringEvent = false;
141
148
  return shouldStopPropagation;
142
- });
143
- let triggerPressUp = (0, $7mdmh$useEffectEvent)((originalEvent, pointerType)=>{
149
+ }, [
150
+ isDisabled,
151
+ onPressEnd,
152
+ onPressChange,
153
+ onPress
154
+ ]);
155
+ let triggerPressEndEvent = (0, $7mdmh$useEffectEvent)(triggerPressEnd);
156
+ let triggerPressUp = (0, $7mdmh$useCallback)((originalEvent, pointerType)=>{
144
157
  let state = ref.current;
145
158
  if (isDisabled) return false;
146
159
  if (onPressUp) {
@@ -151,12 +164,17 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
151
164
  return event.shouldStopPropagation;
152
165
  }
153
166
  return true;
154
- });
155
- let cancel = (0, $7mdmh$useEffectEvent)((e)=>{
167
+ }, [
168
+ isDisabled,
169
+ onPressUp
170
+ ]);
171
+ let triggerPressUpEvent = (0, $7mdmh$useEffectEvent)(triggerPressUp);
172
+ let cancel = (0, $7mdmh$useCallback)((e)=>{
156
173
  let state = ref.current;
157
174
  if (state.isPressed && state.target) {
158
175
  if (state.didFirePressStart && state.pointerType != null) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);
159
176
  state.isPressed = false;
177
+ setIsPointerPressed(null);
160
178
  state.isOverTarget = false;
161
179
  state.activePointerId = null;
162
180
  state.pointerType = null;
@@ -165,15 +183,26 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
165
183
  for (let dispose of state.disposables)dispose();
166
184
  state.disposables = [];
167
185
  }
168
- });
169
- let cancelOnPointerExit = (0, $7mdmh$useEffectEvent)((e)=>{
186
+ }, [
187
+ allowTextSelectionOnPress,
188
+ removeAllGlobalListeners,
189
+ triggerPressEnd
190
+ ]);
191
+ let cancelEvent = (0, $7mdmh$useEffectEvent)(cancel);
192
+ let cancelOnPointerExit = (0, $7mdmh$useCallback)((e)=>{
170
193
  if (shouldCancelOnPointerExit) cancel(e);
171
- });
172
- let triggerClick = (0, $7mdmh$useEffectEvent)((e)=>{
194
+ }, [
195
+ shouldCancelOnPointerExit,
196
+ cancel
197
+ ]);
198
+ let triggerClick = (0, $7mdmh$useCallback)((e)=>{
173
199
  if (isDisabled) return;
174
200
  onClick === null || onClick === void 0 ? void 0 : onClick(e);
175
- });
176
- let triggerSyntheticClick = (0, $7mdmh$useEffectEvent)((e, target)=>{
201
+ }, [
202
+ isDisabled,
203
+ onClick
204
+ ]);
205
+ let triggerSyntheticClick = (0, $7mdmh$useCallback)((e, target)=>{
177
206
  if (isDisabled) return;
178
207
  // Some third-party libraries pass in onClick instead of onPress.
179
208
  // Create a fake mouse event and trigger onClick as well.
@@ -185,7 +214,147 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
185
214
  (0, $8a9cb279dc87e130$export$c2b7abe5d61ec696)(event, target);
186
215
  onClick((0, $8a9cb279dc87e130$export$525bc4921d56d4a)(event));
187
216
  }
188
- });
217
+ }, [
218
+ isDisabled,
219
+ onClick
220
+ ]);
221
+ let triggerSyntheticClickEvent = (0, $7mdmh$useEffectEvent)(triggerSyntheticClick);
222
+ let [isElemKeyPressed, setIsElemKeyPressed] = (0, $7mdmh$useState)(false);
223
+ (0, $7mdmh$useLayoutEffect)(()=>{
224
+ let state = ref.current;
225
+ if (isElemKeyPressed) {
226
+ let onKeyUp = (e)=>{
227
+ var _state_metaKeyEvents;
228
+ if (state.isPressed && state.target && $f6c31cce2adf654f$var$isValidKeyboardEvent(e, state.target)) {
229
+ var _state_metaKeyEvents1;
230
+ if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard((0, $7mdmh$getEventTarget)(e), e.key)) e.preventDefault();
231
+ let target = (0, $7mdmh$getEventTarget)(e);
232
+ let wasPressed = (0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e));
233
+ triggerPressEndEvent($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard', wasPressed);
234
+ if (wasPressed) triggerSyntheticClickEvent(e, state.target);
235
+ removeAllGlobalListeners();
236
+ // If a link was triggered with a key other than Enter, open the URL ourselves.
237
+ // This means the link has a role override, and the default browser behavior
238
+ // only applies when using the Enter key.
239
+ if (e.key !== 'Enter' && $f6c31cce2adf654f$var$isHTMLAnchorLink(state.target) && (0, $7mdmh$nodeContains)(state.target, target) && !e[$f6c31cce2adf654f$var$LINK_CLICKED]) {
240
+ // Store a hidden property on the event so we only trigger link click once,
241
+ // even if there are multiple usePress instances attached to the element.
242
+ e[$f6c31cce2adf654f$var$LINK_CLICKED] = true;
243
+ (0, $7mdmh$openLink)(state.target, e, false);
244
+ }
245
+ state.isPressed = false;
246
+ setIsElemKeyPressed(false);
247
+ (_state_metaKeyEvents1 = state.metaKeyEvents) === null || _state_metaKeyEvents1 === void 0 ? void 0 : _state_metaKeyEvents1.delete(e.key);
248
+ } else if (e.key === 'Meta' && ((_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.size)) {
249
+ var _state_target;
250
+ // If we recorded keydown events that occurred while the Meta key was pressed,
251
+ // and those haven't received keyup events already, fire keyup events ourselves.
252
+ // See comment above for more info about the macOS bug causing this.
253
+ let events = state.metaKeyEvents;
254
+ state.metaKeyEvents = undefined;
255
+ for (let event of events.values())(_state_target = state.target) === null || _state_target === void 0 ? void 0 : _state_target.dispatchEvent(new KeyboardEvent('keyup', event));
256
+ }
257
+ };
258
+ // Focus may move before the key up event, so register the event on the document
259
+ // instead of the same element where the key down event occurred. Make it capturing so that it will trigger
260
+ // before stopPropagation from useKeyboard on a child element may happen and thus we can still call triggerPress for the parent element.
261
+ let originalTarget = state.target;
262
+ let pressUp = (e)=>{
263
+ 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');
264
+ };
265
+ let listener = (0, $7mdmh$chain)(pressUp, onKeyUp);
266
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'keyup', listener, true);
267
+ return ()=>{
268
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'keyup', listener, true);
269
+ };
270
+ }
271
+ }, [
272
+ isElemKeyPressed,
273
+ addGlobalListener,
274
+ removeAllGlobalListeners,
275
+ removeGlobalListener
276
+ ]);
277
+ let [isPointerPressed, setIsPointerPressed] = (0, $7mdmh$useState)(null);
278
+ (0, $7mdmh$useLayoutEffect)(()=>{
279
+ let state = ref.current;
280
+ if (isPointerPressed === 'pointer') {
281
+ let onPointerUp = (e)=>{
282
+ if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
283
+ if ((0, $7mdmh$nodeContains)(state.target, (0, $7mdmh$getEventTarget)(e)) && state.pointerType != null) {
284
+ // Wait for onClick to fire onPress. This avoids browser issues when the DOM
285
+ // is mutated between onPointerUp and onClick, and is more compatible with third party libraries.
286
+ // https://github.com/adobe/react-spectrum/issues/1513
287
+ // https://issues.chromium.org/issues/40732224
288
+ // However, iOS and Android do not focus or fire onClick after a long press.
289
+ // We work around this by triggering a click ourselves after a timeout.
290
+ // This timeout is canceled during the click event in case the real one fires first.
291
+ // The timeout must be at least 32ms, because Safari on iOS delays the click event on
292
+ // non-form elements without certain ARIA roles (for hover emulation).
293
+ // https://github.com/WebKit/WebKit/blob/dccfae42bb29bd4bdef052e469f604a9387241c0/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm#L875-L892
294
+ let clicked = false;
295
+ let timeout = setTimeout(()=>{
296
+ if (state.isPressed && state.target instanceof HTMLElement) {
297
+ if (clicked) cancelEvent(e);
298
+ else {
299
+ (0, $7mdmh$focusWithoutScrolling)(state.target);
300
+ state.target.click();
301
+ }
302
+ }
303
+ }, 80);
304
+ // Use a capturing listener to track if a click occurred.
305
+ // If stopPropagation is called it may never reach our handler.
306
+ addGlobalListener(e.currentTarget, 'click', ()=>clicked = true, true);
307
+ state.disposables.push(()=>clearTimeout(timeout));
308
+ } else cancelEvent(e);
309
+ // Ignore subsequent onPointerLeave event before onClick on touch devices.
310
+ state.isOverTarget = false;
311
+ }
312
+ };
313
+ let onPointerCancel = (e)=>{
314
+ cancelEvent(e);
315
+ };
316
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointerup', onPointerUp, false);
317
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointercancel', onPointerCancel, false);
318
+ return ()=>{
319
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointerup', onPointerUp, false);
320
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'pointercancel', onPointerCancel, false);
321
+ };
322
+ } else if (isPointerPressed === 'mouse' && process.env.NODE_ENV === 'test') {
323
+ let onMouseUp = (e)=>{
324
+ // Only handle left clicks
325
+ if (e.button !== 0) return;
326
+ if (state.ignoreEmulatedMouseEvents) {
327
+ state.ignoreEmulatedMouseEvents = false;
328
+ return;
329
+ }
330
+ if (state.target && (0, $7mdmh$nodeContains)(state.target, e.target) && state.pointerType != null) ;
331
+ else cancelEvent(e);
332
+ state.isOverTarget = false;
333
+ };
334
+ addGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'mouseup', onMouseUp, false);
335
+ return ()=>{
336
+ removeGlobalListener((0, $7mdmh$getOwnerDocument)(state.target), 'mouseup', onMouseUp, false);
337
+ };
338
+ } else if (isPointerPressed === 'touch' && process.env.NODE_ENV === 'test') {
339
+ let onScroll = (e)=>{
340
+ if (state.isPressed && (0, $7mdmh$nodeContains)((0, $7mdmh$getEventTarget)(e), state.target)) cancelEvent({
341
+ currentTarget: state.target,
342
+ shiftKey: false,
343
+ ctrlKey: false,
344
+ metaKey: false,
345
+ altKey: false
346
+ });
347
+ };
348
+ addGlobalListener((0, $7mdmh$getOwnerWindow)(state.target), 'scroll', onScroll, true);
349
+ return ()=>{
350
+ removeGlobalListener((0, $7mdmh$getOwnerWindow)(state.target), 'scroll', onScroll, true);
351
+ };
352
+ }
353
+ }, [
354
+ isPointerPressed,
355
+ addGlobalListener,
356
+ removeGlobalListener
357
+ ]);
189
358
  let pressProps = (0, $7mdmh$useMemo)(()=>{
190
359
  let state = ref.current;
191
360
  let pressProps = {
@@ -200,16 +369,9 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
200
369
  if (!state.isPressed && !e.repeat) {
201
370
  state.target = e.currentTarget;
202
371
  state.isPressed = true;
372
+ setIsElemKeyPressed(true);
203
373
  state.pointerType = 'keyboard';
204
374
  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
375
  }
214
376
  if (shouldStopPropagation) e.stopPropagation();
215
377
  // Keep track of the keydown events that occur while the Meta (e.g. Command) key is held.
@@ -249,37 +411,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
249
411
  }
250
412
  }
251
413
  };
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
414
  if (typeof PointerEvent !== 'undefined') {
284
415
  pressProps.onPointerDown = (e)=>{
285
416
  // Only handle left clicks, and ignore events that bubbled through portals.
@@ -296,6 +427,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
296
427
  let shouldStopPropagation = true;
297
428
  if (!state.isPressed) {
298
429
  state.isPressed = true;
430
+ setIsPointerPressed('pointer');
299
431
  state.isOverTarget = true;
300
432
  state.activePointerId = e.pointerId;
301
433
  state.target = e.currentTarget;
@@ -304,9 +436,11 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
304
436
  // Release pointer capture so that touch interactions can leave the original target.
305
437
  // This enables onPointerLeave and onPointerEnter to fire.
306
438
  let target = (0, $7mdmh$getEventTarget)(e.nativeEvent);
307
- 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);
439
+ if ('releasePointerCapture' in target) {
440
+ if ('hasPointerCapture' in target) {
441
+ if (target.hasPointerCapture(e.pointerId)) target.releasePointerCapture(e.pointerId);
442
+ } else target.releasePointerCapture(e.pointerId);
443
+ }
310
444
  }
311
445
  if (shouldStopPropagation) e.stopPropagation();
312
446
  };
@@ -339,41 +473,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
339
473
  cancelOnPointerExit(e);
340
474
  }
341
475
  };
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
476
  pressProps.onDragStart = (e)=>{
378
477
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
379
478
  // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.
@@ -390,6 +489,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
390
489
  return;
391
490
  }
392
491
  state.isPressed = true;
492
+ setIsPointerPressed('mouse');
393
493
  state.isOverTarget = true;
394
494
  state.target = e.currentTarget;
395
495
  state.pointerType = (0, $7mdmh$isVirtualClick)(e.nativeEvent) ? 'virtual' : 'mouse';
@@ -400,7 +500,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
400
500
  let dispose = (0, $8a9cb279dc87e130$export$cabe61c495ee3649)(e.target);
401
501
  if (dispose) state.disposables.push(dispose);
402
502
  }
403
- addGlobalListener((0, $7mdmh$getOwnerDocument)(e.currentTarget), 'mouseup', onMouseUp, false);
404
503
  };
405
504
  pressProps.onMouseEnter = (e)=>{
406
505
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
@@ -425,17 +524,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
425
524
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
426
525
  if (!state.ignoreEmulatedMouseEvents && e.button === 0 && !state.isPressed) triggerPressUp(e, state.pointerType || 'mouse');
427
526
  };
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
527
  pressProps.onTouchStart = (e)=>{
440
528
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
441
529
  let touch = $f6c31cce2adf654f$var$getTouchFromEvent(e.nativeEvent);
@@ -444,12 +532,12 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
444
532
  state.ignoreEmulatedMouseEvents = true;
445
533
  state.isOverTarget = true;
446
534
  state.isPressed = true;
535
+ setIsPointerPressed('touch');
447
536
  state.target = e.currentTarget;
448
537
  state.pointerType = 'touch';
449
538
  if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$16a4697467175487)(state.target);
450
539
  let shouldStopPropagation = triggerPressStart($f6c31cce2adf654f$var$createTouchEvent(state.target, e), state.pointerType);
451
540
  if (shouldStopPropagation) e.stopPropagation();
452
- addGlobalListener((0, $7mdmh$getOwnerWindow)(e.currentTarget), 'scroll', onScroll, true);
453
541
  };
454
542
  pressProps.onTouchMove = (e)=>{
455
543
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
@@ -486,6 +574,7 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
486
574
  } else if (state.isOverTarget && state.pointerType != null) shouldStopPropagation = triggerPressEnd($f6c31cce2adf654f$var$createTouchEvent(state.target, e), state.pointerType, false);
487
575
  if (shouldStopPropagation) e.stopPropagation();
488
576
  state.isPressed = false;
577
+ setIsPointerPressed(null);
489
578
  state.activePointerId = null;
490
579
  state.isOverTarget = false;
491
580
  state.ignoreEmulatedMouseEvents = true;
@@ -497,15 +586,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
497
586
  e.stopPropagation();
498
587
  if (state.isPressed) cancel($f6c31cce2adf654f$var$createTouchEvent(state.target, e));
499
588
  };
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
589
  pressProps.onDragStart = (e)=>{
510
590
  if (!(0, $7mdmh$nodeContains)(e.currentTarget, (0, $7mdmh$getEventTarget)(e.nativeEvent))) return;
511
591
  cancel(e);
@@ -513,7 +593,6 @@ function $f6c31cce2adf654f$export$45712eceda6fad21(props) {
513
593
  }
514
594
  return pressProps;
515
595
  }, [
516
- addGlobalListener,
517
596
  isDisabled,
518
597
  preventFocusOnPress,
519
598
  removeAllGlobalListeners,
@@ -618,7 +697,8 @@ function $f6c31cce2adf654f$var$createEvent(target, e) {
618
697
  metaKey: e.metaKey,
619
698
  altKey: e.altKey,
620
699
  clientX: clientX,
621
- clientY: clientY
700
+ clientY: clientY,
701
+ key: e.key
622
702
  };
623
703
  }
624
704
  function $f6c31cce2adf654f$var$getPointClientRect(point) {