@tamagui/react-native-use-responder-events 1.88.13 → 1.88.15
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/LICENSE +21 -0
- package/dist/cjs/createResponderEvent.js.map +1 -1
- package/dist/cjs/createResponderEvent.native.js.map +1 -1
- package/dist/esm/ResponderSystem.mjs +223 -0
- package/dist/esm/ResponderTouchHistoryStore.mjs +88 -0
- package/dist/esm/createResponderEvent.js.map +1 -1
- package/dist/esm/createResponderEvent.mjs +111 -0
- package/dist/esm/createResponderEvent.native.js.map +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/types.mjs +33 -0
- package/dist/esm/useResponderEvents.mjs +28 -0
- package/dist/esm/utils.mjs +94 -0
- package/package.json +2 -2
- package/src/createResponderEvent.ts +4 -1
- package/types/createResponderEvent.d.ts +1 -1
- package/types/createResponderEvent.d.ts.map +1 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020 Nate Wienert
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createResponderEvent.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["touches"]
|
|
6
6
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createResponderEvent.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["touches"]
|
|
6
6
|
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import createResponderEvent from "./createResponderEvent.mjs";
|
|
2
|
+
import { ResponderTouchHistoryStore } from "./ResponderTouchHistoryStore.mjs";
|
|
3
|
+
import { isCancelish, isEndish, isMoveish, isScroll, isSelectionChange, isStartish } from "./types.mjs";
|
|
4
|
+
import { canUseDOM } from "./utils.mjs";
|
|
5
|
+
import { getLowestCommonAncestor, getResponderPaths, hasTargetTouches, hasValidSelection, isPrimaryPointerDown, setResponderId } from "./utils.mjs";
|
|
6
|
+
const emptyObject = {},
|
|
7
|
+
startRegistration = ["onStartShouldSetResponderCapture", "onStartShouldSetResponder", {
|
|
8
|
+
bubbles: !0
|
|
9
|
+
}],
|
|
10
|
+
moveRegistration = ["onMoveShouldSetResponderCapture", "onMoveShouldSetResponder", {
|
|
11
|
+
bubbles: !0
|
|
12
|
+
}],
|
|
13
|
+
scrollRegistration = ["onScrollShouldSetResponderCapture", "onScrollShouldSetResponder", {
|
|
14
|
+
bubbles: !1
|
|
15
|
+
}],
|
|
16
|
+
shouldSetResponderEvents = {
|
|
17
|
+
touchstart: startRegistration,
|
|
18
|
+
mousedown: startRegistration,
|
|
19
|
+
touchmove: moveRegistration,
|
|
20
|
+
mousemove: moveRegistration,
|
|
21
|
+
scroll: scrollRegistration
|
|
22
|
+
},
|
|
23
|
+
emptyResponder = {
|
|
24
|
+
id: null,
|
|
25
|
+
idPath: null,
|
|
26
|
+
node: null
|
|
27
|
+
},
|
|
28
|
+
responderListenersMap = /* @__PURE__ */new Map();
|
|
29
|
+
let isEmulatingMouseEvents = !1,
|
|
30
|
+
trackedTouchCount = 0,
|
|
31
|
+
currentResponder = {
|
|
32
|
+
id: null,
|
|
33
|
+
node: null,
|
|
34
|
+
idPath: null
|
|
35
|
+
};
|
|
36
|
+
const responderTouchHistoryStore = new ResponderTouchHistoryStore();
|
|
37
|
+
function changeCurrentResponder(responder) {
|
|
38
|
+
currentResponder = responder;
|
|
39
|
+
}
|
|
40
|
+
function getResponderConfig(id) {
|
|
41
|
+
const config = responderListenersMap.get(id);
|
|
42
|
+
return config ?? emptyObject;
|
|
43
|
+
}
|
|
44
|
+
function eventListener(domEvent) {
|
|
45
|
+
const eventType = domEvent.type,
|
|
46
|
+
eventTarget = domEvent.target;
|
|
47
|
+
if (eventType === "touchstart" && (isEmulatingMouseEvents = !0), (eventType === "touchmove" || trackedTouchCount > 1) && (isEmulatingMouseEvents = !1),
|
|
48
|
+
// Ignore browser emulated mouse events
|
|
49
|
+
eventType === "mousedown" && isEmulatingMouseEvents || eventType === "mousemove" && isEmulatingMouseEvents ||
|
|
50
|
+
// Ignore mousemove if a mousedown didn't occur first
|
|
51
|
+
eventType === "mousemove" && trackedTouchCount < 1) return;
|
|
52
|
+
if (isEmulatingMouseEvents && eventType === "mouseup") {
|
|
53
|
+
trackedTouchCount === 0 && (isEmulatingMouseEvents = !1);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const isStartEvent = isStartish(eventType) && isPrimaryPointerDown(domEvent),
|
|
57
|
+
isMoveEvent = isMoveish(eventType),
|
|
58
|
+
isEndEvent = isEndish(eventType),
|
|
59
|
+
isScrollEvent = isScroll(eventType),
|
|
60
|
+
isSelectionChangeEvent = isSelectionChange(eventType),
|
|
61
|
+
responderEvent = createResponderEvent(domEvent, responderTouchHistoryStore);
|
|
62
|
+
(isStartEvent || isMoveEvent || isEndEvent) && (domEvent.touches ? trackedTouchCount = domEvent.touches.length : isStartEvent ? trackedTouchCount = 1 : isEndEvent && (trackedTouchCount = 0), responderTouchHistoryStore.recordTouchTrack(eventType, responderEvent.nativeEvent));
|
|
63
|
+
let eventPaths = getResponderPaths(domEvent),
|
|
64
|
+
wasNegotiated = !1,
|
|
65
|
+
wantsResponder;
|
|
66
|
+
if (isStartEvent || isMoveEvent || isScrollEvent && trackedTouchCount > 0) {
|
|
67
|
+
const currentResponderIdPath = currentResponder.idPath,
|
|
68
|
+
eventIdPath = eventPaths.idPath;
|
|
69
|
+
if (currentResponderIdPath != null && eventIdPath != null) {
|
|
70
|
+
const lowestCommonAncestor = getLowestCommonAncestor(currentResponderIdPath, eventIdPath);
|
|
71
|
+
if (lowestCommonAncestor != null) {
|
|
72
|
+
const index = eventIdPath.indexOf(lowestCommonAncestor) + (lowestCommonAncestor === currentResponder.id ? 1 : 0);
|
|
73
|
+
eventPaths = {
|
|
74
|
+
idPath: eventIdPath.slice(index),
|
|
75
|
+
nodePath: eventPaths.nodePath.slice(index)
|
|
76
|
+
};
|
|
77
|
+
} else eventPaths = null;
|
|
78
|
+
}
|
|
79
|
+
eventPaths != null && (wantsResponder = findWantsResponder(eventPaths, domEvent, responderEvent), wantsResponder != null && (attemptTransfer(responderEvent, wantsResponder), wasNegotiated = !0));
|
|
80
|
+
}
|
|
81
|
+
if (currentResponder.id != null && currentResponder.node != null) {
|
|
82
|
+
const {
|
|
83
|
+
id,
|
|
84
|
+
node
|
|
85
|
+
} = currentResponder,
|
|
86
|
+
{
|
|
87
|
+
onResponderStart,
|
|
88
|
+
onResponderMove,
|
|
89
|
+
onResponderEnd,
|
|
90
|
+
onResponderRelease,
|
|
91
|
+
onResponderTerminate,
|
|
92
|
+
onResponderTerminationRequest
|
|
93
|
+
} = getResponderConfig(id);
|
|
94
|
+
if (responderEvent.bubbles = !1, responderEvent.cancelable = !1, responderEvent.currentTarget = node, isStartEvent) onResponderStart != null && (responderEvent.dispatchConfig.registrationName = "onResponderStart", onResponderStart(responderEvent));else if (isMoveEvent) onResponderMove != null && (responderEvent.dispatchConfig.registrationName = "onResponderMove", onResponderMove(responderEvent));else {
|
|
95
|
+
const isTerminateEvent = isCancelish(eventType) ||
|
|
96
|
+
// native context menu
|
|
97
|
+
eventType === "contextmenu" ||
|
|
98
|
+
// window blur
|
|
99
|
+
eventType === "blur" && eventTarget === window ||
|
|
100
|
+
// responder (or ancestors) blur
|
|
101
|
+
eventType === "blur" && eventTarget.contains(node) && domEvent.relatedTarget !== node ||
|
|
102
|
+
// native scroll without using a pointer
|
|
103
|
+
isScrollEvent && trackedTouchCount === 0 ||
|
|
104
|
+
// native scroll on node that is parent of the responder (allow siblings to scroll)
|
|
105
|
+
isScrollEvent && eventTarget.contains(node) && eventTarget !== node ||
|
|
106
|
+
// native select/selectionchange on node
|
|
107
|
+
isSelectionChangeEvent && hasValidSelection(domEvent),
|
|
108
|
+
isReleaseEvent = isEndEvent && !isTerminateEvent && !hasTargetTouches(node, domEvent.touches);
|
|
109
|
+
if (isEndEvent && onResponderEnd != null && (responderEvent.dispatchConfig.registrationName = "onResponderEnd", onResponderEnd(responderEvent)), isReleaseEvent && (onResponderRelease != null && (responderEvent.dispatchConfig.registrationName = "onResponderRelease", onResponderRelease(responderEvent)), changeCurrentResponder(emptyResponder)), isTerminateEvent) {
|
|
110
|
+
let shouldTerminate = !0;
|
|
111
|
+
(eventType === "contextmenu" || eventType === "scroll" || eventType === "selectionchange") && (wasNegotiated ? shouldTerminate = !1 : onResponderTerminationRequest != null && (responderEvent.dispatchConfig.registrationName = "onResponderTerminationRequest", onResponderTerminationRequest(responderEvent) === !1 && (shouldTerminate = !1))), shouldTerminate && (onResponderTerminate != null && (responderEvent.dispatchConfig.registrationName = "onResponderTerminate", onResponderTerminate(responderEvent)), changeCurrentResponder(emptyResponder), isEmulatingMouseEvents = !1, trackedTouchCount = 0);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function findWantsResponder(eventPaths, domEvent, responderEvent) {
|
|
117
|
+
const shouldSetCallbacks = shouldSetResponderEvents[domEvent.type];
|
|
118
|
+
if (shouldSetCallbacks != null) {
|
|
119
|
+
const {
|
|
120
|
+
idPath,
|
|
121
|
+
nodePath
|
|
122
|
+
} = eventPaths,
|
|
123
|
+
shouldSetCallbackCaptureName = shouldSetCallbacks[0],
|
|
124
|
+
shouldSetCallbackBubbleName = shouldSetCallbacks[1],
|
|
125
|
+
{
|
|
126
|
+
bubbles
|
|
127
|
+
} = shouldSetCallbacks[2],
|
|
128
|
+
check = (id, node, callbackName) => {
|
|
129
|
+
const shouldSetCallback = getResponderConfig(id)[callbackName];
|
|
130
|
+
if (shouldSetCallback != null && (responderEvent.currentTarget = node, shouldSetCallback(responderEvent) === !0)) {
|
|
131
|
+
const prunedIdPath = idPath.slice(idPath.indexOf(id));
|
|
132
|
+
return {
|
|
133
|
+
id,
|
|
134
|
+
node,
|
|
135
|
+
idPath: prunedIdPath
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
for (let i = idPath.length - 1; i >= 0; i--) {
|
|
140
|
+
const id = idPath[i],
|
|
141
|
+
node = nodePath[i],
|
|
142
|
+
result = check(id, node, shouldSetCallbackCaptureName);
|
|
143
|
+
if (result != null) return result;
|
|
144
|
+
if (responderEvent.isPropagationStopped() === !0) return;
|
|
145
|
+
}
|
|
146
|
+
if (bubbles) for (let i = 0; i < idPath.length; i++) {
|
|
147
|
+
const id = idPath[i],
|
|
148
|
+
node = nodePath[i],
|
|
149
|
+
result = check(id, node, shouldSetCallbackBubbleName);
|
|
150
|
+
if (result != null) return result;
|
|
151
|
+
if (responderEvent.isPropagationStopped() === !0) return;
|
|
152
|
+
} else {
|
|
153
|
+
const id = idPath[0],
|
|
154
|
+
node = nodePath[0];
|
|
155
|
+
if (domEvent.target === node) return check(id, node, shouldSetCallbackBubbleName);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function attemptTransfer(responderEvent, wantsResponder) {
|
|
160
|
+
const {
|
|
161
|
+
id: currentId,
|
|
162
|
+
node: currentNode
|
|
163
|
+
} = currentResponder,
|
|
164
|
+
{
|
|
165
|
+
id,
|
|
166
|
+
node
|
|
167
|
+
} = wantsResponder,
|
|
168
|
+
{
|
|
169
|
+
onResponderGrant,
|
|
170
|
+
onResponderReject
|
|
171
|
+
} = getResponderConfig(id);
|
|
172
|
+
if (responderEvent.bubbles = !1, responderEvent.cancelable = !1, responderEvent.currentTarget = node, currentId == null) onResponderGrant != null && (responderEvent.currentTarget = node, responderEvent.dispatchConfig.registrationName = "onResponderGrant", onResponderGrant(responderEvent)), changeCurrentResponder(wantsResponder);else {
|
|
173
|
+
const {
|
|
174
|
+
onResponderTerminate,
|
|
175
|
+
onResponderTerminationRequest
|
|
176
|
+
} = getResponderConfig(currentId);
|
|
177
|
+
let allowTransfer = !0;
|
|
178
|
+
onResponderTerminationRequest != null && (responderEvent.currentTarget = currentNode, responderEvent.dispatchConfig.registrationName = "onResponderTerminationRequest", onResponderTerminationRequest(responderEvent) === !1 && (allowTransfer = !1)), allowTransfer ? (onResponderTerminate != null && (responderEvent.currentTarget = currentNode, responderEvent.dispatchConfig.registrationName = "onResponderTerminate", onResponderTerminate(responderEvent)), onResponderGrant != null && (responderEvent.currentTarget = node, responderEvent.dispatchConfig.registrationName = "onResponderGrant", onResponderGrant(responderEvent)), changeCurrentResponder(wantsResponder)) : onResponderReject != null && (responderEvent.currentTarget = node, responderEvent.dispatchConfig.registrationName = "onResponderReject", onResponderReject(responderEvent));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const documentEventsCapturePhase = ["blur", "scroll"],
|
|
182
|
+
documentEventsBubblePhase = [
|
|
183
|
+
// mouse
|
|
184
|
+
"mousedown", "mousemove", "mouseup", "dragstart",
|
|
185
|
+
// touch
|
|
186
|
+
"touchstart", "touchmove", "touchend", "touchcancel",
|
|
187
|
+
// other
|
|
188
|
+
"contextmenu", "select", "selectionchange"],
|
|
189
|
+
isTamaguiResponderActive = Symbol();
|
|
190
|
+
function attachListeners() {
|
|
191
|
+
canUseDOM && !window[isTamaguiResponderActive] && (window.addEventListener("blur", eventListener), documentEventsBubblePhase.forEach(eventType => {
|
|
192
|
+
document.addEventListener(eventType, eventListener);
|
|
193
|
+
}), documentEventsCapturePhase.forEach(eventType => {
|
|
194
|
+
document.addEventListener(eventType, eventListener, !0);
|
|
195
|
+
}), window[isTamaguiResponderActive] = !0);
|
|
196
|
+
}
|
|
197
|
+
function addNode(id, node, config) {
|
|
198
|
+
setResponderId(node, id), responderListenersMap.set(id, config);
|
|
199
|
+
}
|
|
200
|
+
function removeNode(id) {
|
|
201
|
+
currentResponder.id === id && terminateResponder(), responderListenersMap.has(id) && responderListenersMap.delete(id);
|
|
202
|
+
}
|
|
203
|
+
function terminateResponder() {
|
|
204
|
+
const {
|
|
205
|
+
id,
|
|
206
|
+
node
|
|
207
|
+
} = currentResponder;
|
|
208
|
+
if (id != null && node != null) {
|
|
209
|
+
const {
|
|
210
|
+
onResponderTerminate
|
|
211
|
+
} = getResponderConfig(id);
|
|
212
|
+
if (onResponderTerminate != null) {
|
|
213
|
+
const event = createResponderEvent({}, responderTouchHistoryStore);
|
|
214
|
+
event.currentTarget = node, onResponderTerminate(event);
|
|
215
|
+
}
|
|
216
|
+
changeCurrentResponder(emptyResponder);
|
|
217
|
+
}
|
|
218
|
+
isEmulatingMouseEvents = !1, trackedTouchCount = 0;
|
|
219
|
+
}
|
|
220
|
+
function getResponderNode() {
|
|
221
|
+
return currentResponder.node;
|
|
222
|
+
}
|
|
223
|
+
export { addNode, attachListeners, getResponderNode, removeNode, terminateResponder };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { isEndish, isMoveish, isStartish } from "./types.mjs";
|
|
2
|
+
const MAX_TOUCH_BANK = 20;
|
|
3
|
+
function timestampForTouch(touch) {
|
|
4
|
+
return touch.timeStamp || touch.timestamp;
|
|
5
|
+
}
|
|
6
|
+
function createTouchRecord(touch) {
|
|
7
|
+
return {
|
|
8
|
+
touchActive: !0,
|
|
9
|
+
startPageX: touch.pageX,
|
|
10
|
+
startPageY: touch.pageY,
|
|
11
|
+
startTimeStamp: timestampForTouch(touch),
|
|
12
|
+
currentPageX: touch.pageX,
|
|
13
|
+
currentPageY: touch.pageY,
|
|
14
|
+
currentTimeStamp: timestampForTouch(touch),
|
|
15
|
+
previousPageX: touch.pageX,
|
|
16
|
+
previousPageY: touch.pageY,
|
|
17
|
+
previousTimeStamp: timestampForTouch(touch)
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function resetTouchRecord(touchRecord, touch) {
|
|
21
|
+
touchRecord.touchActive = !0, touchRecord.startPageX = touch.pageX, touchRecord.startPageY = touch.pageY, touchRecord.startTimeStamp = timestampForTouch(touch), touchRecord.currentPageX = touch.pageX, touchRecord.currentPageY = touch.pageY, touchRecord.currentTimeStamp = timestampForTouch(touch), touchRecord.previousPageX = touch.pageX, touchRecord.previousPageY = touch.pageY, touchRecord.previousTimeStamp = timestampForTouch(touch);
|
|
22
|
+
}
|
|
23
|
+
function getTouchIdentifier({
|
|
24
|
+
identifier
|
|
25
|
+
}) {
|
|
26
|
+
return identifier == null && console.error("Touch object is missing identifier."), process.env.NODE_ENV === "development" && identifier > MAX_TOUCH_BANK && console.error("Touch identifier %s is greater than maximum supported %s which causes performance issues backfilling array locations for all of the indices.", identifier, MAX_TOUCH_BANK), identifier;
|
|
27
|
+
}
|
|
28
|
+
function recordTouchStart(touch, touchHistory) {
|
|
29
|
+
const identifier = getTouchIdentifier(touch),
|
|
30
|
+
touchRecord = touchHistory.touchBank[identifier];
|
|
31
|
+
touchRecord ? resetTouchRecord(touchRecord, touch) : touchHistory.touchBank[identifier] = createTouchRecord(touch), touchHistory.mostRecentTimeStamp = timestampForTouch(touch);
|
|
32
|
+
}
|
|
33
|
+
function recordTouchMove(touch, touchHistory) {
|
|
34
|
+
const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)];
|
|
35
|
+
touchRecord ? (touchRecord.touchActive = !0, touchRecord.previousPageX = touchRecord.currentPageX, touchRecord.previousPageY = touchRecord.currentPageY, touchRecord.previousTimeStamp = touchRecord.currentTimeStamp, touchRecord.currentPageX = touch.pageX, touchRecord.currentPageY = touch.pageY, touchRecord.currentTimeStamp = timestampForTouch(touch), touchHistory.mostRecentTimeStamp = timestampForTouch(touch)) : console.warn(`Cannot record touch move without a touch start.
|
|
36
|
+
`, `Touch Move: ${printTouch(touch)}
|
|
37
|
+
`, `Touch Bank: ${printTouchBank(touchHistory)}`);
|
|
38
|
+
}
|
|
39
|
+
function recordTouchEnd(touch, touchHistory) {
|
|
40
|
+
const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)];
|
|
41
|
+
touchRecord ? (touchRecord.touchActive = !1, touchRecord.previousPageX = touchRecord.currentPageX, touchRecord.previousPageY = touchRecord.currentPageY, touchRecord.previousTimeStamp = touchRecord.currentTimeStamp, touchRecord.currentPageX = touch.pageX, touchRecord.currentPageY = touch.pageY, touchRecord.currentTimeStamp = timestampForTouch(touch), touchHistory.mostRecentTimeStamp = timestampForTouch(touch)) : console.warn(`Cannot record touch end without a touch start.
|
|
42
|
+
`, `Touch End: ${printTouch(touch)}
|
|
43
|
+
`, `Touch Bank: ${printTouchBank(touchHistory)}`);
|
|
44
|
+
}
|
|
45
|
+
function printTouch(touch) {
|
|
46
|
+
return JSON.stringify({
|
|
47
|
+
identifier: touch.identifier,
|
|
48
|
+
pageX: touch.pageX,
|
|
49
|
+
pageY: touch.pageY,
|
|
50
|
+
timestamp: timestampForTouch(touch)
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function printTouchBank(touchHistory) {
|
|
54
|
+
const {
|
|
55
|
+
touchBank
|
|
56
|
+
} = touchHistory;
|
|
57
|
+
let printed = JSON.stringify(touchBank.slice(0, MAX_TOUCH_BANK));
|
|
58
|
+
return touchBank.length > MAX_TOUCH_BANK && (printed += ` (original size: ${touchBank.length})`), printed;
|
|
59
|
+
}
|
|
60
|
+
class ResponderTouchHistoryStore {
|
|
61
|
+
_touchHistory = {
|
|
62
|
+
touchBank: [],
|
|
63
|
+
//Array<TouchRecord>
|
|
64
|
+
numberActiveTouches: 0,
|
|
65
|
+
// If there is only one active touch, we remember its location. This prevents
|
|
66
|
+
// us having to loop through all of the touches all the time in the most
|
|
67
|
+
// common case.
|
|
68
|
+
indexOfSingleActiveTouch: -1,
|
|
69
|
+
mostRecentTimeStamp: 0
|
|
70
|
+
};
|
|
71
|
+
recordTouchTrack(topLevelType, nativeEvent) {
|
|
72
|
+
const touchHistory = this._touchHistory;
|
|
73
|
+
if (isMoveish(topLevelType)) nativeEvent.changedTouches.forEach(touch => recordTouchMove(touch, touchHistory));else if (isStartish(topLevelType)) nativeEvent.changedTouches.forEach(touch => recordTouchStart(touch, touchHistory)), touchHistory.numberActiveTouches = nativeEvent.touches.length, touchHistory.numberActiveTouches === 1 && (touchHistory.indexOfSingleActiveTouch = nativeEvent.touches[0].identifier);else if (isEndish(topLevelType) && (nativeEvent.changedTouches.forEach(touch => recordTouchEnd(touch, touchHistory)), touchHistory.numberActiveTouches = nativeEvent.touches.length, touchHistory.numberActiveTouches === 1)) {
|
|
74
|
+
const {
|
|
75
|
+
touchBank
|
|
76
|
+
} = touchHistory;
|
|
77
|
+
for (let i = 0; i < touchBank.length; i++) if (touchBank[i]?.touchActive) {
|
|
78
|
+
touchHistory.indexOfSingleActiveTouch = i;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
process.env.NODE_ENV === "development" && (touchBank[touchHistory.indexOfSingleActiveTouch]?.touchActive || console.error("Cannot find single active touch."));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
get touchHistory() {
|
|
85
|
+
return this._touchHistory;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export { ResponderTouchHistoryStore };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createResponderEvent.ts"],
|
|
4
|
-
"mappings": "
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["touches"]
|
|
6
6
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { getBoundingClientRect } from "./utils.mjs";
|
|
2
|
+
const emptyFunction = () => {},
|
|
3
|
+
emptyObject = {},
|
|
4
|
+
emptyArray = [];
|
|
5
|
+
function normalizeIdentifier(identifier) {
|
|
6
|
+
return identifier > 20 ? identifier % 20 : identifier;
|
|
7
|
+
}
|
|
8
|
+
function createResponderEvent(domEvent, responderTouchHistoryStore) {
|
|
9
|
+
let rect,
|
|
10
|
+
propagationWasStopped = !1,
|
|
11
|
+
changedTouches,
|
|
12
|
+
touches;
|
|
13
|
+
const domEventChangedTouches = domEvent.changedTouches,
|
|
14
|
+
domEventType = domEvent.type,
|
|
15
|
+
metaKey = domEvent.metaKey === !0,
|
|
16
|
+
shiftKey = domEvent.shiftKey === !0,
|
|
17
|
+
force = domEventChangedTouches?.[0].force || 0,
|
|
18
|
+
identifier = normalizeIdentifier(domEventChangedTouches?.[0].identifier || 0),
|
|
19
|
+
clientX = domEventChangedTouches?.[0].clientX || domEvent.clientX,
|
|
20
|
+
clientY = domEventChangedTouches?.[0].clientY || domEvent.clientY,
|
|
21
|
+
pageX = domEventChangedTouches?.[0].pageX || domEvent.pageX,
|
|
22
|
+
pageY = domEventChangedTouches?.[0].pageY || domEvent.pageY,
|
|
23
|
+
preventDefault = typeof domEvent.preventDefault == "function" ? domEvent.preventDefault.bind(domEvent) : emptyFunction,
|
|
24
|
+
timestamp = domEvent.timeStamp;
|
|
25
|
+
function normalizeTouches(touches2) {
|
|
26
|
+
return Array.prototype.slice.call(touches2).map(touch => ({
|
|
27
|
+
force: touch.force,
|
|
28
|
+
identifier: normalizeIdentifier(touch.identifier),
|
|
29
|
+
get locationX() {
|
|
30
|
+
return locationX(touch.clientX);
|
|
31
|
+
},
|
|
32
|
+
get locationY() {
|
|
33
|
+
return locationY(touch.clientY);
|
|
34
|
+
},
|
|
35
|
+
pageX: touch.pageX,
|
|
36
|
+
pageY: touch.pageY,
|
|
37
|
+
target: touch.target,
|
|
38
|
+
timestamp
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
if (domEventChangedTouches != null) changedTouches = normalizeTouches(domEventChangedTouches), touches = normalizeTouches(domEvent.touches);else {
|
|
42
|
+
const emulatedTouches = [{
|
|
43
|
+
force,
|
|
44
|
+
identifier,
|
|
45
|
+
get locationX() {
|
|
46
|
+
return locationX(clientX);
|
|
47
|
+
},
|
|
48
|
+
get locationY() {
|
|
49
|
+
return locationY(clientY);
|
|
50
|
+
},
|
|
51
|
+
pageX,
|
|
52
|
+
pageY,
|
|
53
|
+
target: domEvent.target,
|
|
54
|
+
timestamp
|
|
55
|
+
}];
|
|
56
|
+
changedTouches = emulatedTouches, touches = domEventType === "mouseup" || domEventType === "dragstart" ? emptyArray : emulatedTouches;
|
|
57
|
+
}
|
|
58
|
+
const responderEvent = {
|
|
59
|
+
bubbles: !0,
|
|
60
|
+
cancelable: !0,
|
|
61
|
+
// `currentTarget` is set before dispatch
|
|
62
|
+
currentTarget: null,
|
|
63
|
+
defaultPrevented: domEvent.defaultPrevented,
|
|
64
|
+
dispatchConfig: emptyObject,
|
|
65
|
+
eventPhase: domEvent.eventPhase,
|
|
66
|
+
isDefaultPrevented() {
|
|
67
|
+
return domEvent.defaultPrevented;
|
|
68
|
+
},
|
|
69
|
+
isPropagationStopped() {
|
|
70
|
+
return propagationWasStopped;
|
|
71
|
+
},
|
|
72
|
+
isTrusted: domEvent.isTrusted,
|
|
73
|
+
nativeEvent: {
|
|
74
|
+
altKey: !1,
|
|
75
|
+
ctrlKey: !1,
|
|
76
|
+
metaKey,
|
|
77
|
+
shiftKey,
|
|
78
|
+
changedTouches,
|
|
79
|
+
force,
|
|
80
|
+
identifier,
|
|
81
|
+
get locationX() {
|
|
82
|
+
return locationX(clientX);
|
|
83
|
+
},
|
|
84
|
+
get locationY() {
|
|
85
|
+
return locationY(clientY);
|
|
86
|
+
},
|
|
87
|
+
pageX,
|
|
88
|
+
pageY,
|
|
89
|
+
target: domEvent.target,
|
|
90
|
+
timestamp,
|
|
91
|
+
touches,
|
|
92
|
+
type: domEventType
|
|
93
|
+
},
|
|
94
|
+
persist: emptyFunction,
|
|
95
|
+
preventDefault,
|
|
96
|
+
stopPropagation() {
|
|
97
|
+
propagationWasStopped = !0;
|
|
98
|
+
},
|
|
99
|
+
target: domEvent.target,
|
|
100
|
+
timeStamp: timestamp,
|
|
101
|
+
touchHistory: responderTouchHistoryStore.touchHistory
|
|
102
|
+
};
|
|
103
|
+
function locationX(x) {
|
|
104
|
+
if (rect = rect || getBoundingClientRect(responderEvent.currentTarget), rect) return x - rect.left;
|
|
105
|
+
}
|
|
106
|
+
function locationY(y) {
|
|
107
|
+
if (rect = rect || getBoundingClientRect(responderEvent.currentTarget), rect) return y - rect.top;
|
|
108
|
+
}
|
|
109
|
+
return responderEvent;
|
|
110
|
+
}
|
|
111
|
+
export { createResponderEvent as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createResponderEvent.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["touches"]
|
|
6
6
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./useResponderEvents.mjs";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const BLUR = "blur",
|
|
2
|
+
CONTEXT_MENU = "contextmenu",
|
|
3
|
+
FOCUS_OUT = "focusout",
|
|
4
|
+
MOUSE_DOWN = "mousedown",
|
|
5
|
+
MOUSE_MOVE = "mousemove",
|
|
6
|
+
MOUSE_UP = "mouseup",
|
|
7
|
+
MOUSE_CANCEL = "dragstart",
|
|
8
|
+
TOUCH_START = "touchstart",
|
|
9
|
+
TOUCH_MOVE = "touchmove",
|
|
10
|
+
TOUCH_END = "touchend",
|
|
11
|
+
TOUCH_CANCEL = "touchcancel",
|
|
12
|
+
SCROLL = "scroll",
|
|
13
|
+
SELECT = "select",
|
|
14
|
+
SELECTION_CHANGE = "selectionchange";
|
|
15
|
+
function isStartish(eventType) {
|
|
16
|
+
return eventType === TOUCH_START || eventType === MOUSE_DOWN;
|
|
17
|
+
}
|
|
18
|
+
function isMoveish(eventType) {
|
|
19
|
+
return eventType === TOUCH_MOVE || eventType === MOUSE_MOVE;
|
|
20
|
+
}
|
|
21
|
+
function isEndish(eventType) {
|
|
22
|
+
return eventType === TOUCH_END || eventType === MOUSE_UP || isCancelish(eventType);
|
|
23
|
+
}
|
|
24
|
+
function isCancelish(eventType) {
|
|
25
|
+
return eventType === TOUCH_CANCEL || eventType === MOUSE_CANCEL;
|
|
26
|
+
}
|
|
27
|
+
function isScroll(eventType) {
|
|
28
|
+
return eventType === SCROLL;
|
|
29
|
+
}
|
|
30
|
+
function isSelectionChange(eventType) {
|
|
31
|
+
return eventType === SELECT || eventType === SELECTION_CHANGE;
|
|
32
|
+
}
|
|
33
|
+
export { BLUR, CONTEXT_MENU, FOCUS_OUT, MOUSE_CANCEL, MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, SCROLL, SELECT, SELECTION_CHANGE, TOUCH_CANCEL, TOUCH_END, TOUCH_MOVE, TOUCH_START, isCancelish, isEndish, isMoveish, isScroll, isSelectionChange, isStartish };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as ResponderSystem from "./ResponderSystem.mjs";
|
|
3
|
+
export * from "./utils.mjs";
|
|
4
|
+
const emptyObject = {};
|
|
5
|
+
function useResponderEvents(hostRef, config = emptyObject) {
|
|
6
|
+
const id = React.useId(),
|
|
7
|
+
isAttachedRef = React.useRef(!1);
|
|
8
|
+
React.useEffect(() => (ResponderSystem.attachListeners(), () => {
|
|
9
|
+
ResponderSystem.removeNode(id);
|
|
10
|
+
}), [id]), React.useEffect(() => {
|
|
11
|
+
const {
|
|
12
|
+
onMoveShouldSetResponder,
|
|
13
|
+
onMoveShouldSetResponderCapture,
|
|
14
|
+
onScrollShouldSetResponder,
|
|
15
|
+
onScrollShouldSetResponderCapture,
|
|
16
|
+
onSelectionChangeShouldSetResponder,
|
|
17
|
+
onSelectionChangeShouldSetResponderCapture,
|
|
18
|
+
onStartShouldSetResponder,
|
|
19
|
+
onStartShouldSetResponderCapture
|
|
20
|
+
} = config,
|
|
21
|
+
requiresResponderSystem = onMoveShouldSetResponder != null || onMoveShouldSetResponderCapture != null || onScrollShouldSetResponder != null || onScrollShouldSetResponderCapture != null || onSelectionChangeShouldSetResponder != null || onSelectionChangeShouldSetResponderCapture != null || onStartShouldSetResponder != null || onStartShouldSetResponderCapture != null,
|
|
22
|
+
node = hostRef.current;
|
|
23
|
+
requiresResponderSystem ? (ResponderSystem.addNode(id, node, config), isAttachedRef.current = !0) : isAttachedRef.current && (ResponderSystem.removeNode(id), isAttachedRef.current = !1);
|
|
24
|
+
}, [config, hostRef, id]), process.env.NODE_ENV === "development" && (React.useDebugValue({
|
|
25
|
+
isResponder: hostRef.current === ResponderSystem.getResponderNode()
|
|
26
|
+
}), React.useDebugValue(config));
|
|
27
|
+
}
|
|
28
|
+
export { useResponderEvents };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const keyName = "__reactResponderId",
|
|
2
|
+
canUseDOM = !!(typeof window < "u" && window.document && window.document.createElement),
|
|
3
|
+
getBoundingClientRect = node => {
|
|
4
|
+
if (node && node.nodeType === 1 && node.getBoundingClientRect) return node.getBoundingClientRect();
|
|
5
|
+
};
|
|
6
|
+
function getEventPath(domEvent) {
|
|
7
|
+
if (domEvent.type === "selectionchange") {
|
|
8
|
+
const target = window.getSelection()?.anchorNode;
|
|
9
|
+
return composedPathFallback(target);
|
|
10
|
+
}
|
|
11
|
+
return domEvent.composedPath != null ? domEvent.composedPath() : composedPathFallback(domEvent.target);
|
|
12
|
+
}
|
|
13
|
+
function composedPathFallback(target) {
|
|
14
|
+
const path = [];
|
|
15
|
+
for (; target != null && target !== document.body;) path.push(target), target = target.parentNode;
|
|
16
|
+
return path;
|
|
17
|
+
}
|
|
18
|
+
function getResponderId(node) {
|
|
19
|
+
return node != null ? node[keyName] : null;
|
|
20
|
+
}
|
|
21
|
+
function setResponderId(node, id) {
|
|
22
|
+
node != null && (node[keyName] = id);
|
|
23
|
+
}
|
|
24
|
+
function getResponderPaths(domEvent) {
|
|
25
|
+
const idPath = [],
|
|
26
|
+
nodePath = [],
|
|
27
|
+
eventPath = getEventPath(domEvent);
|
|
28
|
+
for (let i = 0; i < eventPath.length; i++) {
|
|
29
|
+
const node = eventPath[i],
|
|
30
|
+
id = getResponderId(node);
|
|
31
|
+
id != null && (idPath.push(id), nodePath.push(node));
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
idPath,
|
|
35
|
+
nodePath
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function getLowestCommonAncestor(pathA, pathB) {
|
|
39
|
+
let pathALength = pathA.length,
|
|
40
|
+
pathBLength = pathB.length;
|
|
41
|
+
if (
|
|
42
|
+
// If either path is empty
|
|
43
|
+
pathALength === 0 || pathBLength === 0 ||
|
|
44
|
+
// If the last elements aren't the same there can't be a common ancestor
|
|
45
|
+
// that is connected to the responder system
|
|
46
|
+
pathA[pathALength - 1] !== pathB[pathBLength - 1]) return null;
|
|
47
|
+
let itemA = pathA[0],
|
|
48
|
+
indexA = 0,
|
|
49
|
+
itemB = pathB[0],
|
|
50
|
+
indexB = 0;
|
|
51
|
+
pathALength - pathBLength > 0 && (indexA = pathALength - pathBLength, itemA = pathA[indexA], pathALength = pathBLength), pathBLength - pathALength > 0 && (indexB = pathBLength - pathALength, itemB = pathB[indexB], pathBLength = pathALength);
|
|
52
|
+
let depth = pathALength;
|
|
53
|
+
for (; depth--;) {
|
|
54
|
+
if (itemA === itemB) return itemA;
|
|
55
|
+
itemA = pathA[indexA++], itemB = pathB[indexB++];
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
function hasTargetTouches(target, touches) {
|
|
60
|
+
if (!touches || touches.length === 0) return !1;
|
|
61
|
+
for (let i = 0; i < touches.length; i++) {
|
|
62
|
+
const node = touches[i].target;
|
|
63
|
+
if (node != null && target.contains(node)) return !0;
|
|
64
|
+
}
|
|
65
|
+
return !1;
|
|
66
|
+
}
|
|
67
|
+
function hasValidSelection(domEvent) {
|
|
68
|
+
return domEvent.type === "selectionchange" ? isSelectionValid() : domEvent.type === "select";
|
|
69
|
+
}
|
|
70
|
+
function isPrimaryPointerDown(domEvent) {
|
|
71
|
+
const {
|
|
72
|
+
altKey,
|
|
73
|
+
button,
|
|
74
|
+
buttons,
|
|
75
|
+
ctrlKey,
|
|
76
|
+
type
|
|
77
|
+
} = domEvent,
|
|
78
|
+
isTouch = type === "touchstart" || type === "touchmove",
|
|
79
|
+
isPrimaryMouseDown = type === "mousedown" && (button === 0 || buttons === 1),
|
|
80
|
+
isPrimaryMouseMove = type === "mousemove" && buttons === 1,
|
|
81
|
+
noModifiers = altKey === !1 && ctrlKey === !1;
|
|
82
|
+
return !!(isTouch || isPrimaryMouseDown && noModifiers || isPrimaryMouseMove && noModifiers);
|
|
83
|
+
}
|
|
84
|
+
function isSelectionValid() {
|
|
85
|
+
const selection = window.getSelection();
|
|
86
|
+
if (!selection) return !1;
|
|
87
|
+
const string = selection.toString(),
|
|
88
|
+
anchorNode = selection.anchorNode,
|
|
89
|
+
focusNode = selection.focusNode,
|
|
90
|
+
isTextNode = anchorNode && anchorNode.nodeType === window.Node.TEXT_NODE || focusNode && focusNode.nodeType === window.Node.TEXT_NODE;
|
|
91
|
+
return string.length >= 1 && string !== `
|
|
92
|
+
` && !!isTextNode;
|
|
93
|
+
}
|
|
94
|
+
export { canUseDOM, getBoundingClientRect, getLowestCommonAncestor, getResponderPaths, hasTargetTouches, hasValidSelection, isPrimaryPointerDown, isSelectionValid, setResponderId };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/react-native-use-responder-events",
|
|
3
|
-
"version": "1.88.
|
|
3
|
+
"version": "1.88.15",
|
|
4
4
|
"types": "./types/index.d.ts",
|
|
5
5
|
"main": "dist/cjs",
|
|
6
6
|
"module": "dist/esm",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"react": "*"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@tamagui/build": "1.88.
|
|
33
|
+
"@tamagui/build": "1.88.15",
|
|
34
34
|
"react": "^18.2.0"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
* LICENSE file in the root directory of this source tree.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import type {
|
|
8
|
+
ResponderTouchHistoryStore,
|
|
9
|
+
TouchHistory,
|
|
10
|
+
} from './ResponderTouchHistoryStore'
|
|
8
11
|
import { getBoundingClientRect } from './utils'
|
|
9
12
|
|
|
10
13
|
export type ResponderEvent = {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* This source code is licensed under the MIT license found in the
|
|
4
4
|
* LICENSE file in the root directory of this source tree.
|
|
5
5
|
*/
|
|
6
|
-
import { ResponderTouchHistoryStore, TouchHistory } from './ResponderTouchHistoryStore';
|
|
6
|
+
import type { ResponderTouchHistoryStore, TouchHistory } from './ResponderTouchHistoryStore';
|
|
7
7
|
export type ResponderEvent = {
|
|
8
8
|
bubbles: boolean;
|
|
9
9
|
cancelable: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createResponderEvent.d.ts","sourceRoot":"","sources":["../src/createResponderEvent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"createResponderEvent.d.ts","sourceRoot":"","sources":["../src/createResponderEvent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAC1B,YAAY,EACb,MAAM,8BAA8B,CAAA;AAGrC,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,GAAG,CAAA;IAClB,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAA;IAChC,cAAc,EAAE;QACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,uBAAuB,CAAC,EAAE;YACxB,OAAO,EAAE,MAAM,CAAA;YACf,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAA;KACF,CAAA;IACD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,kBAAkB,EAAE,MAAM,OAAO,CAAA;IACjC,oBAAoB,EAAE,MAAM,OAAO,CAAA;IACnC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,WAAW,EAAE,UAAU,CAAA;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,EAAE,GAAG,GAAG,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AAeD;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,QAAQ,EAAE,GAAG,EACb,0BAA0B,EAAE,0BAA0B,GACrD,cAAc,CAoIhB"}
|