@prose-reader/enhancer-gestures 1.251.0 → 1.252.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.
@@ -10,4 +10,7 @@ export declare const registerPan: ({ reader, recognizer, settingsManager, }: {
10
10
  }) => import('rxjs').Observable<{
11
11
  event: import('gesturx').PanEvent;
12
12
  handled: boolean;
13
+ } | {
14
+ event: import('gesturx').PanEvent;
15
+ handled: boolean;
13
16
  }>;
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { isHtmlElement, SettingsManager, HookManager } from "@prose-reader/core";
2
2
  import { PinchRecognizer, PanRecognizer, TapRecognizer, SwipeRecognizer, Recognizable } from "gesturx";
3
- import { switchMap, EMPTY, tap, map, filter, withLatestFrom, merge, throttleTime, animationFrameScheduler, takeUntil, of, combineLatest, first, share } from "rxjs";
3
+ import { switchMap, EMPTY, filter, merge, map, of, withLatestFrom, tap, throttleTime, animationFrameScheduler, takeUntil, combineLatest, first, share } from "rxjs";
4
4
  const registerPan = ({
5
5
  reader,
6
6
  recognizer,
@@ -9,25 +9,63 @@ const registerPan = ({
9
9
  const gestures$ = settingsManager.values$.pipe(
10
10
  switchMap(({ panNavigation }) => {
11
11
  if (panNavigation !== "pan") return EMPTY;
12
- return recognizer.events$.pipe(
13
- tap((event) => {
14
- if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1)
15
- return;
16
- if (event.type === `panStart`) {
12
+ const panStart$ = recognizer.events$.pipe(
13
+ filter((event) => event.type === `panStart`)
14
+ );
15
+ const panMove$ = recognizer.events$.pipe(
16
+ filter((event) => event.type === `panMove`)
17
+ );
18
+ const panEnd$ = recognizer.events$.pipe(
19
+ filter((event) => event.type === `panEnd`)
20
+ );
21
+ const pan$ = panStart$.pipe(
22
+ switchMap((panStartEvent) => {
23
+ const startZoomPosition = reader.zoom.state.currentPosition;
24
+ const moveAndEnd$ = merge(panMove$, panEnd$).pipe(
25
+ map((event) => {
26
+ const isZooming = reader.zoom.state.isZooming;
27
+ const isZoomingIn2 = reader.zoom.state.currentScale > 1;
28
+ if (isZooming && isZoomingIn2) {
29
+ const x = startZoomPosition.x + Math.floor(event.deltaX);
30
+ const y = startZoomPosition.y + Math.floor(event.deltaY);
31
+ reader.zoom.move({
32
+ x,
33
+ y
34
+ });
35
+ return { event, handled: true };
36
+ }
37
+ if (event.type === `panMove`) {
38
+ reader.navigation.moveTo({
39
+ x: event.deltaX,
40
+ y: event.deltaY
41
+ });
42
+ return { event, handled: true };
43
+ }
44
+ if (event.type === `panEnd`) {
45
+ reader.navigation.moveTo(
46
+ { x: event.deltaX, y: event.deltaY },
47
+ { final: true }
48
+ );
49
+ return { event, handled: true };
50
+ }
51
+ return { event, handled: false };
52
+ })
53
+ );
54
+ const isZoomingIn = reader.zoom.state.currentScale > 1;
55
+ if (!isZoomingIn) {
17
56
  reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true });
18
- }
19
- if (event.type === `panMove`) {
20
- reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY });
21
- }
22
- if (event.type === `panEnd`) {
23
- reader?.navigation.moveTo(
24
- { x: event.deltaX, y: event.deltaY },
25
- { final: true }
57
+ return merge(
58
+ of({ event: panStartEvent, handled: true }),
59
+ moveAndEnd$
26
60
  );
27
61
  }
28
- }),
29
- map((event) => ({ event, handled: true }))
62
+ return merge(
63
+ of({ event: panStartEvent, handled: false }),
64
+ moveAndEnd$
65
+ );
66
+ })
30
67
  );
68
+ return pan$;
31
69
  })
32
70
  );
33
71
  return gestures$;
@@ -316,33 +354,6 @@ const registerTaps = ({
316
354
  );
317
355
  return gestures$;
318
356
  };
319
- const registerZoomPan = ({
320
- reader,
321
- recognizer
322
- }) => {
323
- const panStart$ = recognizer.events$.pipe(
324
- filter((event) => event.type === "panStart")
325
- );
326
- const panMove$ = recognizer.events$.pipe(
327
- filter((event) => event.type === "panMove")
328
- );
329
- const zoomingPan$ = panStart$.pipe(
330
- switchMap(() => {
331
- const startPosition = reader.zoom.state.currentPosition;
332
- return panMove$.pipe(
333
- tap((panMoveEvent) => {
334
- if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1) {
335
- reader.zoom.moveAt({
336
- x: startPosition.x + panMoveEvent.deltaX,
337
- y: startPosition.y + panMoveEvent.deltaY
338
- });
339
- }
340
- })
341
- );
342
- })
343
- );
344
- return zoomingPan$;
345
- };
346
357
  class GesturesSettingsManager extends SettingsManager {
347
358
  constructor(initialSettings, reader) {
348
359
  super(initialSettings);
@@ -397,11 +408,6 @@ const gesturesEnhancer = (next) => (options) => {
397
408
  posThreshold: 15
398
409
  }
399
410
  });
400
- const zoomPanRecognizer = new PanRecognizer({
401
- options: {
402
- posThreshold: 1
403
- }
404
- });
405
411
  const tapRecognizer = new TapRecognizer({
406
412
  failWith: [panRecognizer]
407
413
  });
@@ -413,8 +419,7 @@ const gesturesEnhancer = (next) => (options) => {
413
419
  tapRecognizer,
414
420
  panRecognizer,
415
421
  swipeRecognizer,
416
- pinchRecognizer,
417
- zoomPanRecognizer
422
+ pinchRecognizer
418
423
  ],
419
424
  disableTextSelection: false
420
425
  });
