@meddv/ngx-pinch-zoom
Version:
Pinch zoom component for Angular 20.
1 lines • 94.2 kB
Source Map (JSON)
{"version":3,"file":"meddv-ngx-pinch-zoom.mjs","sources":["../../../projects/ngx-pinch-zoom/src/lib/properties.ts","../../../projects/ngx-pinch-zoom/src/lib/touches.ts","../../../projects/ngx-pinch-zoom/src/lib/ivypinch.ts","../../../projects/ngx-pinch-zoom/src/lib/pinch-zoom.component.ts","../../../projects/ngx-pinch-zoom/src/lib/pinch-zoom.component.html","../../../projects/ngx-pinch-zoom/src/public-api.ts","../../../projects/ngx-pinch-zoom/src/meddv-ngx-pinch-zoom.ts"],"sourcesContent":["import { Properties } from './interfaces';\r\n\r\nexport const defaultProperties: Properties = {\r\n transitionDuration: 200,\r\n doubleTap: true,\r\n doubleTapScale: 2,\r\n limitZoom: 'original image size',\r\n autoZoomOut: false,\r\n zoomControlScale: 1,\r\n minPanScale: 1.0001,\r\n minScale: 0,\r\n listeners: 'mouse and touch',\r\n wheel: true,\r\n wheelZoomFactor: 0.2,\r\n draggableImage: false,\r\n draggableOnPinch: false,\r\n};\r\n\r\nexport const backwardCompatibilityProperties = {\r\n 'transition-duration': 'transitionDuration',\r\n transitionDurationBackwardCompatibility: 'transitionDuration',\r\n 'double-tap': 'doubleTap',\r\n doubleTapBackwardCompatibility: 'doubleTap',\r\n 'double-tap-scale': 'doubleTapScale',\r\n doubleTapScaleBackwardCompatibility: 'doubleTapScale',\r\n 'auto-zoom-out': 'autoZoomOut',\r\n autoZoomOutBackwardCompatibility: 'autoZoomOut',\r\n 'limit-zoom': 'limitZoom',\r\n limitZoomBackwardCompatibility: 'limitZoom',\r\n};\r\n","export interface Properties {\r\n element: HTMLElement;\r\n listeners?: 'auto' | 'mouse and touch';\r\n touchListeners?: TouchListeners;\r\n mouseListeners?: MouseListeners;\r\n otherListeners?: OtherListeners;\r\n resize?: boolean;\r\n}\r\n\r\nexport type EventType =\r\n | undefined\r\n | 'touchstart'\r\n | 'touchend'\r\n | 'touchmove'\r\n | 'mousedown'\r\n | 'mouseup'\r\n | 'mousemove'\r\n | 'pan'\r\n | 'pinch'\r\n | 'horizontal-swipe'\r\n | 'vertical-swipe'\r\n | 'tap'\r\n | 'longtap'\r\n | 'wheel'\r\n | 'double-tap'\r\n | 'resize';\r\nexport type TouchHandler ='handleTouchstart' | 'handleTouchmove' | 'handleTouchend';\r\nexport type MouseHandler = 'handleMousedown' | 'handleMousemove' | 'handleMouseup' | 'handleWheel';\r\nexport type OtherHandler = 'handleResize';\r\n\r\nexport type TouchListeners = Partial<Record<'touchstart' | 'touchmove' | 'touchend', TouchHandler>>;\r\nexport type MouseListeners = Partial<Record<'mousedown' | 'mousemove' | 'mouseup' | 'wheel', MouseHandler>>;\r\nexport type OtherListeners = Partial<Record<'resize', OtherHandler>>;\r\n\r\nexport class Touches {\r\n private properties: Properties;\r\n private element: HTMLElement;\r\n private elementPosition: DOMRect;\r\n private eventType: EventType = undefined;\r\n private handlers: TouchListeners | MouseListeners | OtherListeners = {};\r\n private startX = 0;\r\n private startY = 0;\r\n private lastTap = 0;\r\n private doubleTapTimeout: number;\r\n private doubleTapMinTimeout = 300;\r\n private tapMinTimeout = 200;\r\n private touchstartTime = 0;\r\n private i: number = 0;\r\n private isMousedown = false;\r\n\r\n private _touchListeners: Record<'touchstart' | 'touchmove' | 'touchend', TouchHandler> = {\r\n touchstart: 'handleTouchstart',\r\n touchmove: 'handleTouchmove',\r\n touchend: 'handleTouchend',\r\n };\r\n private _mouseListeners: Record<'mousedown' | 'mousemove' | 'mouseup' | 'wheel', MouseHandler> = {\r\n mousedown: 'handleMousedown',\r\n mousemove: 'handleMousemove',\r\n mouseup: 'handleMouseup',\r\n wheel: 'handleWheel',\r\n };\r\n private _otherListeners: Record<'resize', OtherHandler> = {\r\n resize: 'handleResize',\r\n };\r\n\r\n private get touchListeners(): TouchListeners {\r\n return this.properties.touchListeners ? this.properties.touchListeners : this._touchListeners;\r\n }\r\n\r\n private get mouseListeners(): MouseListeners {\r\n return this.properties.mouseListeners ? this.properties.mouseListeners : this._mouseListeners;\r\n }\r\n\r\n private get otherListeners(): OtherListeners {\r\n return this.properties.otherListeners ? this.properties.otherListeners : this._otherListeners;\r\n }\r\n\r\n constructor(properties: Properties) {\r\n this.properties = properties;\r\n this.element = this.properties.element;\r\n this.elementPosition = this.getElementPosition();\r\n\r\n this.toggleEventListeners('addEventListener');\r\n }\r\n\r\n public destroy(): void {\r\n this.toggleEventListeners('removeEventListener');\r\n }\r\n\r\n private toggleEventListeners(action: 'addEventListener' | 'removeEventListener'): void {\r\n let listeners: TouchListeners | MouseListeners | OtherListeners;\r\n\r\n if (this.properties.listeners === 'mouse and touch') {\r\n listeners = Object.assign(this.touchListeners, this.mouseListeners);\r\n } else {\r\n listeners = this.detectTouchScreen() ? this.touchListeners : this.mouseListeners;\r\n }\r\n\r\n if (this.properties.resize) {\r\n listeners = Object.assign(listeners, this.otherListeners);\r\n }\r\n\r\n for (const listener in listeners) {\r\n const handler = listeners[listener];\r\n\r\n // Window\r\n if (listener === 'resize') {\r\n if (action === 'addEventListener') {\r\n window.addEventListener(listener, this[handler], false);\r\n }\r\n if (action === 'removeEventListener') {\r\n window.removeEventListener(listener, this[handler], false);\r\n }\r\n // Document\r\n } else if (listener === 'mouseup' || listener === 'mousemove') {\r\n if (action === 'addEventListener') {\r\n document.addEventListener(listener, this[handler], false);\r\n }\r\n if (action === 'removeEventListener') {\r\n document.removeEventListener(listener, this[handler], false);\r\n }\r\n // Element\r\n } else {\r\n if (action === 'addEventListener') {\r\n this.element.addEventListener(listener, this[handler], false);\r\n }\r\n if (action === 'removeEventListener') {\r\n this.element.removeEventListener(listener, this[handler], false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public addEventListeners(listener: string): void {\r\n const handler: MouseHandler = this._mouseListeners[listener];\r\n window.addEventListener(listener, this[handler], false);\r\n }\r\n\r\n public removeEventListeners(listener: string): void {\r\n const handler: MouseHandler = this._mouseListeners[listener];\r\n window.removeEventListener(listener, this[handler], false);\r\n }\r\n\r\n /*\r\n * Listeners\r\n */\r\n\r\n /* Touchstart */\r\n\r\n private handleTouchstart = (event: TouchEvent): void => {\r\n this.elementPosition = this.getElementPosition();\r\n this.touchstartTime = new Date().getTime();\r\n\r\n if (this.eventType === undefined) {\r\n this.getTouchstartPosition(event);\r\n }\r\n\r\n this.runHandler('touchstart', event);\r\n };\r\n\r\n /* Touchmove */\r\n\r\n private handleTouchmove = (event: TouchEvent): void => {\r\n const touches = event.touches;\r\n\r\n // Pan\r\n if (this.detectPan(touches)) {\r\n this.runHandler('pan', event);\r\n }\r\n\r\n // Pinch\r\n if (this.detectPinch(event)) {\r\n this.runHandler('pinch', event);\r\n }\r\n };\r\n\r\n private handleLinearSwipe(event: any): void {\r\n //event.preventDefault();\r\n\r\n this.i++;\r\n\r\n if (this.i > 3) {\r\n this.eventType = this.getLinearSwipeType(event);\r\n }\r\n\r\n if (this.eventType === 'horizontal-swipe') {\r\n this.runHandler('horizontal-swipe', event);\r\n }\r\n\r\n if (this.eventType === 'vertical-swipe') {\r\n this.runHandler('vertical-swipe', event);\r\n }\r\n }\r\n\r\n /* Touchend */\r\n\r\n private handleTouchend = (event: TouchEvent): void => {\r\n const touches = event.touches;\r\n\r\n // Double Tap\r\n if (this.detectDoubleTap()) {\r\n this.runHandler('double-tap', event);\r\n }\r\n\r\n // Tap\r\n this.detectTap();\r\n\r\n this.runHandler('touchend', event);\r\n this.eventType = 'touchend';\r\n\r\n if (touches && touches.length === 0) {\r\n this.eventType = undefined;\r\n this.i = 0;\r\n }\r\n };\r\n\r\n /* Mousedown */\r\n\r\n private handleMousedown = (event: MouseEvent): void => {\r\n this.isMousedown = true;\r\n this.elementPosition = this.getElementPosition();\r\n this.touchstartTime = new Date().getTime();\r\n\r\n if (this.eventType === undefined) {\r\n this.getMousedownPosition(event);\r\n }\r\n\r\n this.runHandler('mousedown', event);\r\n };\r\n\r\n /* Mousemove */\r\n\r\n private handleMousemove = (event: MouseEvent): void => {\r\n //event.preventDefault();\r\n\r\n if (!this.isMousedown) {\r\n return;\r\n }\r\n\r\n // Pan\r\n this.runHandler('pan', event);\r\n\r\n // Linear swipe\r\n switch (this.detectLinearSwipe(event)) {\r\n case 'horizontal-swipe':\r\n // FIXME: looks like an error\r\n // @ts-ignore\r\n event.swipeType = 'horizontal-swipe';\r\n this.runHandler('horizontal-swipe', event);\r\n break;\r\n case 'vertical-swipe':\r\n // FIXME: looks like an error\r\n // @ts-ignore\r\n event.swipeType = 'vertical-swipe';\r\n this.runHandler('vertical-swipe', event);\r\n break;\r\n }\r\n\r\n // Linear swipe\r\n if (\r\n this.detectLinearSwipe(event) ||\r\n this.eventType === 'horizontal-swipe' ||\r\n this.eventType === 'vertical-swipe'\r\n ) {\r\n this.handleLinearSwipe(event);\r\n }\r\n };\r\n\r\n /* Mouseup */\r\n\r\n private handleMouseup = (event: MouseEvent): void => {\r\n // Tap\r\n this.detectTap();\r\n\r\n this.isMousedown = false;\r\n this.runHandler('mouseup', event);\r\n this.eventType = undefined;\r\n this.i = 0;\r\n };\r\n\r\n /* Wheel */\r\n\r\n private handleWheel = (event: WheelEvent): void => {\r\n this.runHandler('wheel', event);\r\n };\r\n\r\n /* Resize */\r\n\r\n private handleResize = (event: Event): void => {\r\n this.runHandler('resize', event);\r\n };\r\n\r\n private runHandler(eventName: EventType, event: unknown):void {\r\n if (this.handlers[eventName]) {\r\n this.handlers[eventName](event);\r\n }\r\n }\r\n\r\n /*\r\n * Detection\r\n */\r\n\r\n private detectPan(touches: TouchList): boolean {\r\n return (touches.length === 1 && !this.eventType) || this.eventType === 'pan';\r\n }\r\n\r\n private detectDoubleTap(): boolean {\r\n if (this.eventType != undefined) {\r\n return;\r\n }\r\n\r\n const currentTime = new Date().getTime();\r\n const tapLength = currentTime - this.lastTap;\r\n\r\n window.clearTimeout(this.doubleTapTimeout);\r\n\r\n if (tapLength < this.doubleTapMinTimeout && tapLength > 0) {\r\n return true;\r\n } else {\r\n this.doubleTapTimeout = window.setTimeout(() => {\r\n window.clearTimeout(this.doubleTapTimeout);\r\n }, this.doubleTapMinTimeout);\r\n }\r\n this.lastTap = currentTime;\r\n\r\n return undefined;\r\n }\r\n\r\n private detectTap(): void {\r\n if (this.eventType != undefined) {\r\n return;\r\n }\r\n\r\n const currentTime = new Date().getTime();\r\n const tapLength = currentTime - this.touchstartTime;\r\n\r\n if (tapLength > 0) {\r\n if (tapLength < this.tapMinTimeout) {\r\n this.runHandler('tap', {});\r\n } else {\r\n this.runHandler('longtap', {});\r\n }\r\n }\r\n }\r\n\r\n private detectPinch(event: TouchEvent): boolean {\r\n const touches = event.touches;\r\n return (touches.length === 2 && this.eventType === undefined) || this.eventType === 'pinch';\r\n }\r\n\r\n private detectLinearSwipe(event: MouseEvent | TouchEvent): 'vertical-swipe' | 'horizontal-swipe' {\r\n const touches = (event as TouchEvent).touches;\r\n\r\n if (touches) {\r\n if (\r\n (touches.length === 1 && !this.eventType) ||\r\n this.eventType === 'horizontal-swipe' ||\r\n this.eventType === 'vertical-swipe'\r\n ) {\r\n return this.getLinearSwipeType(event);\r\n }\r\n } else {\r\n if (!this.eventType || this.eventType === 'horizontal-swipe' || this.eventType === 'vertical-swipe') {\r\n return this.getLinearSwipeType(event);\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private getLinearSwipeType(event: TouchEvent | MouseEvent): 'vertical-swipe' | 'horizontal-swipe' {\r\n if (this.eventType !== 'horizontal-swipe' && this.eventType !== 'vertical-swipe') {\r\n const movementX = Math.abs(this.moveLeft(0, event) - this.startX);\r\n const movementY = Math.abs(this.moveTop(0, event) - this.startY);\r\n\r\n if (movementY * 3 > movementX) {\r\n return 'vertical-swipe';\r\n } else {\r\n return 'horizontal-swipe';\r\n }\r\n } else {\r\n return this.eventType;\r\n }\r\n }\r\n\r\n private getElementPosition(): DOMRect {\r\n return this.element.getBoundingClientRect();\r\n }\r\n\r\n private getTouchstartPosition(event: TouchEvent): void {\r\n this.startX = event.touches[0].clientX - this.elementPosition.left;\r\n this.startY = event.touches[0].clientY - this.elementPosition.top;\r\n }\r\n\r\n private getMousedownPosition(event: MouseEvent): void {\r\n this.startX = event.clientX - this.elementPosition.left;\r\n this.startY = event.clientY - this.elementPosition.top;\r\n }\r\n\r\n private moveLeft(index: number, event: TouchEvent | MouseEvent): number {\r\n const touches = (event as TouchEvent).touches;\r\n\r\n if (touches) {\r\n return touches[index].clientX - this.elementPosition.left;\r\n } else {\r\n return (event as MouseEvent).clientX - this.elementPosition.left;\r\n }\r\n }\r\n\r\n private moveTop(index: number, event: TouchEvent | MouseEvent): number {\r\n const touches = (event as TouchEvent).touches;\r\n\r\n if (touches) {\r\n return touches[index].clientY - this.elementPosition.top;\r\n } else {\r\n return (event as MouseEvent).clientY - this.elementPosition.top;\r\n }\r\n }\r\n\r\n private detectTouchScreen(): boolean {\r\n const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\r\n const mq = (query: string): boolean => {\r\n return window.matchMedia(query).matches;\r\n };\r\n\r\n if ('ontouchstart' in window) {\r\n return true;\r\n }\r\n\r\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\r\n // https://git.io/vznFH\r\n const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\r\n return mq(query);\r\n }\r\n\r\n /* Public properties and methods */\r\n public on(event: EventType, handler: (event: Event) => void): void {\r\n if (event) {\r\n this.handlers[event] = handler;\r\n }\r\n }\r\n}\r\n","import { EventType, Touches } from './touches';\r\nimport { Properties } from './interfaces';\r\nimport { defaultProperties } from './properties';\r\nimport {EventEmitter} from \"@angular/core\";\r\n\r\nexport class IvyPinch {\r\n private readonly properties: Properties = defaultProperties;\r\n private touches: Touches;\r\n private readonly element: HTMLElement;\r\n private readonly elementTarget: string;\r\n private parentElement: HTMLElement;\r\n public scale: number = 1;\r\n private initialScale: number = 1;\r\n private elementPosition: DOMRect;\r\n private eventType: EventType;\r\n private startX: number = 0;\r\n private startY: number = 0;\r\n private moveX: number = 0;\r\n private moveY: number = 0;\r\n private initialMoveX: number = 0;\r\n private initialMoveY: number = 0;\r\n private moveXC: number = 0;\r\n private moveYC: number = 0;\r\n private distance: number = 0;\r\n private initialDistance: number = 0;\r\n public maxScale!: number;\r\n private defaultMaxScale: number = 3;\r\n private initialPinchCenterX = 0;\r\n private initialPinchCenterY = 0;\r\n private zoomChanged: EventEmitter<number>;\r\n\r\n // Minimum scale at which panning works\r\n get minPanScale(): number {\r\n return this.getPropertiesValue('minPanScale');\r\n }\r\n\r\n get fullImage(): { path: string; minScale?: number } {\r\n return this.properties.fullImage;\r\n }\r\n\r\n constructor(properties: Properties, zoomChanged: EventEmitter<number>) {\r\n this.element = properties.element;\r\n this.zoomChanged = zoomChanged;\r\n\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (typeof properties.limitZoom === 'number') {\r\n this.maxScale = properties.limitZoom;\r\n }\r\n this.elementTarget = this.element.querySelector('*').tagName;\r\n this.parentElement = this.element.parentElement;\r\n this.properties = Object.assign({}, defaultProperties, properties);\r\n this.detectLimitZoom();\r\n\r\n this.touches = new Touches({\r\n element: properties.element,\r\n listeners: properties.listeners,\r\n resize: properties.autoHeight,\r\n mouseListeners: {\r\n mousedown: 'handleMousedown',\r\n mouseup: 'handleMouseup',\r\n wheel: 'handleWheel',\r\n },\r\n });\r\n\r\n /* Init */\r\n this.setBasicStyles();\r\n\r\n /*\r\n * Listeners\r\n */\r\n\r\n this.touches.on('touchstart', this.handleTouchstart);\r\n this.touches.on('touchend', this.handleTouchend);\r\n this.touches.on('mousedown', this.handleTouchstart);\r\n this.touches.on('mouseup', this.handleTouchend);\r\n this.touches.on('pan', this.handlePan);\r\n this.touches.on('mousemove', this.handlePan);\r\n this.touches.on('pinch', this.handlePinch);\r\n\r\n if (this.properties.wheel) {\r\n this.touches.on('wheel', this.handleWheel);\r\n }\r\n\r\n if (this.properties.doubleTap) {\r\n this.touches.on('double-tap', this.handleDoubleTap);\r\n }\r\n\r\n if (this.properties.autoHeight) {\r\n this.touches.on('resize', this.handleResize);\r\n }\r\n }\r\n\r\n /* Touchstart */\r\n\r\n private handleTouchstart = (event: TouchEvent | MouseEvent): void => {\r\n this.touches.addEventListeners('mousemove');\r\n this.getElementPosition();\r\n\r\n if (this.eventType === undefined) {\r\n this.getTouchstartPosition(event);\r\n }\r\n };\r\n\r\n /* Touchend */\r\n\r\n private handleTouchend = (event: TouchEvent | MouseEvent): void => {\r\n /* touchend */\r\n if (event.type === 'touchend') {\r\n const touches = (event as TouchEvent).touches;\r\n\r\n // Min scale\r\n if (this.scale < 1) {\r\n this.scale = 1;\r\n this.zoomChanged.emit(this.scale);\r\n }\r\n\r\n // Auto Zoom Out\r\n if (this.properties.autoZoomOut && this.eventType === 'pinch') {\r\n this.scale = 1;\r\n this.zoomChanged.emit(this.scale);\r\n }\r\n\r\n // Align image\r\n if (this.eventType === 'pinch' || (this.eventType === 'pan' && this.scale > this.minPanScale)) {\r\n this.alignImage();\r\n }\r\n\r\n // Update initial values\r\n if (\r\n this.eventType === 'pinch' ||\r\n this.eventType === 'pan' ||\r\n this.eventType === 'horizontal-swipe' ||\r\n this.eventType === 'vertical-swipe'\r\n ) {\r\n this.updateInitialValues();\r\n }\r\n\r\n this.eventType = 'touchend';\r\n\r\n if (touches && touches.length === 0) {\r\n this.eventType = undefined;\r\n }\r\n }\r\n\r\n /* mouseup */\r\n if (event.type === 'mouseup') {\r\n this.updateInitialValues();\r\n this.eventType = undefined;\r\n }\r\n\r\n this.touches.removeEventListeners('mousemove');\r\n };\r\n\r\n /*\r\n * Handlers\r\n */\r\n\r\n private handlePan = (event: TouchEvent | MouseEvent): void => {\r\n if (this.scale < this.minPanScale || this.properties.disablePan) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const { clientX, clientY } = this.getClientPosition(event);\r\n\r\n if (!this.eventType) {\r\n this.startX = clientX - this.elementPosition.left;\r\n this.startY = clientY - this.elementPosition.top;\r\n }\r\n\r\n this.eventType = 'pan';\r\n this.moveX = this.initialMoveX + (this.moveLeft(event, 0) - this.startX);\r\n this.moveY = this.initialMoveY + (this.moveTop(event, 0) - this.startY);\r\n\r\n if (this.properties.limitPan) {\r\n this.limitPanY();\r\n this.limitPanX();\r\n }\r\n\r\n /* mousemove */\r\n if (event.type === 'mousemove' && this.scale > this.minPanScale) {\r\n this.centeringImage();\r\n }\r\n\r\n this.transformElement(0);\r\n };\r\n\r\n private handleDoubleTap = (event: TouchEvent): void => {\r\n this.toggleZoom(event);\r\n return;\r\n };\r\n\r\n private handlePinch = (event: TouchEvent): void => {\r\n event.preventDefault();\r\n\r\n if (!this.properties.draggableOnPinch) {\r\n if (this.eventType === undefined || this.eventType === 'pinch') {\r\n const touches = event.touches;\r\n\r\n if (!this.eventType) {\r\n this.initialDistance = this.getDistance(touches);\r\n\r\n const moveLeft0 = this.moveLeft(event, 0);\r\n const moveLeft1 = this.moveLeft(event, 1);\r\n const moveTop0 = this.moveTop(event, 0);\r\n const moveTop1 = this.moveTop(event, 1);\r\n\r\n this.moveXC = (moveLeft0 + moveLeft1) / 2 - this.initialMoveX;\r\n this.moveYC = (moveTop0 + moveTop1) / 2 - this.initialMoveY;\r\n }\r\n\r\n this.eventType = 'pinch';\r\n this.distance = this.getDistance(touches);\r\n this.scale = this.initialScale * (this.distance / this.initialDistance);\r\n this.zoomChanged.emit(this.scale);\r\n this.moveX = this.initialMoveX - ((this.distance / this.initialDistance) * this.moveXC - this.moveXC);\r\n this.moveY = this.initialMoveY - ((this.distance / this.initialDistance) * this.moveYC - this.moveYC);\r\n\r\n this.handleLimitZoom();\r\n\r\n if (this.properties.limitPan) {\r\n this.limitPanY();\r\n this.limitPanX();\r\n }\r\n\r\n this.transformElement(0);\r\n }\r\n\r\n return;\r\n }\r\n\r\n const touches = event.touches;\r\n\r\n if (!this.eventType) {\r\n this.eventType = 'pinch';\r\n this.initialDistance = this.getDistance(touches);\r\n const lx0 = this.moveLeft(event, 0),\r\n lx1 = this.moveLeft(event, 1),\r\n ty0 = this.moveTop(event, 0),\r\n ty1 = this.moveTop(event, 1);\r\n this.initialPinchCenterX = (lx0 + lx1) / 2;\r\n this.initialPinchCenterY = (ty0 + ty1) / 2;\r\n this.moveXC = this.initialPinchCenterX - this.initialMoveX;\r\n this.moveYC = this.initialPinchCenterY - this.initialMoveY;\r\n }\r\n\r\n this.eventType = 'pinch';\r\n this.distance = this.getDistance(touches);\r\n const scaleRatio = this.distance / this.initialDistance;\r\n this.scale = this.initialScale * scaleRatio;\r\n this.zoomChanged.emit(this.scale);\r\n\r\n const curLX0 = this.moveLeft(event, 0),\r\n curLX1 = this.moveLeft(event, 1),\r\n curTY0 = this.moveTop(event, 0),\r\n curTY1 = this.moveTop(event, 1);\r\n const currentCenterX = (curLX0 + curLX1) / 2;\r\n const currentCenterY = (curTY0 + curTY1) / 2;\r\n\r\n const deltaX = currentCenterX - this.initialPinchCenterX;\r\n const deltaY = currentCenterY - this.initialPinchCenterY;\r\n const scaleTransX = (scaleRatio - 1) * this.moveXC;\r\n const scaleTransY = (scaleRatio - 1) * this.moveYC;\r\n\r\n this.moveX = this.initialMoveX + deltaX - scaleTransX;\r\n this.moveY = this.initialMoveY + deltaY - scaleTransY;\r\n\r\n this.handleLimitZoom();\r\n if (this.properties.limitPan) {\r\n this.limitPanY();\r\n this.limitPanX();\r\n }\r\n this.transformElement(0);\r\n };\r\n\r\n private handleWheel = (event: WheelEvent): void => {\r\n event.preventDefault();\r\n\r\n const wheelZoomFactor = this.properties.wheelZoomFactor || 0;\r\n const zoomFactor = event.deltaY < 0 ? wheelZoomFactor : -wheelZoomFactor;\r\n let newScale = this.initialScale + zoomFactor;\r\n\r\n /* Round value */\r\n if (newScale < 1 + wheelZoomFactor) {\r\n newScale = 1;\r\n } else if (newScale < this.maxScale && newScale > this.maxScale - wheelZoomFactor) {\r\n newScale = this.maxScale;\r\n }\r\n\r\n if (newScale < 1 || newScale > this.maxScale) {\r\n return;\r\n }\r\n\r\n if (newScale === this.scale) {\r\n return;\r\n }\r\n\r\n this.getElementPosition();\r\n this.scale = newScale;\r\n this.zoomChanged.emit(this.scale);\r\n\r\n\r\n /* Get cursor position over image */\r\n const xCenter = event.clientX - this.elementPosition.left - this.initialMoveX;\r\n const yCenter = event.clientY - this.elementPosition.top - this.initialMoveY;\r\n\r\n this.setZoom({\r\n scale: newScale,\r\n center: [xCenter, yCenter],\r\n });\r\n };\r\n\r\n private handleResize = (_event: Event): void => {\r\n this.setAutoHeight();\r\n };\r\n\r\n private handleLimitZoom(): void {\r\n const limitZoom = this.maxScale;\r\n const minScale = this.properties.minScale || 0;\r\n\r\n if (this.scale > limitZoom || this.scale <= minScale) {\r\n const imageWidth = this.getImageWidth();\r\n const imageHeight = this.getImageHeight();\r\n const enlargedImageWidth = imageWidth * this.scale;\r\n const enlargedImageHeight = imageHeight * this.scale;\r\n const moveXRatio = this.moveX / (enlargedImageWidth - imageWidth);\r\n const moveYRatio = this.moveY / (enlargedImageHeight - imageHeight);\r\n\r\n if (this.scale > limitZoom) {\r\n this.scale = limitZoom;\r\n this.zoomChanged.emit(this.scale);\r\n }\r\n\r\n if (this.scale <= minScale) {\r\n this.scale = minScale;\r\n this.zoomChanged.emit(this.scale);\r\n }\r\n\r\n const newImageWidth = imageWidth * this.scale;\r\n const newImageHeight = imageHeight * this.scale;\r\n\r\n this.moveX = -Math.abs(moveXRatio * (newImageWidth - imageWidth));\r\n this.moveY = -Math.abs(-moveYRatio * (newImageHeight - imageHeight));\r\n }\r\n }\r\n\r\n private moveLeft(event: TouchEvent | MouseEvent, index: number = 0): number {\r\n const clientX = this.getClientPosition(event, index).clientX;\r\n return clientX - this.elementPosition.left;\r\n }\r\n\r\n private moveTop(event: TouchEvent | MouseEvent, index: number = 0): number {\r\n const clientY = this.getClientPosition(event, index).clientY;\r\n return clientY - this.elementPosition.top;\r\n }\r\n\r\n /*\r\n * Detection\r\n */\r\n\r\n private centeringImage(): boolean {\r\n const img = this.getImageElement();\r\n const initialMoveX = this.moveX;\r\n const initialMoveY = this.moveY;\r\n\r\n if (this.moveY > 0) {\r\n this.moveY = 0;\r\n }\r\n if (this.moveX > 0) {\r\n this.moveX = 0;\r\n }\r\n\r\n if (img) {\r\n this.limitPanY();\r\n this.limitPanX();\r\n }\r\n if (img && this.scale < 1) {\r\n if (this.moveX < this.element.offsetWidth * (1 - this.scale)) {\r\n this.moveX = this.element.offsetWidth * (1 - this.scale);\r\n }\r\n }\r\n\r\n return initialMoveX !== this.moveX || initialMoveY !== this.moveY;\r\n }\r\n\r\n private limitPanY(): void {\r\n const imgHeight = this.getImageHeight();\r\n const scaledImgHeight = imgHeight * this.scale;\r\n const parentHeight = this.parentElement.offsetHeight;\r\n const elementHeight = this.element.offsetHeight;\r\n\r\n if (scaledImgHeight < parentHeight) {\r\n this.moveY = (parentHeight - elementHeight * this.scale) / 2;\r\n } else {\r\n const imgOffsetTop = ((imgHeight - elementHeight) * this.scale) / 2;\r\n\r\n if (this.moveY > imgOffsetTop) {\r\n this.moveY = imgOffsetTop;\r\n } else if (scaledImgHeight + Math.abs(imgOffsetTop) - parentHeight + this.moveY < 0) {\r\n this.moveY = -(scaledImgHeight + Math.abs(imgOffsetTop) - parentHeight);\r\n }\r\n }\r\n }\r\n\r\n private limitPanX(): void {\r\n const imgWidth = this.getImageWidth();\r\n const scaledImgWidth = imgWidth * this.scale;\r\n const parentWidth = this.parentElement.offsetWidth;\r\n const elementWidth = this.element.offsetWidth;\r\n\r\n if (scaledImgWidth < parentWidth) {\r\n this.moveX = (parentWidth - elementWidth * this.scale) / 2;\r\n } else {\r\n const imgOffsetLeft = ((imgWidth - elementWidth) * this.scale) / 2;\r\n\r\n if (this.moveX > imgOffsetLeft) {\r\n this.moveX = imgOffsetLeft;\r\n } else if (scaledImgWidth + Math.abs(imgOffsetLeft) - parentWidth + this.moveX < 0) {\r\n this.moveX = -(imgWidth * this.scale + Math.abs(imgOffsetLeft) - parentWidth);\r\n }\r\n }\r\n }\r\n\r\n private setBasicStyles(): void {\r\n this.element.style.display = 'flex';\r\n this.element.style.alignItems = 'center';\r\n this.element.style.justifyContent = 'center';\r\n this.element.style.transformOrigin = '0 0';\r\n this.setImageSize();\r\n this.setDraggableImage();\r\n }\r\n\r\n private removeBasicStyles(): void {\r\n this.element.style.display = '';\r\n this.element.style.alignItems = '';\r\n this.element.style.justifyContent = '';\r\n this.element.style.transformOrigin = '';\r\n this.removeImageSize();\r\n this.removeDraggableImage();\r\n }\r\n\r\n private setDraggableImage(): void {\r\n const imgElement = this.getImageElement();\r\n\r\n if (imgElement) {\r\n imgElement.draggable = this.properties.draggableImage;\r\n }\r\n }\r\n\r\n private removeDraggableImage(): void {\r\n const imgElement = this.getImageElement();\r\n\r\n if (imgElement) {\r\n imgElement.draggable = true;\r\n }\r\n }\r\n\r\n private setImageSize(): void {\r\n const imgElement = this.getImageElements();\r\n\r\n if (imgElement.length) {\r\n imgElement[0].style.maxWidth = '100%';\r\n imgElement[0].style.maxHeight = '100%';\r\n\r\n this.setAutoHeight();\r\n }\r\n }\r\n\r\n private setAutoHeight(): void {\r\n const imgElement = this.getImageElements();\r\n\r\n if (!this.properties.autoHeight || !imgElement.length) {\r\n return;\r\n }\r\n\r\n const imgNaturalWidth = imgElement[0].getAttribute('width');\r\n const imgNaturalHeight = imgElement[0].getAttribute('height');\r\n const sizeRatio = +imgNaturalWidth / +imgNaturalHeight;\r\n const parentWidth = this.parentElement.offsetWidth;\r\n\r\n imgElement[0].style.maxHeight = parentWidth / sizeRatio + 'px';\r\n }\r\n\r\n private removeImageSize(): void {\r\n const imgElement = this.getImageElements();\r\n\r\n if (imgElement.length) {\r\n imgElement[0].style.maxWidth = '';\r\n imgElement[0].style.maxHeight = '';\r\n }\r\n }\r\n\r\n private getElementPosition(): void {\r\n this.elementPosition = this.element.parentElement.getBoundingClientRect();\r\n }\r\n\r\n private getTouchstartPosition(event: TouchEvent | MouseEvent): void {\r\n const { clientX, clientY } = this.getClientPosition(event);\r\n\r\n this.startX = clientX - this.elementPosition.left;\r\n this.startY = clientY - this.elementPosition.top;\r\n }\r\n\r\n private getClientPosition(event: TouchEvent | MouseEvent, index: number = 0): { clientX: number; clientY: number } {\r\n let clientX: number;\r\n let clientY: number;\r\n\r\n if (event.type === 'touchstart' || event.type === 'touchmove') {\r\n clientX = (event as TouchEvent).touches[index].clientX;\r\n clientY = (event as TouchEvent).touches[index].clientY;\r\n }\r\n if (event.type === 'mousedown' || event.type === 'mousemove') {\r\n clientX = (event as MouseEvent).clientX;\r\n clientY = (event as MouseEvent).clientY;\r\n }\r\n\r\n return {\r\n clientX,\r\n clientY,\r\n };\r\n }\r\n\r\n private resetScale(): void {\r\n this.scale = 1;\r\n this.zoomChanged.emit(this.scale);\r\n this.moveX = 0;\r\n this.moveY = 0;\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n }\r\n\r\n private updateInitialValues(): void {\r\n this.initialScale = this.scale;\r\n this.initialMoveX = this.moveX;\r\n this.initialMoveY = this.moveY;\r\n }\r\n\r\n private getDistance(touches: TouchList): number {\r\n return Math.sqrt(\r\n Math.pow(touches[0].pageX - touches[1].pageX, 2) + Math.pow(touches[0].pageY - touches[1].pageY, 2),\r\n );\r\n }\r\n\r\n private getImageHeight(): number {\r\n const img = this.getImageElement() as HTMLImageElement;\r\n return img.offsetHeight;\r\n }\r\n\r\n private getImageWidth(): number {\r\n const img = this.getImageElement() as HTMLImageElement;\r\n return img.offsetWidth;\r\n }\r\n\r\n private transformElement(duration: number): void {\r\n this.element.style.transition = 'all ' + duration + 'ms';\r\n this.element.style.transform =\r\n 'matrix(' +\r\n Number(this.scale) +\r\n ', 0, 0, ' +\r\n Number(this.scale) +\r\n ', ' +\r\n Number(this.moveX) +\r\n ', ' +\r\n Number(this.moveY) +\r\n ')';\r\n }\r\n\r\n private isTouchScreen(): boolean {\r\n const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\r\n\r\n if ('ontouchstart' in window) {\r\n return true;\r\n }\r\n\r\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\r\n // https://git.io/vznFH\r\n const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\r\n return this.getMatchMedia(query);\r\n }\r\n\r\n private getMatchMedia(query: string): boolean {\r\n return window.matchMedia(query).matches;\r\n }\r\n\r\n public isDragging(): boolean {\r\n if (this.properties.disablePan) {\r\n return false;\r\n }\r\n\r\n const imgHeight = this.getImageHeight();\r\n const imgWidth = this.getImageWidth();\r\n\r\n if (this.scale > 1) {\r\n return (\r\n imgHeight * this.scale > this.parentElement.offsetHeight ||\r\n imgWidth * this.scale > this.parentElement.offsetWidth\r\n );\r\n }\r\n if (this.scale === 1) {\r\n return imgHeight > this.parentElement.offsetHeight || imgWidth > this.parentElement.offsetWidth;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public detectLimitZoom(): void {\r\n // Assign to default only if it is not passed through constructor\r\n this.maxScale ??= this.defaultMaxScale;\r\n\r\n if (this.properties.limitZoom === 'original image size' && this.elementTarget === 'IMG') {\r\n // We are waiting for the element with the image to be available\r\n this.pollLimitZoomForOriginalImage();\r\n }\r\n }\r\n\r\n private pollLimitZoomForOriginalImage(): void {\r\n const poll = setInterval(() => {\r\n const maxScaleForOriginalImage = this.getMaxScaleForOriginalImage();\r\n if (typeof maxScaleForOriginalImage === 'number') {\r\n this.maxScale = maxScaleForOriginalImage;\r\n clearInterval(poll);\r\n }\r\n }, 10);\r\n }\r\n\r\n private getMaxScaleForOriginalImage(): number {\r\n let maxScale!: number;\r\n const img = this.element.getElementsByTagName('img')[0];\r\n\r\n if (img.naturalWidth && img.offsetWidth) {\r\n maxScale = img.naturalWidth / img.offsetWidth;\r\n }\r\n\r\n return maxScale;\r\n }\r\n\r\n private getImageElement(): HTMLElement {\r\n const imgElement = this.element.getElementsByTagName(this.elementTarget);\r\n\r\n if (imgElement.length) {\r\n return imgElement[0] as HTMLElement;\r\n }\r\n }\r\n\r\n private getImageElements(): HTMLCollectionOf<HTMLElement> {\r\n return this.element.getElementsByTagName(this.elementTarget) as HTMLCollectionOf<HTMLElement>;\r\n }\r\n\r\n public toggleZoom(event: TouchEvent | boolean = false): void {\r\n if (this.initialScale === 1) {\r\n if (event && (event as TouchEvent).changedTouches) {\r\n if (this.properties.doubleTapScale === undefined) {\r\n return;\r\n }\r\n\r\n const changedTouches = (event as TouchEvent).changedTouches;\r\n this.scale = this.initialScale * this.properties.doubleTapScale;\r\n this.zoomChanged.emit(this.scale);\r\n this.moveX =\r\n this.initialMoveX -\r\n (changedTouches[0].clientX - this.elementPosition.left) * (this.properties.doubleTapScale - 1);\r\n this.moveY =\r\n this.initialMoveY -\r\n (changedTouches[0].clientY - this.elementPosition.top) * (this.properties.doubleTapScale - 1);\r\n } else {\r\n const zoomControlScale = this.properties.zoomControlScale || 0;\r\n this.scale = this.initialScale * (zoomControlScale + 1);\r\n this.zoomChanged.emit(this.scale);\r\n this.moveX = this.initialMoveX - (this.element.offsetWidth * (this.scale - 1)) / 2;\r\n this.moveY = this.initialMoveY - (this.element.offsetHeight * (this.scale - 1)) / 2;\r\n }\r\n\r\n this.centeringImage();\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n } else {\r\n this.resetScale();\r\n }\r\n }\r\n\r\n public zoomIn(value: number): number {\r\n const scale = this.scale + value;\r\n\r\n if (scale >= this.maxScale) {\r\n this.scale = this.maxScale;\r\n this.zoomChanged.emit(this.scale);\r\n\r\n return this.scale;\r\n }\r\n\r\n this.setZoom({ scale });\r\n\r\n return this.scale;\r\n }\r\n\r\n public zoomOut(value: number): number {\r\n const scale = this.scale - value;\r\n\r\n if (scale <= this.properties.minScale) {\r\n this.scale = this.properties.minScale;\r\n this.zoomChanged.emit(this.scale);\r\n\r\n return this.scale;\r\n }\r\n\r\n this.setZoom({ scale });\r\n\r\n return this.scale;\r\n }\r\n\r\n private setZoom(properties: { scale: number; center?: number[] }): void {\r\n this.scale = properties.scale;\r\n this.zoomChanged.emit(this.scale);\r\n let xCenter;\r\n let yCenter;\r\n const visibleAreaWidth = this.element.offsetWidth;\r\n const visibleAreaHeight = this.element.offsetHeight;\r\n const scalingPercent = (visibleAreaWidth * this.scale) / (visibleAreaWidth * this.initialScale);\r\n\r\n if (properties.center) {\r\n xCenter = properties.center[0];\r\n yCenter = properties.center[1];\r\n } else {\r\n xCenter = visibleAreaWidth / 2 - this.initialMoveX;\r\n yCenter = visibleAreaHeight / 2 - this.initialMoveY;\r\n }\r\n\r\n this.moveX = this.initialMoveX - (scalingPercent * xCenter - xCenter);\r\n this.moveY = this.initialMoveY - (scalingPercent * yCenter - yCenter);\r\n\r\n this.centeringImage();\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n }\r\n\r\n private alignImage(): void {\r\n const isMoveChanged = this.centeringImage();\r\n\r\n if (isMoveChanged) {\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this.removeBasicStyles();\r\n this.touches.destroy();\r\n }\r\n\r\n private getPropertiesValue<K extends keyof Properties>(propertyName: K): Properties[K] {\r\n if (this.properties && this.properties[propertyName]) {\r\n return this.properties[propertyName];\r\n } else {\r\n return defaultProperties[propertyName];\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit, Output,\r\n SimpleChanges\r\n} from '@angular/core';\r\n\r\nimport { Properties } from './interfaces';\r\nimport { defaultProperties, backwardCompatibilityProperties } from './properties';\r\nimport { IvyPinch } from './ivypinch';\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\ninterface ComponentProperties extends Properties {\r\n disabled?: boolean;\r\n overflow?: 'hidden' | 'visible';\r\n disableZoomControl?: 'disable' | 'never' | 'auto';\r\n backgroundColor?: string;\r\n}\r\n\r\nexport const _defaultComponentProperties: ComponentProperties = {\r\n overflow: 'hidden',\r\n disableZoomControl: 'auto',\r\n backgroundColor: 'rgba(0,0,0,0.85)',\r\n};\r\n\r\n@Component({\r\n selector: 'pinch-zoom, [pinch-zoom]',\r\n exportAs: 'pinchZoom',\r\n templateUrl: './pinch-zoom.component.html',\r\n styleUrls: ['./pinch-zoom.component.sass'],\r\n standalone: true,\r\n imports: [CommonModule]\r\n})\r\nexport class PinchZoomComponent implements OnInit, OnDestroy, OnChanges {\r\n private pinchZoom: IvyPinch;\r\n private _properties!: ComponentProperties;\r\n private readonly defaultComponentProperties!: ComponentProperties;\r\n private _transitionDuration!: number;\r\n private _doubleTap!: boolean;\r\n private _doubleTapScale!: number;\r\n private _autoZoomOut!: boolean;\r\n private _limitZoom!: number | 'original image size';\r\n\r\n @Input('properties') set properties(value: ComponentProperties) {\r\n if (value) {\r\n this._properties = value;\r\n }\r\n }\r\n\r\n get properties(): ComponentProperties {\r\n return this._properties;\r\n }\r\n\r\n // transitionDuration\r\n @Input('transition-duration') set transitionDurationBackwardCompatibility(value: number) {\r\n if (value) {\r\n this._transitionDuration = value;\r\n }\r\n }\r\n\r\n @Input('transitionDuration') set transitionDuration(value: number) {\r\n if (value) {\r\n this._transitionDuration = value;\r\n }\r\n }\r\n\r\n get transitionDuration(): number {\r\n return this._transitionDuration;\r\n }\r\n\r\n // doubleTap\r\n @Input('double-tap') set doubleTapBackwardCompatibility(value: boolean) {\r\n if (value) {\r\n this._doubleTap = value;\r\n }\r\n }\r\n\r\n @Input('doubleTap') set doubleTap(value: boolean) {\r\n if (value) {\r\n this._doubleTap = value;\r\n }\r\n }\r\n\r\n get doubleTap(): boolean {\r\n return this._doubleTap;\r\n }\r\n\r\n // doubleTapScale\r\n @Input('double-tap-scale') set doubleTapScaleBackwardCompatibility(value: number) {\r\n if (value) {\r\n this._doubleTapScale = value;\r\n }\r\n }\r\n\r\n @Input('doubleTapScale') set doubleTapScale(value: number) {\r\n if (value) {\r\n this._doubleTapScale = value;\r\n }\r\n }\r\n\r\n get doubleTapScale(): number {\r\n return this._doubleTapScale;\r\n }\r\n\r\n // autoZoomOut\r\n @Input('auto-zoom-out') set autoZoomOutBackwardCompatibility(value: boolean) {\r\n if (value) {\r\n this._autoZoomOut = value;\r\n }\r\n }\r\n\r\n @Input('autoZoomOut') set autoZoomOut(value: boolean) {\r\n if (value) {\r\n this._autoZoomOut = value;\r\n }\r\n }\r\n\r\n get autoZoomOut(): boolean {\r\n return this._autoZoomOut;\r\n }\r\n\r\n // limitZoom\r\n @Input('limit-zoom') set limitZoomBackwardCompatibility(value: number | 'original image size') {\r\n if (value) {\r\n this._limitZoom = value;\r\n }\r\n }\r\n\r\n @Input('limitZoom') set limitZoom(value: number | 'original image size') {\r\n if (value) {\r\n this._limitZoom = value;\r\n }\r\n }\r\n\r\n get limitZoom(): number | 'original image size' {\r\n return this._limitZoom;\r\n }\r\n\r\n @Input() disabled!: boolean;\r\n @Input() disablePan!: boolean;\r\n @Input() overflow!: 'hidden' | 'visible';\r\n @Input() zoomControlScale!: number;\r\n @Input() disableZoomControl!: 'disable' | 'never' | 'auto';\r\n @Input() backgroundColor!: string;\r\n @Input() limitPan!: boolean;\r\n @Input() minPanScale!: number;\r\n @Input() minScale!: number;\r\n @Input() listeners!: 'auto' | 'mouse and touch';\r\n @Input() wheel!: boolean;\r\n @Input() autoHeight!: boolean;\r\n @Input() wheelZoomFactor!: number;\r\n @Input() draggableImage!: boolean;\r\n @Input() draggableOnPinch!: boolean;\r\n @Output() public zoomChanged: EventEmitter<number> = new EventEmitter<number>();\r\n\r\n @HostBinding('style.overflow')\r\n get hostOverflow(): 'hidden' | 'visible' {\r\n return this.properties['overflow'];\r\n }\r\n\r\n @HostBinding('style.background-color')\r\n get hostBackgroundColor(): string {\r\n return this.properties['backgroundColor'];\r\n }\r\n\r\n get isTouchScreen(): boolean {\r\n const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\r\n const mq = (query: string): boolean => {\r\n return window.matchMedia(query).matches;\r\n };\r\n\r\n if ('ontouchstart' in window) {\r\n return true;\r\n }\r\n\r\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\r\n // https://git.io/vznFH\r\n const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\r\n return mq(query);\r\n }\r\n\r\n get isDragging(): boolean {\r\n return this.pinchZoom?.isDragging();\r\n }\r\n\r\n get isDisabled(): boolean {\r\n return this._properties.disabled;\r\n }\r\n\r\n get scale(): number {\r\n return this.pinchZoom.scale;\r\n }\r\n\r\n get isZoomedIn(): boolean {\r\n return this.scale > 1;\r\n }\r\n\r\n get scaleLevel(): number {\r\n return Math.round(this.scale / this._zoomControlScale);\r\n }\r\n\r\n get maxScale(): number {\r\n return this.pinchZoom.maxScale;\r\n }\r\n\r\n get isZoomLimitReached(): boolean {\r\n return this.scale >= this.maxScale;\r\n }\r\n\r\n get _zoomControlScale(): number {\r\n return this.getPropertiesValue('zoomControlScale');\r\n }\r\n\r\n constructor(private elementRef: ElementRef<HTMLElement>) {\r\n this.defaultComponentProperties = this.getDefaultComponentProperties();\r\n this.applyPropertiesDefault(this.defaultComponentProperties, {});\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initPinchZoom();\r\n\r\n /* Calls the method until the image size is available */\r\n this.detectLimitZoom();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n let changedProperties = this.getProperties(changes);\r\n changedProperties = this.renameProperties(changedProperties);\r\n\r\n this.applyPropertiesDefault(this.defaultComponentProperties, changedProperties);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n private initPinchZoom(): void {\r\n if (this._properties.disabled) {\r\n return;\r\n }\r\n\r\n this._properties.limitZoom = this.limitZoom;\r\n this._properties.element = this.elementRef.nativeElement.querySelector('.pinch-zoom-content');\r\n this.pinchZoom = new IvyPinch(this.properties, this.zoomChanged);\r\n }\r\n\r\n private getProperties(\r\n changes: SimpleChanges,\r\n ): ComponentProperties | Record<keyof typeof backwardCompatibilityProperties, unknown> {\r\n let properties: ComponentProperties = {};\r\n\r\n for (const prop in changes) {\r\n if (prop !== 'properties') {\r\n properties[prop] = changes[prop].currentValue;\r\n }\r\n if (prop === 'properties') {\r\n properties = changes[prop].currentValue;\r\n }\r\n }\r\n return properties;\r\n }\r\n\r\n private renameProperties(\r\n properties: ComponentProperties | Record<keyof typeof backwardCompatibilityProperties, unknown>,\r\n ): ComponentProperties {\r\n for (const prop in properties) {\r\n if (backwardCompatibilityProperties[prop]) {\r\n properties[backwardCompatibilityProperties[prop]] = properties[prop];\r\n delete properties[prop];\r\n }\r\n }\r\n\r\n return properties as ComponentProperties;\r\n }\r\n\r\n private applyPropertiesDefault(defaultProperties: ComponentProperties, properties: ComponentProperties): void {\r\n this.properties = Object.assign({}, defaultProperties, properties);\r\n }\r\n\r\n toggleZoom(): void {\r\n this.pinchZoom?.toggleZoom();\r\n }\r\n\r\n zoomIn(value: number): number {\r\n return this.pinchZoom?.zoomIn(value);\r\n }\r\n\r\n zoomOut(value: number): number {\r\n return this.pinchZoom?.zoomOut(value);\r\n }\r\n\r\n isControl(): boolean {\r\n if (this.isDisabled) {\r\n return false;\r\n }\r\n\r\n if (this._properties.disableZoomControl === 'disable') {\r\n return false;\r\n }\r\n\r\n if (this.isTouchScreen && this._properties.disableZoomControl === 'auto') {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n detectLimitZoom(): void {\r\n this.pinchZoom?.detectLimitZoom();\r\n }\r\n\r\n destroy(): void {\r\n this.pinchZoom?.destroy();\r\n }\r\n\r\n private getPropertiesValue<K extends keyof ComponentProperties>(propertyName: K): ComponentProperties[K] {\r\n if (this.properties && this.properties[propertyName]) {\r\n return this.properties[propertyName];\r\n } else {\r\n return this.defaultComponentProperties[propertyName];\r\n }\r\n }\r\n\r\n private getDefaultComponentProperties(): ComponentProperties {\r\n return { ...defaultProperties, ..._defaultComponentProperties };\r\n }\r\n}\r\n","<div class=\"pinch-zoom-content\" [class.pz-dragging]=\"isDragging\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<!-- Control: one button -->\r\n@if (isControl()) {\r\n <div\r\n class=\"pz-zoom-button pz-zoom-control-position-bottom\"\r\n [class.pz-zoom-button-out]=\"isZoomedIn\"\r\n (click)=\"toggleZoom()\"\r\n ></div>\r\n}\r\n","/*\r\n * Public API Surface of ngx-pinch-zoom\r\n */\r\n\r\nexport * from './lib/interfaces';\r\nexport * from './lib/pinch-zoom.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}