@prose-reader/enhancer-gestures 1.147.0 → 1.148.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.
@@ -1,12 +1,13 @@
1
1
  import { HookManager, Reader } from '@prose-reader/core';
2
- import { Subject } from 'rxjs';
3
- import { GestureEvent, Hook } from '../types';
2
+ import { Hook } from '../types';
4
3
  import { GesturesSettingsManager } from '../SettingsManager';
5
4
  import { PanRecognizer } from 'gesturx';
6
5
  export declare const registerPan: ({ reader, recognizer, settingsManager, }: {
7
6
  recognizer: PanRecognizer;
8
7
  reader: Reader;
9
8
  hookManager: HookManager<Hook>;
10
- unhandledEvent$: Subject<GestureEvent>;
11
9
  settingsManager: GesturesSettingsManager;
12
- }) => import('rxjs').Observable<import('gesturx').PanEvent>;
10
+ }) => import('rxjs').Observable<{
11
+ event: import('gesturx').PanEvent;
12
+ handled: boolean;
13
+ }>;
@@ -1,12 +1,13 @@
1
1
  import { HookManager, Reader } from '@prose-reader/core';
2
- import { Subject } from 'rxjs';
3
- import { GestureEvent, GestureRecognizable, Hook } from '../types';
2
+ import { GestureRecognizable, Hook } from '../types';
4
3
  import { GesturesSettingsManager } from '../SettingsManager';
5
4
  import { PinchEvent } from 'gesturx';
6
5
  export declare const registerPinch: ({ reader, recognizable, settingsManager, }: {
7
6
  recognizable: GestureRecognizable;
8
7
  reader: Reader;
9
8
  hookManager: HookManager<Hook>;
10
- unhandledEvent$: Subject<GestureEvent>;
11
9
  settingsManager: GesturesSettingsManager;
12
- }) => import('rxjs').Observable<PinchEvent>;
10
+ }) => import('rxjs').Observable<{
11
+ event: PinchEvent;
12
+ handled: boolean;
13
+ }>;
@@ -1,11 +1,12 @@
1
1
  import { HookManager, Reader } from '@prose-reader/core';
2
- import { Subject } from 'rxjs';
3
- import { GestureEvent, GestureRecognizable, Hook } from '../types';
2
+ import { GestureRecognizable, Hook } from '../types';
4
3
  import { GesturesSettingsManager } from '../SettingsManager';
5
4
  export declare const registerSwipe: ({ reader, recognizable, settingsManager, }: {
6
5
  recognizable: GestureRecognizable;
7
6
  reader: Reader;
8
7
  hookManager: HookManager<Hook>;
9
- unhandledEvent$: Subject<GestureEvent>;
10
8
  settingsManager: GesturesSettingsManager;
11
- }) => import('rxjs').Observable<import('gesturx').SwipeEvent>;
9
+ }) => import('rxjs').Observable<{
10
+ event: import('gesturx').SwipeEvent;
11
+ handled: boolean;
12
+ }>;
@@ -1,11 +1,12 @@
1
1
  import { HookManager, Reader } from '@prose-reader/core';
2
- import { Subject } from 'rxjs';
3
- import { GestureEvent, GestureRecognizable, Hook } from '../types';
2
+ import { GestureRecognizable, Hook } from '../types';
4
3
  import { GesturesSettingsManager } from '../SettingsManager';
5
- export declare const registerTaps: ({ reader, recognizable, unhandledEvent$, hookManager, }: {
4
+ export declare const registerTaps: ({ reader, recognizable, hookManager, }: {
6
5
  recognizable: GestureRecognizable;
7
6
  reader: Reader;
8
7
  hookManager: HookManager<Hook>;
9
- unhandledEvent$: Subject<GestureEvent>;
10
8
  settingsManager: GesturesSettingsManager;
11
- }) => import('rxjs').Observable<[...boolean[], boolean]>;
9
+ }) => import('rxjs').Observable<{
10
+ event: import('gesturx').TapEvent;
11
+ handled: boolean;
12
+ }>;
package/dist/index.js CHANGED
@@ -1,25 +1,21 @@
1
1
  import { isHtmlElement, SettingsManager, HookManager } from "@prose-reader/core";