@@ -440,10 +445,6 @@ const gesturesEnhancer = (next) => (options) => {
440
445
  recognizable,
441
446
  settingsManager
442
447
  });
443
- const zoomPanGestures$ = registerZoomPan({
444
- reader,
445
- recognizer: zoomPanRecognizer
446
- });
447
448
  const containerUpdate$ = reader.context.watch(`rootElement`).pipe(
448
449
  tap((container) => {
449
450
  recognizable.update({
@@ -480,7 +481,7 @@ const gesturesEnhancer = (next) => (options) => {
480
481
  swipeGestures$,
481
482
  panGestures$
482
483
  ).pipe(share());
483
- merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(takeUntil(reader.$.destroy$)).subscribe();
484
+ merge(containerUpdate$, watchSettings$, gestures$).pipe(takeUntil(reader.$.destroy$)).subscribe();
484
485
  return {
485
486
  ...reader,
486
487
  destroy: () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/gestures/zoomPan.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\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.state.isZooming && reader.zoom.state.currentScale > 1)\n return\n\n if (event.type === `panStart`) {\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 type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\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.state.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.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.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.state.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 { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\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 { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n combineLatest,\n EMPTY,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection, computedPageTurnMode } =\n reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (computedPageTurnMode === \"scrollable\") {\n return { event, handled: false }\n }\n\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\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}: {\n recognizer: PanRecognizer\n reader: Reader\n}) => {\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.state.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (\n reader.zoom.state.isZooming &&\n reader.zoom.state.currentScale > 1\n ) {\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 { 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 { 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 { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\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: 15,\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 recognizer: tapRecognizer,\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.watch(`rootElement`).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/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, filter, map, merge, of, switchMap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\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 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 const panEnd$ = recognizer.events$.pipe(\n filter((event) => event.type === `panEnd`),\n )\n\n const pan$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n const startZoomPosition = reader.zoom.state.currentPosition\n\n const moveAndEnd$ = merge(panMove$, panEnd$).pipe(\n map((event) => {\n const isZooming = reader.zoom.state.isZooming\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n if (isZooming && isZoomingIn) {\n const x = startZoomPosition.x + Math.floor(event.deltaX)\n const y = startZoomPosition.y + Math.floor(event.deltaY)\n\n reader.zoom.move({\n x,\n y,\n })\n\n return { event, handled: true }\n }\n\n if (event.type === `panMove`) {\n reader.navigation.moveTo({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return { event, handled: true }\n }\n\n if (event.type === `panEnd`) {\n reader.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n\n return { event, handled: true }\n }\n\n return { event, handled: false }\n }),\n )\n\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n if (!isZoomingIn) {\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n\n return merge(\n of({ event: panStartEvent, handled: true }),\n moveAndEnd$,\n )\n }\n\n return merge(\n of({ event: panStartEvent, handled: false }),\n moveAndEnd$,\n )\n }),\n )\n\n return pan$\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\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.state.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.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.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.state.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 { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\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 { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n combineLatest,\n EMPTY,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection, computedPageTurnMode } =\n reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (computedPageTurnMode === \"scrollable\") {\n return { event, handled: false }\n }\n\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\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, 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 { 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 { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\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: 15,\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 ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\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 containerUpdate$ = reader.context.watch(`rootElement`).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$, 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":["isZoomingIn","event"],"mappings":"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"}
@@ -10,25 +10,63 @@
10
10
  const gestures$ = settingsManager.values$.pipe(
11
11
  rxjs.switchMap(({ panNavigation }) => {
12
12
  if (panNavigation !== "pan") return rxjs.EMPTY;
13
- return recognizer.events$.pipe(
14
- rxjs.tap((event) => {
15
- if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1)
16
- return;
17
- if (event.type === `panStart`) {
13
+ const panStart$ = recognizer.events$.pipe(
14
+ rxjs.filter((event) => event.type === `panStart`)
15
+ );
16
+ const panMove$ = recognizer.events$.pipe(
17
+ rxjs.filter((event) => event.type === `panMove`)
18
+ );
19
+ const panEnd$ = recognizer.events$.pipe(
20
+ rxjs.filter((event) => event.type === `panEnd`)
21
+ );
22
+ const pan$ = panStart$.pipe(
23
+ rxjs.switchMap((panStartEvent) => {
24
+ const startZoomPosition = reader.zoom.state.currentPosition;
25
+ const moveAndEnd$ = rxjs.merge(panMove$, panEnd$).pipe(
26
+ rxjs.map((event) => {
27
+ const isZooming = reader.zoom.state.isZooming;
28
+ const isZoomingIn2 = reader.zoom.state.currentScale > 1;
29
+ if (isZooming && isZoomingIn2) {
30
+ const x = startZoomPosition.x + Math.floor(event.deltaX);
31
+ const y = startZoomPosition.y + Math.floor(event.deltaY);
32
+ reader.zoom.move({
33
+ x,
34
+ y
35
+ });
36
+ return { event, handled: true };
37
+ }
38
+ if (event.type === `panMove`) {
39
+ reader.navigation.moveTo({
40
+ x: event.deltaX,
41
+ y: event.deltaY
42
+ });
43
+ return { event, handled: true };
44
+ }
45
+ if (event.type === `panEnd`) {
46
+ reader.navigation.moveTo(
47
+ { x: event.deltaX, y: event.deltaY },
48
+ { final: true }
49
+ );
50
+ return { event, handled: true };
51
+ }
52
+ return { event, handled: false };
53
+ })
54
+ );
55
+ const isZoomingIn = reader.zoom.state.currentScale > 1;
56
+ if (!isZoomingIn) {
18
57
  reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true });
19
- }
20
- if (event.type === `panMove`) {
21
- reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY });
22
- }
23
- if (event.type === `panEnd`) {
24
- reader?.navigation.moveTo(
25
- { x: event.deltaX, y: event.deltaY },
26
- { final: true }
58
+ return rxjs.merge(
59
+ rxjs.of({ event: panStartEvent, handled: true }),
60
+ moveAndEnd$
27
61
  );
28
62
  }
29
- }),
30
- rxjs.map((event) => ({ event, handled: true }))
63
+ return rxjs.merge(
64
+ rxjs.of({ event: panStartEvent, handled: false }),
65
+ moveAndEnd$
66
+ );
67
+ })
31
68
  );
69
+ return pan$;
32
70
  })
33
71
  );
34
72
  return gestures$;
@@ -317,33 +355,6 @@
317
355
  );
318
356
  return gestures$;
319
357
  };
320
- const registerZoomPan = ({
321
- reader,
322
- recognizer
323
- }) => {
324
- const panStart$ = recognizer.events$.pipe(
325
- rxjs.filter((event) => event.type === "panStart")
326
- );
327
- const panMove$ = recognizer.events$.pipe(
328
- rxjs.filter((event) => event.type === "panMove")
329
- );
330
- const zoomingPan$ = panStart$.pipe(
331
- rxjs.switchMap(() => {
332
- const startPosition = reader.zoom.state.currentPosition;
333
- return panMove$.pipe(
334
- rxjs.tap((panMoveEvent) => {
335
- if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1) {
336
- reader.zoom.moveAt({
337
- x: startPosition.x + panMoveEvent.deltaX,
338
- y: startPosition.y + panMoveEvent.deltaY
339
- });
340
- }
341
- })
342
- );
343
- })
344
- );
345
- return zoomingPan$;
346
- };
347
358
  class GesturesSettingsManager extends core.SettingsManager {
348
359
  constructor(initialSettings, reader) {
349
360
  super(initialSettings);
@@ -398,11 +409,6 @@
398
409
  posThreshold: 15
399
410
  }
400
411
  });
401
- const zoomPanRecognizer = new gesturx.PanRecognizer({
402
- options: {
403
- posThreshold: 1
404
- }
405
- });
406
412
  const tapRecognizer = new gesturx.TapRecognizer({
407
413
  failWith: [panRecognizer]
408
414
  });
@@ -414,8 +420,7 @@
414
420
  tapRecognizer,
415
421
  panRecognizer,
416
422
  swipeRecognizer,
417
- pinchRecognizer,
418
- zoomPanRecognizer
423
+ pinchRecognizer
419
424
  ],
