UNPKG

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