@react-aria/interactions 3.5.1 → 3.8.1

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/module.js CHANGED
@@ -1,1738 +1,1365 @@
1
- import _react, { useContext, useEffect, useMemo, useRef, useState, useCallback } from "react";
2
- import { mergeProps, runAfterTransition, focusWithoutScrolling, useGlobalListeners, useSyncRef, isMac } from "@react-aria/utils";
3
- import _babelRuntimeHelpersEsmObjectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import _babelRuntimeHelpersEsmExtends from "@babel/runtime/helpers/esm/extends";
5
- let $e17c9db826984f8ab8e5d837bf0b8$var$state = 'default';
6
- let $e17c9db826984f8ab8e5d837bf0b8$var$savedUserSelect = '';
7
-
8
- function $e17c9db826984f8ab8e5d837bf0b8$export$disableTextSelection() {
9
- if ($e17c9db826984f8ab8e5d837bf0b8$var$state === 'default') {
10
- $e17c9db826984f8ab8e5d837bf0b8$var$savedUserSelect = document.documentElement.style.webkitUserSelect;
11
- document.documentElement.style.webkitUserSelect = 'none';
12
- }
13
-
14
- $e17c9db826984f8ab8e5d837bf0b8$var$state = 'disabled';
15
- }
16
-
17
- function $e17c9db826984f8ab8e5d837bf0b8$export$restoreTextSelection() {
18
- // If the state is already default, there's nothing to do.
19
- // If it is restoring, then there's no need to queue a second restore.
20
- if ($e17c9db826984f8ab8e5d837bf0b8$var$state !== 'disabled') {
21
- return;
22
- }
23
-
24
- $e17c9db826984f8ab8e5d837bf0b8$var$state = 'restoring'; // There appears to be a delay on iOS where selection still might occur
25
- // after pointer up, so wait a bit before removing user-select.
26
-
27
- setTimeout(() => {
28
- // Wait for any CSS transitions to complete so we don't recompute style
29
- // for the whole page in the middle of the animation and cause jank.
30
- runAfterTransition(() => {
31
- // Avoid race conditions
32
- if ($e17c9db826984f8ab8e5d837bf0b8$var$state === 'restoring') {
33
- if (document.documentElement.style.webkitUserSelect === 'none') {
34
- document.documentElement.style.webkitUserSelect = $e17c9db826984f8ab8e5d837bf0b8$var$savedUserSelect || '';
35
- }
1
+ import {mergeProps as $d6MJ8$mergeProps, useSyncRef as $d6MJ8$useSyncRef, useGlobalListeners as $d6MJ8$useGlobalListeners, focusWithoutScrolling as $d6MJ8$focusWithoutScrolling, isIOS as $d6MJ8$isIOS, runAfterTransition as $d6MJ8$runAfterTransition, isMac as $d6MJ8$isMac, useEvent as $d6MJ8$useEvent, useDescription as $d6MJ8$useDescription} from "@react-aria/utils";
2
+ import $d6MJ8$react, {useRef as $d6MJ8$useRef, useContext as $d6MJ8$useContext, useState as $d6MJ8$useState, useMemo as $d6MJ8$useMemo, useEffect as $d6MJ8$useEffect, useCallback as $d6MJ8$useCallback} from "react";
36
3
 
37
- $e17c9db826984f8ab8e5d837bf0b8$var$savedUserSelect = '';
38
- $e17c9db826984f8ab8e5d837bf0b8$var$state = 'default';
39
- }
40
- });
41
- }, 300);
4
+ function $parcel$export(e, n, v, s) {
5
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
42
6
  }
7
+ var $28aa772934c24805$exports = {};
43
8
 
44
- /*
45
- * Copyright 2020 Adobe. All rights reserved.
46
- * This file is licensed to you under the Apache License, Version 2.0 (the "License");
47
- * you may not use this file except in compliance with the License. You may obtain a copy
48
- * of the License at http://www.apache.org/licenses/LICENSE-2.0
49
- *
50
- * Unless required by applicable law or agreed to in writing, software distributed under
51
- * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
52
- * OF ANY KIND, either express or implied. See the License for the specific language
53
- * governing permissions and limitations under the License.
54
- */
55
- // Original licensing for the following method can be found in the
56
- // NOTICE file in the root directory of this source tree.
57
- // See https://github.com/facebook/react/blob/3c713d513195a53788b3f8bb4b70279d68b15bcc/packages/react-interactions/events/src/dom/shared/index.js#L74-L87
58
- // Keyboards, Assistive Technologies, and element.click() all produce a "virtual"
59
- // click event. This is a method of inferring such clicks. Every browser except
60
- // IE 11 only sets a zero value of "detail" for click events that are "virtual".
61
- // However, IE 11 uses a zero value for all click events. For IE 11 we rely on
62
- // the quirk that it produces click events that are of type PointerEvent, and
63
- // where only the "virtual" click lacks a pointerType field.
64
- function $f67ef9f1b8ed09b4b00fd0840cd8b94b$export$isVirtualClick(event) {
65
- // JAWS/NVDA with Firefox.
66
- if (event.mozInputSource === 0 && event.isTrusted) {
67
- return true;
68
- }
9
+ $parcel$export($28aa772934c24805$exports, "Pressable", () => $28aa772934c24805$export$27c701ed9e449e99);
69
10
 
70
- return event.detail === 0 && !event.pointerType;
71
- }
11
+ var $b468497b34dcb8dd$exports = {};
72
12
 
73
- const $a3ff51240de6f955c79cf17a88e349$export$PressResponderContext = /*#__PURE__*/_react.createContext(null);
13
+ $parcel$export($b468497b34dcb8dd$exports, "usePress", () => $b468497b34dcb8dd$export$45712eceda6fad21);
74
14
 
75
- $a3ff51240de6f955c79cf17a88e349$export$PressResponderContext.displayName = 'PressResponderContext';
15
+ // Note that state only matters here for iOS. Non-iOS gets user-select: none applied to the target element
16
+ // rather than at the document level so we just need to apply/remove user-select: none for each pressed element individually
17
+ let $cd0dbdeabf637843$var$state = 'default';
18
+ let $cd0dbdeabf637843$var$savedUserSelect = '';
19
+ let $cd0dbdeabf637843$var$modifiedElementMap = new WeakMap();
20
+ function $cd0dbdeabf637843$export$16a4697467175487(target) {
21
+ if ($d6MJ8$isIOS()) {
22
+ if ($cd0dbdeabf637843$var$state === 'default') {
23
+ $cd0dbdeabf637843$var$savedUserSelect = document.documentElement.style.webkitUserSelect;
24
+ document.documentElement.style.webkitUserSelect = 'none';
25
+ }
26
+ $cd0dbdeabf637843$var$state = 'disabled';
27
+ } else if (target) {
28
+ // If not iOS, store the target's original user-select and change to user-select: none
29
+ // Ignore state since it doesn't apply for non iOS
30
+ $cd0dbdeabf637843$var$modifiedElementMap.set(target, target.style.userSelect);
31
+ target.style.userSelect = 'none';
32
+ }
33
+ }
34
+ function $cd0dbdeabf637843$export$b0d6fa1ab32e3295(target) {
35
+ if ($d6MJ8$isIOS()) {
36
+ // If the state is already default, there's nothing to do.
37
+ // If it is restoring, then there's no need to queue a second restore.
38
+ if ($cd0dbdeabf637843$var$state !== 'disabled') return;
39
+ $cd0dbdeabf637843$var$state = 'restoring';
40
+ // There appears to be a delay on iOS where selection still might occur
41
+ // after pointer up, so wait a bit before removing user-select.
42
+ setTimeout(()=>{
43
+ // Wait for any CSS transitions to complete so we don't recompute style
44
+ // for the whole page in the middle of the animation and cause jank.
45
+ $d6MJ8$runAfterTransition(()=>{
46
+ // Avoid race conditions
47
+ if ($cd0dbdeabf637843$var$state === 'restoring') {
48
+ if (document.documentElement.style.webkitUserSelect === 'none') document.documentElement.style.webkitUserSelect = $cd0dbdeabf637843$var$savedUserSelect || '';
49
+ $cd0dbdeabf637843$var$savedUserSelect = '';
50
+ $cd0dbdeabf637843$var$state = 'default';
51
+ }
52
+ });
53
+ }, 300);
54
+ } else // If not iOS, restore the target's original user-select if any
55
+ // Ignore state since it doesn't apply for non iOS
56
+ if (target && $cd0dbdeabf637843$var$modifiedElementMap.has(target)) {
57
+ let targetOldUserSelect = $cd0dbdeabf637843$var$modifiedElementMap.get(target);
58
+ if (target.style.userSelect === 'none') target.style.userSelect = targetOldUserSelect;
59
+ if (target.getAttribute('style') === '') target.removeAttribute('style');
60
+ $cd0dbdeabf637843$var$modifiedElementMap.delete(target);
61
+ }
62
+ }
76
63
 
77
- function $ffc54430b1dbeee65879852feaaff07d$var$usePressResponderContext(props) {
78
- // Consume context from <PressResponder> and merge with props.
79
- let context = useContext($a3ff51240de6f955c79cf17a88e349$export$PressResponderContext);
80
64
 
81
- if (context) {
82
- let {
83
- register
84
- } = context,
85
- contextProps = _babelRuntimeHelpersEsmObjectWithoutPropertiesLoose(context, ["register"]);
86
65
 
87
- props = mergeProps(contextProps, props);
88
- register();
89
- }
90
66
 
91
- useSyncRef(context, props.ref);
92
- return props;
67
+ function $3004588ac0f775f8$export$60278871457622de(event) {
68
+ // JAWS/NVDA with Firefox.
69
+ if (event.mozInputSource === 0 && event.isTrusted) return true;
70
+ return event.detail === 0 && !event.pointerType;
93
71
  }
94
- /**
95
- * Handles press interactions across mouse, touch, keyboard, and screen readers.
96
- * It normalizes behavior across browsers and platforms, and handles many nuances
97
- * of dealing with pointer and keyboard events.
98
- */
99
-
100
-
101
- export function usePress(props) {
102
- let _usePressResponderCon = $ffc54430b1dbeee65879852feaaff07d$var$usePressResponderContext(props),
103
- {
104
- onPress,
105
- onPressChange,
106
- onPressStart,
107
- onPressEnd,
108
- onPressUp,
109
- isDisabled,
110
- isPressed: isPressedProp,
111
- preventFocusOnPress
112
- } = _usePressResponderCon,
113
- domProps = _babelRuntimeHelpersEsmObjectWithoutPropertiesLoose(_usePressResponderCon, ["onPress", "onPressChange", "onPressStart", "onPressEnd", "onPressUp", "isDisabled", "isPressed", "preventFocusOnPress", "ref"]);
114
-
115
- let propsRef = useRef(null);
116
- propsRef.current = {
117
- onPress,
118
- onPressChange,
119
- onPressStart,
120
- onPressEnd,
121
- onPressUp,
122
- isDisabled
123
- };
124
- let [isPressed, setPressed] = useState(false);
125
- let ref = useRef({
126
- isPressed: false,
127
- ignoreEmulatedMouseEvents: false,
128
- ignoreClickAfterPress: false,
129
- didFirePressStart: false,
130
- activePointerId: null,
131
- target: null,
132
- isOverTarget: false,
133
- pointerType: null
134
- });
135
- let {
136
- addGlobalListener,
137
- removeAllGlobalListeners
138
- } = useGlobalListeners();
139
- let pressProps = useMemo(() => {
140
- let state = ref.current;
141
-
142
- let triggerPressStart = (originalEvent, pointerType) => {
143
- let {
144
- onPressStart,
145
- onPressChange,
146
- isDisabled
147
- } = propsRef.current;
148
-
149
- if (isDisabled || state.didFirePressStart) {
150
- return;
151
- }
152
-
153
- if (onPressStart) {
154
- onPressStart({
155
- type: 'pressstart',
156
- pointerType,
157
- target: originalEvent.currentTarget,
158
- shiftKey: originalEvent.shiftKey,
159
- metaKey: originalEvent.metaKey,
160
- ctrlKey: originalEvent.ctrlKey
161
- });
162
- }
163
72
 
164
- if (onPressChange) {
165
- onPressChange(true);
166
- }
167
73
 
168
- state.didFirePressStart = true;
169
- setPressed(true);
170
- };
171
74
 
172
- let triggerPressEnd = function triggerPressEnd(originalEvent, pointerType, wasPressed) {
173
- if (wasPressed === void 0) {
174
- wasPressed = true;
175
- }
75
+ const $8e24aea97df378f7$export$5165eccb35aaadb5 = $d6MJ8$react.createContext(null);
76
+ $8e24aea97df378f7$export$5165eccb35aaadb5.displayName = 'PressResponderContext';
176
77
 
177
- let {
178
- onPressEnd,
179
- onPressChange,
180
- onPress,
181
- isDisabled
182
- } = propsRef.current;
183
-
184
- if (!state.didFirePressStart) {
185
- return;
186
- }
187
-
188
- state.ignoreClickAfterPress = true;
189
- state.didFirePressStart = false;
190
-
191
- if (onPressEnd) {
192
- onPressEnd({
193
- type: 'pressend',
194
- pointerType,
195
- target: originalEvent.currentTarget,
196
- shiftKey: originalEvent.shiftKey,
197
- metaKey: originalEvent.metaKey,
198
- ctrlKey: originalEvent.ctrlKey
199
- });
200
- }
201
-
202
- if (onPressChange) {
203
- onPressChange(false);
204
- }
205
-
206
- setPressed(false);
207
-
208
- if (onPress && wasPressed && !isDisabled) {
209
- onPress({
210
- type: 'press',
211
- pointerType,
212
- target: originalEvent.currentTarget,
213
- shiftKey: originalEvent.shiftKey,
214
- metaKey: originalEvent.metaKey,
215
- ctrlKey: originalEvent.ctrlKey
216
- });
217
- }
218
- };
219
78
 
220
- let triggerPressUp = (originalEvent, pointerType) => {
221
- let {
222
- onPressUp,
223
- isDisabled
224
- } = propsRef.current;
225
-
226
- if (isDisabled) {
227
- return;
228
- }
229
-
230
- if (onPressUp) {
231
- onPressUp({
232
- type: 'pressup',
233
- pointerType,
234
- target: originalEvent.currentTarget,
235
- shiftKey: originalEvent.shiftKey,
236
- metaKey: originalEvent.metaKey,
237
- ctrlKey: originalEvent.ctrlKey
238
- });
239
- }
240
- };
241
-
242
- let cancel = e => {
243
- if (state.isPressed) {
244
- if (state.isOverTarget) {
245
- triggerPressEnd($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), state.pointerType, false);
246
- }
247
-
248
- state.isPressed = false;
249
- state.isOverTarget = false;
250
- state.activePointerId = null;
251
- state.pointerType = null;
252
- removeAllGlobalListeners();
253
- $e17c9db826984f8ab8e5d837bf0b8$export$restoreTextSelection();
254
- }
79
+ function $b468497b34dcb8dd$var$usePressResponderContext(props) {
80
+ // Consume context from <PressResponder> and merge with props.
81
+ let context = $d6MJ8$useContext($8e24aea97df378f7$export$5165eccb35aaadb5);
82
+ if (context) {
83
+ let { register: register , ...contextProps } = context;
84
+ props = $d6MJ8$mergeProps(contextProps, props);
85
+ register();
86
+ }
87
+ $d6MJ8$useSyncRef(context, props.ref);
88
+ return props;
89
+ }
90
+ function $b468497b34dcb8dd$export$45712eceda6fad21(props) {
91
+ let { onPress: onPress1 , onPressChange: onPressChange1 , onPressStart: onPressStart1 , onPressEnd: onPressEnd1 , onPressUp: onPressUp1 , isDisabled: isDisabled1 , isPressed: isPressedProp , preventFocusOnPress: preventFocusOnPress , shouldCancelOnPointerExit: shouldCancelOnPointerExit , allowTextSelectionOnPress: allowTextSelectionOnPress , // eslint-disable-next-line @typescript-eslint/no-unused-vars
92
+ ref: _ , ...domProps } = $b468497b34dcb8dd$var$usePressResponderContext(props);
93
+ let propsRef = $d6MJ8$useRef(null);
94
+ propsRef.current = {
95
+ onPress: onPress1,
96
+ onPressChange: onPressChange1,
97
+ onPressStart: onPressStart1,
98
+ onPressEnd: onPressEnd1,
99
+ onPressUp: onPressUp1,
100
+ isDisabled: isDisabled1,
101
+ shouldCancelOnPointerExit: shouldCancelOnPointerExit
255
102
  };
256
-
257
- let pressProps = {
258
- onKeyDown(e) {
259
- if ($ffc54430b1dbeee65879852feaaff07d$var$isValidKeyboardEvent(e.nativeEvent) && e.currentTarget.contains(e.target)) {
260
- e.preventDefault();
261
- e.stopPropagation(); // If the event is repeating, it may have started on a different element
262
- // after which focus moved to the current element. Ignore these events and
263
- // only handle the first key down event.
264
-
265
- if (!state.isPressed && !e.repeat) {
266
- state.target = e.currentTarget;
267
- state.isPressed = true;
268
- triggerPressStart(e, 'keyboard'); // Focus may move before the key up event, so register the event on the document
269
- // instead of the same element where the key down event occurred.
270
-
271
- addGlobalListener(document, 'keyup', onKeyUp, false);
272
- }
273
- }
274
- },
275
-
276
- onKeyUp(e) {
277
- if ($ffc54430b1dbeee65879852feaaff07d$var$isValidKeyboardEvent(e.nativeEvent) && !e.repeat && e.currentTarget.contains(e.target)) {
278
- triggerPressUp($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), 'keyboard');
279
- }
280
- },
281
-
282
- onClick(e) {
283
- if (e && !e.currentTarget.contains(e.target)) {
284
- return;
285
- }
286
-
287
- if (e && e.button === 0) {
288
- e.stopPropagation();
289
-
290
- if (isDisabled) {
291
- e.preventDefault();
292
- } // If triggered from a screen reader or by using element.click(),
293
- // trigger as if it were a keyboard click.
294
-
295
-
296
- if (!state.ignoreClickAfterPress && !state.ignoreEmulatedMouseEvents && $f67ef9f1b8ed09b4b00fd0840cd8b94b$export$isVirtualClick(e.nativeEvent)) {
297
- // Ensure the element receives focus (VoiceOver on iOS does not do this)
298
- if (!isDisabled && !preventFocusOnPress) {
299
- focusWithoutScrolling(e.currentTarget);
103
+ let [isPressed, setPressed] = $d6MJ8$useState(false);
104
+ let ref = $d6MJ8$useRef({
105
+ isPressed: false,
106
+ ignoreEmulatedMouseEvents: false,
107
+ ignoreClickAfterPress: false,
108
+ didFirePressStart: false,
109
+ activePointerId: null,
110
+ target: null,
111
+ isOverTarget: false,
112
+ pointerType: null
113
+ });
114
+ let { addGlobalListener: addGlobalListener , removeAllGlobalListeners: removeAllGlobalListeners } = $d6MJ8$useGlobalListeners();
115
+ let pressProps1 = $d6MJ8$useMemo(()=>{
116
+ let state = ref.current;
117
+ let triggerPressStart = (originalEvent, pointerType)=>{
118
+ let { onPressStart: onPressStart , onPressChange: onPressChange , isDisabled: isDisabled } = propsRef.current;
119
+ if (isDisabled || state.didFirePressStart) return;
120
+ if (onPressStart) onPressStart({
121
+ type: 'pressstart',
122
+ pointerType: pointerType,
123
+ target: originalEvent.currentTarget,
124
+ shiftKey: originalEvent.shiftKey,
125
+ metaKey: originalEvent.metaKey,
126
+ ctrlKey: originalEvent.ctrlKey,
127
+ altKey: originalEvent.altKey
128
+ });
129
+ if (onPressChange) onPressChange(true);
130
+ state.didFirePressStart = true;
131
+ setPressed(true);
132
+ };
133
+ let triggerPressEnd = (originalEvent, pointerType, wasPressed = true)=>{
134
+ let { onPressEnd: onPressEnd , onPressChange: onPressChange , onPress: onPress , isDisabled: isDisabled } = propsRef.current;
135
+ if (!state.didFirePressStart) return;
136
+ state.ignoreClickAfterPress = true;
137
+ state.didFirePressStart = false;
138
+ if (onPressEnd) onPressEnd({
139
+ type: 'pressend',
140
+ pointerType: pointerType,
141
+ target: originalEvent.currentTarget,
142
+ shiftKey: originalEvent.shiftKey,
143
+ metaKey: originalEvent.metaKey,
144
+ ctrlKey: originalEvent.ctrlKey,
145
+ altKey: originalEvent.altKey
146
+ });
147
+ if (onPressChange) onPressChange(false);
148
+ setPressed(false);
149
+ if (onPress && wasPressed && !isDisabled) onPress({
150
+ type: 'press',
151
+ pointerType: pointerType,
152
+ target: originalEvent.currentTarget,
153
+ shiftKey: originalEvent.shiftKey,
154
+ metaKey: originalEvent.metaKey,
155
+ ctrlKey: originalEvent.ctrlKey,
156
+ altKey: originalEvent.altKey
157
+ });
158
+ };
159
+ let triggerPressUp = (originalEvent, pointerType)=>{
160
+ let { onPressUp: onPressUp , isDisabled: isDisabled } = propsRef.current;
161
+ if (isDisabled) return;
162
+ if (onPressUp) onPressUp({
163
+ type: 'pressup',
164
+ pointerType: pointerType,
165
+ target: originalEvent.currentTarget,
166
+ shiftKey: originalEvent.shiftKey,
167
+ metaKey: originalEvent.metaKey,
168
+ ctrlKey: originalEvent.ctrlKey,
169
+ altKey: originalEvent.altKey
170
+ });
171
+ };
172
+ let cancel = (e)=>{
173
+ if (state.isPressed) {
174
+ if (state.isOverTarget) triggerPressEnd($b468497b34dcb8dd$var$createEvent(state.target, e), state.pointerType, false);
175
+ state.isPressed = false;
176
+ state.isOverTarget = false;
177
+ state.activePointerId = null;
178
+ state.pointerType = null;
179
+ removeAllGlobalListeners();
180
+ if (!allowTextSelectionOnPress) $cd0dbdeabf637843$export$b0d6fa1ab32e3295(state.target);
300
181
  }
301
-
302
- triggerPressStart(e, 'virtual');
303
- triggerPressUp(e, 'virtual');
304
- triggerPressEnd(e, 'virtual');
305
- }
306
-
307
- state.ignoreEmulatedMouseEvents = false;
308
- state.ignoreClickAfterPress = false;
309
- }
310
- }
311
-
312
- };
313
-
314
- let onKeyUp = e => {
315
- if (state.isPressed && $ffc54430b1dbeee65879852feaaff07d$var$isValidKeyboardEvent(e)) {
316
- e.preventDefault();
317
- e.stopPropagation();
318
- state.isPressed = false;
319
- triggerPressEnd($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), 'keyboard', e.target === state.target);
320
- removeAllGlobalListeners(); // If the target is a link, trigger the click method to open the URL,
321
- // but defer triggering pressEnd until onClick event handler.
322
-
323
- if (e.target === state.target && $ffc54430b1dbeee65879852feaaff07d$var$isHTMLAnchorLink(state.target) || state.target.getAttribute('role') === 'link') {
324
- state.target.click();
182
+ };
183
+ let pressProps = {
184
+ onKeyDown (e) {
185
+ if ($b468497b34dcb8dd$var$isValidKeyboardEvent(e.nativeEvent) && e.currentTarget.contains(e.target)) {
186
+ if ($b468497b34dcb8dd$var$shouldPreventDefaultKeyboard(e.target)) e.preventDefault();
187
+ e.stopPropagation();
188
+ // If the event is repeating, it may have started on a different element
189
+ // after which focus moved to the current element. Ignore these events and
190
+ // only handle the first key down event.
191
+ if (!state.isPressed && !e.repeat) {
192
+ state.target = e.currentTarget;
193
+ state.isPressed = true;
194
+ triggerPressStart(e, 'keyboard');
195
+ // Focus may move before the key up event, so register the event on the document
196
+ // instead of the same element where the key down event occurred.
197
+ addGlobalListener(document, 'keyup', onKeyUp, false);
198
+ }
199
+ }
200
+ },
201
+ onKeyUp (e) {
202
+ if ($b468497b34dcb8dd$var$isValidKeyboardEvent(e.nativeEvent) && !e.repeat && e.currentTarget.contains(e.target)) triggerPressUp($b468497b34dcb8dd$var$createEvent(state.target, e), 'keyboard');
203
+ },
204
+ onClick (e) {
205
+ if (e && !e.currentTarget.contains(e.target)) return;
206
+ if (e && e.button === 0) {
207
+ e.stopPropagation();
208
+ if (isDisabled1) e.preventDefault();
209
+ // If triggered from a screen reader or by using element.click(),
210
+ // trigger as if it were a keyboard click.
211
+ if (!state.ignoreClickAfterPress && !state.ignoreEmulatedMouseEvents && (state.pointerType === 'virtual' || $3004588ac0f775f8$export$60278871457622de(e.nativeEvent))) {
212
+ // Ensure the element receives focus (VoiceOver on iOS does not do this)
213
+ if (!isDisabled1 && !preventFocusOnPress) $d6MJ8$focusWithoutScrolling(e.currentTarget);
214
+ triggerPressStart(e, 'virtual');
215
+ triggerPressUp(e, 'virtual');
216
+ triggerPressEnd(e, 'virtual');
217
+ }
218
+ state.ignoreEmulatedMouseEvents = false;
219
+ state.ignoreClickAfterPress = false;
220
+ }
221
+ }
222
+ };
223
+ let onKeyUp = (e)=>{
224
+ if (state.isPressed && $b468497b34dcb8dd$var$isValidKeyboardEvent(e)) {
225
+ if ($b468497b34dcb8dd$var$shouldPreventDefaultKeyboard(e.target)) e.preventDefault();
226
+ e.stopPropagation();
227
+ state.isPressed = false;
228
+ let target = e.target;
229
+ triggerPressEnd($b468497b34dcb8dd$var$createEvent(state.target, e), 'keyboard', state.target.contains(target));
230
+ removeAllGlobalListeners();
231
+ // If the target is a link, trigger the click method to open the URL,
232
+ // but defer triggering pressEnd until onClick event handler.
233
+ if (state.target.contains(target) && $b468497b34dcb8dd$var$isHTMLAnchorLink(state.target) || state.target.getAttribute('role') === 'link') state.target.click();
234
+ }
235
+ };
236
+ if (typeof PointerEvent !== 'undefined') {
237
+ pressProps.onPointerDown = (e)=>{
238
+ // Only handle left clicks, and ignore events that bubbled through portals.
239
+ if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;
240
+ // iOS safari fires pointer events from VoiceOver with incorrect coordinates/target.
241
+ // Ignore and let the onClick handler take care of it instead.
242
+ // https://bugs.webkit.org/show_bug.cgi?id=222627
243
+ // https://bugs.webkit.org/show_bug.cgi?id=223202
244
+ if ($b468497b34dcb8dd$var$isVirtualPointerEvent(e.nativeEvent)) {
245
+ state.pointerType = 'virtual';
246
+ return;
247
+ }
248
+ // Due to browser inconsistencies, especially on mobile browsers, we prevent
249
+ // default on pointer down and handle focusing the pressable element ourselves.
250
+ if ($b468497b34dcb8dd$var$shouldPreventDefault(e.target)) e.preventDefault();
251
+ state.pointerType = e.pointerType;
252
+ e.stopPropagation();
253
+ if (!state.isPressed) {
254
+ state.isPressed = true;
255
+ state.isOverTarget = true;
256
+ state.activePointerId = e.pointerId;
257
+ state.target = e.currentTarget;
258
+ if (!isDisabled1 && !preventFocusOnPress) $d6MJ8$focusWithoutScrolling(e.currentTarget);
259
+ if (!allowTextSelectionOnPress) $cd0dbdeabf637843$export$16a4697467175487(state.target);
260
+ triggerPressStart(e, state.pointerType);
261
+ addGlobalListener(document, 'pointermove', onPointerMove, false);
262
+ addGlobalListener(document, 'pointerup', onPointerUp, false);
263
+ addGlobalListener(document, 'pointercancel', onPointerCancel, false);
264
+ }
265
+ };
266
+ pressProps.onMouseDown = (e)=>{
267
+ if (!e.currentTarget.contains(e.target)) return;
268
+ if (e.button === 0) {
269
+ // Chrome and Firefox on touch Windows devices require mouse down events
270
+ // to be canceled in addition to pointer events, or an extra asynchronous
271
+ // focus event will be fired.
272
+ if ($b468497b34dcb8dd$var$shouldPreventDefault(e.target)) e.preventDefault();
273
+ e.stopPropagation();
274
+ }
275
+ };
276
+ pressProps.onPointerUp = (e)=>{
277
+ // iOS fires pointerup with zero width and height, so check the pointerType recorded during pointerdown.
278
+ if (!e.currentTarget.contains(e.target) || state.pointerType === 'virtual') return;
279
+ // Only handle left clicks
280
+ // Safari on iOS sometimes fires pointerup events, even
281
+ // when the touch isn't over the target, so double check.
282
+ if (e.button === 0 && $b468497b34dcb8dd$var$isOverTarget(e, e.currentTarget)) triggerPressUp(e, state.pointerType || e.pointerType);
283
+ };
284
+ // Safari on iOS < 13.2 does not implement pointerenter/pointerleave events correctly.
285
+ // Use pointer move events instead to implement our own hit testing.
286
+ // See https://bugs.webkit.org/show_bug.cgi?id=199803
287
+ let onPointerMove = (e)=>{
288
+ if (e.pointerId !== state.activePointerId) return;
289
+ if ($b468497b34dcb8dd$var$isOverTarget(e, state.target)) {
290
+ if (!state.isOverTarget) {
291
+ state.isOverTarget = true;
292
+ triggerPressStart($b468497b34dcb8dd$var$createEvent(state.target, e), state.pointerType);
293
+ }
294
+ } else if (state.isOverTarget) {
295
+ state.isOverTarget = false;
296
+ triggerPressEnd($b468497b34dcb8dd$var$createEvent(state.target, e), state.pointerType, false);
297
+ if (propsRef.current.shouldCancelOnPointerExit) cancel(e);
298
+ }
299
+ };
300
+ let onPointerUp = (e)=>{
301
+ if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0) {
302
+ if ($b468497b34dcb8dd$var$isOverTarget(e, state.target)) triggerPressEnd($b468497b34dcb8dd$var$createEvent(state.target, e), state.pointerType);
303
+ else if (state.isOverTarget) triggerPressEnd($b468497b34dcb8dd$var$createEvent(state.target, e), state.pointerType, false);
304
+ state.isPressed = false;
305
+ state.isOverTarget = false;
306
+ state.activePointerId = null;
307
+ state.pointerType = null;
308
+ removeAllGlobalListeners();
309
+ if (!allowTextSelectionOnPress) $cd0dbdeabf637843$export$b0d6fa1ab32e3295(state.target);
310
+ }
311
+ };
312
+ let onPointerCancel = (e)=>{
313
+ cancel(e);
314
+ };
315
+ pressProps.onDragStart = (e)=>{
316
+ if (!e.currentTarget.contains(e.target)) return;
317
+ // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.
318
+ cancel(e);
319
+ };
320
+ } else {
321
+ pressProps.onMouseDown = (e)=>{
322
+ // Only handle left clicks
323
+ if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;
324
+ // Due to browser inconsistencies, especially on mobile browsers, we prevent
325
+ // default on mouse down and handle focusing the pressable element ourselves.
326
+ if ($b468497b34dcb8dd$var$shouldPreventDefault(e.target)) e.preventDefault();
327
+ e.stopPropagation();
328
+ if (state.ignoreEmulatedMouseEvents) return;
329
+ state.isPressed = true;
330
+ state.isOverTarget = true;
331
+ state.target = e.currentTarget;
332
+ state.pointerType = $3004588ac0f775f8$export$60278871457622de(e.nativeEvent) ? 'virtual' : 'mouse';
333
+ if (!isDisabled1 && !preventFocusOnPress) $d6MJ8$focusWithoutScrolling(e.currentTarget);
334
+ triggerPressStart(e, state.pointerType);
335
+ addGlobalListener(document, 'mouseup', onMouseUp, false);
336
+ };
337
+ pressProps.onMouseEnter = (e)=>{
338
+ if (!e.currentTarget.contains(e.target)) return;
339
+ e.stopPropagation();
340
+ if (state.isPressed && !state.ignoreEmulatedMouseEvents) {
341
+ state.isOverTarget = true;
342
+ triggerPressStart(e, state.pointerType);
343
+ }
344
+ };
345
+ pressProps.onMouseLeave = (e)=>{
346
+ if (!e.currentTarget.contains(e.target)) return;
347
+ e.stopPropagation();
348
+ if (state.isPressed && !state.ignoreEmulatedMouseEvents) {
349
+ state.isOverTarget = false;
350
+ triggerPressEnd(e, state.pointerType, false);
351
+ if (propsRef.current.shouldCancelOnPointerExit) cancel(e);
352
+ }
353
+ };
354
+ pressProps.onMouseUp = (e)=>{
355
+ if (!e.currentTarget.contains(e.target)) return;
356
+ if (!state.ignoreEmulatedMouseEvents && e.button === 0) triggerPressUp(e, state.pointerType);
357
+ };
358
+ let onMouseUp = (e)=>{
359
+ // Only handle left clicks
360
+ if (e.button !== 0) return;
361
+ state.isPressed = false;
362
+ removeAllGlobalListeners();
363
+ if (state.ignoreEmulatedMouseEvents) {
364
+ state.ignoreEmulatedMouseEvents = false;
365
+ return;
366
+ }
367
+ if ($b468497b34dcb8dd$var$isOverTarget(e, state.target)) triggerPressEnd($b468497b34dcb8dd$var$createEvent(state.target, e), state.pointerType);
368
+ else if (state.isOverTarget) triggerPressEnd($b468497b34dcb8dd$var$createEvent(state.target, e), state.pointerType, false);
369
+ state.isOverTarget = false;
370
+ };
371
+ pressProps.onTouchStart = (e)=>{
372
+ if (!e.currentTarget.contains(e.target)) return;
373
+ e.stopPropagation();
374
+ let touch = $b468497b34dcb8dd$var$getTouchFromEvent(e.nativeEvent);
375
+ if (!touch) return;
376
+ state.activePointerId = touch.identifier;
377
+ state.ignoreEmulatedMouseEvents = true;
378
+ state.isOverTarget = true;
379
+ state.isPressed = true;
380
+ state.target = e.currentTarget;
381
+ state.pointerType = 'touch';
382
+ // Due to browser inconsistencies, especially on mobile browsers, we prevent default
383
+ // on the emulated mouse event and handle focusing the pressable element ourselves.
384
+ if (!isDisabled1 && !preventFocusOnPress) $d6MJ8$focusWithoutScrolling(e.currentTarget);
385
+ if (!allowTextSelectionOnPress) $cd0dbdeabf637843$export$16a4697467175487(state.target);
386
+ triggerPressStart(e, state.pointerType);
387
+ addGlobalListener(window, 'scroll', onScroll, true);
388
+ };
389
+ pressProps.onTouchMove = (e)=>{
390
+ if (!e.currentTarget.contains(e.target)) return;
391
+ e.stopPropagation();
392
+ if (!state.isPressed) return;
393
+ let touch = $b468497b34dcb8dd$var$getTouchById(e.nativeEvent, state.activePointerId);
394
+ if (touch && $b468497b34dcb8dd$var$isOverTarget(touch, e.currentTarget)) {
395
+ if (!state.isOverTarget) {
396
+ state.isOverTarget = true;
397
+ triggerPressStart(e, state.pointerType);
398
+ }
399
+ } else if (state.isOverTarget) {
400
+ state.isOverTarget = false;
401
+ triggerPressEnd(e, state.pointerType, false);
402
+ if (propsRef.current.shouldCancelOnPointerExit) cancel(e);
403
+ }
404
+ };
405
+ pressProps.onTouchEnd = (e)=>{
406
+ if (!e.currentTarget.contains(e.target)) return;
407
+ e.stopPropagation();
408
+ if (!state.isPressed) return;
409
+ let touch = $b468497b34dcb8dd$var$getTouchById(e.nativeEvent, state.activePointerId);
410
+ if (touch && $b468497b34dcb8dd$var$isOverTarget(touch, e.currentTarget)) {
411
+ triggerPressUp(e, state.pointerType);
412
+ triggerPressEnd(e, state.pointerType);
413
+ } else if (state.isOverTarget) triggerPressEnd(e, state.pointerType, false);
414
+ state.isPressed = false;
415
+ state.activePointerId = null;
416
+ state.isOverTarget = false;
417
+ state.ignoreEmulatedMouseEvents = true;
418
+ if (!allowTextSelectionOnPress) $cd0dbdeabf637843$export$b0d6fa1ab32e3295(state.target);
419
+ removeAllGlobalListeners();
420
+ };
421
+ pressProps.onTouchCancel = (e)=>{
422
+ if (!e.currentTarget.contains(e.target)) return;
423
+ e.stopPropagation();
424
+ if (state.isPressed) cancel(e);
425
+ };
426
+ let onScroll = (e)=>{
427
+ if (state.isPressed && e.target.contains(state.target)) cancel({
428
+ currentTarget: state.target,
429
+ shiftKey: false,
430
+ ctrlKey: false,
431
+ metaKey: false,
432
+ altKey: false
433
+ });
434
+ };
435
+ pressProps.onDragStart = (e)=>{
436
+ if (!e.currentTarget.contains(e.target)) return;
437
+ cancel(e);
438
+ };
325
439
  }
326
- }
440
+ return pressProps;
441
+ }, [
442
+ addGlobalListener,
443
+ isDisabled1,
444
+ preventFocusOnPress,
445
+ removeAllGlobalListeners,
446
+ allowTextSelectionOnPress
447
+ ]);
448
+ // Remove user-select: none in case component unmounts immediately after pressStart
449
+ // eslint-disable-next-line arrow-body-style
450
+ $d6MJ8$useEffect(()=>{
451
+ return ()=>{
452
+ if (!allowTextSelectionOnPress) $cd0dbdeabf637843$export$b0d6fa1ab32e3295(ref.current.target);
453
+ };
454
+ }, [
455
+ allowTextSelectionOnPress
456
+ ]);
457
+ return {
458
+ isPressed: isPressedProp || isPressed,
459
+ pressProps: $d6MJ8$mergeProps(domProps, pressProps1)
327
460
  };
328
-
329
- if (typeof PointerEvent !== 'undefined') {
330
- pressProps.onPointerDown = e => {
331
- // Only handle left clicks, and ignore events that bubbled through portals.
332
- if (e.button !== 0 || !e.currentTarget.contains(e.target)) {
333
- return;
334
- } // Due to browser inconsistencies, especially on mobile browsers, we prevent
335
- // default on pointer down and handle focusing the pressable element ourselves.
336
-
337
-
338
- if ($ffc54430b1dbeee65879852feaaff07d$var$shouldPreventDefault(e.target)) {
339
- e.preventDefault();
340
- } // iOS safari fires pointer events from VoiceOver (but only when outside an iframe...)
341
- // https://bugs.webkit.org/show_bug.cgi?id=222627
342
-
343
-
344
- state.pointerType = $ffc54430b1dbeee65879852feaaff07d$var$isVirtualPointerEvent(e.nativeEvent) ? 'virtual' : e.pointerType;
345
- e.stopPropagation();
346
-
347
- if (!state.isPressed) {
348
- state.isPressed = true;
349
- state.isOverTarget = true;
350
- state.activePointerId = e.pointerId;
351
- state.target = e.currentTarget;
352
-
353
- if (!isDisabled && !preventFocusOnPress) {
354
- focusWithoutScrolling(e.currentTarget);
355
- }
356
-
357
- $e17c9db826984f8ab8e5d837bf0b8$export$disableTextSelection();
358
- triggerPressStart(e, state.pointerType);
359
- addGlobalListener(document, 'pointermove', onPointerMove, false);
360
- addGlobalListener(document, 'pointerup', onPointerUp, false);
361
- addGlobalListener(document, 'pointercancel', onPointerCancel, false);
362
- }
363
- };
364
-
365
- pressProps.onMouseDown = e => {
366
- if (!e.currentTarget.contains(e.target)) {
367
- return;
368
- }
369
-
370
- if (e.button === 0) {
371
- // Chrome and Firefox on touch Windows devices require mouse down events
372
- // to be canceled in addition to pointer events, or an extra asynchronous
373
- // focus event will be fired.
374
- if ($ffc54430b1dbeee65879852feaaff07d$var$shouldPreventDefault(e.target)) {
375
- e.preventDefault();
376
- }
377
-
378
- e.stopPropagation();
379
- }
380
- };
381
-
382
- pressProps.onPointerUp = e => {
383
- if (!e.currentTarget.contains(e.target)) {
384
- return;
385
- } // Only handle left clicks
386
- // Safari on iOS sometimes fires pointerup events, even
387
- // when the touch isn't over the target, so double check.
388
-
389
-
390
- if (e.button === 0 && $ffc54430b1dbeee65879852feaaff07d$var$isOverTarget(e, e.currentTarget)) {
391
- triggerPressUp(e, state.pointerType);
392
- }
393
- }; // Safari on iOS < 13.2 does not implement pointerenter/pointerleave events correctly.
394
- // Use pointer move events instead to implement our own hit testing.
395
- // See https://bugs.webkit.org/show_bug.cgi?id=199803
396
-
397
-
398
- let onPointerMove = e => {
399
- if (e.pointerId !== state.activePointerId) {
400
- return;
401
- }
402
-
403
- if ($ffc54430b1dbeee65879852feaaff07d$var$isOverTarget(e, state.target)) {
404
- if (!state.isOverTarget) {
405
- state.isOverTarget = true;
406
- triggerPressStart($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), state.pointerType);
407
- }
408
- } else if (state.isOverTarget) {
409
- state.isOverTarget = false;
410
- triggerPressEnd($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), state.pointerType, false);
411
- }
412
- };
413
-
414
- let onPointerUp = e => {
415
- if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0) {
416
- if ($ffc54430b1dbeee65879852feaaff07d$var$isOverTarget(e, state.target)) {
417
- triggerPressEnd($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), state.pointerType);
418
- } else if (state.isOverTarget) {
419
- triggerPressEnd($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), state.pointerType, false);
420
- }
421
-
422
- state.isPressed = false;
423
- state.isOverTarget = false;
424
- state.activePointerId = null;
425
- state.pointerType = null;
426
- removeAllGlobalListeners();
427
- $e17c9db826984f8ab8e5d837bf0b8$export$restoreTextSelection();
428
- }
429
- };
430
-
431
- let onPointerCancel = e => {
432
- cancel(e);
433
- };
434
-
435
- pressProps.onDragStart = e => {
436
- if (!e.currentTarget.contains(e.target)) {
437
- return;
438
- } // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.
439
-
440
-
441
- cancel(e);
442
- };
443
- } else {
444
- pressProps.onMouseDown = e => {
445
- // Only handle left clicks
446
- if (e.button !== 0 || !e.currentTarget.contains(e.target)) {
447
- return;
448
- } // Due to browser inconsistencies, especially on mobile browsers, we prevent
449
- // default on mouse down and handle focusing the pressable element ourselves.
450
-
451
-
452
- if ($ffc54430b1dbeee65879852feaaff07d$var$shouldPreventDefault(e.target)) {
453
- e.preventDefault();
454
- }
455
-
456
- e.stopPropagation();
457
-
458
- if (state.ignoreEmulatedMouseEvents) {
459
- return;
460
- }
461
-
462
- state.isPressed = true;
463
- state.isOverTarget = true;
464
- state.target = e.currentTarget;
465
- state.pointerType = $f67ef9f1b8ed09b4b00fd0840cd8b94b$export$isVirtualClick(e.nativeEvent) ? 'virtual' : 'mouse';
466
-
467
- if (!isDisabled && !preventFocusOnPress) {
468
- focusWithoutScrolling(e.currentTarget);
469
- }
470
-
471
- triggerPressStart(e, state.pointerType);
472
- addGlobalListener(document, 'mouseup', onMouseUp, false);
473
- };
474
-
475
- pressProps.onMouseEnter = e => {
476
- if (!e.currentTarget.contains(e.target)) {
477
- return;
478
- }
479
-
480
- e.stopPropagation();
481
-
482
- if (state.isPressed && !state.ignoreEmulatedMouseEvents) {
483
- state.isOverTarget = true;
484
- triggerPressStart(e, state.pointerType);
485
- }
486
- };
487
-
488
- pressProps.onMouseLeave = e => {
489
- if (!e.currentTarget.contains(e.target)) {
490
- return;
491
- }
492
-
493
- e.stopPropagation();
494
-
495
- if (state.isPressed && !state.ignoreEmulatedMouseEvents) {
496
- state.isOverTarget = false;
497
- triggerPressEnd(e, state.pointerType, false);
498
- }
499
- };
500
-
501
- pressProps.onMouseUp = e => {
502
- if (!e.currentTarget.contains(e.target)) {
503
- return;
504
- }
505
-
506
- if (!state.ignoreEmulatedMouseEvents && e.button === 0) {
507
- triggerPressUp(e, state.pointerType);
508
- }
509
- };
510
-
511
- let onMouseUp = e => {
512
- // Only handle left clicks
513
- if (e.button !== 0) {
514
- return;
515
- }
516
-
517
- state.isPressed = false;
518
- removeAllGlobalListeners();
519
-
520
- if (state.ignoreEmulatedMouseEvents) {
521
- state.ignoreEmulatedMouseEvents = false;
522
- return;
523
- }
524
-
525
- if ($ffc54430b1dbeee65879852feaaff07d$var$isOverTarget(e, state.target)) {
526
- triggerPressEnd($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), state.pointerType);
527
- } else if (state.isOverTarget) {
528
- triggerPressEnd($ffc54430b1dbeee65879852feaaff07d$var$createEvent(state.target, e), state.pointerType, false);
529
- }
530
-
531
- state.isOverTarget = false;
532
- };
533
-
534
- pressProps.onTouchStart = e => {
535
- if (!e.currentTarget.contains(e.target)) {
536
- return;
537
- }
538
-
539
- e.stopPropagation();
540
- let touch = $ffc54430b1dbeee65879852feaaff07d$var$getTouchFromEvent(e.nativeEvent);
541
-
542
- if (!touch) {
543
- return;
544
- }
545
-
546
- state.activePointerId = touch.identifier;
547
- state.ignoreEmulatedMouseEvents = true;
548
- state.isOverTarget = true;
549
- state.isPressed = true;
550
- state.target = e.currentTarget;
551
- state.pointerType = 'touch'; // Due to browser inconsistencies, especially on mobile browsers, we prevent default
552
- // on the emulated mouse event and handle focusing the pressable element ourselves.
553
-
554
- if (!isDisabled && !preventFocusOnPress) {
555
- focusWithoutScrolling(e.currentTarget);
556
- }
557
-
558
- $e17c9db826984f8ab8e5d837bf0b8$export$disableTextSelection();
559
- triggerPressStart(e, state.pointerType);
560
- addGlobalListener(window, 'scroll', onScroll, true);
561
- };
562
-
563
- pressProps.onTouchMove = e => {
564
- if (!e.currentTarget.contains(e.target)) {
565
- return;
566
- }
567
-
568
- e.stopPropagation();
569
-
570
- if (!state.isPressed) {
571
- return;
572
- }
573
-
574
- let touch = $ffc54430b1dbeee65879852feaaff07d$var$getTouchById(e.nativeEvent, state.activePointerId);
575
-
576
- if (touch && $ffc54430b1dbeee65879852feaaff07d$var$isOverTarget(touch, e.currentTarget)) {
577
- if (!state.isOverTarget) {
578
- state.isOverTarget = true;
579
- triggerPressStart(e, state.pointerType);
580
- }
581
- } else if (state.isOverTarget) {
582
- state.isOverTarget = false;
583
- triggerPressEnd(e, state.pointerType, false);
584
- }
585
- };
586
-
587
- pressProps.onTouchEnd = e => {
588
- if (!e.currentTarget.contains(e.target)) {
589
- return;
590
- }
591
-
592
- e.stopPropagation();
593
-
594
- if (!state.isPressed) {
595
- return;
596
- }
597
-
598
- let touch = $ffc54430b1dbeee65879852feaaff07d$var$getTouchById(e.nativeEvent, state.activePointerId);
599
-
600
- if (touch && $ffc54430b1dbeee65879852feaaff07d$var$isOverTarget(touch, e.currentTarget)) {
601
- triggerPressUp(e, state.pointerType);
602
- triggerPressEnd(e, state.pointerType);
603
- } else if (state.isOverTarget) {
604
- triggerPressEnd(e, state.pointerType, false);
605
- }
606
-
607
- state.isPressed = false;
608
- state.activePointerId = null;
609
- state.isOverTarget = false;
610
- state.ignoreEmulatedMouseEvents = true;
611
- $e17c9db826984f8ab8e5d837bf0b8$export$restoreTextSelection();
612
- removeAllGlobalListeners();
613
- };
614
-
615
- pressProps.onTouchCancel = e => {
616
- if (!e.currentTarget.contains(e.target)) {
617
- return;
618
- }
619
-
620
- e.stopPropagation();
621
-
622
- if (state.isPressed) {
623
- cancel(e);
624
- }
625
- };
626
-
627
- let onScroll = e => {
628
- if (state.isPressed && e.target.contains(state.target)) {
629
- cancel({
630
- currentTarget: state.target,
631
- shiftKey: false,
632
- ctrlKey: false,
633
- metaKey: false
634
- });
635
- }
636
- };
637
-
638
- pressProps.onDragStart = e => {
639
- if (!e.currentTarget.contains(e.target)) {
640
- return;
641
- }
642
-
643
- cancel(e);
644
- };
645
- }
646
-
647
- return pressProps;
648
- }, [addGlobalListener, isDisabled, preventFocusOnPress, removeAllGlobalListeners]); // Remove user-select: none in case component unmounts immediately after pressStart
649
- // eslint-disable-next-line arrow-body-style
650
-
651
- useEffect(() => {
652
- return () => $e17c9db826984f8ab8e5d837bf0b8$export$restoreTextSelection();
653
- }, []);
654
- return {
655
- isPressed: isPressedProp || isPressed,
656
- pressProps: mergeProps(domProps, pressProps)
657
- };
658
461
  }