420
425
  disableTextSelection: false
421
426
  });
@@ -441,10 +446,6 @@
441
446
  recognizable,
442
447
  settingsManager
443
448
  });
444
- const zoomPanGestures$ = registerZoomPan({
445
- reader,
446
- recognizer: zoomPanRecognizer
447
- });
448
449
  const containerUpdate$ = reader.context.watch(`rootElement`).pipe(
449
450
  rxjs.tap((container) => {
450
451
  recognizable.update({
@@ -481,7 +482,7 @@
481
482
  swipeGestures$,
482
483
  panGestures$
483
484
  ).pipe(rxjs.share());
484
- rxjs.merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
485
+ rxjs.merge(containerUpdate$, watchSettings$, gestures$).pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
485
486
  return {
486
487
  ...reader,
487
488
  destroy: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/gestures/zoomPan.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\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.state.isZooming && reader.zoom.state.currentScale > 1)\n return\n\n if (event.type === `panStart`) {\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 type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\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.state.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.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.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.state.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 { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\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 { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n combineLatest,\n EMPTY,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection, computedPageTurnMode } =\n reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (computedPageTurnMode === \"scrollable\") {\n return { event, handled: false }\n }\n\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\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}: {\n recognizer: PanRecognizer\n reader: Reader\n}) => {\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.state.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (\n reader.zoom.state.isZooming &&\n reader.zoom.state.currentScale > 1\n ) {\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 { 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 { 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 { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\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: 15,\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 recognizer: tapRecognizer,\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.watch(`rootElement`).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":["switchMap","EMPTY","tap","map","isHtmlElement","filter","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","takeUntil","of","combineLatest","first","SettingsManager","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, filter, map, merge, of, switchMap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\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 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 const panEnd$ = recognizer.events$.pipe(\n filter((event) => event.type === `panEnd`),\n )\n\n const pan$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n const startZoomPosition = reader.zoom.state.currentPosition\n\n const moveAndEnd$ = merge(panMove$, panEnd$).pipe(\n map((event) => {\n const isZooming = reader.zoom.state.isZooming\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n if (isZooming && isZoomingIn) {\n const x = startZoomPosition.x + Math.floor(event.deltaX)\n const y = startZoomPosition.y + Math.floor(event.deltaY)\n\n reader.zoom.move({\n x,\n y,\n })\n\n return { event, handled: true }\n }\n\n if (event.type === `panMove`) {\n reader.navigation.moveTo({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return { event, handled: true }\n }\n\n if (event.type === `panEnd`) {\n reader.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n\n return { event, handled: true }\n }\n\n return { event, handled: false }\n }),\n )\n\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n if (!isZoomingIn) {\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n\n return merge(\n of({ event: panStartEvent, handled: true }),\n moveAndEnd$,\n )\n }\n\n return merge(\n of({ event: panStartEvent, handled: false }),\n moveAndEnd$,\n )\n }),\n )\n\n return pan$\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\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.state.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.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.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.state.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 { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\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 { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\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 { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n combineLatest,\n EMPTY,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection, computedPageTurnMode } =\n reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (computedPageTurnMode === \"scrollable\") {\n return { event, handled: false }\n }\n\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\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, 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 { 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 { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\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: 15,\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 ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\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 containerUpdate$ = reader.context.watch(`rootElement`).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$, 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":["switchMap","EMPTY","filter","merge","map","isZoomingIn","of","isHtmlElement","withLatestFrom","tap","event","throttleTime","animationFrameScheduler","takeUntil","combineLatest","first","SettingsManager","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.251.0",
3
+ "version": "1.252.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.251.0"
28
+ "@prose-reader/core": "^1.252.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": "96f70959ca7e4bf817c473c7ba61df0ad06143f1"
38
+ "gitHead": "e122abd2a9e5c28b760c3d6f819b6abb12a27bea"
39
39
  }
@@ -1,6 +0,0 @@
1
- import { Reader } from '@prose-reader/core';
2
- import { PanRecognizer } from 'gesturx';
3
- export declare const registerZoomPan: ({ reader, recognizer, }: {
4
- recognizer: PanRecognizer;
5
- reader: Reader;
6
- }) => import('rxjs').Observable<import('gesturx').PanEvent>;