{"version":3,"file":"ngp-image-picker.mjs","sources":["../../../projects/ngp-image-picker/src/lib/functions/image-processing.ts","../../../projects/ngp-image-picker/src/lib/components/tabs/tabs.component.ts","../../../projects/ngp-image-picker/src/lib/components/tabs/tabs.component.html","../../../projects/ngp-image-picker/src/lib/components/basic-filters/basic-filters.component.ts","../../../projects/ngp-image-picker/src/lib/components/basic-filters/basic-filters.component.html","../../../projects/ngp-image-picker/src/lib/functions/croppr/polyfills.ts","../../../projects/ngp-image-picker/src/lib/functions/croppr/handle.ts","../../../projects/ngp-image-picker/src/lib/functions/croppr/box.ts","../../../projects/ngp-image-picker/src/lib/functions/croppr/touch.ts","../../../projects/ngp-image-picker/src/lib/functions/croppr/core.ts","../../../projects/ngp-image-picker/src/lib/functions/croppr/croppr.ts","../../../projects/ngp-image-picker/src/lib/components/cropper-wrapper/cropper-wrapper.component.ts","../../../projects/ngp-image-picker/src/lib/components/cropper-wrapper/cropper-wrapper.component.html","../../../projects/ngp-image-picker/src/lib/components/edit-image/edit-image.component.ts","../../../projects/ngp-image-picker/src/lib/components/edit-image/edit-image.component.html","../../../projects/ngp-image-picker/src/lib/ngp-image-picker.component.ts","../../../projects/ngp-image-picker/src/lib/ngp-image-picker.component.html","../../../projects/ngp-image-picker/src/lib/ngp-image-picker.module.ts","../../../projects/ngp-image-picker/src/public-api.ts","../../../projects/ngp-image-picker/src/ngp-image-picker.ts"],"sourcesContent":["import { IState } from '../models/index.models';\n\nexport const MAX_BUFFER_UNDO_MEMORY = 25;\nlet rotate = 1;\n\nexport const convertImageUsingCanvas = (\n  datas: any,\n  changeHeight = false,\n  state: IState,\n  options?: { getDimFromImage?: boolean; rotate?: number },\n): Promise<string> => {\n  return new Promise(async (resolve, _) => {\n    let img = document.createElement('img');\n    img.src = datas + '';\n    img.crossOrigin = 'Anonymous';\n    let quality = state.quality / 100;\n    let maintainRatio = state.maintainAspectRatio;\n\n    img.onload = () => {\n      var canvas = document.createElement('canvas');\n      let ctx = canvas.getContext('2d');\n      if (!ctx) return;\n      let ratio = img.width / img.height;\n      let width = state.maxWidth;\n      let height = state.maxHeight;\n\n      if (options?.getDimFromImage) {\n        width = img.width;\n        height = img.height;\n      }\n\n      if (maintainRatio) {\n        canvas.width = width;\n        canvas.height = width / ratio;\n        if (changeHeight) {\n          canvas.width = height * ratio;\n          canvas.height = height;\n        }\n      } else {\n        canvas.width = width;\n        canvas.height = height;\n      }\n      if (state.basicFilters) {\n        ctx.filter = processFilter(state.basicFilters);\n      }\n      // if (options?.rotate) {\n      //   canvas.width = height;\n      //   canvas.height = width;\n      //   if (options?.rotate === 90) {\n      //     ctx.rotate((90 * Math.PI) / 180);\n      //     ctx.translate(0, -canvas.width);\n      //   } else {\n      //     ctx.rotate((-90 * Math.PI) / 180);\n      //     ctx.translate(-canvas.height, 0);\n      //   }\n      //   ctx.drawImage(img, 0, 0);\n      // } else {\n      // }\n      ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n      let type = state.format;\n      var dataURI = canvas.toDataURL(`image/${type}`, quality);\n      resolve({\n        dataUri: dataURI,\n        width: canvas.width,\n        height: canvas.height,\n      });\n    };\n  }).then((data: any) => {\n    state.maxHeight = data.height;\n    state.maxWidth = data.width;\n    saveState(state, data.dataUri);\n    return data.dataUri;\n  });\n\n  function processFilter(data: any) {\n    return Object.keys(data)\n      .map((key) => {\n        if (['blur'].includes(key)) {\n          return `${key}(${data[key]}px)`;\n        } else {\n          return `${key}(${data[key]})`;\n        }\n      })\n      .join('');\n  }\n};\n\nexport const dragElement = (elemnt: any) => {\n  if (!elemnt) return;\n  let pos1 = 0,\n    pos2 = 0,\n    pos3 = 0,\n    pos4 = 0;\n  if (document.getElementById(elemnt.id + '-header')) {\n    /* if present, the header is where you move the DIV from:*/\n    let elementRef = document.getElementById((elemnt?.id as any) + '-header');\n    if (!elementRef) return;\n    elementRef.onmousedown = dragPressOn;\n    elementRef.ontouchstart = dragPressOn;\n  } else {\n    /* otherwise, move the DIV from anywhere inside the DIV:*/\n    elemnt.ontouchstart = dragPressOn;\n    elemnt.onmousedown = dragPressOn;\n  }\n\n  function dragPressOn(e: any) {\n    let popup: any = document.querySelector('#popup');\n    popup.style.overflowY = 'hidden';\n    e = e || window.event;\n    pos3 = e.clientX;\n    pos4 = e.clientY;\n    document.ontouchend = closeDragElement;\n    document.onmouseup = closeDragElement;\n    document.ontouchmove = elementDragTouch;\n    document.onmousemove = elementDragMouse;\n  }\n\n  function elementDragMouse(e: any) {\n    let holderImage = document.getElementById('image-full');\n    e = e || window.event;\n    pos1 = pos3 - e.clientX;\n    pos3 = e.clientX;\n    pos2 = pos4 - e.clientY;\n    pos4 = e.clientY;\n\n    let newTop = elemnt.offsetTop - pos2;\n    let newLeft = elemnt.offsetLeft - pos1;\n    let rectHolder = holderImage?.getBoundingClientRect();\n    let rectElemnt = elemnt.getBoundingClientRect();\n    // console.log('====================================');\n    // console.log(rectElemnt,rectHolder);\n    // console.log('====================================');\n    newTop = Math.max(newTop, rectHolder?.top as number);\n    newTop = Math.min(newTop, (rectHolder?.bottom as number) - rectElemnt.height);\n    newLeft = Math.max(newLeft, rectHolder?.left as number);\n    newLeft = Math.min(newLeft, (rectHolder?.right as number) - rectElemnt.width);\n    elemnt.style.top = newTop + 'px';\n    elemnt.style.left = newLeft + 'px';\n  }\n\n  function elementDragTouch(e: any) {\n    let holderImage = document.getElementById('image-full');\n    e = e || window.event;\n\n    if (e?.changedTouches?.length) {\n      pos1 = pos3 - e.changedTouches[0]?.clientX;\n      pos3 = e.changedTouches[0]?.clientX;\n    }\n    if (e?.changedTouches?.length) {\n      pos2 = pos4 - e.changedTouches[0]?.clientY;\n      pos4 = e.changedTouches[0]?.clientY;\n    }\n\n    let newTop = elemnt.offsetTop - pos2;\n    let newLeft = elemnt.offsetLeft - pos1;\n    let rectHolder = holderImage?.getBoundingClientRect();\n    let rectElemnt = elemnt.getBoundingClientRect();\n\n    // console.log('====================================');\n    // console.log(rectElemnt,rectHolder);\n    // console.log('====================================');\n\n    newTop = Math.max(newTop, rectHolder?.top as number);\n    newTop = Math.min(newTop, (rectHolder?.bottom as number) - rectElemnt.height);\n    newLeft = Math.max(newLeft, rectHolder?.left as number);\n    newLeft = Math.min(newLeft, (rectHolder?.right as number) - rectElemnt.width);\n    elemnt.style.top = newTop + 'px';\n    elemnt.style.left = newLeft + 'px';\n  }\n\n  function closeDragElement() {\n    /* stop moving when mouse button is released:*/\n    let popup: any = document.querySelector('#popup');\n    popup.style.overflowY = 'auto';\n    document.onmouseup = null;\n    document.onmousemove = null;\n    document.ontouchend = null;\n    document.ontouchmove = null;\n  }\n};\n\nexport const saveState = (state: IState, lastImage?: string) => {\n  if (state.arrayCopiedImages.length <= MAX_BUFFER_UNDO_MEMORY) {\n    state.arrayCopiedImages.push({\n      lastImage: lastImage as string,\n      width: state.maxWidth,\n      height: state.maxHeight,\n      quality: state.quality,\n      format: state.format,\n      originImageSrc: state.originImageSrc as string,\n      basicFilters: state.basicFilters,\n    });\n  } else {\n    state.arrayCopiedImages[state.arrayCopiedImages.length - 1] = {\n      lastImage: lastImage as string,\n      width: state.maxWidth,\n      height: state.maxHeight,\n      quality: state.quality,\n      format: state.format,\n      originImageSrc: state.originImageSrc as string,\n      basicFilters: state.basicFilters,\n    };\n  }\n};\n","import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core';\n\ninterface TabHeader {\n  active: boolean;\n  label: string;\n}\n@Component({\n  selector: 'lib-tabs',\n  templateUrl: './tabs.component.html',\n  styleUrls: ['./tabs.component.scss'],\n})\nexport class TabsComponent implements OnInit {\n  labels: Array<TabHeader> = [];\n  indexActivated: number = 0;\n  @Input() color = '';\n\n  @Input() set _labels(value: Array<string>) {\n    if (value?.length) {\n      this.labels = value.map((el) => ({ active: false, label: el }));\n      this.labels[this.indexActivated].active = true;\n    }\n  }\n  @Input() set _indexActivated(index: number) {\n    this.indexActivated = index || 0;\n  }\n\n  @Output() indexActivatedChange: EventEmitter<number> = new EventEmitter<number>();\n\n  onActivateTab(itemIndex: number) {\n    this.labels = this.labels.map((el, index) => {\n      el.active = itemIndex === index ? true : false;\n      return el;\n    });\n    this.indexActivated = itemIndex;\n    this.indexActivatedChange.next(itemIndex);\n  }\n\n  constructor() {}\n\n  ngOnInit() {}\n}\n","<div class=\"header\">\n  <div\n    (click)=\"onActivateTab(index)\"\n    *ngFor=\"let tab of this.labels; let index = index\"\n    class=\"itemlabel bottomLine\"\n    [ngStyle]=\"{ color: tab.active ? color : 'inherit', opacity: tab.active ? 1 : 0.7, fontWeight: tab.active ? 500 : 'inherit' }\"\n  >\n    {{ tab.label }}\n    <div *ngIf=\"tab.active\" [style.backgroundColor]=\"this.color\"></div>\n  </div>\n</div>\n\n<div class=\"body\">\n  <ng-content></ng-content>\n</div>\n","import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core';\nimport { IBasicFilterState } from '../../models/index.models';\n\n@Component({\n  selector: 'lib-basic-filters',\n  templateUrl: './basic-filters.component.html',\n  styleUrls: ['./basic-filters.component.scss'],\n})\nexport class BasicFiltersComponent implements OnInit {\n  @Input() color: string = '';\n  @Input() labels: any;\n\n  @Output() changeFilter = new EventEmitter<IBasicFilterState>();\n\n  state: IBasicFilterState = {\n    contrast: 1,\n    blur: 0,\n    brightness: 1,\n    grayscale: 0,\n    invert: 0,\n    saturate: 1,\n    sepia: 0,\n  };\n\n  @Input() set filterState(value: any) {\n    if (value) {\n      this.state = JSON.parse(JSON.stringify({ ...this.state, ...value }));\n    } else {\n      this.state = {\n        contrast: 1,\n        blur: 0,\n        brightness: 1,\n        grayscale: 0,\n        invert: 0,\n        saturate: 1,\n        sepia: 0,\n      };\n    }\n  }\n  timeout: number | NodeJS.Timeout | undefined;\n\n  constructor() {}\n\n  ngOnInit(): void {}\n\n  onChange() {\n    this.debounce(() => {\n      this.changeFilter.next(this.state);\n    }, 150);\n  }\n\n  debounce = (callback: Function, delay: number | undefined) => {\n    clearTimeout(this.timeout as any);\n    this.timeout = setTimeout(() => {\n      callback();\n      clearTimeout(this.timeout as any);\n    }, delay);\n  };\n}\n","<div style=\"display: flex; width: 100%; justify-content: space-between\">\n  <p class=\"item-panel\">{{ labels['Contrast'] }}</p>\n  <p class=\"item-panel\">{{ (this.state?.contrast || 0.0).toFixed(2) }}</p>\n</div>\n<div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n  <input\n    class=\"input-range\"\n    (input)=\"onChange()\"\n    [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n    [(ngModel)]=\"state.contrast\"\n    type=\"range\"\n    min=\"0\"\n    max=\"5\"\n    step=\"0.01\"\n  />\n</div>\n\n<br />\n<div style=\"display: flex; width: 100%; justify-content: space-between\">\n  <p class=\"item-panel\">{{ labels['Brightness'] }}</p>\n  <p class=\"item-panel\">{{ (this.state?.brightness || 0.0).toFixed(2) }}</p>\n</div>\n\n<div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n  <input\n    class=\"input-range\"\n    (input)=\"onChange()\"\n    [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n    [(ngModel)]=\"state.brightness\"\n    type=\"range\"\n    min=\"0\"\n    max=\"5\"\n    step=\"0.01\"\n  />\n</div>\n\n<br />\n<div style=\"display: flex; width: 100%; justify-content: space-between\">\n  <p class=\"item-panel\">{{ labels['Grayscale'] }}</p>\n  <p class=\"item-panel\">{{ (this.state?.grayscale || 0.0).toFixed(2) }}</p>\n</div>\n\n<div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n  <input\n    class=\"input-range\"\n    (input)=\"onChange()\"\n    [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n    [(ngModel)]=\"state.grayscale\"\n    type=\"range\"\n    min=\"0\"\n    max=\"1\"\n    step=\"0.01\"\n  />\n</div>\n\n<br />\n<div style=\"display: flex; width: 100%; justify-content: space-between\">\n  <p class=\"item-panel\">{{ labels['Saturate'] }}</p>\n  <p class=\"item-panel\">{{ (this.state?.saturate || 0.0).toFixed(2) }}</p>\n</div>\n\n<div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n  <input\n    class=\"input-range\"\n    (input)=\"onChange()\"\n    [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n    [(ngModel)]=\"state.saturate\"\n    type=\"range\"\n    min=\"0\"\n    max=\"10\"\n    step=\"0.01\"\n  />\n</div>\n<br />\n<div style=\"display: flex; width: 100%; justify-content: space-between\">\n  <p class=\"item-panel\">{{ labels['Sepia'] }}</p>\n  <p class=\"item-panel\">{{ (this.state?.sepia || 0.0).toFixed(2) }}</p>\n</div>\n\n<div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n  <input\n    class=\"input-range\"\n    (input)=\"onChange()\"\n    [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n    [(ngModel)]=\"state.sepia\"\n    type=\"range\"\n    min=\"0\"\n    max=\"1\"\n    step=\"0.01\"\n  />\n</div>\n\n<!-- <br />\n<div style=\"display: flex; width: 100%; justify-content: space-between\">\n  <p class=\"item-panel\">{{ labels['Invert'] }}</p>\n  <p class=\"item-panel\">{{ (this.state?.invert || 0.0).toFixed(2) }}</p>\n</div>\n\n<div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n  <input\n    class=\"input-range\"\n    (input)=\"onChange()\"\n    [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n    [(ngModel)]=\"state.invert\"\n    type=\"range\"\n    min=\"0\"\n    max=\"1\"\n    step=\"0.01\"\n  />\n</div> -->\n\n<br />\n<div style=\"display: flex; width: 100%; justify-content: space-between\">\n  <p class=\"item-panel\">{{ labels['Blur'] }}</p>\n  <p class=\"item-panel\">{{ (state?.blur || 0.0).toFixed(2) }}</p>\n</div>\n\n<div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n  <input\n    class=\"input-range\"\n    (input)=\"onChange()\"\n    [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n    [(ngModel)]=\"state.blur\"\n    type=\"range\"\n    min=\"0\"\n    max=\"20\"\n    step=\"1\"\n  />\n</div>\n","/**\n * POLYFILLS\n */\n\n// Request Animation Frame polyfill\n(function () {\n  let lastTime = 0;\n  let vendors: any[] = ['ms', 'moz', 'webkit', 'o'];\n  for (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n    window.requestAnimationFrame = window[(vendors[x] + 'RequestAnimationFrame') as any] as any;\n    window.cancelAnimationFrame = (window[(vendors[x] + 'CancelAnimationFrame') as any] ||\n      window[(vendors[x] + 'CancelRequestAnimationFrame') as any]) as any;\n  }\n\n  if (!window.requestAnimationFrame)\n    window.requestAnimationFrame = function (callback: any, element: any) {\n      let currTime = new Date().getTime();\n      let timeToCall = Math.max(0, 16 - (currTime - lastTime));\n      let id = window.setTimeout(function () {\n        callback(currTime + timeToCall);\n      }, timeToCall);\n      lastTime = currTime + timeToCall;\n      return id;\n    } as any;\n\n  if (!window.cancelAnimationFrame)\n    window.cancelAnimationFrame = function (id) {\n      clearTimeout(id);\n    };\n})();\n\n// CustomEvents polyfill\n(function () {\n  if (typeof window.CustomEvent === 'function') return false;\n\n  function CustomEvent(event: any, params: any) {\n    params = params || { bubbles: false, cancelable: false, detail: undefined };\n    let evt = document.createEvent('CustomEvent');\n    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n    return evt;\n  }\n\n  CustomEvent.prototype = window.Event.prototype;\n\n  window.CustomEvent = CustomEvent as any;\n})();\n\n// MouseEvents polyfill\n(function (window) {\n  try {\n    new CustomEvent('test');\n    return false; // No need to polyfill\n  } catch (e) {\n    // Need to polyfill - fall through\n  }\n\n  // Polyfills DOM4 CustomEvent\n  function MouseEvent(eventType: any, params: any) {\n    params = params || { bubbles: false, cancelable: false };\n    let mouseEvent = document.createEvent('MouseEvent');\n    mouseEvent.initMouseEvent(eventType, params.bubbles, params.cancelable, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n    return mouseEvent;\n  }\n\n  MouseEvent.prototype = Event.prototype;\n\n  window.MouseEvent = MouseEvent as any;\n})(window);\n","/**\n * Handle component\n */\nexport default class Handle {\n  /**\n   * Creates a new Handle instance.\n   * @constructor\n   * @param {Array} position The x and y ratio position of the handle\n   *      within the crop region. Accepts a value between 0 to 1 in the order\n   *      of [X, Y].\n   * @param {Array} constraints Define the side of the crop region that\n   *      is to be affected by this handle. Accepts a value of 0 or 1 in the\n   *      order of [TOP, RIGHT, BOTTOM, LEFT].\n   * @param {String} cursor The CSS cursor of this handle.\n   * @param {Element} eventBus The element to dispatch events to.\n   */\n  position: any;\n  constraints: any;\n  cursor: any;\n  eventBus: any;\n  el: any;\n\n  constructor(position: any, constraints: any, cursor: any, eventBus: any) {\n    var self = this;\n    this.position = position;\n    this.constraints = constraints;\n    this.cursor = cursor;\n    this.eventBus = eventBus;\n\n    // Create DOM element\n    this.el = document.createElement(\"div\");\n    this.el.className = \"croppr-handle\";\n    this.el.style.cursor = cursor;\n\n    // Attach initial listener\n    this.el.addEventListener(\"mousedown\", onMouseDown);\n\n    function onMouseDown(e: any) {\n      e.stopPropagation();\n      document.addEventListener(\"mouseup\", onMouseUp);\n      document.addEventListener(\"mousemove\", onMouseMove);\n\n      // Notify parent\n      self.eventBus.dispatchEvent(\n        new CustomEvent(\"handlestart\", {\n          detail: { handle: self },\n        })\n      );\n    }\n\n    function onMouseUp(e: any) {\n      e.stopPropagation();\n      document.removeEventListener(\"mouseup\", onMouseUp);\n      document.removeEventListener(\"mousemove\", onMouseMove);\n\n      // Notify parent\n      self.eventBus.dispatchEvent(\n        new CustomEvent(\"handleend\", {\n          detail: { handle: self },\n        })\n      );\n    }\n\n    function onMouseMove(e: any) {\n      e.stopPropagation();\n\n      // Notify parent\n      self.eventBus.dispatchEvent(\n        new CustomEvent(\"handlemove\", {\n          detail: { mouseX: e.clientX, mouseY: e.clientY },\n        })\n      );\n    }\n  }\n}\n","/**\n * Box component\n */\nexport default class Box {\n  /**\n   * Creates a new Box instance.\n   * @constructor\n   * @param {Number} x1\n   * @param {Number} y1\n   * @param {Number} x2\n   * @param {Number} y2\n   */\n  x1: any;\n  y1: any;\n  x2: any;\n  y2: any;\n\n  constructor(x1: any, y1: any, x2: any, y2: any) {\n    this.x1 = x1;\n    this.y1 = y1;\n    this.x2 = x2;\n    this.y2 = y2;\n  }\n\n  /**\n   * Sets the new dimensions of the box.\n   * @param {Number} x1\n   * @param {Number} y1\n   * @param {Number} x2\n   * @param {Number} y2\n   */\n  set(x1 = null, y1 = null, x2 = null, y2 = null) {\n    this.x1 = x1 == null ? this.x1 : x1;\n    this.y1 = y1 == null ? this.y1 : y1;\n    this.x2 = x2 == null ? this.x2 : x2;\n    this.y2 = y2 == null ? this.y2 : y2;\n    return this;\n  }\n\n  /**\n   * Calculates the width of the box.\n   * @returns {Number}\n   */\n  width() {\n    return Math.abs(this.x2 - this.x1);\n  }\n\n  /**\n   * Calculates the height of the box.\n   * @returns {Number}\n   */\n  height() {\n    return Math.abs(this.y2 - this.y1);\n  }\n\n  /**\n   * Resizes the box to a new size.\n   * @param {Number} newWidth\n   * @param {Number} newHeight\n   * @param {Array} [origin] The origin point to resize from.\n   *      Defaults to [0, 0] (top left).\n   */\n  resize(newWidth: any, newHeight: any, origin = [0, 0]) {\n    const fromX = this.x1 + this.width() * origin[0];\n    const fromY = this.y1 + this.height() * origin[1];\n\n\n    this.x1 = fromX - newWidth * origin[0];\n    this.y1 = fromY - newHeight * origin[1];\n    this.x2 = this.x1 + newWidth;\n    this.y2 = this.y1 + newHeight;\n\n    return this;\n  }\n\n  /**\n   * Scale the box by a factor.\n   * @param {Number} factor\n   * @param {Array} [origin] The origin point to resize from.\n   *      Defaults to [0, 0] (top left).\n   */\n  scale(factor: any, origin = [0, 0]) {\n    const newWidth = this.width() * factor;\n    const newHeight = this.height() * factor;\n    this.resize(newWidth, newHeight, origin);\n    return this;\n  }\n\n  /**\n   * Move the box to the specified coordinates.\n   */\n  move(x = null, y = null) {\n    let width = this.width();\n    let height = this.height();\n    x = x === null ? this.x1 : x;\n    y = y === null ? this.y1 : y;\n\n    this.x1 = x;\n    this.y1 = y;\n    this.x2 = (x as any) + width;\n    this.y2 = (y as any) + height;\n    return this;\n  }\n\n  /**\n   * Get relative x and y coordinates of a given point within the box.\n   * @param {Array} point The x and y ratio position within the box.\n   * @returns {Array} The x and y coordinates [x, y].\n   */\n  getRelativePoint(point = [0, 0]) {\n    const x = this.width() * point[0];\n    const y = this.height() * point[1];\n    return [x, y];\n  }\n\n  /**\n   * Get absolute x and y coordinates of a given point within the box.\n   * @param {Array} point The x and y ratio position within the box.\n   * @returns {Array} The x and y coordinates [x, y].\n   */\n  getAbsolutePoint(point = [0, 0]) {\n    const x = this.x1 + this.width() * point[0];\n    const y = this.y1 + this.height() * point[1];\n    return [x, y];\n  }\n\n  /**\n   * Constrain the box to a fixed ratio.\n   * @param {Number} ratio\n   * @param {Array} [origin] The origin point to resize from.\n   *     Defaults to [0, 0] (top left).\n   * @param {String} [grow] The axis to grow to maintain the ratio.\n   *     Defaults to 'height'.\n   */\n  constrainToRatio(ratio: any, origin = [0, 0], grow = \"height\") {\n    if (ratio === null) {\n      return;\n    }\n    const width = this.width();\n    const height = this.height();\n    switch (grow) {\n      case \"height\": // Grow height only\n        this.resize(this.width(), this.width() * ratio, origin);\n        break;\n      case \"width\": // Grow width only\n        this.resize((this.height() * 1) / ratio, this.height(), origin);\n        break;\n      default: // Default: Grow height only\n        this.resize(this.width(), this.width() * ratio, origin);\n    }\n\n    return this;\n  }\n\n  /**\n   * Constrain the box within a boundary.\n   * @param {Number} boundaryWidth\n   * @param {Number} boundaryHeight\n   * @param {Array} [origin] The origin point to resize from.\n   *     Defaults to [0, 0] (top left).\n   */\n  constrainToBoundary(\n    boundaryWidth: any,\n    boundaryHeight: any,\n    origin = [0, 0]\n  ) {\n    // Calculate the maximum sizes for each direction of growth\n    const [originX, originY] = this.getAbsolutePoint(origin);\n    const maxIfLeft = originX;\n    const maxIfTop = originY;\n    const maxIfRight = boundaryWidth - originX;\n    const maxIfBottom = boundaryHeight - originY;\n\n    // Express the direction of growth in terms of left, both,\n    // and right as -1, 0, and 1 respectively. Ditto for top/both/down.\n    const directionX = -2 * origin[0] + 1;\n    const directionY = -2 * origin[1] + 1;\n\n    // Determine the max size to use according to the direction of growth.\n    let [maxWidth, maxHeight]: [any, any] = [null, null];\n    switch (directionX) {\n      case -1:\n        maxWidth = maxIfLeft;\n        break;\n      case 0:\n        maxWidth = (Math.min(maxIfLeft, maxIfRight) * 2) as any;\n        break;\n      case +1:\n        maxWidth = maxIfRight as any;\n        break;\n    }\n    switch (directionY) {\n      case -1:\n        maxHeight = maxIfTop;\n        break;\n      case 0:\n        maxHeight = (Math.min(maxIfTop, maxIfBottom) * 2) as any;\n        break;\n      case +1:\n        maxHeight = maxIfBottom as any;\n        break;\n    }\n\n    // Resize if the box exceeds the calculated max width/height.\n    if (this.width() > maxWidth) {\n      const factor = maxWidth / this.width();\n      this.scale(factor, origin);\n    }\n    if (this.height() > maxHeight) {\n      const factor = maxHeight / this.height();\n      this.scale(factor, origin);\n    }\n\n    return this;\n  }\n\n  /**\n   * Constrain the box to a maximum/minimum size.\n   * @param {Number} [maxWidth]\n   * @param {Number} [maxHeight]\n   * @param {Number} [minWidth]\n   * @param {Number} [minHeight]\n   * @param {Array} [origin] The origin point to resize from.\n   *     Defaults to [0, 0] (top left).\n   * @param {Number} [ratio] Ratio to maintain.\n   */\n  constrainToSize(\n    maxWidth: any = null,\n    maxHeight: any = null,\n    minWidth: any = null,\n    minHeight: any = null,\n    origin = [0, 0],\n    ratio: any = null\n  ) {\n    // Calculate new max/min widths & heights that constrains to the ratio\n    if (ratio) {\n      if (ratio > 1) {\n        maxWidth = (maxHeight * 1) / ratio;\n        minHeight = minHeight * ratio;\n      } else if (ratio < 1) {\n        maxHeight = maxWidth * ratio;\n        minWidth = (minHeight * 1) / ratio;\n      }\n    }\n\n    if (maxWidth && this.width() > maxWidth) {\n      const newWidth = maxWidth,\n        newHeight = ratio === null ? this.height() : maxHeight;\n      this.resize(newWidth, newHeight, origin);\n    }\n\n    if (maxHeight && this.height() > maxHeight) {\n      const newWidth = ratio === null ? this.width() : maxWidth,\n        newHeight = maxHeight;\n      this.resize(newWidth, newHeight, origin);\n    }\n\n    if (minWidth && this.width() < minWidth) {\n      const newWidth = minWidth,\n        newHeight = ratio === null ? this.height() : minHeight;\n      this.resize(newWidth, newHeight, origin);\n    }\n\n    if (minHeight && this.height() < minHeight) {\n      const newWidth = ratio === null ? this.width() : minWidth,\n        newHeight = minHeight;\n      this.resize(newWidth, newHeight, origin);\n    }\n\n    return this;\n  }\n}\n","/**\n * Croppr Touch\n * Enables support for touch devices by translating touch events to\n * mouse events.\n */\n\n/**\n * Binds an element's touch events to be simulated as mouse events.\n * @param {Element} element\n */\nexport default function enableTouch(element: any) {\n  element.addEventListener('touchstart', simulateMouseEvent);\n  element.addEventListener('touchend', simulateMouseEvent);\n  element.addEventListener('touchmove', simulateMouseEvent);\n}\n\n/**\n * Translates a touch event to a mouse event.\n * @param {Event} e\n */\nfunction simulateMouseEvent(e: any) {\n  e.preventDefault();\n  const touch = e.changedTouches[0];\n  const eventMap: any = {\n    touchstart: 'mousedown',\n    touchmove: 'mousemove',\n    touchend: 'mouseup',\n  };\n\n  touch.target.dispatchEvent(\n    new MouseEvent(eventMap[e.type], {\n      bubbles: true,\n      cancelable: true,\n      view: window,\n      clientX: touch.clientX,\n      clientY: touch.clientY,\n      screenX: touch.screenX,\n      screenY: touch.screenY,\n    }),\n  );\n}\n","/**\n * CropprCore\n * Here lies the main logic.\n */\n\nimport Handle from './handle';\nimport Box from './box';\nimport enableTouch from './touch';\n\n/**\n * Define a list of handles to create.\n *\n * @property {Array} position - The x and y ratio position of the handle within\n *      the crop region. Accepts a value between 0 to 1 in the order of [X, Y].\n * @property {Array} constraints - Define the side of the crop region that is to\n *      be affected by this handle. Accepts a value of 0 or 1 in the order of\n *      [TOP, RIGHT, BOTTOM, LEFT].\n * @property {String} cursor - The CSS cursor of this handle.\n */\nconst HANDLES = [\n  { position: [0.0, 0.0], constraints: [1, 0, 0, 1], cursor: 'nw-resize' },\n  { position: [0.5, 0.0], constraints: [1, 0, 0, 0], cursor: 'n-resize' },\n  { position: [1.0, 0.0], constraints: [1, 1, 0, 0], cursor: 'ne-resize' },\n  { position: [1.0, 0.5], constraints: [0, 1, 0, 0], cursor: 'e-resize' },\n  { position: [1.0, 1.0], constraints: [0, 1, 1, 0], cursor: 'se-resize' },\n  { position: [0.5, 1.0], constraints: [0, 0, 1, 0], cursor: 's-resize' },\n  { position: [0.0, 1.0], constraints: [0, 0, 1, 1], cursor: 'sw-resize' },\n  { position: [0.0, 0.5], constraints: [0, 0, 0, 1], cursor: 'w-resize' },\n];\n\n/**\n * Core class for Croppr containing most of its functional logic.\n */\nexport default class CropprCore {\n  options: any;\n  _initialized: any;\n  _restore: any;\n  cropperEl: any;\n  box: any;\n  containerEl: any;\n  imageEl: any;\n  eventBus: any;\n  imageClippedEl: any;\n  regionEl: HTMLElement | null | undefined = null;\n  overlayEl: any;\n  handles: any;\n  activeHandle: any;\n  currentMove: any;\n\n  constructor(element: any, options: any, deferred = false) {\n    // console.log(\"🚀 ~ file: core.ts ~ line 51 ~ CropprCore ~ constructor ~ element\", element)\n    // Parse options\n    this.options = CropprCore.parseOptions(options || {});\n\n    // Get target img element\n    if (!element.nodeName) {\n      element = document.querySelector(element);\n      // console.log(\"🚀 ~ file: core.ts ~ line 58 ~ CropprCore ~ constructor ~ element\", element)\n      if (element == null) {\n        throw 'Unable to find element.';\n      }\n    }\n    if (!element.getAttribute('src')) {\n      throw 'Image src not provided.';\n    }\n\n    // Define internal props\n    this._initialized = false;\n    this._restore = {\n      parent: element.parentNode,\n      element: element,\n    };\n\n    // Wait until image is loaded before proceeding\n    if (!deferred) {\n      if (element.width === 0 || element.height === 0) {\n        element.onload = () => {\n          this.initialize(element);\n        };\n      } else {\n        this.initialize(element);\n      }\n    }\n  }\n\n  /**\n   * Initialize the Croppr instance\n   */\n  initialize(element: any) {\n    // Create DOM elements\n    this.createDOM(element);\n\n    // Process option values\n    this.options.convertToPixels(this.cropperEl);\n\n    // Listen for events from children\n    this.attachHandlerEvents();\n    this.attachRegionEvents();\n    this.attachOverlayEvents();\n\n    // Bootstrap this cropper instance\n    this.box = this.initializeBox(this.options);\n    this.redraw();\n\n    // Set the initalized flag to true and call the callback\n    this._initialized = true;\n    if (this.options.onInitialize !== null) {\n      this.options.onInitialize(this);\n    }\n  }\n\n  /**\n   * Create Croppr's DOM elements\n   */\n  createDOM(targetEl: any) {\n    // Create main container and use it as the main event listeners\n    this.containerEl = document.createElement('div');\n    this.containerEl.className = 'croppr-container';\n    this.eventBus = this.containerEl;\n    enableTouch(this.containerEl);\n\n    // Create cropper element\n    this.cropperEl = document.createElement('div');\n    this.cropperEl.className = 'croppr';\n\n    // Create image element\n    this.imageEl = document.createElement('img');\n    this.imageEl.setAttribute('src', targetEl.getAttribute('src'));\n    this.imageEl.setAttribute('alt', targetEl.getAttribute('alt'));\n    this.imageEl.className = 'croppr-image';\n\n    // Create clipped image element\n    this.imageClippedEl = this.imageEl.cloneNode();\n    this.imageClippedEl.className = 'croppr-imageClipped';\n\n    // Create region box element\n    this.regionEl = document.createElement('div');\n    this.regionEl.innerHTML = new Array(9)\n      .fill(1)\n      .map(() => `<div style=\"border: 1px dashed #fafafa\"></div>`)\n      .join('');\n    this.regionEl.className = 'croppr-region';\n\n    // Create overlay element\n    this.overlayEl = document.createElement('div');\n    this.overlayEl.className = 'croppr-overlay';\n\n    // Create handles element\n    let handleContainerEl = document.createElement('div');\n    handleContainerEl.className = 'croppr-handleContainer';\n    this.handles = [];\n    for (let i = 0; i < HANDLES.length; i++) {\n      const handle = new Handle(HANDLES[i].position, HANDLES[i].constraints, HANDLES[i].cursor, this.eventBus);\n      this.handles.push(handle);\n      handleContainerEl.appendChild(handle.el);\n    }\n\n    // And then we piece it all together!\n    this.cropperEl.appendChild(this.imageEl);\n    this.cropperEl.appendChild(this.imageClippedEl);\n    this.cropperEl.appendChild(this.regionEl);\n    this.cropperEl.appendChild(this.overlayEl);\n    this.cropperEl.appendChild(handleContainerEl);\n    this.containerEl.appendChild(this.cropperEl);\n\n    // And then finally insert it into the document\n    targetEl.parentElement.replaceChild(this.containerEl, targetEl);\n  }\n\n  /**\n   * Changes the image src.\n   * @param {String} src\n   */\n  setImage(src: any) {\n    // Add onload listener to reinitialize box\n    this.imageEl.onload = () => {\n      this.box = this.initializeBox(this.options);\n      this.redraw();\n    };\n\n    // Change image source\n    this.imageEl.src = src;\n    this.imageClippedEl.src = src;\n    return this;\n  }\n\n  /**\n   * Destroy the Croppr instance and replace with the original element.\n   */\n  destroy() {\n    this._restore.parent.replaceChild(this._restore.element, this.containerEl);\n  }\n\n  /**\n   * Create a new box region with a set of options.\n   * @param {Object} opts The options.\n   * @returns {Box}\n   */\n  initializeBox(opts: any) {\n    // Create initial box\n    const width = opts.startSize.width;\n    const height = opts.startSize.height;\n    let box = new Box(0, 0, width, height);\n    // console.log(\"🚀 ~ file: core.ts ~ line 202 ~ CropprCore ~ initializeBox ~ box\", box)\n\n    // Maintain ratio\n    box.constrainToRatio(opts.aspectRatio, [0.5, 0.5]);\n\n    // Maintain minimum/maximum size\n    const min = opts.minSize;\n    const max = opts.maxSize;\n    box.constrainToSize(max.width, max.height, min.width, min.height, [0.5, 0.5], opts.aspectRatio);\n\n    // Constrain to boundary\n    const parentWidth = this.cropperEl.offsetWidth;\n    const parentHeight = this.cropperEl.offsetHeight;\n    box.constrainToBoundary(parentWidth, parentHeight, [0.5, 0.5]);\n\n    // // Move to center\n    const x = this.cropperEl.offsetWidth / 2 - box.width() / 2;\n    const y = this.cropperEl.offsetHeight / 2 - box.height() / 2;\n\n    // console.log(\"🚀 ~ file: core.ts ~ line 219 ~ CropprCore ~ initializeBox ~ this.cropperEl\", this.cropperEl.offsetWidth)\n    // console.log(\"🚀 ~ file: core.ts ~ line 223 ~ CropprCore ~ initializeBox ~ x, y\", x, y)\n    box.move(x as any, y as any);\n\n    return box;\n  }\n\n  /**\n   * Draw visuals (border, handles, etc) for the current box.\n   */\n  redraw() {\n    // Round positional values to prevent subpixel coordinates, which can\n    // result in element that is rendered blurly\n    const width = Math.round(this.box.width()),\n      height = Math.round(this.box.height()),\n      x1 = Math.round(this.box.x1),\n      y1 = Math.round(this.box.y1),\n      x2 = Math.round(this.box.x2),\n      y2 = Math.round(this.box.y2);\n\n    window.requestAnimationFrame(() => {\n      // Update region element\n      if (!this.regionEl) return;\n      this.regionEl.style.transform = `translate(${x1}px, ${y1}px)`;\n      this.regionEl.style.width = width + 'px';\n      this.regionEl.style.height = height + 'px';\n\n      // Update clipped image element\n      this.imageClippedEl.style.clip = `rect(${y1}px, ${x2}px, ${y2}px, ${x1}px)`;\n\n      // Determine which handle to bring forward. The following code\n      // calculates the quadrant the box is in using bitwise operators.\n      // Reference: https://stackoverflow.com/questions/9718059\n      const center = this.box.getAbsolutePoint([0.5, 0.5]);\n      const xSign = (center[0] - this.cropperEl.offsetWidth / 2) >> 31;\n      const ySign = (center[1] - this.cropperEl.offsetHeight / 2) >> 31;\n      const quadrant = (xSign ^ ySign) + ySign + ySign + 4;\n\n      // The following equation calculates which handle index to bring\n      // forward. The equation is derived using algebra (if youre curious)\n      const foregroundHandleIndex = -2 * quadrant + 8;\n\n      // Update handle positions\n      for (let i = 0; i < this.handles.length; i++) {\n        let handle = this.handles[i];\n\n        // Calculate handle position\n        const handleWidth = handle.el.offsetWidth;\n        const handleHeight = handle.el.offsetHeight;\n        const left = x1 + width * handle.position[0] - handleWidth / 2;\n        const top = y1 + height * handle.position[1] - handleHeight / 2;\n\n        // Apply new position. The positional values are rounded to\n        // prevent subpixel positions which can result in a blurry element\n        handle.el.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n        handle.el.style.zIndex = foregroundHandleIndex == i ? 5 : 4;\n      }\n    });\n  }\n\n  /**\n   * Attach listeners for events emitted by the handles.\n   * Enables resizing of the region element.\n   */\n  attachHandlerEvents() {\n    const eventBus = this.eventBus;\n    eventBus.addEventListener('handlestart', this.onHandleMoveStart.bind(this));\n    eventBus.addEventListener('handlemove', this.onHandleMoveMoving.bind(this));\n    eventBus.addEventListener('handleend', this.onHandleMoveEnd.bind(this));\n  }\n\n  /**\n   * Attach event listeners for the crop region element.\n   * Enables dragging/moving of the region element.\n   */\n  attachRegionEvents() {\n    const eventBus = this.eventBus;\n    const self = this;\n    if (!this.regionEl) return;\n    this.regionEl.addEventListener('mousedown', onMouseDown);\n    eventBus.addEventListener('regionstart', this.onRegionMoveStart.bind(this));\n    eventBus.addEventListener('regionmove', this.onRegionMoveMoving.bind(this));\n    eventBus.addEventListener('regionend', this.onRegionMoveEnd.bind(this));\n\n    function onMouseDown(e: any) {\n      e.stopPropagation();\n      document.addEventListener('mouseup', onMouseUp);\n      document.addEventListener('mousemove', onMouseMove);\n\n      // Notify parent\n      eventBus.dispatchEvent(\n        new CustomEvent('regionstart', {\n          detail: { mouseX: e.clientX, mouseY: e.clientY },\n        }),\n      );\n    }\n\n    function onMouseMove(e: any) {\n      e.stopPropagation();\n\n      // Notify parent\n      eventBus.dispatchEvent(\n        new CustomEvent('regionmove', {\n          detail: { mouseX: e.clientX, mouseY: e.clientY },\n        }),\n      );\n    }\n\n    function onMouseUp(e: any) {\n      e.stopPropagation();\n      document.removeEventListener('mouseup', onMouseUp);\n      document.removeEventListener('mousemove', onMouseMove);\n\n      // Notify parent\n      eventBus.dispatchEvent(\n        new CustomEvent('regionend', {\n          detail: { mouseX: e.clientX, mouseY: e.clientY },\n        }),\n      );\n    }\n  }\n\n  /**\n   * Attach event listeners for the overlay element.\n   * Enables the creation of a new selection by dragging an empty area.\n   */\n  attachOverlayEvents() {\n    const SOUTHEAST_HANDLE_IDX = 4;\n    const self = this;\n    let tmpBox: any = null;\n    this.overlayEl.addEventListener('mousedown', onMouseDown);\n\n    function onMouseDown(e: any) {\n      e.stopPropagation();\n      document.addEventListener('mouseup', onMouseUp);\n      document.addEventListener('mousemove', onMouseMove);\n\n      // Calculate mouse's position in relative to the container\n      const container = self.cropperEl.getBoundingClientRect();\n      const mouseX = e.clientX - container.left;\n      const mouseY = e.clientY - container.top;\n\n      // Create new box at mouse position\n      tmpBox = self.box;\n      self.box = new Box(mouseX, mouseY, mouseX + 1, mouseY + 1);\n\n      // Activate the bottom right handle\n      self.eventBus.dispatchEvent(\n        new CustomEvent('handlestart', {\n          detail: { handle: self.handles[SOUTHEAST_HANDLE_IDX] },\n        }),\n      );\n    }\n\n    function onMouseMove(e: any) {\n      e.stopPropagation();\n      self.eventBus.dispatchEvent(\n        new CustomEvent('handlemove', {\n          detail: { mouseX: e.clientX, mouseY: e.clientY },\n        }),\n      );\n    }\n\n    function onMouseUp(e: any) {\n      e.stopPropagation();\n      document.removeEventListener('mouseup', onMouseUp);\n      document.removeEventListener('mousemove', onMouseMove);\n\n      // If the new box has no width and height, it suggests that\n      // the user had just clicked on an empty area and did not drag\n      // a new box (ie. an accidental click). In this scenario, we\n      // simply replace it with the previous box.\n      if (self.box.width() === 1 && self.box.height() === 1) {\n        self.box = tmpBox;\n        return;\n      }\n\n      self.eventBus.dispatchEvent(\n        new CustomEvent('handleend', {\n          detail: { mouseX: e.clientX, mouseY: e.clientY },\n        }),\n      );\n    }\n  }\n\n  /**\n   * EVENT HANDLER\n   * Executes when user begins dragging a handle.\n   */\n  onHandleMoveStart(e: any) {\n    let handle = e.detail.handle;\n\n    // The origin point is the point where the box is scaled from.\n    // This is usually the opposite side/corner of the active handle.\n    const originPoint = [1 - handle.position[0], 1 - handle.position[1]];\n    let [originX, originY] = this.box.getAbsolutePoint(originPoint);\n\n    this.activeHandle = { handle, originPoint, originX, originY };\n\n    // Trigger callback\n    if (this.options.onCropStart !== null) {\n      this.options.onCropStart(this.getValue());\n    }\n  }\n\n  /**\n   * EVENT HANDLER\n   * Executes on handle move. Main logic to manage the movement of handles.\n   */\n  onHandleMoveMoving(e: any) {\n    let { mouseX, mouseY } = e.detail;\n\n    // Calculate mouse's position in relative to the container\n    let container = this.cropperEl.getBoundingClientRect();\n    mouseX = mouseX - container.left;\n    mouseY = mouseY - container.top;\n\n    // Ensure mouse is within the boundaries\n    if (mouseX < 0) {\n      mouseX = 0;\n    } else if (mouseX > container.width) {\n      mouseX = container.width;\n    }\n\n    if (mouseY < 0) {\n      mouseY = 0;\n    } else if (mouseY > container.height) {\n      mouseY = container.height;\n    }\n\n    // Bootstrap helper variables\n    let origin = this.activeHandle.originPoint.slice();\n    const originX = this.activeHandle.originX;\n    const originY = this.activeHandle.originY;\n    const handle = this.activeHandle.handle;\n    const TOP_MOVABLE = handle.constraints[0] === 1;\n    const RIGHT_MOVABLE = handle.constraints[1] === 1;\n    const BOTTOM_MOVABLE = handle.constraints[2] === 1;\n    const LEFT_MOVABLE = handle.constraints[3] === 1;\n    const MULTI_AXIS = (LEFT_MOVABLE || RIGHT_MOVABLE) && (TOP_MOVABLE || BOTTOM_MOVABLE);\n\n    // Apply movement to respective sides according to the handle's\n    // constraint values.\n    let x1 = LEFT_MOVABLE || RIGHT_MOVABLE ? originX : this.box.x1;\n    let x2 = LEFT_MOVABLE || RIGHT_MOVABLE ? originX : this.box.x2;\n    let y1 = TOP_MOVABLE || BOTTOM_MOVABLE ? originY : this.box.y1;\n    let y2 = TOP_MOVABLE || BOTTOM_MOVABLE ? originY : this.box.y2;\n    x1 = LEFT_MOVABLE ? mouseX : x1;\n    x2 = RIGHT_MOVABLE ? mouseX : x2;\n    y1 = TOP_MOVABLE ? mouseY : y1;\n    y2 = BOTTOM_MOVABLE ? mouseY : y2;\n\n    // Check if the user dragged past the origin point. If it did,\n    // we set the flipped flag to true.\n    let [isFlippedX, isFlippedY] = [false, false];\n    if (LEFT_MOVABLE || RIGHT_MOVABLE) {\n      isFlippedX = LEFT_MOVABLE ? mouseX > originX : mouseX < originX;\n    }\n    if (TOP_MOVABLE || BOTTOM_MOVABLE) {\n      isFlippedY = TOP_MOVABLE ? mouseY > originY : mouseY < originY;\n    }\n\n    // If it is flipped, we swap the coordinates and flip the origin point.\n    if (isFlippedX) {\n      const tmp = x1;\n      x1 = x2;\n      x2 = tmp; // Swap x1 and x2\n      origin[0] = 1 - origin[0]; // Flip origin x point\n    }\n    if (isFlippedY) {\n      const tmp = y1;\n      y1 = y2;\n      y2 = tmp; // Swap y1 and y2\n      origin[1] = 1 - origin[1]; // Flip origin y point\n    }\n\n    // Create new box object\n    let box = new Box(x1, y1, x2, y2);\n\n    // Maintain aspect ratio\n    if (this.options.aspectRatio) {\n      const ratio = this.options.aspectRatio;\n      let isVerticalMovement = false;\n      if (MULTI_AXIS) {\n        isVerticalMovement = mouseY > box.y1 + ratio * box.width() || mouseY < box.y2 - ratio * box.width();\n      } else if (TOP_MOVABLE || BOTTOM_MOVABLE) {\n        isVerticalMovement = true;\n      }\n      const ratioMode = isVerticalMovement ? 'width' : 'height';\n      box.constrainToRatio(ratio, origin, ratioMode);\n    }\n\n    // Maintain minimum/maximum size\n    const min = this.options.minSize;\n    const max = this.options.maxSize;\n    box.constrainToSize(max.width, max.height, min.width, min.height, origin, this.options.aspectRatio);\n\n    // Constrain to boundary\n    const parentWidth = this.cropperEl.offsetWidth;\n    const parentHeight = this.cropperEl.offsetHeight;\n    box.constrainToBoundary(parentWidth, parentHeight, origin);\n\n    // Finally, update the visuals (border, handles, clipped image, etc)\n    this.box = box;\n    this.redraw();\n\n    // Trigger callback\n    if (this.options.onCropMove !== null) {\n      this.options.onCropMove(this.getValue());\n    }\n  }\n\n  /**\n   * EVENT HANDLER\n   * Executes on handle move end.\n   */\n  onHandleMoveEnd(e: any) {\n    // Trigger callback\n    if (this.options.onCropEnd !== null) {\n      this.options.onCropEnd(this.getValue());\n    }\n  }\n\n  /**\n   * EVENT HANDLER\n   * Executes when user starts moving the crop region.\n   */\n  onRegionMoveStart(e: any) {\n    let { mouseX, mouseY } = e.detail;\n\n    // Calculate mouse's position in relative to the container\n    let container = this.cropperEl.getBoundingClientRect();\n    mouseX = mouseX - container.left;\n    mouseY = mouseY - container.top;\n\n    this.currentMove = {\n      offsetX: mouseX - this.box.x1,\n      offsetY: mouseY - this.box.y1,\n    };\n\n    // Trigger callback\n    if (this.options.onCropStart !== null) {\n      this.options.onCropStart(this.getValue());\n    }\n  }\n\n  /**\n   * EVENT HANDLER\n   * Executes when user moves the crop region.\n   */\n  onRegionMoveMoving(e: any) {\n    let { mouseX, mouseY } = e.detail;\n    let { offsetX, offsetY } = this.currentMove;\n\n    // Calculate mouse's position in relative to the container\n    let container = this.cropperEl.getBoundingClientRect();\n    mouseX = mouseX - container.left;\n    mouseY = mouseY - container.top;\n\n    this.box.move(mouseX - offsetX, mouseY - offsetY);\n\n    // Ensure box is within the boundaries\n    if (this.box.x1 < 0) {\n      this.box.move(0, null);\n    }\n    if (this.box.x2 > container.width) {\n      this.box.move(container.width - this.box.width(), null);\n    }\n    if (this.box.y1 < 0) {\n      this.box.move(null, 0);\n    }\n    if (this.box.y2 > container.height) {\n      this.box.move(null, container.height - this.box.height());\n    }\n\n    // Update visuals\n    this.redraw();\n\n    // Trigger callback\n    if (this.options.onCropMove !== null) {\n      this.options.onCropMove(this.getValue());\n    }\n  }\n\n  /**\n   * EVENT HANDLER\n   * Executes when user stops moving the crop region (mouse up).\n   */\n  onRegionMoveEnd(e: any) {\n    // Trigger callback\n    if (this.options.onCropEnd !== null) {\n      this.options.onCropEnd(this.getValue());\n    }\n  }\n\n  /**\n   * Calculate the value of the crop region.\n   */\n  getValue(mode = null) {\n    if (mode === null) {\n      mode = this.options.returnMode;\n    }\n    if (mode == 'real') {\n      const actualWidth = this.imageEl.naturalWidth;\n      const actualHeight = this.imageEl.naturalHeight;\n      const { width: elementWidth, height: elementHeight } = this.imageEl.getBoundingClientRect();\n      const factorX = actualWidth / elementWidth;\n      const factorY = actualHeight / elementHeight;\n      return {\n        x: Math.round(this.box.x1 * factorX),\n        y: Math.round(this.box.y1 * factorY),\n        width: Math.round(this.box.width() * factorX),\n        height: Math.round(this.box.height() * factorY),\n      };\n    } else if (mode == 'ratio') {\n      const { width: elementWidth, height: elementHeight } = this.imageEl.getBoundingClientRect();\n      return {\n        x: round(this.box.x1 / elementWidth, 3),\n        y: round(this.box.y1 / elementHeight, 3),\n        width: round(this.box.width() / elementWidth, 3),\n        height: round(this.box.height() / elementHeight, 3),\n      };\n    } else if (mode == 'raw') {\n      return {\n        x: Math.round(this.box.x1),\n        y: Math.round(this.box.y1),\n        width: Math.round(this.box.width()),\n        height: Math.round(this.box.height()),\n      };\n    }\n  }\n\n  /**\n   * Parse user options and set default values.\n   */\n  static parseOptions(opts: any) {\n    const defaults = {\n      aspectRatio: null,\n      maxSize: { width: null, height: null },\n      minSize: { width: null, height: null },\n      startSize: { width: 100, height: 100, unit: '%' },\n      returnMode: 'real',\n      onInitialize: null,\n      onCropStart: null,\n      onCropMove: null,\n      onCropEnd: null,\n    };\n\n    // Parse aspect ratio\n    let aspectRatio = null;\n    if (opts.aspectRatio !== undefined) {\n      if (typeof opts.aspectRatio === 'number') {\n        aspectRatio = opts.aspectRatio;\n      } else if (opts.aspectRatio instanceof Array) {\n        aspectRatio = opts.aspectRatio[1] / opts.aspectRatio[0];\n      }\n    }\n\n    // Parse max width/height\n    let maxSize = null;\n    if (opts.maxSize !== undefined && opts.maxSize !== null) {\n      maxSize = {\n        width: opts.maxSize[0] || null,\n        height: opts.maxSize[1] || null,\n        unit: opts.maxSize[2] || 'px',\n      };\n    }\n\n    // Parse min width/height\n    let minSize = null;\n    if (opts.minSize !== undefined && opts.minSize !== null) {\n      minSize = {\n        width: opts.minSize[0] || null,\n        height: opts.minSize[1] || null,\n        unit: opts.minSize[2] || 'px',\n      };\n    }\n\n    // Parse start size\n    let startSize = null;\n    if (opts.startSize !== undefined && opts.startSize !== null) {\n      startSize = {\n        width: opts.startSize[0] || null,\n        height: opts.startSize[1] || null,\n        unit: opts.startSize[2] || '%',\n      };\n    }\n\n    // Parse callbacks\n    let onInitialize = null;\n    if (typeof opts.onInitialize === 'function') {\n      onInitialize = opts.onInitialize;\n    }\n\n    let onCropStart = null;\n    if (typeof opts.onCropStart === 'function') {\n      onCropStart = opts.onCropStart;\n    }\n\n    let onCropEnd = null;\n    if (typeof opts.onCropEnd === 'function') {\n      onCropEnd = opts.onCropEnd;\n    }\n\n    let onCropMove = null;\n    if (typeof opts.onUpdate === 'function') {\n      // DEPRECATED: onUpdate is deprecated to create a more uniform\n      // callback API, such as: onCropStart, onCropMove, onCropEnd\n      console.warn(\n        'Croppr.js: `onUpdate` is deprecated and will be removed in the next major release. Please use `onCropMove` or `onCropEnd` instead.',\n      );\n      onCropMove = opts.onUpdate;\n    }\n    if (typeof opts.onCropMove === 'function') {\n      onCropMove = opts.onCropMove;\n    }\n\n    // Parse returnMode value\n    let returnMode = null;\n    if (opts.returnMode !== undefined) {\n      const s = opts.returnMode.toLowerCase();\n      if (['real', 'ratio', 'raw'].indexOf(s) === -1) {\n        throw 'Invalid return mode.';\n      }\n      returnMode = s;\n    }\n\n    // Create function to convert % values to pixels\n    const convertToPixels = function (this: any, container: any) {\n      const width = container.offsetWidth;\n      const height = container.offsetHeight;\n\n      // Convert sizes\n      const sizeKeys = ['maxSize', 'minSize', 'startSize'];\n      for (let i = 0; i < sizeKeys.length; i++) {\n        const key = sizeKeys[i];\n        if (this[key] !== null) {\n          if (this[key].unit == '%') {\n            if (this[key].width !== null) {\n              this[key].width = (this[key].width / 100) * width;\n            }\n            if (this[key].height !== null) {\n              this[key].height = (this[key].height / 100) * height;\n            }\n          }\n          delete this[key].unit;\n        }\n      }\n    };\n\n    const defaultValue = (v: any, d: any) => (v !== null ? v : d);\n    return {\n      aspectRatio: defaultValue(aspectRatio, defaults.aspectRatio),\n      maxSize: defaultValue(maxSize, defaults.maxSize),\n      minSize: defaultValue(minSize, defaults.minSize),\n      startSize: defaultValue(startSize, defaults.startSize),\n      returnMode: defaultValue(returnMode, defaults.returnMode),\n      onInitialize: defaultValue(onInitialize, defaults.onInitialize),\n      onCropStart: defaultValue(onCropStart, defaults.onCropStart),\n      onCropMove: defaultValue(onCropMove, defaults.onCropMove),\n      onCropEnd: defaultValue(onCropEnd, defaults.onCropEnd),\n      convertToPixels: convertToPixels,\n    };\n  }\n}\n\n/**\n * HELPER FUNCTIONS\n */\n\nfunction round(value: any, decimals: any) {\n  return Number(Math.round((value + 'e' + decimals) as any) + 'e-' + decimals);\n}\n","/**\n * Croppr.js\n * https://github.com/jamesssooi/Croppr.js\n *\n * A JavaScript image cropper that's lightweight, awesome, and has\n * zero dependencies.\n *\n * (C) 2017 James Ooi. Released under the MIT License.\n */\n\nimport CropprCore from \"./core\";\n\n/**\n * This class is a wrapper for CropprCore that merely implements the main\n * interfaces for the Croppr instance. Look into CropprCore for all the\n * main logic.\n */\nexport default class Croppr extends CropprCore {\n  /**\n   * @constructor\n   * Calls the CropprCore's constructor.\n   */\n  constructor(element: any, options: any, _deferred = false) {\n    super(element, options, _deferred);\n  }\n\n  /**\n   * Gets the value of the crop region.\n   * @param {String} [mode] Which mode of calculation to use: 'real', 'ratio' or\n   *      'raw'.\n   */\n  getValue(mode?: any) {\n    return super.getValue(mode);\n  }\n\n  /**\n   * Changes the image src.\n   * @param {String} src\n   */\n  setImage(src: any) {\n    return super.setImage(src);\n  }\n\n  /**\n   * Destroys the Croppr instance\n   */\n  destroy() {\n    return super.destroy();\n  }\n\n  /**\n   * Moves the crop region to a specified coordinate.\n   * @param {Number} x\n   * @param {Number} y\n   */\n  moveTo(x: any, y: any) {\n    this.box.move(x, y);\n    this.redraw();\n\n    // Call the callback\n    if (this.options.onCropEnd !== null) {\n      this.options.onCropEnd(this.getValue());\n    }\n    return this;\n  }\n\n  /**\n   * Resizes the crop region to a specified width and height.\n   * @param {Number} width\n   * @param {Number} height\n   * @param {Array} origin The origin point to resize from.\n   *      Defaults to [0.5, 0.5] (center).\n   */\n  resizeTo(width: any, height: any, origin = [0.5, 0.5]) {\n    this.box.resize(width, height, origin);\n\n    //////////////////////////////////////////////////////////////////\n    const parentWidth = this.cropperEl.offsetWidth;\n    const parentHeight = this.cropperEl.offsetHeight;\n    this.box.constrainToBoundary(parentWidth, parentHeight, [0.5, 0.5]);\n    ///////////////////////////////////////////////////////////////////\n    this.redraw();\n\n    // Call the callback\n    if (this.options.onCropEnd !== null) {\n      this.options.onCropEnd(this.getValue());\n    }\n    return this;\n  }\n\n  /**\n   * Scale the crop region by a factor.\n   * @param {Number} factor\n   * @param {Array} origin The origin point to resize from.\n   *      Defaults to [0.5, 0.5] (center).\n   */\n  scaleBy(factor: any, origin = [0.5, 0.5]) {\n    this.box.scale(factor, origin);\n    this.redraw();\n\n    // Call the callback\n    if (this.options.onCropEnd !== null) {\n      this.options.onCropEnd(this.getValue());\n    }\n    return this;\n  }\n\n  /**\n   * Resets the crop region to the initial settings.\n   */\n  reset(newOptions?: any) {\n    if (newOptions) {\n      this.options = { ...this.options, newOptions };\n    }\n    this.box = this.initializeBox(this.options);\n    // console.log('🚀 ~ file: croppr.ts ~ line 110 ~ Croppr ~ reset ~ this.box', this.box);\n    this.redraw();\n\n    // Call the callback\n    if (this.options.onCropEnd !== null) {\n      this.options.onCropEnd(this.getValue());\n    }\n    return this;\n  }\n\n  enableVisibility(state: boolean) {\n    let croppContainer: HTMLElement | any =\n      document.querySelector(\".croppr-container\");\n    if (!croppContainer) throw new Error(\"THere is not any croppr\");\n    if (state) {\n      croppContainer.style.display = \"block\";\n    } else {\n      croppContainer.style.display = \"none\";\n    }\n  }\n}\n","import { Component, Input, OnInit, AfterViewInit, Output, EventEmitter, OnDestroy, HostListener } from '@angular/core';\nimport Croppr from '../../functions/croppr/index';\n\n@Component({\n  selector: 'lib-cropper-wrapper',\n  templateUrl: './cropper-wrapper.component.html',\n  styleUrls: ['./cropper-wrapper.component.scss'],\n})\nexport class CropperWrapperComponent implements OnInit, AfterViewInit, OnDestroy {\n  imageSrc: string = '';\n  croppr: Croppr | undefined | null = null;\n  croppSize: { width: number; height: number } = { width: 150, height: 150 };\n\n  @HostListener('document:keydown.Control', ['$event'])\n  onKeyDown() {\n    if (!this.croppr) return;\n    this.croppr.options.aspectRatio = 1.0;\n  }\n  @HostListener('document:keyup.Control', ['$event'])\n  onKeyUp() {\n    if (!this.croppr) return;\n    this.croppr.options.aspectRatio = null;\n  }\n\n  @Input() set _imageSrc(value: string) {\n    this.imageSrc = value as string;\n  }\n\n  @Input() set setSize(value: any) {\n    this.croppSize = value;\n    if (this.croppr) this.croppr.resizeTo(this.croppSize.width, this.croppSize.height);\n  }\n\n  @Output() croppUpdate: EventEmitter<{ x: number; y: number; width: number; height: number }> = new EventEmitter<{\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n  }>();\n\n  constructor() {}\n\n  ngOnInit(): void {}\n  ngAfterViewInit(): void {\n    this.croppr = new Croppr('#croppr', {\n      minSize: [32, 32, 'px'],\n      startSize: [this.croppSize.width, this.croppSize.height, 'px'],\n      onInitialize: (data: Croppr) => {\n        this.croppUpdate.emit(data.getValue());\n      },\n      onCropEnd: (data: { x: number; y: number; width: number; height: number }) => {\n        this.croppUpdate.emit(data);\n      },\n    });\n  }\n\n  ngOnDestroy(): void {\n    if (!this.croppr) return;\n    this.croppr.destroy();\n  }\n}\n","<img id=\"image-full\" [src]=\"this.imageSrc\" id=\"croppr\" />\n","import { Component, Input, OnInit, Output, EventEmitter, ChangeDetectorRef, AfterViewInit } from '@angular/core';\nimport { convertImageUsingCanvas, dragElement, MAX_BUFFER_UNDO_MEMORY, saveState } from '../../functions/image-processing';\nimport { IBasicFilterState, IState } from '../../models/index.models';\n\n// const Croppr = require('../../services/croppr-service')\n@Component({\n  selector: 'lib-edit-image',\n  templateUrl: './edit-image.component.html',\n  styleUrls: ['./edit-image.component.scss'],\n})\nexport class EditImageComponent implements OnInit {\n  @Input() labels: any;\n  @Input() imageSrc: string = '';\n  @Input() color: string = '';\n  controlPanelIndex: number = 0;\n  showCrop: boolean = false;\n  observer: ResizeObserver | undefined | null = null;\n  allFormats = ['webp', 'jpeg', 'png'];\n\n  @Input() initialState: IState | null | any = {};\n\n  state: IState = {\n    quality: 92,\n    maxHeight: 1000,\n    maxWidth: 1000,\n    cropHeight: 150,\n    cropWidth: 150,\n    maintainAspectRatio: true,\n    format: 'jpeg',\n    arrayCopiedImages: [],\n    originImageSrc: '',\n  };\n  croppState: { x: number; y: number; width: number; height: number } | undefined | null;\n  croppSize: { width: number; height: number } = { width: 150, height: 150 };\n  isMobile = false;\n\n  @Output() closeModal = new EventEmitter<{ state: IState; imageSrc: string } | null | undefined>();\n\n  constructor(private chRef: ChangeDetectorRef) {}\n\n  ngOnInit() {\n    this.state = JSON.parse(JSON.stringify({ ...this.state, ...this.initialState }));\n    this.isMobile = window.innerWidth < 800;\n  }\n\n  onCloseEditPanel(saveChanges: boolean = false) {\n    if (this.observer instanceof ResizeObserver) {\n      let imageCroperElRef: any = document.getElementById('image-croper');\n      let imageFullElRef: any = document.getElementById('image-full');\n      this.observer.unobserve(imageCroperElRef);\n      this.observer.unobserve(imageFullElRef);\n    }\n    this.showCrop = false;\n    if (saveChanges) this.closeModal.next({ state: this.state, imageSrc: this.imageSrc });\n    else this.closeModal.next(null);\n  }\n\n  onControlPanelIndexChange(idex: number) {\n    this.controlPanelIndex = idex;\n  }\n\n  calculateSize() {\n    if (this.imageSrc && this.imageSrc.length) {\n      return Math.ceil(((3 / 4) * this.imageSrc.length) / 1024);\n    } else {\n      return \"\";\n    }\n  }\n\n  async onChangeSize(changeHeight = false) {\n    try {\n      this.imageSrc = await convertImageUsingCanvas(this.state.originImageSrc, changeHeight, this.state);\n      this.chRef.markForCheck();\n    } catch (error) {\n      console.error('🚀 ~ file: edit-image.component.ts ~ line 76 ~ EditImageComponent ~ onChangeSize ~ error', error);\n      this.chRef.markForCheck();\n    }\n  }\n\n  async onChangeQuality() {\n    try {\n      this.imageSrc = await convertImageUsingCanvas(this.state.originImageSrc, false, this.state);\n      this.chRef.markForCheck();\n    } catch (error) {\n      console.error('🚀 ~ file: edit-image.component.ts ~ line 86 ~ EditImageComponent ~ onChangeQuality ~ error', error);\n      this.chRef.markForCheck();\n    }\n  }\n\n  async onChangeFormat() {\n    try {\n      this.imageSrc = await convertImageUsingCanvas(this.state.originImageSrc, false, this.state);\n      this.chRef.markForCheck();\n    } catch (error) {\n      console.error('🚀 ~ file: edit-image.component.ts ~ line 98 ~ EditImageComponent ~ onChangeFormat ~ error', error);\n      this.chRef.markForCheck();\n    }\n  }\n\n  async onRestore() {\n    try {\n      if (this.state.arrayCopiedImages.length > 1) {\n        this.state.arrayCopiedImages.pop();\n        let newValue = this.state.arrayCopiedImages[this.state.arrayCopiedImages.length - 1];\n        this.state = {\n          ...this.state,\n          maxHeight: newValue.height,\n          maxWidth: newValue.width,\n          quality: newValue.quality,\n          format: newValue.format,\n          originImageSrc: newValue.originImageSrc,\n          basicFilters: newValue.basicFilters as IBasicFilterState,\n        };\n        this.imageSrc = newValue.lastImage;\n        this.chRef.markForCheck();\n      }\n    } catch (e) {\n      console.error('🚀 ~ file: edit-image.component.ts ~ line 126 ~ EditImageComponent ~ onRestore ~ e', e);\n    }\n  }\n\n  onCroppUpdate(data: { x: number; y: number; width: number; height: number }) {\n    this.croppState = data;\n    this.state.cropHeight = data.height;\n    this.state.cropWidth = data.width;\n  }\n\n  onChangeCrop() {\n    this.croppSize = { width: this.state.cropWidth, height: this.state.cropHeight };\n  }\n\n  onCrop() {\n    // const dataHolderRect = document.querySelector('.croppr-container').getBoundingClientRect();\n    const canvas = document.createElement('canvas');\n    return new Promise((resolve, reject) => {\n      let ctx: CanvasRenderingContext2D = canvas.getContext('2d') as CanvasRenderingContext2D;\n      let image = new Image();\n      image.src = this.imageSrc;\n      image.onload = () => {\n        // let ratio = image.height / dataHolderRect.height;\n        let newWidth = this.croppState?.width;\n        let newHeight = this.croppState?.height;\n        canvas.height = newHeight as number;\n        canvas.width = newWidth as number;\n        ctx.drawImage(\n          image,\n          Math.abs(this.croppState?.x || 0),\n          Math.abs(this.croppState?.y || 0),\n          this.croppState?.width || 0,\n          this.croppState?.height || 0,\n          0,\n          0,\n          this.croppState?.width || 0,\n          this.croppState?.height || 0,\n        );\n        return resolve(canvas.toDataURL(`image/${this.state.format}`, this.state.quality));\n      };\n      image.onerror = (e) => {\n        reject(e);\n      };\n    })\n      .then((dataUri: any) => {\n        this.imageSrc = dataUri;\n        this.showCrop = false;\n        this.state.maxWidth = canvas.width;\n        this.state.maxHeight = canvas.height;\n        this.state.originImageSrc = dataUri as string;\n        this.state.cropHeight = 150;\n        this.state.cropWidth = 150;\n        saveState(this.state, dataUri as string);\n        this.croppSize = { width: 150, height: 150 };\n        this.chRef.markForCheck();\n      })\n      .catch((e) => {\n        console.error(e);\n      });\n  }\n\n  async onChangeFilters(data: IBasicFilterState) {\n    try {\n      if (!this.state.basicFilters) {\n        this.state.basicFilters = data;\n      } else {\n        this.state.basicFilters = { ...this.state.basicFilters, ...data };\n      }\n      this.imageSrc = await convertImageUsingCanvas(this.state.originImageSrc, false, this.state);\n      this.chRef.markForCheck();\n    } catch (e) {\n      console.error('🚀 ~ file: edit-image.component.ts ~ line 250 ~ EditImageComponent ~ onChangeFilters ~ e', e);\n    }\n  }\n\n  // async onRotate(deg = 90) {\n  //   try {\n  //     this.imageSrc = await convertImageUsingCanvas(this.state.originImageSrc, false, this.state, { rotate: deg });\n  //     this.chRef.markForCheck();\n  //   } catch (e) {\n  //     console.log('🚀 ~ file: edit-image.component.ts ~ line 250 ~ EditImageComponent ~ onRotate ~ e', e);\n  //   }\n  // }\n}\n","<div id=\"popup\" class=\"popup\">\n  <div\n    style=\"\n      flex-direction: row;\n      box-sizing: border-box;\n      display: flex;\n      place-content: center flex-end;\n      align-items: center;\n      padding: 0px 16px;\n    \"\n  >\n    <button class=\"icon-btn\" (click)=\"onCloseEditPanel(false)\">\n      <span class=\"material-icons\">clear</span>\n    </button>\n  </div>\n\n  <div class=\"image-container\">\n    <div class=\"image-holder-full\">\n      <img id=\"image-full\" [src]=\"this.imageSrc\" [style.display]=\"showCrop ? 'none' : ''\" />\n\n      <lib-cropper-wrapper\n        [setSize]=\"this.croppSize\"\n        (croppUpdate)=\"onCroppUpdate($event)\"\n        [_imageSrc]=\"this.imageSrc\"\n        *ngIf=\"showCrop\"\n      ></lib-cropper-wrapper>\n    </div>\n\n    <div class=\"control-panel\">\n      <lib-tabs [color]=\"this.color\" [_labels]=\"['Basic', 'Filters']\" (indexActivatedChange)=\"onControlPanelIndexChange($event)\">\n        <ng-container *ngIf=\"controlPanelIndex == 0\">\n          <ng-container *ngIf=\"!isMobile || (isMobile && !showCrop)\">\n            <div style=\"display: flex; width: 100%; justify-content: space-between\">\n              <p class=\"item-panel\">{{ labels['Quality'] }}</p>\n              <p class=\"item-panel\">{{ this.state.quality + '%' }}</p>\n            </div>\n\n            <div style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\">\n              <input\n                [readonly]=\"showCrop\"\n                [disabled]=\"showCrop\"\n                class=\"input-range\"\n                (change)=\"onChangeQuality()\"\n                [ngStyle]=\"{ maxWidth: '100%', width: '100%', color: color }\"\n                [(ngModel)]=\"this.state.quality\"\n                type=\"range\"\n                min=\"1\"\n                max=\"100\"\n                value=\"50\"\n              />\n            </div>\n\n            <div class=\"item-panel\" style=\"display: flex; width: 100%; justify-content: space-between\">\n              {{ labels['Max dimensions'] }}\n              <div style=\"display: flex; align-items: center\">\n                <input\n                  [readonly]=\"showCrop\"\n                  [disabled]=\"showCrop\"\n                  type=\"checkbox\"\n                  [(ngModel)]=\"this.state.maintainAspectRatio\"\n                  [style.color]=\"color\"\n                />\n                <span class=\"caption\">{{ labels['aspect-ratio'] }}</span>\n              </div>\n            </div>\n\n            <div\n              style=\"\n                margin-top: 8px !important;\n                flex-flow: row wrap;\n                box-sizing: border-box;\n                display: flex;\n                place-content: flex-start space-between;\n                align-items: flex-start;\n              \"\n            >\n              <div class=\"form-field\" style=\"max-width: 48%; width: 48%\">\n                <label>{{ labels['max-width(px)'] }}</label>\n                <input\n                  [readonly]=\"showCrop\"\n                  [disabled]=\"showCrop\"\n                  (change)=\"onChangeSize(false)\"\n                  placeholder=\"{{ labels['max-width(px)'] }}\"\n                  [(ngModel)]=\"this.state.maxWidth\"\n                  type=\"number\"\n                  [min]=\"0\"\n                  [max]=\"2000\"\n                />\n              </div>\n\n              <div class=\"form-field\" style=\"max-width: 48%; width: 48%\">\n                <label>{{ labels['max-height(px)'] }}</label>\n                <input\n                  [readonly]=\"showCrop\"\n                  [disabled]=\"showCrop\"\n                  (change)=\"onChangeSize(true)\"\n                  placeholder=\"{{ labels['max-height(px)'] }}\"\n                  [(ngModel)]=\"this.state.maxHeight\"\n                  type=\"number\"\n                  [min]=\"0\"\n                  [max]=\"2000\"\n                />\n              </div>\n            </div>\n\n            <p class=\"item-panel\">{{ labels['Format'] }}</p>\n            <div\n              style=\"\n                margin-top: 8px !important;\n                flex-direction: row;\n                box-sizing: border-box;\n                display: flex;\n                place-content: flex-start;\n                align-items: flex-start;\n              \"\n            >\n              <div class=\"form-field\" style=\"width: 100%\">\n                <select [disabled]=\"showCrop\" [(ngModel)]=\"this.state.format\" (change)=\"onChangeFormat()\">\n                  <option *ngFor=\"let formatItem of allFormats\" [value]=\"formatItem\">{{ formatItem }}</option>\n                </select>\n              </div>\n            </div>\n          </ng-container>\n          <!-- <p class=\"item-panel\">{{ labels['Rotate'] }}</p>\n\n          <div\n            style=\"\n              margin-top: 8px !important;\n              flex-direction: row;\n              box-sizing: border-box;\n              display: flex;\n              place-content: flex-start;\n              align-items: flex-start;\n            \"\n          >\n            <button [disabled]=\"showCrop\" class=\"icon-btn\" style=\"padding-left: 0px\" (click)=\"onRotate(90)\">\n              <span class=\"material-icons\"> rotate_left </span>\n            </button>\n            <button [disabled]=\"showCrop\" class=\"icon-btn\" (click)=\"onRestore()\" (click)=\"onRotate(-90)\">\n              <span class=\"material-icons\"> rotate_right </span>\n            </button>\n          </div>\n\n          <hr />\n          <br /> -->\n\n          <div style=\"display: flex; justify-content: space-between; margin-bottom: 8px\">\n            <span style=\"display: flex; align-items: center\">\n              <input type=\"checkbox\" [(ngModel)]=\"showCrop\" [style.color]=\"color\" style=\"margin-bottom: 3px\" />\n              <span class=\"item-panel\" style=\"margin-left: 4px\">{{ labels['Crop'] }}</span>\n            </span>\n          </div>\n\n          <ng-container *ngIf=\"showCrop\">\n            <div\n              style=\"\n                margin-top: 8px !important;\n                flex-flow: row wrap;\n                box-sizing: border-box;\n                display: flex;\n                place-content: flex-start space-between;\n                align-items: flex-start;\n              \"\n            >\n              <div class=\"form-field\" style=\"max-width: 48%; width: 48%; margin-bottom: 8px\">\n                <label>{{ labels['width(px)'] }}</label>\n                <input\n                  (change)=\"onChangeCrop()\"\n                  placeholder=\"{{ labels['width(px)'] }}\"\n                  [(ngModel)]=\"state.cropWidth\"\n                  type=\"number\"\n                  [min]=\"0\"\n                  [max]=\"2000\"\n                />\n              </div>\n              <div class=\"form-field\" style=\"max-width: 48%; width: 48%; margin-bottom: 8px\">\n                <label>{{ labels['height(px)'] }}</label>\n                <input\n                  (change)=\"onChangeCrop()\"\n                  placeholder=\"{{ labels['height(px)'] }}\"\n                  [(ngModel)]=\"state.cropHeight\"\n                  type=\"number\"\n                  [min]=\"0\"\n                  [max]=\"2000\"\n                />\n              </div>\n            </div>\n\n            <p style=\"margin-bottom: 4px !important\">\n              <button title=\"Cut the image\" class=\"icon-btn\" (click)=\"onCrop()\">\n                <span class=\"material-icons\"> crop </span>\n              </button>\n            </p>\n          </ng-container>\n        </ng-container>\n        <ng-container *ngIf=\"controlPanelIndex == 1\">\n          <lib-basic-filters\n            [filterState]=\"this.state.basicFilters\"\n            (changeFilter)=\"onChangeFilters($event)\"\n            [labels]=\"this.labels\"\n            [color]=\"this.color\"\n          ></lib-basic-filters>\n        </ng-container>\n      </lib-tabs>\n\n      <button\n        title=\"{{ labels['Undo'] }}\"\n        [disabled]=\"this.state.arrayCopiedImages.length <= 1\"\n        style=\"position: absolute; right: 10px; top: 30px\"\n        class=\"icon-btn\"\n        (click)=\"onRestore()\"\n      >\n        <span class=\"material-icons\"> refresh </span>\n      </button>\n      <div\n        style=\"\n          flex-direction: row;\n          box-sizing: border-box;\n          display: flex;\n          place-content: center space-between;\n          align-items: center;\n          margin-top: 8px;\n        \"\n      >\n        <button class=\"save-btn\" (click)=\"onCloseEditPanel(true)\">{{ labels['Save'] }}</button>\n\n        <p\n          *ngIf=\"this.calculateSize()\"\n          class=\"caption image-caption\"\n          [ngStyle]=\"{\n            color: this.calculateSize() > 120 ? '#f44336' : 'unset',\n            fontWeight: this.calculateSize() > 120 ? '500' : 'unset'\n          }\"\n        >\n          size: {{ this.calculateSize() }}Kb &nbsp; {{ this.state.format }}\n        </p>\n      </div>\n    </div>\n  </div>\n</div>\n","import {\n  Component,\n  OnInit,\n  Input,\n  Output,\n  EventEmitter,\n  ViewEncapsulation,\n  ViewChild,\n  ElementRef,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { convertImageUsingCanvas } from './functions/image-processing';\nimport { ImagePickerConf, IState } from './models/index.models';\nimport labelEs from './i18n/es.json';\nimport labelEn from './i18n/en.json';\nimport labelFr from './i18n/fr.json';\nimport labelDe from './i18n/de.json';\n\n@Component({\n  selector: 'ngp-image-picker',\n  templateUrl: './ngp-image-picker.component.html',\n  styleUrls: ['./ngp-image-picker.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgpImagePickerComponent implements OnInit {\n  config: ImagePickerConf = {\n    language: 'en',\n    objectFit: 'cover',\n    hideDeleteBtn: false,\n    hideDownloadBtn: false,\n    hideEditBtn: false,\n    hideAddBtn: false,\n  };\n\n  state: IState = {\n    quality: 92,\n    maxHeight: 1000,\n    maxWidth: 1000,\n    cropHeight: 150,\n    cropWidth: 150,\n    maintainAspectRatio: true,\n    format: 'jpeg',\n    arrayCopiedImages: [],\n    originImageSrc: '',\n  };\n  imageSrc: any;\n  loadImage = false;\n  fileType: string = '';\n  urlImage: string = '';\n  uuidFilePicker = Date.now().toString(20);\n  showEditPanel = false;\n  imageName = 'download';\n  labels: any = labelEn;\n  arrayCopiedImages: any[] = [];\n\n  @Input() color: string = '#1e88e5';\n\n  @Input() set _imageSrc(value: any) {\n    if (value) {\n      this.parseToBase64(value)\n        .then((dataUri) => {\n          this.imageSrc = dataUri;\n          this.state.originImageSrc = value;\n          this.state.arrayCopiedImages.push({\n            lastImage: dataUri,\n            width: this.state.maxWidth,\n            height: this.state.maxHeight,\n            quality: this.state.quality,\n            format: this.state.format,\n            originImageSrc: value,\n          });\n          this.$imageOriginal.next(this.state.originImageSrc);\n          this.loadImage = true;\n          this.chRef.markForCheck();\n        })\n        .catch((e) => {\n          console.error('!!!!ERROR: ', e);\n        });\n    } else {\n      this.imageSrc = null;\n      this.state.originImageSrc = null;\n      this.loadImage = false;\n      this.state.arrayCopiedImages = [];\n      this.$imageOriginal.next(null);\n      this.state = {\n        ...this.state,\n        format: 'jpeg',\n        maxHeight: 1000,\n        maxWidth: 1000,\n        cropHeight: 150,\n        cropWidth: 150,\n        maintainAspectRatio: true,\n      };\n      this.showEditPanel = false;\n      this.chRef.markForCheck();\n    }\n  }\n\n  @Input() set _config(value: any) {\n    this.processConfig(value);\n  }\n\n  @ViewChild('imagePicker', { static: false }) imagePicker: ElementRef | null | undefined = null;\n  @Output() $imageChanged: EventEmitter<any> = new EventEmitter<any>();\n  @Output() $imageOriginal: EventEmitter<any> = new EventEmitter<any>();\n\n  constructor(private chRef: ChangeDetectorRef) {}\n\n  ngOnInit(): void {\n    this.appendLinkIconsToHead();\n  }\n\n  appendLinkIconsToHead() {\n    let head: HTMLElement = document.head;\n    let linkIcons: HTMLElement | null | undefined = head.querySelector('#ngp-image-picker-icons-id') as HTMLElement;\n    if (linkIcons) return;\n    let link = document.createElement('link');\n    link.href = 'https://fonts.googleapis.com/icon?family=Material+Icons';\n    link.rel = 'stylesheet';\n    link.id = 'ngp-image-picker-icons-id';\n    head.appendChild(link);\n  }\n\n  onUpload(event: any) {\n    event.preventDefault();\n    this.imagePicker?.nativeElement.click();\n  }\n\n  handleFileSelect(evt: any) {\n    const files = evt.target?.files;\n    if (files) {\n      const file = files[0];\n\n      this.imageName = file.name.split('.')[0];\n      this.fileType = file.type;\n      if (!this.fileType.includes('image')) return;\n      this.urlImage = `data:${file.type};base64,`;\n      if (file) {\n        this.state.format = this.fileType.split('image/')[1];\n        const reader = new FileReader();\n        reader.onload = this.handleReaderLoaded.bind(this);\n        reader.readAsBinaryString(file);\n      }\n    }\n  }\n\n  async handleReaderLoaded(readerEvt: any) {\n    const binaryString = readerEvt.target.result;\n    const base64textString = btoa(binaryString);\n    this.state.originImageSrc = this.urlImage + base64textString;\n    if (this.config.compressInitial) {\n      this.state = {\n        ...this.state,\n        quality: Math.min(this.config.compressInitial || 92, 100),\n        maintainAspectRatio: true,\n        format: 'jpeg',\n      };\n      this.imageSrc = await convertImageUsingCanvas(this.urlImage + base64textString, false, this.state, { getDimFromImage: true });\n    } else {\n      this.imageSrc = this.urlImage + base64textString;\n      let img = document.createElement('img');\n      img.src = this.imageSrc;\n      img.onload = () => {\n        this.state.arrayCopiedImages = [];\n        this.state.maxHeight = img.height;\n        this.state.maxWidth = img.width;\n        this.state.arrayCopiedImages.push({\n          lastImage: this.imageSrc,\n          width: img.width,\n          height: img.height,\n          quality: this.state.quality,\n          format: this.state.format,\n          originImageSrc: this.state.originImageSrc as string,\n        });\n      };\n    }\n    this.$imageChanged.next(this.imageSrc);\n    this.loadImage = true;\n    this.chRef.markForCheck();\n  }\n\n  onOpenEditPanel() {\n    this.showEditPanel = true;\n  }\n\n  onCloseEditPanel(data: any) {\n    if (data) {\n      this.state = data.state;\n      this.imageSrc = data.imageSrc;\n      this.$imageChanged.next(this.imageSrc);\n    }\n    this.showEditPanel = false;\n  }\n\n  parseToBase64(imageUrl: string) {\n    let types = imageUrl.split('.');\n    let type = types[types.length - 1];\n    if (type && (type == 'png' || type == 'jpeg' || type == 'webp')) {\n      type = type;\n    } else {\n      type = 'jpeg';\n    }\n\n    this.state = {\n      ...this.state,\n      format: type,\n    };\n\n    return new Promise((resolve, reject) => {\n      let img: HTMLImageElement = new window.Image()\n      img.crossOrigin = \"Anonymous\"\n      this.state = {\n        ...this.state,\n        maxHeight: img.height,\n        maxWidth: img.width,\n      };\n      img.onload = (e) => {\n        let canvas = document.createElement('canvas');\n        let ctx = canvas.getContext('2d');\n        if (!ctx) return;\n        let ratio = 1.0;\n        canvas.width = img.width * ratio;\n        canvas.height = img.height * ratio;\n        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n        let dataURI = canvas.toDataURL(`image/${type}`, this.state.quality);\n        return resolve({\n          dataUri: dataURI,\n          width: canvas.width,\n          height: canvas.height,\n        });\n      };\n      img.onerror = (e: any) => {\n        return reject(e.message || `Error loading the src = ${imageUrl}`);\n      };\n      img.src = imageUrl;\n    }).then((data: any) => {\n      this.state = {\n        ...this.state,\n        maxHeight: data.height,\n        maxWidth: data.width,\n      };\n      return data.dataUri;\n    });\n  }\n\n  processConfig(value: ImagePickerConf) {\n    if (value && value.constructor == Object) {\n      this.config = { ...this.config, ...value };\n      if (value.language != undefined) {\n        if (value.language == 'en') {\n          this.labels = { ...labelEn };\n        }\n        if (value.language == 'es') {\n          this.labels = { ...labelEs };\n        }\n        if (value.language == 'fr') {\n          this.labels = { ...labelFr };\n        }\n        if (value.language == 'de') {\n          this.labels = { ...labelDe };\n        }\n      }\n    }\n  }\n\n  calculateSize() {\n    if (this.imageSrc && this.imageSrc.length) {\n      return Math.ceil(((3 / 4) * this.imageSrc.length) / 1024);\n    } else {\n      return 0;\n    }\n  }\n\n  ////////////////////////////////////////////////\n\n  onRemove() {\n    this.imageSrc = null;\n    this.loadImage = false;\n    this.$imageOriginal.next(null);\n    this.$imageChanged.next(null);\n    this.state = {\n      ...this.state,\n      originImageSrc: '',\n      format: 'jpeg',\n      maxHeight: 1000,\n      maxWidth: 1000,\n      cropHeight: 150,\n      cropWidth: 150,\n      maintainAspectRatio: true,\n      arrayCopiedImages: [],\n      basicFilters: undefined,\n      quality: 92,\n    };\n    this.showEditPanel = false;\n  }\n}\n","<div *ngIf=\"!loadImage\" class=\"place-image\">\n  <div\n    class=\"image-holder\"\n    [ngStyle]=\"{\n      width: this.config.width,\n      height: this.config.height,\n      borderRadius: this.config.borderRadius,\n      aspectRatio: this.config.aspectRatio\n    }\"\n  >\n    <button title=\"{{ labels['Upload a image'] }}\" class=\"icon-btn image-upload-btn\" (click)=\"onUpload($event)\">\n      <!--  <span class=\"material-icons\">add_a_photo</mat-icon> -->\n      <span class=\"material-icons\">add_a_photo</span>\n    </button>\n\n    <input #imagePicker type=\"file\" style=\"display: none\" [id]=\"'filePicker-' + this.uuidFilePicker\" (change)=\"handleFileSelect($event)\" />\n  </div>\n</div>\n<div *ngIf=\"loadImage\" class=\"place-image\">\n  <div\n    class=\"image-holder-loaded\"\n    [ngStyle]=\"{\n      width: this.config.width,\n      height: this.config.height,\n      borderRadius: this.config.borderRadius,\n      aspectRatio: this.config.aspectRatio\n    }\"\n  >\n    <img\n      [src]=\"this.imageSrc\"\n      alt=\"image-loaded\"\n      [ngStyle]=\"{ borderRadius: this.config.borderRadius, objectFit: this.config.objectFit }\"\n    />\n    <input #imagePicker type=\"file\" style=\"display: none\" [id]=\"'filePicker-' + this.uuidFilePicker\" (change)=\"handleFileSelect($event)\" />\n  </div>\n  <p\n    *ngIf=\"this.calculateSize()\"\n    class=\"caption image-caption\"\n    [ngStyle]=\"{\n      color: this.calculateSize() > 120 ? '#f44336' : 'unset',\n      fontWeight: this.calculateSize() > 120 ? '500' : 'unset'\n    }\"\n  >\n    size: {{ this.calculateSize() }}Kb &nbsp; {{ this.state.format }}\n  </p>\n\n  <div\n    style=\"flex-direction: row; box-sizing: border-box; display: flex; place-content: flex-start; align-items: flex-start\"\n    class=\"editing-bar-btn\"\n  >\n    <button\n      class=\"icon-btn\"\n      id=\"upload-img\"\n      *ngIf=\"!this.config.hideAddBtn\"\n      title=\"{{ labels['Upload a image'] }}\"\n      (click)=\"onUpload($event)\"\n    >\n      <span class=\"material-icons\">add_a_photo</span>\n    </button>\n    <button\n      class=\"icon-btn\"\n      id=\"edit-img\"\n      *ngIf=\"!this.config.hideEditBtn\"\n      title=\"{{ labels['Open the editor panel'] }}\"\n      (click)=\"onOpenEditPanel()\"\n    >\n      <span class=\"material-icons\">edit</span>\n    </button>\n    <a\n      id=\"download-img\"\n      *ngIf=\"!this.config.hideDownloadBtn\"\n      title=\"{{ labels['Download the image'] }}\"\n      [href]=\"this.imageSrc\"\n      download=\"{{ imageName }}\"\n    >\n      <span class=\"material-icons\">cloud_download</span>\n    </a>\n    <button class=\"icon-btn\" id=\"delete-img\" *ngIf=\"!this.config.hideDeleteBtn\" title=\"{{ labels['Remove'] }}\" (click)=\"onRemove()\">\n      <span class=\"material-icons\">delete</span>\n    </button>\n  </div>\n</div>\n\n<lib-edit-image\n  *ngIf=\"showEditPanel\"\n  [imageSrc]=\"this.imageSrc\"\n  [initialState]=\"this.state\"\n  [labels]=\"this.labels\"\n  [color]=\"this.color\"\n  (closeModal)=\"this.onCloseEditPanel($event)\"\n></lib-edit-image>\n","import { NgpImagePickerComponent } from './ngp-image-picker.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TabsComponent } from './components/tabs/tabs.component';\nimport { EditImageComponent } from './components/edit-image/edit-image.component';\nimport { BasicFiltersComponent } from './components/basic-filters/basic-filters.component';\nimport { CropperWrapperComponent } from './components/cropper-wrapper/cropper-wrapper.component';\n@NgModule({\n  declarations: [NgpImagePickerComponent, TabsComponent, EditImageComponent, BasicFiltersComponent, CropperWrapperComponent],\n  imports: [CommonModule, FormsModule, ReactiveFormsModule],\n  exports: [NgpImagePickerComponent],\n  providers: [],\n})\nexport class NgpImagePickerModule {}\n","/*\n * Public API Surface of ngp-image-picker\n */\n\nexport * from './lib/ngp-image-picker.component';\nexport * from './lib/ngp-image-picker.module';\nexport * from './lib/models/index.models'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.TabsComponent","i4.BasicFiltersComponent","i5.CropperWrapperComponent","i2.EditImageComponent"],"mappings":"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"}