659
-
660
- function $ffc54430b1dbeee65879852feaaff07d$var$isHTMLAnchorLink(target) {
661
- return target.tagName === 'A' && target.hasAttribute('href');
462
+ function $b468497b34dcb8dd$var$isHTMLAnchorLink(target) {
463
+ return target.tagName === 'A' && target.hasAttribute('href');
662
464
  }
663
-
664
- function $ffc54430b1dbeee65879852feaaff07d$var$isValidKeyboardEvent(event) {
665
- const {
666
- key,
667
- target
668
- } = event;
669
- const element = target;
670
- const {
671
- tagName,
672
- isContentEditable
673
- } = element;
674
- const role = element.getAttribute('role'); // Accessibility for keyboards. Space and Enter only.
675
- // "Spacebar" is for IE 11
676
-
677
- return (key === 'Enter' || key === ' ' || key === 'Spacebar') && tagName !== 'INPUT' && tagName !== 'TEXTAREA' && isContentEditable !== true && ( // A link with a valid href should be handled natively,
678
- // unless it also has role='button' and was triggered using Space.
679
- !$ffc54430b1dbeee65879852feaaff07d$var$isHTMLAnchorLink(element) || role === 'button' && key !== 'Enter') && // An element with role='link' should only trigger with Enter key
680
- !(role === 'link' && key !== 'Enter');
465
+ function $b468497b34dcb8dd$var$isValidKeyboardEvent(event) {
466
+ const { key: key , code: code , target: target } = event;
467
+ const element = target;
468
+ const { tagName: tagName , isContentEditable: isContentEditable } = element;
469
+ const role = element.getAttribute('role');
470
+ // Accessibility for keyboards. Space and Enter only.
471
+ // "Spacebar" is for IE 11
472
+ return (key === 'Enter' || key === ' ' || key === 'Spacebar' || code === 'Space') && tagName !== 'INPUT' && tagName !== 'TEXTAREA' && isContentEditable !== true && (!$b468497b34dcb8dd$var$isHTMLAnchorLink(element) || role === 'button' && key !== 'Enter') && // An element with role='link' should only trigger with Enter key
473
+ !(role === 'link' && key !== 'Enter');
681
474
  }
682
-
683
- function $ffc54430b1dbeee65879852feaaff07d$var$getTouchFromEvent(event) {
684
- const {
685
- targetTouches
686
- } = event;
687
-
688
- if (targetTouches.length > 0) {
689
- return targetTouches[0];
690
- }
691
-
692
- return null;
475
+ function $b468497b34dcb8dd$var$getTouchFromEvent(event) {
476
+ const { targetTouches: targetTouches } = event;
477
+ if (targetTouches.length > 0) return targetTouches[0];
478
+ return null;
693
479
  }
694
-
695
- function $ffc54430b1dbeee65879852feaaff07d$var$getTouchById(event, pointerId) {
696
- const changedTouches = event.changedTouches;
697
-
698
- for (let i = 0; i < changedTouches.length; i++) {
699
- const touch = changedTouches[i];
700
-
701
- if (touch.identifier === pointerId) {
702
- return touch;
480
+ function $b468497b34dcb8dd$var$getTouchById(event, pointerId) {
481
+ const changedTouches = event.changedTouches;
482
+ for(let i = 0; i < changedTouches.length; i++){
483
+ const touch = changedTouches[i];
484
+ if (touch.identifier === pointerId) return touch;
703
485
  }
704
- }
705
-
706
- return null;
486
+ return null;
707
487
  }
708
-
709
- function $ffc54430b1dbeee65879852feaaff07d$var$createEvent(target, e) {
710
- return {
711
- currentTarget: target,
712
- shiftKey: e.shiftKey,
713
- ctrlKey: e.ctrlKey,
714
- metaKey: e.metaKey
715
- };
488
+ function $b468497b34dcb8dd$var$createEvent(target, e) {
489
+ return {
490
+ currentTarget: target,
491
+ shiftKey: e.shiftKey,
492
+ ctrlKey: e.ctrlKey,
493
+ metaKey: e.metaKey,
494
+ altKey: e.altKey
495
+ };
716
496
  }
717
-
718
- function $ffc54430b1dbeee65879852feaaff07d$var$getPointClientRect(point) {
719
- let offsetX = point.width / 2 || point.radiusX || 0;
720
- let offsetY = point.height / 2 || point.radiusY || 0;
721
- return {
722
- top: point.clientY - offsetY,
723
- right: point.clientX + offsetX,
724
- bottom: point.clientY + offsetY,
725
- left: point.clientX - offsetX
726
- };
497
+ function $b468497b34dcb8dd$var$getPointClientRect(point) {
498
+ let offsetX = point.width / 2 || point.radiusX || 0;
499
+ let offsetY = point.height / 2 || point.radiusY || 0;
500
+ return {
501
+ top: point.clientY - offsetY,
502
+ right: point.clientX + offsetX,
503
+ bottom: point.clientY + offsetY,
504
+ left: point.clientX - offsetX
505
+ };
727
506
  }
728
-
729
- function $ffc54430b1dbeee65879852feaaff07d$var$areRectanglesOverlapping(a, b) {
730
- // check if they cannot overlap on x axis
731
- if (a.left > b.right || b.left > a.right) {
732
- return false;
733
- } // check if they cannot overlap on y axis
734
-
735
-
736
- if (a.top > b.bottom || b.top > a.bottom) {
737
- return false;
738
- }
739
-
740
- return true;
507
+ function $b468497b34dcb8dd$var$areRectanglesOverlapping(a, b) {
508
+ // check if they cannot overlap on x axis
509
+ if (a.left > b.right || b.left > a.right) return false;
510
+ // check if they cannot overlap on y axis
511
+ if (a.top > b.bottom || b.top > a.bottom) return false;
512
+ return true;
741
513
  }
742
-
743
- function $ffc54430b1dbeee65879852feaaff07d$var$isOverTarget(point, target) {
744
- let rect = target.getBoundingClientRect();
745
- let pointRect = $ffc54430b1dbeee65879852feaaff07d$var$getPointClientRect(point);
746
- return $ffc54430b1dbeee65879852feaaff07d$var$areRectanglesOverlapping(rect, pointRect);
514
+ function $b468497b34dcb8dd$var$isOverTarget(point, target) {
515
+ let rect = target.getBoundingClientRect();
516
+ let pointRect = $b468497b34dcb8dd$var$getPointClientRect(point);
517
+ return $b468497b34dcb8dd$var$areRectanglesOverlapping(rect, pointRect);
747
518
  }
748
-
749
- function $ffc54430b1dbeee65879852feaaff07d$var$shouldPreventDefault(target) {
750
- // We cannot prevent default if the target is inside a draggable element.
751
- return !target.closest('[draggable="true"]');
519
+ function $b468497b34dcb8dd$var$shouldPreventDefault(target) {
520
+ // We cannot prevent default if the target is inside a draggable element.
521
+ return !target.closest('[draggable="true"]');
752
522
  }
753
-
754
- function $ffc54430b1dbeee65879852feaaff07d$var$isVirtualPointerEvent(event) {
755
- // If the pointer size is zero, then we assume it's from a screen reader.
756
- return event.width === 0 && event.height === 0;
523
+ function $b468497b34dcb8dd$var$shouldPreventDefaultKeyboard(target) {
524
+ return !((target.tagName === 'INPUT' || target.tagName === 'BUTTON') && target.type === 'submit');
525
+ }
526
+ function $b468497b34dcb8dd$var$isVirtualPointerEvent(event) {
527
+ // If the pointer size is zero, then we assume it's from a screen reader.
528
+ // Android TalkBack double tap will sometimes return a event with width and height of 1
529
+ // and pointerType === 'mouse' so we need to check for a specific combination of event attributes.
530
+ // Cannot use "event.pressure === 0" as the sole check due to Safari pointer events always returning pressure === 0
531
+ // instead of .5, see https://bugs.webkit.org/show_bug.cgi?id=206216
532
+ return event.width === 0 && event.height === 0 || event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0;
757
533
  }
758
534
 
759
- export const Pressable = /*#__PURE__*/_react.forwardRef((_ref, ref) => {
760
- var _ref2;
761
535
 
762
- let {
763
- children
764
- } = _ref,
765
- props = _babelRuntimeHelpersEsmObjectWithoutPropertiesLoose(_ref, ["children"]);
766
536
 
767
- let newRef = useRef();
768
- ref = (_ref2 = ref) != null ? _ref2 : newRef;
769
- let {
770
- pressProps
771
- } = usePress(_babelRuntimeHelpersEsmExtends({}, props, {
772
- ref
773
- }));
537
+ const $28aa772934c24805$export$27c701ed9e449e99 = /*#__PURE__*/ $d6MJ8$react.forwardRef(({ children: children , ...props }, ref)=>{
538
+ let newRef = $d6MJ8$useRef();
539
+ ref = ref !== null && ref !== void 0 ? ref : newRef;
540
+ let { pressProps: pressProps } = $b468497b34dcb8dd$export$45712eceda6fad21({
541
+ ...props,
542
+ ref: ref
543
+ });
544
+ let child = $d6MJ8$react.Children.only(children);
545
+ return(/*#__PURE__*/ $d6MJ8$react.cloneElement(child, // @ts-ignore
546
+ {
547
+ ref: ref,
548
+ ...$d6MJ8$mergeProps(child.props, pressProps)
549
+ }));
550
+ });
774
551
 
775
- let child = _react.Children.only(children);
776
552
 
777
- return /*#__PURE__*/_react.cloneElement(child, // @ts-ignore
778
- _babelRuntimeHelpersEsmExtends({
779
- ref
780
- }, mergeProps(child.props, pressProps)));
781
- });
782
- export const PressResponder = /*#__PURE__*/_react.forwardRef((_ref, ref) => {
783
- let {
784
- children
785
- } = _ref,
786
- props = _babelRuntimeHelpersEsmObjectWithoutPropertiesLoose(_ref, ["children"]);
787
-
788
- let isRegistered = useRef(false);
789
- let prevContext = useContext($a3ff51240de6f955c79cf17a88e349$export$PressResponderContext);
790
- let context = mergeProps(prevContext || {}, _babelRuntimeHelpersEsmExtends({}, props, {
791
- ref: ref || (prevContext == null ? void 0 : prevContext.ref),
792
-
793
- register() {
794
- isRegistered.current = true;
795
-
796
- if (prevContext) {
797
- prevContext.register();
798
- }
799
- }
553
+ var $68900e0904c93fdc$exports = {};
800
554
 
801
- }));
802
- useSyncRef(prevContext, ref);
803
- useEffect(() => {
804
- if (!isRegistered.current) {
805
- console.warn('A PressResponder was rendered without a pressable child. ' + 'Either call the usePress hook, or wrap your DOM node with <Pressable> component.');
806
- }
807
- }, []);
808
- return /*#__PURE__*/_react.createElement($a3ff51240de6f955c79cf17a88e349$export$PressResponderContext.Provider, {
809
- value: context
810
- }, children);
811
- });
812
- // NOTICE file in the root directory of this source tree.
813
- // See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions
555
+ $parcel$export($68900e0904c93fdc$exports, "PressResponder", () => $68900e0904c93fdc$export$3351871ee4b288b8);
814
556
 
815
- /**
816
- * Handles focus events for the immediate target.
817
- * Focus events on child elements will be ignored.
818
- */
819
- export function useFocus(props) {
820
- if (props.isDisabled) {
821
- return {
822
- focusProps: {}
823
- };
824
- }
825
557
 
826
- let onFocus, onBlur;
827
558
 
828
- if (props.onFocus || props.onFocusChange) {
829
- onFocus = e => {
830
- if (e.target === e.currentTarget) {
831
- if (props.onFocus) {
832
- props.onFocus(e);
559
+ const $68900e0904c93fdc$export$3351871ee4b288b8 = /*#__PURE__*/ $d6MJ8$react.forwardRef(({ children: children , ...props }, ref)=>{
560
+ let isRegistered = $d6MJ8$useRef(false);
561
+ let prevContext = $d6MJ8$useContext($8e24aea97df378f7$export$5165eccb35aaadb5);
562
+ let context = $d6MJ8$mergeProps(prevContext || {
563
+ }, {
564
+ ...props,
565
+ ref: ref || (prevContext === null || prevContext === void 0 ? void 0 : prevContext.ref),
566
+ register () {
567
+ isRegistered.current = true;
568
+ if (prevContext) prevContext.register();
833
569
  }
570
+ });
571
+ $d6MJ8$useSyncRef(prevContext, ref);
572
+ $d6MJ8$useEffect(()=>{
573
+ if (!isRegistered.current) console.warn("A PressResponder was rendered without a pressable child. Either call the usePress hook, or wrap your DOM node with <Pressable> component.");
574
+ }, []);
575
+ return(/*#__PURE__*/ $d6MJ8$react.createElement($8e24aea97df378f7$export$5165eccb35aaadb5.Provider, {
576
+ value: context
577
+ }, children));
578
+ });
579
+
834
580
 
835
- if (props.onFocusChange) {
836
- props.onFocusChange(true);
581
+ var $226b63c52f1613ce$exports = {};
582
+
583
+ $parcel$export($226b63c52f1613ce$exports, "useFocus", () => $226b63c52f1613ce$export$f8168d8dd8fd66e6);
584
+ function $226b63c52f1613ce$export$f8168d8dd8fd66e6(props) {
585
+ if (props.isDisabled) return {
586
+ focusProps: {
837
587
  }
838
- }
839
588
  };
840
- }
841
-
842
- if (props.onBlur || props.onFocusChange) {
843
- onBlur = e => {
844
- if (e.target === e.currentTarget) {
845
- if (props.onBlur) {
846
- props.onBlur(e);
589
+ let onFocus, onBlur;
590
+ if (props.onFocus || props.onFocusChange) onFocus = (e)=>{
591
+ if (e.target === e.currentTarget) {
592
+ if (props.onFocus) props.onFocus(e);
593
+ if (props.onFocusChange) props.onFocusChange(true);
847
594
  }
848
-
849
- if (props.onFocusChange) {
850
- props.onFocusChange(false);
595
+ };
596
+ if (props.onBlur || props.onFocusChange) onBlur = (e)=>{
597
+ if (e.target === e.currentTarget) {
598
+ if (props.onBlur) props.onBlur(e);
599
+ if (props.onFocusChange) props.onFocusChange(false);
600
+ }
601
+ };
602
+ return {
603
+ focusProps: {
604
+ onFocus: onFocus,
605
+ onBlur: onBlur
851
606
  }
852
- }
853
607
  };
854
- }
855
-
856
- return {
857
- focusProps: {
858
- onFocus,
859
- onBlur
860
- }
861
- };
862
608
  }
863
- let $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality = null;
864
- let $d01f69bb2ab5f70dfd0005370a2a2cbc$var$changeHandlers = new Set();
865
- let $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasSetupGlobalListeners = false;
866
- let $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus = false;
867
- let $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasBlurredWindowRecently = false; // Only Tab or Esc keys will make focus visible on text input elements
868
-
869
- const $d01f69bb2ab5f70dfd0005370a2a2cbc$var$FOCUS_VISIBLE_INPUT_KEYS = {
870
- Tab: true,
871
- Escape: true
872
- };
873
609
 
874
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$triggerChangeHandlers(modality, e) {
875
- for (let handler of $d01f69bb2ab5f70dfd0005370a2a2cbc$var$changeHandlers) {
876
- handler(modality, e);
877
- }
878
- }
879
- /**
880
- * Helper function to determine if a KeyboardEvent is unmodified and could make keyboard focus styles visible.
881
- */
882
610
 
611
+ var $49c2914eac614f98$exports = {};
883
612
 
884
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$isValidKey(e) {
885
- // Control and Shift keys trigger when navigating back to the tab with keyboard.
886
- return !(e.metaKey || !isMac() && e.altKey || e.ctrlKey || e.type === 'keyup' && (e.key === 'Control' || e.key === 'Shift'));
887
- }
888
-
889
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleKeyboardEvent(e) {
890
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus = true;
613
+ $parcel$export($49c2914eac614f98$exports, "isFocusVisible", () => $49c2914eac614f98$export$b9b3dfddab17db27);
614
+ $parcel$export($49c2914eac614f98$exports, "getInteractionModality", () => $49c2914eac614f98$export$630ff653c5ada6a9);
615
+ $parcel$export($49c2914eac614f98$exports, "setInteractionModality", () => $49c2914eac614f98$export$8397ddfc504fdb9a);
616
+ $parcel$export($49c2914eac614f98$exports, "useInteractionModality", () => $49c2914eac614f98$export$98e20ec92f614cfe);
617
+ $parcel$export($49c2914eac614f98$exports, "useFocusVisible", () => $49c2914eac614f98$export$ffd9e5021c1fb2d6);
618
+ $parcel$export($49c2914eac614f98$exports, "useFocusVisibleListener", () => $49c2914eac614f98$export$ec71b4b83ac08ec3);
891
619
 
892
- if ($d01f69bb2ab5f70dfd0005370a2a2cbc$var$isValidKey(e)) {
893
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality = 'keyboard';
894
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$triggerChangeHandlers('keyboard', e);
895
- }
896
- }
897
620
 
898
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handlePointerEvent(e) {
899
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality = 'pointer';
900
621
 
901
- if (e.type === 'mousedown' || e.type === 'pointerdown') {
902
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus = true;
903
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$triggerChangeHandlers('pointer', e);
904
- }
622
+ let $49c2914eac614f98$var$currentModality = null;
623
+ let $49c2914eac614f98$var$changeHandlers = new Set();
624
+ let $49c2914eac614f98$var$hasSetupGlobalListeners = false;
625
+ let $49c2914eac614f98$var$hasEventBeforeFocus = false;
626
+ let $49c2914eac614f98$var$hasBlurredWindowRecently = false;
627
+ // Only Tab or Esc keys will make focus visible on text input elements
628
+ const $49c2914eac614f98$var$FOCUS_VISIBLE_INPUT_KEYS = {
629
+ Tab: true,
630
+ Escape: true
631
+ };
632
+ function $49c2914eac614f98$var$triggerChangeHandlers(modality, e) {
633
+ for (let handler of $49c2914eac614f98$var$changeHandlers)handler(modality, e);
905
634
  }
906
-
907
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleClickEvent(e) {
908
- if ($f67ef9f1b8ed09b4b00fd0840cd8b94b$export$isVirtualClick(e)) {
909
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus = true;
910
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality = 'virtual';
911
- }
635
+ /**
636
+ * Helper function to determine if a KeyboardEvent is unmodified and could make keyboard focus styles visible.
637
+ */ function $49c2914eac614f98$var$isValidKey(e) {
638
+ // Control and Shift keys trigger when navigating back to the tab with keyboard.
639
+ return !(e.metaKey || !$d6MJ8$isMac() && e.altKey || e.ctrlKey || e.key === 'Control' || e.key === 'Shift' || e.key === 'Meta');
912
640
  }
913
-
914
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleFocusEvent(e) {
915
- // Firefox fires two extra focus events when the user first clicks into an iframe:
916
- // first on the window, then on the document. We ignore these events so they don't
917
- // cause keyboard focus rings to appear.
918
- if (e.target === window || e.target === document) {
919
- return;
920
- } // If a focus event occurs without a preceding keyboard or pointer event, switch to virtual modality.
921
- // This occurs, for example, when navigating a form with the next/previous buttons on iOS.
922
-
923
-
924
- if (!$d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus && !$d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasBlurredWindowRecently) {
925
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality = 'virtual';
926
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$triggerChangeHandlers('virtual', e);
927
- }
928
-
929
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus = false;
930
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasBlurredWindowRecently = false;
641
+ function $49c2914eac614f98$var$handleKeyboardEvent(e) {
642
+ $49c2914eac614f98$var$hasEventBeforeFocus = true;
643
+ if ($49c2914eac614f98$var$isValidKey(e)) {
644
+ $49c2914eac614f98$var$currentModality = 'keyboard';
645
+ $49c2914eac614f98$var$triggerChangeHandlers('keyboard', e);
646
+ }
931
647
  }
932
-
933
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleWindowBlur() {
934
- // When the window is blurred, reset state. This is necessary when tabbing out of the window,
935
- // for example, since a subsequent focus event won't be fired.
936
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus = false;
937
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasBlurredWindowRecently = true;
648
+ function $49c2914eac614f98$var$handlePointerEvent(e) {
649
+ $49c2914eac614f98$var$currentModality = 'pointer';
650
+ if (e.type === 'mousedown' || e.type === 'pointerdown') {
651
+ $49c2914eac614f98$var$hasEventBeforeFocus = true;
652
+ $49c2914eac614f98$var$triggerChangeHandlers('pointer', e);
653
+ }
654
+ }
655
+ function $49c2914eac614f98$var$handleClickEvent(e) {
656
+ if ($3004588ac0f775f8$export$60278871457622de(e)) {
657
+ $49c2914eac614f98$var$hasEventBeforeFocus = true;
658
+ $49c2914eac614f98$var$currentModality = 'virtual';
659
+ }
660
+ }
661
+ function $49c2914eac614f98$var$handleFocusEvent(e) {
662
+ // Firefox fires two extra focus events when the user first clicks into an iframe:
663
+ // first on the window, then on the document. We ignore these events so they don't
664
+ // cause keyboard focus rings to appear.
665
+ if (e.target === window || e.target === document) return;
666
+ // If a focus event occurs without a preceding keyboard or pointer event, switch to virtual modality.
667
+ // This occurs, for example, when navigating a form with the next/previous buttons on iOS.
668
+ if (!$49c2914eac614f98$var$hasEventBeforeFocus && !$49c2914eac614f98$var$hasBlurredWindowRecently) {
669
+ $49c2914eac614f98$var$currentModality = 'virtual';
670
+ $49c2914eac614f98$var$triggerChangeHandlers('virtual', e);
671
+ }
672
+ $49c2914eac614f98$var$hasEventBeforeFocus = false;
673
+ $49c2914eac614f98$var$hasBlurredWindowRecently = false;
674
+ }
675
+ function $49c2914eac614f98$var$handleWindowBlur() {
676
+ // When the window is blurred, reset state. This is necessary when tabbing out of the window,
677
+ // for example, since a subsequent focus event won't be fired.
678
+ $49c2914eac614f98$var$hasEventBeforeFocus = false;
679
+ $49c2914eac614f98$var$hasBlurredWindowRecently = true;
938
680
  }
939
681
  /**
940
682
  * Setup global event listeners to control when keyboard focus style should be visible.
941
- */
942
-
943
-
944
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$setupGlobalFocusEvents() {
945
- if (typeof window === 'undefined' || $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasSetupGlobalListeners) {
946
- return;
947
- } // Programmatic focus() calls shouldn't affect the current input modality.
948
- // However, we need to detect other cases when a focus event occurs without
949
- // a preceding user event (e.g. screen reader focus). Overriding the focus
950
- // method on HTMLElement.prototype is a bit hacky, but works.
951
-
952
-
953
- let focus = HTMLElement.prototype.focus;
954
-
955
- HTMLElement.prototype.focus = function () {
956
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasEventBeforeFocus = true;
957
- focus.apply(this, arguments);
958
- };
959
-
960
- document.addEventListener('keydown', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleKeyboardEvent, true);
961
- document.addEventListener('keyup', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleKeyboardEvent, true);
962
- document.addEventListener('click', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleClickEvent, true); // Register focus events on the window so they are sure to happen
963
- // before React's event listeners (registered on the document).
964
-
965
- window.addEventListener('focus', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleFocusEvent, true);
966
- window.addEventListener('blur', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handleWindowBlur, false);
967
-
968
- if (typeof PointerEvent !== 'undefined') {
969
- document.addEventListener('pointerdown', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handlePointerEvent, true);
970
- document.addEventListener('pointermove', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handlePointerEvent, true);
971
- document.addEventListener('pointerup', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handlePointerEvent, true);
972
- } else {
973
- document.addEventListener('mousedown', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handlePointerEvent, true);
974
- document.addEventListener('mousemove', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handlePointerEvent, true);
975
- document.addEventListener('mouseup', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$handlePointerEvent, true);
976
- }
977
-
978
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$hasSetupGlobalListeners = true;
683
+ */ function $49c2914eac614f98$var$setupGlobalFocusEvents() {
684
+ if (typeof window === 'undefined' || $49c2914eac614f98$var$hasSetupGlobalListeners) return;
685
+ // Programmatic focus() calls shouldn't affect the current input modality.
686
+ // However, we need to detect other cases when a focus event occurs without
687
+ // a preceding user event (e.g. screen reader focus). Overriding the focus
688
+ // method on HTMLElement.prototype is a bit hacky, but works.
689
+ let focus = HTMLElement.prototype.focus;
690
+ HTMLElement.prototype.focus = function() {
691
+ $49c2914eac614f98$var$hasEventBeforeFocus = true;
692
+ focus.apply(this, arguments);
693
+ };
694
+ document.addEventListener('keydown', $49c2914eac614f98$var$handleKeyboardEvent, true);
695
+ document.addEventListener('keyup', $49c2914eac614f98$var$handleKeyboardEvent, true);
696
+ document.addEventListener('click', $49c2914eac614f98$var$handleClickEvent, true);
697
+ // Register focus events on the window so they are sure to happen
698
+ // before React's event listeners (registered on the document).
699
+ window.addEventListener('focus', $49c2914eac614f98$var$handleFocusEvent, true);
700
+ window.addEventListener('blur', $49c2914eac614f98$var$handleWindowBlur, false);
701
+ if (typeof PointerEvent !== 'undefined') {
702
+ document.addEventListener('pointerdown', $49c2914eac614f98$var$handlePointerEvent, true);
703
+ document.addEventListener('pointermove', $49c2914eac614f98$var$handlePointerEvent, true);
704
+ document.addEventListener('pointerup', $49c2914eac614f98$var$handlePointerEvent, true);
705
+ } else {
706
+ document.addEventListener('mousedown', $49c2914eac614f98$var$handlePointerEvent, true);
707
+ document.addEventListener('mousemove', $49c2914eac614f98$var$handlePointerEvent, true);
708
+ document.addEventListener('mouseup', $49c2914eac614f98$var$handlePointerEvent, true);
709
+ }
710
+ $49c2914eac614f98$var$hasSetupGlobalListeners = true;
979
711
  }
980
-
981
712
  if (typeof document !== 'undefined') {
982
- if (document.readyState !== 'loading') {
983
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$setupGlobalFocusEvents();
984
- } else {
985
- document.addEventListener('DOMContentLoaded', $d01f69bb2ab5f70dfd0005370a2a2cbc$var$setupGlobalFocusEvents);
986
- }
713
+ if (document.readyState !== 'loading') $49c2914eac614f98$var$setupGlobalFocusEvents();
714
+ else document.addEventListener('DOMContentLoaded', $49c2914eac614f98$var$setupGlobalFocusEvents);
987
715
  }
988
- /**
989
- * If true, keyboard focus is visible.
990
- */
991
-
992
-
993
- export function isFocusVisible() {
994
- return $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality !== 'pointer';
716
+ function $49c2914eac614f98$export$b9b3dfddab17db27() {
717
+ return $49c2914eac614f98$var$currentModality !== 'pointer';
995
718
  }
996
- export function getInteractionModality() {
997
- return $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality;
719
+ function $49c2914eac614f98$export$630ff653c5ada6a9() {
720
+ return $49c2914eac614f98$var$currentModality;
998
721
  }
999
- export function setInteractionModality(modality) {
1000
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality = modality;
1001
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$triggerChangeHandlers(modality, null);
722
+ function $49c2914eac614f98$export$8397ddfc504fdb9a(modality) {
723
+ $49c2914eac614f98$var$currentModality = modality;
724
+ $49c2914eac614f98$var$triggerChangeHandlers(modality, null);
1002
725
  }
1003
- /**
1004
- * Keeps state of the current modality.
1005
- */
1006
-
1007
- export function useInteractionModality() {
1008
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$setupGlobalFocusEvents();
1009
- let [modality, setModality] = useState($d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality);
1010
- useEffect(() => {
1011
- let handler = () => {
1012
- setModality($d01f69bb2ab5f70dfd0005370a2a2cbc$var$currentModality);
1013
- };
1014
-
1015
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$changeHandlers.add(handler);
1016
- return () => {
1017
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$changeHandlers.delete(handler);
1018
- };
1019
- }, []);
1020
- return modality;
726
+ function $49c2914eac614f98$export$98e20ec92f614cfe() {
727
+ $49c2914eac614f98$var$setupGlobalFocusEvents();
728
+ let [modality, setModality] = $d6MJ8$useState($49c2914eac614f98$var$currentModality);
729
+ $d6MJ8$useEffect(()=>{
730
+ let handler = ()=>{
731
+ setModality($49c2914eac614f98$var$currentModality);
732
+ };
733
+ $49c2914eac614f98$var$changeHandlers.add(handler);
734
+ return ()=>{
735
+ $49c2914eac614f98$var$changeHandlers.delete(handler);
736
+ };
737
+ }, []);
738
+ return modality;
1021
739
  }
1022
740
  /**
1023
741
  * If this is attached to text input component, return if the event is a focus event (Tab/Escape keys pressed) so that
1024
742
  * focus visible style can be properly set.
1025
- */
1026
-
1027
- function $d01f69bb2ab5f70dfd0005370a2a2cbc$var$isKeyboardFocusEvent(isTextInput, modality, e) {
1028
- return !(isTextInput && modality === 'keyboard' && e instanceof KeyboardEvent && !$d01f69bb2ab5f70dfd0005370a2a2cbc$var$FOCUS_VISIBLE_INPUT_KEYS[e.key]);
1029
- }
1030
- /**
1031
- * Manages focus visible state for the page, and subscribes individual components for updates.
1032
- */
1033
-
1034
-
1035
- export function useFocusVisible(props) {
1036
- if (props === void 0) {
1037
- props = {};
1038
- }
1039
-
1040
- let {
1041
- isTextInput,
1042
- autoFocus
1043
- } = props;
1044
- let [isFocusVisibleState, setFocusVisible] = useState(autoFocus || isFocusVisible());
1045
- useFocusVisibleListener(isFocusVisible => {
1046
- setFocusVisible(isFocusVisible);
1047
- }, [isTextInput], {
1048
- isTextInput
1049
- });
1050
- return {
1051
- isFocusVisible: isFocusVisibleState
1052
- };
743
+ */ function $49c2914eac614f98$var$isKeyboardFocusEvent(isTextInput, modality, e) {
744
+ return !(isTextInput && modality === 'keyboard' && e instanceof KeyboardEvent && !$49c2914eac614f98$var$FOCUS_VISIBLE_INPUT_KEYS[e.key]);
1053
745
  }
1054
- /**
1055
- * Listens for trigger change and reports if focus is visible (i.e., modality is not pointer).
1056
- */
1057
-
1058
- export function useFocusVisibleListener(fn, deps, opts) {
1059
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$setupGlobalFocusEvents();
1060
- useEffect(() => {
1061
- let handler = (modality, e) => {
1062
- if (!$d01f69bb2ab5f70dfd0005370a2a2cbc$var$isKeyboardFocusEvent(opts == null ? void 0 : opts.isTextInput, modality, e)) {
1063
- return;
1064
- }
1065
-
1066
- fn(isFocusVisible());
1067
- };
1068
-
1069
- $d01f69bb2ab5f70dfd0005370a2a2cbc$var$changeHandlers.add(handler);
1070
- return () => $d01f69bb2ab5f70dfd0005370a2a2cbc$var$changeHandlers.delete(handler);
1071
- }, deps);
1072
- }
1073
-
1074
- /**
1075
- * Handles focus events for the target and its descendants.
1076
- */
1077
- export function useFocusWithin(props) {
1078
- let state = useRef({
1079
- isFocusWithin: false
1080
- }).current;
1081
-
1082
- if (props.isDisabled) {
746
+ function $49c2914eac614f98$export$ffd9e5021c1fb2d6(props = {
747
+ }) {
748
+ let { isTextInput: isTextInput , autoFocus: autoFocus } = props;
749
+ let [isFocusVisibleState, setFocusVisible] = $d6MJ8$useState(autoFocus || $49c2914eac614f98$export$b9b3dfddab17db27());
750
+ $49c2914eac614f98$export$ec71b4b83ac08ec3(($49c2914eac614f98$export$b9b3dfddab17db27)=>{
751
+ setFocusVisible($49c2914eac614f98$export$b9b3dfddab17db27);
752
+ }, [
753
+ isTextInput
754
+ ], {
755
+ isTextInput: isTextInput
756
+ });
1083
757
  return {
1084
- focusWithinProps: {}
758
+ isFocusVisible: isFocusVisibleState
1085
759
  };
1086
- }
1087
-
1088
- let onFocus = e => {
1089
- if (!state.isFocusWithin) {
1090
- if (props.onFocusWithin) {
1091
- props.onFocusWithin(e);
1092
- }
1093
-
1094
- if (props.onFocusWithinChange) {
1095
- props.onFocusWithinChange(true);
1096
- }
1097
-
1098
- state.isFocusWithin = true;
1099
- }
1100
- };
1101
-
1102
- let onBlur = e => {
1103
- // We don't want to trigger onBlurWithin and then immediately onFocusWithin again
1104
- // when moving focus inside the element. Only trigger if the currentTarget doesn't
1105
- // include the relatedTarget (where focus is moving).
1106
- if (state.isFocusWithin && !e.currentTarget.contains(e.relatedTarget)) {
1107
- if (props.onBlurWithin) {
1108
- props.onBlurWithin(e);
1109
- }
1110
-
1111
- if (props.onFocusWithinChange) {
1112
- props.onFocusWithinChange(false);
1113
- }
1114
-
1115
- state.isFocusWithin = false;
1116
- }
1117
- };
1118
-
1119
- return {
1120
- focusWithinProps: {
1121
- onFocus: onFocus,
1122
- onBlur: onBlur
1123
- }
1124
- };
1125
760
  }
1126
- // iOS fires onPointerEnter twice: once with pointerType="touch" and again with pointerType="mouse".
1127
- // We want to ignore these emulated events so they do not trigger hover behavior.
1128
- // See https://bugs.webkit.org/show_bug.cgi?id=214609.
1129
- let $b1a784c66b81d90efa4f74e05b$var$globalIgnoreEmulatedMouseEvents = false;
1130
- let $b1a784c66b81d90efa4f74e05b$var$hoverCount = 0;
1131
-
1132
- function $b1a784c66b81d90efa4f74e05b$var$setGlobalIgnoreEmulatedMouseEvents() {
1133
- $b1a784c66b81d90efa4f74e05b$var$globalIgnoreEmulatedMouseEvents = true; // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter
1134
- // with pointerType="mouse" immediately after onPointerUp and before onFocus. On other
1135
- // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in
1136
- // the distant future because a user previously touched the element.
1137
-
1138
- setTimeout(() => {
1139
- $b1a784c66b81d90efa4f74e05b$var$globalIgnoreEmulatedMouseEvents = false;
1140
- }, 50);
1141
- }
1142
-
1143
- function $b1a784c66b81d90efa4f74e05b$var$handleGlobalPointerEvent(e) {
1144
- if (e.pointerType === 'touch') {
1145
- $b1a784c66b81d90efa4f74e05b$var$setGlobalIgnoreEmulatedMouseEvents();
1146
- }
1147
- }
1148
-
1149
- function $b1a784c66b81d90efa4f74e05b$var$setupGlobalTouchEvents() {
1150
- if (typeof document === 'undefined') {
1151
- return;
1152
- }
1153
-
1154
- if (typeof PointerEvent !== 'undefined') {
1155
- document.addEventListener('pointerup', $b1a784c66b81d90efa4f74e05b$var$handleGlobalPointerEvent);
1156
- } else {
1157
- document.addEventListener('touchend', $b1a784c66b81d90efa4f74e05b$var$setGlobalIgnoreEmulatedMouseEvents);
1158
- }
1159
-
1160
- $b1a784c66b81d90efa4f74e05b$var$hoverCount++;
1161
- return () => {
1162
- $b1a784c66b81d90efa4f74e05b$var$hoverCount--;
1163
-
1164
- if ($b1a784c66b81d90efa4f74e05b$var$hoverCount > 0) {
1165
- return;
1166
- }
1167
-
1168
- if (typeof PointerEvent !== 'undefined') {
1169
- document.removeEventListener('pointerup', $b1a784c66b81d90efa4f74e05b$var$handleGlobalPointerEvent);
1170
- } else {
1171
- document.removeEventListener('touchend', $b1a784c66b81d90efa4f74e05b$var$setGlobalIgnoreEmulatedMouseEvents);
1172
- }
1173
- };
761
+ function $49c2914eac614f98$export$ec71b4b83ac08ec3(fn, deps, opts) {
762
+ $49c2914eac614f98$var$setupGlobalFocusEvents();
763
+ $d6MJ8$useEffect(()=>{
764
+ let handler = (modality, e)=>{
765
+ if (!$49c2914eac614f98$var$isKeyboardFocusEvent(opts === null || opts === void 0 ? void 0 : opts.isTextInput, modality, e)) return;
766
+ fn($49c2914eac614f98$export$b9b3dfddab17db27());
767
+ };
768
+ $49c2914eac614f98$var$changeHandlers.add(handler);
769
+ return ()=>{
770
+ $49c2914eac614f98$var$changeHandlers.delete(handler);
771
+ };
772
+ }, deps);
1174
773
  }
1175
- /**
1176
- * Handles pointer hover interactions for an element. Normalizes behavior
1177
- * across browsers and platforms, and ignores emulated mouse events on touch devices.
1178
- */
1179
-
1180
-
1181
- export function useHover(props) {
1182
- let {
1183
- onHoverStart,
1184
- onHoverChange,
1185
- onHoverEnd,
1186
- isDisabled
1187
- } = props;
1188
- let [isHovered, setHovered] = useState(false);
1189
- let state = useRef({
1190
- isHovered: false,
1191
- ignoreEmulatedMouseEvents: false,
1192
- pointerType: '',
1193
- target: null
1194
- }).current;
1195
- useEffect($b1a784c66b81d90efa4f74e05b$var$setupGlobalTouchEvents, []);
1196
- let {
1197
- hoverProps,
1198
- triggerHoverEnd
1199
- } = useMemo(() => {
1200
- let triggerHoverStart = (event, pointerType) => {
1201
- state.pointerType = pointerType;
1202
-
1203
- if (isDisabled || pointerType === 'touch' || state.isHovered || !event.currentTarget.contains(event.target)) {
1204
- return;
1205
- }
1206
-
1207
- state.isHovered = true;
1208
- let target = event.target;
1209
- state.target = target;
1210
-
1211
- if (onHoverStart) {
1212
- onHoverStart({
1213
- type: 'hoverstart',
1214
- target,
1215
- pointerType
1216
- });
1217
- }
1218
-
1219
- if (onHoverChange) {
1220
- onHoverChange(true);
1221
- }
1222
-
1223
- setHovered(true);
1224
- };
1225
-
1226
- let triggerHoverEnd = (event, pointerType) => {
1227
- state.pointerType = '';
1228
- state.target = null;
1229
774
 
1230
- if (pointerType === 'touch' || !state.isHovered) {
1231
- return;
1232
- }
1233
775
 
1234
- state.isHovered = false;
1235
- let target = event.target;
776
+ var $628b0269fe4ddcdd$exports = {};
1236
777
 
1237
- if (onHoverEnd) {
1238
- onHoverEnd({
1239
- type: 'hoverend',
1240
- target,
1241
- pointerType
1242
- });
1243
- }
778
+ $parcel$export($628b0269fe4ddcdd$exports, "useFocusWithin", () => $628b0269fe4ddcdd$export$420e68273165f4ec);
1244
779
 
1245
- if (onHoverChange) {
1246
- onHoverChange(false);
1247
- }
1248
-
1249
- setHovered(false);
1250
- };
1251
-
1252
- let hoverProps = {};
1253
-
1254
- if (typeof PointerEvent !== 'undefined') {
1255
- hoverProps.onPointerEnter = e => {
1256
- if ($b1a784c66b81d90efa4f74e05b$var$globalIgnoreEmulatedMouseEvents && e.pointerType === 'mouse') {
1257
- return;
1258
- }
1259
-
1260
- triggerHoverStart(e, e.pointerType);
1261
- };
1262
-
1263
- hoverProps.onPointerLeave = e => {
1264
- if (!isDisabled && e.currentTarget.contains(e.target)) {
1265
- triggerHoverEnd(e, e.pointerType);
780
+ function $628b0269fe4ddcdd$export$420e68273165f4ec(props) {
781
+ let state = $d6MJ8$useRef({
782
+ isFocusWithin: false
783
+ }).current;
784
+ if (props.isDisabled) return {
785
+ focusWithinProps: {
1266
786
  }
1267
- };
1268
- } else {
1269
- hoverProps.onTouchStart = () => {
1270
- state.ignoreEmulatedMouseEvents = true;
1271
- };
1272
-
1273
- hoverProps.onMouseEnter = e => {
1274
- if (!state.ignoreEmulatedMouseEvents && !$b1a784c66b81d90efa4f74e05b$var$globalIgnoreEmulatedMouseEvents) {
1275
- triggerHoverStart(e, 'mouse');
787
+ };
788
+ let onFocus = (e)=>{
789
+ if (!state.isFocusWithin) {
790
+ if (props.onFocusWithin) props.onFocusWithin(e);
791
+ if (props.onFocusWithinChange) props.onFocusWithinChange(true);
792
+ state.isFocusWithin = true;
1276
793
  }
1277
-
1278
- state.ignoreEmulatedMouseEvents = false;
1279
- };
1280
-
1281
- hoverProps.onMouseLeave = e => {
1282
- if (!isDisabled && e.currentTarget.contains(e.target)) {
1283
- triggerHoverEnd(e, 'mouse');
794
+ };
795
+ let onBlur = (e)=>{
796
+ // We don't want to trigger onBlurWithin and then immediately onFocusWithin again
797
+ // when moving focus inside the element. Only trigger if the currentTarget doesn't
798
+ // include the relatedTarget (where focus is moving).
799
+ if (state.isFocusWithin && !e.currentTarget.contains(e.relatedTarget)) {
800
+ if (props.onBlurWithin) props.onBlurWithin(e);
801
+ if (props.onFocusWithinChange) props.onFocusWithinChange(false);
802
+ state.isFocusWithin = false;
1284
803
  }
1285
- };
1286
- }
1287
-
804
+ };
1288
805
  return {
1289
- hoverProps,
1290
- triggerHoverEnd
806
+ focusWithinProps: {
807
+ onFocus: onFocus,
808
+ onBlur: onBlur
809
+ }
1291
810
  };
1292
- }, [onHoverStart, onHoverChange, onHoverEnd, isDisabled, state]);
1293
- useEffect(() => {
1294
- // Call the triggerHoverEnd as soon as isDisabled changes to true
1295
- // Safe to call triggerHoverEnd, it will early return if we aren't currently hovering
1296
- if (isDisabled) {
1297
- triggerHoverEnd({
1298
- target: state.target
1299
- }, state.pointerType);
1300
- }
1301
- }, [isDisabled]);
1302
- return {
1303
- hoverProps,
1304
- isHovered
1305
- };
1306
811
  }
1307
812
 
1308
- /**
1309
- * Example, used in components like Dialogs and Popovers so they can close
1310
- * when a user clicks outside them.
1311
- */
1312
- export function useInteractOutside(props) {
1313
- let {
1314
- ref,
1315
- onInteractOutside,
1316
- isDisabled,
1317
- onInteractOutsideStart
1318
- } = props;
1319
- let stateRef = useRef({
1320
- isPointerDown: false,
1321
- ignoreEmulatedMouseEvents: false,
1322
- onInteractOutside,
1323
- onInteractOutsideStart
1324
- });
1325
- let state = stateRef.current;
1326
- state.onInteractOutside = onInteractOutside;
1327
- state.onInteractOutsideStart = onInteractOutsideStart;
1328
- useEffect(() => {
1329
- if (isDisabled) {
1330
- return;
1331
- }
1332
-
1333
- let onPointerDown = e => {
1334
- if ($e415bb64ab27cb8fbfac2f417412022f$var$isValidEvent(e, ref) && state.onInteractOutside) {
1335
- if (state.onInteractOutsideStart) {
1336
- state.onInteractOutsideStart(e);
1337
- }
1338
813
 
1339
- state.isPointerDown = true;
1340
- }
1341
- }; // Use pointer events if available. Otherwise, fall back to mouse and touch events.
814
+ var $bf566e5397a9742e$exports = {};
1342
815
 
816
+ $parcel$export($bf566e5397a9742e$exports, "useHover", () => $bf566e5397a9742e$export$ae780daf29e6d456);
1343
817
 
1344
- if (typeof PointerEvent !== 'undefined') {
1345
- let onPointerUp = e => {
1346
- if (state.isPointerDown && state.onInteractOutside && $e415bb64ab27cb8fbfac2f417412022f$var$isValidEvent(e, ref)) {
1347
- state.isPointerDown = false;
1348
- state.onInteractOutside(e);
818
+ // iOS fires onPointerEnter twice: once with pointerType="touch" and again with pointerType="mouse".
819
+ // We want to ignore these emulated events so they do not trigger hover behavior.
820
+ // See https://bugs.webkit.org/show_bug.cgi?id=214609.
821
+ let $bf566e5397a9742e$var$globalIgnoreEmulatedMouseEvents = false;
822
+ let $bf566e5397a9742e$var$hoverCount = 0;
823
+ function $bf566e5397a9742e$var$setGlobalIgnoreEmulatedMouseEvents() {
824
+ $bf566e5397a9742e$var$globalIgnoreEmulatedMouseEvents = true;
825
+ // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter
826
+ // with pointerType="mouse" immediately after onPointerUp and before onFocus. On other
827
+ // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in
828
+ // the distant future because a user previously touched the element.
829
+ setTimeout(()=>{
830
+ $bf566e5397a9742e$var$globalIgnoreEmulatedMouseEvents = false;
831
+ }, 50);
832
+ }
833
+ function $bf566e5397a9742e$var$handleGlobalPointerEvent(e) {
834
+ if (e.pointerType === 'touch') $bf566e5397a9742e$var$setGlobalIgnoreEmulatedMouseEvents();
835
+ }
836
+ function $bf566e5397a9742e$var$setupGlobalTouchEvents() {
837
+ if (typeof document === 'undefined') return;
838
+ if (typeof PointerEvent !== 'undefined') document.addEventListener('pointerup', $bf566e5397a9742e$var$handleGlobalPointerEvent);
839
+ else document.addEventListener('touchend', $bf566e5397a9742e$var$setGlobalIgnoreEmulatedMouseEvents);
840
+ $bf566e5397a9742e$var$hoverCount++;
841
+ return ()=>{
842
+ $bf566e5397a9742e$var$hoverCount--;
843
+ if ($bf566e5397a9742e$var$hoverCount > 0) return;
844
+ if (typeof PointerEvent !== 'undefined') document.removeEventListener('pointerup', $bf566e5397a9742e$var$handleGlobalPointerEvent);
845
+ else document.removeEventListener('touchend', $bf566e5397a9742e$var$setGlobalIgnoreEmulatedMouseEvents);
846
+ };
847
+ }
848
+ function $bf566e5397a9742e$export$ae780daf29e6d456(props) {
849
+ let { onHoverStart: onHoverStart , onHoverChange: onHoverChange , onHoverEnd: onHoverEnd , isDisabled: isDisabled } = props;
850
+ let [isHovered, setHovered] = $d6MJ8$useState(false);
851
+ let state = $d6MJ8$useRef({
852
+ isHovered: false,
853
+ ignoreEmulatedMouseEvents: false,
854
+ pointerType: '',
855
+ target: null
856
+ }).current;
857
+ $d6MJ8$useEffect($bf566e5397a9742e$var$setupGlobalTouchEvents, []);
858
+ let { hoverProps: hoverProps1 , triggerHoverEnd: triggerHoverEnd1 } = $d6MJ8$useMemo(()=>{
859
+ let triggerHoverStart = (event, pointerType)=>{
860
+ state.pointerType = pointerType;
861
+ if (isDisabled || pointerType === 'touch' || state.isHovered || !event.currentTarget.contains(event.target)) return;
862
+ state.isHovered = true;
863
+ let target = event.currentTarget;
864
+ state.target = target;
865
+ if (onHoverStart) onHoverStart({
866
+ type: 'hoverstart',
867
+ target: target,
868
+ pointerType: pointerType
869
+ });
870
+ if (onHoverChange) onHoverChange(true);
871
+ setHovered(true);
872
+ };
873
+ let triggerHoverEnd = (event, pointerType)=>{
874
+ state.pointerType = '';
875
+ state.target = null;
876
+ if (pointerType === 'touch' || !state.isHovered) return;
877
+ state.isHovered = false;
878
+ let target = event.currentTarget;
879
+ if (onHoverEnd) onHoverEnd({
880
+ type: 'hoverend',
881
+ target: target,
882
+ pointerType: pointerType
883
+ });
884
+ if (onHoverChange) onHoverChange(false);
885
+ setHovered(false);
886
+ };
887
+ let hoverProps = {
888
+ };
889
+ if (typeof PointerEvent !== 'undefined') {
890
+ hoverProps.onPointerEnter = (e)=>{
891
+ if ($bf566e5397a9742e$var$globalIgnoreEmulatedMouseEvents && e.pointerType === 'mouse') return;
892
+ triggerHoverStart(e, e.pointerType);
893
+ };
894
+ hoverProps.onPointerLeave = (e)=>{
895
+ if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, e.pointerType);
896
+ };
897
+ } else {
898
+ hoverProps.onTouchStart = ()=>{
899
+ state.ignoreEmulatedMouseEvents = true;
900
+ };
901
+ hoverProps.onMouseEnter = (e)=>{
902
+ if (!state.ignoreEmulatedMouseEvents && !$bf566e5397a9742e$var$globalIgnoreEmulatedMouseEvents) triggerHoverStart(e, 'mouse');
903
+ state.ignoreEmulatedMouseEvents = false;
904
+ };
905
+ hoverProps.onMouseLeave = (e)=>{
906
+ if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, 'mouse');
907
+ };
1349
908
  }
1350
- }; // changing these to capture phase fixed combobox
909
+ return {
910
+ hoverProps: hoverProps,
911
+ triggerHoverEnd: triggerHoverEnd
912
+ };
913
+ }, [
914
+ onHoverStart,
915
+ onHoverChange,
916
+ onHoverEnd,
917
+ isDisabled,
918
+ state
919
+ ]);
920
+ $d6MJ8$useEffect(()=>{
921
+ // Call the triggerHoverEnd as soon as isDisabled changes to true
922
+ // Safe to call triggerHoverEnd, it will early return if we aren't currently hovering
923
+ if (isDisabled) triggerHoverEnd1({
924
+ currentTarget: state.target
925
+ }, state.pointerType);
926
+ }, [
927
+ isDisabled
928
+ ]);
929
+ return {
930
+ hoverProps: hoverProps1,
931
+ isHovered: isHovered
932
+ };
933
+ }
1351
934
 
1352
935
 
1353
- document.addEventListener('pointerdown', onPointerDown, true);
1354
- document.addEventListener('pointerup', onPointerUp, true);
1355
- return () => {
1356
- document.removeEventListener('pointerdown', onPointerDown, true);
1357
- document.removeEventListener('pointerup', onPointerUp, true);
1358
- };
1359
- } else {
1360
- let onMouseUp = e => {
1361
- if (state.ignoreEmulatedMouseEvents) {
1362
- state.ignoreEmulatedMouseEvents = false;
1363
- } else if (state.isPointerDown && state.onInteractOutside && $e415bb64ab27cb8fbfac2f417412022f$var$isValidEvent(e, ref)) {
1364
- state.isPointerDown = false;
1365
- state.onInteractOutside(e);
1366
- }
1367
- };
936
+ var $45105cf6ad39191a$exports = {};
1368
937
 
1369
- let onTouchEnd = e => {
1370
- state.ignoreEmulatedMouseEvents = true;
938
+ $parcel$export($45105cf6ad39191a$exports, "useInteractOutside", () => $45105cf6ad39191a$export$872b660ac5a1ff98);
1371
939
 
1372
- if (state.onInteractOutside && state.isPointerDown && $e415bb64ab27cb8fbfac2f417412022f$var$isValidEvent(e, ref)) {
1373
- state.isPointerDown = false;
1374
- state.onInteractOutside(e);
940
+ function $45105cf6ad39191a$export$872b660ac5a1ff98(props) {
941
+ let { ref: ref , onInteractOutside: onInteractOutside , isDisabled: isDisabled , onInteractOutsideStart: onInteractOutsideStart } = props;
942
+ let stateRef = $d6MJ8$useRef({
943
+ isPointerDown: false,
944
+ ignoreEmulatedMouseEvents: false,
945
+ onInteractOutside: onInteractOutside,
946
+ onInteractOutsideStart: onInteractOutsideStart
947
+ });
948
+ let state = stateRef.current;
949
+ state.onInteractOutside = onInteractOutside;
950
+ state.onInteractOutsideStart = onInteractOutsideStart;
951
+ $d6MJ8$useEffect(()=>{
952
+ if (isDisabled) return;
953
+ let onPointerDown = (e)=>{
954
+ if ($45105cf6ad39191a$var$isValidEvent(e, ref) && state.onInteractOutside) {
955
+ if (state.onInteractOutsideStart) state.onInteractOutsideStart(e);
956
+ state.isPointerDown = true;
957
+ }
958
+ };
959
+ // Use pointer events if available. Otherwise, fall back to mouse and touch events.
960
+ if (typeof PointerEvent !== 'undefined') {
961
+ let onPointerUp = (e)=>{
962
+ if (state.isPointerDown && state.onInteractOutside && $45105cf6ad39191a$var$isValidEvent(e, ref)) {
963
+ state.isPointerDown = false;
964
+ state.onInteractOutside(e);
965
+ }
966
+ };
967
+ // changing these to capture phase fixed combobox
968
+ document.addEventListener('pointerdown', onPointerDown, true);
969
+ document.addEventListener('pointerup', onPointerUp, true);
970
+ return ()=>{
971
+ document.removeEventListener('pointerdown', onPointerDown, true);
972
+ document.removeEventListener('pointerup', onPointerUp, true);
973
+ };
974
+ } else {
975
+ let onMouseUp = (e)=>{
976
+ if (state.ignoreEmulatedMouseEvents) state.ignoreEmulatedMouseEvents = false;
977
+ else if (state.isPointerDown && state.onInteractOutside && $45105cf6ad39191a$var$isValidEvent(e, ref)) {
978
+ state.isPointerDown = false;
979
+ state.onInteractOutside(e);
980
+ }
981
+ };
982
+ let onTouchEnd = (e)=>{
983
+ state.ignoreEmulatedMouseEvents = true;
984
+ if (state.onInteractOutside && state.isPointerDown && $45105cf6ad39191a$var$isValidEvent(e, ref)) {
985
+ state.isPointerDown = false;
986
+ state.onInteractOutside(e);
987
+ }
988
+ };
989
+ document.addEventListener('mousedown', onPointerDown, true);
990
+ document.addEventListener('mouseup', onMouseUp, true);
991
+ document.addEventListener('touchstart', onPointerDown, true);
992
+ document.addEventListener('touchend', onTouchEnd, true);
993
+ return ()=>{
994
+ document.removeEventListener('mousedown', onPointerDown, true);
995
+ document.removeEventListener('mouseup', onMouseUp, true);
996
+ document.removeEventListener('touchstart', onPointerDown, true);
997
+ document.removeEventListener('touchend', onTouchEnd, true);
998
+ };
1375
999
  }
1376
- };
1377
-
1378
- document.addEventListener('mousedown', onPointerDown, true);
1379
- document.addEventListener('mouseup', onMouseUp, true);
1380
- document.addEventListener('touchstart', onPointerDown, true);
1381
- document.addEventListener('touchend', onTouchEnd, true);
1382
- return () => {
1383
- document.removeEventListener('mousedown', onPointerDown, true);
1384
- document.removeEventListener('mouseup', onMouseUp, true);
1385
- document.removeEventListener('touchstart', onPointerDown, true);
1386
- document.removeEventListener('touchend', onTouchEnd, true);
1387
- };
1000
+ }, [
1001
+ ref,
1002
+ state,
1003
+ isDisabled
1004
+ ]);
1005
+ }
1006
+ function $45105cf6ad39191a$var$isValidEvent(event, ref) {
1007
+ if (event.button > 0) return false;
1008
+ // if the event target is no longer in the document
1009
+ if (event.target) {
1010
+ const ownerDocument = event.target.ownerDocument;
1011
+ if (!ownerDocument || !ownerDocument.documentElement.contains(event.target)) return false;
1388
1012
  }
1389
- }, [ref, state, isDisabled]);
1013
+ return ref.current && !ref.current.contains(event.target);
1390
1014
  }
1391
1015
 
1392
- function $e415bb64ab27cb8fbfac2f417412022f$var$isValidEvent(event, ref) {
1393
- if (event.button > 0) {
1394
- return false;
1395
- } // if the event target is no longer in the document
1396
-
1397
-
1398
- if (event.target) {
1399
- const ownerDocument = event.target.ownerDocument;
1400
1016
 
1401
- if (!ownerDocument || !ownerDocument.documentElement.contains(event.target)) {
1402
- return false;
1403
- }
1404
- }
1405
-
1406
- return ref.current && !ref.current.contains(event.target);
1017
+ var $4e806c4e858ad73c$exports = {};
1018
+
1019
+ $parcel$export($4e806c4e858ad73c$exports, "useKeyboard", () => $4e806c4e858ad73c$export$8f71654801c2f7cd);
1020
+ function $014803b002f7750a$export$48d1ea6320830260(handler) {
1021
+ if (!handler) return;
1022
+ let shouldStopPropagation = true;
1023
+ return (e)=>{
1024
+ let event = {
1025
+ ...e,
1026
+ preventDefault () {
1027
+ e.preventDefault();
1028
+ },
1029
+ isDefaultPrevented () {
1030
+ return e.isDefaultPrevented();
1031
+ },
1032
+ stopPropagation () {
1033
+ console.error('stopPropagation is now the default behavior for events in React Spectrum. You can use continuePropagation() to revert this behavior.');
1034
+ },
1035
+ continuePropagation () {
1036
+ shouldStopPropagation = false;
1037
+ }
1038
+ };
1039
+ handler(event);
1040
+ if (shouldStopPropagation) e.stopPropagation();
1041
+ };
1407
1042
  }
1408
1043
 
1409
- /**
1410
- * This function wraps a React event handler to make stopPropagation the default, and support continuePropagation instead.
1411
- */
1412
- function $dc0d75166de722fbf58eb6c3552$export$createEventHandler(handler) {
1413
- if (!handler) {
1414
- return;
1415
- }
1416
-
1417
- let shouldStopPropagation = true;
1418
- return e => {
1419
- let event = _babelRuntimeHelpersEsmExtends({}, e, {
1420
- preventDefault() {
1421
- e.preventDefault();
1422
- },
1423
1044
 
1424
- isDefaultPrevented() {
1425
- return e.isDefaultPrevented();
1426
- },
1045
+ function $4e806c4e858ad73c$export$8f71654801c2f7cd(props) {
1046
+ return {
1047
+ keyboardProps: props.isDisabled ? {
1048
+ } : {
1049
+ onKeyDown: $014803b002f7750a$export$48d1ea6320830260(props.onKeyDown),
1050
+ onKeyUp: $014803b002f7750a$export$48d1ea6320830260(props.onKeyUp)
1051
+ }
1052
+ };
1053
+ }
1427
1054
 
1428
- stopPropagation() {
1429
- console.error('stopPropagation is now the default behavior for events in React Spectrum. You can use continuePropagation() to revert this behavior.');
1430
- },
1431
1055
 
1432
- continuePropagation() {
1433
- shouldStopPropagation = false;
1434
- }
1056
+ var $8e3cc0943caa61b7$exports = {};
1435
1057
 
1436
- });
1058
+ $parcel$export($8e3cc0943caa61b7$exports, "useMove", () => $8e3cc0943caa61b7$export$36da96379f79f245);
1437
1059
 
1438
- handler(event);
1439
1060
 
1440
- if (shouldStopPropagation) {
1441
- e.stopPropagation();
1442
- }
1443
- };
1444
- }
1445
1061
 
1446
- /**
1447
- * Handles keyboard interactions for a focusable element.
1448
- */
1449
- export function useKeyboard(props) {
1450
- return {
1451
- keyboardProps: props.isDisabled ? {} : {
1452
- onKeyDown: $dc0d75166de722fbf58eb6c3552$export$createEventHandler(props.onKeyDown),
1453
- onKeyUp: $dc0d75166de722fbf58eb6c3552$export$createEventHandler(props.onKeyUp)
1454
- }
1455
- };
1456
- }
1457
-
1458
- /**
1459
- * Handles move interactions across mouse, touch, and keyboard, including dragging with
1460
- * the mouse or touch, and using the arrow keys. Normalizes behavior across browsers and
1461
- * platforms, and ignores emulated mouse events on touch devices.
1462
- */
1463
- export function useMove(props) {
1464
- let {
1465
- onMoveStart,
1466
- onMove,
1467
- onMoveEnd
1468
- } = props;
1469
- let state = useRef({
1470
- didMove: false,
1471
- lastPosition: null,
1472
- id: null
1473
- });
1474
- let {
1475
- addGlobalListener,
1476
- removeGlobalListener
1477
- } = useGlobalListeners();
1478
- let moveProps = useMemo(() => {
1479
- let moveProps = {};
1480
-
1481
- let start = () => {
1482
- $e17c9db826984f8ab8e5d837bf0b8$export$disableTextSelection();
1483
- state.current.didMove = false;
1062
+ function $8e3cc0943caa61b7$export$36da96379f79f245(props) {
1063
+ let { onMoveStart: onMoveStart , onMove: onMove , onMoveEnd: onMoveEnd } = props;
1064
+ let state = $d6MJ8$useRef({
1065
+ didMove: false,
1066
+ lastPosition: null,
1067
+ id: null
1068
+ });
1069
+ let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener } = $d6MJ8$useGlobalListeners();
1070
+ let moveProps1 = $d6MJ8$useMemo(()=>{
1071
+ let moveProps = {
1072
+ };
1073
+ let start = ()=>{
1074
+ $cd0dbdeabf637843$export$16a4697467175487();
1075
+ state.current.didMove = false;
1076
+ };
1077
+ let move = (originalEvent, pointerType, deltaX, deltaY)=>{
1078
+ if (deltaX === 0 && deltaY === 0) return;
1079
+ if (!state.current.didMove) {
1080
+ state.current.didMove = true;
1081
+ onMoveStart === null || onMoveStart === void 0 ? void 0 : onMoveStart({
1082
+ type: 'movestart',
1083
+ pointerType: pointerType,
1084
+ shiftKey: originalEvent.shiftKey,
1085
+ metaKey: originalEvent.metaKey,
1086
+ ctrlKey: originalEvent.ctrlKey,
1087
+ altKey: originalEvent.altKey
1088
+ });
1089
+ }
1090
+ onMove({
1091
+ type: 'move',
1092
+ pointerType: pointerType,
1093
+ deltaX: deltaX,
1094
+ deltaY: deltaY,
1095
+ shiftKey: originalEvent.shiftKey,
1096
+ metaKey: originalEvent.metaKey,
1097
+ ctrlKey: originalEvent.ctrlKey,
1098
+ altKey: originalEvent.altKey
1099
+ });
1100
+ };
1101
+ let end = (originalEvent, pointerType)=>{
1102
+ $cd0dbdeabf637843$export$b0d6fa1ab32e3295();
1103
+ if (state.current.didMove) onMoveEnd === null || onMoveEnd === void 0 ? void 0 : onMoveEnd({
1104
+ type: 'moveend',
1105
+ pointerType: pointerType,
1106
+ shiftKey: originalEvent.shiftKey,
1107
+ metaKey: originalEvent.metaKey,
1108
+ ctrlKey: originalEvent.ctrlKey,
1109
+ altKey: originalEvent.altKey
1110
+ });
1111
+ };
1112
+ if (typeof PointerEvent === 'undefined') {
1113
+ let onMouseMove = (e)=>{
1114
+ if (e.button === 0) {
1115
+ move(e, 'mouse', e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);
1116
+ state.current.lastPosition = {
1117
+ pageX: e.pageX,
1118
+ pageY: e.pageY
1119
+ };
1120
+ }
1121
+ };
1122
+ let onMouseUp = (e)=>{
1123
+ if (e.button === 0) {
1124
+ end(e, 'mouse');
1125
+ removeGlobalListener(window, 'mousemove', onMouseMove, false);
1126
+ removeGlobalListener(window, 'mouseup', onMouseUp, false);
1127
+ }
1128
+ };
1129
+ moveProps.onMouseDown = (e)=>{
1130
+ if (e.button === 0) {
1131
+ start();
1132
+ e.stopPropagation();
1133
+ e.preventDefault();
1134
+ state.current.lastPosition = {
1135
+ pageX: e.pageX,
1136
+ pageY: e.pageY
1137
+ };
1138
+ addGlobalListener(window, 'mousemove', onMouseMove, false);
1139
+ addGlobalListener(window, 'mouseup', onMouseUp, false);
1140
+ }
1141
+ };
1142
+ let onTouchMove = (e)=>{
1143
+ let touch = [
1144
+ ...e.changedTouches
1145
+ ].findIndex(({ identifier: identifier })=>identifier === state.current.id
1146
+ );
1147
+ if (touch >= 0) {
1148
+ let { pageX: pageX , pageY: pageY } = e.changedTouches[touch];
1149
+ move(e, 'touch', pageX - state.current.lastPosition.pageX, pageY - state.current.lastPosition.pageY);
1150
+ state.current.lastPosition = {
1151
+ pageX: pageX,
1152
+ pageY: pageY
1153
+ };
1154
+ }
1155
+ };
1156
+ let onTouchEnd = (e)=>{
1157
+ let touch = [
1158
+ ...e.changedTouches
1159
+ ].findIndex(({ identifier: identifier })=>identifier === state.current.id
1160
+ );
1161
+ if (touch >= 0) {
1162
+ end(e, 'touch');
1163
+ state.current.id = null;
1164
+ removeGlobalListener(window, 'touchmove', onTouchMove);
1165
+ removeGlobalListener(window, 'touchend', onTouchEnd);
1166
+ removeGlobalListener(window, 'touchcancel', onTouchEnd);
1167
+ }
1168
+ };
1169
+ moveProps.onTouchStart = (e)=>{
1170
+ if (e.changedTouches.length === 0 || state.current.id != null) return;
1171
+ let { pageX: pageX , pageY: pageY , identifier: identifier } = e.changedTouches[0];
1172
+ start();
1173
+ e.stopPropagation();
1174
+ e.preventDefault();
1175
+ state.current.lastPosition = {
1176
+ pageX: pageX,
1177
+ pageY: pageY
1178
+ };
1179
+ state.current.id = identifier;
1180
+ addGlobalListener(window, 'touchmove', onTouchMove, false);
1181
+ addGlobalListener(window, 'touchend', onTouchEnd, false);
1182
+ addGlobalListener(window, 'touchcancel', onTouchEnd, false);
1183
+ };
1184
+ } else {
1185
+ let onPointerMove = (e)=>{
1186
+ if (e.pointerId === state.current.id) {
1187
+ let pointerType = e.pointerType || 'mouse';
1188
+ // Problems with PointerEvent#movementX/movementY:
1189
+ // 1. it is always 0 on macOS Safari.
1190
+ // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS
1191
+ move(e, pointerType, e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);
1192
+ state.current.lastPosition = {
1193
+ pageX: e.pageX,
1194
+ pageY: e.pageY
1195
+ };
1196
+ }
1197
+ };
1198
+ let onPointerUp = (e)=>{
1199
+ if (e.pointerId === state.current.id) {
1200
+ let pointerType = e.pointerType || 'mouse';
1201
+ end(e, pointerType);
1202
+ state.current.id = null;
1203
+ removeGlobalListener(window, 'pointermove', onPointerMove, false);
1204
+ removeGlobalListener(window, 'pointerup', onPointerUp, false);
1205
+ removeGlobalListener(window, 'pointercancel', onPointerUp, false);
1206
+ }
1207
+ };
1208
+ moveProps.onPointerDown = (e)=>{
1209
+ if (e.button === 0 && state.current.id == null) {
1210
+ start();
1211
+ e.stopPropagation();
1212
+ e.preventDefault();
1213
+ state.current.lastPosition = {
1214
+ pageX: e.pageX,
1215
+ pageY: e.pageY
1216
+ };
1217
+ state.current.id = e.pointerId;
1218
+ addGlobalListener(window, 'pointermove', onPointerMove, false);
1219
+ addGlobalListener(window, 'pointerup', onPointerUp, false);
1220
+ addGlobalListener(window, 'pointercancel', onPointerUp, false);
1221
+ }
1222
+ };
1223
+ }
1224
+ let triggerKeyboardMove = (e, deltaX, deltaY)=>{
1225
+ start();
1226
+ move(e, 'keyboard', deltaX, deltaY);
1227
+ end(e, 'keyboard');
1228
+ };
1229
+ moveProps.onKeyDown = (e)=>{
1230
+ switch(e.key){
1231
+ case 'Left':
1232
+ case 'ArrowLeft':
1233
+ e.preventDefault();
1234
+ e.stopPropagation();
1235
+ triggerKeyboardMove(e, -1, 0);
1236
+ break;
1237
+ case 'Right':
1238
+ case 'ArrowRight':
1239
+ e.preventDefault();
1240
+ e.stopPropagation();
1241
+ triggerKeyboardMove(e, 1, 0);
1242
+ break;
1243
+ case 'Up':
1244
+ case 'ArrowUp':
1245
+ e.preventDefault();
1246
+ e.stopPropagation();
1247
+ triggerKeyboardMove(e, 0, -1);
1248
+ break;
1249
+ case 'Down':
1250
+ case 'ArrowDown':
1251
+ e.preventDefault();
1252
+ e.stopPropagation();
1253
+ triggerKeyboardMove(e, 0, 1);
1254
+ break;
1255
+ }
1256
+ };
1257
+ return moveProps;
1258
+ }, [
1259
+ state,
1260
+ onMoveStart,
1261
+ onMove,
1262
+ onMoveEnd,
1263
+ addGlobalListener,
1264
+ removeGlobalListener
1265
+ ]);
1266
+ return {
1267
+ moveProps: moveProps1
1484
1268
  };
1269
+ }
1485
1270
 
1486
- let move = (pointerType, deltaX, deltaY) => {
1487
- if (deltaX === 0 && deltaY === 0) {
1488
- return;
1489
- }
1490
-
1491
- if (!state.current.didMove) {
1492
- state.current.didMove = true;
1493
- onMoveStart == null ? void 0 : onMoveStart({
1494
- type: 'movestart',
1495
- pointerType
1496
- });
1497
- }
1498
-
1499
- onMove({
1500
- type: 'move',
1501
- pointerType,
1502
- deltaX: deltaX,
1503
- deltaY: deltaY
1504
- });
1505
- };
1506
1271
 
1507
- let end = pointerType => {
1508
- $e17c9db826984f8ab8e5d837bf0b8$export$restoreTextSelection();
1509
1272
 
1510
- if (state.current.didMove) {
1511
- onMoveEnd == null ? void 0 : onMoveEnd({
1512
- type: 'moveend',
1513
- pointerType
1514
- });
1515
- }
1516
- };
1273
+ var $d889b4c7bb142e6b$exports = {};
1517
1274
 
1518
- if (typeof PointerEvent === 'undefined') {
1519
- let onMouseMove = e => {
1520
- if (e.button === 0) {
1521
- move('mouse', e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);
1522
- state.current.lastPosition = {
1523
- pageX: e.pageX,
1524
- pageY: e.pageY
1525
- };
1526
- }
1527
- };
1275
+ $parcel$export($d889b4c7bb142e6b$exports, "useScrollWheel", () => $d889b4c7bb142e6b$export$2123ff2b87c81ca);
1528
1276
 
1529
- let onMouseUp = e => {
1530
- if (e.button === 0) {
1531
- end('mouse');
1532
- removeGlobalListener(window, 'mousemove', onMouseMove, false);
1533
- removeGlobalListener(window, 'mouseup', onMouseUp, false);
1534
- }
1535
- };
1536
-
1537
- moveProps.onMouseDown = e => {
1538
- if (e.button === 0) {
1539
- start();
1540
- e.stopPropagation();
1541
- e.preventDefault();
1542
- state.current.lastPosition = {
1543
- pageX: e.pageX,
1544
- pageY: e.pageY
1545
- };
1546
- addGlobalListener(window, 'mousemove', onMouseMove, false);
1547
- addGlobalListener(window, 'mouseup', onMouseUp, false);
1548
- }
1549
- };
1550
-
1551
- let onTouchMove = e => {
1552
- // @ts-ignore
1553
- let touch = [...e.changedTouches].findIndex((_ref) => {
1554
- let {
1555
- identifier
1556
- } = _ref;
1557
- return identifier === state.current.id;
1558
- });
1559
1277
 
1560
- if (touch >= 0) {
1561
- let {
1562
- pageX,
1563
- pageY
1564
- } = e.changedTouches[touch];
1565
- move('touch', pageX - state.current.lastPosition.pageX, pageY - state.current.lastPosition.pageY);
1566
- state.current.lastPosition = {
1567
- pageX,
1568
- pageY
1569
- };
1570
- }
1571
- };
1572
-
1573
- let onTouchEnd = e => {
1574
- // @ts-ignore
1575
- let touch = [...e.changedTouches].findIndex((_ref2) => {
1576
- let {
1577
- identifier
1578
- } = _ref2;
1579
- return identifier === state.current.id;
1278
+ function $d889b4c7bb142e6b$export$2123ff2b87c81ca(props, ref) {
1279
+ let { onScroll: onScroll , isDisabled: isDisabled } = props;
1280
+ let onScrollHandler = $d6MJ8$useCallback((e)=>{
1281
+ // If the ctrlKey is pressed, this is a zoom event, do nothing.
1282
+ if (e.ctrlKey) return;
1283
+ // stop scrolling the page
1284
+ e.preventDefault();
1285
+ e.stopPropagation();
1286
+ if (onScroll) onScroll({
1287
+ deltaX: e.deltaX,
1288
+ deltaY: e.deltaY
1580
1289
  });
1290
+ }, [
1291
+ onScroll
1292
+ ]);
1293
+ $d6MJ8$useEvent(ref, 'wheel', isDisabled ? null : onScrollHandler);
1294
+ }
1581
1295
 
1582
- if (touch >= 0) {
1583
- end('touch');
1584
- state.current.id = null;
1585
- removeGlobalListener(window, 'touchmove', onTouchMove);
1586
- removeGlobalListener(window, 'touchend', onTouchEnd);
1587
- removeGlobalListener(window, 'touchcancel', onTouchEnd);
1588
- }
1589
- };
1590
-
1591
- moveProps.onTouchStart = e => {
1592
- if (e.changedTouches.length === 0 || state.current.id != null) {
1593
- return;
1594
- }
1595
1296
 
1596
- let {
1597
- pageX,
1598
- pageY,
1599
- identifier
1600
- } = e.changedTouches[0];
1601
- start();
1602
- e.stopPropagation();
1603
- e.preventDefault();
1604
- state.current.lastPosition = {
1605
- pageX,
1606
- pageY
1607
- };
1608
- state.current.id = identifier;
1609
- addGlobalListener(window, 'touchmove', onTouchMove, false);
1610
- addGlobalListener(window, 'touchend', onTouchEnd, false);
1611
- addGlobalListener(window, 'touchcancel', onTouchEnd, false);
1612
- };
1613
- } else {
1614
- let onPointerMove = e => {
1615
- if (e.pointerId === state.current.id) {
1616
- // @ts-ignore
1617
- let pointerType = e.pointerType || 'mouse'; // Problems with PointerEvent#movementX/movementY:
1618
- // 1. it is always 0 on macOS Safari.
1619
- // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS
1620
-
1621
- move(pointerType, e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);
1622
- state.current.lastPosition = {
1623
- pageX: e.pageX,
1624
- pageY: e.pageY
1625
- };
1626
- }
1627
- };
1628
-
1629
- let onPointerUp = e => {
1630
- if (e.pointerId === state.current.id) {
1631
- // @ts-ignore
1632
- let pointerType = e.pointerType || 'mouse';
1633
- end(pointerType);
1634
- state.current.id = null;
1635
- removeGlobalListener(window, 'pointermove', onPointerMove, false);
1636
- removeGlobalListener(window, 'pointerup', onPointerUp, false);
1637
- removeGlobalListener(window, 'pointercancel', onPointerUp, false);
1638
- }
1639
- };
1640
-
1641
- moveProps.onPointerDown = e => {
1642
- if (e.button === 0 && state.current.id == null) {
1643
- start();
1644
- e.stopPropagation();
1645
- e.preventDefault();
1646
- state.current.lastPosition = {
1647
- pageX: e.pageX,
1648
- pageY: e.pageY
1649
- };
1650
- state.current.id = e.pointerId;
1651
- addGlobalListener(window, 'pointermove', onPointerMove, false);
1652
- addGlobalListener(window, 'pointerup', onPointerUp, false);
1653
- addGlobalListener(window, 'pointercancel', onPointerUp, false);
1297
+ var $6f6a8f8f8557a728$exports = {};
1298
+
1299
+ $parcel$export($6f6a8f8f8557a728$exports, "useLongPress", () => $6f6a8f8f8557a728$export$c24ed0104d07eab9);
1300
+
1301
+
1302
+
1303
+ const $6f6a8f8f8557a728$var$DEFAULT_THRESHOLD = 500;
1304
+ function $6f6a8f8f8557a728$export$c24ed0104d07eab9(props) {
1305
+ let { isDisabled: isDisabled , onLongPressStart: onLongPressStart , onLongPressEnd: onLongPressEnd , onLongPress: onLongPress , threshold: threshold = $6f6a8f8f8557a728$var$DEFAULT_THRESHOLD , accessibilityDescription: accessibilityDescription } = props;
1306
+ const timeRef = $d6MJ8$useRef(null);
1307
+ let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener } = $d6MJ8$useGlobalListeners();
1308
+ let { pressProps: pressProps } = $b468497b34dcb8dd$export$45712eceda6fad21({
1309
+ isDisabled: isDisabled,
1310
+ onPressStart (e1) {
1311
+ if (e1.pointerType === 'mouse' || e1.pointerType === 'touch') {
1312
+ if (onLongPressStart) onLongPressStart({
1313
+ ...e1,
1314
+ type: 'longpressstart'
1315
+ });
1316
+ timeRef.current = setTimeout(()=>{
1317
+ // Prevent other usePress handlers from also handling this event.
1318
+ e1.target.dispatchEvent(new PointerEvent('pointercancel', {
1319
+ bubbles: true
1320
+ }));
1321
+ if (onLongPress) onLongPress({
1322
+ ...e1,
1323
+ type: 'longpress'
1324
+ });
1325
+ timeRef.current = null;
1326
+ }, threshold);
1327
+ // Prevent context menu, which may be opened on long press on touch devices
1328
+ if (e1.pointerType === 'touch') {
1329
+ let onContextMenu = (e)=>{
1330
+ e.preventDefault();
1331
+ };
1332
+ addGlobalListener(e1.target, 'contextmenu', onContextMenu, {
1333
+ once: true
1334
+ });
1335
+ addGlobalListener(window, 'pointerup', ()=>{
1336
+ // If no contextmenu event is fired quickly after pointerup, remove the handler
1337
+ // so future context menu events outside a long press are not prevented.
1338
+ setTimeout(()=>{
1339
+ removeGlobalListener(e1.target, 'contextmenu', onContextMenu);
1340
+ }, 30);
1341
+ }, {
1342
+ once: true
1343
+ });
1344
+ }
1345
+ }
1346
+ },
1347
+ onPressEnd (e) {
1348
+ if (timeRef.current) clearTimeout(timeRef.current);
1349
+ if (onLongPressEnd && (e.pointerType === 'mouse' || e.pointerType === 'touch')) onLongPressEnd({
1350
+ ...e,
1351
+ type: 'longpressend'
1352
+ });
1654
1353
  }
1655
- };
1656
- }
1657
-
1658
- let triggerKeyboardMove = (deltaX, deltaY) => {
1659
- start();
1660
- move('keyboard', deltaX, deltaY);
1661
- end('keyboard');
1354
+ });
1355
+ let descriptionProps = $d6MJ8$useDescription(onLongPress && !isDisabled ? accessibilityDescription : null);
1356
+ return {
1357
+ longPressProps: $d6MJ8$mergeProps(pressProps, descriptionProps)
1662
1358
  };
1359
+ }
1663
1360
 
1664
- moveProps.onKeyDown = e => {
1665
- switch (e.key) {
1666
- case 'Left':
1667
- case 'ArrowLeft':
1668
- e.preventDefault();
1669
- e.stopPropagation();
1670
- triggerKeyboardMove(-1, 0);
1671
- break;
1672
-
1673
- case 'Right':
1674
- case 'ArrowRight':
1675
- e.preventDefault();
1676
- e.stopPropagation();
1677
- triggerKeyboardMove(1, 0);
1678
- break;
1679
-
1680
- case 'Up':
1681
- case 'ArrowUp':
1682
- e.preventDefault();
1683
- e.stopPropagation();
1684
- triggerKeyboardMove(0, -1);
1685
- break;
1686
-
1687
- case 'Down':
1688
- case 'ArrowDown':
1689
- e.preventDefault();
1690
- e.stopPropagation();
1691
- triggerKeyboardMove(0, 1);
1692
- break;
1693
- }
1694
- };
1695
1361
 
1696
- return moveProps;
1697
- }, [state, onMoveStart, onMove, onMoveEnd, addGlobalListener, removeGlobalListener]);
1698
- return {
1699
- moveProps
1700
- };
1701
- }
1702
- // scroll wheel needs to be added not passively so it's cancelable, small helper hook to remember that
1703
- export function useScrollWheel(props, ref) {
1704
- let {
1705
- onScroll,
1706
- isDisabled
1707
- } = props;
1708
- let onScrollHandler = useCallback(e => {
1709
- // If the ctrlKey is pressed, this is a zoom event, do nothing.
1710
- if (e.ctrlKey) {
1711
- return;
1712
- } // stop scrolling the page
1713
-
1714
-
1715
- e.preventDefault();
1716
- e.stopPropagation();
1717
-
1718
- if (onScroll) {
1719
- onScroll({
1720
- deltaX: e.deltaX,
1721
- deltaY: e.deltaY
1722
- });
1723
- }
1724
- }, [onScroll]);
1725
- useEffect(() => {
1726
- let elem = ref.current;
1727
1362
 
1728
- if (isDisabled) {
1729
- return;
1730
- }
1731
1363
 
1732
- elem.addEventListener('wheel', onScrollHandler);
1733
- return () => {
1734
- elem.removeEventListener('wheel', onScrollHandler);
1735
- };
1736
- }, [onScrollHandler, ref, isDisabled]);
1737
- }
1364
+ export {$28aa772934c24805$export$27c701ed9e449e99 as Pressable, $68900e0904c93fdc$export$3351871ee4b288b8 as PressResponder, $226b63c52f1613ce$export$f8168d8dd8fd66e6 as useFocus, $49c2914eac614f98$export$b9b3dfddab17db27 as isFocusVisible, $49c2914eac614f98$export$630ff653c5ada6a9 as getInteractionModality, $49c2914eac614f98$export$8397ddfc504fdb9a as setInteractionModality, $49c2914eac614f98$export$98e20ec92f614cfe as useInteractionModality, $49c2914eac614f98$export$ffd9e5021c1fb2d6 as useFocusVisible, $49c2914eac614f98$export$ec71b4b83ac08ec3 as useFocusVisibleListener, $628b0269fe4ddcdd$export$420e68273165f4ec as useFocusWithin, $bf566e5397a9742e$export$ae780daf29e6d456 as useHover, $45105cf6ad39191a$export$872b660ac5a1ff98 as useInteractOutside, $4e806c4e858ad73c$export$8f71654801c2f7cd as useKeyboard, $8e3cc0943caa61b7$export$36da96379f79f245 as useMove, $b468497b34dcb8dd$export$45712eceda6fad21 as usePress, $d889b4c7bb142e6b$export$2123ff2b87c81ca as useScrollWheel, $6f6a8f8f8557a728$export$c24ed0104d07eab9 as useLongPress};
1738
1365
  //# sourceMappingURL=module.js.map