2
- import { filter, switchMap, combineLatest, of, first, tap, EMPTY, takeUntil, withLatestFrom, merge, throttleTime, animationFrameScheduler, Subject } from "rxjs";
2
+ import { switchMap, combineLatest, of, first, map, EMPTY, tap, filter, takeUntil, withLatestFrom, merge, throttleTime, animationFrameScheduler, share } from "rxjs";
3
3
  import { PinchRecognizer, PanRecognizer, TapRecognizer, SwipeRecognizer, Recognizable } from "gesturx";
4
- const filterNotLink = (stream) => stream.pipe(
5
- filter((event) => {
6
- const target = event.event.target;
7
- if (isHtmlElement(target) && target.tagName === "a") return false;
8
- return true;
9
- })
10
- );
4
+ const isNotLink = (event) => {
5
+ const target = event.event.target;
6
+ if (isHtmlElement(target) && target.tagName === "a") return false;
7
+ return true;
8
+ };
11
9
  const registerTaps = ({
12
10
  reader,
13
11
  recognizable,
14
- unhandledEvent$,
15
12
  hookManager
16
13
  }) => {
17
14
  const gestures$ = recognizable.events$.pipe(
18
- filterNotLink,
19
15
  switchMap((event) => {
20
16
  const normalizedEvent = event.event;
21
17
  const { computedPageTurnDirection } = reader.settings.values;
22
- if (event.type === "tap") {
18
+ if (event.type === "tap" && isNotLink(event)) {
23
19
  const width = window.innerWidth;
24
20
  const height = window.innerHeight;
25
21
  const pageTurnMargin = 0.15;
@@ -28,9 +24,9 @@ const registerTaps = ({
28
24
  const beforeTapResults$ = hookManager.execute("beforeTap", void 0, { event });
29
25
  return combineLatest([...beforeTapResults$, of(true)]).pipe(
30
26
  first(),
31
- tap((results) => {
27
+ map((results) => {
32
28
  if (results.some((result) => result === false)) {
33
- return;
29
+ return { event, handled: false };
34
30
  }
35
31
  const isTopArea = y < height * pageTurnMargin;
36
32
  const isBottomArea = y > height * (1 - pageTurnMargin);
@@ -45,8 +41,9 @@ const registerTaps = ({
45
41
  } else if (isRightArea && computedPageTurnDirection === "horizontal") {
46
42
  reader.navigation.turnRightOrBottom();
47
43
  } else {
48
- unhandledEvent$.next(event);
44
+ return { event, handled: false };
49
45
  }
46
+ return { event, handled: true };
50
47
  })
51
48
  );
52
49
  }
@@ -78,7 +75,8 @@ const registerPan = ({
78
75
  if (event.type === `panEnd`) {
79
76
  reader == null ? void 0 : reader.navigation.moveTo({ x: event.deltaX, y: event.deltaY }, { final: true });
80
77
  }
81
- })
78
+ }),
79
+ map((event) => ({ event, handled: true }))
82
80
  );
83
81
  })
84
82
  );
@@ -110,7 +108,8 @@ const registerSwipe = ({
110
108
  reader == null ? void 0 : reader.navigation.turnLeft();
111
109
  }
112
110
  }
113
- })
111
+ }),
112
+ map((event) => ({ event, handled: true }))
114
113
  )
115
114
  )
116
115
  );
@@ -206,7 +205,7 @@ const registerPinch = ({
206
205
  );
207
206
  })
208
207
  );
209
- return merge(zoomGestures$, watchForFontScaleChange$);
208
+ return merge(zoomGestures$, watchForFontScaleChange$).pipe(map((event) => ({ event, handled: true })));
210
209
  })
