@prose-reader/enhancer-gestures 1.248.0 → 1.249.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
@@ -251,7 +251,7 @@ const registerTaps = ({
251
251
  switchMap(([{ event }, containerElement, spineElement]) => {
252
252
  if (!containerElement || !spineElement) return EMPTY;
253
253
  const normalizedEvent = event.event;
254
- const { computedPageTurnDirection } = reader.settings.values;
254
+ const { computedPageTurnDirection, computedPageTurnMode } = reader.settings.values;
255
255
  if (event.type === "tap" && isNotLink(event) && !istMatchingSelectors(settingsManager.values.ignore, event)) {
256
256
  if (`x` in normalizedEvent) {
257
257
  const containerElementRect = containerElement.getBoundingClientRect();
@@ -276,6 +276,9 @@ const registerTaps = ({
276
276
  first(),
277
277
  filter((results) => !results.some((result) => result === false)),
278
278
  map(() => {
279
+ if (computedPageTurnMode === "scrollable") {
280
+ return { event, handled: false };
281
+ }
279
282
  if (computedPageTurnDirection === "horizontal" && isPositionInArea(
280
283
  positionInContainer,
281
284
  { type: "margins", left: pageTurnMargin },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/gestures/zoomPan.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1)\n return\n\n if (event.type === `panStart`) {\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.state.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter(({ event }) => event.type === \"swipe\"),\n tap(({ event }) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map(({ event }) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n EMPTY,\n combineLatest,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n}) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.state.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (\n reader.zoom.state.isZooming &&\n reader.zoom.state.currentScale > 1\n ) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\nexport * from \"./types\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 15,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["event"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/gestures/zoomPan.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1)\n return\n\n if (event.type === `panStart`) {\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.state.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter(({ event }) => event.type === \"swipe\"),\n tap(({ event }) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map(({ event }) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n combineLatest,\n EMPTY,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection, computedPageTurnMode } =\n reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (computedPageTurnMode === \"scrollable\") {\n return { event, handled: false }\n }\n\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n}) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.state.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (\n reader.zoom.state.isZooming &&\n reader.zoom.state.currentScale > 1\n ) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\nexport * from \"./types\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 15,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["event"],"mappings":"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"}
@@ -252,7 +252,7 @@
252
252
  rxjs.switchMap(([{ event }, containerElement, spineElement]) => {
253
253
  if (!containerElement || !spineElement) return rxjs.EMPTY;
254
254
  const normalizedEvent = event.event;
255
- const { computedPageTurnDirection } = reader.settings.values;
255
+ const { computedPageTurnDirection, computedPageTurnMode } = reader.settings.values;
256
256
  if (event.type === "tap" && isNotLink(event) && !istMatchingSelectors(settingsManager.values.ignore, event)) {
257
257
  if (`x` in normalizedEvent) {
258
258
  const containerElementRect = containerElement.getBoundingClientRect();
@@ -277,6 +277,9 @@
277
277
  rxjs.first(),
278
278
  rxjs.filter((results) => !results.some((result) => result === false)),
279
279
  rxjs.map(() => {
280
+ if (computedPageTurnMode === "scrollable") {
281
+ return { event, handled: false };
282
+ }
280
283
  if (computedPageTurnDirection === "horizontal" && isPositionInArea(
281
284
  positionInContainer,
282
285
  { type: "margins", left: pageTurnMargin },
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/gestures/zoomPan.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1)\n return\n\n if (event.type === `panStart`) {\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.state.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter(({ event }) => event.type === \"swipe\"),\n tap(({ event }) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map(({ event }) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n EMPTY,\n combineLatest,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection } = reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n}) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.state.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (\n reader.zoom.state.isZooming &&\n reader.zoom.state.currentScale > 1\n ) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\nexport * from \"./types\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 15,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["switchMap","EMPTY","tap","map","isHtmlElement","filter","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","takeUntil","of","combineLatest","first","SettingsManager","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/gestures/zoomPan.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n return recognizer.events$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming && reader.zoom.state.currentScale > 1)\n return\n\n if (event.type === `panStart`) {\n reader?.navigation.moveTo({ x: 0, y: 0 }, { start: true })\n }\n\n if (event.type === `panMove`) {\n reader?.navigation.moveTo({ x: event.deltaX, y: event.deltaY })\n }\n\n if (event.type === `panEnd`) {\n reader?.navigation.moveTo(\n { x: event.deltaX, y: event.deltaY },\n { final: true },\n )\n }\n }),\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([event, viewportState]) => {\n const target = event.event.target\n const startScale = reader.zoom.state.currentScale\n\n if (viewportState === \"busy\") return EMPTY\n\n if (shouldStartZoom(target)) {\n reader.zoom.enter({ element: target })\n }\n\n if (!reader.zoom.state.isZooming) return EMPTY\n\n return merge(\n pinchMove$.pipe(\n tap((event) => {\n if (reader.zoom.state.isZooming) {\n const newScale = startScale + (event.scale - 1)\n\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(newScale)\n }\n }\n }),\n ),\n )\n }),\n )\n\n const watchForFontScaleChange$ = !fontScalePinchEnabled\n ? EMPTY\n : pinchStart$.pipe(\n withLatestFrom(reader.viewportState$),\n switchMap(([pinchStartEvent, viewportState]) => {\n if (\n viewportState === \"busy\" ||\n shouldStartZoom(pinchStartEvent.event.target) ||\n reader.zoom.state.isZooming\n )\n return EMPTY\n\n const lastFontScaleOnPinchStart = reader.settings.values.fontScale\n\n return pinchMove$.pipe(\n throttleTime(\n fontScalePinchThrottleTime,\n animationFrameScheduler,\n {\n trailing: true,\n },\n ),\n tap((event) => {\n const newScale = Number.parseFloat(\n (lastFontScaleOnPinchStart + (event.scale - 1)).toFixed(2),\n )\n\n const newMinMaxedFontScale = Math.max(\n Math.min(\n newScale,\n settingsManager.values.fontScaleMaxScale,\n ),\n settingsManager.values.fontScaleMinScale,\n )\n\n reader.settings.update({\n fontScale: newMinMaxedFontScale,\n })\n }),\n takeUntil(pinchEnd$),\n )\n }),\n )\n\n return merge(zoomGestures$, watchForFontScaleChange$).pipe(\n map((event) => ({ event, handled: true })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nexport const registerSwipe = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) =>\n panNavigation !== \"swipe\"\n ? EMPTY\n : recognizable.events$.pipe(\n filter(({ event }) => event.type === \"swipe\"),\n tap(({ event }) => {\n const { computedPageTurnDirection } = reader.settings.values\n\n if (computedPageTurnDirection === \"vertical\") {\n if (event.velocityY < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityY > 0.5) {\n reader?.navigation.turnLeft()\n }\n } else {\n if (event.velocityX < -0.5) {\n reader?.navigation.turnRight()\n }\n if (event.velocityX > 0.5) {\n reader?.navigation.turnLeft()\n }\n }\n }),\n map(({ event }) => ({ event, handled: true })),\n ),\n ),\n )\n\n return gestures$\n}\n","import { isHtmlElement } from \"@prose-reader/core\"\nimport type { GestureEvent } from \"./types\"\n\nexport const isNotLink = (event: GestureEvent[\"event\"]) => {\n const target = event.event.target\n\n if (isHtmlElement(target) && target.tagName === \"a\") return false\n\n return true\n}\n\nexport const getPositionRelativeToContainer = (\n event: { x: number; y: number },\n containerElementRect: DOMRectReadOnly,\n) => {\n const { x, y } = event\n const { left, top } = containerElementRect\n\n return {\n x: x - left,\n y: y - top,\n }\n}\n\nexport const istMatchingSelectors = (\n selectors: string[],\n event: GestureEvent[\"event\"],\n): boolean => {\n const target = event.event.target\n\n if (!isHtmlElement(target)) return false\n\n const match = selectors.find((selector) => {\n // Check if the target matches the selector directly\n if (target.matches(selector)) return true\n\n // Check if the target is within an element matching the selector\n if (target.closest(selector)) return true\n\n return false\n })\n\n return !!match\n}\n","import type { TapArea } from \"./types\"\n\nexport const isPositionInArea = (\n position: { x: number; y: number },\n area: TapArea,\n containerSize: { width: number; height: number },\n): boolean => {\n const { x, y } = position\n const { width, height } = containerSize\n\n switch (area.type) {\n case \"margins\": {\n const { top, bottom, left, right } = area\n const inTop = top !== undefined ? y < height * top : true\n const inBottom = bottom !== undefined ? y > height * (1 - bottom) : true\n const inLeft = left !== undefined ? x < width * left : true\n const inRight = right !== undefined ? x > width * (1 - right) : true\n\n return (\n (top !== undefined && inTop) ||\n (bottom !== undefined && inBottom) ||\n (left !== undefined && inLeft) ||\n (right !== undefined && inRight)\n )\n }\n\n case \"rectangle\": {\n const {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n unit = \"%\",\n } = area\n const actualX = unit === \"%\" ? width * (rectX / 100) : rectX\n const actualY = unit === \"%\" ? height * (rectY / 100) : rectY\n const actualWidth = unit === \"%\" ? width * (rectWidth / 100) : rectWidth\n const actualHeight =\n unit === \"%\" ? height * (rectHeight / 100) : rectHeight\n\n return (\n x >= actualX &&\n x <= actualX + actualWidth &&\n y >= actualY &&\n y <= actualY + actualHeight\n )\n }\n\n case \"corner\": {\n const { corner, size, unit = \"%\" } = area\n const actualSize =\n unit === \"%\" ? Math.min(width, height) * (size / 100) : size\n\n switch (corner) {\n case \"top-left\":\n return x < actualSize && y < actualSize\n case \"top-right\":\n return x > width - actualSize && y < actualSize\n case \"bottom-left\":\n return x < actualSize && y > height - actualSize\n case \"bottom-right\":\n return x > width - actualSize && y > height - actualSize\n default:\n return false\n }\n }\n\n case \"center\": {\n const { width: centerWidth, height: centerHeight, unit = \"%\" } = area\n const actualWidth =\n unit === \"%\" ? width * (centerWidth / 100) : centerWidth\n const actualHeight =\n unit === \"%\" ? height * (centerHeight / 100) : centerHeight\n const centerX = width / 2\n const centerY = height / 2\n\n return (\n x >= centerX - actualWidth / 2 &&\n x <= centerX + actualWidth / 2 &&\n y >= centerY - actualHeight / 2 &&\n y <= centerY + actualHeight / 2\n )\n }\n\n default:\n return false\n }\n}\n\nexport const calculatePageTurnLinearMargin = (screenWidth: number): number => {\n const minMargin = 0.15\n const maxMargin = 0.2\n const minWidth = 320\n const maxWidth = 1200\n\n if (screenWidth <= minWidth) return maxMargin\n if (screenWidth >= maxWidth) return minMargin\n\n // Linear interpolation between min and max\n const ratio = (screenWidth - minWidth) / (maxWidth - minWidth)\n return maxMargin - ratio * (maxMargin - minMargin)\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { TapRecognizer } from \"gesturx\"\nimport {\n combineLatest,\n EMPTY,\n filter,\n first,\n map,\n of,\n switchMap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../../types\"\nimport {\n getPositionRelativeToContainer,\n isNotLink,\n istMatchingSelectors,\n} from \"../../utils\"\nimport { calculatePageTurnLinearMargin, isPositionInArea } from \"./utils\"\n\nexport const registerTaps = ({\n reader,\n recognizable,\n hookManager,\n settingsManager,\n recognizer,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n recognizer: TapRecognizer\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = recognizable.events$.pipe(\n filter((event) => event.recognizer === recognizer),\n withLatestFrom(reader.context.watch(`rootElement`), reader.spine.element$),\n switchMap(([{ event }, containerElement, spineElement]) => {\n if (!containerElement || !spineElement) return EMPTY\n\n const normalizedEvent = event.event\n const { computedPageTurnDirection, computedPageTurnMode } =\n reader.settings.values\n\n if (\n event.type === \"tap\" &&\n isNotLink(event) &&\n !istMatchingSelectors(settingsManager.values.ignore, event)\n ) {\n if (`x` in normalizedEvent) {\n const containerElementRect = containerElement.getBoundingClientRect()\n const width = containerElementRect.width\n const pageTurnMargin = calculatePageTurnLinearMargin(width)\n const positionInContainer = getPositionRelativeToContainer(\n normalizedEvent,\n containerElementRect,\n )\n\n const positionInSpineNonTransformed =\n reader.coordinates.getSpinePositionFromClientPosition(\n normalizedEvent,\n )\n\n const spineItemPageInfo = positionInSpineNonTransformed\n ? reader.spine.locator.getSpineItemPagePositionFromSpinePosition(\n positionInSpineNonTransformed,\n )\n : undefined\n\n const beforeTapResults$ = hookManager.execute(\n \"beforeTapGesture\",\n undefined,\n { event$: of({ event, page: spineItemPageInfo }) },\n )\n\n return combineLatest([...beforeTapResults$, of(true)]).pipe(\n first(),\n filter((results) => !results.some((result) => result === false)),\n map(() => {\n if (computedPageTurnMode === \"scrollable\") {\n return { event, handled: false }\n }\n\n if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", left: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", top: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnLeftOrTop()\n } else if (\n computedPageTurnDirection === \"vertical\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", bottom: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else if (\n computedPageTurnDirection === \"horizontal\" &&\n isPositionInArea(\n positionInContainer,\n { type: \"margins\", right: pageTurnMargin },\n containerElementRect,\n )\n ) {\n reader.navigation.turnRightOrBottom()\n } else {\n return { event, handled: false }\n }\n\n return { event, handled: true }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { filter, switchMap, tap } from \"rxjs\"\n\nexport const registerZoomPan = ({\n reader,\n recognizer,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n}) => {\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === \"panMove\"),\n )\n\n const zoomingPan$ = panStart$.pipe(\n switchMap(() => {\n const startPosition = reader.zoom.state.currentPosition\n\n return panMove$.pipe(\n tap((panMoveEvent) => {\n if (\n reader.zoom.state.isZooming &&\n reader.zoom.state.currentScale > 1\n ) {\n reader.zoom.moveAt({\n x: startPosition.x + panMoveEvent.deltaX,\n y: startPosition.y + panMoveEvent.deltaY,\n })\n }\n }),\n )\n }),\n )\n\n return zoomingPan$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport type { InputSettings, OutputSettings } from \"./types\"\nimport { takeUntil, tap } from \"rxjs\"\n\nexport class GesturesSettingsManager extends SettingsManager<\n InputSettings,\n OutputSettings\n> {\n constructor(\n initialSettings: Partial<InputSettings>,\n private reader: Reader,\n ) {\n super(initialSettings)\n\n /**\n * Since we have settings that may be locked due to some reader settings\n * we need to update as soon as they update as well.\n */\n reader.settings.values$\n .pipe(\n tap(() => {\n this.update({})\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n getOutputSettings(inputSettings: InputSettings): OutputSettings {\n return {\n ...inputSettings,\n panNavigation:\n this.reader.settings.values.computedPageTurnMode === `scrollable`\n ? false\n : inputSettings.panNavigation,\n }\n }\n\n getDefaultSettings(): InputSettings {\n return {\n panNavigation: \"pan\",\n pinchCancelPan: true,\n fontScalePinchEnabled: true,\n fontScalePinchThrottleTime: 500,\n fontScaleMaxScale: 5,\n fontScaleMinScale: 0.2,\n ignore: [],\n }\n }\n}\n","import { HookManager, type Reader } from \"@prose-reader/core\"\nimport {\n PanRecognizer,\n PinchRecognizer,\n Recognizable,\n SwipeRecognizer,\n TapRecognizer,\n} from \"gesturx\"\nimport { combineLatest, merge, share, takeUntil, tap } from \"rxjs\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { registerZoomPan } from \"./gestures/zoomPan\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport type { EnhancerAPI, Hook, InputSettings } from \"./types\"\n\nexport { isPositionInArea } from \"./gestures/taps/utils\"\nexport * from \"./types\"\n\nexport const gesturesEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & {\n gestures?: Partial<InputSettings>\n },\n ): InheritOutput & EnhancerAPI => {\n const { gestures = {}, ...rest } = options\n const reader = next(rest as InheritOptions)\n\n const settingsManager = new GesturesSettingsManager(gestures, reader)\n\n const hookManager = new HookManager<Hook>()\n\n const pinchRecognizer = new PinchRecognizer({\n options: {\n /**\n * @important\n * To be less than pan otherwise it will not fail before it starts\n */\n posThreshold: 20,\n },\n })\n\n const failWithSelection = {\n start$: reader.selection.selectionStart$,\n end$: reader.selection.selectionEnd$,\n }\n\n const panRecognizer = new PanRecognizer({\n failWith: [pinchRecognizer, failWithSelection],\n options: {\n // we want to have some margin to trigger zoom\n posThreshold: 15,\n },\n })\n\n const zoomPanRecognizer = new PanRecognizer({\n options: {\n posThreshold: 1,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n zoomPanRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const zoomPanGestures$ = registerZoomPan({\n reader,\n recognizer: zoomPanRecognizer,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, zoomPanGestures$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["switchMap","EMPTY","tap","map","isHtmlElement","filter","withLatestFrom","merge","event","throttleTime","animationFrameScheduler","takeUntil","of","combineLatest","first","SettingsManager","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-gestures",
3
- "version": "1.248.0",
3
+ "version": "1.249.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "test": "vitest run --coverage"
26
26
  },
27
27
  "dependencies": {
28
- "@prose-reader/core": "^1.248.0"
28
+ "@prose-reader/core": "^1.249.0"
29
29
  },
30
30
  "devDependencies": {
31
31
  "gesturx": "*",
@@ -35,5 +35,5 @@
35
35
  "gesturx": "1.x",
36
36
  "rxjs": "7.x"
37
37
  },
38
- "gitHead": "a1696223e15a09e733433dc84c864caca5c71d6d"
38
+ "gitHead": "1f3c4ee10fda96813c99beede9f3acae2479f262"
39
39
  }