@prose-reader/enhancer-gestures 1.120.0 → 1.122.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -235,8 +235,12 @@ const gesturesEnhancer = (next) => (options) => {
235
235
  posThreshold: 20
236
236
  }
237
237
  });
238
+ const failWithSelection = {
239
+ start$: reader.selection.selectionStart$,
240
+ end$: reader.selection.selectionEnd$
241
+ };
238
242
  const panRecognizer = new PanRecognizer({
239
- failWith: [pinchRecognizer],
243
+ failWith: [pinchRecognizer, failWithSelection],
240
244
  options: {
241
245
  // we want to have some margin to trigger zoom
242
246
  posThreshold: 30
@@ -252,7 +256,8 @@ const gesturesEnhancer = (next) => (options) => {
252
256
  });
253
257
  const swipeRecognizer = new SwipeRecognizer();
254
258
  const recognizable = new Recognizable({
255
- recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer]
259
+ recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],
260
+ disableTextSelection: false
256
261
  });
257
262
  const unhandledEvent$ = new Subject();
258
263
  const tapGestures$ = registerTaps({
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 { Subject, 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 tap((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 if (beforeTapResults.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 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` ? `pan` : 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 panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer],\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\n const recognizable = new Recognizable({\n recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],\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 { 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 { Subject, 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 tap((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 if (beforeTapResults.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 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` ? `pan` : 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\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":";;;AAGa,MAAA,gBAAgB,CAAwC,WACnE,OAAO;AAAA,EACL,OAAO,CAAC,UAAU;AACV,UAAA,SAAS,MAAM,MAAM;AAE3B,QAAI,cAAc,MAAM,KAAK,OAAO,YAAY,IAAY,QAAA;AAErD,WAAA;AAAA,EACR,CAAA;AACH;ACNK,MAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAMM;AACE,QAAA,YAAY,aAAa,QAAQ;AAAA,IACrC;AAAA,IACA,IAAI,CAAC,UAAU;AACb,YAAM,kBAAkB,MAAM;AAC9B,YAAM,EAAE,0BAAA,IAA8B,OAAO,SAAS;AAElD,UAAA,MAAM,SAAS,OAAO;AACxB,cAAM,QAAQ,OAAO;AACrB,cAAM,SAAS,OAAO;AACtB,cAAM,iBAAiB;AAEvB,YAAI,OAAO,iBAAiB;AAC1B,gBAAM,EAAE,IAAI,GAAG,EAAM,IAAA;AAErB,gBAAM,mBAAmB,YAAY,QAAQ,aAAa,QAAW,EAAE,OAAO;AAE9E,cAAI,iBAAiB,KAAK,CAAC,WAAW,WAAW,KAAK,GAAG;AACvD;AAAA,UAAA;AAGI,gBAAA,YAAY,IAAI,SAAS;AACzB,gBAAA,eAAe,IAAI,UAAU,IAAI;AACjC,gBAAA,aAAa,IAAI,QAAQ;AACzB,gBAAA,cAAc,IAAI,SAAS,IAAI;AAEjC,cAAA,cAAc,8BAA8B,cAAc;AAC5D,mBAAO,WAAW,cAAc;AAAA,UAAA,WACvB,aAAa,8BAA8B,YAAY;AAChE,mBAAO,WAAW,cAAc;AAAA,UAAA,WACvB,gBAAgB,8BAA8B,YAAY;AACnE,mBAAO,WAAW,kBAAkB;AAAA,UAAA,WAC3B,eAAe,8BAA8B,cAAc;AACpE,mBAAO,WAAW,kBAAkB;AAAA,UAAA,OAC/B;AACL,4BAAgB,KAAK,KAAK;AAAA,UAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IAEH,CAAA;AAAA,EACH;AAEO,SAAA;AACT;ACtDA,MAAM,mBAAmB;AAElB,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,MAMM;AACE,QAAA,YAAY,gBAAgB,QAAQ;AAAA,IACxC,UAAU,CAAC,EAAE,oBAAoB;AAC3B,UAAA,kBAAkB,MAAc,QAAA;AAEpC,aAAO,WAAW,QAAQ;AAAA,QACxB,IAAI,CAAC,UAAU;AACT,cAAA,OAAO,KAAK,UAAW;AAEvB,cAAA,MAAM,SAAS,YAAY;AAIzB,gBAAA,MAAM,QAAQ,iBAAkB;AAE5B,6CAAA,WAAW,OAAO,EAAE,GAAG,GAAG,GAAG,EAAK,GAAA,EAAE,OAAO,KAAA;AAAA,UAAM;AAGvD,cAAA,MAAM,SAAS,WAAW;AACpB,6CAAA,WAAW,OAAO,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAM;UAAQ;AAG5D,cAAA,MAAM,SAAS,UAAU;AAC3B,6CAAQ,WAAW,OAAO,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAM,OAAO,GAAG,EAAE,OAAO;UAAM;AAAA,QAElF,CAAA;AAAA,MACH;AAAA,IACD,CAAA;AAAA,EACH;AAEO,SAAA;AACT;AC5CO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,MAMM;AACE,QAAA,YAAY,gBAAgB,QAAQ;AAAA,IACxC;AAAA,MAAU,CAAC,EAAE,cAAc,MACzB,kBAAkB,UACd,QACA,aAAa,QAAQ;AAAA,QACnB,OAAO,CAAC,UAAU,MAAM,SAAS,OAAO;AAAA,QACxC,IAAI,CAAC,UAAU;AACb,gBAAM,EAAE,0BAAA,IAA8B,OAAO,SAAS;AAEtD,cAAI,8BAA8B,YAAY;AACxC,gBAAA,MAAM,YAAY,MAAM;AAC1B,+CAAQ,WAAW;AAAA,YAAU;AAE3B,gBAAA,MAAM,YAAY,KAAK;AACzB,+CAAQ,WAAW;AAAA,YAAS;AAAA,UAC9B,OACK;AACD,gBAAA,MAAM,YAAY,MAAM;AAC1B,+CAAQ,WAAW;AAAA,YAAU;AAE3B,gBAAA,MAAM,YAAY,KAAK;AACzB,+CAAQ,WAAW;AAAA,YAAS;AAAA,UAC9B;AAAA,QAEH,CAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAER;AAEO,SAAA;AACT;AC1CO,MAAM,gCAAgC,gBAA+C;AAAA,EAC1F,YACE,iBACQ,QACR;AACA,UAAM,eAAe;AAFb,SAAA,SAAA;AAQR,WAAO,SAAS,QACb;AAAA,MACC,IAAI,MAAM;AACH,aAAA,OAAO,EAAE;AAAA,MAAA,CACf;AAAA,MACD,UAAU,KAAK,QAAQ;AAAA,MAExB,UAAU;AAAA,EAAA;AAAA,EAGf,kBAAkB,eAA8C;AACvD,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eACE,KAAK,OAAO,SAAS,OAAO,yBAAyB,eAAe,QAAQ,cAAc;AAAA,IAC9F;AAAA,EAAA;AAAA,EAGF,qBAAoC;AAC3B,WAAA;AAAA,MACL,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,IACrB;AAAA,EAAA;AAEJ;AC1BA,MAAM,qBAAqB,CAAC,WAC1B,cAAc,MAAM,KACpB,CAAC,CAAC,OAAO,cAAc,eACvB,kBAAkB,OAAO,cAAc,YAAY;AAE9C,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,MAMM;AACE,QAAA,cAAc,aAAa,QAAQ,KAAK,OAAO,CAAC,UAA+B,MAAM,SAAS,YAAY,CAAC;AAE3G,QAAA,aAAa,aAAa,QAAQ,KAAK,OAAO,CAAC,UAA+B,MAAM,SAAS,WAAW,CAAC;AAEzG,QAAA,YAAY,aAAa,QAAQ,KAAK,OAAO,CAAC,UAA+B,MAAM,SAAS,UAAU,CAAC;AAEvG,QAAA,kBAAkB,CAAC,WACvB,mBAAmB,MAAM,KAAK,CAAC,OAAO,KAAK;AAE7C,SAAO,gBAAgB,QAAQ;AAAA,IAC7B,UAAU,CAAC,EAAE,uBAAuB,iCAAiC;AACnE,YAAM,gBAAgB,YAAY;AAAA,QAChC,eAAe,OAAO,cAAc;AAAA,QACpC,UAAU,CAAC,CAAC,OAAO,aAAa,MAAM;AAC9B,gBAAA,SAAS,MAAM,MAAM;AACrB,gBAAA,aAAa,OAAO,KAAK;AAE3B,cAAA,kBAAkB,OAAe,QAAA;AAEjC,cAAA,gBAAgB,MAAM,GAAG;AACpB,mBAAA,KAAK,MAAM,MAAM;AAAA,UAAA;AAG1B,cAAI,CAAC,OAAO,KAAK,UAAkB,QAAA;AAE5B,iBAAA;AAAA,YACL,WAAW;AAAA,cACT,IAAI,CAACA,WAAU;AACT,oBAAA,OAAO,KAAK,WAAW;AACnB,wBAAA,WAAW,cAAcA,OAAM,QAAQ;AAE7C,sBAAI,WAAW,GAAG;AAChB,2BAAO,KAAK,KAAK;AAAA,kBAAA,OACZ;AACE,2BAAA,KAAK,QAAQ,QAAQ;AAAA,kBAAA;AAAA,gBAC9B;AAAA,cAEH,CAAA;AAAA,YAAA;AAAA,UAEL;AAAA,QACD,CAAA;AAAA,MACH;AAEA,YAAM,2BAA2B,CAAC,wBAC9B,QACA,YAAY;AAAA,QACV,eAAe,OAAO,cAAc;AAAA,QACpC,UAAU,CAAC,CAAC,iBAAiB,aAAa,MAAM;AAC1C,cAAA,kBAAkB,UAAU,gBAAgB,gBAAgB,MAAM,MAAM,KAAK,OAAO,KAAK;AACpF,mBAAA;AAEH,gBAAA,4BAA4B,OAAO,SAAS,OAAO;AAEzD,iBAAO,WAAW;AAAA,YAChB,aAAa,4BAA4B,yBAAyB;AAAA,cAChE,UAAU;AAAA,YAAA,CACX;AAAA,YACD,IAAI,CAAC,UAAU;AACP,oBAAA,WAAW,YAAY,6BAA6B,MAAM,QAAQ,IAAI,QAAQ,CAAC,CAAC;AAEtF,oBAAM,uBAAuB,KAAK;AAAA,gBAChC,KAAK,IAAI,UAAU,gBAAgB,OAAO,iBAAiB;AAAA,gBAC3D,gBAAgB,OAAO;AAAA,cACzB;AAEA,qBAAO,SAAS,OAAO;AAAA,gBACrB,WAAW;AAAA,cAAA,CACZ;AAAA,YAAA,CACF;AAAA,YACD,UAAU,SAAS;AAAA,UACrB;AAAA,QACD,CAAA;AAAA,MACH;AAEG,aAAA,MAAM,eAAe,wBAAwB;AAAA,IACrD,CAAA;AAAA,EACH;AACF;AC1GO,MAAM,kBAAkB,CAAC,EAAE,QAAQ,iBAAgE;AAClG,QAAA,YAAY,WAAW,QAAQ,KAAK,OAAO,CAAC,UAAU,MAAM,SAAS,UAAU,CAAC;AAChF,QAAA,WAAW,WAAW,QAAQ,KAAK,OAAO,CAAC,UAAU,MAAM,SAAS,SAAS,CAAC;AAEpF,QAAM,cAAc,UAAU;AAAA,IAC5B,UAAU,MAAM;AACR,YAAA,gBAAgB,OAAO,KAAK;AAElC,aAAO,SAAS;AAAA,QACd,IAAI,CAAC,iBAAiB;AAChB,cAAA,OAAO,KAAK,WAAW;AACzB,mBAAO,KAAK,OAAO,EAAE,GAAG,cAAc,IAAI,aAAa,QAAQ,GAAG,cAAc,IAAI,aAAa,QAAQ;AAAA,UAAA;AAAA,QAE5G,CAAA;AAAA,MACH;AAAA,IACD,CAAA;AAAA,EACH;AAEO,SAAA;AACT;ACZO,MAAM,mBACX,CAA+C,SAC/C,CACE,YAGgC;AAChC,QAAM,EAAE,WAAW,CAAA,GAAI,GAAG,KAAS,IAAA;AAC7B,QAAA,SAAS,KAAK,IAAsB;AAE1C,QAAM,kBAAkB,IAAI,wBAAwB,UAAU,MAAM;AAE9D,QAAA,cAAc,IAAI,YAAkB;AAEpC,QAAA,kBAAkB,IAAI,gBAAgB;AAAA,IAC1C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKP,cAAc;AAAA,IAAA;AAAA,EAChB,CACD;AAED,QAAM,oBAAoB;AAAA,IACxB,QAAQ,OAAO,UAAU;AAAA,IACzB,MAAM,OAAO,UAAU;AAAA,EACzB;AAEM,QAAA,gBAAgB,IAAI,cAAc;AAAA,IACtC,UAAU,CAAC,iBAAiB,iBAAiB;AAAA,IAC7C,SAAS;AAAA;AAAA,MAEP,cAAc;AAAA,IAAA;AAAA,EAChB,CACD;AAEK,QAAA,oBAAoB,IAAI,cAAc;AAAA,IAC1C,SAAS;AAAA,MACP,cAAc;AAAA,IAAA;AAAA,EAChB,CACD;AAEK,QAAA,gBAAgB,IAAI,cAAc;AAAA,IACtC,UAAU,CAAC,aAAa;AAAA,EAAA,CACzB;AAEK,QAAA,kBAAkB,IAAI,gBAAgB;AAEtC,QAAA,eAAe,IAAI,aAAa;AAAA,IACpC,aAAa,CAAC,eAAe,eAAe,iBAAiB,iBAAiB,iBAAiB;AAAA,IAC/F,sBAAsB;AAAA,EAAA,CACvB;AAEK,QAAA,kBAAkB,IAAI,QAAsD;AAElF,QAAM,eAAe,aAAa;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,eAAe,YAAY;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,iBAAiB,cAAc;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,iBAAiB,cAAc;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,mBAAmB,gBAAgB;AAAA,IACvC;AAAA,IACA,YAAY;AAAA,EAAA,CACb;AAEK,QAAA,mBAAmB,OAAO,QAAQ,kBAAkB;AAAA,IACxD,IAAI,CAAC,cAAc;AACjB,mBAAa,OAAO;AAAA,QAClB;AAAA,MAAA,CACD;AAAA,IACF,CAAA;AAAA,EACH;AAEM,QAAA,iBAAiB,cAAc,CAAC,gBAAgB,SAAS,cAAc,OAAO,CAAC,EAAE;AAAA,IACrF,IAAI,CAAC,CAAC,EAAE,eAAe,GAAG,mBAAmB,MAAM;;AACjD,YAAM,0BAAyB,yBAAoB,aAApB,mBAA8B,SAAS;AAElE,UAAA,kBAAkB,CAAC,wBAAwB;AAC7C,sBAAc,OAAO;AAAA,UACnB,UAAU,CAAC,GAAI,oBAAoB,YAAY,IAAK,eAAe;AAAA,QAAA,CACpE;AAAA,MAAA;AAGC,UAAA,CAAC,kBAAkB,wBAAwB;AAC7C,sBAAc,OAAO;AAAA,UACnB,WAAU,yBAAoB,aAApB,mBAA8B,OAAO,CAAC,eAAe,eAAe;AAAA,QAAe,CAC9F;AAAA,MAAA;AAAA,IAEJ,CAAA;AAAA,EACH;AAEA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EAEC,KAAK,UAAU,OAAO,EAAE,QAAQ,CAAC,EACjC,UAAU;AAEN,SAAA;AAAA,IACL,GAAG;AAAA,IACH,SAAS,MAAM;AACb,aAAO,QAAQ;AACf,sBAAgB,QAAQ;AAAA,IAC1B;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,iBAAiB,gBAAgB,aAAa;AAAA,MAC9C;AAAA,IAAA;AAAA,EAEJ;AACF;"}
@@ -236,8 +236,12 @@
236
236
  posThreshold: 20
237
237
  }
238
238
  });
239
+ const failWithSelection = {
240
+ start$: reader.selection.selectionStart$,
241
+ end$: reader.selection.selectionEnd$
242
+ };
239
243
  const panRecognizer = new gesturx.PanRecognizer({
240
- failWith: [pinchRecognizer],
244
+ failWith: [pinchRecognizer, failWithSelection],
241
245
  options: {
242
246
  // we want to have some margin to trigger zoom
243
247
  posThreshold: 30
@@ -253,7 +257,8 @@
253
257
  });
254
258
  const swipeRecognizer = new gesturx.SwipeRecognizer();
255
259
  const recognizable = new gesturx.Recognizable({
256
- recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer]
260
+ recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],
261
+ disableTextSelection: false
257
262
  });
258
263
  const unhandledEvent$ = new rxjs.Subject();
259
264
  const tapGestures$ = registerTaps({
@@ -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 { Subject, 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 tap((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 if (beforeTapResults.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 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` ? `pan` : 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 panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer],\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\n const recognizable = new Recognizable({\n recognizers: [tapRecognizer, panRecognizer, swipeRecognizer, pinchRecognizer, zoomPanRecognizer],\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","tap","switchMap","EMPTY","SettingsManager","takeUntil","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","Subject","combineLatest"],"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 { 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 { Subject, 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 tap((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 if (beforeTapResults.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 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` ? `pan` : 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\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","tap","switchMap","EMPTY","SettingsManager","takeUntil","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","Subject","combineLatest"],"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.120.0",
3
+ "version": "1.122.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -27,14 +27,14 @@
27
27
  "test": "vitest run --coverage"
28
28
  },
29
29
  "dependencies": {
30
- "@prose-reader/core": "^1.120.0"
30
+ "@prose-reader/core": "^1.122.0"
31
31
  },
32
32
  "devDependencies": {
33
- "gesturx": "^1.8.2"
33
+ "gesturx": "^1.8.4"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "gesturx": "*",
37
37
  "rxjs": "*"
38
38
  },
39
- "gitHead": "fa14b4eed24fcb049dcae90788751ccfedab9f75"
39
+ "gitHead": "25e0bcbde20d35742b7da4fd1db1aad574c2c4a6"
40
40
  }