211
210
  );
212
211
  };
@@ -267,34 +266,29 @@ const gesturesEnhancer = (next) => (options) => {
267
266
  recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],
268
267
  disableTextSelection: false
269
268
  });
270
- const unhandledEvent$ = new Subject();
271
269
  const tapGestures$ = registerTaps({
272
270
  hookManager,
273
271
  reader,
274
272
  recognizable,
275
- unhandledEvent$,
276
273
  settingsManager
277
274
  });
278
275
  const panGestures$ = registerPan({
279
276
  hookManager,
280
277
  reader,
281
278
  recognizer: panRecognizer,
282
- unhandledEvent$,
283
279
  settingsManager
284
280
  });
285
281
  const swipeGestures$ = registerSwipe({
286
282
  hookManager,
287
283
  reader,
288
284
  recognizable,
289
- unhandledEvent$,
290
285
  settingsManager
291
286
  });
292
287
  const pinchGestures$ = registerPinch({
293
288
  hookManager,
294
289
  reader,
295
290
  recognizable,
296
- settingsManager,
297
- unhandledEvent$
291
+ settingsManager
298
292
  });
299
293
  const zoomPanGestures$ = registerZoomPan({
300
294
  reader,
@@ -323,15 +317,10 @@ const gesturesEnhancer = (next) => (options) => {
323
317
  }
324
318
  })
325
319
  );
326
- merge(
327
- containerUpdate$,
328
- watchSettings$,
329
- zoomPanGestures$,
330
- pinchGestures$,
331
- tapGestures$,
332
- swipeGestures$,
333
- panGestures$
334
- ).pipe(takeUntil(reader.$.destroy$)).subscribe();
320
+ const gestures$ = merge(pinchGestures$, tapGestures$, swipeGestures$, panGestures$).pipe(
321
+ share()
322
+ );
323
+ merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(takeUntil(reader.$.destroy$)).subscribe();
335
324
  return {
336
325
  ...reader,
337
326
  destroy: () => {
@@ -340,7 +329,7 @@ const gesturesEnhancer = (next) => (options) => {
340
329
  },
341
330
  gestures: {
342
331
  settings: settingsManager,
343
- unhandledEvent$: unhandledEvent$.asObservable(),
332
+ gestures$,
344
333
  hookManager
345
334
  }
346
335
  };
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 { isHtmlElement } from \"@prose-reader/core\"\nimport { filter, Observable } from \"rxjs\"\n\nexport const filterNotLink = <Event extends { event: PointerEvent }>(stream: Observable<Event>) =>\n stream.pipe(\n filter((event) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n }),\n )\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, first, of, Subject, switchMap, tap } from \"rxjs\"\nimport { GestureEvent, GestureRecognizable, Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { filterNotLink } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n unhandledEvent$,\n hookManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n unhandledEvent$: Subject<GestureEvent>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filterNotLink,\n switchMap((event) => {\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (event.type === \"tap\") {\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(\"beforeTap\", undefined, { event })\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n tap((results) => {\n if (results.some((result) => result === false)) {\n return\n }\n\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 unhandledEvent$.next(event)\n }\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, Subject, switchMap, tap } from \"rxjs\"\nimport { GestureEvent, 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 unhandledEvent$: Subject<GestureEvent>\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 )\n }),\n )\n\n return gestures$\n}\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, Subject, filter, switchMap, tap } from \"rxjs\"\nimport { GestureEvent, 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 unhandledEvent$: Subject<GestureEvent>\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 ),\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 }\n }\n}\n","import { HookManager, isHtmlElement, Reader } from \"@prose-reader/core\"\nimport {\n EMPTY,\n Subject,\n animationFrameScheduler,\n filter,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport { GestureEvent, 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 unhandledEvent$: Subject<GestureEvent>\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$)\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 { ObservedValueOf, Subject, combineLatest, merge, 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 unhandledEvent$ = new Subject<ObservedValueOf<typeof recognizable.events$>>()\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n unhandledEvent$,\n settingsManager,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n unhandledEvent$,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n unhandledEvent$,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n unhandledEvent$,\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 merge(\n containerUpdate$,\n watchSettings$,\n zoomPanGestures$,\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n )\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 unhandledEvent$: unhandledEvent$.asObservable(),\n 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 { 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","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, first, map, of, switchMap } from \"rxjs\"\nimport { GestureRecognizable, Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { isNotLink } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\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)) {\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(\"beforeTap\", undefined, { event })\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n map((results) => {\n if (results.some((result) => result === false)) {\n return { event, handled: false }\n }\n\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 }\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 hookManager,\n },\n }\n }\n"],"names":["event"],"mappings":"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"}
@@ -2,25 +2,21 @@
2
2
  typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@prose-reader/core"), require("rxjs"), require("gesturx")) : typeof define === "function" && define.amd ? define(["exports", "@prose-reader/core", "rxjs", "gesturx"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["prose-reader-enhancer-gestures"] = {}, global.core, global.rxjs, global.gesturx));
