@prose-reader/enhancer-gestures 1.164.0 → 1.166.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/gestures/zoomPan.d.ts +1 -1
- package/dist/index.js +73 -22
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +73 -22
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +3 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Reader } from '@prose-reader/core';
|
|
2
2
|
import { PanRecognizer } from 'gesturx';
|
|
3
|
-
export declare const registerZoomPan: ({ reader, recognizer }: {
|
|
3
|
+
export declare const registerZoomPan: ({ reader, recognizer, }: {
|
|
4
4
|
recognizer: PanRecognizer;
|
|
5
5
|
reader: Reader;
|
|
6
6
|
}) => import('rxjs').Observable<import('gesturx').PanEvent>;
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,11 @@ const registerTaps = ({
|
|
|
32
32
|
const pageTurnMargin = 0.15;
|
|
33
33
|
if (`x` in normalizedEvent) {
|
|
34
34
|
const { x = 0, y } = normalizedEvent;
|
|
35
|
-
const beforeTapResults$ = hookManager.execute(
|
|
35
|
+
const beforeTapResults$ = hookManager.execute(
|
|
36
|
+
"beforeGesture",
|
|
37
|
+
void 0,
|
|
38
|
+
{ event$: of(event) }
|
|
39
|
+
);
|
|
36
40
|
return combineLatest([...beforeTapResults$, of(true)]).pipe(
|
|
37
41
|
first(),
|
|
38
42
|
filter((results) => !results.some((result) => result === false)),
|
|
@@ -82,7 +86,10 @@ const registerPan = ({
|
|
|
82
86
|
reader == null ? void 0 : reader.navigation.moveTo({ x: event.deltaX, y: event.deltaY });
|
|
83
87
|
}
|
|
84
88
|
if (event.type === `panEnd`) {
|
|
85
|
-
reader == null ? void 0 : reader.navigation.moveTo(
|
|
89
|
+
reader == null ? void 0 : reader.navigation.moveTo(
|
|
90
|
+
{ x: event.deltaX, y: event.deltaY },
|
|
91
|
+
{ final: true }
|
|
92
|
+
);
|
|
86
93
|
}
|
|
87
94
|
}),
|
|
88
95
|
map((event) => ({ event, handled: true }))
|
|
@@ -159,9 +166,15 @@ const registerPinch = ({
|
|
|
159
166
|
recognizable,
|
|
160
167
|
settingsManager
|
|
161
168
|
}) => {
|
|
162
|
-
const pinchStart$ = recognizable.events$.pipe(
|
|
163
|
-
|
|
164
|
-
|
|
169
|
+
const pinchStart$ = recognizable.events$.pipe(
|
|
170
|
+
filter((event) => event.type === "pinchStart")
|
|
171
|
+
);
|
|
172
|
+
const pinchMove$ = recognizable.events$.pipe(
|
|
173
|
+
filter((event) => event.type === "pinchMove")
|
|
174
|
+
);
|
|
175
|
+
const pinchEnd$ = recognizable.events$.pipe(
|
|
176
|
+
filter((event) => event.type === "pinchEnd")
|
|
177
|
+
);
|
|
165
178
|
const shouldStartZoom = (target) => isHtmlImageElement(target) && !reader.zoom.isZooming;
|
|
166
179
|
return settingsManager.values$.pipe(
|
|
167
180
|
switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {
|
|
@@ -198,13 +211,22 @@ const registerPinch = ({
|
|
|
198
211
|
return EMPTY;
|
|
199
212
|
const lastFontScaleOnPinchStart = reader.settings.values.fontScale;
|
|
200
213
|
return pinchMove$.pipe(
|
|
201
|
-
throttleTime(
|
|
202
|
-
|
|
203
|
-
|
|
214
|
+
throttleTime(
|
|
215
|
+
fontScalePinchThrottleTime,
|
|
216
|
+
animationFrameScheduler,
|
|
217
|
+
{
|
|
218
|
+
trailing: true
|
|
219
|
+
}
|
|
220
|
+
),
|
|
204
221
|
tap((event) => {
|
|
205
|
-
const newScale = parseFloat(
|
|
222
|
+
const newScale = Number.parseFloat(
|
|
223
|
+
(lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2)
|
|
224
|
+
);
|
|
206
225
|
const newMinMaxedFontScale = Math.max(
|
|
207
|
-
Math.min(
|
|
226
|
+
Math.min(
|
|
227
|
+
newScale,
|
|
228
|
+
settingsManager.values.fontScaleMaxScale
|
|
229
|
+
),
|
|
208
230
|
settingsManager.values.fontScaleMinScale
|
|
209
231
|
);
|
|
210
232
|
reader.settings.update({
|
|
@@ -215,20 +237,32 @@ const registerPinch = ({
|
|
|
215
237
|
);
|
|
216
238
|
})
|
|
217
239
|
);
|
|
218
|
-
return merge(zoomGestures$, watchForFontScaleChange$).pipe(
|
|
240
|
+
return merge(zoomGestures$, watchForFontScaleChange$).pipe(
|
|
241
|
+
map((event) => ({ event, handled: true }))
|
|
242
|
+
);
|
|
219
243
|
})
|
|
220
244
|
);
|
|
221
245
|
};
|
|
222
|
-
const registerZoomPan = ({
|
|
223
|
-
|
|
224
|
-
|
|
246
|
+
const registerZoomPan = ({
|
|
247
|
+
reader,
|
|
248
|
+
recognizer
|
|
249
|
+
}) => {
|
|
250
|
+
const panStart$ = recognizer.events$.pipe(
|
|
251
|
+
filter((event) => event.type === "panStart")
|
|
252
|
+
);
|
|
253
|
+
const panMove$ = recognizer.events$.pipe(
|
|
254
|
+
filter((event) => event.type === "panMove")
|
|
255
|
+
);
|
|
225
256
|
const zoomingPan$ = panStart$.pipe(
|
|
226
257
|
switchMap(() => {
|
|
227
258
|
const startPosition = reader.zoom.currentPosition;
|
|
228
259
|
return panMove$.pipe(
|
|
229
260
|
tap((panMoveEvent) => {
|
|
230
261
|
if (reader.zoom.isZooming) {
|
|
231
|
-
reader.zoom.moveAt({
|
|
262
|
+
reader.zoom.moveAt({
|
|
263
|
+
x: startPosition.x + panMoveEvent.deltaX,
|
|
264
|
+
y: startPosition.y + panMoveEvent.deltaY
|
|
265
|
+
});
|
|
232
266
|
}
|
|
233
267
|
})
|
|
234
268
|
);
|
|
@@ -273,7 +307,13 @@ const gesturesEnhancer = (next) => (options) => {
|
|
|
273
307
|
failWith: [failWithSelection]
|
|
274
308
|
});
|
|
275
309
|
const recognizable = new Recognizable({
|
|
276
|
-
recognizers: [
|
|
310
|
+
recognizers: [
|
|
311
|
+
tapRecognizer,
|
|
312
|
+
panRecognizer,
|
|
313
|
+
swipeRecognizer,
|
|
314
|
+
pinchRecognizer,
|
|
315
|
+
zoomPanRecognizer
|
|
316
|
+
],
|
|
277
317
|
disableTextSelection: false
|
|
278
318
|
});
|
|
279
319
|
const tapGestures$ = registerTaps({
|
|
@@ -311,25 +351,36 @@ const gesturesEnhancer = (next) => (options) => {
|
|
|
311
351
|
});
|
|
312
352
|
})
|
|
313
353
|
);
|
|
314
|
-
const watchSettings$ = combineLatest([
|
|
354
|
+
const watchSettings$ = combineLatest([
|
|
355
|
+
settingsManager.values$,
|
|
356
|
+
panRecognizer.config$
|
|
357
|
+
]).pipe(
|
|
315
358
|
tap(([{ pinchCancelPan }, panRecognizerConfig]) => {
|
|
316
359
|
var _a, _b;
|
|
317
360
|
const pinchAlreadyInFailWith = (_a = panRecognizerConfig.failWith) == null ? void 0 : _a.includes(pinchRecognizer);
|
|
318
361
|
if (pinchCancelPan && !pinchAlreadyInFailWith) {
|
|
319
362
|
panRecognizer.update({
|
|
320
|
-
failWith: [
|
|
363
|
+
failWith: [
|
|
364
|
+
...panRecognizerConfig.failWith ?? [],
|
|
365
|
+
pinchRecognizer
|
|
366
|
+
]
|
|
321
367
|
});
|
|
322
368
|
}
|
|
323
369
|
if (!pinchCancelPan && pinchAlreadyInFailWith) {
|
|
324
370
|
panRecognizer.update({
|
|
325
|
-
failWith: (_b = panRecognizerConfig.failWith) == null ? void 0 : _b.filter(
|
|
371
|
+
failWith: (_b = panRecognizerConfig.failWith) == null ? void 0 : _b.filter(
|
|
372
|
+
(recognizer) => recognizer !== pinchRecognizer
|
|
373
|
+
)
|
|
326
374
|
});
|
|
327
375
|
}
|
|
328
376
|
})
|
|
329
377
|
);
|
|
330
|
-
const gestures$ = merge(
|
|
331
|
-
|
|
332
|
-
|
|
378
|
+
const gestures$ = merge(
|
|
379
|
+
pinchGestures$,
|
|
380
|
+
tapGestures$,
|
|
381
|
+
swipeGestures$,
|
|
382
|
+
panGestures$
|
|
383
|
+
).pipe(share());
|
|
333
384
|
merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(takeUntil(reader.$.destroy$)).subscribe();
|
|
334
385
|
return {
|
|
335
386
|
...reader,
|
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 { 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 = (selectors: string[], event: GestureEvent): 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 { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, filter, first, map, of, switchMap } from \"rxjs\"\nimport { GestureRecognizable, Hook } from \"../types\"\nimport { 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 (event.type === \"tap\" && isNotLink(event) && !istMatchingSelectors(settingsManager.values.ignore, event)) {\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(\"beforeGesture\", undefined, { event$: of(event) })\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 (isTopArea && computedPageTurnDirection === \"vertical\") {\n reader.navigation.turnLeftOrTop()\n } else if (isBottomArea && computedPageTurnDirection === \"vertical\") {\n reader.navigation.turnRightOrBottom()\n } else if (isRightArea && computedPageTurnDirection === \"horizontal\") {\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 { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport { Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { 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({ x: event.deltaX, y: event.deltaY }, { final: true })\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport { GestureRecognizable, Hook } from \"../types\"\nimport { 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 { Reader, SettingsManager } from \"@prose-reader/core\"\nimport { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<InputSettings, OutputSettings> {\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` ? false : 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 { HookManager, isHtmlElement, Reader } 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 { GestureRecognizable, Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { PinchEvent } from \"gesturx\"\n\nconst isHtmlImageElement = (target: EventTarget | null): 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(filter((event): event is PinchEvent => event.type === \"pinchStart\"))\n\n const pinchMove$ = recognizable.events$.pipe(filter((event): event is PinchEvent => event.type === \"pinchMove\"))\n\n const pinchEnd$ = recognizable.events$.pipe(filter((event): event is PinchEvent => event.type === \"pinchEnd\"))\n\n const shouldStartZoom = (target: EventTarget | null): 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 (viewportState === \"busy\" || shouldStartZoom(pinchStartEvent.event.target) || reader.zoom.isZooming)\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(fontScalePinchThrottleTime, animationFrameScheduler, {\n trailing: true,\n }),\n tap((event) => {\n const newScale = parseFloat((lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2))\n\n const newMinMaxedFontScale = Math.max(\n Math.min(newScale, settingsManager.values.fontScaleMaxScale),\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(map((event) => ({ event, handled: true })))\n }),\n )\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({ reader, recognizer }: { recognizer: PanRecognizer; reader: Reader }) => {\n const panStart$ = recognizer.events$.pipe(filter((event) => event.type === \"panStart\"))\n const panMove$ = recognizer.events$.pipe(filter((event) => event.type === \"panMove\"))\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({ x: startPosition.x + panMoveEvent.deltaX, y: startPosition.y + panMoveEvent.deltaY })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { PanRecognizer, PinchRecognizer, Recognizable, SwipeRecognizer, TapRecognizer } from \"gesturx\"\nimport { 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>(next: (options: InheritOptions) => InheritOutput) =>\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: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],\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([settingsManager.values$, panRecognizer.config$]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith = panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [...(panRecognizerConfig.failWith ?? []), pinchRecognizer],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter((recognizer) => recognizer !== pinchRecognizer),\n })\n }\n }),\n )\n\n const gestures$ = merge(pinchGestures$, tapGestures$, swipeGestures$, panGestures$).pipe(\n share()\n )\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(takeUntil(reader.$.destroy$)).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/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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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -33,7 +33,11 @@
|
|
|
33
33
|
const pageTurnMargin = 0.15;
|
|
34
34
|
if (`x` in normalizedEvent) {
|
|
35
35
|
const { x = 0, y } = normalizedEvent;
|
|
36
|
-
const beforeTapResults$ = hookManager.execute(
|
|
36
|
+
const beforeTapResults$ = hookManager.execute(
|
|
37
|
+
"beforeGesture",
|
|
38
|
+
void 0,
|
|
39
|
+
{ event$: rxjs.of(event) }
|
|
40
|
+
);
|
|
37
41
|
return rxjs.combineLatest([...beforeTapResults$, rxjs.of(true)]).pipe(
|
|
38
42
|
rxjs.first(),
|
|
39
43
|
rxjs.filter((results) => !results.some((result) => result === false)),
|
|
@@ -83,7 +87,10 @@
|
|
|
83
87
|
reader == null ? void 0 : reader.navigation.moveTo({ x: event.deltaX, y: event.deltaY });
|
|
84
88
|
}
|
|
85
89
|
if (event.type === `panEnd`) {
|
|
86
|
-
reader == null ? void 0 : reader.navigation.moveTo(
|
|
90
|
+
reader == null ? void 0 : reader.navigation.moveTo(
|
|
91
|
+
{ x: event.deltaX, y: event.deltaY },
|
|
92
|
+
{ final: true }
|
|
93
|
+
);
|
|
87
94
|
}
|
|
88
95
|
}),
|
|
89
96
|
rxjs.map((event) => ({ event, handled: true }))
|
|
@@ -160,9 +167,15 @@
|
|
|
160
167
|
recognizable,
|
|
161
168
|
settingsManager
|
|
162
169
|
}) => {
|
|
163
|
-
const pinchStart$ = recognizable.events$.pipe(
|
|
164
|
-
|
|
165
|
-
|
|
170
|
+
const pinchStart$ = recognizable.events$.pipe(
|
|
171
|
+
rxjs.filter((event) => event.type === "pinchStart")
|
|
172
|
+
);
|
|
173
|
+
const pinchMove$ = recognizable.events$.pipe(
|
|
174
|
+
rxjs.filter((event) => event.type === "pinchMove")
|
|
175
|
+
);
|
|
176
|
+
const pinchEnd$ = recognizable.events$.pipe(
|
|
177
|
+
rxjs.filter((event) => event.type === "pinchEnd")
|
|
178
|
+
);
|
|
166
179
|
const shouldStartZoom = (target) => isHtmlImageElement(target) && !reader.zoom.isZooming;
|
|
167
180
|
return settingsManager.values$.pipe(
|
|
168
181
|
rxjs.switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {
|
|
@@ -199,13 +212,22 @@
|
|
|
199
212
|
return rxjs.EMPTY;
|
|
200
213
|
const lastFontScaleOnPinchStart = reader.settings.values.fontScale;
|
|
201
214
|
return pinchMove$.pipe(
|
|
202
|
-
rxjs.throttleTime(
|
|
203
|
-
|
|
204
|
-
|
|
215
|
+
rxjs.throttleTime(
|
|
216
|
+
fontScalePinchThrottleTime,
|
|
217
|
+
rxjs.animationFrameScheduler,
|
|
218
|
+
{
|
|
219
|
+
trailing: true
|
|
220
|
+
}
|
|
221
|
+
),
|
|
205
222
|
rxjs.tap((event) => {
|
|
206
|
-
const newScale = parseFloat(
|
|
223
|
+
const newScale = Number.parseFloat(
|
|
224
|
+
(lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2)
|
|
225
|
+
);
|
|
207
226
|
const newMinMaxedFontScale = Math.max(
|
|
208
|
-
Math.min(
|
|
227
|
+
Math.min(
|
|
228
|
+
newScale,
|
|
229
|
+
settingsManager.values.fontScaleMaxScale
|
|
230
|
+
),
|
|
209
231
|
settingsManager.values.fontScaleMinScale
|
|
210
232
|
);
|
|
211
233
|
reader.settings.update({
|
|
@@ -216,20 +238,32 @@
|
|
|
216
238
|
);
|
|
217
239
|
})
|
|
218
240
|
);
|
|
219
|
-
return rxjs.merge(zoomGestures$, watchForFontScaleChange$).pipe(
|
|
241
|
+
return rxjs.merge(zoomGestures$, watchForFontScaleChange$).pipe(
|
|
242
|
+
rxjs.map((event) => ({ event, handled: true }))
|
|
243
|
+
);
|
|
220
244
|
})
|
|
221
245
|
);
|
|
222
246
|
};
|
|
223
|
-
const registerZoomPan = ({
|
|
224
|
-
|
|
225
|
-
|
|
247
|
+
const registerZoomPan = ({
|
|
248
|
+
reader,
|
|
249
|
+
recognizer
|
|
250
|
+
}) => {
|
|
251
|
+
const panStart$ = recognizer.events$.pipe(
|
|
252
|
+
rxjs.filter((event) => event.type === "panStart")
|
|
253
|
+
);
|
|
254
|
+
const panMove$ = recognizer.events$.pipe(
|
|
255
|
+
rxjs.filter((event) => event.type === "panMove")
|
|
256
|
+
);
|
|
226
257
|
const zoomingPan$ = panStart$.pipe(
|
|
227
258
|
rxjs.switchMap(() => {
|
|
228
259
|
const startPosition = reader.zoom.currentPosition;
|
|
229
260
|
return panMove$.pipe(
|
|
230
261
|
rxjs.tap((panMoveEvent) => {
|
|
231
262
|
if (reader.zoom.isZooming) {
|
|
232
|
-
reader.zoom.moveAt({
|
|
263
|
+
reader.zoom.moveAt({
|
|
264
|
+
x: startPosition.x + panMoveEvent.deltaX,
|
|
265
|
+
y: startPosition.y + panMoveEvent.deltaY
|
|
266
|
+
});
|
|
233
267
|
}
|
|
234
268
|
})
|
|
235
269
|
);
|
|
@@ -274,7 +308,13 @@
|
|
|
274
308
|
failWith: [failWithSelection]
|
|
275
309
|
});
|
|
276
310
|
const recognizable = new gesturx.Recognizable({
|
|
277
|
-
recognizers: [
|
|
311
|
+
recognizers: [
|
|
312
|
+
tapRecognizer,
|
|
313
|
+
panRecognizer,
|
|
314
|
+
swipeRecognizer,
|
|
315
|
+
pinchRecognizer,
|
|
316
|
+
zoomPanRecognizer
|
|
317
|
+
],
|
|
278
318
|
disableTextSelection: false
|
|
279
319
|
});
|
|
280
320
|
const tapGestures$ = registerTaps({
|
|
@@ -312,25 +352,36 @@
|
|
|
312
352
|
});
|
|
313
353
|
})
|
|
314
354
|
);
|
|
315
|
-
const watchSettings$ = rxjs.combineLatest([
|
|
355
|
+
const watchSettings$ = rxjs.combineLatest([
|
|
356
|
+
settingsManager.values$,
|
|
357
|
+
panRecognizer.config$
|
|
358
|
+
]).pipe(
|
|
316
359
|
rxjs.tap(([{ pinchCancelPan }, panRecognizerConfig]) => {
|
|
317
360
|
var _a, _b;
|
|
318
361
|
const pinchAlreadyInFailWith = (_a = panRecognizerConfig.failWith) == null ? void 0 : _a.includes(pinchRecognizer);
|
|
319
362
|
if (pinchCancelPan && !pinchAlreadyInFailWith) {
|
|
320
363
|
panRecognizer.update({
|
|
321
|
-
failWith: [
|
|
364
|
+
failWith: [
|
|
365
|
+
...panRecognizerConfig.failWith ?? [],
|
|
366
|
+
pinchRecognizer
|
|
367
|
+
]
|
|
322
368
|
});
|
|
323
369
|
}
|
|
324
370
|
if (!pinchCancelPan && pinchAlreadyInFailWith) {
|
|
325
371
|
panRecognizer.update({
|
|
326
|
-
failWith: (_b = panRecognizerConfig.failWith) == null ? void 0 : _b.filter(
|
|
372
|
+
failWith: (_b = panRecognizerConfig.failWith) == null ? void 0 : _b.filter(
|
|
373
|
+
(recognizer) => recognizer !== pinchRecognizer
|
|
374
|
+
)
|
|
327
375
|
});
|
|
328
376
|
}
|
|
329
377
|
})
|
|
330
378
|
);
|
|
331
|
-
const gestures$ = rxjs.merge(
|
|
332
|
-
|
|
333
|
-
|
|
379
|
+
const gestures$ = rxjs.merge(
|
|
380
|
+
pinchGestures$,
|
|
381
|
+
tapGestures$,
|
|
382
|
+
swipeGestures$,
|
|
383
|
+
panGestures$
|
|
384
|
+
).pipe(rxjs.share());
|
|
334
385
|
rxjs.merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
|
|
335
386
|
return {
|
|
336
387
|
...reader,
|
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 { 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 = (selectors: string[], event: GestureEvent): 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 { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, filter, first, map, of, switchMap } from \"rxjs\"\nimport { GestureRecognizable, Hook } from \"../types\"\nimport { 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 (event.type === \"tap\" && isNotLink(event) && !istMatchingSelectors(settingsManager.values.ignore, event)) {\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(\"beforeGesture\", undefined, { event$: of(event) })\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 (isTopArea && computedPageTurnDirection === \"vertical\") {\n reader.navigation.turnLeftOrTop()\n } else if (isBottomArea && computedPageTurnDirection === \"vertical\") {\n reader.navigation.turnRightOrBottom()\n } else if (isRightArea && computedPageTurnDirection === \"horizontal\") {\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 { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport { Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { 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({ x: event.deltaX, y: event.deltaY }, { final: true })\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport { GestureRecognizable, Hook } from \"../types\"\nimport { 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 { Reader, SettingsManager } from \"@prose-reader/core\"\nimport { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<InputSettings, OutputSettings> {\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` ? false : 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 { HookManager, isHtmlElement, Reader } 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 { GestureRecognizable, Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { PinchEvent } from \"gesturx\"\n\nconst isHtmlImageElement = (target: EventTarget | null): 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(filter((event): event is PinchEvent => event.type === \"pinchStart\"))\n\n const pinchMove$ = recognizable.events$.pipe(filter((event): event is PinchEvent => event.type === \"pinchMove\"))\n\n const pinchEnd$ = recognizable.events$.pipe(filter((event): event is PinchEvent => event.type === \"pinchEnd\"))\n\n const shouldStartZoom = (target: EventTarget | null): 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 (viewportState === \"busy\" || shouldStartZoom(pinchStartEvent.event.target) || reader.zoom.isZooming)\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(fontScalePinchThrottleTime, animationFrameScheduler, {\n trailing: true,\n }),\n tap((event) => {\n const newScale = parseFloat((lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2))\n\n const newMinMaxedFontScale = Math.max(\n Math.min(newScale, settingsManager.values.fontScaleMaxScale),\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(map((event) => ({ event, handled: true })))\n }),\n )\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({ reader, recognizer }: { recognizer: PanRecognizer; reader: Reader }) => {\n const panStart$ = recognizer.events$.pipe(filter((event) => event.type === \"panStart\"))\n const panMove$ = recognizer.events$.pipe(filter((event) => event.type === \"panMove\"))\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({ x: startPosition.x + panMoveEvent.deltaX, y: startPosition.y + panMoveEvent.deltaY })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { PanRecognizer, PinchRecognizer, Recognizable, SwipeRecognizer, TapRecognizer } from \"gesturx\"\nimport { 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>(next: (options: InheritOptions) => InheritOutput) =>\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: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],\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([settingsManager.values$, panRecognizer.config$]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith = panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [...(panRecognizerConfig.failWith ?? []), pinchRecognizer],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter((recognizer) => recognizer !== pinchRecognizer),\n })\n }\n }),\n )\n\n const gestures$ = merge(pinchGestures$, tapGestures$, swipeGestures$, panGestures$).pipe(\n share()\n )\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(takeUntil(reader.$.destroy$)).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/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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/enhancer-gestures",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.166.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -22,12 +22,10 @@
|
|
|
22
22
|
"scripts": {
|
|
23
23
|
"start": "vite build --watch --mode development",
|
|
24
24
|
"build": "tsc && vite build",
|
|
25
|
-
"lint:read": "prettier --check . && eslint . --ext .ts,.tsx,.js,.jsx",
|
|
26
|
-
"lint:write": "prettier --write . && eslint --fix . --ext .ts,.tsx,.js,.jsx",
|
|
27
25
|
"test": "vitest run --coverage"
|
|
28
26
|
},
|
|
29
27
|
"dependencies": {
|
|
30
|
-
"@prose-reader/core": "^1.
|
|
28
|
+
"@prose-reader/core": "^1.166.0"
|
|
31
29
|
},
|
|
32
30
|
"devDependencies": {
|
|
33
31
|
"gesturx": "^1.8.4"
|
|
@@ -36,5 +34,5 @@
|
|
|
36
34
|
"gesturx": "*",
|
|
37
35
|
"rxjs": "*"
|
|
38
36
|
},
|
|
39
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "949886f6d3d44e3b3034bf8d71bbb1abe7e76fb4"
|
|
40
38
|
}
|