@prose-reader/enhancer-gestures 1.222.0 → 1.223.0
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/index.d.ts +1 -0
- package/dist/index.js +129 -129
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +129 -129
- package/dist/index.umd.cjs.map +1 -1
- package/dist/types.d.ts +2 -2
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Reader } from '@prose-reader/core';
|
|
2
2
|
import { EnhancerAPI, InputSettings } from './types';
|
|
3
|
+
export * from './types';
|
|
3
4
|
export declare const gesturesEnhancer: <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) => (options: InheritOptions & {
|
|
4
5
|
gestures?: Partial<InputSettings>;
|
|
5
6
|
}) => InheritOutput & EnhancerAPI;
|
package/dist/index.js
CHANGED
|
@@ -1,71 +1,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { switchMap, of, combineLatest, first, filter, map, EMPTY, tap, takeUntil, withLatestFrom, merge, throttleTime, animationFrameScheduler, share } from "rxjs";
|
|
1
|
+
import { SettingsManager, isHtmlElement, HookManager } from "@prose-reader/core";
|
|
3
2
|
import { PinchRecognizer, PanRecognizer, TapRecognizer, SwipeRecognizer, Recognizable } from "gesturx";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const { x = 0, y } = normalizedEvent;
|
|
35
|
-
const beforeTapResults$ = hookManager.execute(
|
|
36
|
-
"beforeGesture",
|
|
37
|
-
void 0,
|
|
38
|
-
{ event$: of(event) }
|
|
39
|
-
);
|
|
40
|
-
return combineLatest([...beforeTapResults$, of(true)]).pipe(
|
|
41
|
-
first(),
|
|
42
|
-
filter((results) => !results.some((result) => result === false)),
|
|
43
|
-
map(() => {
|
|
44
|
-
const isTopArea = y < height * pageTurnMargin;
|
|
45
|
-
const isBottomArea = y > height * (1 - pageTurnMargin);
|
|
46
|
-
const isLeftArea = x < width * pageTurnMargin;
|
|
47
|
-
const isRightArea = x > width * (1 - pageTurnMargin);
|
|
48
|
-
if (isLeftArea && computedPageTurnDirection === "horizontal") {
|
|
49
|
-
reader.navigation.turnLeftOrTop();
|
|
50
|
-
} else if (isTopArea && computedPageTurnDirection === "vertical") {
|
|
51
|
-
reader.navigation.turnLeftOrTop();
|
|
52
|
-
} else if (isBottomArea && computedPageTurnDirection === "vertical") {
|
|
53
|
-
reader.navigation.turnRightOrBottom();
|
|
54
|
-
} else if (isRightArea && computedPageTurnDirection === "horizontal") {
|
|
55
|
-
reader.navigation.turnRightOrBottom();
|
|
56
|
-
} else {
|
|
57
|
-
return { event, handled: false };
|
|
58
|
-
}
|
|
59
|
-
return { event, handled: true };
|
|
60
|
-
})
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return EMPTY;
|
|
65
|
-
})
|
|
66
|
-
);
|
|
67
|
-
return gestures$;
|
|
68
|
-
};
|
|
3
|
+
import { tap, takeUntil, switchMap, EMPTY, map, filter, withLatestFrom, merge, throttleTime, animationFrameScheduler, of, combineLatest, first, share } from "rxjs";
|
|
4
|
+
class GesturesSettingsManager extends SettingsManager {
|
|
5
|
+
constructor(initialSettings, reader) {
|
|
6
|
+
super(initialSettings);
|
|
7
|
+
this.reader = reader;
|
|
8
|
+
reader.settings.values$.pipe(
|
|
9
|
+
tap(() => {
|
|
10
|
+
this.update({});
|
|
11
|
+
}),
|
|
12
|
+
takeUntil(this.destroy$)
|
|
13
|
+
).subscribe();
|
|
14
|
+
}
|
|
15
|
+
getOutputSettings(inputSettings) {
|
|
16
|
+
return {
|
|
17
|
+
...inputSettings,
|
|
18
|
+
panNavigation: this.reader.settings.values.computedPageTurnMode === `scrollable` ? false : inputSettings.panNavigation
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
getDefaultSettings() {
|
|
22
|
+
return {
|
|
23
|
+
panNavigation: "pan",
|
|
24
|
+
pinchCancelPan: true,
|
|
25
|
+
fontScalePinchEnabled: true,
|
|
26
|
+
fontScalePinchThrottleTime: 500,
|
|
27
|
+
fontScaleMaxScale: 5,
|
|
28
|
+
fontScaleMinScale: 0.2,
|
|
29
|
+
ignore: []
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
69
33
|
const DELAY_IGNORE_PAN = 400;
|
|
70
34
|
const registerPan = ({
|
|
71
35
|
reader,
|
|
@@ -98,68 +62,6 @@ const registerPan = ({
|
|
|
98
62
|
);
|
|
99
63
|
return gestures$;
|
|
100
64
|
};
|
|
101
|
-
const registerSwipe = ({
|
|
102
|
-
reader,
|
|
103
|
-
recognizable,
|
|
104
|
-
settingsManager
|
|
105
|
-
}) => {
|
|
106
|
-
const gestures$ = settingsManager.values$.pipe(
|
|
107
|
-
switchMap(
|
|
108
|
-
({ panNavigation }) => panNavigation !== "swipe" ? EMPTY : recognizable.events$.pipe(
|
|
109
|
-
filter((event) => event.type === "swipe"),
|
|
110
|
-
tap((event) => {
|
|
111
|
-
const { computedPageTurnDirection } = reader.settings.values;
|
|
112
|
-
if (computedPageTurnDirection === "vertical") {
|
|
113
|
-
if (event.velocityY < -0.5) {
|
|
114
|
-
reader == null ? void 0 : reader.navigation.turnRight();
|
|
115
|
-
}
|
|
116
|
-
if (event.velocityY > 0.5) {
|
|
117
|
-
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
118
|
-
}
|
|
119
|
-
} else {
|
|
120
|
-
if (event.velocityX < -0.5) {
|
|
121
|
-
reader == null ? void 0 : reader.navigation.turnRight();
|
|
122
|
-
}
|
|
123
|
-
if (event.velocityX > 0.5) {
|
|
124
|
-
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}),
|
|
128
|
-
map((event) => ({ event, handled: true }))
|
|
129
|
-
)
|
|
130
|
-
)
|
|
131
|
-
);
|
|
132
|
-
return gestures$;
|
|
133
|
-
};
|
|
134
|
-
class GesturesSettingsManager extends SettingsManager {
|
|
135
|
-
constructor(initialSettings, reader) {
|
|
136
|
-
super(initialSettings);
|
|
137
|
-
this.reader = reader;
|
|
138
|
-
reader.settings.values$.pipe(
|
|
139
|
-
tap(() => {
|
|
140
|
-
this.update({});
|
|
141
|
-
}),
|
|
142
|
-
takeUntil(this.destroy$)
|
|
143
|
-
).subscribe();
|
|
144
|
-
}
|
|
145
|
-
getOutputSettings(inputSettings) {
|
|
146
|
-
return {
|
|
147
|
-
...inputSettings,
|
|
148
|
-
panNavigation: this.reader.settings.values.computedPageTurnMode === `scrollable` ? false : inputSettings.panNavigation
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
getDefaultSettings() {
|
|
152
|
-
return {
|
|
153
|
-
panNavigation: "pan",
|
|
154
|
-
pinchCancelPan: true,
|
|
155
|
-
fontScalePinchEnabled: true,
|
|
156
|
-
fontScalePinchThrottleTime: 500,
|
|
157
|
-
fontScaleMaxScale: 5,
|
|
158
|
-
fontScaleMinScale: 0.2,
|
|
159
|
-
ignore: []
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
65
|
const isHtmlImageElement = (target) => isHtmlElement(target) && !!target.ownerDocument.defaultView && target instanceof target.ownerDocument.defaultView.HTMLImageElement;
|
|
164
66
|
const registerPinch = ({
|
|
165
67
|
reader,
|
|
@@ -243,6 +145,104 @@ const registerPinch = ({
|
|
|
243
145
|
})
|
|
244
146
|
);
|
|
245
147
|
};
|
|
148
|
+
const registerSwipe = ({
|
|
149
|
+
reader,
|
|
150
|
+
recognizable,
|
|
151
|
+
settingsManager
|
|
152
|
+
}) => {
|
|
153
|
+
const gestures$ = settingsManager.values$.pipe(
|
|
154
|
+
switchMap(
|
|
155
|
+
({ panNavigation }) => panNavigation !== "swipe" ? EMPTY : recognizable.events$.pipe(
|
|
156
|
+
filter((event) => event.type === "swipe"),
|
|
157
|
+
tap((event) => {
|
|
158
|
+
const { computedPageTurnDirection } = reader.settings.values;
|
|
159
|
+
if (computedPageTurnDirection === "vertical") {
|
|
160
|
+
if (event.velocityY < -0.5) {
|
|
161
|
+
reader == null ? void 0 : reader.navigation.turnRight();
|
|
162
|
+
}
|
|
163
|
+
if (event.velocityY > 0.5) {
|
|
164
|
+
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
if (event.velocityX < -0.5) {
|
|
168
|
+
reader == null ? void 0 : reader.navigation.turnRight();
|
|
169
|
+
}
|
|
170
|
+
if (event.velocityX > 0.5) {
|
|
171
|
+
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}),
|
|
175
|
+
map((event) => ({ event, handled: true }))
|
|
176
|
+
)
|
|
177
|
+
)
|
|
178
|
+
);
|
|
179
|
+
return gestures$;
|
|
180
|
+
};
|
|
181
|
+
const isNotLink = (event) => {
|
|
182
|
+
const target = event.event.target;
|
|
183
|
+
if (isHtmlElement(target) && target.tagName === "a") return false;
|
|
184
|
+
return true;
|
|
185
|
+
};
|
|
186
|
+
const istMatchingSelectors = (selectors, event) => {
|
|
187
|
+
const target = event.event.target;
|
|
188
|
+
if (!isHtmlElement(target)) return false;
|
|
189
|
+
const match = selectors.find((selector) => {
|
|
190
|
+
if (target.matches(selector)) return true;
|
|
191
|
+
if (target.closest(selector)) return true;
|
|
192
|
+
return false;
|
|
193
|
+
});
|
|
194
|
+
return !!match;
|
|
195
|
+
};
|
|
196
|
+
const registerTaps = ({
|
|
197
|
+
reader,
|
|
198
|
+
recognizable,
|
|
199
|
+
hookManager,
|
|
200
|
+
settingsManager
|
|
201
|
+
}) => {
|
|
202
|
+
const gestures$ = recognizable.events$.pipe(
|
|
203
|
+
switchMap((event) => {
|
|
204
|
+
const normalizedEvent = event.event;
|
|
205
|
+
const { computedPageTurnDirection } = reader.settings.values;
|
|
206
|
+
if (event.type === "tap" && isNotLink(event) && !istMatchingSelectors(settingsManager.values.ignore, event)) {
|
|
207
|
+
const width = window.innerWidth;
|
|
208
|
+
const height = window.innerHeight;
|
|
209
|
+
const pageTurnMargin = 0.15;
|
|
210
|
+
if (`x` in normalizedEvent) {
|
|
211
|
+
const { x = 0, y } = normalizedEvent;
|
|
212
|
+
const beforeTapResults$ = hookManager.execute(
|
|
213
|
+
"beforeGesture",
|
|
214
|
+
void 0,
|
|
215
|
+
{ event$: of(event) }
|
|
216
|
+
);
|
|
217
|
+
return combineLatest([...beforeTapResults$, of(true)]).pipe(
|
|
218
|
+
first(),
|
|
219
|
+
filter((results) => !results.some((result) => result === false)),
|
|
220
|
+
map(() => {
|
|
221
|
+
const isTopArea = y < height * pageTurnMargin;
|
|
222
|
+
const isBottomArea = y > height * (1 - pageTurnMargin);
|
|
223
|
+
const isLeftArea = x < width * pageTurnMargin;
|
|
224
|
+
const isRightArea = x > width * (1 - pageTurnMargin);
|
|
225
|
+
if (isLeftArea && computedPageTurnDirection === "horizontal") {
|
|
226
|
+
reader.navigation.turnLeftOrTop();
|
|
227
|
+
} else if (isTopArea && computedPageTurnDirection === "vertical") {
|
|
228
|
+
reader.navigation.turnLeftOrTop();
|
|
229
|
+
} else if (isBottomArea && computedPageTurnDirection === "vertical") {
|
|
230
|
+
reader.navigation.turnRightOrBottom();
|
|
231
|
+
} else if (isRightArea && computedPageTurnDirection === "horizontal") {
|
|
232
|
+
reader.navigation.turnRightOrBottom();
|
|
233
|
+
} else {
|
|
234
|
+
return { event, handled: false };
|
|
235
|
+
}
|
|
236
|
+
return { event, handled: true };
|
|
237
|
+
})
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return EMPTY;
|
|
242
|
+
})
|
|
243
|
+
);
|
|
244
|
+
return gestures$;
|
|
245
|
+
};
|
|
246
246
|
const registerZoomPan = ({
|
|
247
247
|
reader,
|
|
248
248
|
recognizer
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils.ts","../src/gestures/taps.ts","../src/gestures/pan.ts","../src/gestures/swipe.ts","../src/SettingsManager.ts","../src/gestures/pinch.ts","../src/gestures/zoomPan.ts","../src/index.ts"],"sourcesContent":["import type { GestureEvent } from \"./types\"\nimport { isHtmlElement } from \"@prose-reader/core\"\n\nexport const isNotLink = (event: GestureEvent) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent,\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, filter, first, map, of, switchMap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport { isNotLink, istMatchingSelectors } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n switchMap((event) => {\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n const width = window.innerWidth\n const height = window.innerHeight\n const pageTurnMargin = 0.15\n\n if (`x` in normalizedEvent) {\n const { x = 0, y } = normalizedEvent\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeGesture\",\n undefined,\n { event$: of(event) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n const isTopArea = y < height * pageTurnMargin\n const isBottomArea = y > height * (1 - pageTurnMargin)\n const isLeftArea = x < width * pageTurnMargin\n const isRightArea = x > width * (1 - pageTurnMargin)\n\n if (isLeftArea && computedPageTurnDirection === \"horizontal\") {\n reader.navigation.turnLeftOrTop()\n } else if (\n isTopArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n isBottomArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n isRightArea &&\n computedPageTurnDirection === \"horizontal\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PanRecognizer } from \"gesturx\"\n\nconst DELAY_IGNORE_PAN = 400\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) return\n\n if (event.type === `panStart`) {\n /**\n * We let the user select\n */\n if (event.delay > DELAY_IGNORE_PAN) return\n\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter((event) => event.type === \"swipe\"),\n tap((event) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map((event) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport {\n EMPTY,\n animationFrameScheduler,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PinchEvent } from \"gesturx\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter(target)\n }\n\n if (!reader.zoom.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: { recognizer: PanRecognizer; reader: Reader }) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (reader.zoom.isZooming) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport type { EnhancerAPI, InputSettings, Hook } from \"./types\"\nimport { registerTaps } from \"./gestures/taps\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 30,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.containerElement$.pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/SettingsManager.ts","../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps.ts","../src/gestures/zoomPan.ts","../src/index.ts"],"sourcesContent":["import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PanRecognizer } from \"gesturx\"\n\nconst DELAY_IGNORE_PAN = 400\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) return\n\n if (event.type === `panStart`) {\n /**\n * We let the user select\n */\n if (event.delay > DELAY_IGNORE_PAN) return\n\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport {\n EMPTY,\n animationFrameScheduler,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PinchEvent } from \"gesturx\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter(target)\n }\n\n if (!reader.zoom.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter((event) => event.type === \"swipe\"),\n tap((event) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map((event) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import type { GestureEvent } from \"./types\"\nimport { isHtmlElement } from \"@prose-reader/core\"\n\nexport const isNotLink = (event: GestureEvent) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent,\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, filter, first, map, of, switchMap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport { isNotLink, istMatchingSelectors } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n switchMap((event) => {\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n const width = window.innerWidth\n const height = window.innerHeight\n const pageTurnMargin = 0.15\n\n if (`x` in normalizedEvent) {\n const { x = 0, y } = normalizedEvent\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeGesture\",\n undefined,\n { event$: of(event) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n const isTopArea = y < height * pageTurnMargin\n const isBottomArea = y > height * (1 - pageTurnMargin)\n const isLeftArea = x < width * pageTurnMargin\n const isRightArea = x > width * (1 - pageTurnMargin)\n\n if (isLeftArea && computedPageTurnDirection === \"horizontal\") {\n reader.navigation.turnLeftOrTop()\n } else if (\n isTopArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n isBottomArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n isRightArea &&\n computedPageTurnDirection === \"horizontal\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: { recognizer: PanRecognizer; reader: Reader }) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (reader.zoom.isZooming) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport * from \"./types\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 30,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.containerElement$.pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["event"],"mappings":";;;AAIO,MAAM,gCAAgC,gBAG3C;AAAA,EACA,YACE,iBACQ,QACR;AACA,UAAM,eAAe;AAFb,SAAA,SAAA;AAQR,WAAO,SAAS,QACb;AAAA,MACC,IAAI,MAAM;AACR,aAAK,OAAO,EAAE;AAAA,MAAA,CACf;AAAA,MACD,UAAU,KAAK,QAAQ;AAAA,IAAA,EAExB,UAAA;AAAA,EAAU;AAAA,EAGf,kBAAkB,eAA8C;AAC9D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,eACE,KAAK,OAAO,SAAS,OAAO,yBAAyB,eACjD,QACA,cAAc;AAAA,IAAA;AAAA,EACtB;AAAA,EAGF,qBAAoC;AAClC,WAAO;AAAA,MACL,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,QAAQ,CAAA;AAAA,IAAC;AAAA,EACX;AAEJ;AC3CA,MAAM,mBAAmB;AAElB,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,QAAM,YAAY,gBAAgB,QAAQ;AAAA,IACxC,UAAU,CAAC,EAAE,oBAAoB;AAC/B,UAAI,kBAAkB,MAAO,QAAO;AAEpC,aAAO,WAAW,QAAQ;AAAA,QACxB,IAAI,CAAC,UAAU;AACb,cAAI,OAAO,KAAK,UAAW;AAE3B,cAAI,MAAM,SAAS,YAAY;AAI7B,gBAAI,MAAM,QAAQ,iBAAkB;AAEpC,6CAAQ,WAAW,OAAO,EAAE,GAAG,GAAG,GAAG,EAAA,GAAK,EAAE,OAAO,KAAA;AAAA,UAAM;AAG3D,cAAI,MAAM,SAAS,WAAW;AAC5B,6CAAQ,WAAW,OAAO,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAM;UAAQ;AAGhE,cAAI,MAAM,SAAS,UAAU;AAC3B,6CAAQ,WAAW;AAAA,cACjB,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAM,OAAA;AAAA,cAC5B,EAAE,OAAO,KAAA;AAAA;AAAA,UACX;AAAA,QACF,CACD;AAAA,QACD,IAAI,CAAC,WAAW,EAAE,OAAO,SAAS,OAAO;AAAA,MAAA;AAAA,IAC3C,CACD;AAAA,EAAA;AAGH,SAAO;AACT;AC/BA,MAAM,qBAAqB,CACzB,WAEA,cAAc,MAAM,KACpB,CAAC,CAAC,OAAO,cAAc,eACvB,kBAAkB,OAAO,cAAc,YAAY;AAE9C,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,QAAM,cAAc,aAAa,QAAQ;AAAA,IACvC,OAAO,CAAC,UAA+B,MAAM,SAAS,YAAY;AAAA,EAAA;AAGpE,QAAM,aAAa,aAAa,QAAQ;AAAA,IACtC,OAAO,CAAC,UAA+B,MAAM,SAAS,WAAW;AAAA,EAAA;AAGnE,QAAM,YAAY,aAAa,QAAQ;AAAA,IACrC,OAAO,CAAC,UAA+B,MAAM,SAAS,UAAU;AAAA,EAAA;AAGlE,QAAM,kBAAkB,CACtB,WAEA,mBAAmB,MAAM,KAAK,CAAC,OAAO,KAAK;AAE7C,SAAO,gBAAgB,QAAQ;AAAA,IAC7B,UAAU,CAAC,EAAE,uBAAuB,iCAAiC;AACnE,YAAM,gBAAgB,YAAY;AAAA,QAChC,eAAe,OAAO,cAAc;AAAA,QACpC,UAAU,CAAC,CAAC,OAAO,aAAa,MAAM;AACpC,gBAAM,SAAS,MAAM,MAAM;AAC3B,gBAAM,aAAa,OAAO,KAAK;AAE/B,cAAI,kBAAkB,OAAQ,QAAO;AAErC,cAAI,gBAAgB,MAAM,GAAG;AAC3B,mBAAO,KAAK,MAAM,MAAM;AAAA,UAAA;AAG1B,cAAI,CAAC,OAAO,KAAK,UAAW,QAAO;AAEnC,iBAAO;AAAA,YACL,WAAW;AAAA,cACT,IAAI,CAACA,WAAU;AACb,oBAAI,OAAO,KAAK,WAAW;AACzB,wBAAM,WAAW,cAAcA,OAAM,QAAQ;AAE7C,sBAAI,WAAW,GAAG;AAChB,2BAAO,KAAK,KAAA;AAAA,kBAAK,OACZ;AACL,2BAAO,KAAK,QAAQ,QAAQ;AAAA,kBAAA;AAAA,gBAC9B;AAAA,cACF,CACD;AAAA,YAAA;AAAA,UACH;AAAA,QACF,CACD;AAAA,MAAA;AAGH,YAAM,2BAA2B,CAAC,wBAC9B,QACA,YAAY;AAAA,QACV,eAAe,OAAO,cAAc;AAAA,QACpC,UAAU,CAAC,CAAC,iBAAiB,aAAa,MAAM;AAC9C,cACE,kBAAkB,UAClB,gBAAgB,gBAAgB,MAAM,MAAM,KAC5C,OAAO,KAAK;AAEZ,mBAAO;AAET,gBAAM,4BAA4B,OAAO,SAAS,OAAO;AAEzD,iBAAO,WAAW;AAAA,YAChB;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,gBACE,UAAU;AAAA,cAAA;AAAA,YACZ;AAAA,YAEF,IAAI,CAAC,UAAU;AACb,oBAAM,WAAW,OAAO;AAAA,iBACrB,6BAA6B,MAAM,QAAQ,IAAI,QAAQ,CAAC;AAAA,cAAA;AAG3D,oBAAM,uBAAuB,KAAK;AAAA,gBAChC,KAAK;AAAA,kBACH;AAAA,kBACA,gBAAgB,OAAO;AAAA,gBAAA;AAAA,gBAEzB,gBAAgB,OAAO;AAAA,cAAA;AAGzB,qBAAO,SAAS,OAAO;AAAA,gBACrB,WAAW;AAAA,cAAA,CACZ;AAAA,YAAA,CACF;AAAA,YACD,UAAU,SAAS;AAAA,UAAA;AAAA,QACrB,CACD;AAAA,MAAA;AAGP,aAAO,MAAM,eAAe,wBAAwB,EAAE;AAAA,QACpD,IAAI,CAAC,WAAW,EAAE,OAAO,SAAS,OAAO;AAAA,MAAA;AAAA,IAC3C,CACD;AAAA,EAAA;AAEL;ACrIO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,QAAM,YAAY,gBAAgB,QAAQ;AAAA,IACxC;AAAA,MAAU,CAAC,EAAE,cAAA,MACX,kBAAkB,UACd,QACA,aAAa,QAAQ;AAAA,QACnB,OAAO,CAAC,UAAU,MAAM,SAAS,OAAO;AAAA,QACxC,IAAI,CAAC,UAAU;AACb,gBAAM,EAAE,0BAAA,IAA8B,OAAO,SAAS;AAEtD,cAAI,8BAA8B,YAAY;AAC5C,gBAAI,MAAM,YAAY,MAAM;AAC1B,+CAAQ,WAAW;AAAA,YAAU;AAE/B,gBAAI,MAAM,YAAY,KAAK;AACzB,+CAAQ,WAAW;AAAA,YAAS;AAAA,UAC9B,OACK;AACL,gBAAI,MAAM,YAAY,MAAM;AAC1B,+CAAQ,WAAW;AAAA,YAAU;AAE/B,gBAAI,MAAM,YAAY,KAAK;AACzB,+CAAQ,WAAW;AAAA,YAAS;AAAA,UAC9B;AAAA,QACF,CACD;AAAA,QACD,IAAI,CAAC,WAAW,EAAE,OAAO,SAAS,OAAO;AAAA,MAAA;AAAA,IAC3C;AAAA,EACN;AAGF,SAAO;AACT;AC3CO,MAAM,YAAY,CAAC,UAAwB;AAChD,QAAM,SAAS,MAAM,MAAM;AAE3B,MAAI,cAAc,MAAM,KAAK,OAAO,YAAY,IAAK,QAAO;AAE5D,SAAO;AACT;AAEO,MAAM,uBAAuB,CAClC,WACA,UACY;AACZ,QAAM,SAAS,MAAM,MAAM;AAE3B,MAAI,CAAC,cAAc,MAAM,EAAG,QAAO;AAEnC,QAAM,QAAQ,UAAU,KAAK,CAAC,aAAa;AAEzC,QAAI,OAAO,QAAQ,QAAQ,EAAG,QAAO;AAGrC,QAAI,OAAO,QAAQ,QAAQ,EAAG,QAAO;AAErC,WAAO;AAAA,EAAA,CACR;AAED,SAAO,CAAC,CAAC;AACX;ACxBO,MAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,QAAM,YAAY,aAAa,QAAQ;AAAA,IACrC,UAAU,CAAC,UAAU;AACnB,YAAM,kBAAkB,MAAM;AAC9B,YAAM,EAAE,0BAAA,IAA8B,OAAO,SAAS;AAEtD,UACE,MAAM,SAAS,SACf,UAAU,KAAK,KACf,CAAC,qBAAqB,gBAAgB,OAAO,QAAQ,KAAK,GAC1D;AACA,cAAM,QAAQ,OAAO;AACrB,cAAM,SAAS,OAAO;AACtB,cAAM,iBAAiB;AAEvB,YAAI,OAAO,iBAAiB;AAC1B,gBAAM,EAAE,IAAI,GAAG,EAAA,IAAM;AAErB,gBAAM,oBAAoB,YAAY;AAAA,YACpC;AAAA,YACA;AAAA,YACA,EAAE,QAAQ,GAAG,KAAK,EAAA;AAAA,UAAE;AAGtB,iBAAO,cAAc,CAAC,GAAG,mBAAmB,GAAG,IAAI,CAAC,CAAC,EAAE;AAAA,YACrD,MAAA;AAAA,YACA,OAAO,CAAC,YAAY,CAAC,QAAQ,KAAK,CAAC,WAAW,WAAW,KAAK,CAAC;AAAA,YAC/D,IAAI,MAAM;AACR,oBAAM,YAAY,IAAI,SAAS;AAC/B,oBAAM,eAAe,IAAI,UAAU,IAAI;AACvC,oBAAM,aAAa,IAAI,QAAQ;AAC/B,oBAAM,cAAc,IAAI,SAAS,IAAI;AAErC,kBAAI,cAAc,8BAA8B,cAAc;AAC5D,uBAAO,WAAW,cAAA;AAAA,cAAc,WAEhC,aACA,8BAA8B,YAC9B;AACA,uBAAO,WAAW,cAAA;AAAA,cAAc,WAEhC,gBACA,8BAA8B,YAC9B;AACA,uBAAO,WAAW,kBAAA;AAAA,cAAkB,WAEpC,eACA,8BAA8B,cAC9B;AACA,uBAAO,WAAW,kBAAA;AAAA,cAAkB,OAC/B;AACL,uBAAO,EAAE,OAAO,SAAS,MAAA;AAAA,cAAM;AAGjC,qBAAO,EAAE,OAAO,SAAS,KAAA;AAAA,YAAK,CAC/B;AAAA,UAAA;AAAA,QACH;AAAA,MACF;AAGF,aAAO;AAAA,IAAA,CACR;AAAA,EAAA;AAGH,SAAO;AACT;AC7EO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AACF,MAAqD;AACnD,QAAM,YAAY,WAAW,QAAQ;AAAA,IACnC,OAAO,CAAC,UAAU,MAAM,SAAS,UAAU;AAAA,EAAA;AAE7C,QAAM,WAAW,WAAW,QAAQ;AAAA,IAClC,OAAO,CAAC,UAAU,MAAM,SAAS,SAAS;AAAA,EAAA;AAG5C,QAAM,cAAc,UAAU;AAAA,IAC5B,UAAU,MAAM;AACd,YAAM,gBAAgB,OAAO,KAAK;AAElC,aAAO,SAAS;AAAA,QACd,IAAI,CAAC,iBAAiB;AACpB,cAAI,OAAO,KAAK,WAAW;AACzB,mBAAO,KAAK,OAAO;AAAA,cACjB,GAAG,cAAc,IAAI,aAAa;AAAA,cAClC,GAAG,cAAc,IAAI,aAAa;AAAA,YAAA,CACnC;AAAA,UAAA;AAAA,QACH,CACD;AAAA,MAAA;AAAA,IACH,CACD;AAAA,EAAA;AAGH,SAAO;AACT;ACdO,MAAM,mBACX,CACE,SAEF,CACE,YAGgC;AAChC,QAAM,EAAE,WAAW,CAAA,GAAI,GAAG,SAAS;AACnC,QAAM,SAAS,KAAK,IAAsB;AAE1C,QAAM,kBAAkB,IAAI,wBAAwB,UAAU,MAAM;AAEpE,QAAM,cAAc,IAAI,YAAA;AAExB,QAAM,kBAAkB,IAAI,gBAAgB;AAAA,IAC1C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKP,cAAc;AAAA,IAAA;AAAA,EAChB,CACD;AAED,QAAM,oBAAoB;AAAA,IACxB,QAAQ,OAAO,UAAU;AAAA,IACzB,MAAM,OAAO,UAAU;AAAA,EAAA;AAGzB,QAAM,gBAAgB,IAAI,cAAc;AAAA,IACtC,UAAU,CAAC,iBAAiB,iBAAiB;AAAA,IAC7C,SAAS;AAAA;AAAA,MAEP,cAAc;AAAA,IAAA;AAAA,EAChB,CACD;AAED,QAAM,oBAAoB,IAAI,cAAc;AAAA,IAC1C,SAAS;AAAA,MACP,cAAc;AAAA,IAAA;AAAA,EAChB,CACD;AAED,QAAM,gBAAgB,IAAI,cAAc;AAAA,IACtC,UAAU,CAAC,aAAa;AAAA,EAAA,CACzB;AAED,QAAM,kBAAkB,IAAI,gBAAgB;AAAA,IAC1C,UAAU,CAAC,iBAAiB;AAAA,EAAA,CAC7B;AAED,QAAM,eAAe,IAAI,aAAa;AAAA,IACpC,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,sBAAsB;AAAA,EAAA,CACvB;AAED,QAAM,eAAe,aAAa;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,eAAe,YAAY;AAAA,IAE/B;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EAAA,CACD;AAED,QAAM,iBAAiB,cAAc;AAAA,IAEnC;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,iBAAiB,cAAc;AAAA,IAEnC;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,mBAAmB,gBAAgB;AAAA,IACvC;AAAA,IACA,YAAY;AAAA,EAAA,CACb;AAED,QAAM,mBAAmB,OAAO,QAAQ,kBAAkB;AAAA,IACxD,IAAI,CAAC,cAAc;AACjB,mBAAa,OAAO;AAAA,QAClB;AAAA,MAAA,CACD;AAAA,IAAA,CACF;AAAA,EAAA;AAGH,QAAM,iBAAiB,cAAc;AAAA,IACnC,gBAAgB;AAAA,IAChB,cAAc;AAAA,EAAA,CACf,EAAE;AAAA,IACD,IAAI,CAAC,CAAC,EAAE,eAAA,GAAkB,mBAAmB,MAAM;;AACjD,YAAM,0BACJ,yBAAoB,aAApB,mBAA8B,SAAS;AAEzC,UAAI,kBAAkB,CAAC,wBAAwB;AAC7C,sBAAc,OAAO;AAAA,UACnB,UAAU;AAAA,YACR,GAAI,oBAAoB,YAAY,CAAA;AAAA,YACpC;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MAAA;AAGH,UAAI,CAAC,kBAAkB,wBAAwB;AAC7C,sBAAc,OAAO;AAAA,UACnB,WAAU,yBAAoB,aAApB,mBAA8B;AAAA,YACtC,CAAC,eAAe,eAAe;AAAA;AAAA,QACjC,CACD;AAAA,MAAA;AAAA,IACH,CACD;AAAA,EAAA;AAGH,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,OAAO;AAEd,QAAM,kBAAkB,gBAAgB,kBAAkB,SAAS,EAChE,KAAK,UAAU,OAAO,EAAE,QAAQ,CAAC,EACjC,UAAA;AAEH,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,MAAM;AACb,aAAO,QAAA;AACP,sBAAgB,QAAA;AAAA,IAAQ;AAAA,IAE1B,UAAU;AAAA,MACR,UAAU;AAAA,MACV;AAAA,MACA,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ;"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,72 +1,36 @@
|
|
|
1
1
|
(function(global, factory) {
|
|
2
|
-
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@prose-reader/core"), require("
|
|
3
|
-
})(this, function(exports2, core,
|
|
2
|
+
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@prose-reader/core"), require("gesturx"), require("rxjs")) : typeof define === "function" && define.amd ? define(["exports", "@prose-reader/core", "gesturx", "rxjs"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["prose-reader-enhancer-gestures"] = {}, global.core, global.gesturx, global.rxjs));
|
|
3
|
+
})(this, function(exports2, core, gesturx, rxjs) {
|
|
4
4
|
"use strict";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (`x` in normalizedEvent) {
|
|
35
|
-
const { x = 0, y } = normalizedEvent;
|
|
36
|
-
const beforeTapResults$ = hookManager.execute(
|
|
37
|
-
"beforeGesture",
|
|
38
|
-
void 0,
|
|
39
|
-
{ event$: rxjs.of(event) }
|
|
40
|
-
);
|
|
41
|
-
return rxjs.combineLatest([...beforeTapResults$, rxjs.of(true)]).pipe(
|
|
42
|
-
rxjs.first(),
|
|
43
|
-
rxjs.filter((results) => !results.some((result) => result === false)),
|
|
44
|
-
rxjs.map(() => {
|
|
45
|
-
const isTopArea = y < height * pageTurnMargin;
|
|
46
|
-
const isBottomArea = y > height * (1 - pageTurnMargin);
|
|
47
|
-
const isLeftArea = x < width * pageTurnMargin;
|
|
48
|
-
const isRightArea = x > width * (1 - pageTurnMargin);
|
|
49
|
-
if (isLeftArea && computedPageTurnDirection === "horizontal") {
|
|
50
|
-
reader.navigation.turnLeftOrTop();
|
|
51
|
-
} else if (isTopArea && computedPageTurnDirection === "vertical") {
|
|
52
|
-
reader.navigation.turnLeftOrTop();
|
|
53
|
-
} else if (isBottomArea && computedPageTurnDirection === "vertical") {
|
|
54
|
-
reader.navigation.turnRightOrBottom();
|
|
55
|
-
} else if (isRightArea && computedPageTurnDirection === "horizontal") {
|
|
56
|
-
reader.navigation.turnRightOrBottom();
|
|
57
|
-
} else {
|
|
58
|
-
return { event, handled: false };
|
|
59
|
-
}
|
|
60
|
-
return { event, handled: true };
|
|
61
|
-
})
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return rxjs.EMPTY;
|
|
66
|
-
})
|
|
67
|
-
);
|
|
68
|
-
return gestures$;
|
|
69
|
-
};
|
|
5
|
+
class GesturesSettingsManager extends core.SettingsManager {
|
|
6
|
+
constructor(initialSettings, reader) {
|
|
7
|
+
super(initialSettings);
|
|
8
|
+
this.reader = reader;
|
|
9
|
+
reader.settings.values$.pipe(
|
|
10
|
+
rxjs.tap(() => {
|
|
11
|
+
this.update({});
|
|
12
|
+
}),
|
|
13
|
+
rxjs.takeUntil(this.destroy$)
|
|
14
|
+
).subscribe();
|
|
15
|
+
}
|
|
16
|
+
getOutputSettings(inputSettings) {
|
|
17
|
+
return {
|
|
18
|
+
...inputSettings,
|
|
19
|
+
panNavigation: this.reader.settings.values.computedPageTurnMode === `scrollable` ? false : inputSettings.panNavigation
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
getDefaultSettings() {
|
|
23
|
+
return {
|
|
24
|
+
panNavigation: "pan",
|
|
25
|
+
pinchCancelPan: true,
|
|
26
|
+
fontScalePinchEnabled: true,
|
|
27
|
+
fontScalePinchThrottleTime: 500,
|
|
28
|
+
fontScaleMaxScale: 5,
|
|
29
|
+
fontScaleMinScale: 0.2,
|
|
30
|
+
ignore: []
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
70
34
|
const DELAY_IGNORE_PAN = 400;
|
|
71
35
|
const registerPan = ({
|
|
72
36
|
reader,
|
|
@@ -99,68 +63,6 @@
|
|
|
99
63
|
);
|
|
100
64
|
return gestures$;
|
|
101
65
|
};
|
|
102
|
-
const registerSwipe = ({
|
|
103
|
-
reader,
|
|
104
|
-
recognizable,
|
|
105
|
-
settingsManager
|
|
106
|
-
}) => {
|
|
107
|
-
const gestures$ = settingsManager.values$.pipe(
|
|
108
|
-
rxjs.switchMap(
|
|
109
|
-
({ panNavigation }) => panNavigation !== "swipe" ? rxjs.EMPTY : recognizable.events$.pipe(
|
|
110
|
-
rxjs.filter((event) => event.type === "swipe"),
|
|
111
|
-
rxjs.tap((event) => {
|
|
112
|
-
const { computedPageTurnDirection } = reader.settings.values;
|
|
113
|
-
if (computedPageTurnDirection === "vertical") {
|
|
114
|
-
if (event.velocityY < -0.5) {
|
|
115
|
-
reader == null ? void 0 : reader.navigation.turnRight();
|
|
116
|
-
}
|
|
117
|
-
if (event.velocityY > 0.5) {
|
|
118
|
-
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
119
|
-
}
|
|
120
|
-
} else {
|
|
121
|
-
if (event.velocityX < -0.5) {
|
|
122
|
-
reader == null ? void 0 : reader.navigation.turnRight();
|
|
123
|
-
}
|
|
124
|
-
if (event.velocityX > 0.5) {
|
|
125
|
-
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}),
|
|
129
|
-
rxjs.map((event) => ({ event, handled: true }))
|
|
130
|
-
)
|
|
131
|
-
)
|
|
132
|
-
);
|
|
133
|
-
return gestures$;
|
|
134
|
-
};
|
|
135
|
-
class GesturesSettingsManager extends core.SettingsManager {
|
|
136
|
-
constructor(initialSettings, reader) {
|
|
137
|
-
super(initialSettings);
|
|
138
|
-
this.reader = reader;
|
|
139
|
-
reader.settings.values$.pipe(
|
|
140
|
-
rxjs.tap(() => {
|
|
141
|
-
this.update({});
|
|
142
|
-
}),
|
|
143
|
-
rxjs.takeUntil(this.destroy$)
|
|
144
|
-
).subscribe();
|
|
145
|
-
}
|
|
146
|
-
getOutputSettings(inputSettings) {
|
|
147
|
-
return {
|
|
148
|
-
...inputSettings,
|
|
149
|
-
panNavigation: this.reader.settings.values.computedPageTurnMode === `scrollable` ? false : inputSettings.panNavigation
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
getDefaultSettings() {
|
|
153
|
-
return {
|
|
154
|
-
panNavigation: "pan",
|
|
155
|
-
pinchCancelPan: true,
|
|
156
|
-
fontScalePinchEnabled: true,
|
|
157
|
-
fontScalePinchThrottleTime: 500,
|
|
158
|
-
fontScaleMaxScale: 5,
|
|
159
|
-
fontScaleMinScale: 0.2,
|
|
160
|
-
ignore: []
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
66
|
const isHtmlImageElement = (target) => core.isHtmlElement(target) && !!target.ownerDocument.defaultView && target instanceof target.ownerDocument.defaultView.HTMLImageElement;
|
|
165
67
|
const registerPinch = ({
|
|
166
68
|
reader,
|
|
@@ -244,6 +146,104 @@
|
|
|
244
146
|
})
|
|
245
147
|
);
|
|
246
148
|
};
|
|
149
|
+
const registerSwipe = ({
|
|
150
|
+
reader,
|
|
151
|
+
recognizable,
|
|
152
|
+
settingsManager
|
|
153
|
+
}) => {
|
|
154
|
+
const gestures$ = settingsManager.values$.pipe(
|
|
155
|
+
rxjs.switchMap(
|
|
156
|
+
({ panNavigation }) => panNavigation !== "swipe" ? rxjs.EMPTY : recognizable.events$.pipe(
|
|
157
|
+
rxjs.filter((event) => event.type === "swipe"),
|
|
158
|
+
rxjs.tap((event) => {
|
|
159
|
+
const { computedPageTurnDirection } = reader.settings.values;
|
|
160
|
+
if (computedPageTurnDirection === "vertical") {
|
|
161
|
+
if (event.velocityY < -0.5) {
|
|
162
|
+
reader == null ? void 0 : reader.navigation.turnRight();
|
|
163
|
+
}
|
|
164
|
+
if (event.velocityY > 0.5) {
|
|
165
|
+
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
if (event.velocityX < -0.5) {
|
|
169
|
+
reader == null ? void 0 : reader.navigation.turnRight();
|
|
170
|
+
}
|
|
171
|
+
if (event.velocityX > 0.5) {
|
|
172
|
+
reader == null ? void 0 : reader.navigation.turnLeft();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}),
|
|
176
|
+
rxjs.map((event) => ({ event, handled: true }))
|
|
177
|
+
)
|
|
178
|
+
)
|
|
179
|
+
);
|
|
180
|
+
return gestures$;
|
|
181
|
+
};
|
|
182
|
+
const isNotLink = (event) => {
|
|
183
|
+
const target = event.event.target;
|
|
184
|
+
if (core.isHtmlElement(target) && target.tagName === "a") return false;
|
|
185
|
+
return true;
|
|
186
|
+
};
|
|
187
|
+
const istMatchingSelectors = (selectors, event) => {
|
|
188
|
+
const target = event.event.target;
|
|
189
|
+
if (!core.isHtmlElement(target)) return false;
|
|
190
|
+
const match = selectors.find((selector) => {
|
|
191
|
+
if (target.matches(selector)) return true;
|
|
192
|
+
if (target.closest(selector)) return true;
|
|
193
|
+
return false;
|
|
194
|
+
});
|
|
195
|
+
return !!match;
|
|
196
|
+
};
|
|
197
|
+
const registerTaps = ({
|
|
198
|
+
reader,
|
|
199
|
+
recognizable,
|
|
200
|
+
hookManager,
|
|
201
|
+
settingsManager
|
|
202
|
+
}) => {
|
|
203
|
+
const gestures$ = recognizable.events$.pipe(
|
|
204
|
+
rxjs.switchMap((event) => {
|
|
205
|
+
const normalizedEvent = event.event;
|
|
206
|
+
const { computedPageTurnDirection } = reader.settings.values;
|
|
207
|
+
if (event.type === "tap" && isNotLink(event) && !istMatchingSelectors(settingsManager.values.ignore, event)) {
|
|
208
|
+
const width = window.innerWidth;
|
|
209
|
+
const height = window.innerHeight;
|
|
210
|
+
const pageTurnMargin = 0.15;
|
|
211
|
+
if (`x` in normalizedEvent) {
|
|
212
|
+
const { x = 0, y } = normalizedEvent;
|
|
213
|
+
const beforeTapResults$ = hookManager.execute(
|
|
214
|
+
"beforeGesture",
|
|
215
|
+
void 0,
|
|
216
|
+
{ event$: rxjs.of(event) }
|
|
217
|
+
);
|
|
218
|
+
return rxjs.combineLatest([...beforeTapResults$, rxjs.of(true)]).pipe(
|
|
219
|
+
rxjs.first(),
|
|
220
|
+
rxjs.filter((results) => !results.some((result) => result === false)),
|
|
221
|
+
rxjs.map(() => {
|
|
222
|
+
const isTopArea = y < height * pageTurnMargin;
|
|
223
|
+
const isBottomArea = y > height * (1 - pageTurnMargin);
|
|
224
|
+
const isLeftArea = x < width * pageTurnMargin;
|
|
225
|
+
const isRightArea = x > width * (1 - pageTurnMargin);
|
|
226
|
+
if (isLeftArea && computedPageTurnDirection === "horizontal") {
|
|
227
|
+
reader.navigation.turnLeftOrTop();
|
|
228
|
+
} else if (isTopArea && computedPageTurnDirection === "vertical") {
|
|
229
|
+
reader.navigation.turnLeftOrTop();
|
|
230
|
+
} else if (isBottomArea && computedPageTurnDirection === "vertical") {
|
|
231
|
+
reader.navigation.turnRightOrBottom();
|
|
232
|
+
} else if (isRightArea && computedPageTurnDirection === "horizontal") {
|
|
233
|
+
reader.navigation.turnRightOrBottom();
|
|
234
|
+
} else {
|
|
235
|
+
return { event, handled: false };
|
|
236
|
+
}
|
|
237
|
+
return { event, handled: true };
|
|
238
|
+
})
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return rxjs.EMPTY;
|
|
243
|
+
})
|
|
244
|
+
);
|
|
245
|
+
return gestures$;
|
|
246
|
+
};
|
|
247
247
|
const registerZoomPan = ({
|
|
248
248
|
reader,
|
|
249
249
|
recognizer
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/utils.ts","../src/gestures/taps.ts","../src/gestures/pan.ts","../src/gestures/swipe.ts","../src/SettingsManager.ts","../src/gestures/pinch.ts","../src/gestures/zoomPan.ts","../src/index.ts"],"sourcesContent":["import type { GestureEvent } from \"./types\"\nimport { isHtmlElement } from \"@prose-reader/core\"\n\nexport const isNotLink = (event: GestureEvent) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent,\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, filter, first, map, of, switchMap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport { isNotLink, istMatchingSelectors } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n switchMap((event) => {\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n const width = window.innerWidth\n const height = window.innerHeight\n const pageTurnMargin = 0.15\n\n if (`x` in normalizedEvent) {\n const { x = 0, y } = normalizedEvent\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeGesture\",\n undefined,\n { event$: of(event) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n const isTopArea = y < height * pageTurnMargin\n const isBottomArea = y > height * (1 - pageTurnMargin)\n const isLeftArea = x < width * pageTurnMargin\n const isRightArea = x > width * (1 - pageTurnMargin)\n\n if (isLeftArea && computedPageTurnDirection === \"horizontal\") {\n reader.navigation.turnLeftOrTop()\n } else if (\n isTopArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n isBottomArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n isRightArea &&\n computedPageTurnDirection === \"horizontal\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PanRecognizer } from \"gesturx\"\n\nconst DELAY_IGNORE_PAN = 400\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) return\n\n if (event.type === `panStart`) {\n /**\n * We let the user select\n */\n if (event.delay > DELAY_IGNORE_PAN) return\n\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter((event) => event.type === \"swipe\"),\n tap((event) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map((event) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport {\n EMPTY,\n animationFrameScheduler,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PinchEvent } from \"gesturx\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter(target)\n }\n\n if (!reader.zoom.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: { recognizer: PanRecognizer; reader: Reader }) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (reader.zoom.isZooming) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport type { EnhancerAPI, InputSettings, Hook } from \"./types\"\nimport { registerTaps } from \"./gestures/taps\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 30,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.containerElement$.pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["isHtmlElement","switchMap","of","combineLatest","first","filter","map","EMPTY","tap","SettingsManager","takeUntil","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/SettingsManager.ts","../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps.ts","../src/gestures/zoomPan.ts","../src/index.ts"],"sourcesContent":["import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PanRecognizer } from \"gesturx\"\n\nconst DELAY_IGNORE_PAN = 400\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) return\n\n if (event.type === `panStart`) {\n /**\n * We let the user select\n */\n if (event.delay > DELAY_IGNORE_PAN) return\n\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport {\n EMPTY,\n animationFrameScheduler,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { PinchEvent } from \"gesturx\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter(target)\n }\n\n if (!reader.zoom.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter((event) => event.type === \"swipe\"),\n tap((event) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map((event) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import type { GestureEvent } from \"./types\"\nimport { isHtmlElement } from \"@prose-reader/core\"\n\nexport const isNotLink = (event: GestureEvent) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent,\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, filter, first, map, of, switchMap } from \"rxjs\"\nimport type { GestureRecognizable, Hook } from \"../types\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport { isNotLink, istMatchingSelectors } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n switchMap((event) => {\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n const width = window.innerWidth\n const height = window.innerHeight\n const pageTurnMargin = 0.15\n\n if (`x` in normalizedEvent) {\n const { x = 0, y } = normalizedEvent\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeGesture\",\n undefined,\n { event$: of(event) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n const isTopArea = y < height * pageTurnMargin\n const isBottomArea = y > height * (1 - pageTurnMargin)\n const isLeftArea = x < width * pageTurnMargin\n const isRightArea = x > width * (1 - pageTurnMargin)\n\n if (isLeftArea && computedPageTurnDirection === \"horizontal\") {\n reader.navigation.turnLeftOrTop()\n } else if (\n isTopArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n isBottomArea &&\n computedPageTurnDirection === \"vertical\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n isRightArea &&\n computedPageTurnDirection === \"horizontal\"\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: { recognizer: PanRecognizer; reader: Reader }) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (reader.zoom.isZooming) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport * from \"./types\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 30,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.containerElement$.pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["SettingsManager","tap","takeUntil","switchMap","EMPTY","map","isHtmlElement","filter","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","of","combineLatest","first","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { HookManager } from '@prose-reader/core';
|
|
2
|
+
import { PanEvent, PanRecognizer, PinchEvent, PinchRecognizer, Recognizable, SwipeEvent, SwipeRecognizer, TapEvent, TapRecognizer } from 'gesturx';
|
|
1
3
|
import { Observable, ObservedValueOf } from 'rxjs';
|
|
2
|
-
import { PanEvent, PanRecognizer, PinchEvent, PinchRecognizer, Recognizable, SwipeEvent, SwipeRecognizer, TapRecognizer, TapEvent } from 'gesturx';
|
|
3
|
-
import { HookManager } from '../../core/dist/hooks/HookManager';
|
|
4
4
|
import { GesturesSettingsManager } from './SettingsManager';
|
|
5
5
|
export type Hook = {
|
|
6
6
|
name: "beforeGesture";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/enhancer-gestures",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.223.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"test": "vitest run --coverage"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@prose-reader/core": "^1.
|
|
28
|
+
"@prose-reader/core": "^1.223.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"gesturx": "*",
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"gesturx": "1.x",
|
|
36
36
|
"rxjs": "7.x"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "e15ee567520d988a97b35bd1dfe3976462d80d82"
|
|
39
39
|
}
|