3
3
  })(this, function(exports2, core, rxjs, gesturx) {
4
4
  "use strict";
5
- const filterNotLink = (stream) => stream.pipe(
6
- rxjs.filter((event) => {
7
- const target = event.event.target;
8
- if (core.isHtmlElement(target) && target.tagName === "a") return false;
9
- return true;
10
- })
11
- );
5
+ const isNotLink = (event) => {
6
+ const target = event.event.target;
7
+ if (core.isHtmlElement(target) && target.tagName === "a") return false;
8
+ return true;
9
+ };
12
10
  const registerTaps = ({
13
11
  reader,
14
12
  recognizable,
15
- unhandledEvent$,
16
13
  hookManager
17
14
  }) => {
18
15
  const gestures$ = recognizable.events$.pipe(
19
- filterNotLink,
20
16
  rxjs.switchMap((event) => {
21
17
  const normalizedEvent = event.event;
22
18
  const { computedPageTurnDirection } = reader.settings.values;
23
- if (event.type === "tap") {
19
+ if (event.type === "tap" && isNotLink(event)) {
24
20
  const width = window.innerWidth;
25
21
  const height = window.innerHeight;
26
22
  const pageTurnMargin = 0.15;
@@ -29,9 +25,9 @@
29
25
  const beforeTapResults$ = hookManager.execute("beforeTap", void 0, { event });
30
26
  return rxjs.combineLatest([...beforeTapResults$, rxjs.of(true)]).pipe(
31
27
  rxjs.first(),
32
- rxjs.tap((results) => {
28
+ rxjs.map((results) => {
33
29
  if (results.some((result) => result === false)) {
34
- return;
30
+ return { event, handled: false };
35
31
  }
36
32
  const isTopArea = y < height * pageTurnMargin;
37
33
  const isBottomArea = y > height * (1 - pageTurnMargin);
@@ -46,8 +42,9 @@
46
42
  } else if (isRightArea && computedPageTurnDirection === "horizontal") {
47
43
  reader.navigation.turnRightOrBottom();
48
44
  } else {
49
- unhandledEvent$.next(event);
45
+ return { event, handled: false };
50
46
  }
47
+ return { event, handled: true };
51
48
  })
52
49
  );
53
50
  }
@@ -79,7 +76,8 @@
79
76
  if (event.type === `panEnd`) {
80
77
  reader == null ? void 0 : reader.navigation.moveTo({ x: event.deltaX, y: event.deltaY }, { final: true });
81
78
  }
82
- })
79
+ }),
80
+ rxjs.map((event) => ({ event, handled: true }))
83
81
  );
84
82
  })
85
83
  );
