@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.
- package/dist/focusSafely.main.js +4 -4
- package/dist/focusSafely.main.js.map +1 -1
- package/dist/focusSafely.mjs +4 -4
- package/dist/focusSafely.module.js +4 -4
- package/dist/focusSafely.module.js.map +1 -1
- package/dist/import.mjs +2 -2
- package/dist/main.js +1 -0
- package/dist/main.js.map +1 -1
- package/dist/module.js +2 -2
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/useFocusVisible.main.js +12 -2
- package/dist/useFocusVisible.main.js.map +1 -1
- package/dist/useFocusVisible.mjs +13 -4
- package/dist/useFocusVisible.module.js +13 -4
- package/dist/useFocusVisible.module.js.map +1 -1
- package/dist/useInteractOutside.main.js +1 -3
- package/dist/useInteractOutside.main.js.map +1 -1
- package/dist/useInteractOutside.mjs +1 -3
- package/dist/useInteractOutside.module.js +1 -3
- package/dist/useInteractOutside.module.js.map +1 -1
- package/dist/useMove.main.js +110 -74
- package/dist/useMove.main.js.map +1 -1
- package/dist/useMove.mjs +112 -76
- package/dist/useMove.module.js +112 -76
- package/dist/useMove.module.js.map +1 -1
- package/dist/usePress.main.js +188 -114
- package/dist/usePress.main.js.map +1 -1
- package/dist/usePress.mjs +190 -116
- package/dist/usePress.module.js +190 -116
- package/dist/usePress.module.js.map +1 -1
- package/dist/utils.main.js +2 -5
- package/dist/utils.main.js.map +1 -1
- package/dist/utils.mjs +3 -6
- package/dist/utils.module.js +3 -6
- package/dist/utils.module.js.map +1 -1
- package/package.json +4 -4
- package/src/focusSafely.ts +4 -4
- package/src/index.ts +1 -0
- package/src/useFocusVisible.ts +15 -3
- package/src/useInteractOutside.ts +1 -1
- package/src/useMove.ts +85 -57
- package/src/usePress.ts +192 -148
- package/src/utils.ts +3 -7
package/dist/usePress.module.js
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,
|
|
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$
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|