UNPKG

54.3 kBSource Map (JSON)View Raw
1{"version":3,"file":"angular-resizable-element.js","sources":["../../../projects/angular-resizable-element/src/lib/util/is-touch-device.ts","../../../projects/angular-resizable-element/src/lib/util/clone-node.ts","../../../projects/angular-resizable-element/src/lib/resizable.directive.ts","../../../projects/angular-resizable-element/src/lib/resize-handle.directive.ts","../../../projects/angular-resizable-element/src/lib/resizable.module.ts","../../../projects/angular-resizable-element/src/public-api.ts","../../../projects/angular-resizable-element/src/angular-resizable-element.ts"],"sourcesContent":["/**\n * @hidden\n */\nexport const IS_TOUCH_DEVICE: boolean = (() => {\n // In case we're in Node.js environment.\n if (typeof window === 'undefined') {\n return false;\n } else {\n return (\n 'ontouchstart' in window ||\n navigator.maxTouchPoints > 0 ||\n navigator.msMaxTouchPoints > 0\n );\n }\n})();\n","/** Creates a deep clone of an element. */\nexport function deepCloneNode(node: HTMLElement): HTMLElement {\n const clone = node.cloneNode(true) as HTMLElement;\n const descendantsWithId = clone.querySelectorAll('[id]');\n const nodeName = node.nodeName.toLowerCase();\n\n // Remove the `id` to avoid having multiple elements with the same id on the page.\n clone.removeAttribute('id');\n\n descendantsWithId.forEach((descendant) => {\n descendant.removeAttribute('id');\n });\n\n if (nodeName === 'canvas') {\n transferCanvasData(node as HTMLCanvasElement, clone as HTMLCanvasElement);\n } else if (\n nodeName === 'input' ||\n nodeName === 'select' ||\n nodeName === 'textarea'\n ) {\n transferInputData(node as HTMLInputElement, clone as HTMLInputElement);\n }\n\n transferData('canvas', node, clone, transferCanvasData);\n transferData('input, textarea, select', node, clone, transferInputData);\n return clone;\n}\n\n/** Matches elements between an element and its clone and allows for their data to be cloned. */\nfunction transferData<T extends Element>(\n selector: string,\n node: HTMLElement,\n clone: HTMLElement,\n callback: (source: T, clone: T) => void\n) {\n const descendantElements = node.querySelectorAll<T>(selector);\n\n if (descendantElements.length) {\n const cloneElements = clone.querySelectorAll<T>(selector);\n\n for (let i = 0; i < descendantElements.length; i++) {\n callback(descendantElements[i], cloneElements[i]);\n }\n }\n}\n\n// Counter for unique cloned radio button names.\nlet cloneUniqueId = 0;\n\n/** Transfers the data of one input element to another. */\nfunction transferInputData(\n source: Element & { value: string },\n clone: Element & { value: string; name: string; type: string }\n) {\n // Browsers throw an error when assigning the value of a file input programmatically.\n if (clone.type !== 'file') {\n clone.value = source.value;\n }\n\n // Radio button `name` attributes must be unique for radio button groups\n // otherwise original radio buttons can lose their checked state\n // once the clone is inserted in the DOM.\n if (clone.type === 'radio' && clone.name) {\n clone.name = `mat-clone-${clone.name}-${cloneUniqueId++}`;\n }\n}\n\n/** Transfers the data of one canvas element to another. */\nfunction transferCanvasData(\n source: HTMLCanvasElement,\n clone: HTMLCanvasElement\n) {\n const context = clone.getContext('2d');\n\n if (context) {\n // In some cases `drawImage` can throw (e.g. if the canvas size is 0x0).\n // We can't do much about it so just ignore the error.\n try {\n context.drawImage(source, 0, 0);\n } catch {}\n }\n}\n","import {\n Directive,\n Renderer2,\n ElementRef,\n OnInit,\n Output,\n Input,\n EventEmitter,\n OnDestroy,\n NgZone,\n Inject,\n PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Subject, Observable, Observer, merge } from 'rxjs';\nimport {\n map,\n mergeMap,\n takeUntil,\n filter,\n pairwise,\n take,\n share,\n tap,\n} from 'rxjs/operators';\nimport { Edges } from './interfaces/edges.interface';\nimport { BoundingRectangle } from './interfaces/bounding-rectangle.interface';\nimport { ResizeEvent } from './interfaces/resize-event.interface';\nimport { IS_TOUCH_DEVICE } from './util/is-touch-device';\nimport { deepCloneNode } from './util/clone-node';\n\ninterface PointerEventCoordinate {\n clientX: number;\n clientY: number;\n event: MouseEvent | TouchEvent;\n}\n\ninterface Coordinate {\n x: number;\n y: number;\n}\n\nfunction getNewBoundingRectangle(\n startingRect: BoundingRectangle,\n edges: Edges,\n clientX: number,\n clientY: number\n): BoundingRectangle {\n const newBoundingRect: BoundingRectangle = {\n top: startingRect.top,\n bottom: startingRect.bottom,\n left: startingRect.left,\n right: startingRect.right,\n };\n\n if (edges.top) {\n newBoundingRect.top += clientY;\n }\n if (edges.bottom) {\n newBoundingRect.bottom += clientY;\n }\n if (edges.left) {\n newBoundingRect.left += clientX;\n }\n if (edges.right) {\n newBoundingRect.right += clientX;\n }\n newBoundingRect.height = newBoundingRect.bottom - newBoundingRect.top;\n newBoundingRect.width = newBoundingRect.right - newBoundingRect.left;\n\n return newBoundingRect;\n}\n\nfunction getElementRect(\n element: ElementRef,\n ghostElementPositioning: string\n): BoundingRectangle {\n let translateX = 0;\n let translateY = 0;\n const style = element.nativeElement.style;\n const transformProperties = [\n 'transform',\n '-ms-transform',\n '-moz-transform',\n '-o-transform',\n ];\n const transform = transformProperties\n .map((property) => style[property])\n .find((value) => !!value);\n if (transform && transform.includes('translate')) {\n translateX = transform.replace(\n /.*translate3?d?\\((-?[0-9]*)px, (-?[0-9]*)px.*/,\n '$1'\n );\n translateY = transform.replace(\n /.*translate3?d?\\((-?[0-9]*)px, (-?[0-9]*)px.*/,\n '$2'\n );\n }\n\n if (ghostElementPositioning === 'absolute') {\n return {\n height: element.nativeElement.offsetHeight,\n width: element.nativeElement.offsetWidth,\n top: element.nativeElement.offsetTop - translateY,\n bottom:\n element.nativeElement.offsetHeight +\n element.nativeElement.offsetTop -\n translateY,\n left: element.nativeElement.offsetLeft - translateX,\n right:\n element.nativeElement.offsetWidth +\n element.nativeElement.offsetLeft -\n translateX,\n };\n } else {\n const boundingRect: BoundingRectangle =\n element.nativeElement.getBoundingClientRect();\n return {\n height: boundingRect.height,\n width: boundingRect.width,\n top: boundingRect.top - translateY,\n bottom: boundingRect.bottom - translateY,\n left: boundingRect.left - translateX,\n right: boundingRect.right - translateX,\n scrollTop: element.nativeElement.scrollTop,\n scrollLeft: element.nativeElement.scrollLeft,\n };\n }\n}\n\nexport interface ResizeCursors {\n topLeft: string;\n topRight: string;\n bottomLeft: string;\n bottomRight: string;\n leftOrRight: string;\n topOrBottom: string;\n}\n\nconst DEFAULT_RESIZE_CURSORS: ResizeCursors = Object.freeze({\n topLeft: 'nw-resize',\n topRight: 'ne-resize',\n bottomLeft: 'sw-resize',\n bottomRight: 'se-resize',\n leftOrRight: 'col-resize',\n topOrBottom: 'row-resize',\n});\n\nfunction getResizeCursor(edges: Edges, cursors: ResizeCursors): string {\n if (edges.left && edges.top) {\n return cursors.topLeft;\n } else if (edges.right && edges.top) {\n return cursors.topRight;\n } else if (edges.left && edges.bottom) {\n return cursors.bottomLeft;\n } else if (edges.right && edges.bottom) {\n return cursors.bottomRight;\n } else if (edges.left || edges.right) {\n return cursors.leftOrRight;\n } else if (edges.top || edges.bottom) {\n return cursors.topOrBottom;\n } else {\n return '';\n }\n}\n\nfunction getEdgesDiff({\n edges,\n initialRectangle,\n newRectangle,\n}: {\n edges: Edges;\n initialRectangle: BoundingRectangle;\n newRectangle: BoundingRectangle;\n}): Edges {\n const edgesDiff: Edges = {};\n Object.keys(edges).forEach((edge) => {\n edgesDiff[edge] = (newRectangle[edge] || 0) - (initialRectangle[edge] || 0);\n });\n return edgesDiff;\n}\n\nconst RESIZE_ACTIVE_CLASS: string = 'resize-active';\nconst RESIZE_GHOST_ELEMENT_CLASS: string = 'resize-ghost-element';\n\nexport const MOUSE_MOVE_THROTTLE_MS: number = 50;\n\n/**\n * Place this on an element to make it resizable. For example:\n *\n * ```html\n * <div\n * mwlResizable\n * [resizeEdges]=\"{bottom: true, right: true, top: true, left: true}\"\n * [enableGhostResize]=\"true\">\n * </div>\n * ```\n * Or in case they are sibling elements:\n * ```html\n * <div mwlResizable #resizableElement=\"mwlResizable\"></div>\n * <div mwlResizeHandle [resizableContainer]=\"resizableElement\" [resizeEdges]=\"{bottom: true, right: true}\"></div>\n * ```\n */\n@Directive({\n selector: '[mwlResizable]',\n exportAs: 'mwlResizable',\n})\nexport class ResizableDirective implements OnInit, OnDestroy {\n /**\n * A function that will be called before each resize event. Return `true` to allow the resize event to propagate or `false` to cancel it\n */\n @Input() validateResize: (resizeEvent: ResizeEvent) => boolean;\n\n /**\n * Set to `true` to enable a temporary resizing effect of the element in between the `resizeStart` and `resizeEnd` events.\n */\n @Input() enableGhostResize: boolean = false;\n\n /**\n * A snap grid that resize events will be locked to.\n *\n * e.g. to only allow the element to be resized every 10px set it to `{left: 10, right: 10}`\n */\n @Input() resizeSnapGrid: Edges = {};\n\n /**\n * The mouse cursors that will be set on the resize edges\n */\n @Input() resizeCursors: ResizeCursors = DEFAULT_RESIZE_CURSORS;\n\n /**\n * Define the positioning of the ghost element (can be fixed or absolute)\n */\n @Input() ghostElementPositioning: 'fixed' | 'absolute' = 'fixed';\n\n /**\n * Allow elements to be resized to negative dimensions\n */\n @Input() allowNegativeResizes: boolean = false;\n\n /**\n * The mouse move throttle in milliseconds, default: 50 ms\n */\n @Input() mouseMoveThrottleMS: number = MOUSE_MOVE_THROTTLE_MS;\n\n /**\n * Called when the mouse is pressed and a resize event is about to begin. `$event` is a `ResizeEvent` object.\n */\n @Output() resizeStart = new EventEmitter<ResizeEvent>();\n\n /**\n * Called as the mouse is dragged after a resize event has begun. `$event` is a `ResizeEvent` object.\n */\n @Output() resizing = new EventEmitter<ResizeEvent>();\n\n /**\n * Called after the mouse is released after a resize event. `$event` is a `ResizeEvent` object.\n */\n @Output() resizeEnd = new EventEmitter<ResizeEvent>();\n\n /**\n * @hidden\n */\n public mouseup = new Subject<{\n clientX: number;\n clientY: number;\n edges?: Edges;\n }>();\n\n /**\n * @hidden\n */\n public mousedown = new Subject<{\n clientX: number;\n clientY: number;\n edges?: Edges;\n }>();\n\n /**\n * @hidden\n */\n public mousemove = new Subject<{\n clientX: number;\n clientY: number;\n edges?: Edges;\n event: MouseEvent | TouchEvent;\n }>();\n\n private pointerEventListeners: PointerEventListeners;\n\n private destroy$ = new Subject<void>();\n\n /**\n * @hidden\n */\n constructor(\n @Inject(PLATFORM_ID) private platformId: any,\n private renderer: Renderer2,\n public elm: ElementRef,\n private zone: NgZone\n ) {\n this.pointerEventListeners = PointerEventListeners.getInstance(\n renderer,\n zone\n );\n }\n\n /**\n * @hidden\n */\n ngOnInit(): void {\n const mousedown$: Observable<{\n clientX: number;\n clientY: number;\n edges?: Edges;\n }> = merge(this.pointerEventListeners.pointerDown, this.mousedown);\n\n const mousemove$ = merge(\n this.pointerEventListeners.pointerMove,\n this.mousemove\n ).pipe(\n tap(({ event }) => {\n if (currentResize) {\n try {\n event.preventDefault();\n } catch (e) {\n // just adding try-catch not to see errors in console if there is a passive listener for same event somewhere\n // browser does nothing except of writing errors to console\n }\n }\n }),\n share()\n );\n\n const mouseup$ = merge(this.pointerEventListeners.pointerUp, this.mouseup);\n\n let currentResize: {\n edges: Edges;\n startingRect: BoundingRectangle;\n currentRect: BoundingRectangle;\n clonedNode?: HTMLElement;\n } | null;\n\n const removeGhostElement = () => {\n if (currentResize && currentResize.clonedNode) {\n this.elm.nativeElement.parentElement.removeChild(\n currentResize.clonedNode\n );\n this.renderer.setStyle(this.elm.nativeElement, 'visibility', 'inherit');\n }\n };\n\n const getResizeCursors = (): ResizeCursors => {\n return {\n ...DEFAULT_RESIZE_CURSORS,\n ...this.resizeCursors,\n };\n };\n\n const mousedrag: Observable<any> = mousedown$\n .pipe(\n mergeMap((startCoords) => {\n function getDiff(moveCoords: { clientX: number; clientY: number }) {\n return {\n clientX: moveCoords.clientX - startCoords.clientX,\n clientY: moveCoords.clientY - startCoords.clientY,\n };\n }\n\n const getSnapGrid = () => {\n const snapGrid: Coordinate = { x: 1, y: 1 };\n\n if (currentResize) {\n if (this.resizeSnapGrid.left && currentResize.edges.left) {\n snapGrid.x = +this.resizeSnapGrid.left;\n } else if (\n this.resizeSnapGrid.right &&\n currentResize.edges.right\n ) {\n snapGrid.x = +this.resizeSnapGrid.right;\n }\n\n if (this.resizeSnapGrid.top && currentResize.edges.top) {\n snapGrid.y = +this.resizeSnapGrid.top;\n } else if (\n this.resizeSnapGrid.bottom &&\n currentResize.edges.bottom\n ) {\n snapGrid.y = +this.resizeSnapGrid.bottom;\n }\n }\n\n return snapGrid;\n };\n\n function getGrid(\n coords: { clientX: number; clientY: number },\n snapGrid: Coordinate\n ) {\n return {\n x: Math.ceil(coords.clientX / snapGrid.x),\n y: Math.ceil(coords.clientY / snapGrid.y),\n };\n }\n\n return (\n merge(\n mousemove$.pipe(take(1)).pipe(map((coords) => [, coords])),\n mousemove$.pipe(pairwise())\n ) as Observable<\n [\n { clientX: number; clientY: number },\n { clientX: number; clientY: number }\n ]\n >\n )\n .pipe(\n map(([previousCoords, newCoords]) => {\n return [\n previousCoords ? getDiff(previousCoords) : previousCoords,\n getDiff(newCoords),\n ];\n })\n )\n .pipe(\n filter(([previousCoords, newCoords]) => {\n if (!previousCoords) {\n return true;\n }\n\n const snapGrid: Coordinate = getSnapGrid();\n const previousGrid: Coordinate = getGrid(\n previousCoords,\n snapGrid\n );\n const newGrid: Coordinate = getGrid(newCoords, snapGrid);\n\n return (\n previousGrid.x !== newGrid.x || previousGrid.y !== newGrid.y\n );\n })\n )\n .pipe(\n map(([, newCoords]) => {\n const snapGrid: Coordinate = getSnapGrid();\n return {\n clientX:\n Math.round(newCoords.clientX / snapGrid.x) * snapGrid.x,\n clientY:\n Math.round(newCoords.clientY / snapGrid.y) * snapGrid.y,\n };\n })\n )\n .pipe(takeUntil(merge(mouseup$, mousedown$)));\n })\n )\n .pipe(filter(() => !!currentResize));\n\n mousedrag\n .pipe(\n map(({ clientX, clientY }) => {\n return getNewBoundingRectangle(\n currentResize!.startingRect,\n currentResize!.edges,\n clientX,\n clientY\n );\n })\n )\n .pipe(\n filter((newBoundingRect: BoundingRectangle) => {\n return (\n this.allowNegativeResizes ||\n !!(\n newBoundingRect.height &&\n newBoundingRect.width &&\n newBoundingRect.height > 0 &&\n newBoundingRect.width > 0\n )\n );\n })\n )\n .pipe(\n filter((newBoundingRect: BoundingRectangle) => {\n return this.validateResize\n ? this.validateResize({\n rectangle: newBoundingRect,\n edges: getEdgesDiff({\n edges: currentResize!.edges,\n initialRectangle: currentResize!.startingRect,\n newRectangle: newBoundingRect,\n }),\n })\n : true;\n }),\n takeUntil(this.destroy$)\n )\n .subscribe((newBoundingRect: BoundingRectangle) => {\n if (currentResize && currentResize.clonedNode) {\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'height',\n `${newBoundingRect.height}px`\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'width',\n `${newBoundingRect.width}px`\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'top',\n `${newBoundingRect.top}px`\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'left',\n `${newBoundingRect.left}px`\n );\n }\n\n if (this.resizing.observers.length > 0) {\n this.zone.run(() => {\n this.resizing.emit({\n edges: getEdgesDiff({\n edges: currentResize!.edges,\n initialRectangle: currentResize!.startingRect,\n newRectangle: newBoundingRect,\n }),\n rectangle: newBoundingRect,\n });\n });\n }\n currentResize!.currentRect = newBoundingRect;\n });\n\n mousedown$\n .pipe(\n map(({ edges }) => {\n return edges || {};\n }),\n filter((edges: Edges) => {\n return Object.keys(edges).length > 0;\n }),\n takeUntil(this.destroy$)\n )\n .subscribe((edges: Edges) => {\n if (currentResize) {\n removeGhostElement();\n }\n const startingRect: BoundingRectangle = getElementRect(\n this.elm,\n this.ghostElementPositioning\n );\n currentResize = {\n edges,\n startingRect,\n currentRect: startingRect,\n };\n const resizeCursors = getResizeCursors();\n const cursor = getResizeCursor(currentResize.edges, resizeCursors);\n this.renderer.setStyle(document.body, 'cursor', cursor);\n this.setElementClass(this.elm, RESIZE_ACTIVE_CLASS, true);\n if (this.enableGhostResize) {\n currentResize.clonedNode = deepCloneNode(this.elm.nativeElement);\n this.elm.nativeElement.parentElement.appendChild(\n currentResize.clonedNode\n );\n this.renderer.setStyle(\n this.elm.nativeElement,\n 'visibility',\n 'hidden'\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'position',\n this.ghostElementPositioning\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'left',\n `${currentResize.startingRect.left}px`\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'top',\n `${currentResize.startingRect.top}px`\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'height',\n `${currentResize.startingRect.height}px`\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'width',\n `${currentResize.startingRect.width}px`\n );\n this.renderer.setStyle(\n currentResize.clonedNode,\n 'cursor',\n getResizeCursor(currentResize.edges, resizeCursors)\n );\n this.renderer.addClass(\n currentResize.clonedNode,\n RESIZE_GHOST_ELEMENT_CLASS\n );\n currentResize.clonedNode!.scrollTop = currentResize.startingRect\n .scrollTop as number;\n currentResize.clonedNode!.scrollLeft = currentResize.startingRect\n .scrollLeft as number;\n }\n if (this.resizeStart.observers.length > 0) {\n this.zone.run(() => {\n this.resizeStart.emit({\n edges: getEdgesDiff({\n edges,\n initialRectangle: startingRect,\n newRectangle: startingRect,\n }),\n rectangle: getNewBoundingRectangle(startingRect, {}, 0, 0),\n });\n });\n }\n });\n\n mouseup$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n if (currentResize) {\n this.renderer.removeClass(this.elm.nativeElement, RESIZE_ACTIVE_CLASS);\n this.renderer.setStyle(document.body, 'cursor', '');\n this.renderer.setStyle(this.elm.nativeElement, 'cursor', '');\n if (this.resizeEnd.observers.length > 0) {\n this.zone.run(() => {\n this.resizeEnd.emit({\n edges: getEdgesDiff({\n edges: currentResize!.edges,\n initialRectangle: currentResize!.startingRect,\n newRectangle: currentResize!.currentRect,\n }),\n rectangle: currentResize!.currentRect,\n });\n });\n }\n removeGhostElement();\n currentResize = null;\n }\n });\n }\n\n /**\n * @hidden\n */\n ngOnDestroy(): void {\n // browser check for angular universal, because it doesn't know what document is\n if (isPlatformBrowser(this.platformId)) {\n this.renderer.setStyle(document.body, 'cursor', '');\n }\n this.mousedown.complete();\n this.mouseup.complete();\n this.mousemove.complete();\n this.destroy$.next();\n }\n\n private setElementClass(elm: ElementRef, name: string, add: boolean): void {\n if (add) {\n this.renderer.addClass(elm.nativeElement, name);\n } else {\n this.renderer.removeClass(elm.nativeElement, name);\n }\n }\n}\n\nclass PointerEventListeners {\n public pointerDown: Observable<PointerEventCoordinate>;\n\n public pointerMove: Observable<PointerEventCoordinate>;\n\n public pointerUp: Observable<PointerEventCoordinate>;\n\n private static instance: PointerEventListeners;\n\n public static getInstance(\n renderer: Renderer2,\n zone: NgZone\n ): PointerEventListeners {\n if (!PointerEventListeners.instance) {\n PointerEventListeners.instance = new PointerEventListeners(\n renderer,\n zone\n );\n }\n return PointerEventListeners.instance;\n }\n\n constructor(renderer: Renderer2, zone: NgZone) {\n this.pointerDown = new Observable(\n (observer: Observer<PointerEventCoordinate>) => {\n let unsubscribeMouseDown: () => void;\n let unsubscribeTouchStart: (() => void) | undefined;\n\n zone.runOutsideAngular(() => {\n unsubscribeMouseDown = renderer.listen(\n 'document',\n 'mousedown',\n (event: MouseEvent) => {\n observer.next({\n clientX: event.clientX,\n clientY: event.clientY,\n event,\n });\n }\n );\n\n if (IS_TOUCH_DEVICE) {\n unsubscribeTouchStart = renderer.listen(\n 'document',\n 'touchstart',\n (event: TouchEvent) => {\n observer.next({\n clientX: event.touches[0].clientX,\n clientY: event.touches[0].clientY,\n event,\n });\n }\n );\n }\n });\n\n return () => {\n unsubscribeMouseDown();\n if (IS_TOUCH_DEVICE) {\n unsubscribeTouchStart!();\n }\n };\n }\n ).pipe(share());\n\n this.pointerMove = new Observable(\n (observer: Observer<PointerEventCoordinate>) => {\n let unsubscribeMouseMove: () => void;\n let unsubscribeTouchMove: (() => void) | undefined;\n\n zone.runOutsideAngular(() => {\n unsubscribeMouseMove = renderer.listen(\n 'document',\n 'mousemove',\n (event: MouseEvent) => {\n observer.next({\n clientX: event.clientX,\n clientY: event.clientY,\n event,\n });\n }\n );\n\n if (IS_TOUCH_DEVICE) {\n unsubscribeTouchMove = renderer.listen(\n 'document',\n 'touchmove',\n (event: TouchEvent) => {\n observer.next({\n clientX: event.targetTouches[0].clientX,\n clientY: event.targetTouches[0].clientY,\n event,\n });\n }\n );\n }\n });\n\n return () => {\n unsubscribeMouseMove();\n if (IS_TOUCH_DEVICE) {\n unsubscribeTouchMove!();\n }\n };\n }\n ).pipe(share());\n\n this.pointerUp = new Observable(\n (observer: Observer<PointerEventCoordinate>) => {\n let unsubscribeMouseUp: () => void;\n let unsubscribeTouchEnd: (() => void) | undefined;\n let unsubscribeTouchCancel: (() => void) | undefined;\n\n zone.runOutsideAngular(() => {\n unsubscribeMouseUp = renderer.listen(\n 'document',\n 'mouseup',\n (event: MouseEvent) => {\n observer.next({\n clientX: event.clientX,\n clientY: event.clientY,\n event,\n });\n }\n );\n\n if (IS_TOUCH_DEVICE) {\n unsubscribeTouchEnd = renderer.listen(\n 'document',\n 'touchend',\n (event: TouchEvent) => {\n observer.next({\n clientX: event.changedTouches[0].clientX,\n clientY: event.changedTouches[0].clientY,\n event,\n });\n }\n );\n\n unsubscribeTouchCancel = renderer.listen(\n 'document',\n 'touchcancel',\n (event: TouchEvent) => {\n observer.next({\n clientX: event.changedTouches[0].clientX,\n clientY: event.changedTouches[0].clientY,\n event,\n });\n }\n );\n }\n });\n\n return () => {\n unsubscribeMouseUp();\n if (IS_TOUCH_DEVICE) {\n unsubscribeTouchEnd!();\n unsubscribeTouchCancel!();\n }\n };\n }\n ).pipe(share());\n }\n}\n","import {\n Directive,\n Input,\n Renderer2,\n ElementRef,\n OnInit,\n OnDestroy,\n NgZone,\n Optional,\n} from '@angular/core';\nimport { fromEvent, merge, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ResizableDirective } from './resizable.directive';\nimport { Edges } from './interfaces/edges.interface';\nimport { IS_TOUCH_DEVICE } from './util/is-touch-device';\n\n/**\n * An element placed inside a `mwlResizable` directive to be used as a drag and resize handle\n *\n * For example\n *\n * ```html\n * <div mwlResizable>\n * <div mwlResizeHandle [resizeEdges]=\"{bottom: true, right: true}\"></div>\n * </div>\n * ```\n * Or in case they are sibling elements:\n * ```html\n * <div mwlResizable #resizableElement=\"mwlResizable\"></div>\n * <div mwlResizeHandle [resizableContainer]=\"resizableElement\" [resizeEdges]=\"{bottom: true, right: true}\"></div>\n * ```\n */\n@Directive({\n selector: '[mwlResizeHandle]',\n})\nexport class ResizeHandleDirective implements OnInit, OnDestroy {\n /**\n * The `Edges` object that contains the edges of the parent element that dragging the handle will trigger a resize on\n */\n @Input() resizeEdges: Edges = {};\n /**\n * Reference to ResizableDirective in case if handle is not located inside of element with ResizableDirective\n */\n @Input() resizableContainer: ResizableDirective;\n\n private eventListeners: {\n touchmove?: () => void;\n mousemove?: () => void;\n [key: string]: (() => void) | undefined;\n } = {};\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private renderer: Renderer2,\n private element: ElementRef,\n private zone: NgZone,\n @Optional() private resizableDirective: ResizableDirective\n ) {}\n\n ngOnInit(): void {\n this.zone.runOutsideAngular(() => {\n this.listenOnTheHost<MouseEvent>('mousedown').subscribe((event) => {\n this.onMousedown(event, event.clientX, event.clientY);\n });\n\n this.listenOnTheHost<MouseEvent>('mouseup').subscribe((event) => {\n this.onMouseup(event.clientX, event.clientY);\n });\n\n if (IS_TOUCH_DEVICE) {\n this.listenOnTheHost<TouchEvent>('touchstart').subscribe((event) => {\n this.onMousedown(\n event,\n event.touches[0].clientX,\n event.touches[0].clientY\n );\n });\n\n merge(\n this.listenOnTheHost<TouchEvent>('touchend'),\n this.listenOnTheHost<TouchEvent>('touchcancel')\n ).subscribe((event) => {\n this.onMouseup(\n event.changedTouches[0].clientX,\n event.changedTouches[0].clientY\n );\n });\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.unsubscribeEventListeners();\n }\n\n /**\n * @hidden\n */\n onMousedown(\n event: MouseEvent | TouchEvent,\n clientX: number,\n clientY: number\n ): void {\n event.preventDefault();\n if (!this.eventListeners.touchmove) {\n this.eventListeners.touchmove = this.renderer.listen(\n this.element.nativeElement,\n 'touchmove',\n (touchMoveEvent: TouchEvent) => {\n this.onMousemove(\n touchMoveEvent,\n touchMoveEvent.targetTouches[0].clientX,\n touchMoveEvent.targetTouches[0].clientY\n );\n }\n );\n }\n if (!this.eventListeners.mousemove) {\n this.eventListeners.mousemove = this.renderer.listen(\n this.element.nativeElement,\n 'mousemove',\n (mouseMoveEvent: MouseEvent) => {\n this.onMousemove(\n mouseMoveEvent,\n mouseMoveEvent.clientX,\n mouseMoveEvent.clientY\n );\n }\n );\n }\n this.resizable.mousedown.next({\n clientX,\n clientY,\n edges: this.resizeEdges,\n });\n }\n\n /**\n * @hidden\n */\n onMouseup(clientX: number, clientY: number): void {\n this.unsubscribeEventListeners();\n this.resizable.mouseup.next({\n clientX,\n clientY,\n edges: this.resizeEdges,\n });\n }\n\n // directive might be passed from DI or as an input\n private get resizable(): ResizableDirective {\n return this.resizableDirective || this.resizableContainer;\n }\n\n private onMousemove(\n event: MouseEvent | TouchEvent,\n clientX: number,\n clientY: number\n ): void {\n this.resizable.mousemove.next({\n clientX,\n clientY,\n edges: this.resizeEdges,\n event,\n });\n }\n\n private unsubscribeEventListeners(): void {\n Object.keys(this.eventListeners).forEach((type) => {\n (this as any).eventListeners[type]();\n delete this.eventListeners[type];\n });\n }\n\n private listenOnTheHost<T extends Event>(eventName: string) {\n return fromEvent<T>(this.element.nativeElement, eventName).pipe(\n takeUntil(this.destroy$)\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ResizableDirective } from './resizable.directive';\nimport { ResizeHandleDirective } from './resize-handle.directive';\n\n@NgModule({\n declarations: [ResizableDirective, ResizeHandleDirective],\n exports: [ResizableDirective, ResizeHandleDirective],\n})\nexport class ResizableModule {}\n","/*\n * Public API Surface of angular-resizable-element\n */\n\nexport * from './lib/resizable.module';\nexport { BoundingRectangle } from './lib/interfaces/bounding-rectangle.interface';\nexport { Edges } from './lib/interfaces/edges.interface';\nexport { ResizeEvent } from './lib/interfaces/resize-event.interface';\nexport { ResizableDirective } from './lib/resizable.directive';\nexport { ResizeHandleDirective } from './lib/resize-handle.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
\No newline at end of file