UNPKG

35.8 kBJavaScriptView Raw
1var $f7e14e656343df57$exports = require("./textSelection.main.js");
2var $01d3f539e91688c8$exports = require("./context.main.js");
3var $bBqCQ$swchelperscjs_class_private_field_getcjs = require("@swc/helpers/cjs/_class_private_field_get.cjs");
4var $bBqCQ$swchelperscjs_class_private_field_initcjs = require("@swc/helpers/cjs/_class_private_field_init.cjs");
5var $bBqCQ$swchelperscjs_class_private_field_setcjs = require("@swc/helpers/cjs/_class_private_field_set.cjs");
6var $bBqCQ$reactariautils = require("@react-aria/utils");
7var $bBqCQ$react = require("react");
8
9
10function $parcel$export(e, n, v, s) {
11 Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
12}
13
14$parcel$export(module.exports, "usePress", () => $0294ea432cd92340$export$45712eceda6fad21);
15/*
16 * Copyright 2020 Adobe. All rights reserved.
17 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
18 * you may not use this file except in compliance with the License. You may obtain a copy
19 * of the License at http://www.apache.org/licenses/LICENSE-2.0
20 *
21 * Unless required by applicable law or agreed to in writing, software distributed under
22 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
23 * OF ANY KIND, either express or implied. See the License for the specific language
24 * governing permissions and limitations under the License.
25 */ // Portions of the code in this file are based on code from react.
26// Original licensing for the following can be found in the
27// NOTICE file in the root directory of this source tree.
28// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions
29
30
31
32
33
34
35
36function $0294ea432cd92340$var$usePressResponderContext(props) {
37 // Consume context from <PressResponder> and merge with props.
38 let context = (0, $bBqCQ$react.useContext)((0, $01d3f539e91688c8$exports.PressResponderContext));
39 if (context) {
40 let { register: register, ...contextProps } = context;
41 props = (0, $bBqCQ$reactariautils.mergeProps)(contextProps, props);
42 register();
43 }
44 (0, $bBqCQ$reactariautils.useSyncRef)(context, props.ref);
45 return props;
46}
47var $0294ea432cd92340$var$_shouldStopPropagation = /*#__PURE__*/ new WeakMap();
48class $0294ea432cd92340$var$PressEvent {
49 continuePropagation() {
50 (0, $bBqCQ$swchelperscjs_class_private_field_setcjs._)(this, $0294ea432cd92340$var$_shouldStopPropagation, false);
51 }
52 get shouldStopPropagation() {
53 return (0, $bBqCQ$swchelperscjs_class_private_field_getcjs._)(this, $0294ea432cd92340$var$_shouldStopPropagation);
54 }
55 constructor(type, pointerType, originalEvent, state){
56 (0, $bBqCQ$swchelperscjs_class_private_field_initcjs._)(this, $0294ea432cd92340$var$_shouldStopPropagation, {
57 writable: true,
58 value: void 0
59 });
60 (0, $bBqCQ$swchelperscjs_class_private_field_setcjs._)(this, $0294ea432cd92340$var$_shouldStopPropagation, true);
61 var _state_target;
62 let currentTarget = (_state_target = state === null || state === void 0 ? void 0 : state.target) !== null && _state_target !== void 0 ? _state_target : originalEvent.currentTarget;
63 const rect = currentTarget === null || currentTarget === void 0 ? void 0 : currentTarget.getBoundingClientRect();
64 let x, y = 0;
65 let clientX, clientY = null;
66 if (originalEvent.clientX != null && originalEvent.clientY != null) {
67 clientX = originalEvent.clientX;
68 clientY = originalEvent.clientY;
69 }
70 if (rect) {
71 if (clientX != null && clientY != null) {
72 x = clientX - rect.left;
73 y = clientY - rect.top;
74 } else {
75 x = rect.width / 2;
76 y = rect.height / 2;
77 }
78 }
79 this.type = type;
80 this.pointerType = pointerType;
81 this.target = originalEvent.currentTarget;
82 this.shiftKey = originalEvent.shiftKey;
83 this.metaKey = originalEvent.metaKey;
84 this.ctrlKey = originalEvent.ctrlKey;
85 this.altKey = originalEvent.altKey;
86 this.x = x;
87 this.y = y;
88 }
89}
90const $0294ea432cd92340$var$LINK_CLICKED = Symbol('linkClicked');
91function $0294ea432cd92340$export$45712eceda6fad21(props) {
92 let { onPress: onPress, onPressChange: onPressChange, onPressStart: onPressStart, onPressEnd: onPressEnd, onPressUp: onPressUp, isDisabled: isDisabled, isPressed: isPressedProp, preventFocusOnPress: preventFocusOnPress, shouldCancelOnPointerExit: shouldCancelOnPointerExit, allowTextSelectionOnPress: allowTextSelectionOnPress, // eslint-disable-next-line @typescript-eslint/no-unused-vars
93 ref: _, ...domProps } = $0294ea432cd92340$var$usePressResponderContext(props);
94 let [isPressed, setPressed] = (0, $bBqCQ$react.useState)(false);
95 let ref = (0, $bBqCQ$react.useRef)({
96 isPressed: false,
97 ignoreEmulatedMouseEvents: false,
98 ignoreClickAfterPress: false,
99 didFirePressStart: false,
100 isTriggeringEvent: false,
101 activePointerId: null,
102 target: null,
103 isOverTarget: false,
104 pointerType: null
105 });
106 let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners } = (0, $bBqCQ$reactariautils.useGlobalListeners)();
107 let triggerPressStart = (0, $bBqCQ$reactariautils.useEffectEvent)((originalEvent, pointerType)=>{
108 let state = ref.current;
109 if (isDisabled || state.didFirePressStart) return false;
110 let shouldStopPropagation = true;
111 state.isTriggeringEvent = true;
112 if (onPressStart) {
113 let event = new $0294ea432cd92340$var$PressEvent('pressstart', pointerType, originalEvent);
114 onPressStart(event);
115 shouldStopPropagation = event.shouldStopPropagation;
116 }
117 if (onPressChange) onPressChange(true);
118 state.isTriggeringEvent = false;
119 state.didFirePressStart = true;
120 setPressed(true);
121 return shouldStopPropagation;
122 });
123 let triggerPressEnd = (0, $bBqCQ$reactariautils.useEffectEvent)((originalEvent, pointerType, wasPressed = true)=>{
124 let state = ref.current;
125 if (!state.didFirePressStart) return false;
126 state.ignoreClickAfterPress = true;
127 state.didFirePressStart = false;
128 state.isTriggeringEvent = true;
129 let shouldStopPropagation = true;
130 if (onPressEnd) {
131 let event = new $0294ea432cd92340$var$PressEvent('pressend', pointerType, originalEvent);
132 onPressEnd(event);
133 shouldStopPropagation = event.shouldStopPropagation;
134 }
135 if (onPressChange) onPressChange(false);
136 setPressed(false);
137 if (onPress && wasPressed && !isDisabled) {
138 let event = new $0294ea432cd92340$var$PressEvent('press', pointerType, originalEvent);
139 onPress(event);
140 shouldStopPropagation && (shouldStopPropagation = event.shouldStopPropagation);
141 }
142 state.isTriggeringEvent = false;
143 return shouldStopPropagation;
144 });
145 let triggerPressUp = (0, $bBqCQ$reactariautils.useEffectEvent)((originalEvent, pointerType)=>{
146 let state = ref.current;
147 if (isDisabled) return false;
148 if (onPressUp) {
149 state.isTriggeringEvent = true;
150 let event = new $0294ea432cd92340$var$PressEvent('pressup', pointerType, originalEvent);
151 onPressUp(event);
152 state.isTriggeringEvent = false;
153 return event.shouldStopPropagation;
154 }
155 return true;
156 });
157 let cancel = (0, $bBqCQ$reactariautils.useEffectEvent)((e)=>{
158 let state = ref.current;
159 if (state.isPressed && state.target) {
160 if (state.isOverTarget && state.pointerType != null) triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType, false);
161 state.isPressed = false;
162 state.isOverTarget = false;
163 state.activePointerId = null;
164 state.pointerType = null;
165 removeAllGlobalListeners();
166 if (!allowTextSelectionOnPress) (0, $f7e14e656343df57$exports.restoreTextSelection)(state.target);
167 }
168 });
169 let cancelOnPointerExit = (0, $bBqCQ$reactariautils.useEffectEvent)((e)=>{
170 if (shouldCancelOnPointerExit) cancel(e);
171 });
172 let pressProps = (0, $bBqCQ$react.useMemo)(()=>{
173 let state = ref.current;
174 let pressProps = {
175 onKeyDown (e) {
176 if ($0294ea432cd92340$var$isValidKeyboardEvent(e.nativeEvent, e.currentTarget) && e.currentTarget.contains(e.target)) {
177 var _state_metaKeyEvents;
178 if ($0294ea432cd92340$var$shouldPreventDefaultKeyboard(e.target, e.key)) e.preventDefault();
179 // If the event is repeating, it may have started on a different element
180 // after which focus moved to the current element. Ignore these events and
181 // only handle the first key down event.
182 let shouldStopPropagation = true;
183 if (!state.isPressed && !e.repeat) {
184 state.target = e.currentTarget;
185 state.isPressed = true;
186 shouldStopPropagation = triggerPressStart(e, 'keyboard');
187 // Focus may move before the key up event, so register the event on the document
188 // instead of the same element where the key down event occurred. Make it capturing so that it will trigger
189 // before stopPropagation from useKeyboard on a child element may happen and thus we can still call triggerPress for the parent element.
190 let originalTarget = e.currentTarget;
191 let pressUp = (e)=>{
192 if ($0294ea432cd92340$var$isValidKeyboardEvent(e, originalTarget) && !e.repeat && originalTarget.contains(e.target) && state.target) triggerPressUp($0294ea432cd92340$var$createEvent(state.target, e), 'keyboard');
193 };
194 addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'keyup', (0, $bBqCQ$reactariautils.chain)(pressUp, onKeyUp), true);
195 }
196 if (shouldStopPropagation) e.stopPropagation();
197 // Keep track of the keydown events that occur while the Meta (e.g. Command) key is held.
198 // macOS has a bug where keyup events are not fired while the Meta key is down.
199 // When the Meta key itself is released we will get an event for that, and we'll act as if
200 // all of these other keys were released as well.
201 // https://bugs.chromium.org/p/chromium/issues/detail?id=1393524
202 // https://bugs.webkit.org/show_bug.cgi?id=55291
203 // https://bugzilla.mozilla.org/show_bug.cgi?id=1299553
204 if (e.metaKey && (0, $bBqCQ$reactariautils.isMac)()) (_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.set(e.key, e.nativeEvent);
205 } else if (e.key === 'Meta') state.metaKeyEvents = new Map();
206 },
207 onClick (e) {
208 if (e && !e.currentTarget.contains(e.target)) return;
209 if (e && e.button === 0 && !state.isTriggeringEvent && !(0, $bBqCQ$reactariautils.openLink).isOpening) {
210 let shouldStopPropagation = true;
211 if (isDisabled) e.preventDefault();
212 // If triggered from a screen reader or by using element.click(),
213 // trigger as if it were a keyboard click.
214 if (!state.ignoreClickAfterPress && !state.ignoreEmulatedMouseEvents && !state.isPressed && (state.pointerType === 'virtual' || (0, $bBqCQ$reactariautils.isVirtualClick)(e.nativeEvent))) {
215 // Ensure the element receives focus (VoiceOver on iOS does not do this)
216 if (!isDisabled && !preventFocusOnPress) (0, $bBqCQ$reactariautils.focusWithoutScrolling)(e.currentTarget);
217 let stopPressStart = triggerPressStart(e, 'virtual');
218 let stopPressUp = triggerPressUp(e, 'virtual');
219 let stopPressEnd = triggerPressEnd(e, 'virtual');
220 shouldStopPropagation = stopPressStart && stopPressUp && stopPressEnd;
221 }
222 state.ignoreEmulatedMouseEvents = false;
223 state.ignoreClickAfterPress = false;
224 if (shouldStopPropagation) e.stopPropagation();
225 }
226 }
227 };
228 let onKeyUp = (e)=>{
229 var _state_metaKeyEvents;
230 if (state.isPressed && state.target && $0294ea432cd92340$var$isValidKeyboardEvent(e, state.target)) {
231 var _state_metaKeyEvents1;
232 if ($0294ea432cd92340$var$shouldPreventDefaultKeyboard(e.target, e.key)) e.preventDefault();
233 let target = e.target;
234 triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), 'keyboard', state.target.contains(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' && $0294ea432cd92340$var$isHTMLAnchorLink(state.target) && state.target.contains(target) && !e[$0294ea432cd92340$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[$0294ea432cd92340$var$LINK_CLICKED] = true;
243 (0, $bBqCQ$reactariautils.openLink)(state.target, e, false);
244 }
245 state.isPressed = false;
246 (_state_metaKeyEvents1 = state.metaKeyEvents) === null || _state_metaKeyEvents1 === void 0 ? void 0 : _state_metaKeyEvents1.delete(e.key);
247 } else if (e.key === 'Meta' && ((_state_metaKeyEvents = state.metaKeyEvents) === null || _state_metaKeyEvents === void 0 ? void 0 : _state_metaKeyEvents.size)) {
248 var _state_target;
249 // If we recorded keydown events that occurred while the Meta key was pressed,
250 // and those haven't received keyup events already, fire keyup events ourselves.
251 // See comment above for more info about the macOS bug causing this.
252 let events = state.metaKeyEvents;
253 state.metaKeyEvents = undefined;
254 for (let event of events.values())(_state_target = state.target) === null || _state_target === void 0 ? void 0 : _state_target.dispatchEvent(new KeyboardEvent('keyup', event));
255 }
256 };
257 if (typeof PointerEvent !== 'undefined') {
258 pressProps.onPointerDown = (e)=>{
259 // Only handle left clicks, and ignore events that bubbled through portals.
260 if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;
261 // iOS safari fires pointer events from VoiceOver with incorrect coordinates/target.
262 // Ignore and let the onClick handler take care of it instead.
263 // https://bugs.webkit.org/show_bug.cgi?id=222627
264 // https://bugs.webkit.org/show_bug.cgi?id=223202
265 if ((0, $bBqCQ$reactariautils.isVirtualPointerEvent)(e.nativeEvent)) {
266 state.pointerType = 'virtual';
267 return;
268 }
269 // Due to browser inconsistencies, especially on mobile browsers, we prevent
270 // default on pointer down and handle focusing the pressable element ourselves.
271 if ($0294ea432cd92340$var$shouldPreventDefaultDown(e.currentTarget)) e.preventDefault();
272 state.pointerType = e.pointerType;
273 let shouldStopPropagation = true;
274 if (!state.isPressed) {
275 state.isPressed = true;
276 state.isOverTarget = true;
277 state.activePointerId = e.pointerId;
278 state.target = e.currentTarget;
279 if (!isDisabled && !preventFocusOnPress) (0, $bBqCQ$reactariautils.focusWithoutScrolling)(e.currentTarget);
280 if (!allowTextSelectionOnPress) (0, $f7e14e656343df57$exports.disableTextSelection)(state.target);
281 shouldStopPropagation = triggerPressStart(e, state.pointerType);
282 addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'pointermove', onPointerMove, false);
283 addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'pointerup', onPointerUp, false);
284 addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'pointercancel', onPointerCancel, false);
285 }
286 if (shouldStopPropagation) e.stopPropagation();
287 };
288 pressProps.onMouseDown = (e)=>{
289 if (!e.currentTarget.contains(e.target)) return;
290 if (e.button === 0) {
291 // Chrome and Firefox on touch Windows devices require mouse down events
292 // to be canceled in addition to pointer events, or an extra asynchronous
293 // focus event will be fired.
294 if ($0294ea432cd92340$var$shouldPreventDefaultDown(e.currentTarget)) e.preventDefault();
295 e.stopPropagation();
296 }
297 };
298 pressProps.onPointerUp = (e)=>{
299 // iOS fires pointerup with zero width and height, so check the pointerType recorded during pointerdown.
300 if (!e.currentTarget.contains(e.target) || state.pointerType === 'virtual') return;
301 // Only handle left clicks
302 // Safari on iOS sometimes fires pointerup events, even
303 // when the touch isn't over the target, so double check.
304 if (e.button === 0 && $0294ea432cd92340$var$isOverTarget(e, e.currentTarget)) triggerPressUp(e, state.pointerType || e.pointerType);
305 };
306 // Safari on iOS < 13.2 does not implement pointerenter/pointerleave events correctly.
307 // Use pointer move events instead to implement our own hit testing.
308 // See https://bugs.webkit.org/show_bug.cgi?id=199803
309 let onPointerMove = (e)=>{
310 if (e.pointerId !== state.activePointerId) return;
311 if (state.target && $0294ea432cd92340$var$isOverTarget(e, state.target)) {
312 if (!state.isOverTarget && state.pointerType != null) {
313 state.isOverTarget = true;
314 triggerPressStart($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType);
315 }
316 } else if (state.target && state.isOverTarget && state.pointerType != null) {
317 state.isOverTarget = false;
318 triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType, false);
319 cancelOnPointerExit(e);
320 }
321 };
322 let onPointerUp = (e)=>{
323 if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
324 if ($0294ea432cd92340$var$isOverTarget(e, state.target) && state.pointerType != null) triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType);
325 else if (state.isOverTarget && state.pointerType != null) triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType, false);
326 state.isPressed = false;
327 state.isOverTarget = false;
328 state.activePointerId = null;
329 state.pointerType = null;
330 removeAllGlobalListeners();
331 if (!allowTextSelectionOnPress) (0, $f7e14e656343df57$exports.restoreTextSelection)(state.target);
332 // Prevent subsequent touchend event from triggering onClick on unrelated elements on Android. See below.
333 // Both 'touch' and 'pen' pointerTypes trigger onTouchEnd, but 'mouse' does not.
334 if ('ontouchend' in state.target && e.pointerType !== 'mouse') addGlobalListener(state.target, 'touchend', onTouchEnd, {
335 once: true
336 });
337 }
338 };
339 // This is a workaround for an Android Chrome/Firefox issue where click events are fired on an incorrect element
340 // if the original target is removed during onPointerUp (before onClick).
341 // https://github.com/adobe/react-spectrum/issues/1513
342 // https://issues.chromium.org/issues/40732224
343 // Note: this event must be registered directly on the element, not via React props in order to work.
344 // https://github.com/facebook/react/issues/9809
345 let onTouchEnd = (e)=>{
346 // Don't preventDefault if we actually want the default (e.g. submit/link click).
347 if ($0294ea432cd92340$var$shouldPreventDefaultUp(e.target)) e.preventDefault();
348 };
349 let onPointerCancel = (e)=>{
350 cancel(e);
351 };
352 pressProps.onDragStart = (e)=>{
353 if (!e.currentTarget.contains(e.target)) return;
354 // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.
355 cancel(e);
356 };
357 } else {
358 pressProps.onMouseDown = (e)=>{
359 // Only handle left clicks
360 if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;
361 // Due to browser inconsistencies, especially on mobile browsers, we prevent
362 // default on mouse down and handle focusing the pressable element ourselves.
363 if ($0294ea432cd92340$var$shouldPreventDefaultDown(e.currentTarget)) e.preventDefault();
364 if (state.ignoreEmulatedMouseEvents) {
365 e.stopPropagation();
366 return;
367 }
368 state.isPressed = true;
369 state.isOverTarget = true;
370 state.target = e.currentTarget;
371 state.pointerType = (0, $bBqCQ$reactariautils.isVirtualClick)(e.nativeEvent) ? 'virtual' : 'mouse';
372 if (!isDisabled && !preventFocusOnPress) (0, $bBqCQ$reactariautils.focusWithoutScrolling)(e.currentTarget);
373 let shouldStopPropagation = triggerPressStart(e, state.pointerType);
374 if (shouldStopPropagation) e.stopPropagation();
375 addGlobalListener((0, $bBqCQ$reactariautils.getOwnerDocument)(e.currentTarget), 'mouseup', onMouseUp, false);
376 };
377 pressProps.onMouseEnter = (e)=>{
378 if (!e.currentTarget.contains(e.target)) return;
379 let shouldStopPropagation = true;
380 if (state.isPressed && !state.ignoreEmulatedMouseEvents && state.pointerType != null) {
381 state.isOverTarget = true;
382 shouldStopPropagation = triggerPressStart(e, state.pointerType);
383 }
384 if (shouldStopPropagation) e.stopPropagation();
385 };
386 pressProps.onMouseLeave = (e)=>{
387 if (!e.currentTarget.contains(e.target)) return;
388 let shouldStopPropagation = true;
389 if (state.isPressed && !state.ignoreEmulatedMouseEvents && state.pointerType != null) {
390 state.isOverTarget = false;
391 shouldStopPropagation = triggerPressEnd(e, state.pointerType, false);
392 cancelOnPointerExit(e);
393 }
394 if (shouldStopPropagation) e.stopPropagation();
395 };
396 pressProps.onMouseUp = (e)=>{
397 if (!e.currentTarget.contains(e.target)) return;
398 if (!state.ignoreEmulatedMouseEvents && e.button === 0) triggerPressUp(e, state.pointerType || 'mouse');
399 };
400 let onMouseUp = (e)=>{
401 // Only handle left clicks
402 if (e.button !== 0) return;
403 state.isPressed = false;
404 removeAllGlobalListeners();
405 if (state.ignoreEmulatedMouseEvents) {
406 state.ignoreEmulatedMouseEvents = false;
407 return;
408 }
409 if (state.target && $0294ea432cd92340$var$isOverTarget(e, state.target) && state.pointerType != null) triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType);
410 else if (state.target && state.isOverTarget && state.pointerType != null) triggerPressEnd($0294ea432cd92340$var$createEvent(state.target, e), state.pointerType, false);
411 state.isOverTarget = false;
412 };
413 pressProps.onTouchStart = (e)=>{
414 if (!e.currentTarget.contains(e.target)) return;
415 let touch = $0294ea432cd92340$var$getTouchFromEvent(e.nativeEvent);
416 if (!touch) return;
417 state.activePointerId = touch.identifier;
418 state.ignoreEmulatedMouseEvents = true;
419 state.isOverTarget = true;
420 state.isPressed = true;
421 state.target = e.currentTarget;
422 state.pointerType = 'touch';
423 // Due to browser inconsistencies, especially on mobile browsers, we prevent default
424 // on the emulated mouse event and handle focusing the pressable element ourselves.
425 if (!isDisabled && !preventFocusOnPress) (0, $bBqCQ$reactariautils.focusWithoutScrolling)(e.currentTarget);
426 if (!allowTextSelectionOnPress) (0, $f7e14e656343df57$exports.disableTextSelection)(state.target);
427 let shouldStopPropagation = triggerPressStart($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType);
428 if (shouldStopPropagation) e.stopPropagation();
429 addGlobalListener((0, $bBqCQ$reactariautils.getOwnerWindow)(e.currentTarget), 'scroll', onScroll, true);
430 };
431 pressProps.onTouchMove = (e)=>{
432 if (!e.currentTarget.contains(e.target)) return;
433 if (!state.isPressed) {
434 e.stopPropagation();
435 return;
436 }
437 let touch = $0294ea432cd92340$var$getTouchById(e.nativeEvent, state.activePointerId);
438 let shouldStopPropagation = true;
439 if (touch && $0294ea432cd92340$var$isOverTarget(touch, e.currentTarget)) {
440 if (!state.isOverTarget && state.pointerType != null) {
441 state.isOverTarget = true;
442 shouldStopPropagation = triggerPressStart($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType);
443 }
444 } else if (state.isOverTarget && state.pointerType != null) {
445 state.isOverTarget = false;
446 shouldStopPropagation = triggerPressEnd($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType, false);
447 cancelOnPointerExit($0294ea432cd92340$var$createTouchEvent(state.target, e));
448 }
449 if (shouldStopPropagation) e.stopPropagation();
450 };
451 pressProps.onTouchEnd = (e)=>{
452 if (!e.currentTarget.contains(e.target)) return;
453 if (!state.isPressed) {
454 e.stopPropagation();
455 return;
456 }
457 let touch = $0294ea432cd92340$var$getTouchById(e.nativeEvent, state.activePointerId);
458 let shouldStopPropagation = true;
459 if (touch && $0294ea432cd92340$var$isOverTarget(touch, e.currentTarget) && state.pointerType != null) {
460 triggerPressUp($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType);
461 shouldStopPropagation = triggerPressEnd($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType);
462 } else if (state.isOverTarget && state.pointerType != null) shouldStopPropagation = triggerPressEnd($0294ea432cd92340$var$createTouchEvent(state.target, e), state.pointerType, false);
463 if (shouldStopPropagation) e.stopPropagation();
464 state.isPressed = false;
465 state.activePointerId = null;
466 state.isOverTarget = false;
467 state.ignoreEmulatedMouseEvents = true;
468 if (state.target && !allowTextSelectionOnPress) (0, $f7e14e656343df57$exports.restoreTextSelection)(state.target);
469 removeAllGlobalListeners();
470 };
471 pressProps.onTouchCancel = (e)=>{
472 if (!e.currentTarget.contains(e.target)) return;
473 e.stopPropagation();
474 if (state.isPressed) cancel($0294ea432cd92340$var$createTouchEvent(state.target, e));
475 };
476 let onScroll = (e)=>{
477 if (state.isPressed && e.target.contains(state.target)) cancel({
478 currentTarget: state.target,
479 shiftKey: false,
480 ctrlKey: false,
481 metaKey: false,
482 altKey: false
483 });
484 };
485 pressProps.onDragStart = (e)=>{
486 if (!e.currentTarget.contains(e.target)) return;
487 cancel(e);
488 };
489 }
490 return pressProps;
491 }, [
492 addGlobalListener,
493 isDisabled,
494 preventFocusOnPress,
495 removeAllGlobalListeners,
496 allowTextSelectionOnPress,
497 cancel,
498 cancelOnPointerExit,
499 triggerPressEnd,
500 triggerPressStart,
501 triggerPressUp
502 ]);
503 // Remove user-select: none in case component unmounts immediately after pressStart
504 // eslint-disable-next-line arrow-body-style
505 (0, $bBqCQ$react.useEffect)(()=>{
506 return ()=>{
507 var _ref_current_target;
508 if (!allowTextSelectionOnPress) // eslint-disable-next-line react-hooks/exhaustive-deps
509 (0, $f7e14e656343df57$exports.restoreTextSelection)((_ref_current_target = ref.current.target) !== null && _ref_current_target !== void 0 ? _ref_current_target : undefined);
510 };
511 }, [
512 allowTextSelectionOnPress
513 ]);
514 return {
515 isPressed: isPressedProp || isPressed,
516 pressProps: (0, $bBqCQ$reactariautils.mergeProps)(domProps, pressProps)
517 };
518}
519function $0294ea432cd92340$var$isHTMLAnchorLink(target) {
520 return target.tagName === 'A' && target.hasAttribute('href');
521}
522function $0294ea432cd92340$var$isValidKeyboardEvent(event, currentTarget) {
523 const { key: key, code: code } = event;
524 const element = currentTarget;
525 const role = element.getAttribute('role');
526 // Accessibility for keyboards. Space and Enter only.
527 // "Spacebar" is for IE 11
528 return (key === 'Enter' || key === ' ' || key === 'Spacebar' || code === 'Space') && !(element instanceof (0, $bBqCQ$reactariautils.getOwnerWindow)(element).HTMLInputElement && !$0294ea432cd92340$var$isValidInputKey(element, key) || element instanceof (0, $bBqCQ$reactariautils.getOwnerWindow)(element).HTMLTextAreaElement || element.isContentEditable) && // Links should only trigger with Enter key
529 !((role === 'link' || !role && $0294ea432cd92340$var$isHTMLAnchorLink(element)) && key !== 'Enter');
530}
531function $0294ea432cd92340$var$getTouchFromEvent(event) {
532 const { targetTouches: targetTouches } = event;
533 if (targetTouches.length > 0) return targetTouches[0];
534 return null;
535}
536function $0294ea432cd92340$var$getTouchById(event, pointerId) {
537 const changedTouches = event.changedTouches;
538 for(let i = 0; i < changedTouches.length; i++){
539 const touch = changedTouches[i];
540 if (touch.identifier === pointerId) return touch;
541 }
542 return null;
543}
544function $0294ea432cd92340$var$createTouchEvent(target, e) {
545 let clientX = 0;
546 let clientY = 0;
547 if (e.targetTouches && e.targetTouches.length === 1) {
548 clientX = e.targetTouches[0].clientX;
549 clientY = e.targetTouches[0].clientY;
550 }
551 return {
552 currentTarget: target,
553 shiftKey: e.shiftKey,
554 ctrlKey: e.ctrlKey,
555 metaKey: e.metaKey,
556 altKey: e.altKey,
557 clientX: clientX,
558 clientY: clientY
559 };
560}
561function $0294ea432cd92340$var$createEvent(target, e) {
562 let clientX = e.clientX;
563 let clientY = e.clientY;
564 return {
565 currentTarget: target,
566 shiftKey: e.shiftKey,
567 ctrlKey: e.ctrlKey,
568 metaKey: e.metaKey,
569 altKey: e.altKey,
570 clientX: clientX,
571 clientY: clientY
572 };
573}
574function $0294ea432cd92340$var$getPointClientRect(point) {
575 let offsetX = 0;
576 let offsetY = 0;
577 if (point.width !== undefined) offsetX = point.width / 2;
578 else if (point.radiusX !== undefined) offsetX = point.radiusX;
579 if (point.height !== undefined) offsetY = point.height / 2;
580 else if (point.radiusY !== undefined) offsetY = point.radiusY;
581 return {
582 top: point.clientY - offsetY,
583 right: point.clientX + offsetX,
584 bottom: point.clientY + offsetY,
585 left: point.clientX - offsetX
586 };
587}
588function $0294ea432cd92340$var$areRectanglesOverlapping(a, b) {
589 // check if they cannot overlap on x axis
590 if (a.left > b.right || b.left > a.right) return false;
591 // check if they cannot overlap on y axis
592 if (a.top > b.bottom || b.top > a.bottom) return false;
593 return true;
594}
595function $0294ea432cd92340$var$isOverTarget(point, target) {
596 let rect = target.getBoundingClientRect();
597 let pointRect = $0294ea432cd92340$var$getPointClientRect(point);
598 return $0294ea432cd92340$var$areRectanglesOverlapping(rect, pointRect);
599}
600function $0294ea432cd92340$var$shouldPreventDefaultDown(target) {
601 // We cannot prevent default if the target is a draggable element.
602 return !(target instanceof HTMLElement) || !target.hasAttribute('draggable');
603}
604function $0294ea432cd92340$var$shouldPreventDefaultUp(target) {
605 if (target instanceof HTMLInputElement) return false;
606 if (target instanceof HTMLButtonElement) return target.type !== 'submit' && target.type !== 'reset';
607 if ($0294ea432cd92340$var$isHTMLAnchorLink(target)) return false;
608 return true;
609}
610function $0294ea432cd92340$var$shouldPreventDefaultKeyboard(target, key) {
611 if (target instanceof HTMLInputElement) return !$0294ea432cd92340$var$isValidInputKey(target, key);
612 return $0294ea432cd92340$var$shouldPreventDefaultUp(target);
613}
614const $0294ea432cd92340$var$nonTextInputTypes = new Set([
615 'checkbox',
616 'radio',
617 'range',
618 'color',
619 'file',
620 'image',
621 'button',
622 'submit',
623 'reset'
624]);
625function $0294ea432cd92340$var$isValidInputKey(target, key) {
626 // Only space should toggle checkboxes and radios, not enter.
627 return target.type === 'checkbox' || target.type === 'radio' ? key === ' ' : $0294ea432cd92340$var$nonTextInputTypes.has(target.type);
628}
629
630
631//# sourceMappingURL=usePress.main.js.map