@prose-reader/enhancer-gestures 1.286.0 → 1.289.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
@@ -399,6 +399,7 @@ class GesturesSettingsManager extends SettingsManager {
399
399
  takeUntil(this.destroy$)
400
400
  ).subscribe();
401
401
  }
402
+ reader;
402
403
  getOutputSettings(inputSettings) {
403
404
  return {
404
405
  ...inputSettings,
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/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, filter, map, merge, of, switchMap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === `panStart`),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === `panMove`),\n )\n const panEnd$ = recognizer.events$.pipe(\n filter((event) => event.type === `panEnd`),\n )\n\n const pan$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n /**\n * We use the last cumulative delta to derive the new event atomic delta.\n * This is because panning the zoom does not necessarily means the zoom position\n * will always changes. If the user keep dragging while the zoom is blocked, we want\n * it to move the other direction when he start dragging the other way.\n * We cannot use the `reader.zoom.state.currentPosition` as previous position\n * and the event.deltaX to compute the new zoom position.\n */\n let lastDelta = { x: 0, y: 0 }\n\n const moveAndEnd$ = merge(panMove$, panEnd$).pipe(\n map((event) => {\n const isZooming = reader.zoom.state.isZooming\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n /**\n * When user is zooming in, we don't navigate anymore.\n * The gestures is gonna be handled by the pinch and viewport.\n */\n if (isZooming && isZoomingIn) {\n const deltaX = event.deltaX - lastDelta.x\n const deltaY = event.deltaY - lastDelta.y\n\n lastDelta = {\n x: event.deltaX,\n y: event.deltaY,\n }\n\n reader.zoom.move(\n {\n x: reader.zoom.state.currentPosition.x + deltaX,\n y: reader.zoom.state.currentPosition.y + deltaY,\n },\n {\n constrain: \"within-viewport\",\n },\n )\n\n return event\n }\n\n if (event.type === `panMove`) {\n if (!reader.navigation.panNavigator.value.isStarted) {\n reader.navigation.panNavigator.start({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n reader.navigation.panNavigator.panMoveTo({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n if (\n event.type === `panEnd` &&\n reader.navigation.panNavigator.value.isStarted\n ) {\n reader.navigation.panNavigator.stop({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n return event\n }),\n )\n\n return merge(of(panStartEvent), moveAndEnd$).pipe(\n map((event) => ({ type: \"pan\" as const, gestureEvent: event })),\n )\n }),\n )\n\n return pan$\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n switchMap(() => {\n const startScale = reader.zoom.state.currentScale\n\n return pinchMove$.pipe(\n withLatestFrom(reader.viewportState$),\n map(([event, viewportState]) => {\n // symmetric scaling calculation\n const newScale = startScale * event.scale\n\n /**\n * @important\n * We don't want to trigger zoom gestures if there is a pan navigation\n * in progress. This can happens if the user start panning and then adds\n * another finger triggering a pinch.\n */\n if (viewportState === \"busy\") {\n return event\n }\n\n if (!reader.zoom.state.isZooming && event.scale > 1) {\n reader.zoom.enter({ animate: false, scale: newScale })\n\n return event\n }\n\n if (reader.zoom.state.isZooming) {\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(\n Math.min(newScale, settingsManager.values.zoomMaxScale),\n {\n constrain: \"within-viewport\",\n },\n )\n }\n\n return event\n }\n\n return event\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) => ({\n type: \"pinch\" as const,\n gestureEvent: event,\n })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { SwipeEvent } from \"gesturx\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureEvent, GestureRecognizable, Hook } from \"../types\"\n\nconst isSwipeEvent = (event: GestureEvent[\"event\"]): event is SwipeEvent =>\n event.type === \"swipe\"\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 map(({ event }) => event),\n filter(isSwipeEvent),\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) => ({ type: \"swipe\" as const, gestureEvent: event })),\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 (\n computedPageTurnMode === \"scrollable\" ||\n /**\n * We don't want to navigate from gestures when the user is zooming.\n */\n reader.zoom.state.isZooming\n ) {\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\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 {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\n }\n\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: true,\n }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport { takeUntil, tap } from \"rxjs\"\nimport type { InputSettings, OutputSettings } from \"./types\"\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 zoomMaxScale: Infinity,\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 { name as packageName } from \"../package.json\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport styles from \"./style.css?inline\"\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 removeStylesheet = reader.utils.injectScopedCSS(\n document,\n packageName,\n styles,\n )\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 * Ideally we want pinch to triggers before pan so we can\n * capture zoom before starting panning.\n */\n posThreshold: 10,\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: 20,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n removeStylesheet()\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["packageName"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, filter, map, merge, of, switchMap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === `panStart`),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === `panMove`),\n )\n const panEnd$ = recognizer.events$.pipe(\n filter((event) => event.type === `panEnd`),\n )\n\n const pan$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n /**\n * We use the last cumulative delta to derive the new event atomic delta.\n * This is because panning the zoom does not necessarily means the zoom position\n * will always changes. If the user keep dragging while the zoom is blocked, we want\n * it to move the other direction when he start dragging the other way.\n * We cannot use the `reader.zoom.state.currentPosition` as previous position\n * and the event.deltaX to compute the new zoom position.\n */\n let lastDelta = { x: 0, y: 0 }\n\n const moveAndEnd$ = merge(panMove$, panEnd$).pipe(\n map((event) => {\n const isZooming = reader.zoom.state.isZooming\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n /**\n * When user is zooming in, we don't navigate anymore.\n * The gestures is gonna be handled by the pinch and viewport.\n */\n if (isZooming && isZoomingIn) {\n const deltaX = event.deltaX - lastDelta.x\n const deltaY = event.deltaY - lastDelta.y\n\n lastDelta = {\n x: event.deltaX,\n y: event.deltaY,\n }\n\n reader.zoom.move(\n {\n x: reader.zoom.state.currentPosition.x + deltaX,\n y: reader.zoom.state.currentPosition.y + deltaY,\n },\n {\n constrain: \"within-viewport\",\n },\n )\n\n return event\n }\n\n if (event.type === `panMove`) {\n if (!reader.navigation.panNavigator.value.isStarted) {\n reader.navigation.panNavigator.start({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n reader.navigation.panNavigator.panMoveTo({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n if (\n event.type === `panEnd` &&\n reader.navigation.panNavigator.value.isStarted\n ) {\n reader.navigation.panNavigator.stop({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n return event\n }),\n )\n\n return merge(of(panStartEvent), moveAndEnd$).pipe(\n map((event) => ({ type: \"pan\" as const, gestureEvent: event })),\n )\n }),\n )\n\n return pan$\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n switchMap(() => {\n const startScale = reader.zoom.state.currentScale\n\n return pinchMove$.pipe(\n withLatestFrom(reader.viewportState$),\n map(([event, viewportState]) => {\n // symmetric scaling calculation\n const newScale = startScale * event.scale\n\n /**\n * @important\n * We don't want to trigger zoom gestures if there is a pan navigation\n * in progress. This can happens if the user start panning and then adds\n * another finger triggering a pinch.\n */\n if (viewportState === \"busy\") {\n return event\n }\n\n if (!reader.zoom.state.isZooming && event.scale > 1) {\n reader.zoom.enter({ animate: false, scale: newScale })\n\n return event\n }\n\n if (reader.zoom.state.isZooming) {\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(\n Math.min(newScale, settingsManager.values.zoomMaxScale),\n {\n constrain: \"within-viewport\",\n },\n )\n }\n\n return event\n }\n\n return event\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) => ({\n type: \"pinch\" as const,\n gestureEvent: event,\n })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { SwipeEvent } from \"gesturx\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureEvent, GestureRecognizable, Hook } from \"../types\"\n\nconst isSwipeEvent = (event: GestureEvent[\"event\"]): event is SwipeEvent =>\n event.type === \"swipe\"\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 map(({ event }) => event),\n filter(isSwipeEvent),\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) => ({ type: \"swipe\" as const, gestureEvent: event })),\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 (\n computedPageTurnMode === \"scrollable\" ||\n /**\n * We don't want to navigate from gestures when the user is zooming.\n */\n reader.zoom.state.isZooming\n ) {\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\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 {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\n }\n\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: true,\n }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport { takeUntil, tap } from \"rxjs\"\nimport type { InputSettings, OutputSettings } from \"./types\"\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 zoomMaxScale: Infinity,\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 { name as packageName } from \"../package.json\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport styles from \"./style.css?inline\"\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 removeStylesheet = reader.utils.injectScopedCSS(\n document,\n packageName,\n styles,\n )\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 * Ideally we want pinch to triggers before pan so we can\n * capture zoom before starting panning.\n */\n posThreshold: 10,\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: 20,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n removeStylesheet()\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["packageName"],"mappings":"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"}
@@ -400,6 +400,7 @@
400
400
  rxjs.takeUntil(this.destroy$)
401
401
  ).subscribe();
402
402
  }
403
+ reader;
403
404
  getOutputSettings(inputSettings) {
404
405
  return {
405
406
  ...inputSettings,
@@ -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/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, filter, map, merge, of, switchMap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === `panStart`),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === `panMove`),\n )\n const panEnd$ = recognizer.events$.pipe(\n filter((event) => event.type === `panEnd`),\n )\n\n const pan$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n /**\n * We use the last cumulative delta to derive the new event atomic delta.\n * This is because panning the zoom does not necessarily means the zoom position\n * will always changes. If the user keep dragging while the zoom is blocked, we want\n * it to move the other direction when he start dragging the other way.\n * We cannot use the `reader.zoom.state.currentPosition` as previous position\n * and the event.deltaX to compute the new zoom position.\n */\n let lastDelta = { x: 0, y: 0 }\n\n const moveAndEnd$ = merge(panMove$, panEnd$).pipe(\n map((event) => {\n const isZooming = reader.zoom.state.isZooming\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n /**\n * When user is zooming in, we don't navigate anymore.\n * The gestures is gonna be handled by the pinch and viewport.\n */\n if (isZooming && isZoomingIn) {\n const deltaX = event.deltaX - lastDelta.x\n const deltaY = event.deltaY - lastDelta.y\n\n lastDelta = {\n x: event.deltaX,\n y: event.deltaY,\n }\n\n reader.zoom.move(\n {\n x: reader.zoom.state.currentPosition.x + deltaX,\n y: reader.zoom.state.currentPosition.y + deltaY,\n },\n {\n constrain: \"within-viewport\",\n },\n )\n\n return event\n }\n\n if (event.type === `panMove`) {\n if (!reader.navigation.panNavigator.value.isStarted) {\n reader.navigation.panNavigator.start({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n reader.navigation.panNavigator.panMoveTo({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n if (\n event.type === `panEnd` &&\n reader.navigation.panNavigator.value.isStarted\n ) {\n reader.navigation.panNavigator.stop({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n return event\n }),\n )\n\n return merge(of(panStartEvent), moveAndEnd$).pipe(\n map((event) => ({ type: \"pan\" as const, gestureEvent: event })),\n )\n }),\n )\n\n return pan$\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n switchMap(() => {\n const startScale = reader.zoom.state.currentScale\n\n return pinchMove$.pipe(\n withLatestFrom(reader.viewportState$),\n map(([event, viewportState]) => {\n // symmetric scaling calculation\n const newScale = startScale * event.scale\n\n /**\n * @important\n * We don't want to trigger zoom gestures if there is a pan navigation\n * in progress. This can happens if the user start panning and then adds\n * another finger triggering a pinch.\n */\n if (viewportState === \"busy\") {\n return event\n }\n\n if (!reader.zoom.state.isZooming && event.scale > 1) {\n reader.zoom.enter({ animate: false, scale: newScale })\n\n return event\n }\n\n if (reader.zoom.state.isZooming) {\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(\n Math.min(newScale, settingsManager.values.zoomMaxScale),\n {\n constrain: \"within-viewport\",\n },\n )\n }\n\n return event\n }\n\n return event\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) => ({\n type: \"pinch\" as const,\n gestureEvent: event,\n })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { SwipeEvent } from \"gesturx\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureEvent, GestureRecognizable, Hook } from \"../types\"\n\nconst isSwipeEvent = (event: GestureEvent[\"event\"]): event is SwipeEvent =>\n event.type === \"swipe\"\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 map(({ event }) => event),\n filter(isSwipeEvent),\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) => ({ type: \"swipe\" as const, gestureEvent: event })),\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 (\n computedPageTurnMode === \"scrollable\" ||\n /**\n * We don't want to navigate from gestures when the user is zooming.\n */\n reader.zoom.state.isZooming\n ) {\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\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 {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\n }\n\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: true,\n }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport { takeUntil, tap } from \"rxjs\"\nimport type { InputSettings, OutputSettings } from \"./types\"\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 zoomMaxScale: Infinity,\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 { name as packageName } from \"../package.json\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport styles from \"./style.css?inline\"\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 removeStylesheet = reader.utils.injectScopedCSS(\n document,\n packageName,\n styles,\n )\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 * Ideally we want pinch to triggers before pan so we can\n * capture zoom before starting panning.\n */\n posThreshold: 10,\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: 20,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n removeStylesheet()\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["switchMap","EMPTY","filter","merge","map","of","isHtmlElement","withLatestFrom","throttleTime","animationFrameScheduler","tap","takeUntil","combineLatest","first","SettingsManager","packageName","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/gestures/pan.ts","../src/gestures/pinch.ts","../src/gestures/swipe.ts","../src/utils.ts","../src/gestures/taps/utils.ts","../src/gestures/taps/registerTaps.ts","../src/SettingsManager.ts","../src/index.ts"],"sourcesContent":["import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { PanRecognizer } from \"gesturx\"\nimport { EMPTY, filter, map, merge, of, switchMap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { Hook } from \"../types\"\n\nexport const registerPan = ({\n reader,\n recognizer,\n settingsManager,\n}: {\n recognizer: PanRecognizer\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const gestures$ = settingsManager.values$.pipe(\n switchMap(({ panNavigation }) => {\n if (panNavigation !== \"pan\") return EMPTY\n\n const panStart$ = recognizer.events$.pipe(\n filter((event) => event.type === `panStart`),\n )\n const panMove$ = recognizer.events$.pipe(\n filter((event) => event.type === `panMove`),\n )\n const panEnd$ = recognizer.events$.pipe(\n filter((event) => event.type === `panEnd`),\n )\n\n const pan$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n /**\n * We use the last cumulative delta to derive the new event atomic delta.\n * This is because panning the zoom does not necessarily means the zoom position\n * will always changes. If the user keep dragging while the zoom is blocked, we want\n * it to move the other direction when he start dragging the other way.\n * We cannot use the `reader.zoom.state.currentPosition` as previous position\n * and the event.deltaX to compute the new zoom position.\n */\n let lastDelta = { x: 0, y: 0 }\n\n const moveAndEnd$ = merge(panMove$, panEnd$).pipe(\n map((event) => {\n const isZooming = reader.zoom.state.isZooming\n const isZoomingIn = reader.zoom.state.currentScale > 1\n\n /**\n * When user is zooming in, we don't navigate anymore.\n * The gestures is gonna be handled by the pinch and viewport.\n */\n if (isZooming && isZoomingIn) {\n const deltaX = event.deltaX - lastDelta.x\n const deltaY = event.deltaY - lastDelta.y\n\n lastDelta = {\n x: event.deltaX,\n y: event.deltaY,\n }\n\n reader.zoom.move(\n {\n x: reader.zoom.state.currentPosition.x + deltaX,\n y: reader.zoom.state.currentPosition.y + deltaY,\n },\n {\n constrain: \"within-viewport\",\n },\n )\n\n return event\n }\n\n if (event.type === `panMove`) {\n if (!reader.navigation.panNavigator.value.isStarted) {\n reader.navigation.panNavigator.start({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n reader.navigation.panNavigator.panMoveTo({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n if (\n event.type === `panEnd` &&\n reader.navigation.panNavigator.value.isStarted\n ) {\n reader.navigation.panNavigator.stop({\n x: event.deltaX,\n y: event.deltaY,\n })\n\n return event\n }\n\n return event\n }),\n )\n\n return merge(of(panStartEvent), moveAndEnd$).pipe(\n map((event) => ({ type: \"pan\" as const, gestureEvent: event })),\n )\n }),\n )\n\n return pan$\n }),\n )\n\n return gestures$\n}\n","import {\n type HookManager,\n isHtmlElement,\n type Reader,\n} from \"@prose-reader/core\"\nimport type { PinchEvent } from \"gesturx\"\nimport {\n animationFrameScheduler,\n EMPTY,\n filter,\n map,\n merge,\n switchMap,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom,\n} from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureRecognizable, Hook } from \"../types\"\n\nconst isHtmlImageElement = (\n target: EventTarget | null,\n): target is HTMLImageElement =>\n isHtmlElement(target) &&\n !!target.ownerDocument.defaultView &&\n target instanceof target.ownerDocument.defaultView.HTMLImageElement\n\nexport const registerPinch = ({\n reader,\n recognizable,\n settingsManager,\n}: {\n recognizable: GestureRecognizable\n reader: Reader\n hookManager: HookManager<Hook>\n settingsManager: GesturesSettingsManager\n}) => {\n const pinchStart$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchStart\"),\n )\n\n const pinchMove$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchMove\"),\n )\n\n const pinchEnd$ = recognizable.events$.pipe(\n map(({ event }) => event),\n filter((event): event is PinchEvent => event.type === \"pinchEnd\"),\n )\n\n const shouldStartZoom = (\n target: EventTarget | null,\n ): target is HTMLImageElement =>\n isHtmlImageElement(target) && !reader.zoom.state.isZooming\n\n return settingsManager.values$.pipe(\n switchMap(({ fontScalePinchEnabled, fontScalePinchThrottleTime }) => {\n const zoomGestures$ = pinchStart$.pipe(\n switchMap(() => {\n const startScale = reader.zoom.state.currentScale\n\n return pinchMove$.pipe(\n withLatestFrom(reader.viewportState$),\n map(([event, viewportState]) => {\n // symmetric scaling calculation\n const newScale = startScale * event.scale\n\n /**\n * @important\n * We don't want to trigger zoom gestures if there is a pan navigation\n * in progress. This can happens if the user start panning and then adds\n * another finger triggering a pinch.\n */\n if (viewportState === \"busy\") {\n return event\n }\n\n if (!reader.zoom.state.isZooming && event.scale > 1) {\n reader.zoom.enter({ animate: false, scale: newScale })\n\n return event\n }\n\n if (reader.zoom.state.isZooming) {\n if (newScale < 1) {\n reader.zoom.exit()\n } else {\n reader.zoom.scaleAt(\n Math.min(newScale, settingsManager.values.zoomMaxScale),\n {\n constrain: \"within-viewport\",\n },\n )\n }\n\n return event\n }\n\n return event\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) => ({\n type: \"pinch\" as const,\n gestureEvent: event,\n })),\n )\n }),\n )\n}\n","import type { HookManager, Reader } from \"@prose-reader/core\"\nimport type { SwipeEvent } from \"gesturx\"\nimport { EMPTY, filter, map, switchMap, tap } from \"rxjs\"\nimport type { GesturesSettingsManager } from \"../SettingsManager\"\nimport type { GestureEvent, GestureRecognizable, Hook } from \"../types\"\n\nconst isSwipeEvent = (event: GestureEvent[\"event\"]): event is SwipeEvent =>\n event.type === \"swipe\"\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 map(({ event }) => event),\n filter(isSwipeEvent),\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) => ({ type: \"swipe\" as const, gestureEvent: event })),\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 (\n computedPageTurnMode === \"scrollable\" ||\n /**\n * We don't want to navigate from gestures when the user is zooming.\n */\n reader.zoom.state.isZooming\n ) {\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\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 {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: false,\n }\n }\n\n return {\n type: \"tap\" as const,\n gestureEvent: event,\n handled: true,\n }\n }),\n )\n }\n }\n\n return EMPTY\n }),\n )\n\n return gestures$\n}\n","import { type Reader, SettingsManager } from \"@prose-reader/core\"\nimport { takeUntil, tap } from \"rxjs\"\nimport type { InputSettings, OutputSettings } from \"./types\"\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 zoomMaxScale: Infinity,\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 { name as packageName } from \"../package.json\"\nimport { registerPan } from \"./gestures/pan\"\nimport { registerPinch } from \"./gestures/pinch\"\nimport { registerSwipe } from \"./gestures/swipe\"\nimport { registerTaps } from \"./gestures/taps/registerTaps\"\nimport { GesturesSettingsManager } from \"./SettingsManager\"\nimport styles from \"./style.css?inline\"\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 removeStylesheet = reader.utils.injectScopedCSS(\n document,\n packageName,\n styles,\n )\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 * Ideally we want pinch to triggers before pan so we can\n * capture zoom before starting panning.\n */\n posThreshold: 10,\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: 20,\n },\n })\n\n const tapRecognizer = new TapRecognizer({\n failWith: [panRecognizer],\n })\n\n const swipeRecognizer = new SwipeRecognizer({\n failWith: [failWithSelection],\n })\n\n const recognizable = new Recognizable({\n recognizers: [\n tapRecognizer,\n panRecognizer,\n swipeRecognizer,\n pinchRecognizer,\n ],\n disableTextSelection: false,\n })\n\n const tapGestures$ = registerTaps({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n recognizer: tapRecognizer,\n })\n\n const panGestures$ = registerPan({\n hookManager,\n reader,\n recognizer: panRecognizer,\n settingsManager,\n })\n\n const swipeGestures$ = registerSwipe({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const pinchGestures$ = registerPinch({\n hookManager,\n reader,\n recognizable,\n settingsManager,\n })\n\n const containerUpdate$ = reader.context.watch(`rootElement`).pipe(\n tap((container) => {\n recognizable.update({\n container,\n })\n }),\n )\n\n const watchSettings$ = combineLatest([\n settingsManager.values$,\n panRecognizer.config$,\n ]).pipe(\n tap(([{ pinchCancelPan }, panRecognizerConfig]) => {\n const pinchAlreadyInFailWith =\n panRecognizerConfig.failWith?.includes(pinchRecognizer)\n\n if (pinchCancelPan && !pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: [\n ...(panRecognizerConfig.failWith ?? []),\n pinchRecognizer,\n ],\n })\n }\n\n if (!pinchCancelPan && pinchAlreadyInFailWith) {\n panRecognizer.update({\n failWith: panRecognizerConfig.failWith?.filter(\n (recognizer) => recognizer !== pinchRecognizer,\n ),\n })\n }\n }),\n )\n\n const gestures$ = merge(\n pinchGestures$,\n tapGestures$,\n swipeGestures$,\n panGestures$,\n ).pipe(share())\n\n merge(containerUpdate$, watchSettings$, gestures$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n removeStylesheet()\n reader.destroy()\n settingsManager.destroy()\n },\n gestures: {\n settings: settingsManager,\n gestures$,\n hooks: hookManager,\n },\n }\n }\n"],"names":["switchMap","EMPTY","filter","merge","map","of","isHtmlElement","withLatestFrom","throttleTime","animationFrameScheduler","tap","takeUntil","combineLatest","first","SettingsManager","packageName","HookManager","PinchRecognizer","PanRecognizer","TapRecognizer","SwipeRecognizer","Recognizable","share"],"mappings":";;;;;AAMO,QAAM,cAAc,CAAC;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAKM;AACJ,UAAM,YAAY,gBAAgB,QAAQ;AAAA,MACxCA,eAAU,CAAC,EAAE,oBAAoB;AAC/B,YAAI,kBAAkB,MAAO,QAAOC,KAAAA;AAEpC,cAAM,YAAY,WAAW,QAAQ;AAAA,UACnCC,KAAAA,OAAO,CAAC,UAAU,MAAM,SAAS,UAAU;AAAA,QAAA;AAE7C,cAAM,WAAW,WAAW,QAAQ;AAAA,UAClCA,KAAAA,OAAO,CAAC,UAAU,MAAM,SAAS,SAAS;AAAA,QAAA;AAE5C,cAAM,UAAU,WAAW,QAAQ;AAAA,UACjCA,KAAAA,OAAO,CAAC,UAAU,MAAM,SAAS,QAAQ;AAAA,QAAA;AAG3C,cAAM,OAAO,UAAU;AAAA,UACrBF,KAAAA,UAAU,CAAC,kBAAkB;AAS3B,gBAAI,YAAY,EAAE,GAAG,GAAG,GAAG,EAAA;AAE3B,kBAAM,cAAcG,KAAAA,MAAM,UAAU,OAAO,EAAE;AAAA,cAC3CC,KAAAA,IAAI,CAAC,UAAU;AACb,sBAAM,YAAY,OAAO,KAAK,MAAM;AACpC,sBAAM,cAAc,OAAO,KAAK,MAAM,eAAe;AAMrD,oBAAI,aAAa,aAAa;AAC5B,wBAAM,SAAS,MAAM,SAAS,UAAU;AACxC,wBAAM,SAAS,MAAM,SAAS,UAAU;AAExC,8BAAY;AAAA,oBACV,GAAG,MAAM;AAAA,oBACT,GAAG,MAAM;AAAA,kBAAA;AAGX,yBAAO,KAAK;AAAA,oBACV;AAAA,sBACE,GAAG,OAAO,KAAK,MAAM,gBAAgB,IAAI;AAAA,sBACzC,GAAG,OAAO,KAAK,MAAM,gBAAgB,IAAI;AAAA,oBAAA;AAAA,oBAE3C;AAAA,sBACE,WAAW;AAAA,oBAAA;AAAA,kBACb;AAGF,yBAAO;AAAA,gBACT;AAEA,oBAAI,MAAM,SAAS,WAAW;AAC5B,sBAAI,CAAC,OAAO,WAAW,aAAa,MAAM,WAAW;AACnD,2BAAO,WAAW,aAAa,MAAM;AAAA,sBACnC,GAAG,MAAM;AAAA,sBACT,GAAG,MAAM;AAAA,oBAAA,CACV;AAED,2BAAO;AAAA,kBACT;AAEA,yBAAO,WAAW,aAAa,UAAU;AAAA,oBACvC,GAAG,MAAM;AAAA,oBACT,GAAG,MAAM;AAAA,kBAAA,CACV;AAED,yBAAO;AAAA,gBACT;AAEA,oBACE,MAAM,SAAS,YACf,OAAO,WAAW,aAAa,MAAM,WACrC;AACA,yBAAO,WAAW,aAAa,KAAK;AAAA,oBAClC,GAAG,MAAM;AAAA,oBACT,GAAG,MAAM;AAAA,kBAAA,CACV;AAED,yBAAO;AAAA,gBACT;AAEA,uBAAO;AAAA,cACT,CAAC;AAAA,YAAA;AAGH,mBAAOD,KAAAA,MAAME,KAAAA,GAAG,aAAa,GAAG,WAAW,EAAE;AAAA,cAC3CD,KAAAA,IAAI,CAAC,WAAW,EAAE,MAAM,OAAgB,cAAc,QAAQ;AAAA,YAAA;AAAA,UAElE,CAAC;AAAA,QAAA;AAGH,eAAO;AAAA,MACT,CAAC;AAAA,IAAA;AAGH,WAAO;AAAA,EACT;ACjGA,QAAM,qBAAqB,CACzB,WAEAE,KAAAA,cAAc,MAAM,KACpB,CAAC,CAAC,OAAO,cAAc,eACvB,kBAAkB,OAAO,cAAc,YAAY;AAE9C,QAAM,gBAAgB,CAAC;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAKM;AACJ,UAAM,cAAc,aAAa,QAAQ;AAAA,MACvCF,KAAAA,IAAI,CAAC,EAAE,MAAA,MAAY,KAAK;AAAA,MACxBF,KAAAA,OAAO,CAAC,UAA+B,MAAM,SAAS,YAAY;AAAA,IAAA;AAGpE,UAAM,aAAa,aAAa,QAAQ;AAAA,MACtCE,KAAAA,IAAI,CAAC,EAAE,MAAA,MAAY,KAAK;AAAA,MACxBF,KAAAA,OAAO,CAAC,UAA+B,MAAM,SAAS,WAAW;AAAA,IAAA;AAGnE,UAAM,YAAY,aAAa,QAAQ;AAAA,MACrCE,KAAAA,IAAI,CAAC,EAAE,MAAA,MAAY,KAAK;AAAA,MACxBF,KAAAA,OAAO,CAAC,UAA+B,MAAM,SAAS,UAAU;AAAA,IAAA;AAGlE,UAAM,kBAAkB,CACtB,WAEA,mBAAmB,MAAM,KAAK,CAAC,OAAO,KAAK,MAAM;AAEnD,WAAO,gBAAgB,QAAQ;AAAA,MAC7BF,KAAAA,UAAU,CAAC,EAAE,uBAAuB,iCAAiC;AACnE,cAAM,gBAAgB,YAAY;AAAA,UAChCA,KAAAA,UAAU,MAAM;AACd,kBAAM,aAAa,OAAO,KAAK,MAAM;AAErC,mBAAO,WAAW;AAAA,cAChBO,KAAAA,eAAe,OAAO,cAAc;AAAA,cACpCH,KAAAA,IAAI,CAAC,CAAC,OAAO,aAAa,MAAM;AAE9B,sBAAM,WAAW,aAAa,MAAM;AAQpC,oBAAI,kBAAkB,QAAQ;AAC5B,yBAAO;AAAA,gBACT;AAEA,oBAAI,CAAC,OAAO,KAAK,MAAM,aAAa,MAAM,QAAQ,GAAG;AACnD,yBAAO,KAAK,MAAM,EAAE,SAAS,OAAO,OAAO,UAAU;AAErD,yBAAO;AAAA,gBACT;AAEA,oBAAI,OAAO,KAAK,MAAM,WAAW;AAC/B,sBAAI,WAAW,GAAG;AAChB,2BAAO,KAAK,KAAA;AAAA,kBACd,OAAO;AACL,2BAAO,KAAK;AAAA,sBACV,KAAK,IAAI,UAAU,gBAAgB,OAAO,YAAY;AAAA,sBACtD;AAAA,wBACE,WAAW;AAAA,sBAAA;AAAA,oBACb;AAAA,kBAEJ;AAEA,yBAAO;AAAA,gBACT;AAEA,uBAAO;AAAA,cACT,CAAC;AAAA,YAAA;AAAA,UAEL,CAAC;AAAA,QAAA;AAGH,cAAM,2BAA2B,CAAC,wBAC9BH,KAAAA,QACA,YAAY;AAAA,UACVM,KAAAA,eAAe,OAAO,cAAc;AAAA,UACpCP,KAAAA,UAAU,CAAC,CAAC,iBAAiB,aAAa,MAAM;AAC9C,gBACE,kBAAkB,UAClB,gBAAgB,gBAAgB,MAAM,MAAM,KAC5C,OAAO,KAAK,MAAM;AAElB,qBAAOC,KAAAA;AAET,kBAAM,4BAA4B,OAAO,SAAS,OAAO;AAEzD,mBAAO,WAAW;AAAA,cAChBO,KAAAA;AAAAA,gBACE;AAAA,gBACAC,KAAAA;AAAAA,gBACA;AAAA,kBACE,UAAU;AAAA,gBAAA;AAAA,cACZ;AAAA,cAEFC,KAAAA,IAAI,CAAC,UAAU;AACb,sBAAM,WAAW,OAAO;AAAA,mBACrB,6BAA6B,MAAM,QAAQ,IAAI,QAAQ,CAAC;AAAA,gBAAA;AAG3D,sBAAM,uBAAuB,KAAK;AAAA,kBAChC,KAAK;AAAA,oBACH;AAAA,oBACA,gBAAgB,OAAO;AAAA,kBAAA;AAAA,kBAEzB,gBAAgB,OAAO;AAAA,gBAAA;AAGzB,uBAAO,SAAS,OAAO;AAAA,kBACrB,WAAW;AAAA,gBAAA,CACZ;AAAA,cACH,CAAC;AAAA,cACDC,KAAAA,UAAU,SAAS;AAAA,YAAA;AAAA,UAEvB,CAAC;AAAA,QAAA;AAGP,eAAOR,WAAM,eAAe,wBAAwB,EAAE;AAAA,UACpDC,KAAAA,IAAI,CAAC,WAAW;AAAA,YACd,MAAM;AAAA,YACN,cAAc;AAAA,UAAA,EACd;AAAA,QAAA;AAAA,MAEN,CAAC;AAAA,IAAA;AAAA,EAEL;ACzJA,QAAM,eAAe,CAAC,UACpB,MAAM,SAAS;AAEV,QAAM,gBAAgB,CAAC;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAKM;AACJ,UAAM,YAAY,gBAAgB,QAAQ;AAAA,MACxCJ,KAAAA;AAAAA,QAAU,CAAC,EAAE,cAAA,MACX,kBAAkB,UACdC,aACA,aAAa,QAAQ;AAAA,UACnBG,KAAAA,IAAI,CAAC,EAAE,MAAA,MAAY,KAAK;AAAA,UACxBF,KAAAA,OAAO,YAAY;AAAA,UACnBQ,KAAAA,IAAI,CAAC,UAAU;AACb,kBAAM,EAAE,0BAAA,IAA8B,OAAO,SAAS;AAEtD,gBAAI,8BAA8B,YAAY;AAC5C,kBAAI,MAAM,YAAY,MAAM;AAC1B,wBAAQ,WAAW,UAAA;AAAA,cACrB;AACA,kBAAI,MAAM,YAAY,KAAK;AACzB,wBAAQ,WAAW,SAAA;AAAA,cACrB;AAAA,YACF,OAAO;AACL,kBAAI,MAAM,YAAY,MAAM;AAC1B,wBAAQ,WAAW,UAAA;AAAA,cACrB;AACA,kBAAI,MAAM,YAAY,KAAK;AACzB,wBAAQ,WAAW,SAAA;AAAA,cACrB;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACDN,KAAAA,IAAI,CAAC,WAAW,EAAE,MAAM,SAAkB,cAAc,QAAQ;AAAA,QAAA;AAAA,MAClE;AAAA,IACN;AAGF,WAAO;AAAA,EACT;AChDO,QAAM,YAAY,CAAC,UAAiC;AACzD,UAAM,SAAS,MAAM,MAAM;AAE3B,QAAIE,KAAAA,cAAc,MAAM,KAAK,OAAO,YAAY,IAAK,QAAO;AAE5D,WAAO;AAAA,EACT;AAEO,QAAM,iCAAiC,CAC5C,OACA,yBACG;AACH,UAAM,EAAE,GAAG,EAAA,IAAM;AACjB,UAAM,EAAE,MAAM,IAAA,IAAQ;AAEtB,WAAO;AAAA,MACL,GAAG,IAAI;AAAA,MACP,GAAG,IAAI;AAAA,IAAA;AAAA,EAEX;AAEO,QAAM,uBAAuB,CAClC,WACA,UACY;AACZ,UAAM,SAAS,MAAM,MAAM;AAE3B,QAAI,CAACA,KAAAA,cAAc,MAAM,EAAG,QAAO;AAEnC,UAAM,QAAQ,UAAU,KAAK,CAAC,aAAa;AAEzC,UAAI,OAAO,QAAQ,QAAQ,EAAG,QAAO;AAGrC,UAAI,OAAO,QAAQ,QAAQ,EAAG,QAAO;AAErC,aAAO;AAAA,IACT,CAAC;AAED,WAAO,CAAC,CAAC;AAAA,EACX;ACzCO,QAAM,mBAAmB,CAC9B,UACA,MACA,kBACY;AACZ,UAAM,EAAE,GAAG,EAAA,IAAM;AACjB,UAAM,EAAE,OAAO,OAAA,IAAW;AAE1B,YAAQ,KAAK,MAAA;AAAA,MACX,KAAK,WAAW;AACd,cAAM,EAAE,KAAK,QAAQ,MAAM,UAAU;AACrC,cAAM,QAAQ,QAAQ,SAAY,IAAI,SAAS,MAAM;AACrD,cAAM,WAAW,WAAW,SAAY,IAAI,UAAU,IAAI,UAAU;AACpE,cAAM,SAAS,SAAS,SAAY,IAAI,QAAQ,OAAO;AACvD,cAAM,UAAU,UAAU,SAAY,IAAI,SAAS,IAAI,SAAS;AAEhE,eACG,QAAQ,UAAa,SACrB,WAAW,UAAa,YACxB,SAAS,UAAa,UACtB,UAAU,UAAa;AAAA,MAE5B;AAAA,MAEA,KAAK,aAAa;AAChB,cAAM;AAAA,UACJ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO;AAAA,QAAA,IACL;AACJ,cAAM,UAAU,SAAS,MAAM,SAAS,QAAQ,OAAO;AACvD,cAAM,UAAU,SAAS,MAAM,UAAU,QAAQ,OAAO;AACxD,cAAM,cAAc,SAAS,MAAM,SAAS,YAAY,OAAO;AAC/D,cAAM,eACJ,SAAS,MAAM,UAAU,aAAa,OAAO;AAE/C,eACE,KAAK,WACL,KAAK,UAAU,eACf,KAAK,WACL,KAAK,UAAU;AAAA,MAEnB;AAAA,MAEA,KAAK,UAAU;AACb,cAAM,EAAE,QAAQ,MAAM,OAAO,QAAQ;AACrC,cAAM,aACJ,SAAS,MAAM,KAAK,IAAI,OAAO,MAAM,KAAK,OAAO,OAAO;AAE1D,gBAAQ,QAAA;AAAA,UACN,KAAK;AACH,mBAAO,IAAI,cAAc,IAAI;AAAA,UAC/B,KAAK;AACH,mBAAO,IAAI,QAAQ,cAAc,IAAI;AAAA,UACvC,KAAK;AACH,mBAAO,IAAI,cAAc,IAAI,SAAS;AAAA,UACxC,KAAK;AACH,mBAAO,IAAI,QAAQ,cAAc,IAAI,SAAS;AAAA,UAChD;AACE,mBAAO;AAAA,QAAA;AAAA,MAEb;AAAA,MAEA,KAAK,UAAU;AACb,cAAM,EAAE,OAAO,aAAa,QAAQ,cAAc,OAAO,QAAQ;AACjE,cAAM,cACJ,SAAS,MAAM,SAAS,cAAc,OAAO;AAC/C,cAAM,eACJ,SAAS,MAAM,UAAU,eAAe,OAAO;AACjD,cAAM,UAAU,QAAQ;AACxB,cAAM,UAAU,SAAS;AAEzB,eACE,KAAK,UAAU,cAAc,KAC7B,KAAK,UAAU,cAAc,KAC7B,KAAK,UAAU,eAAe,KAC9B,KAAK,UAAU,eAAe;AAAA,MAElC;AAAA,MAEA;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEO,QAAM,gCAAgC,CAAC,gBAAgC;AAC5E,UAAM,YAAY;AAClB,UAAM,YAAY;AAClB,UAAM,WAAW;AACjB,UAAM,WAAW;AAEjB,QAAI,eAAe,SAAU,QAAO;AACpC,QAAI,eAAe,SAAU,QAAO;AAGpC,UAAM,SAAS,cAAc,aAAa,WAAW;AACrD,WAAO,YAAY,SAAS,YAAY;AAAA,EAC1C;AChFO,QAAM,eAAe,CAAC;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAMM;AACJ,UAAM,YAAY,aAAa,QAAQ;AAAA,MACrCJ,KAAAA,OAAO,CAAC,UAAU,MAAM,eAAe,UAAU;AAAA,MACjDK,oBAAe,OAAO,QAAQ,MAAM,aAAa,GAAG,OAAO,MAAM,QAAQ;AAAA,MACzEP,KAAAA,UAAU,CAAC,CAAC,EAAE,SAAS,kBAAkB,YAAY,MAAM;AACzD,YAAI,CAAC,oBAAoB,CAAC,aAAc,QAAOC,KAAAA;AAE/C,cAAM,kBAAkB,MAAM;AAC9B,cAAM,EAAE,2BAA2B,qBAAA,IACjC,OAAO,SAAS;AAElB,YACE,MAAM,SAAS,SACf,UAAU,KAAK,KACf,CAAC,qBAAqB,gBAAgB,OAAO,QAAQ,KAAK,GAC1D;AACA,cAAI,OAAO,iBAAiB;AAC1B,kBAAM,uBAAuB,iBAAiB,sBAAA;AAC9C,kBAAM,QAAQ,qBAAqB;AACnC,kBAAM,iBAAiB,8BAA8B,KAAK;AAC1D,kBAAM,sBAAsB;AAAA,cAC1B;AAAA,cACA;AAAA,YAAA;AAGF,kBAAM,gCACJ,OAAO,YAAY;AAAA,cACjB;AAAA,YAAA;AAGJ,kBAAM,oBAAoB,gCACtB,OAAO,MAAM,QAAQ;AAAA,cACnB;AAAA,YAAA,IAEF;AAEJ,kBAAM,oBAAoB,YAAY;AAAA,cACpC;AAAA,cACA;AAAA,cACA,EAAE,QAAQI,KAAAA,GAAG,EAAE,OAAO,MAAM,kBAAA,CAAmB,EAAA;AAAA,YAAE;AAGnD,mBAAOO,KAAAA,cAAc,CAAC,GAAG,mBAAmBP,KAAAA,GAAG,IAAI,CAAC,CAAC,EAAE;AAAA,cACrDQ,WAAA;AAAA,cACAX,YAAO,CAAC,YAAY,CAAC,QAAQ,KAAK,CAAC,WAAW,WAAW,KAAK,CAAC;AAAA,cAC/DE,KAAAA,IAAI,MAAM;AACR,oBACE,yBAAyB;AAAA;AAAA;AAAA,gBAIzB,OAAO,KAAK,MAAM,WAClB;AACA,yBAAO;AAAA,oBACL,MAAM;AAAA,oBACN,cAAc;AAAA,oBACd,SAAS;AAAA,kBAAA;AAAA,gBAEb;AAEA,oBACE,8BAA8B,gBAC9B;AAAA,kBACE;AAAA,kBACA,EAAE,MAAM,WAAW,MAAM,eAAA;AAAA,kBACzB;AAAA,gBAAA,GAEF;AACA,yBAAO,WAAW,cAAA;AAAA,gBACpB,WACE,8BAA8B,cAC9B;AAAA,kBACE;AAAA,kBACA,EAAE,MAAM,WAAW,KAAK,eAAA;AAAA,kBACxB;AAAA,gBAAA,GAEF;AACA,yBAAO,WAAW,cAAA;AAAA,gBACpB,WACE,8BAA8B,cAC9B;AAAA,kBACE;AAAA,kBACA,EAAE,MAAM,WAAW,QAAQ,eAAA;AAAA,kBAC3B;AAAA,gBAAA,GAEF;AACA,yBAAO,WAAW,kBAAA;AAAA,gBACpB,WACE,8BAA8B,gBAC9B;AAAA,kBACE;AAAA,kBACA,EAAE,MAAM,WAAW,OAAO,eAAA;AAAA,kBAC1B;AAAA,gBAAA,GAEF;AACA,yBAAO,WAAW,kBAAA;AAAA,gBACpB,OAAO;AACL,yBAAO;AAAA,oBACL,MAAM;AAAA,oBACN,cAAc;AAAA,oBACd,SAAS;AAAA,kBAAA;AAAA,gBAEb;AAEA,uBAAO;AAAA,kBACL,MAAM;AAAA,kBACN,cAAc;AAAA,kBACd,SAAS;AAAA,gBAAA;AAAA,cAEb,CAAC;AAAA,YAAA;AAAA,UAEL;AAAA,QACF;AAEA,eAAOH,KAAAA;AAAAA,MACT,CAAC;AAAA,IAAA;AAGH,WAAO;AAAA,EACT;AAAA,ECpJO,MAAM,gCAAgCa,KAAAA,gBAG3C;AAAA,IACA,YACE,iBACQ,QACR;AACA,YAAM,eAAe;AAFb,WAAA,SAAA;AAQR,aAAO,SAAS,QACb;AAAA,QACCJ,KAAAA,IAAI,MAAM;AACR,eAAK,OAAO,EAAE;AAAA,QAChB,CAAC;AAAA,QACDC,KAAAA,UAAU,KAAK,QAAQ;AAAA,MAAA,EAExB,UAAA;AAAA,IACL;AAAA,IAhBU;AAAA,IAkBV,kBAAkB,eAA8C;AAC9D,aAAO;AAAA,QACL,GAAG;AAAA,QACH,eACE,KAAK,OAAO,SAAS,OAAO,yBAAyB,eACjD,QACA,cAAc;AAAA,MAAA;AAAA,IAExB;AAAA,IAEA,qBAAoC;AAClC,aAAO;AAAA,QACL,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,uBAAuB;AAAA,QACvB,4BAA4B;AAAA,QAC5B,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,cAAc;AAAA,QACd,QAAQ,CAAA;AAAA,MAAC;AAAA,IAEb;AAAA,EACF;;AC7BO,QAAM,mBACX,CACE,SAEF,CACE,YAGgC;AAChC,UAAM,EAAE,WAAW,CAAA,GAAI,GAAG,SAAS;AACnC,UAAM,SAAS,KAAK,IAAsB;AAE1C,UAAM,mBAAmB,OAAO,MAAM;AAAA,MACpC;AAAA,MACAI;AAAAA,MACA;AAAA,IAAA;AAGF,UAAM,kBAAkB,IAAI,wBAAwB,UAAU,MAAM;AAEpE,UAAM,cAAc,IAAIC,iBAAA;AAExB,UAAM,kBAAkB,IAAIC,wBAAgB;AAAA,MAC1C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMP,cAAc;AAAA,MAAA;AAAA,IAChB,CACD;AAED,UAAM,oBAAoB;AAAA,MACxB,QAAQ,OAAO,UAAU;AAAA,MACzB,MAAM,OAAO,UAAU;AAAA,IAAA;AAGzB,UAAM,gBAAgB,IAAIC,sBAAc;AAAA,MACtC,UAAU,CAAC,iBAAiB,iBAAiB;AAAA,MAC7C,SAAS;AAAA;AAAA,QAEP,cAAc;AAAA,MAAA;AAAA,IAChB,CACD;AAED,UAAM,gBAAgB,IAAIC,sBAAc;AAAA,MACtC,UAAU,CAAC,aAAa;AAAA,IAAA,CACzB;AAED,UAAM,kBAAkB,IAAIC,wBAAgB;AAAA,MAC1C,UAAU,CAAC,iBAAiB;AAAA,IAAA,CAC7B;AAED,UAAM,eAAe,IAAIC,qBAAa;AAAA,MACpC,aAAa;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,sBAAsB;AAAA,IAAA,CACvB;AAED,UAAM,eAAe,aAAa;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IAAA,CACb;AAED,UAAM,eAAe,YAAY;AAAA,MAE/B;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IAAA,CACD;AAED,UAAM,iBAAiB,cAAc;AAAA,MAEnC;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,UAAM,iBAAiB,cAAc;AAAA,MAEnC;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,UAAM,mBAAmB,OAAO,QAAQ,MAAM,aAAa,EAAE;AAAA,MAC3DX,KAAAA,IAAI,CAAC,cAAc;AACjB,qBAAa,OAAO;AAAA,UAClB;AAAA,QAAA,CACD;AAAA,MACH,CAAC;AAAA,IAAA;AAGH,UAAM,iBAAiBE,KAAAA,cAAc;AAAA,MACnC,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAAA,CACf,EAAE;AAAA,MACDF,KAAAA,IAAI,CAAC,CAAC,EAAE,eAAA,GAAkB,mBAAmB,MAAM;AACjD,cAAM,yBACJ,oBAAoB,UAAU,SAAS,eAAe;AAExD,YAAI,kBAAkB,CAAC,wBAAwB;AAC7C,wBAAc,OAAO;AAAA,YACnB,UAAU;AAAA,cACR,GAAI,oBAAoB,YAAY,CAAA;AAAA,cACpC;AAAA,YAAA;AAAA,UACF,CACD;AAAA,QACH;AAEA,YAAI,CAAC,kBAAkB,wBAAwB;AAC7C,wBAAc,OAAO;AAAA,YACnB,UAAU,oBAAoB,UAAU;AAAA,cACtC,CAAC,eAAe,eAAe;AAAA,YAAA;AAAA,UACjC,CACD;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IAAA;AAGH,UAAM,YAAYP,KAAAA;AAAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,KAAKmB,KAAAA,OAAO;AAEdnB,SAAAA,MAAM,kBAAkB,gBAAgB,SAAS,EAC9C,KAAKQ,eAAU,OAAO,EAAE,QAAQ,CAAC,EACjC,UAAA;AAEH,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,MAAM;AACb,yBAAA;AACA,eAAO,QAAA;AACP,wBAAgB,QAAA;AAAA,MAClB;AAAA,MACA,UAAU;AAAA,QACR,UAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,EAEJ;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-gestures",
3
- "version": "1.286.0",
3
+ "version": "1.289.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.286.0"
28
+ "@prose-reader/core": "^1.289.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": "4c9c8de939ecfb290413a593874dc8fd8e0baa12"
38
+ "gitHead": "bad187a76f540ffe0c6dee9496c3a8e3090327dd"
39
39
  }