UNPKG

@alyle/ui

Version:

Minimal Design, a set of components for Angular

1 lines 129 kB
{"version":3,"file":"alyle-ui-image-cropper.mjs","sources":["../../../lib/image-cropper/resize-canvas.ts","../../../lib/image-cropper/_image-cropper-base.ts","../../../lib/image-cropper/image-cropper.ts","../../../lib/image-cropper/image-cropper-area.html","../../../lib/image-cropper/image-cropper.html","../../../lib/image-cropper/image-cropper-base.ts","../../../lib/image-cropper/image-cropper-area-base.html","../../../lib/image-cropper/image-cropper-base.html","../../../lib/image-cropper/image-cropper.module.ts","../../../lib/image-cropper/alyle-ui-image-cropper.ts"],"sourcesContent":["/*\n * Hermite resize - fast image resize/resample using Hermite filter.\n * https://github.com/viliusle/Hermite-resize\n */\nexport function resizeCanvas(canvas: HTMLCanvasElement, width: number, height: number) {\n  const width_source = canvas.width;\n  const height_source = canvas.height;\n  width = Math.round(width);\n  height = Math.round(height);\n\n  const ratio_w = width_source / width;\n  const ratio_h = height_source / height;\n  const ratio_w_half = Math.ceil(ratio_w / 2);\n  const ratio_h_half = Math.ceil(ratio_h / 2);\n\n  const ctx = canvas.getContext('2d');\n  const img = ctx!.getImageData(0, 0, width_source, height_source);\n  const img2 = ctx!.createImageData(width, height);\n  const data = img.data;\n  const data2 = img2.data;\n\n  for (let j = 0; j < height; j++) {\n    for (let i = 0; i < width; i++) {\n      const x2 = (i + j * width) * 4;\n      let weight = 0;\n      let weights = 0;\n      let weights_alpha = 0;\n      let gx_r = 0;\n      let gx_g = 0;\n      let gx_b = 0;\n      let gx_a = 0;\n      const center_y = j * ratio_h;\n\n      const xx_start = Math.floor(i * ratio_w);\n      let xx_stop = Math.ceil((i + 1) * ratio_w);\n      const yy_start = Math.floor(j * ratio_h);\n      let yy_stop = Math.ceil((j + 1) * ratio_h);\n      xx_stop = Math.min(xx_stop, width_source);\n      yy_stop = Math.min(yy_stop, height_source);\n\n      for (let yy = yy_start; yy < yy_stop; yy++) {\n        const dy = Math.abs(center_y - yy) / ratio_h_half;\n        const center_x = i * ratio_w;\n        const w0 = dy * dy; // pre-calc part of w\n        for (let xx = xx_start; xx < xx_stop; xx++) {\n          const dx = Math.abs(center_x - xx) / ratio_w_half;\n          const w = Math.sqrt(w0 + dx * dx);\n          if (w >= 1) {\n            // pixel too far\n            continue;\n          }\n          // hermite filter\n          weight = 2 * w * w * w - 3 * w * w + 1;\n          const pos_x = 4 * (xx + yy * width_source);\n          // alpha\n          gx_a += weight * data[pos_x + 3];\n          weights_alpha += weight;\n          // colors\n          if (data[pos_x + 3] < 255) {\n            weight = weight * data[pos_x + 3] / 250;\n          }\n          gx_r += weight * data[pos_x];\n          gx_g += weight * data[pos_x + 1];\n          gx_b += weight * data[pos_x + 2];\n          weights += weight;\n        }\n      }\n      data2[x2] = gx_r / weights;\n      data2[x2 + 1] = gx_g / weights;\n      data2[x2 + 2] = gx_b / weights;\n      data2[x2 + 3] = gx_a / weights_alpha;\n    }\n  }\n\n  // clear and resize canvas\n  canvas.width = width;\n  canvas.height = height;\n\n  // draw\n  ctx!.putImageData(img2, 0, 0);\n  return ctx;\n}\n","import {\n  ElementRef,\n  Input,\n  Output,\n  ChangeDetectorRef,\n  ViewChild,\n  EventEmitter,\n  Renderer2,\n  OnDestroy,\n  NgZone,\n  Inject,\n  OnInit,\n  AfterViewInit,\n  Directive,\n  booleanAttribute\n} from '@angular/core';\nimport { Subject, Observable, BehaviorSubject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport { resizeCanvas } from './resize-canvas';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\n\n\nconst activeEventOptions = normalizePassiveListenerOptions({passive: false});\nconst DATA_IMAGE_SVG_PREFIX = 'data:image/svg+xml;base64,';\n\n/** Image Cropper Config */\nexport class ImgCropperConfig {\n  /** Cropper area width */\n  width: number = 250;\n  /** Cropper area height */\n  height: number = 200;\n  minWidth?: number = 40;\n  minHeight?: number = 40;\n  /** If this is not defined, the new image will be automatically defined. */\n  type?: string;\n  /** Background color( default: null), if is null in png is transparent but not in jpg. */\n  fill?: string | null;\n  /**\n   * Set anti-aliased (default: true)\n   * @deprecated this is not necessary as the cropper will automatically resize the image\n   * to the best quality\n   */\n  antiAliased?: boolean = true;\n  autoCrop?: boolean;\n  output?: ImgOutput | ImgResolution = ImgResolution.Default;\n  /**\n   * Zoom out until the entire image fits into the cropping area.\n   * default: false\n   */\n  extraZoomOut?: boolean;\n  /**\n   * Zoom in until the entire image fits into the cropping area.\n   * default: false\n   */\n  extraZoomIn?: boolean;\n  /**\n   * Emit event `error` if the file size in bytes for the limit.\n   * Note: It only works when the image is received from the `<input>` event.\n   */\n  maxFileSize?: number | null;\n  /**\n   * Whether the cropper area will be round.\n   * This implies that the cropper area will maintain its aspect ratio.\n   * default: false\n   */\n  round?: boolean;\n  /**\n   * Whether the cropper area is resizable.\n   * default: false\n   */\n  resizableArea?: boolean;\n  /**\n   * Keep the width and height of the growing area the same according\n   * to `ImgCropperConfig.width` and `ImgCropperConfig.height`\n   * default: false\n   */\n  keepAspectRatio?: boolean;\n  /**\n   * Whether the cropper area is responsive.\n   * By default, the width and height of the cropper area is fixed,\n   * so can use when the cropper area is larger than its container,\n   * otherwise this will bring problems when cropping.\n   */\n  responsiveArea?: boolean;\n  /**\n   * Pinch zoom gestures\n   * Default: true\n   */\n  hasTouchEvents?: boolean = true;\n}\n\n/**\n * The output image\n * With this option you can resize the output image.\n * If `width` or `height` are 0, this will be set automatically.\n * Both cannot be 0.\n */\nexport interface ImgOutput {\n  /**\n   * The cropped image will be resized to this `width`.\n   */\n  width: number;\n  /**\n   * Cropped image will be resized to this `height`.\n   */\n  height: number;\n}\n\n/** Image output */\nexport enum ImgResolution {\n  /**\n   * The output image will be equal to the initial size of the cropper area.\n   */\n  Default,\n  /** Just crop the image without resizing */\n  OriginalImage\n}\n\nexport enum PointerChange {\n  Down,\n  Up\n}\n\n/** Image output */\nexport enum ImgCropperError {\n  /** The loaded image exceeds the size limit set. */\n  Size,\n  /** The file loaded is not image. */\n  Type,\n  /** When the image has not been loaded. */\n  Other\n}\n\nexport interface ImgCropperEvent {\n  /** Cropped image data URL */\n  dataURL?: string;\n  name: string | null;\n  /** Filetype */\n  type?: string;\n  /** Cropped area width */\n  areaWidth: number;\n  /** Cropped area height */\n  areaHeight: number;\n  /** Cropped image width */\n  width: number;\n  /** Cropped image height */\n  height: number;\n  /** Original Image data URL */\n  originalDataURL?: string;\n  scale: number;\n  /** Current rotation in degrees */\n  rotation: number;\n  /** Size of the image in bytes */\n  size: number;\n  /** Scaled offset from the left edge of the image */\n  left: number;\n  /** Scaled offset from the top edge of the image */\n  top: number;\n  /**\n   * Scaled offset from the left edge of the image to center of area\n   * Can be used to set image position\n   */\n  xOrigin: number;\n  /**\n   * Scaled offset from the top edge of the image to center of area\n   * Can be used to set image position\n   */\n  yOrigin: number;\n  /** @deprecated Use `xOrigin & yOrigin` instead. */\n  position?: {\n    x: number\n    y: number\n  };\n}\n\nexport interface ImgCropperErrorEvent {\n  name?: string;\n  /** Size of the image in bytes */\n  size: number;\n  /** Filetype */\n  type: string;\n  /** Type of error */\n  error: ImgCropperError;\n  errorMsg?: string;\n}\n\ninterface ImgRect {\n  x: number;\n  y: number;\n  xc: number;\n  yc: number;\n  /** transform with */\n  wt: number;\n  ht: number;\n}\n\nexport interface ImgCropperLoaderConfig {\n  name?: string | null;\n  /** Filetype */\n  type?: string;\n  /** Cropped area width */\n  areaWidth?: number;\n  /** Cropped area height */\n  areaHeight?: number;\n  /** Cropped image width */\n  width?: number;\n  /** Cropped image height */\n  height?: number;\n  /** Original Image data URL */\n  originalDataURL?: string;\n  /** Accept File or Blob */\n  file?: File;\n  scale?: number;\n  /** Current rotation in degrees */\n  rotation?: number;\n  /** Size of the image in bytes */\n  size?: number;\n  /** Offset from the left edge of the image to center of area */\n  xOrigin?: number;\n  /** Offset from the top edge of the image to center of area */\n  yOrigin?: number;\n}\n\n@Directive()\nexport class _LyImageCropperBase implements OnInit, AfterViewInit, OnDestroy {\n  static readonly и = 'LyImageCropper';\n  private _currentLoadConfig?: ImgCropperLoaderConfig;\n\n  /** Original image */\n  private _img: HTMLImageElement;\n  private startTransform?: {\n    x: number\n    y: number\n    xOrigin: number\n    yOrigin: number\n  };\n  private _scale?: number;\n  private _scal3Fix?: number;\n  private _minScale?: number;\n  private _maxScale?: number;\n  /** Initial config */\n  private _initialConfig: ImgCropperConfig;\n  private _config: ImgCropperConfig;\n  private _imgRect: ImgRect = {} as any;\n  private _rotation: number = 0;\n  // private _sizeInBytes: number | null;\n  private _isSliding: boolean;\n  private _isMultiTouching: boolean;\n  private _startCenter: { x: number, y: number };\n  private _startDistance: number;\n  /** Keeps track of the last pointer event that was captured by the crop area. */\n  private _lastPointerEvent: MouseEvent | TouchEvent | null;\n  private _startPointerEvent: {\n    x: number\n    y: number\n  } | null;\n  _initialAreaWidth: number;\n  _initialAreaHeight: number;\n  _areaWidthResized: number | null;\n  _areaHeightResized: number | null;\n\n  _absoluteScale: number;\n\n  /**\n   * When is loaded image\n   * @internal\n   */\n  _isLoadedImg: boolean;\n  _urlsToRevoke: string[] = [];\n\n  /** When is loaded image & ready for crop */\n  isLoaded: boolean;\n  /** When the cropper is ready to be interacted  */\n  isReady: boolean;\n  isCropped: boolean;\n  private _events = new Map<string, EventListener>();\n  /** @private */\n  readonly _isPointerUp = new BehaviorSubject<boolean>(true);\n\n  @ViewChild('_cropperContainer', { static: true }) _cropperContainer: ElementRef;\n  @ViewChild('_imgContainer', { static: true }) _imgContainer: ElementRef;\n  @ViewChild('_area', {\n    read: ElementRef\n  }) _areaRef: ElementRef;\n  @ViewChild('_imgCanvas', { static: true }) _imgCanvas: ElementRef<HTMLCanvasElement>;\n  @Input()\n  get config(): ImgCropperConfig {\n    return this._config;\n  }\n  set config(val: ImgCropperConfig) {\n    this._config = {...{}, ...new ImgCropperConfig(), ...val};\n    this._initialConfig = {...{}, ...this._config};\n    this._initialAreaWidth = this.config.width;\n    this._initialAreaHeight = this.config.height;\n    if (\n      this._config.round\n      && this.config.width !== this.config.height\n    ) {\n      throw new Error(`${_LyImageCropperBase.и}: Both width and height must be equal when using \\`ImgCropperConfig.round = true\\``);\n    }\n    const maxFileSize = this._config.maxFileSize;\n    if (maxFileSize) {\n      this.maxFileSize = maxFileSize;\n    }\n  }\n\n  /** Set scale */\n  @Input()\n  get scale(): number | undefined {\n    return this._scale;\n  }\n  set scale(val: number | undefined) {\n    this.setScale(val);\n  }\n\n  /**\n   * Emit event `error` if the file size for the limit.\n   * Note: It only works when the image is received from the `<input>` event.\n   */\n  @Input() maxFileSize: number;\n\n  /** Get min scale */\n  get minScale(): number | undefined {\n    return this._minScale;\n  }\n\n  @Output() readonly scaleChange = new EventEmitter<number>();\n\n  /** Emits minimum supported image scale */\n  @Output('minScale') readonly minScaleChange = new EventEmitter<number>();\n\n  /** Emits maximum supported image scale */\n  @Output('maxScale') readonly maxScaleChange = new EventEmitter<number>();\n\n  /** @deprecated Emits when the image is loaded, instead use `ready` */\n  @Output() readonly loaded = new EventEmitter<ImgCropperEvent>();\n\n  /** Emits when the image is loaded */\n  @Output() readonly imageLoaded = new EventEmitter<ImgCropperEvent>();\n\n  /** Emits when the cropper is ready to be interacted */\n  @Output() readonly ready = new EventEmitter<ImgCropperEvent>();\n\n  /** On crop new image */\n  @Output() readonly cropped = new EventEmitter<ImgCropperEvent>();\n\n  /** Emits when the cropper is cleaned */\n  @Output() readonly cleaned = new EventEmitter<void>();\n\n  /** Emit an error when the loaded image is not valid */\n  // tslint:disable-next-line: no-output-native\n  @Output() readonly error = new EventEmitter<ImgCropperErrorEvent>();\n\n  private _currentInputElement?: HTMLInputElement;\n\n  /** Emits whenever the component is destroyed. */\n  private readonly _destroy = new Subject<void>();\n  \n\n  /** Used to subscribe to global move and end events */\n  protected _document: Document;\n  private _rotateTimeOut: any;\n  private _pendingRotation = 0;\n  protected areaGridActiveCssClass = '';\n\n  constructor(\n    private _renderer: Renderer2,\n    readonly _elementRef: ElementRef<HTMLElement>,\n    private cd: ChangeDetectorRef,\n    private _ngZone: NgZone,\n    @Inject(DOCUMENT) _document: any,\n    viewPortRuler: ViewportRuler\n  ) {\n    this._document = _document;\n    viewPortRuler.change()\n    .pipe(takeUntil(this._destroy))\n    .subscribe(() =>\n      this._ngZone.run(() => this.updateCropperPosition())\n    );\n    this._isPointerUp.subscribe((UP) => {\n      if (!this.areaGridActiveCssClass) {\n        return;\n      }\n      if (UP) {\n        this._renderer.removeClass(this._elementRef.nativeElement, this.areaGridActiveCssClass);\n      } else {\n        this._renderer.addClass(this._elementRef.nativeElement, this.areaGridActiveCssClass);\n      }\n    });\n  }\n\n  ngOnInit() {\n    this._ngZone.runOutsideAngular(() => {\n      const element = this._imgContainer.nativeElement;\n      element.addEventListener('mousedown', this._pointerDown, activeEventOptions);\n      element.addEventListener('touchstart', this._pointerDown, activeEventOptions);\n    });\n  }\n\n  ngAfterViewInit() { }\n\n  ngOnDestroy() {\n    this._destroy.next();\n    this._destroy.complete();\n    const element = this._imgContainer.nativeElement;\n    this._lastPointerEvent = null;\n    this._removeGlobalEvents();\n    element.removeEventListener('mousedown', this._pointerDown, activeEventOptions);\n    element.removeEventListener('touchstart', this._pointerDown, activeEventOptions);\n    this._removeEventsToScaleWithScroll();\n  }\n\n  /** Load image with canvas */\n  // private _imgLoaded(imgElement: HTMLImageElement) {\n  //   if (imgElement) {\n  //     this._img = imgElement;\n  //     const canvas = this._imgCanvas.nativeElement;\n  //     canvas.width = imgElement.width;\n  //     canvas.height = imgElement.height;\n  //     const ctx = canvas.getContext('2d')!;\n  //     ctx.clearRect(0, 0, imgElement.width, imgElement.height);\n  //     ctx.drawImage(imgElement, 0, 0);\n\n  //     /** set min scale */\n  //     this._updateMinScale(canvas);\n  //     this._updateMaxScale();\n  //   }\n  // }\n\n    /** Load image with canvas */\n  private _loadImageToCanvas(imgElement: HTMLImageElement) {\n    if (imgElement) {\n      this._img = imgElement;\n      const canvas = this._imgCanvas.nativeElement;\n      canvas.width = imgElement.width;\n      canvas.height = imgElement.height;\n      const ctx = canvas.getContext('2d')!;\n      ctx.clearRect(0, 0, imgElement.width, imgElement.height);\n      ctx.drawImage(imgElement, 0, 0);\n    }\n  }\n\n\n  private _setStylesForContImg(values: {\n    x?: number, y?: number\n  }) {\n    const newStyles = { } as any;\n    if (values.x != null && values.y != null) {\n      const rootRect = this._cropperContainerRect();\n      const x = rootRect.width / 2 - (values.x);\n      const y = rootRect.height / 2 - (values.y);\n\n      this._imgRect.x = (values.x);\n      this._imgRect.y = (values.y);\n      this._imgRect.xc = (x);\n      this._imgRect.yc = (y);\n\n    }\n\n    newStyles.transform = `translate3d(${(this._imgRect.x)}px,${(this._imgRect.y)}px, 0)`;\n    newStyles.transform += ` scale(${this._scal3Fix})`;\n    newStyles.transform += ` rotate(0)`;\n    newStyles.transformOrigin = `${this._imgRect.xc}px ${this._imgRect.yc}px 0`;\n    for (const key in newStyles) {\n      if (newStyles.hasOwnProperty(key)) {\n        this._renderer.setStyle(this._imgContainer.nativeElement, key, newStyles[key]);\n      }\n    }\n  }\n\n  /**\n   * Update area and image position only if needed,\n   * this is used when window resize\n   */\n  updateCropperPosition() {\n    if (this.isLoaded) {\n      this.updatePosition();\n      this._updateAreaIfNeeded();\n    }\n  }\n\n  /** Load Image from input event */\n  selectInputEvent(img: Event) {\n    this.clean();\n    this._currentInputElement = img.target as HTMLInputElement;\n    const _img = img.target as HTMLInputElement;\n    if (_img.files && _img.files.length !== 1) {\n      return;\n    }\n    const fileSize = _img.files![0].size;\n    const fileName = _img.value.replace(/.*(\\/|\\\\)/, '');\n\n    if (this.maxFileSize && fileSize > this.maxFileSize) {\n      const cropEvent: ImgCropperErrorEvent = {\n        name: fileName,\n        type: _img.files![0].type,\n        size: fileSize,\n        error: ImgCropperError.Size\n      };\n      this.clean();\n      this.error.emit(cropEvent as ImgCropperErrorEvent);\n      return;\n    }\n    new Observable<ProgressEvent>(observer => {\n\n      const reader = new FileReader();\n\n      reader.onerror = err => observer.error(err);\n      reader.onabort = err => observer.error(err);\n      reader.onload = (ev) => setTimeout(() => {\n        observer.next(ev);\n        observer.complete();\n      });\n\n      reader.readAsDataURL(_img.files![0]);\n    })\n      .pipe(take(1), takeUntil(this._destroy))\n      .subscribe(\n        (loadEvent) => {\n          const originalDataURL = (loadEvent.target as FileReader).result as string;\n          this.loadImage({\n            name: fileName,\n            size: _img.files![0].size, // size in bytes\n            type: this.config.type || _img.files![0].type,\n            originalDataURL,\n            file: _img.files![0]\n          });\n\n          this.cd.markForCheck();\n        },\n        () => {\n          const cropEvent: ImgCropperErrorEvent = {\n            name: fileName,\n            size: fileSize,\n            error: ImgCropperError.Other,\n            errorMsg: 'The File could not be loaded.',\n            type: _img.files![0].type\n          };\n          this.clean();\n          this.error.emit(cropEvent as ImgCropperErrorEvent);\n        }\n      );\n\n  }\n\n  /** Set the size of the image, the values can be 0 between 1, where 1 is the original size */\n  setScale(size?: number, noAutoCrop?: boolean) {\n    // fix min scale\n    // const newSize = size! >= this.minScale! && size! <= 1 ? size : this.minScale;\n    const newSize = (size! >= this.minScale!) ? size : this.minScale;\n\n\n    // check\n    const changed = size != null && size !== this.scale && newSize !== this.scale;\n    this._scale = size;\n    if (!changed) {\n      return;\n    }\n    this._scal3Fix = newSize;\n    this._updateAbsoluteScale();\n    // this._updateMinScale();\n    // this._updateMaxScale(); // TODO: check this\n    if (this.isLoaded) {\n      if (changed) {\n        const originPosition = {...this._imgRect};\n        this.startTransform = {\n          x: originPosition.x,\n          y: originPosition.y,\n          xOrigin: originPosition.xc,\n          yOrigin: originPosition.yc\n        };\n        this._setStylesForContImg({});\n        this._simulatePointerMove();\n      } else {\n        return;\n      }\n    } else if (this.minScale) {\n      this._setStylesForContImg({\n        ...this._getCenterPoints()\n      });\n    } else {\n      return;\n    }\n\n    this.scaleChange.emit(size);\n    if (!noAutoCrop) {\n      this._cropIfAutoCrop();\n    }\n\n  }\n\n  private _getCenterPoints() {\n    const root = this._cropperContainer.nativeElement as HTMLElement;\n    const img = this._imgCanvas.nativeElement;\n    const x = (root.offsetWidth - (img.width)) / 2;\n    const y = (root.offsetHeight - (img.height)) / 2;\n    return {\n      x,\n      y\n    };\n  }\n\n  /**\n   * Fit to screen\n   */\n  fitToScreen() {\n    const container = this._cropperContainer.nativeElement as HTMLElement;\n    const min = {\n      width: container.offsetWidth,\n      height: container.offsetHeight\n    };\n    const { width, height } = this._img;\n    const minScale = {\n      width: min.width / width,\n      height: min.height / height\n    };\n    const result = Math.max(minScale.width, minScale.height);\n    this.setScale(result);\n  }\n\n  fit() {\n    this.setScale(this.minScale);\n  }\n\n  private _pointerDown = (event: TouchEvent | MouseEvent) => {\n    this._isPointerUp.next(false);\n    if (isTouchEvent(event)) {\n      if (event.touches.length === 2) {\n        this._isMultiTouching = isTouchEvent(event);\n  \n        // Calculate where the fingers have started on the X and Y axis\n        this._startCenter = getCenterFromTouchEvent(event);\n        this._startDistance = calDistanceFromTouchEvent(event);\n      }\n    }\n    // Don't do anything if the\n    // user is using anything other than the main mouse button.\n    if (this._isSliding || (!isTouchEvent(event) && event.button !== 0)) {\n      return;\n    }\n\n    this._ngZone.run(() => {\n      \n\n      this._isSliding = true;\n\n      this.startTransform = {\n        x: this._imgRect.x,\n        y: this._imgRect.y,\n        xOrigin: this._imgRect.xc,\n        yOrigin: this._imgRect.yc\n      };\n      this._lastPointerEvent = event;\n      this._startPointerEvent = getGesturePointFromEvent(event);\n      event.preventDefault(); // Prevent page scroll\n      this._bindGlobalEvents(event);\n    });\n\n  }\n\n  /**\n   * Simulate pointerMove with clientX = 0 and clientY = 0,\n   * this is used by `setScale` and `rotate`\n   */\n  private _simulatePointerMove() {\n    this._isSliding = true;\n    this._startPointerEvent = {\n      x: 0,\n      y: 0\n    };\n    this._pointerMove({\n      clientX: 0,\n      clientY: 0,\n      type: 'n',\n      preventDefault: () => {}\n    } as MouseEvent);\n    this._isSliding = false;\n    this._startPointerEvent = null;\n  }\n\n  _markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  /**\n   * Called when the user has moved their pointer after\n   * starting to drag.\n   */\n  private _pointerMove = (event: TouchEvent | MouseEvent) => {\n    if (this._isSliding) {\n      event.preventDefault();\n      this._lastPointerEvent = event;\n      let x: number | undefined, y: number | undefined;\n      let scaleFix = this._scal3Fix;\n      const config = this.config;\n      const startP = this.startTransform;\n      if (!scaleFix || !startP) {\n        return;\n      }\n      const point = getGesturePointFromEvent(event);\n      let deltaX = 0;\n      let deltaY = 0;\n      const imgContainer = this._imgCanvas.nativeElement;\n      /** Main image width */\n      const imgWidth = imgContainer.width;\n      /** Main image height */\n      const imgHeight = imgContainer.height;\n\n      if (this._isMultiTouching) {\n        const newScale = calDistanceFromTouchEvent(event as TouchEvent) / this._startDistance * this._scale!;\n        scaleFix = this._scal3Fix = Math.max(newScale, this.minScale!);\n        const center = getCenterFromTouchEvent(event as TouchEvent);\n        deltaX = center.x - this._startCenter.x;\n        deltaY = center.y - this._startCenter.y;\n      } else {\n        deltaX = point.x - this._startPointerEvent!.x;\n        deltaY = point.y - this._startPointerEvent!.y;\n      }\n\n      if (!scaleFix || !startP) {\n        return;\n      }\n\n      const isMinScaleX = imgWidth * scaleFix < config.width && config.extraZoomOut;\n      const isMinScaleY = imgHeight * scaleFix < config.height && config.extraZoomOut;\n\n      const limitLeft = (config.width / 2 / scaleFix) >= startP.xOrigin - (deltaX / scaleFix);\n      const limitRight = (config.width / 2 / scaleFix) + (imgWidth) - (startP.xOrigin - (deltaX / scaleFix)) <= config.width / scaleFix;\n      const limitTop = ((config.height / 2 / scaleFix) >= (startP.yOrigin - (deltaY / scaleFix)));\n      const limitBottom = (\n        ((config.height / 2 / scaleFix) + (imgHeight) - (startP.yOrigin - (deltaY / scaleFix))) <= (config.height / scaleFix)\n      );\n\n      // Limit for left\n      if ((limitLeft && !isMinScaleX) || (!limitLeft && isMinScaleX)) {\n        x = startP.x + (startP.xOrigin) - (config.width / 2 / scaleFix);\n      }\n\n      // Limit for right\n      if ((limitRight && !isMinScaleX) || (!limitRight && isMinScaleX)) {\n        x = startP.x + (startP.xOrigin) + (config.width / 2 / scaleFix) - imgWidth;\n      }\n\n      // Limit for top\n      if ((limitTop && !isMinScaleY) || (!limitTop && isMinScaleY)) {\n        y = startP.y + (startP.yOrigin) - (config.height / 2 / scaleFix);\n      }\n\n      // Limit for bottom\n      if ((limitBottom && !isMinScaleY) || (!limitBottom && isMinScaleY)) {\n        y = startP.y + (startP.yOrigin) + (config.height / 2 / scaleFix) - imgHeight;\n      }\n\n      // When press shiftKey, deprecated\n      // if (event.srcEvent && event.srcEvent.shiftKey) {\n      //   if (Math.abs(event.deltaX) === Math.max(Math.abs(event.deltaX), Math.abs(event.deltaY))) {\n      //     y = this.offset.top;\n      //   } else {\n      //     x = this.offset.left;\n      //   }\n      // }\n\n      if (x === void 0) { x = (deltaX / scaleFix) + (startP.x); }\n      if (y === void 0) { y = (deltaY / scaleFix) + (startP.y); }\n\n\n\n      this._setStylesForContImg({\n        x, y,\n      });\n    }\n  }\n\n\n  updatePosition(): void;\n  updatePosition(xOrigin: number, yOrigin: number): void;\n  updatePosition(xOrigin?: number, yOrigin?: number) {\n    const hostRect = this._cropperContainerRect();\n    const areaRect = this._areaCropperRect();\n    const areaWidth = Math.min(areaRect.width, hostRect.width);\n    const areaHeight = Math.min(areaRect.height, hostRect.height);\n    let x: number, y: number;\n    if (xOrigin == null && yOrigin == null) {\n      xOrigin = this._imgRect.xc;\n      yOrigin = this._imgRect.yc;\n    }\n    x = Math.max((areaRect.left - hostRect.left), 0);\n    y = Math.max(0, (areaRect.top - hostRect.top));\n    x -= (xOrigin! - (areaWidth / 2));\n    y -= (yOrigin! - (areaHeight / 2));\n\n    this._setStylesForContImg({\n      x, y\n    });\n  }\n\n  _slideEnd() {\n    this._cropIfAutoCrop();\n  }\n\n  private _cropIfAutoCrop() {\n    if (this.config.autoCrop) {\n      this.crop();\n    }\n  }\n\n  /** + */\n  zoomIn() {\n    const scalePercent = this._calcScalePercent(this._scal3Fix!, this._minScale!, this._maxScale!);\n    const newScale = scalePercent < 20 ? ((this._scal3Fix! * this._imgCanvas.nativeElement.width + 50)\n      / (this._imgCanvas.nativeElement.width)) : (this._scal3Fix! + .05);\n\n    if (newScale > this.minScale! && newScale <= this._maxScale!) {\n      this.setScale(newScale);\n    } else {\n      this.setScale(this._maxScale!);\n    }\n  }\n\n  private _calcScalePercent(num: number, min: number, max: number) {\n    return ((num - min) / (max - min)) * 100;\n  }\n\n\n  /** Clean the img cropper */\n  clean() {\n    // fix choosing the same image does not load\n    if (this._currentInputElement) {\n      this._currentInputElement.value = '';\n      this._currentInputElement = null!;\n    }\n    if (this.isLoaded) {\n      this._imgRect = { } as any;\n      this.startTransform = undefined;\n      this.scale = undefined as any;\n      this._scal3Fix = undefined;\n      this._rotation = 0;\n      this._minScale = undefined;\n      this._isLoadedImg = false;\n      this.isLoaded = false;\n      this.isCropped = false;\n      this._currentLoadConfig = undefined;\n      this.config = this._initialConfig;\n      const canvas = this._imgCanvas.nativeElement;\n      canvas.width = 0;\n      canvas.height = 0;\n      this.cleaned.emit(null!);\n      this.cd.markForCheck();\n    }\n  }\n\n  /** - */\n  zoomOut() {\n    const scalePercent = this._calcScalePercent(this._scal3Fix!, this._minScale!, this._maxScale!);\n    const newScale = scalePercent < 20 ? ((this._scal3Fix! * this._imgCanvas.nativeElement.width - 50)\n      / (this._imgCanvas.nativeElement.width)) : (this._scal3Fix! - .05);\n    if (newScale > this.minScale! && newScale <= this._maxScale!) {\n      this.setScale(newScale);\n    } else {\n      this.fit();\n    }\n  }\n  center() {\n    const newStyles = {\n      ...this._getCenterPoints()\n    };\n    this._setStylesForContImg(newStyles);\n    this._cropIfAutoCrop();\n  }\n  /**\n   * load an image from a given configuration,\n   * or from the result of a cropped image\n   */\n  loadImage(config: ImgCropperLoaderConfig | string, fn?: () => void) {\n    this.clean();\n    const _config = this._currentLoadConfig = typeof config === 'string'\n      ? { originalDataURL: config }\n      : { ...config };\n\n    let src = _config.originalDataURL;\n    if (!src) {\n      const err: ImgCropperErrorEvent = {\n        name: _config.name!,\n        error: ImgCropperError.Other,\n        type: _config.type!,\n        size: _config.size!\n      };\n      this.error.emit(err);\n      return;\n    }\n    this._initialAreaWidth = this._initialConfig.width;\n    this._initialAreaHeight = this._initialConfig.height;\n    if (_config.areaWidth && _config.areaHeight) {\n      this.config.width = _config.areaWidth;\n      this.config.height = _config.areaHeight;\n    }\n    if (_config.originalDataURL && isSvgImage(_config.originalDataURL)) {\n      src = normalizeSVG(_config.originalDataURL);\n    }\n\n    \n    const cropEvent = { ..._config } as ImgCropperEvent;\n    \n    new Promise((resolve: (value: HTMLImageElement) => void, reject) => {\n      const img = createHtmlImg(src!);\n      this._ngZone.runOutsideAngular(() => {\n        img.onerror = err => reject(err);\n        img.onabort = err => reject(err);\n        img.onload = () => resolve(img);\n      });\n    })\n    .then(\n      (img) => {\n        this._loadImageToCanvas(img);\n        this._updateMinScale(img);\n        this._updateMaxScale();\n        this._isLoadedImg = true;\n        this.imageLoaded.emit(cropEvent);\n        this.cd.markForCheck();\n        Promise.resolve(null).then(() => {\n          setTimeout(() => {\n            this._ngZone.run(() => {this._positionImg(cropEvent, fn)});\n          });\n        });\n      },\n      () => {\n        const err: ImgCropperErrorEvent = {\n          name: _config.name!,\n          error: ImgCropperError.Type,\n          type: _config.type!,\n          size: _config.size!\n        };\n        this.error.emit(err);\n      }\n    );\n  }\n\n  private _updateAreaIfNeeded() {\n    if (!this._config.responsiveArea) return;\n\n    const rootRect = this._cropperContainerRect();\n    const areaRect = this._areaCropperRect();\n    const { minWidth = 1, minHeight = 1, round } = this.config;\n\n    // Calculate maximum dimensions allowed for the area\n    const maxWidth = Math.max(rootRect.width, minWidth);\n    const maxHeight = Math.max(rootRect.height, minHeight);\n\n    let newWidth = areaRect.width;\n    let newHeight = areaRect.height;\n\n    if (round) {\n        newWidth = newHeight = Math.min(maxWidth, maxHeight); // Área cuadrada si round es true\n    } else {\n        const shouldResizeWidth = (\n          areaRect.width > maxWidth\n          || areaRect.width < this._initialAreaWidth\n          || this._areaWidthResized\n        );\n        const shouldResizeHeight = (\n          areaRect.height > maxHeight\n          || areaRect.height < this._initialAreaHeight\n          || this._areaHeightResized\n        );\n        \n        let posibleWidth_w = 0;\n        let posibleWidth_h = 0;\n        let posibleHeight_h = 0;\n        let posibleHeight_w = 0;\n\n        if (shouldResizeWidth) {\n          newWidth = posibleWidth_w = Math.min(maxWidth, this._areaWidthResized || this._initialAreaWidth);\n          newHeight = posibleWidth_h = (newWidth * areaRect.height) / areaRect.width;\n        }\n\n        if (shouldResizeHeight) {\n          newHeight = posibleHeight_h = Math.min(maxHeight, this._areaHeightResized || this._initialAreaHeight);\n          newWidth = posibleHeight_w = (newHeight * areaRect.width) / areaRect.height;\n        }\n\n        if (shouldResizeHeight && shouldResizeWidth) {\n          if (Math.min(posibleWidth_w, posibleWidth_h) < Math.min(posibleHeight_h, posibleHeight_w)) {\n            newWidth = posibleWidth_w;\n            newHeight = posibleWidth_h;\n          } else {\n            newHeight = posibleHeight_h;\n            newWidth = posibleHeight_w;\n          }\n        }\n    }\n\n    // Apply changes if dimensions have changed\n    if (newWidth !== this.config.width || newHeight !== this.config.height) {\n      const newScale = (this._scal3Fix! * newWidth) / areaRect.width;\n      this.config.width = newWidth;\n      this.config.height = newHeight;\n      this._updateMinScale();\n      this._updateMaxScale();\n      this.setScale(newScale, true);\n      this._markForCheck(); \n    }\n  }\n\n  /**\n   * @private\n   */\n  _updateAbsoluteScale() {\n    const scale = this._scal3Fix! / (this.config.width / this._initialAreaWidth);\n    this._absoluteScale = scale;\n  }\n\n  /**\n   * Load Image from URL\n   * @deprecated Use `loadImage` instead of `setImageUrl`\n   * @param src URL\n   * @param fn function that will be called before emit the event loaded\n   */\n  setImageUrl(src: string, fn?: () => void) {\n    this.loadImage(src, fn);\n  }\n\n  private _positionImg(cropEvent: ImgCropperEvent, fn?: () => void) {\n    const loadConfig = this._currentLoadConfig!;\n    this._updateMinScale(this._imgCanvas.nativeElement);\n    this._updateMaxScale();\n    this.isLoaded = false;\n    if (fn) {\n      fn();\n    } else {\n      if (loadConfig.scale) {\n        this.setScale(loadConfig.scale, true);\n      } else {\n        this.setScale(this.minScale, true);\n      }\n      // this.rotate(loadConfig.rotation || 0);\n      this._updateAreaIfNeeded();\n      this._markForCheck();\n      this._ngZone.runOutsideAngular(() => {\n        Promise.resolve(null).then(() => {\n          if (loadConfig.xOrigin != null && loadConfig.yOrigin != null) {\n            this.updatePosition(loadConfig.xOrigin, loadConfig.yOrigin);\n          }\n          this._updateAreaIfNeeded();\n          this.isLoaded = true;\n          this._cropIfAutoCrop();\n          this._ngZone.run(() => {\n            this._markForCheck();\n            this.ready.emit(cropEvent);\n            if (this.config.hasTouchEvents) {\n              this._addEventsToScaleWithScroll();\n            } else {\n              this._removeEventsToScaleWithScroll()\n            }\n            // tslint:disable-next-line: deprecation\n            this.loaded.emit(cropEvent);\n          });\n        });\n      });\n    }\n  }\n\n  rotate2(degrees: number) {\n    this._rotation -= degrees;\n    const newStyles = {} as any;\n    newStyles.transform = `translate(${(this._imgRect.x)}px,${(this._imgRect.y)}px)`;\n    newStyles.transform += ` scale(${this._scal3Fix})`;\n    newStyles.transform += ` rotate(${this._rotation}deg)`;\n    newStyles.transformOrigin = `${this._imgRect.xc}px ${this._imgRect.yc}px 0`;\n    for (const key in newStyles) {\n      if (newStyles.hasOwnProperty(key)) {\n        this._renderer.setStyle(this._imgContainer.nativeElement, key, newStyles[key]);\n      }\n    }\n  }\n\n  rotate(degrees: number) {\n    _normalizeDegrees(degrees)\n    const newRotation = this._rotation + degrees;\n    clearTimeout(this._rotateTimeOut);\n    this._pendingRotation += degrees;\n    this._rotation = newRotation;\n    this._rotateWithAnimation();\n    this._rotateTimeOut = setTimeout(() => {\n      this._setStylesForContImg({});\n      this._rotateCanvas();\n    }, 140);\n  }\n\n  private _rotateWithAnimation() {\n\n    const newStyles = {} as any;\n    // easeOutQuad\n    newStyles.transition = `cubic-bezier(0.250, 0.460, 0.450, 0.940) 140ms`;\n    newStyles.transform = `translate(${(this._imgRect.x)}px,${(this._imgRect.y)}px)`;\n    newStyles.transform += ` scale(${this._scal3Fix})`;\n    newStyles.transform += ` rotate(${this._pendingRotation}deg)`;\n    newStyles.transformOrigin = `${this._imgRect.xc}px ${this._imgRect.yc}px 0`;\n    for (const key in newStyles) {\n      if (newStyles.hasOwnProperty(key)) {\n        this._renderer.setStyle(this._imgContainer.nativeElement, key, newStyles[key]);\n      }\n    }\n  }\n\n\n  private _rotateCanvas() {\n    let validDegrees = this._pendingRotation;\n        \n    const degreesRad = validDegrees * Math.PI / 180;\n    const canvas = this._imgCanvas.nativeElement;\n    canvas.removeAttribute('style');\n    this._pendingRotation = 0;\n    this._renderer.removeStyle(this._imgContainer.nativeElement, 'transition');\n    const canvasClon = createCanvasImg(canvas);\n    const ctx = canvas.getContext('2d')!;\n\n    // clear\n    ctx.clearRect(0, 0, canvasClon.width, canvasClon.height);\n\n    // rotate canvas image\n    const transform = `rotate(${validDegrees}deg) scale(${1 / this._scal3Fix!})`;\n    const transformOrigin = `${this._imgRect.xc}px ${this._imgRect.yc}px 0`;\n    canvas.style.transform = transform;\n    canvas.style.opacity = '0';\n    // tslint:disable-next-line: deprecation\n    canvas.style.webkitTransform = transform;\n    canvas.style.transformOrigin = transformOrigin;\n    // tslint:disable-next-line: deprecation\n    canvas.style.webkitTransformOrigin = transformOrigin;\n\n    const { left, top } = canvas.getBoundingClientRect() as DOMRect;\n\n    // save rect\n    const canvasRect = canvas.getBoundingClientRect();\n\n    // remove rotate styles\n    canvas.removeAttribute('style');\n\n    // set w & h\n    const w = canvasRect.width;\n    const h = canvasRect.height;\n    ctx.canvas.width = w;\n    ctx.canvas.height = h;\n\n    // clear\n    ctx.clearRect(0, 0, w, h);\n\n    // translate and rotate\n    ctx.translate(w / 2, h / 2);\n    ctx.rotate(degreesRad);\n    ctx.drawImage(canvasClon, -canvasClon.width / 2, -canvasClon.height / 2);\n\n    // Update min scale\n    this._updateMinScale(canvas);\n    this._updateMaxScale();\n\n    // set the minimum scale, only if necessary\n    if (this.scale! < this.minScale!) {\n      this.setScale(0, true);\n    } //                ↑ no AutoCrop\n\n    const rootRect = this._cropperContainerRect();\n\n    this._setStylesForContImg({\n      x: (left - rootRect.left),\n      y: (top - rootRect.top)\n    });\n\n    // keep image inside the frame\n    const originPosition = {...this._imgRect};\n    this.startTransform = {\n      x: originPosition.x,\n      y: originPosition.y,\n      xOrigin: originPosition.xc,\n      yOrigin: originPosition.yc\n    };\n    this._setStylesForContImg({});\n    this._simulatePointerMove();\n\n    this._cropIfAutoCrop();\n  }\n\n  _updateMinScale(canvas?: HTMLCanvasElement | HTMLImageElement) {\n    if (!canvas) {\n      canvas = this._imgCanvas.nativeElement;\n    }\n    const config = this.config;\n    const minScale = (config.extraZoomOut ? Math.min : Math.max)(\n      config.width / canvas.width,\n      config.height / canvas.height);\n    this._minScale = minScale;\n    this.minScaleChange.emit(minScale!);\n  }\n\n  /**\n   * @private\n   */\n  _updateMaxScale() {\n    const maxScale = (this.config.width / this._initialAreaWidth) * 3;\n    this._maxScale = maxScale;\n    this.maxScaleChange.emit(maxScale);\n  }\n\n  /**\n   * Resize & crop image\n   */\n  crop(config?: ImgCropperConfig): ImgCropperEvent {\n    const newConfig = config\n    ? {...{ }, ...(this.config || new ImgCropperConfig()), ...config} : this.config;\n    // this._loadImageToCanvas(this._mainImage.nativeElement);\n    const cropEvent = this._imgCrop(newConfig);\n    this.cd.markForCheck();\n    return cropEvent;\n  }\n\n  /**\n   * @docs-private\n   */\n  private _imgCrop(myConfig: ImgCropperConfig) {\n    const canvasElement: HTMLCanvasElement = document.createElement('canvas');\n    const areaRect = this._areaCropperRect();\n    const canvasRect = this._canvasRect();\n    const scaleFix = this._scal3Fix!;\n    const left = (areaRect.left - canvasRect.left) / scaleFix;\n    const top = (areaRect.top - canvasRect.top) / scaleFix;\n    const { output } = myConfig;\n    const currentImageLoadConfig = this._currentLoadConfig!;\n    const area = {\n      width: myConfig.width,\n      height: myConfig.height\n    };\n    canvasElement.width = area.width / scaleFix;\n    canvasElement.height = area.height / scaleFix;\n    const ctx = canvasElement.getContext('2d')!;\n    if (myConfig.fill) {\n      ctx.fillStyle = myConfig.fill;\n      ctx.fillRect(0, 0, canvasElement.width, canvasElement.height);\n    }\n    // crop\n    ctx.drawImage(this._imgCanvas.nativeElement,\n      -(left), -(top),\n    );\n\n    const result = canvasElement;\n    // TODO: check if the image to be sized is smaller than the crop area\n    if (myConfig.output === ImgResolution.Default) {\n      const areaWidth = this._areaWidthResized ?? this._initialConfig.width;\n      const areaHeight = this._areaHeightResized ?? this._initialConfig.height;\n      resizeCanvas(\n        result,\n        areaWidth,\n        areaHeight);\n    } else if (typeof output === 'object') {\n      if (output.width && output.height) {\n        resizeCanvas(result, output.width, output.height);\n      } else if (output.width) {\n        const newHeight = area.height * output.width / area.width;\n        resizeCanvas(result, output.width, newHeight);\n      } else if (output.height) {\n        const newWidth = area.width * output.height / area.height;\n        resizeCanvas(result, newWidth, output.height);\n      }\n    }\n    const type = currentImageLoadConfig.originalDataURL?.startsWith('http')\n      ? currentImageLoadConfig.type || myConfig.type\n      : myConfig.type || currentImageLoadConfig.type!;\n    const dataURL = result.toDataURL(type);\n    const cropEvent: ImgCropperEvent = {\n      dataURL,\n      type,\n      name: currentImageLoadConfig.name!,\n      areaWidth: this._initialAreaWidth,\n      areaHeight: this._initialAreaHeight,\n      width: result.width,\n      height: result.height,\n      originalDataURL: currentImageLoadConfig.originalDataURL,\n      scale: this._absoluteScale!,\n      rotation: this._rotation,\n      left: (areaRect.left - canvasRect.left) / this._scal3Fix!,\n      top: (areaRect.top - canvasRect.top) / this._scal3Fix!,\n      size: currentImageLoadConfig.size!,\n      xOrigin: this._imgRect.xc,\n      yOrigin: this._imgRect.yc,\n      position: {\n        x: this._imgRect.xc,\n        y: this._imgRect.yc\n      }\n    };\n\n    this.isCropped = true;\n    this.cropped.emit(cropEvent);\n    return cropEvent;\n  }\n\n  // _rootRect(): DOMRect {\n  //   return this._elementRef.nativeElement.getBoundingClientRect() as DOMRect;\n  // }\n\n  _cropperContainerRect(): DOMRect {\n    return this._cropperContainer.nativeElement.getBoundingClientRect() as DOMRect;\n  }\n\n  _areaCropperRect(): DOMRect {\n    return this._areaRef.nativeElement.getBoundingClientRect() as DOMRect;\n  }\n\n  _canvasRect(): DOMRect {\n    return this._imgCanvas.nativeElement.getBoundingClientRect();\n  }\n\n  // _mainImageRect(): DOMRect {\n  //   return this._mainImage.nativeElement.getBoundingClientRect();\n  // }\n\n\n  /** Called when the user has lifted their pointer. */\n  private _pointerUp = (event: TouchEvent | MouseEvent) => {\n    this._isPointerUp.next(true);\n    if (this._isSliding) {\n      event.preventDefault();\n      this._removeGlobalEvents();\n      this._isSliding = false;\n      this._isMultiTouching = false;\n      this._startPointerEvent = null;\n      this._scale = this._scal3Fix;\n      this._cropIfAutoCrop();\n    }\n  }\n\n  /** Called when the window has lost focus. */\n  private _windowBlur = () => {\n    // If the window is blurred while dragging we need to stop dragging because the\n    // browser won't dispatch the `mouseup` and `touchend` events anymore.\n    if (this._lastPointerEvent) {\n      this._pointerUp(this._lastPointerEvent);\n    }\n  }\n\n  private _bindGlobalEvents(triggerEvent: TouchEvent | MouseEvent) {\n    const element = this._document;\n    const isTouch = isTouchEvent(triggerEvent);\n    const moveEventName = isTouch ? 'touchmove' : 'mousemove';\n    const endEventName = isTouch ? 'touchend' : 'mouseup';\n    element.addEventListener(moveEventName, this._pointerMove, activeEventOptions);\n    element.addEventListener(endEventName, this._pointerUp, activeEventOptions);\n\n    if (isTouch) {\n      element.addEventListener('touchcancel', this._pointerUp, activeEventOptions);\n    }\n\n    const window = this._getWindow();\n\n    if (typeof window !== 'undefined' && window) {\n      window.addEventListener('blur', this._windowBlur);\n    }\n  }\n\n  /** Removes any global event listeners that we may have added. */\n  private _removeGlobalEvents() {\n    const element = this._document;\n    element.removeEventListener('mousemove', this._pointerMove, activeEventOptions);\n    element.removeEventListener('mouseup', this._pointerUp, activeEventOptions);\n    element.removeEventListener('touchmove', this._pointerMove, activeEventOptions);\n    element.removeEventListener('touchend', this._pointerUp, activeEventOptions);\n    element.removeEventListener('touchcancel', this._pointerUp, activeEventOptions);\n\n    const window = this._getWindow();\n\n    if (typeof window !== 'undefined' && window) {\n      window.removeEventListener('blur', this._windowBlur);\n    }\n  }\n\n  private _addEventsToScaleWithScroll() {\n    if (!this._events.has('wheel')) {\n      this._events.set('wheel', this._onWheel);\n      this._ngZone.runOutsideAngular(() => {\n        const element = this._elementRef!.nativeElement;\n        element.addEventListener('wheel', this._onWheel, activeEventOptions);\n      });\n    }\n  }\n  private _removeEventsToScaleWithScroll() {\n    if (this._events.has('wheel')) {\n      this._events.delete('wheel');\n      const host = this._elementRef.nativeElement;\n      host.removeEventListener('wheel', this._onWheel, activeEventOptions);\n    }\n  }\n\n  private _onWheel = (event: WheelEvent) => {\n    if (!this.isLoaded) {\n      return;\n    }\n    event.preventDefault();\n    this._ngZone.run(() => {\n      if (Math.sign(event.deltaY) < 0) {\n        this.zoomIn();\n      } else {\n        this.zoomOut();\n      }\n    });\n\n  }\n\n  /** Use defaultView of injected document if available or fallback to global window reference */\n  private _getWindow(): Window {\n    return this._document.defaultView || window;\n  }\n\n}\n\n/**\n * @dynamic\n */\n@Directive()\nexport class _LyCropperAreaBase implements OnDestroy {\n\n  private _isSliding: boolean;\n  /** Keeps track of the last pointer event that was captured by the crop area. */\n  private _lastPointerEvent: MouseEvent | TouchEvent | null;\n  private _startPointerEvent: {\n    x: number\n    y: number\n  } | null;\n  private _currentWidth: number | null;\n  private _currentHeight: number | null;\n  private _startAreaRect: DOMRect;\n  private _startImgRect: DOMRect;\n\n  /** Used to subscribe to global move and end events */\n  protected _document: Document;\n\n  @ViewChild('resizer') readonly _resizer?: ElementRef;\n\n  @Input()\n  set resizableArea(val: boolean) {\n    if (val !== this._resizableArea) {\n      this._resizableArea = val;\n      Promise.resolve(null).then(() => {\n        if (val) {\n          this._removeResizableArea();\n          this._addResizableArea();\n        } else {\n          this._removeResizableArea();\n        }\n      });\n    }\n  }\n  get resizableArea() {\n    return this._resizableArea;\n  }\n  private _resizableArea: boolean;\n  @Input() keepAspectRatio: boolean;\n  @Input()\n  @Input({ transform: booleanAttribute }) round: boolean;\n  // @Style<boolean, LyCropperArea>(\n  //   (_value, _media) => ({ after }, selectors: SelectorsFn) => {\n  //     const $$ = selectors(STYLES);\n  //     return (_className: string) => `${_className}{ ;`;\n  //   },\n  //   coerceBooleanProperty\n  // ) round: BooleanInput;\n\n  constructor(\n    readonly _elementRef: ElementRef,\n    private _ngZone: NgZone,\n    readonly _cropper: _LyImageCropperBase,\n    @Inject(DOCUMENT) _document: any,\n  ) {\n    this._document = _document;\n  }\n\n  ngOnDestroy() {\n    this._removeResizableArea();\n  }\n\n  private _addResizableArea() {\n    this._ngZone.runOutsideAngular(() => {\n      const element = this._resizer!.nativeElement;\n      element.addEventListener('mousedown', this._pointerDown, activeEventOptions);\n      element.addEventListener('touchstart', this._pointerDown, activeEventOptions);\n    });\n  }\n\n  private _removeResizableArea() {\n    const element = this._resizer?.nativeElement;\n    if (element) {\n      this._lastPointerEvent = null;\n      this._removeGlobalEvents();\n      element.removeEventListener('mousedown', this._pointerDown, activeEventOptions);\n      element.removeEventListener('touchstart', this._pointerDown, activeEventOptions);\n    }\n  }\n\n  private _pointerDown = (event: MouseEvent | TouchEvent) => {\n    this._cropper._isPointerUp.next(false);\n    // Don't do anything if the\n    // user is using anything other than the main mouse button.\n    if (this._isSliding || (!isTouchEvent(event) && event.button !== 0)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    this._ngZone.run(() => {\n      this._isSliding = true;\n      this._lastPointerEvent = event;\n      this._startPointerEvent = getGesturePointFromEvent(event);\n      this._startAreaRect = this._cropper._areaCropperRect();\n      this._startImgRect = this._cropper._canvasRect();\n      this._bindGlobalEvents(event);\n    });\n\n  }\n\n  private _pointerMove = (event: MouseEvent | TouchEvent) => {\n    if (this._isSliding) {\n      event.preventDefault();\n      this._lastPointerEvent = event;\n      const element: HTMLDivElement = this._elementRef.nativeElement;\n      const { width, height, minWidth, minHeight } = this._cropper.config;\n      const point = getGesturePointFromEvent(event);\n      const deltaX = point.x - this._startPointerEvent!.x;\n      const deltaY = point.y - this._startPointerEvent!.y;\n      const startAreaRect = this._startAreaRect;\n      const startImgRect = this._startImgRect;\n      const round = this.round;\n      const keepAspectRatio = this._cropper.config.keepAspectRatio || event.shiftKey;\n      let newWidth = 0;\n      let newHeight = 0;\n      const rootRect = this._cropper._cropperContainerRect();\n\n      if (round) {\n        // The distance from the center of the cropper area to the pointer\n        const originX = ((width / 2 / Math.sqrt(2)) + deltaX);\n        const originY = ((height / 2 / Math.sqrt(2)) + deltaY);\n\n        // Leg\n        const side = Math.sqrt(originX ** 2 + originY ** 2);\n        newWidth = newHeight = side * 2;\n\n      } else if (keepAspectRatio) {\n        newWidth = width + deltaX * 2;\n        newHeight = height + deltaY * 2;\n        if (width !== height) {\n          if (width > height) {\n            newHeight = height / (width / newWidth);\n          } else if (height > width) {\n            newWidth = width / (height / newHeight);\n          }\n        } else {\n          newWidth = newHeight = Math.max(newWidth, newHeight);\n        }\n      } else {\n        newWidth = width + deltaX * 2;\n        newHeight = height + deltaY * 2;\n      }\n\n      // To min width\n      if (newWidth < minWidth!) {\n        newWidth = minWidth!;\n      }\n      // To min height\n      if (newHeight < minHeight!) {\n        newHeight = minHeight!;\n      }\n\n      // Do not overflow the cropper area\n      const centerX = startAreaRect.x + startAreaRect.width / 2;\n      const centerY = startAreaRect.y + startAreaRect.height / 2;\n      const topOverflow = startImgRect.y > centerY - (newHeight / 2);\n      const bottomOverflow = centerY + (newHeight / 2) > startImgRect.bottom;\n      const minHeightOnOverflow = Math.min((centerY - startImgRect.y) * 2, (startImgRect.bottom - centerY) * 2);\n      const leftOverflow = startImgRect.x > centerX - (newWidth / 2);\n      const rightOverflow = centerX + (newWidth / 2) > startImgRect.right;\n      const minWidthOnOverflow = Math.min((centerX - startImgRect.x) * 2, (startImgRect.right - centerX) * 2);\n      const minOnOverflow = Math.min(minWidthOnOverflow, minHeightOnOverflow);\n      if (round) {\n        if (topOverflow || bottomOverflow || leftOverflow || rightOverflow) {\n          newHeight = newWidth = minOnOverflow;\n        }\n      } else if (keepAspectRatio) {\n        const newNewWidth: number[] = [];\n        const newNewHeight: number[] = [];\n        if ((topOverflow || bottomOverflow)) {\n          newHeight = minHeightOnOverflow;\n          newNewHeight.push(newHeight);\n          newWidth = width / (height / minHeightOnOverflow);\n          newNewWidth.push(newWidth);\n        }\n        if ((leftOverflow || rightOverflow)) {\n          newWidth = minWidthOnOverflow;\n          newNewWidth.push(newWidth);\n          newHeight = height / (width / minWidthOnOverflow);\n          newNewHeight.push(newHeight);\n        }\n        if (newNewWidth.length === 2) {\n          newWidth = Math.min(...newNewWidth);\n        }\n        if (newNewHeight.length === 2) {\n          newHeight = Math.min(...newNewHeight);\n        }\n      } else {\n        if (topOverflow || bottomOverflow) {\n          newHeight = minHeightOnOverflow;\n        }\n        if (leftOverflow || rightOverflow) {\n          newWidth = minWidthOnOverflow;\n        }\n      }\n\n      // Do not overflow the container\n      if (round) {\n        const min = Math.min(rootRect.width, rootRect.height);\n        if (newWidth > min) {\n          newWidth = newHeight = min;\n        } else if (newHeight > min) {\n          newWidth = newHeight = min;\n        }\n      } else if (keepAspectRatio) {\n        if (newWidth > rootRect.width) {\n          newWidth = rootRect.width;\n          newHeight = height / (width / rootRect.width);\n        }\n        if (newHeight > rootRect.height) {\n          newWidth = width / (height / rootRect.height);\n          newHeight = rootRect.height;\n        }\n      } else {\n        if (newWidth > rootRect.width) {\n          newWidth = rootRect.width;\n        }\n        if (newHeight > rootRect.height) {\n          newHeight = rootRect.height;\n        }\n      }\n\n\n      // round values\n      const newWidthRounded = Math.round(newWidth);\n      const newHeightRounded = Math.round(newHeight);\n\n      element.style.width = `${newWidthRounded}px`;\n      element.style.height = `${newHeightRounded}px`;\n      this._currentWidth = newWidthRounded;\n      this._currentHeight = newHeightRounded;\n    }\n  }\n\n  /** Called when the user has lifted their pointer. */\n  private _pointerUp = (event: TouchEvent | MouseEvent) => {\n    this._cropper._isPointerUp.next(true);\n    const hasChange = this._currentWidth !== this._cropper._initialAreaWidth\n      || this._currentHeight !== this._cropper._initialAreaHeight;\n\n    if (this._isSliding && (this._currentWidth != null)) {\n      event.preventDefault();\n      this._removeGlobalEvents();\n      this._cropper._areaWidthResized = hasChange ? this._currentWidth : null;\n      this._cropper._areaHeightResized = hasChange ? this._currentHeight : null;\n      // this._cropper._initialAreaWidth =\n      this._cropper.config.width = this._currentWidth!;\n      // this._cropper._initialAreaHeight =\n      this._cropper.config.height = this._currentHeight!;\n      this._cropper._updateMinScale();\n      this._cropper._updateMaxScale();\n      this._cropper._updateAbsoluteScale();\n      this._isSliding = false;\n      this._startPointerEvent = null;\n      this._currentWidth = null;\n      this._currentHeight = null;\n      this._cropper._markForCheck();\n    }\n  }\n\n  /** Called when the window has lost focus. */\n  private _windowBlur = () => {\n    // If the window is blurred while dragging we need to stop dragging because the\n    // browser won't dispatch the `mouseup` and `touchend` events anymore.\n    if (this._lastPointerEvent) {\n      this._pointerUp(this._lastPointerEvent);\n    }\n  }\n\n  private _bindGlobalEvents(triggerEvent: TouchEvent | MouseEvent) {\n    const element = this._document;\n    const isTouch = isTouchEvent(triggerEvent);\n    const moveEventName = isTouch ? 'touchmove' : 'mousemove';\n    const endEventName = isTouch ? 'touchend' : 'mouseup';\n    element.addEventListener(moveEventName, this._pointerMove, activeEventOptions);\n    element.addEventListener(endEventName, this._pointerUp, activeEventOptions);\n\n    if (isTouch) {\n      element.addEventListener('touchcancel', this._pointerUp, activeEventOptions);\n    }\n\n    const window = this._getWindow();\n\n    if (typeof window !== 'undefined' && window) {\n      window.addEventListener('blur', this._windowBlur);\n    }\n  }\n\n  /** Removes any global event listeners that we may have added. */\n  private _removeGlobalEvents() {\n    const element = this._document;\n    element.removeEventListener('mousemove', this._pointerMove, activeEventOptions);\n    element.removeEventListener('mouseup', this._pointerUp, activeEventOptions);\n    element.removeEventListener('touchmove', this._pointerMove, activeEventOptions);\n    element.removeEventListener('touchend', this._pointerUp, activeEventOptions);\n    element.removeEventListener('touchcancel', this._pointerUp, activeEventOptions);\n\n    const window = this._getWindow();\n\n    if (typeof window !== 'undefined' && window) {\n      window.removeEventListener('blur', this._windowBlur);\n    }\n  }\n\n  /** Use defaultView of injected document if available or fallback to global window reference */\n  private _getWindow(): Window {\n    return this._document.defaultView || window;\n  }\n}\n\n/**\n * Normalize degrees for cropper rotation\n * @docs-private\n */\nexport function _normalizeDegrees(n: number) {\n  const de = n % 360;\n  if (de % 90) {\n    throw new Error(`LyCropper: Invalid \\`${n}\\` degree, only accepted values: 0, 90, 180, 270 & 360.`);\n  }\n  return de;\n}\n\n/**\n * @docs-private\n */\nfunction createCanvasImg(img: HTMLCanvasElement | HTMLImageElement) {\n\n  // create a new canvas\n  const newCanvas = document.createElement('canvas');\n  const context = newCanvas.getContext('2d')!;\n\n  // set dimensions\n  newCanvas.width = img.width;\n  newCanvas.height = img.height;\n\n  // apply the old canvas to the new one\n  context.drawImage(img, 0, 0);\n\n  // return the new canvas\n  return newCanvas;\n}\n\nfunction normalizeSVG(dataURL: string) {\n  if (window.atob && isSvgImage(dataURL)) {\n    const len = dataURL.length / 5;\n    const text = window.atob(dataURL.replace(DATA_IMAGE_SVG_PREFIX, ''));\n    const span = document.createElement('span');\n    span.innerHTML = text;\n    const svg = span.querySelector('svg')!;\n    span.setAttribute('style', 'display:none');\n    document.body.appendChild(span);\n    const width = parseFloat(getComputedStyle(svg).width!) || 1;\n    const height = parseFloat(getComputedStyle(svg).height!) || 1;\n    const max = Math.max(width, height);\n\n    svg.setAttribute('width', `${len / (width / max)}px`);\n    svg.setAttribute('height', `${len / (height / max)}px`);\n    // const result = DATA_IMAGE_SVG_PREFIX + window.btoa(span.innerHTML);\n    document.body.removeChild(span);\n    const blob = new Blob([span.innerHTML], {type: 'image/svg+xml'});\n    return URL.createObjectURL(blob);\n  }\n  return dataURL;\n}\n\nfunction isSvgImage(dataUrl: string) {\n  return dataUrl.startsWith(DATA_IMAGE_SVG_PREFIX);\n}\n\nfunction createHtmlImg(src: string) {\n  const img = new Image();\n  img.crossOrigin = 'anonymous';\n  img.src = src;\n  return img;\n}\n\nfunction getGesturePointFromEvent(event: TouchEvent | MouseEvent) {\n\n  // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.\n  const point = isTouchEvent(event)\n    ? (event.touches[0] || event.changedTouches[0])\n    : event;\n\n  return {\n    x: point.clientX,\n    y: point.clientY\n  };\n}\n\n\n/** Returns whether an event is a touch event. */\nfunction isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent {\n  return event.type[0] === 't';\n}\n\n// Calculate distance between two fingers\nfunction calDistanceFromTouchEvent(event: TouchEvent) {\n  return Math.hypot(event.touches[0].clientX - event.touches[1].clientX, event.touches[0].clientY - event.touches[1].clientY);\n};\n\nfunction getCenterFromTouchEvent(event: TouchEvent) {\n  const x = (event.touches[0].pageX + event.touches[1].pageX) / 2;\n  const y = (event.touches[0].pageY + event.touches[1].pageY) / 2;\n  return { x, y }\n}\n","import {\n  Component,\n  Input,\n  ChangeDetectionStrategy,\n  OnDestroy,\n  OnInit,\n  AfterViewInit,\n  inject,\n  booleanAttribute\n} from '@angular/core';\nimport {\n  LY_COMMON_STYLES,\n  ThemeVariables,\n  st2c,\n  StyleCollection,\n  LyClasses,\n  StyleTemplate,\n  StyleRenderer,\n  WithStyles,\n  Style,\n  SelectorsFn } from '@alyle/ui';\nimport { NgIf, NgStyle } from '@angular/common';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { color } from '@alyle/ui/color';\nimport { _LyCropperAreaBase, _LyImageCropperBase } from './_image-cropper-base';\n\nexport interface LyImageCropperTheme {\n  /** Styles for Image Cropper Component */\n  root?: StyleCollection<((classes: LyClasses<typeof STYLES>) => StyleTemplate)>\n    | ((classes: LyClasses<typeof STYLES>) => StyleTemplate);\n}\n\nexport interface LyImageCropperVariables {\n  cropper?: LyImageCropperTheme;\n}\n\nconst STYLE_PRIORITY = -2;\nconst pos = (100 * Math.sqrt(2) - 100) / 2 / Math.sqrt(2);\n\nexport const STYLES = (theme: ThemeVariables & LyImageCropperVariables, selectors: SelectorsFn) => {\n  const $$ = selectors(STYLES);\n  const { after } = theme;\n  const transition = `${theme.animations.curves.acceleration} 100ms`;\n  return {\n    $name: LyImageCropper.и,\n    $priority: STYLE_PRIORITY,\n    root: ( ) => (_className: string) => `${_className}{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;overflow:hidden;position:relative;justify-content:center;align-items:center;}${st2c((\n          (theme.cropper\n            && theme.cropper.root\n            && (theme.cropper.root instanceof StyleCollection\n              ? theme.cropper.root.setTransformer(fn => fn($$))\n              : theme.cropper.root($$))\n          )), `${_className}`)}`,\n    cropperContainer: (_className: string) => `${_className}{position:relative;margin:auto;width:80%;height:80%;}`,\n    imgContainer: (_className: string) => `${_className}{cursor:move;position:absolute;top:0;left:0;display:flex;touch-action:none;}${_className} > canvas{display:block;}`,\n    overlay: (_className: string) => `${st2c((LY_COMMON_STYLES.fill), `${_className}`)}`,\n    area: (_className: string) => `${_className}{pointer-events:none;box-shadow:0 0 0 20000px rgba(0,0,0,0.4);}${st2c((LY_COMMON_STYLES.fill), `${_className}`)}${_className}{margin:auto;}${st2c((LY_COMMON_STYLES.fill), `${_className}:before,${_className}:after`)}${_className}:before,${_className}:after{content:'';}${_className}:before{width:0;height:0;margin:auto;border-radius:50%;background:#fff;border:solid 2px rgb(255,255,255);}${_className}:after{border:solid 2px rgb(255,255,255);border-radius:inherit;}`,\n    grid: (_className: string) => `${_className}{position:absolute;width:100%;height:100%;opacity:0;transition:${transition};}${_className}::before,${_className}::after{content:' ';box-sizing:border-box;position:absolute;border:1px solid ${color(0xffffff, 0.4)};}${_className}::before{top:0;bottom:0;left:33.33%;right:33.33%;border-top:0;border-bottom:0;}${_className}::after{top:33.33%;bottom:33.33%;left:0;right:0;border-left:0;border-right:0;}`,\n    showGrid: () => (_className: string) => `${_className} ${$$.grid}{opacity:1;}`,\n    isPointerUp: null,\n    resizer: (_className: string) => `${_className}{width:10px;height:10px;background:#fff;border-radius:3px;position:absolute;touch-action:none;bottom:0;${after}:0;pointer-events:all;cursor:${\n        after === 'right'\n          ? 'nwse-resize'\n          : 'nesw-resize'};}${st2c((LY_COMMON_STYLES.fill), `${_className}:before`)}${_className}:before{content:'';width:30px;height:30px;transform:translate(-35%,-35%);}`,\n    defaultContent: (_className: string) => `${_className}{display:flex;align-items:center;justify-content:center;}${st2c((LY_COMMON_STYLES.fill), `${_className},${_className} > input`)}${_className} *:not(input){pointer-events:none;}${_className} > input{background:transparent;opacity:0;width:100%;height:100%;}`\n  };\n};\n\n/**\n * @dynamic\n */\n@Component({\n  selector: 'ly-cropper-area',\n  templateUrl: './image-cropper-area.html',\n  providers: [\n    StyleRenderer\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  exportAs: 'lyCropperArea',\n  standalone: true,\n  imports: [NgIf],\n})\nexport class LyCropperArea extends _LyCropperAreaBase implements WithStyles, OnDestroy {\n  readonly sRenderer = inject(StyleRenderer);\n  readonly classes = this.sRenderer.renderSheet(STYLES, 'area');\n\n  @Input({\n    transform: booleanAttribute\n  })\n  @Style<boolean, LyCropperArea>(\n    (_value, _media) => ({ after }, selectors: SelectorsFn) => {\n      const $$ = selectors(STYLES);\n      return (_className: string) => `${_className}{border-radius:50%;}${_className} ${$$.resizer}{${after}:${pos}%;bottom:${pos}%;transform:translate(4px,4px);}${_className} ${$$.grid}{border-radius:50%;overflow:hidden;}`;\n    },\n    coerceBooleanProperty\n  ) round: boolean;\n}\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  preserveWhitespaces: false,\n  selector: 'ly-img-cropper, ly-image-cropper',\n  templateUrl: 'image-cropper.html',\n  providers: [\n    StyleRenderer,\n    {provide: _LyImageCropperBase, useExisting: LyImageCropper},\n  ],\n  standalone: true,\n  imports: [LyCropperArea, NgStyle, NgIf]\n})\nexport class LyImageCropper extends _LyImageCropperBase implements OnInit, AfterViewInit, OnDestroy {\n\n  readonly sRenderer = inject(StyleRenderer);\n  readonly classes = this.sRenderer.renderSheet(STYLES, 'root');\n  override areaGridActiveCssClass = this.classes.showGrid;\n}\n","<div #resizer\n  *ngIf=\"resizableArea\"\n  [class]=\"classes.resizer\"\n>\n</div>\n<div [class]=\"classes.grid\"></div>\n","<!-- (selectstart): On Safari starting to slide temporarily triggers text selection mode which\nshow the wrong cursor. We prevent it by stopping the `selectstart` event. -->\n<div #_cropperContainer class=\"{{classes.cropperContainer}}\">\n  <div #_imgContainer\n    [className]=\"classes.imgContainer\"\n    (selectstart)=\"$event.preventDefault()\"\n  >\n    <canvas #_imgCanvas></canvas>\n  </div>\n  <ly-cropper-area #_area\n    [round]=\"!!config.round\"\n    [resizableArea]=\"!!config.resizableArea\"\n    [keepAspectRatio]=\"!!config.keepAspectRatio\"\n    *ngIf=\"_isLoadedImg; else content\"\n    [ngStyle]=\"{\n      width: config.width + 'px',\n      height: config.height + 'px'\n    }\"></ly-cropper-area>\n</div>\n<ng-template #content>\n  <div [className]=\"classes.defaultContent\">\n    <input #_fileInput type=\"file\" (change)=\"selectInputEvent($event)\" accept=\"image/*\">\n    <ng-content></ng-content>\n  </div>\n</ng-template>\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  OnDestroy,\n  OnInit,\n  AfterViewInit,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { NgStyle } from '@angular/common';\nimport { _LyCropperAreaBase, _LyImageCropperBase } from './_image-cropper-base';\n\n/**\n * @dynamic\n */\n@Component({\n  selector: 'ly-cropper-area-base',\n  templateUrl: './image-cropper-area-base.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  exportAs: 'lyCropperAreaBase',\n  standalone: true,\n  host: {\n    'class': 'ly-cropper-area'\n  }\n})\nexport class LyCropperAreaBase extends _LyCropperAreaBase implements OnDestroy { }\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  selector: 'ly-img-cropper-base, ly-image-cropper-base',\n  templateUrl: 'image-cropper-base.html',\n  styleUrl: 'image-cropper-base.scss',\n  providers: [\n    {provide: _LyImageCropperBase, useExisting: LyImageCropperBase},\n  ],\n  standalone: true,\n  exportAs: 'lyImageCropperBase',\n  imports: [LyCropperAreaBase, NgStyle],\n  host: {\n    'class': 'ly-cropper-root'\n  },\n  encapsulation: ViewEncapsulation.None\n})\nexport class LyImageCropperBase extends _LyImageCropperBase implements OnInit, AfterViewInit, OnDestroy {\n  override areaGridActiveCssClass = 'ly-cropper-area-grid-active';\n}\n","@if (resizableArea) {\n  <div #resizer\n    class=\"ly-cropper-area-resizer\"\n  >\n  </div>\n}\n<div class=\"ly-cropper-area-grid\"></div>\n","<!-- (selectstart): On Safari starting to slide temporarily triggers text selection mode which\nshow the wrong cursor. We prevent it by stopping the `selectstart` event. -->\n<div #_cropperContainer class=\"ly-cropper-container\">\n  <div #_imgContainer\n    class=\"ly-cropper-img-container\"\n    (selectstart)=\"$event.preventDefault()\"\n  >\n    <canvas #_imgCanvas></canvas>\n  </div>\n  @if (_isLoadedImg) {\n    <ly-cropper-area-base #_area\n      [round]=\"!!config.round\"\n      [resizableArea]=\"!!config.resizableArea\"\n      [keepAspectRatio]=\"!!config.keepAspectRatio\"\n      [ngStyle]=\"{\n        width: config.width + 'px',\n        height: config.height + 'px'\n      }\"></ly-cropper-area-base>\n  } @else {\n    <div class=\"ly-cropper-default-content\">\n      <input #_fileInput type=\"file\" (change)=\"selectInputEvent($event)\" accept=\"image/*\">\n      <ng-content></ng-content>\n    </div>\n  }\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { LyImageCropper, LyCropperArea } from './image-cropper';\nimport { LyImageCropperBase } from './image-cropper-base';\n\n\n@NgModule({\n  imports: [LyImageCropper, LyCropperArea],\n  exports: [LyImageCropper, LyCropperArea]\n})\nexport class LyImageCropperModule { }\n\n@NgModule({\n  imports: [LyImageCropperBase],\n  exports: [LyImageCropperBase]\n})\nexport class LyImageCropperBaseModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}