@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.
- package/dist/PressResponder.main.js +2 -3
- package/dist/PressResponder.main.js.map +1 -1
- package/dist/PressResponder.mjs +3 -4
- package/dist/PressResponder.module.js +3 -4
- package/dist/PressResponder.module.js.map +1 -1
- 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 +4 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/useFocusVisible.main.js +19 -8
- package/dist/useFocusVisible.main.js.map +1 -1
- package/dist/useFocusVisible.mjs +20 -10
- package/dist/useFocusVisible.module.js +20 -10
- package/dist/useFocusVisible.module.js.map +1 -1
- package/dist/useFocusWithin.main.js +3 -3
- package/dist/useFocusWithin.main.js.map +1 -1
- package/dist/useFocusWithin.mjs +4 -4
- package/dist/useFocusWithin.module.js +4 -4
- package/dist/useFocusWithin.module.js.map +1 -1
- package/dist/useHover.main.js +3 -3
- package/dist/useHover.main.js.map +1 -1
- package/dist/useHover.mjs +4 -4
- package/dist/useHover.module.js +4 -4
- package/dist/useHover.module.js.map +1 -1
- package/dist/useInteractOutside.main.js +2 -4
- package/dist/useInteractOutside.main.js.map +1 -1
- package/dist/useInteractOutside.mjs +3 -5
- package/dist/useInteractOutside.module.js +3 -5
- 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 +197 -117
- package/dist/usePress.main.js.map +1 -1
- package/dist/usePress.mjs +199 -119
- package/dist/usePress.module.js +199 -119
- 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/PressResponder.tsx +3 -4
- package/src/focusSafely.ts +4 -4
- package/src/index.ts +1 -0
- package/src/useFocusVisible.ts +21 -5
- package/src/useFocusWithin.ts +3 -3
- package/src/useHover.ts +3 -3
- package/src/useInteractOutside.ts +3 -3
- package/src/useMove.ts +85 -57
- package/src/usePress.ts +199 -151
- package/src/utils.ts +3 -7
package/dist/usePress.mjs
CHANGED
|
@@ -4,9 +4,9 @@ import {PressResponderContext as $ae1eeba8b9eafd08$export$5165eccb35aaadb5} from
|
|
|
4
4
|
import {_ as $7mdmh$_} from "@swc/helpers/_/_class_private_field_get";
|
|
5
5
|
import {_ as $7mdmh$_1} from "@swc/helpers/_/_class_private_field_init";
|
|
6
6
|
import {_ as $7mdmh$_2} from "@swc/helpers/_/_class_private_field_set";
|
|
7
|
-
import {mergeProps as $7mdmh$mergeProps, useSyncRef as $7mdmh$useSyncRef, useGlobalListeners as $7mdmh$useGlobalListeners, useEffectEvent as $7mdmh$useEffectEvent,
|
|
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
|
-
|
|
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$
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
308
|
-
|
|
309
|
-
|
|
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) {
|