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