@@ -111,7 +109,8 @@
111
109
  reader == null ? void 0 : reader.navigation.turnLeft();
112
110
  }
113
111
  }
114
- })
112
+ }),
113
+ rxjs.map((event) => ({ event, handled: true }))
115
114
  )
116
115
  )
117
116
  );
@@ -207,7 +206,7 @@
207
206
  );
208
207
  })
209
208
  );
210
- return rxjs.merge(zoomGestures$, watchForFontScaleChange$);
209
+ return rxjs.merge(zoomGestures$, watchForFontScaleChange$).pipe(rxjs.map((event) => ({ event, handled: true })));
211
210
  })
212
211
  );
213
212
  };
@@ -268,34 +267,29 @@
268
267
  recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],
269
268
  disableTextSelection: false
270
269
  });
271
- const unhandledEvent$ = new rxjs.Subject();
272
270
  const tapGestures$ = registerTaps({
273
271
  hookManager,
274
272
  reader,
275
273
  recognizable,
276
- unhandledEvent$,
277
274
  settingsManager
278
275
  });
279
276
  const panGestures$ = registerPan({
280
277
  hookManager,
281
278
  reader,
282
279
  recognizer: panRecognizer,
283
- unhandledEvent$,
284
280
  settingsManager
285
281
  });
286
282
  const swipeGestures$ = registerSwipe({
287
283
  hookManager,
288
284
  reader,
289
285
  recognizable,
290
- unhandledEvent$,
291
286
  settingsManager
292
287
  });
293
288
  const pinchGestures$ = registerPinch({
294
289
  hookManager,
295
290
  reader,
296
291
  recognizable,
297
- settingsManager,
298
- unhandledEvent$
292
+ settingsManager
299
293
  });
300
294
  const zoomPanGestures$ = registerZoomPan({
301
295
  reader,
@@ -324,15 +318,10 @@
324
318
  }
325
319
  })
326
320
  );
327
- rxjs.merge(
328
- containerUpdate$,
329
- watchSettings$,
330
- zoomPanGestures$,
331
- pinchGestures$,
332
- tapGestures$,
333
- swipeGestures$,
334
- panGestures$
335
- ).pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
321
+ const gestures$ = rxjs.merge(pinchGestures$, tapGestures$, swipeGestures$, panGestures$).pipe(
322
+ rxjs.share()
323
+ );
324
+ rxjs.merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$).pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
336
325
  return {
337
326
  ...reader,
338
327
  destroy: () => {
@@ -341,7 +330,7 @@
341
330
  },
342
331
  gestures: {
343
332
  settings: settingsManager,
344
- unhandledEvent$: unhandledEvent$.asObservable(),
333
+ gestures$,
345
334
  hookManager
346
335
  }
347
336
  };
