forgebook 0.1.4 → 0.1.6
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/README.md +32 -1
- package/dist/bin/forgebook/agentClient.d.ts.map +1 -1
- package/dist/bin/forgebook/agentClient.js +2 -2
- package/dist/bin/forgebook/agentClient.js.map +1 -1
- package/dist/bin/forgebook/agentLoopCommands.d.mts.map +1 -1
- package/dist/bin/forgebook/agentLoopCommands.mjs +24 -3
- package/dist/bin/forgebook/agentLoopCommands.mjs.map +1 -1
- package/dist/bin/forgebook/agents.md +7 -1
- package/dist/bin/forgebook/errorsRun.d.ts.map +1 -1
- package/dist/bin/forgebook/errorsRun.js +14 -1
- package/dist/bin/forgebook/errorsRun.js.map +1 -1
- package/dist/bin/forgebook/forgebook.mjs +12 -2
- package/dist/bin/forgebook/forgebook.mjs.map +1 -1
- package/dist/bin/forgebook/importers/storybook.d.ts.map +1 -1
- package/dist/bin/forgebook/importers/storybook.js +41 -7
- package/dist/bin/forgebook/importers/storybook.js.map +1 -1
- package/dist/bin/forgebook/initCommands.d.mts.map +1 -1
- package/dist/bin/forgebook/initCommands.mjs +5 -2
- package/dist/bin/forgebook/initCommands.mjs.map +1 -1
- package/dist/bin/forgebook/mcpTools.d.ts.map +1 -1
- package/dist/bin/forgebook/mcpTools.js +14 -2
- package/dist/bin/forgebook/mcpTools.js.map +1 -1
- package/dist/bin/forgebook/storyCheckRun.d.ts +10 -0
- package/dist/bin/forgebook/storyCheckRun.d.ts.map +1 -1
- package/dist/bin/forgebook/storyCheckRun.js +4 -3
- package/dist/bin/forgebook/storyCheckRun.js.map +1 -1
- package/dist/bin/forgebook/touchWindowRun.d.ts +17 -0
- package/dist/bin/forgebook/touchWindowRun.d.ts.map +1 -0
- package/dist/bin/forgebook/touchWindowRun.js +22 -0
- package/dist/bin/forgebook/touchWindowRun.js.map +1 -0
- package/dist/src/catalogue.d.ts +6 -4
- package/dist/src/catalogue.d.ts.map +1 -1
- package/dist/src/catalogue.js +2 -1
- package/dist/src/catalogue.js.map +1 -1
- package/dist/src/controlKeys.d.ts +4 -4
- package/dist/src/controlKeys.d.ts.map +1 -1
- package/dist/src/controlKeys.js +12 -8
- package/dist/src/controlKeys.js.map +1 -1
- package/dist/src/frame/frameView.d.ts.map +1 -1
- package/dist/src/frame/frameView.js +7 -2
- package/dist/src/frame/frameView.js.map +1 -1
- package/dist/src/frame/mountFrame.d.ts.map +1 -1
- package/dist/src/frame/mountFrame.js +5 -1
- package/dist/src/frame/mountFrame.js.map +1 -1
- package/dist/src/frame/spillOutline.d.ts.map +1 -1
- package/dist/src/frame/spillOutline.js +2 -0
- package/dist/src/frame/spillOutline.js.map +1 -1
- package/dist/src/frame/touchDots.d.ts +32 -0
- package/dist/src/frame/touchDots.d.ts.map +1 -0
- package/dist/src/frame/touchDots.js +52 -0
- package/dist/src/frame/touchDots.js.map +1 -0
- package/dist/src/frame/touchEvents.d.ts +66 -0
- package/dist/src/frame/touchEvents.d.ts.map +1 -0
- package/dist/src/frame/touchEvents.js +152 -0
- package/dist/src/frame/touchEvents.js.map +1 -0
- package/dist/src/frame/touchGesture.d.ts +80 -0
- package/dist/src/frame/touchGesture.d.ts.map +1 -0
- package/dist/src/frame/touchGesture.js +87 -0
- package/dist/src/frame/touchGesture.js.map +1 -0
- package/dist/src/frame/touchLayer.d.ts +7 -0
- package/dist/src/frame/touchLayer.d.ts.map +1 -0
- package/dist/src/frame/touchLayer.js +449 -0
- package/dist/src/frame/touchLayer.js.map +1 -0
- package/dist/src/frame/touchScroll.d.ts +51 -0
- package/dist/src/frame/touchScroll.d.ts.map +1 -0
- package/dist/src/frame/touchScroll.js +154 -0
- package/dist/src/frame/touchScroll.js.map +1 -0
- package/dist/src/namedViews.d.ts +10 -1
- package/dist/src/namedViews.d.ts.map +1 -1
- package/dist/src/namedViews.js +24 -0
- package/dist/src/namedViews.js.map +1 -1
- package/dist/src/realTouch.d.ts +21 -0
- package/dist/src/realTouch.d.ts.map +1 -0
- package/dist/src/realTouch.js +16 -0
- package/dist/src/realTouch.js.map +1 -0
- package/dist/src/shell/ComponentPage.d.ts +6 -1
- package/dist/src/shell/ComponentPage.d.ts.map +1 -1
- package/dist/src/shell/ComponentPage.js +11 -3
- package/dist/src/shell/ComponentPage.js.map +1 -1
- package/dist/src/shell/ControlRow.d.ts.map +1 -1
- package/dist/src/shell/ControlRow.js +4 -1
- package/dist/src/shell/ControlRow.js.map +1 -1
- package/dist/src/shell/Example.d.ts +5 -0
- package/dist/src/shell/Example.d.ts.map +1 -1
- package/dist/src/shell/Example.js +18 -2
- package/dist/src/shell/Example.js.map +1 -1
- package/dist/src/shell/FrameView.d.ts +7 -0
- package/dist/src/shell/FrameView.d.ts.map +1 -1
- package/dist/src/shell/FrameView.js +12 -0
- package/dist/src/shell/FrameView.js.map +1 -1
- package/dist/src/shell/InfoTip.d.ts +23 -0
- package/dist/src/shell/InfoTip.d.ts.map +1 -0
- package/dist/src/shell/InfoTip.js +53 -0
- package/dist/src/shell/InfoTip.js.map +1 -0
- package/dist/src/shell/NamedViews.d.ts.map +1 -1
- package/dist/src/shell/NamedViews.js +2 -2
- package/dist/src/shell/NamedViews.js.map +1 -1
- package/dist/src/shell/PinnedControl.d.ts.map +1 -1
- package/dist/src/shell/PinnedControl.js +14 -2
- package/dist/src/shell/PinnedControl.js.map +1 -1
- package/dist/src/shell/Shell.d.ts.map +1 -1
- package/dist/src/shell/Shell.js +21 -3
- package/dist/src/shell/Shell.js.map +1 -1
- package/dist/src/shell/UsedIn.d.ts +4 -3
- package/dist/src/shell/UsedIn.d.ts.map +1 -1
- package/dist/src/shell/UsedIn.js +11 -7
- package/dist/src/shell/UsedIn.js.map +1 -1
- package/dist/src/shell/ViewMenu.d.ts +4 -2
- package/dist/src/shell/ViewMenu.d.ts.map +1 -1
- package/dist/src/shell/ViewMenu.js +14 -7
- package/dist/src/shell/ViewMenu.js.map +1 -1
- package/dist/src/shell/controlCycle.d.ts.map +1 -1
- package/dist/src/shell/controlCycle.js +3 -2
- package/dist/src/shell/controlCycle.js.map +1 -1
- package/dist/src/shell/icons.d.ts +1 -0
- package/dist/src/shell/icons.d.ts.map +1 -1
- package/dist/src/shell/icons.js +1 -0
- package/dist/src/shell/icons.js.map +1 -1
- package/dist/src/shell/shell.css +58 -1
- package/dist/src/shell/storyTouch.d.ts +52 -0
- package/dist/src/shell/storyTouch.d.ts.map +1 -0
- package/dist/src/shell/storyTouch.js +33 -0
- package/dist/src/shell/storyTouch.js.map +1 -0
- package/dist/src/shell/strings.d.ts +4 -3
- package/dist/src/shell/strings.d.ts.map +1 -1
- package/dist/src/shell/strings.js +4 -3
- package/dist/src/shell/strings.js.map +1 -1
- package/dist/src/shell/useFold.d.ts.map +1 -1
- package/dist/src/shell/useFold.js +2 -0
- package/dist/src/shell/useFold.js.map +1 -1
- package/dist/src/shell/useFrameMessages.d.ts +5 -2
- package/dist/src/shell/useFrameMessages.d.ts.map +1 -1
- package/dist/src/shell/useFrameMessages.js +1 -1
- package/dist/src/shell/useFrameMessages.js.map +1 -1
- package/dist/src/shell/useLiveView.d.ts +8 -1
- package/dist/src/shell/useLiveView.d.ts.map +1 -1
- package/dist/src/shell/useLiveView.js +14 -4
- package/dist/src/shell/useLiveView.js.map +1 -1
- package/dist/src/shell/useWorstCase.d.ts +2 -2
- package/dist/src/shell/useWorstCase.d.ts.map +1 -1
- package/dist/src/shell/useWorstCase.js +10 -3
- package/dist/src/shell/useWorstCase.js.map +1 -1
- package/dist/src/storyTree.d.ts +2 -0
- package/dist/src/storyTree.d.ts.map +1 -1
- package/dist/src/storyTree.js +1 -0
- package/dist/src/storyTree.js.map +1 -1
- package/dist/src/switches.d.ts +32 -6
- package/dist/src/switches.d.ts.map +1 -1
- package/dist/src/switches.js +45 -7
- package/dist/src/switches.js.map +1 -1
- package/dist/src/viewState.d.ts +27 -2
- package/dist/src/viewState.d.ts.map +1 -1
- package/dist/src/viewState.js +35 -2
- package/dist/src/viewState.js.map +1 -1
- package/dist/src/vite/agentRoutes.d.ts +7 -0
- package/dist/src/vite/agentRoutes.d.ts.map +1 -1
- package/dist/src/vite/agentRoutes.js +15 -2
- package/dist/src/vite/agentRoutes.js.map +1 -1
- package/dist/src/vite/forcedStates.d.ts +6 -2
- package/dist/src/vite/forcedStates.d.ts.map +1 -1
- package/dist/src/vite/forcedStates.js +20 -4
- package/dist/src/vite/forcedStates.js.map +1 -1
- package/dist/src/vite/forgebookPlugin.d.ts.map +1 -1
- package/dist/src/vite/forgebookPlugin.js +11 -21
- package/dist/src/vite/forgebookPlugin.js.map +1 -1
- package/dist/src/vite/indexStoryFile.d.ts +1 -1
- package/dist/src/vite/indexStoryFile.d.ts.map +1 -1
- package/dist/src/vite/indexStoryFile.js +14 -1
- package/dist/src/vite/indexStoryFile.js.map +1 -1
- package/dist/src/vite/mcpProtocol.d.ts.map +1 -1
- package/dist/src/vite/mcpProtocol.js +9 -1
- package/dist/src/vite/mcpProtocol.js.map +1 -1
- package/dist/src/vite/storyFilesModule.d.ts +25 -3
- package/dist/src/vite/storyFilesModule.d.ts.map +1 -1
- package/dist/src/vite/storyFilesModule.js +31 -4
- package/dist/src/vite/storyFilesModule.js.map +1 -1
- package/dist/src/vite/touchMedia.d.ts +35 -0
- package/dist/src/vite/touchMedia.d.ts.map +1 -0
- package/dist/src/vite/touchMedia.js +282 -0
- package/dist/src/vite/touchMedia.js.map +1 -0
- package/dist/src/vite/usageGraph.d.ts.map +1 -1
- package/dist/src/vite/usageGraph.js +25 -1
- package/dist/src/vite/usageGraph.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The frame's simulated touch, on while the root has `data-forgebook-touch` (the Touch switch): the real mouse's
|
|
3
|
+
* events are caught before the story and sent again as a finger, or as two with Shift held.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* A press sends `pointerdown` (touch) and `touchstart`; a move sends `touchmove`, and `pointermove` until a drag
|
|
7
|
+
* starts scrolling, when the pointer is cancelled as the browser cancels it (`touchScroll.ts`); a lift sends
|
|
8
|
+
* `pointerup` and `touchend`. A tap then sends the mouse's compatibility events and its own click of the `touch` type
|
|
9
|
+
* in place of the real one, so a button, a link or a checkbox reacts as it would; a press held half a second sends `contextmenu`. A moving mouse with
|
|
10
|
+
* no button down sends nothing: a finger does not hover. Shift fixes a centre beside the mouse (the second finger shows 80 px to its left); a press then puts a
|
|
11
|
+
* second finger mirrored around it, so dragging pinches and rotates. The real cursor is hidden and the fingers are
|
|
12
|
+
* dots (`touchDots.ts`). While it is on, `navigator.maxTouchPoints` and `ontouchstart` say touch, and capturing a
|
|
13
|
+
* simulated pointer works. A simulation: the events are not trusted, so the browser's own scrolling, focus from a
|
|
14
|
+
* touch, a virtual keyboard and real Safari stay a device's (or `forgebook dev --touch`'s).
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { isRealTouchWindow } from "../realTouch.js";
|
|
19
|
+
import { touchDots } from "./touchDots.js";
|
|
20
|
+
import { sendClick, sendMouse, sendPointer, sendTouch } from "./touchEvents.js";
|
|
21
|
+
import { dragAxis, isDragging, LONG_PRESS_MS, mirroredFinger } from "./touchGesture.js";
|
|
22
|
+
import { endPan, panBy, panOf } from "./touchScroll.js";
|
|
23
|
+
/** The root's attribute that turns the simulation on. */
|
|
24
|
+
const TOUCH_ATTRIBUTE = "data-forgebook-touch";
|
|
25
|
+
/** The simulated pointers' ids: apart from the real mouse's, so the browser never confuses them. */
|
|
26
|
+
const FINGER_IDS = [100, 101];
|
|
27
|
+
/** How far apart two fingers start, in CSS px: Shift fixes the centre half of it to the left of the mouse. */
|
|
28
|
+
const START_SPREAD_PX = 80;
|
|
29
|
+
/** A finger held still longer than this before it lifts, in ms, lifts without a fling. */
|
|
30
|
+
const STILL_MS = 80;
|
|
31
|
+
/** The real events that never reach the story while touch is simulated (the hover a finger does not have). */
|
|
32
|
+
const SWALLOWED = ["mousedown", "mouseup", "mousemove", "mouseover", "mouseout", "mouseenter", "mouseleave"];
|
|
33
|
+
/** The real pointer events that never reach the story: the fingers send their own. */
|
|
34
|
+
const SWALLOWED_POINTER = ["pointerover", "pointerout", "pointerenter", "pointerleave"];
|
|
35
|
+
/**
|
|
36
|
+
* The two-finger centre Shift fixes when it goes down with the mouse at a point: half the fingers' spread to its left,
|
|
37
|
+
* so the second finger shows at once beside the first, and moves mirrored from then on.
|
|
38
|
+
*
|
|
39
|
+
* @param point - where the mouse is.
|
|
40
|
+
*/
|
|
41
|
+
const shiftCenter = (point) => ({ x: point.x - START_SPREAD_PX / 2, y: point.y });
|
|
42
|
+
/**
|
|
43
|
+
* The fingers' dots: the fingers of a press, or the mouse (and the second finger to come, with Shift) between presses.
|
|
44
|
+
*
|
|
45
|
+
* @param state - the simulation's state.
|
|
46
|
+
*/
|
|
47
|
+
const drawDots = (state) => {
|
|
48
|
+
const { press, mouse, center } = state;
|
|
49
|
+
if (press !== undefined) {
|
|
50
|
+
state.dots.draw(press.fingers.map((finger) => ({ point: finger.point, isPressed: true })));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (mouse === undefined) {
|
|
54
|
+
state.dots.draw([]);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// the second finger where a press will put it: mirrored around Shift's centre
|
|
58
|
+
const second = center === undefined ? [] : [{ point: mirroredFinger(center, mouse), isPressed: false }];
|
|
59
|
+
state.dots.draw([{ point: mouse, isPressed: false }, ...second]);
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* The second finger going down at a point.
|
|
63
|
+
*
|
|
64
|
+
* @param document - the frame's document.
|
|
65
|
+
* @param id - its id.
|
|
66
|
+
* @param point - where.
|
|
67
|
+
* @param fallback - the element when none is under the point.
|
|
68
|
+
*/
|
|
69
|
+
const fingerAt = (document, id, point, fallback) => {
|
|
70
|
+
const target = document.elementFromPoint(point.x, point.y) ?? fallback;
|
|
71
|
+
return { id, isPrimary: false, point, startTarget: target, captureTarget: target };
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* A press begins: its fingers go down, each sending its pointer and touch events.
|
|
75
|
+
*
|
|
76
|
+
* @param state - the simulation's state.
|
|
77
|
+
* @param event - the real pointer's press.
|
|
78
|
+
*/
|
|
79
|
+
const pressDown = (state, event) => {
|
|
80
|
+
state.stopFling();
|
|
81
|
+
const point = { x: event.clientX, y: event.clientY };
|
|
82
|
+
const target = event.target instanceof Element ? event.target : state.document.documentElement;
|
|
83
|
+
const center = event.shiftKey ? (state.center ?? shiftCenter(point)) : undefined;
|
|
84
|
+
// the first finger goes down where the real press did, on the element the browser found under it
|
|
85
|
+
const fingers = [
|
|
86
|
+
{ id: FINGER_IDS[0], isPrimary: true, point, startTarget: target, captureTarget: target }
|
|
87
|
+
];
|
|
88
|
+
if (center !== undefined)
|
|
89
|
+
fingers.push(fingerAt(state.document, FINGER_IDS[1], mirroredFinger(center, point), target));
|
|
90
|
+
// the press is the layer's before its first event: a story that captures the pointer in its pointerdown finds it
|
|
91
|
+
const press = {
|
|
92
|
+
fingers,
|
|
93
|
+
start: point,
|
|
94
|
+
center,
|
|
95
|
+
isDrag: false,
|
|
96
|
+
isLongPress: false,
|
|
97
|
+
isDownCancelled: false,
|
|
98
|
+
isTouchCancelled: false,
|
|
99
|
+
pan: undefined,
|
|
100
|
+
last: { point, time: event.timeStamp },
|
|
101
|
+
speed: { x: 0, y: 0 },
|
|
102
|
+
timer: undefined
|
|
103
|
+
};
|
|
104
|
+
state.press = press;
|
|
105
|
+
for (const finger of fingers) {
|
|
106
|
+
sendPointer("pointerover", finger, true);
|
|
107
|
+
sendPointer("pointerenter", finger, true);
|
|
108
|
+
if (!sendPointer("pointerdown", finger, true))
|
|
109
|
+
press.isDownCancelled = true;
|
|
110
|
+
}
|
|
111
|
+
press.isTouchCancelled = !sendTouch("touchstart", fingers, fingers, true);
|
|
112
|
+
// a long press opens the story's menu, as on a phone
|
|
113
|
+
press.timer = window.setTimeout(() => {
|
|
114
|
+
if (press.isDrag || press.fingers.length > 1 || state.press !== press)
|
|
115
|
+
return;
|
|
116
|
+
press.isLongPress = true;
|
|
117
|
+
const [first] = press.fingers;
|
|
118
|
+
if (first !== undefined)
|
|
119
|
+
sendMouse("contextmenu", first);
|
|
120
|
+
}, LONG_PRESS_MS);
|
|
121
|
+
drawDots(state);
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Starts the drag of a press, the first time its finger passes a tap's reach: a single finger whose move no handler
|
|
125
|
+
* cancelled scrolls what it can (the pointer is then cancelled, as the browser cancels it).
|
|
126
|
+
*
|
|
127
|
+
* @param press - the press.
|
|
128
|
+
* @param isMoveCancelled - whether a handler cancelled this `touchmove`.
|
|
129
|
+
*/
|
|
130
|
+
const startDrag = (press, isMoveCancelled) => {
|
|
131
|
+
press.isDrag = true;
|
|
132
|
+
window.clearTimeout(press.timer);
|
|
133
|
+
const [first] = press.fingers;
|
|
134
|
+
if (isMoveCancelled || press.isTouchCancelled || press.fingers.length > 1 || first === undefined)
|
|
135
|
+
return;
|
|
136
|
+
press.pan = panOf(first.startTarget, dragAxis(press.start, first.point));
|
|
137
|
+
if (press.pan !== undefined)
|
|
138
|
+
sendPointer("pointercancel", first, false);
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* The fingers follow the mouse: touch events always, pointer events until the drag scrolls, the scroll otherwise.
|
|
142
|
+
*
|
|
143
|
+
* @param state - the simulation's state.
|
|
144
|
+
* @param press - the press.
|
|
145
|
+
* @param event - the real pointer's move.
|
|
146
|
+
*/
|
|
147
|
+
const pressMove = (state, press, event) => {
|
|
148
|
+
const point = { x: event.clientX, y: event.clientY };
|
|
149
|
+
// the mouse goes with the finger: after the lift, its dot stays where the finger left the screen
|
|
150
|
+
state.mouse = point;
|
|
151
|
+
const [first, second] = press.fingers;
|
|
152
|
+
if (first === undefined)
|
|
153
|
+
return;
|
|
154
|
+
const from = first.point;
|
|
155
|
+
first.point = point;
|
|
156
|
+
if (second !== undefined && press.center !== undefined)
|
|
157
|
+
second.point = mirroredFinger(press.center, point);
|
|
158
|
+
const isMoveCancelled = !sendTouch("touchmove", press.fingers, press.fingers, press.pan === undefined);
|
|
159
|
+
if (!press.isDrag && isDragging(press.start, point))
|
|
160
|
+
startDrag(press, isMoveCancelled);
|
|
161
|
+
const ms = Math.max(1, event.timeStamp - press.last.time);
|
|
162
|
+
press.speed = { x: (point.x - press.last.point.x) / ms, y: (point.y - press.last.point.y) / ms };
|
|
163
|
+
press.last = { point, time: event.timeStamp };
|
|
164
|
+
if (press.pan !== undefined)
|
|
165
|
+
panBy(press.pan, from, point);
|
|
166
|
+
else
|
|
167
|
+
for (const finger of press.fingers)
|
|
168
|
+
sendPointer("pointermove", finger, true);
|
|
169
|
+
drawDots(state);
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* A press ends: the fingers lift, a scroll flings on, a tap sends the mouse's compatibility events and readies its
|
|
173
|
+
* click.
|
|
174
|
+
*
|
|
175
|
+
* @param state - the simulation's state.
|
|
176
|
+
* @param press - the press.
|
|
177
|
+
* @param isCancel - whether the browser cancelled the real pointer, or the layer stops mid-press.
|
|
178
|
+
* @param time - when, as the events' `timeStamp`.
|
|
179
|
+
*/
|
|
180
|
+
const pressUp = (state, press, isCancel, time) => {
|
|
181
|
+
window.clearTimeout(press.timer);
|
|
182
|
+
// a finger that stopped before it lifted throws nothing
|
|
183
|
+
if (time - press.last.time > STILL_MS)
|
|
184
|
+
press.speed = { x: 0, y: 0 };
|
|
185
|
+
if (press.pan === undefined) {
|
|
186
|
+
// the press is still the layer's while its pointer ends: a story's pointerup may release its capture
|
|
187
|
+
for (const finger of press.fingers) {
|
|
188
|
+
sendPointer(isCancel ? "pointercancel" : "pointerup", finger, false);
|
|
189
|
+
// a touch pointer is captured from its press on (by its target, or where the story moved it), and lost here
|
|
190
|
+
sendPointer("lostpointercapture", finger, false);
|
|
191
|
+
sendPointer("pointerout", finger, false);
|
|
192
|
+
sendPointer("pointerleave", finger, false);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
state.press = undefined;
|
|
196
|
+
const isEndCancelled = !sendTouch(isCancel ? "touchcancel" : "touchend", [], press.fingers, press.pan === undefined);
|
|
197
|
+
if (press.pan !== undefined)
|
|
198
|
+
state.stopFling = endPan(press.pan, press.speed);
|
|
199
|
+
const [first] = press.fingers;
|
|
200
|
+
const isTap = !isCancel && !press.isDrag && !press.isLongPress && press.fingers.length === 1;
|
|
201
|
+
const isClicking = isTap && !press.isTouchCancelled && !isEndCancelled;
|
|
202
|
+
state.tapper = isClicking ? first : undefined;
|
|
203
|
+
if (isClicking && !press.isDownCancelled && first !== undefined) {
|
|
204
|
+
sendMouse("mousedown", first);
|
|
205
|
+
sendMouse("mouseup", first);
|
|
206
|
+
}
|
|
207
|
+
drawDots(state);
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* A real event the layer handles apart from the pointer's, before the story: the mouse's click (a tap's is sent again as
|
|
211
|
+
* a finger's, a drag's or a long press's is none), a text selection or an image dragged by the finger, the right
|
|
212
|
+
* button's menu. A click from the keyboard (Enter or Space on a button, Enter in a form) and the keyboard's menu key
|
|
213
|
+
* reach the story as they are: a finger changes nothing of the keyboard.
|
|
214
|
+
*
|
|
215
|
+
* @param state - the simulation's state.
|
|
216
|
+
* @param event - the real event.
|
|
217
|
+
* @returns whether the event was one of them, handled here.
|
|
218
|
+
*/
|
|
219
|
+
const handledApart = (state, event) => {
|
|
220
|
+
const isMouseEvent = event instanceof MouseEvent;
|
|
221
|
+
if (event.type === "click") {
|
|
222
|
+
// a click the keyboard made has no press behind it (`detail` 0) and no tap waiting for it
|
|
223
|
+
if (state.tapper === undefined && isMouseEvent && event.detail === 0)
|
|
224
|
+
return true;
|
|
225
|
+
event.preventDefault();
|
|
226
|
+
event.stopImmediatePropagation();
|
|
227
|
+
const finger = state.tapper;
|
|
228
|
+
state.tapper = undefined;
|
|
229
|
+
// after the real click's dispatch: cancelling it undoes a checkbox's toggle at its end, a click sent inside it too
|
|
230
|
+
const { target } = event;
|
|
231
|
+
if (finger !== undefined && target !== null)
|
|
232
|
+
state.clickTimer = window.setTimeout(() => {
|
|
233
|
+
state.clickTimer = undefined;
|
|
234
|
+
sendClick(target, finger);
|
|
235
|
+
}, 0);
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
if (event.type === "contextmenu" && !(isMouseEvent && event.button === 2))
|
|
239
|
+
return true;
|
|
240
|
+
if (event.type !== "selectstart" && event.type !== "dragstart" && event.type !== "contextmenu")
|
|
241
|
+
return false;
|
|
242
|
+
event.preventDefault();
|
|
243
|
+
event.stopImmediatePropagation();
|
|
244
|
+
return true;
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* The mouse moves: a press under way follows it (or lifts, when its button came up out of sight), the dots follow it
|
|
248
|
+
* between presses, and Shift held fixes the two-finger centre.
|
|
249
|
+
*
|
|
250
|
+
* @param state - the simulation's state.
|
|
251
|
+
* @param event - the real pointer's move.
|
|
252
|
+
*/
|
|
253
|
+
const pointerMove = (state, event) => {
|
|
254
|
+
const { press } = state;
|
|
255
|
+
if (press !== undefined && (event.buttons & 1) === 0) {
|
|
256
|
+
// the button came up where the frame could not see it (outside the window): the finger lifts here
|
|
257
|
+
state.mouse = { x: event.clientX, y: event.clientY };
|
|
258
|
+
pressUp(state, press, false, event.timeStamp);
|
|
259
|
+
}
|
|
260
|
+
else if (press !== undefined)
|
|
261
|
+
pressMove(state, press, event);
|
|
262
|
+
else {
|
|
263
|
+
// Shift read from the pointer, which carries it even when the frame has no focus (the shell usually does): held,
|
|
264
|
+
// it fixes the two-finger centre beside the mouse
|
|
265
|
+
if (!event.shiftKey)
|
|
266
|
+
state.center = undefined;
|
|
267
|
+
else
|
|
268
|
+
state.center ??= shiftCenter(state.mouse ?? { x: event.clientX, y: event.clientY });
|
|
269
|
+
state.mouse = { x: event.clientX, y: event.clientY };
|
|
270
|
+
drawDots(state);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
/**
|
|
274
|
+
* What the simulation does with one real pointer event: the press, the move and the lift of the fingers, the dots
|
|
275
|
+
* between presses.
|
|
276
|
+
*
|
|
277
|
+
* @param state - the simulation's state.
|
|
278
|
+
* @param event - the real pointer event.
|
|
279
|
+
*/
|
|
280
|
+
const pointerInput = (state, event) => {
|
|
281
|
+
const { press } = state;
|
|
282
|
+
if (event.type === "pointermove")
|
|
283
|
+
pointerMove(state, event);
|
|
284
|
+
else if (event.type === "pointerout" && event.relatedTarget === null && press === undefined) {
|
|
285
|
+
state.mouse = undefined;
|
|
286
|
+
drawDots(state);
|
|
287
|
+
}
|
|
288
|
+
else if (event.type === "pointerdown" && event.button === 0 && press === undefined)
|
|
289
|
+
pressDown(state, event);
|
|
290
|
+
else if ((event.type === "pointerup" || event.type === "pointercancel") && press !== undefined) {
|
|
291
|
+
state.mouse = { x: event.clientX, y: event.clientY };
|
|
292
|
+
pressUp(state, press, event.type === "pointercancel", event.timeStamp);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
/**
|
|
296
|
+
* What the simulation does with one real event, before the story sees it: the story never sees a real one.
|
|
297
|
+
*
|
|
298
|
+
* @param state - the simulation's state.
|
|
299
|
+
* @param event - the real event (the story's own dispatched events are left alone).
|
|
300
|
+
*/
|
|
301
|
+
const intercept = (state, event) => {
|
|
302
|
+
if (!event.isTrusted || handledApart(state, event))
|
|
303
|
+
return;
|
|
304
|
+
event.stopImmediatePropagation();
|
|
305
|
+
if (event instanceof PointerEvent)
|
|
306
|
+
pointerInput(state, event);
|
|
307
|
+
};
|
|
308
|
+
/**
|
|
309
|
+
* Makes the frame say it is a touch device, and lets the story capture a simulated pointer.
|
|
310
|
+
*
|
|
311
|
+
* @param state - the simulation's state.
|
|
312
|
+
* @returns what puts the frame back as it was.
|
|
313
|
+
*/
|
|
314
|
+
const pretendTouch = (state) => {
|
|
315
|
+
const view = state.document.defaultView;
|
|
316
|
+
if (view === null)
|
|
317
|
+
return () => undefined;
|
|
318
|
+
Object.defineProperty(view.navigator, "maxTouchPoints", { configurable: true, get: () => 5 });
|
|
319
|
+
Object.defineProperty(view, "ontouchstart", { configurable: true, writable: true, value: null });
|
|
320
|
+
const proto = view.Element.prototype;
|
|
321
|
+
const native = {
|
|
322
|
+
set: proto.setPointerCapture,
|
|
323
|
+
release: proto.releasePointerCapture,
|
|
324
|
+
has: proto.hasPointerCapture
|
|
325
|
+
};
|
|
326
|
+
const fingerOf = (id) => state.press?.fingers.find((finger) => finger.id === id);
|
|
327
|
+
// a simulated pointer's id never reaches the browser, which knows no such pointer: once its finger lifted, setting its
|
|
328
|
+
// capture fails as the browser fails it, releasing it does nothing
|
|
329
|
+
const isSimulated = (id) => FINGER_IDS.some((each) => each === id);
|
|
330
|
+
proto.setPointerCapture = function setPointerCapture(id) {
|
|
331
|
+
const finger = fingerOf(id);
|
|
332
|
+
if (finger === undefined && isSimulated(id))
|
|
333
|
+
throw new DOMException("No active pointer with the given id is found.", "NotFoundError");
|
|
334
|
+
if (finger === undefined) {
|
|
335
|
+
native.set.call(this, id);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
finger.captureTarget = this;
|
|
339
|
+
sendPointer("gotpointercapture", finger, true);
|
|
340
|
+
};
|
|
341
|
+
proto.releasePointerCapture = function releasePointerCapture(id) {
|
|
342
|
+
const finger = fingerOf(id);
|
|
343
|
+
if (finger === undefined) {
|
|
344
|
+
if (!isSimulated(id))
|
|
345
|
+
native.release.call(this, id);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
sendPointer("lostpointercapture", finger, true);
|
|
349
|
+
finger.captureTarget = finger.startTarget;
|
|
350
|
+
};
|
|
351
|
+
proto.hasPointerCapture = function hasPointerCapture(id) {
|
|
352
|
+
const finger = fingerOf(id);
|
|
353
|
+
if (finger === undefined)
|
|
354
|
+
return isSimulated(id) ? false : native.has.call(this, id);
|
|
355
|
+
return finger.captureTarget === this;
|
|
356
|
+
};
|
|
357
|
+
return () => {
|
|
358
|
+
Reflect.deleteProperty(view.navigator, "maxTouchPoints");
|
|
359
|
+
Reflect.deleteProperty(view, "ontouchstart");
|
|
360
|
+
proto.setPointerCapture = native.set;
|
|
361
|
+
proto.releasePointerCapture = native.release;
|
|
362
|
+
proto.hasPointerCapture = native.has;
|
|
363
|
+
};
|
|
364
|
+
};
|
|
365
|
+
/** The events the simulation catches, on the window, before the story. */
|
|
366
|
+
const CAUGHT = [
|
|
367
|
+
"pointerdown",
|
|
368
|
+
"pointermove",
|
|
369
|
+
"pointerup",
|
|
370
|
+
"pointercancel",
|
|
371
|
+
...SWALLOWED_POINTER,
|
|
372
|
+
...SWALLOWED,
|
|
373
|
+
"click",
|
|
374
|
+
"contextmenu",
|
|
375
|
+
"selectstart",
|
|
376
|
+
"dragstart"
|
|
377
|
+
];
|
|
378
|
+
/**
|
|
379
|
+
* Starts the simulation in a frame.
|
|
380
|
+
*
|
|
381
|
+
* @param document - the frame's document.
|
|
382
|
+
* @returns what stops it.
|
|
383
|
+
*/
|
|
384
|
+
const startTouch = (document) => {
|
|
385
|
+
const state = {
|
|
386
|
+
document,
|
|
387
|
+
dots: touchDots(document),
|
|
388
|
+
mouse: undefined,
|
|
389
|
+
center: undefined,
|
|
390
|
+
press: undefined,
|
|
391
|
+
tapper: undefined,
|
|
392
|
+
clickTimer: undefined,
|
|
393
|
+
stopFling: () => undefined
|
|
394
|
+
};
|
|
395
|
+
const restore = pretendTouch(state);
|
|
396
|
+
const onEvent = (event) => intercept(state, event);
|
|
397
|
+
// Shift fixes the two-finger centre where the mouse is, and shows where the second finger will be
|
|
398
|
+
const onKey = (event) => {
|
|
399
|
+
if (event.key !== "Shift" || state.press !== undefined)
|
|
400
|
+
return;
|
|
401
|
+
state.center =
|
|
402
|
+
event.type === "keydown" && state.mouse !== undefined ? shiftCenter(state.mouse) : undefined;
|
|
403
|
+
drawDots(state);
|
|
404
|
+
};
|
|
405
|
+
const view = document.defaultView;
|
|
406
|
+
for (const type of CAUGHT)
|
|
407
|
+
view?.addEventListener(type, onEvent, { capture: true });
|
|
408
|
+
view?.addEventListener("keydown", onKey);
|
|
409
|
+
view?.addEventListener("keyup", onKey);
|
|
410
|
+
return () => {
|
|
411
|
+
// a press under way is cancelled, as the browser cancels a touch it takes over: its timers, its scroll's snapping
|
|
412
|
+
// and a tap's click to come end with it
|
|
413
|
+
if (state.press !== undefined)
|
|
414
|
+
pressUp(state, state.press, true, performance.now());
|
|
415
|
+
window.clearTimeout(state.clickTimer);
|
|
416
|
+
state.tapper = undefined;
|
|
417
|
+
for (const type of CAUGHT)
|
|
418
|
+
view?.removeEventListener(type, onEvent, { capture: true });
|
|
419
|
+
view?.removeEventListener("keydown", onKey);
|
|
420
|
+
view?.removeEventListener("keyup", onKey);
|
|
421
|
+
state.stopFling();
|
|
422
|
+
restore();
|
|
423
|
+
state.dots.remove();
|
|
424
|
+
};
|
|
425
|
+
};
|
|
426
|
+
/**
|
|
427
|
+
* Follows the root's touch attribute from now on: the simulation runs while it is set.
|
|
428
|
+
*
|
|
429
|
+
* @param document - the frame's document.
|
|
430
|
+
*/
|
|
431
|
+
export const followTouch = (document) => {
|
|
432
|
+
let stop;
|
|
433
|
+
// in Chromium's real touch window the pages see real touch: simulating it on top would send every touch twice
|
|
434
|
+
const view = document.defaultView;
|
|
435
|
+
if (view !== null && isRealTouchWindow(view))
|
|
436
|
+
return;
|
|
437
|
+
const update = () => {
|
|
438
|
+
const isOn = document.documentElement.hasAttribute(TOUCH_ATTRIBUTE);
|
|
439
|
+
if (isOn && stop === undefined)
|
|
440
|
+
stop = startTouch(document);
|
|
441
|
+
else if (!isOn && stop !== undefined) {
|
|
442
|
+
stop();
|
|
443
|
+
stop = undefined;
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
new MutationObserver(update).observe(document.documentElement, { attributeFilter: [TOUCH_ATTRIBUTE] });
|
|
447
|
+
update();
|
|
448
|
+
};
|
|
449
|
+
//# sourceMappingURL=touchLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchLayer.js","sourceRoot":"","sources":["../../../src/frame/touchLayer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAkB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAe,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,MAAM,EAAY,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAElE,yDAAyD;AACzD,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAE/C,oGAAoG;AACpG,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,CAAU,CAAC;AAEvC,8GAA8G;AAC9G,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,0FAA0F;AAC1F,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB,8GAA8G;AAC9G,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAE7G,sFAAsF;AACtF,MAAM,iBAAiB,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AA8CxF;;;;;GAKG;AACH,MAAM,WAAW,GAAG,CAAC,KAAY,EAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAEhG;;;;GAIG;AACH,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAAQ,EAAE;IAC3C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IACD,8EAA8E;IAC9E,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACxG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,QAAQ,GAAG,CAAC,QAAkB,EAAE,EAAU,EAAE,KAAY,EAAE,QAAiB,EAAU,EAAE;IAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IACvE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACrF,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAE,KAAmB,EAAQ,EAAE;IACjE,KAAK,CAAC,SAAS,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC/F,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,iGAAiG;IACjG,MAAM,OAAO,GAAa;QACxB,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE;KAC1F,CAAC;IACF,IAAI,MAAM,KAAK,SAAS;QACtB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/F,iHAAiH;IACjH,MAAM,KAAK,GAAU;QACnB,OAAO;QACP,KAAK,EAAE,KAAK;QACZ,MAAM;QACN,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,KAAK;QACtB,gBAAgB,EAAE,KAAK;QACvB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE;QACtC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACrB,KAAK,EAAE,SAAS;KACjB,CAAC;IACF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACzC,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC;YAAE,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9E,CAAC;IACD,KAAK,CAAC,gBAAgB,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1E,qDAAqD;IACrD,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAS,EAAE;QACzC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO;QAC9E,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC,EAAE,aAAa,CAAC,CAAC;IAClB,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,eAAwB,EAAQ,EAAE;IACjE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,eAAe,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IACzG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,WAAW,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAE,KAAY,EAAE,KAAmB,EAAQ,EAAE;IAC/E,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACrD,iGAAiG;IACjG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACzB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3G,MAAM,eAAe,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IACvG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IACvF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACjG,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;;QACtD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO;YAAE,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClF,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,KAAY,EAAE,QAAiB,EAAE,IAAY,EAAQ,EAAE;IACzF,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,wDAAwD;IACxD,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ;QAAE,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,qGAAqG;QACrG,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACrE,4GAA4G;YAC5G,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;IACxB,MAAM,cAAc,GAAG,CAAC,SAAS,CAC/B,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EACrC,EAAE,EACF,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,GAAG,KAAK,SAAS,CACxB,CAAC;IACF,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7F,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,cAAc,CAAC;IACvE,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9C,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAChE,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC9B,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAE,KAAY,EAAW,EAAE;IAChE,MAAM,YAAY,GAAG,KAAK,YAAY,UAAU,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,0FAA0F;QAC1F,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAClF,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QACzB,mHAAmH;QACnH,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QACzB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;YACzC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAS,EAAE;gBAC9C,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC7B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACvF,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAC5F,OAAO,KAAK,CAAC;IACf,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAE,KAAmB,EAAQ,EAAE;IACnE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,kGAAkG;QAClG,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,KAAK,KAAK,SAAS;QAAE,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC1D,CAAC;QACJ,iHAAiH;QACjH,kDAAkD;QAClD,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;;YACzC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACrD,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAE,KAAmB,EAAQ,EAAE;IACpE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACvD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5F,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QACxB,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS;QAClF,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrB,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/F,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAE,KAAY,EAAQ,EAAE;IAC1D,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO;IAC3D,KAAK,CAAC,wBAAwB,EAAE,CAAC;IACjC,IAAI,KAAK,YAAY,YAAY;QAAE,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAgB,EAAE;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;IACxC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,GAAS,EAAE,CAAC,SAAS,CAAC;IAChD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,GAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACtG,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACrC,MAAM,MAAM,GAAG;QACb,GAAG,EAAE,KAAK,CAAC,iBAAiB;QAC5B,OAAO,EAAE,KAAK,CAAC,qBAAqB;QACpC,GAAG,EAAE,KAAK,CAAC,iBAAiB;KAC7B,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAsB,EAAE,CAClD,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,uHAAuH;IACvH,mEAAmE;IACnE,MAAM,WAAW,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACpF,KAAK,CAAC,iBAAiB,GAAG,SAAS,iBAAiB,CAAgB,EAAU;QAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,YAAY,CAAC,+CAA+C,EAAE,eAAe,CAAC,CAAC;QAC3F,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,WAAW,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC;IACF,KAAK,CAAC,qBAAqB,GAAG,SAAS,qBAAqB,CAAgB,EAAU;QACpF,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC;IAC5C,CAAC,CAAC;IACF,KAAK,CAAC,iBAAiB,GAAG,SAAS,iBAAiB,CAAgB,EAAU;QAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC,aAAa,KAAK,IAAI,CAAC;IACvC,CAAC,CAAC;IACF,OAAO,GAAS,EAAE;QAChB,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACzD,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC7C,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC;QACrC,KAAK,CAAC,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC;QAC7C,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,GAAsB;IAChC,aAAa;IACb,aAAa;IACb,WAAW;IACX,eAAe;IACf,GAAG,iBAAiB;IACpB,GAAG,SAAS;IACZ,OAAO;IACP,aAAa;IACb,aAAa;IACb,WAAW;CACZ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,QAAkB,EAAgB,EAAE;IACtD,MAAM,KAAK,GAAe;QACxB,QAAQ;QACR,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;QACzB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,GAAS,EAAE,CAAC,SAAS;KACjC,CAAC;IACF,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChE,kGAAkG;IAClG,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAQ,EAAE;QAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO;QAC/D,KAAK,CAAC,MAAM;YACV,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,MAAM,IAAI,GAAkB,QAAQ,CAAC,WAAW,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,IAAI,EAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,GAAS,EAAE;QAChB,kHAAkH;QAClH,wCAAwC;QACxC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,MAAM;YAAE,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,IAAI,EAAE,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAkB,EAAQ,EAAE;IACtD,IAAI,IAA8B,CAAC;IACnC,8GAA8G;IAC9G,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;IAClC,IAAI,IAAI,KAAK,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO;IACrD,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACpE,IAAI,IAAI,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;aACvD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC;YACP,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IACF,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,eAAe,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACvG,MAAM,EAAE,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simulated finger's scrolling: the container a drag scrolls, on the axes the `touch-action` on the way allows, and
|
|
3
|
+
* the fling that carries on after the finger lifts.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* An approximation of the browser's own scrolling, which a page cannot start: no rubber band at the ends, the fling
|
|
7
|
+
* slows down at one fixed rate (`flungSpeed`), and a container that snaps snaps once the finger lifts. The scroll keeps to the drag's axis; the container is the nearest
|
|
8
|
+
* ancestor that scrolls on it, up to the document's own scrolling element.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { type PanAxes, type Point } from "./touchGesture.ts";
|
|
13
|
+
/** A scroll a finger drives. */
|
|
14
|
+
export type Pan = {
|
|
15
|
+
/** The element it scrolls. */
|
|
16
|
+
readonly scroller: Element;
|
|
17
|
+
/** The axes it scrolls on. */
|
|
18
|
+
readonly axes: PanAxes;
|
|
19
|
+
/**
|
|
20
|
+
* For a container that snaps, its own `scroll-snap-type` (inline) while the drag pauses its snapping, put back when
|
|
21
|
+
* the finger lifts; none for one that does not snap.
|
|
22
|
+
*/
|
|
23
|
+
readonly pausedSnap: string | undefined;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* The scroll a drag drives along its axis, or none when the `touch-action` on the way forbids that axis (a horizontal
|
|
27
|
+
* swipe on a `pan-y` row stays the row's) or nothing on the way scrolls on it.
|
|
28
|
+
*
|
|
29
|
+
* @param target - the element the finger went down on.
|
|
30
|
+
* @param axis - the drag's axis.
|
|
31
|
+
*/
|
|
32
|
+
export declare const panOf: (target: Element, axis: "x" | "y") => Pan | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Scrolls by a finger's move: the content follows the finger.
|
|
35
|
+
*
|
|
36
|
+
* @param pan - the scroll.
|
|
37
|
+
* @param from - where the finger was.
|
|
38
|
+
* @param to - where it is.
|
|
39
|
+
*/
|
|
40
|
+
export declare const panBy: (pan: Pan, from: Point, to: Point) => void;
|
|
41
|
+
/**
|
|
42
|
+
* A drag's scroll ends as the finger lifts: a container that snaps snaps again, to the item nearest where the finger
|
|
43
|
+
* aimed (its place now plus its last speed, at most half the container ahead, so a flick goes to the next item and
|
|
44
|
+
* never past it), with the browser's smooth scroll; any other flings on. The returned function stops a fling (a new
|
|
45
|
+
* touch does).
|
|
46
|
+
*
|
|
47
|
+
* @param pan - the scroll.
|
|
48
|
+
* @param speed - the finger's last speed, in CSS px per ms, per axis.
|
|
49
|
+
*/
|
|
50
|
+
export declare const endPan: (pan: Pan, speed: Point) => (() => void);
|
|
51
|
+
//# sourceMappingURL=touchScroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchScroll.d.ts","sourceRoot":"","sources":["../../../src/frame/touchScroll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAA0B,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAErF,gCAAgC;AAChC,MAAM,MAAM,GAAG,GAAG;IAChB,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC,CAAC;AA0CF;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,KAAG,GAAG,GAAG,SAQ9D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,GAAG,EAAE,MAAM,KAAK,EAAE,IAAI,KAAK,KAAG,IAKrD,CAAC;AAkDL;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,KAAK,GAAG,EAAE,OAAO,KAAK,KAAG,CAAC,MAAM,IAAI,CAkB1D,CAAC"}
|