@@ -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 { isHtmlElement } from \"@prose-reader/core\"\nimport { filter, Observable } from \"rxjs\"\n\nexport const filterNotLink = <Event extends { event: PointerEvent }>(stream: Observable<Event>) =>\n stream.pipe(\n filter((event) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n }),\n )\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, first, of, Subject, switchMap, tap } from \"rxjs\"\nimport { GestureEvent, GestureRecognizable, Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { filterNotLink } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n unhandledEvent$,\n hookManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n unhandledEvent$: Subject<GestureEvent>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filterNotLink,\n switchMap((event) => {\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (event.type === \"tap\") {\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(\"beforeTap\", undefined, { event })\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n tap((results) => {\n if (results.some((result) => result === false)) {\n return\n }\n\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 unhandledEvent$.next(event)\n }\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, Subject, switchMap, tap } from \"rxjs\"\nimport { GestureEvent, 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 unhandledEvent$: Subject<GestureEvent>\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 )\n }),\n )\n\n return gestures$\n}\n","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, Subject, filter, switchMap, tap } from \"rxjs\"\nimport { GestureEvent, 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 unhandledEvent$: Subject<GestureEvent>\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 ),\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 }\n }\n}\n","import { HookManager, isHtmlElement, Reader } from \"@prose-reader/core\"\nimport {\n EMPTY,\n Subject,\n animationFrameScheduler,\n filter,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport { GestureEvent, 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 unhandledEvent$: Subject<GestureEvent>\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$)\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 { ObservedValueOf, Subject, combineLatest, merge, 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 unhandledEvent$ = new Subject<ObservedValueOf<typeof recognizable.events$>>()\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n unhandledEvent$,\n settingsManager,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n unhandledEvent$,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n unhandledEvent$,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n unhandledEvent$,\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 merge(\n containerUpdate$,\n watchSettings$,\n zoomPanGestures$,\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n )\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 unhandledEvent$: unhandledEvent$.asObservable(),\n hookManager,\n },\n }\n }\n"],"names":["filter","isHtmlElement","switchMap","combineLatest","of","first","tap","EMPTY","SettingsManager","takeUntil","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","Subject"],"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 { 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","import { HookManager, Reader } from \"@prose-reader/core\"\nimport { combineLatest, EMPTY, first, map, of, switchMap } from \"rxjs\"\nimport { GestureRecognizable, Hook } from \"../types\"\nimport { GesturesSettingsManager } from \"../SettingsManager\"\nimport { isNotLink } from \"../utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\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)) {\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(\"beforeTap\", undefined, { event })\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n map((results) => {\n if (results.some((result) => result === false)) {\n return { event, handled: false }\n }\n\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 }\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 hookManager,\n },\n }\n }\n"],"names":["isHtmlElement","switchMap","combineLatest","of","first","map","EMPTY","tap","filter","SettingsManager","takeUntil","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Observable, ObservedValueOf } from 'rxjs';
2
- import { PanRecognizer, PinchRecognizer, Recognizable, SwipeRecognizer, TapRecognizer, TapEvent } from 'gesturx';
2
+ import { PanEvent, PanRecognizer, PinchEvent, PinchRecognizer, Recognizable, SwipeEvent, SwipeRecognizer, TapRecognizer, TapEvent } from 'gesturx';
3
3
  import { HookManager } from '../../core/dist/hooks/HookManager';
4
4
  import { GesturesSettingsManager } from './SettingsManager';
5
5
  export type Hook = {
@@ -22,7 +22,10 @@ export type OutputSettings = InputSettings;
22
22
  export type EnhancerAPI = {
23
23
  gestures: {
24
24
  settings: GesturesSettingsManager;
25
- unhandledEvent$: Observable<GestureEvent>;
26
25
  hookManager: HookManager<Hook>;
26
+ gestures$: Observable<{
27
+ event: TapEvent | PanEvent | SwipeEvent | PinchEvent;
28
+ handled: boolean;
29
+ }>;
27
30
  };
28
31
  };
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,2 @@
1
- import { Observable } from 'rxjs';
2
- export declare const filterNotLink: <Event extends {
3
- event: PointerEvent;
4
- }>(stream: Observable<Event>) => Observable<Event>;
1
+ import { GestureEvent } from './types';
2
+ export declare const isNotLink: (event: GestureEvent) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-gestures",
3
- "version": "1.147.0",
3
+ "version": "1.148.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -27,7 +27,7 @@
27
27
  "test": "vitest run --coverage"
28
28
  },
29
29
  "dependencies": {
30
- "@prose-reader/core": "^1.147.0"
30
+ "@prose-reader/core": "^1.148.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "gesturx": "^1.8.4"
@@ -36,5 +36,5 @@
36
36
  "gesturx": "*",
37
37
  "rxjs": "*"
38
38
  },
39
- "gitHead": "f18734eaea937fd721171ba4bb7b55c326e1d295"
39
+ "gitHead": "c1a0241b560bc983676ec5b4451e0a3c3b010d56"
40
40
  }