{"version":3,"file":"ngx-sdcore-media.mjs","sources":["../../../projects/ngx-sdcore/media/ngx-file-upload/ngx-file-upload.component.ts","../../../projects/ngx-sdcore/media/ngx-file-upload/ngx-file-upload.component.html","../../../projects/ngx-sdcore/media/ngx-media-upload/ngx-media-upload.component.ts","../../../projects/ngx-sdcore/media/ngx-media-upload/ngx-media-upload.component.html","../../../projects/ngx-sdcore/media/ngx-sdcore-media.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  standalone: true,\r\n  // eslint-disable-next-line @angular-eslint/component-selector\r\n  selector: 'ngx-file-upload',\r\n  templateUrl: './ngx-file-upload.component.html',\r\n  styleUrls: ['./ngx-file-upload.component.scss'],\r\n})\r\nexport class NgxFileUploadComponent { }\r\n","<p>ngx-file-upload works!</p>\r\n","/* eslint-disable @angular-eslint/no-output-native */\r\n/* eslint-disable @angular-eslint/component-selector */\r\nimport {\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  Input,\r\n  Output,\r\n  TemplateRef,\r\n  ViewChild,\r\n} from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport {\r\n  IMAGE_TYPES_CONST,\r\n  MEDIA_TYPE_CONST,\r\n  VIDEO_TYPES_CONST, OperationResult, MediaItem, FunctionUtility, NgSnotifyService, MSG_CONST, TITLE_CONST\r\n} from 'ngx-sdcore/common';\r\nimport {\r\n  ImageCroppedEvent,\r\n  ImageCropperModule,\r\n  ImageTransform,\r\n} from 'ngx-image-cropper';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\n\r\n@Component({\r\n  standalone: true,\r\n  selector: 'ngx-media-upload',\r\n  templateUrl: './ngx-media-upload.component.html',\r\n  styleUrls: ['./ngx-media-upload.component.scss'],\r\n  imports: [CommonModule, FormsModule, ImageCropperModule, NgSelectModule],\r\n})\r\nexport class NgxMediaUploadComponent {\r\n  protected types: Map<string, string> = new Map();\r\n  protected mediaItem: MediaItem = <MediaItem>{};\r\n  protected acceptedExtensions = '';\r\n  protected previewSrcSafe: SafeResourceUrl = '';\r\n  protected previewType = '';\r\n  protected id = '';\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n  protected tooltips: any[] = [];\r\n  protected mediaType: typeof MEDIA_TYPE_CONST = MEDIA_TYPE_CONST;\r\n  protected imagePlusUrl = 'assets/image-plus.svg';\r\n  protected imageErrorUrl = 'assets/image-error.svg';\r\n  protected imagePreviewUrl = 'assets/view.svg';\r\n  protected imageCopyUrl = 'assets/copy.svg';\r\n  protected imageDeleteUrl = 'assets/delete.svg';\r\n  protected imageCropUrl = 'assets/crop.svg';\r\n  protected cropEditImage = 'assets/edit.svg';\r\n  protected cropFlipHorizontalImage = 'assets/flip-horizontal.svg';\r\n  protected cropFlipVerticalImage = 'assets/flip-vertical.svg';\r\n  protected cropResetChangesImage = 'assets/reset-changes.svg';\r\n  protected cropRotateLeftImage = 'assets/rotate-left.svg';\r\n  protected cropRotateRightImage = 'assets/rotate-right.svg';\r\n  protected cropZoomInImage = 'assets/zoom-in.svg';\r\n  protected cropZoomOutImage = 'assets/zoom-out.svg';\r\n  protected cropRotateImage = 'assets/rotate.svg';\r\n  protected cropRatioImage = 'assets/ratio.svg';\r\n  protected selectionCropImage = 'assets/selection.svg';\r\n  protected cropImage: MediaItem = <MediaItem>{};\r\n  protected canvasRotation = 0;\r\n  protected transform: ImageTransform = <ImageTransform>{};\r\n  protected rotation = 0;\r\n  protected scale = 1;\r\n  protected containWithinAspectRatio = false;\r\n  protected fileName = '';\r\n  protected maintainAspectRatio = false;\r\n  protected aspectRatio = 0;\r\n  protected isRoundCropper = false;\r\n  protected textToCompare = false;\r\n\r\n  protected modal: BsModalRef | undefined;\r\n  protected cropModal: BsModalRef | undefined;\r\n\r\n  @ViewChild('videoSrcModal') protected modalMediaVideo: ElementRef | undefined;\r\n  @Input() public src = '';\r\n  @Input() public accept = 'image/*, video/*';\r\n  @Input() public maxSize = 999999999999999;\r\n  @Input() public height = 150;\r\n  @Input() public file: File = new File([], '');\r\n  @Input() public copy = false;\r\n  @Input() public crop = false;\r\n  @Input() public remove = false;\r\n  @Input() public preview = false;\r\n  @Input() public disabled = false;\r\n  @Input() public confirmRemove = false;\r\n  @Output() protected fileChange: EventEmitter<File> = new EventEmitter();\r\n  @Output() protected result: EventEmitter<OperationResult> =\r\n    new EventEmitter();\r\n\r\n  constructor(\r\n    private snotify: NgSnotifyService,\r\n    private modalService: BsModalService,\r\n    protected sanitizer: DomSanitizer\r\n  ) {\r\n    this.id = FunctionUtility.nextID();\r\n  }\r\n\r\n  // eslint-disable-next-line @angular-eslint/use-lifecycle-interface\r\n  public ngOnInit(): void {\r\n    IMAGE_TYPES_CONST.forEach((type) =>\r\n      this.types.set(type, MEDIA_TYPE_CONST.IMG)\r\n    );\r\n    VIDEO_TYPES_CONST.forEach((type) =>\r\n      this.types.set(type, MEDIA_TYPE_CONST.VIDEO)\r\n    );\r\n    this.initialMediaItem();\r\n    this.calculateAcceptedExtensions();\r\n  }\r\n\r\n  public reset(): void {\r\n    this.mediaItem = <MediaItem>{\r\n      id: this.id,\r\n      srcSafe: this.sanitizer.bypassSecurityTrustUrl(this.src),\r\n      src: this.src,\r\n      type: this.checkMediaType(this.src),\r\n    };\r\n    this.resetImage();\r\n    this.fileChange.emit(undefined);\r\n    this.result.emit({ isSuccess: true, data: 'RESET' } as OperationResult);\r\n  }\r\n\r\n  protected async initialMediaItem(): Promise<void> {\r\n    let file: File = new File([], '');\r\n\r\n    if (this.src) {\r\n      const extension: string | undefined = this.src.split('.').pop();\r\n      const mineType: string = this.getMineType(extension as string);\r\n      const url = this.src;\r\n      const fileName = url.substring(url.lastIndexOf('/') + 1);\r\n      file = await this.urltoFile(this.src, fileName, mineType);\r\n    }\r\n\r\n    this.mediaItem = <MediaItem>{\r\n      id: this.id,\r\n      srcSafe: this.sanitizer.bypassSecurityTrustUrl(this.src),\r\n      src: this.src,\r\n      type: this.checkMediaType(this.src),\r\n      file: file,\r\n    };\r\n  }\r\n\r\n  protected checkMediaType(src: string | undefined): string {\r\n    if (\r\n      !src ||\r\n      typeof src === 'object' ||\r\n      typeof src === 'number' ||\r\n      !src.trim()\r\n    )\r\n      return MEDIA_TYPE_CONST.IMG;\r\n\r\n    const url: URL = new URL(src);\r\n    const extension: string = url.pathname.split('.')[1];\r\n    const type: string | undefined = this.types.get(extension);\r\n    return type ? type : MEDIA_TYPE_CONST.IMG;\r\n  }\r\n\r\n  protected onRemoveMediaClicked(): void {\r\n    this.confirmRemove\r\n      ? this.snotify.confirm(TITLE_CONST.DELETE, MSG_CONST.DELETE, () =>\r\n        this.removeMedia()\r\n      )\r\n      : this.removeMedia();\r\n  }\r\n\r\n  protected removeMedia(): void {\r\n    this.mediaItem = <MediaItem>{ id: this.id };\r\n    this.resetImage();\r\n    this.fileChange.emit(this.mediaItem.file);\r\n    this.result.emit({ isSuccess: true, data: 'REMOVE' } as OperationResult);\r\n  }\r\n\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n  protected onSelectFile(event: any): void {\r\n    if (event.target.files && event.target.files[0]) {\r\n      const file: File = event.target.files[0];\r\n      const size: number = file.size;\r\n      const extension: string | undefined = file.name.split('.').pop();\r\n      this.fileName = file.name;\r\n      if (\r\n        !extension ||\r\n        !this.types.get(extension) ||\r\n        !this.acceptedExtensions.includes(extension?.toLowerCase())\r\n      ) {\r\n        event.target.value = '';\r\n        return this.result.emit({\r\n          isSuccess: false,\r\n          data: 'BROWSE',\r\n          error: 'INVALID_FILE_TYPE',\r\n        });\r\n      }\r\n\r\n      if (size > this.maxSize) {\r\n        event.target.value = '';\r\n        return this.result.emit({\r\n          isSuccess: false,\r\n          data: 'BROWSE',\r\n          error: 'INVALID_FILE_SIZE',\r\n        });\r\n      }\r\n      this.crop = IMAGE_TYPES_CONST.includes(extension);\r\n      const mediaItem: MediaItem = <MediaItem>{\r\n        id: this.id,\r\n        file,\r\n        type: this.types.get(extension?.toLowerCase()),\r\n      };\r\n      const reader = new FileReader();\r\n      reader.readAsDataURL(file);\r\n      reader.onload = (e) => {\r\n        mediaItem.srcSafe = this.sanitizer.bypassSecurityTrustResourceUrl(\r\n          e.target?.result?.toString() ?? ''\r\n        );\r\n        mediaItem.src = e.target?.result?.toString() ?? '';\r\n        this.mediaItem = mediaItem;\r\n        this.fileChange.emit(mediaItem.file);\r\n        this.result.emit({\r\n          isSuccess: true,\r\n          data: 'BROWSE',\r\n        } as OperationResult);\r\n      };\r\n    }\r\n\r\n    event.target.value = '';\r\n  }\r\n\r\n  protected calculateAcceptedExtensions(): void {\r\n    let result: string = this.accept;\r\n\r\n    if (!this.accept || !this.accept.trim())\r\n      result +=\r\n        IMAGE_TYPES_CONST.map((type) => `.${type}`).join(', ') +\r\n        ', ' +\r\n        VIDEO_TYPES_CONST.map((type) => `.${type}`).join(', ');\r\n\r\n    if (this.accept.includes('image/*'))\r\n      result = result.replace(\r\n        'image/*',\r\n        IMAGE_TYPES_CONST.map((type) => `.${type}`).join(', ')\r\n      );\r\n\r\n    if (this.accept.includes('video/*'))\r\n      result = result.replace(\r\n        'video/*',\r\n        VIDEO_TYPES_CONST.map((type) => `.${type}`).join(', ')\r\n      );\r\n\r\n    this.acceptedExtensions = result;\r\n  }\r\n\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n  protected openModal(template: TemplateRef<any>) {\r\n    if (\r\n      this.preview &&\r\n      this.mediaItem &&\r\n      this.mediaItem.srcSafe &&\r\n      this.mediaItem.type\r\n    ) {\r\n      this.previewSrcSafe = this.mediaItem.srcSafe;\r\n      this.previewType = this.mediaItem.type;\r\n      this.modal = this.modalService.show(template, { class: 'modal-lg' });\r\n    }\r\n  }\r\n\r\n  protected copySrc() {\r\n    navigator.clipboard.writeText(this.src);\r\n    this.result.emit({ isSuccess: true, data: 'COPY' } as OperationResult);\r\n  }\r\n\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n  protected openCropModal(template: TemplateRef<any>) {\r\n    if (\r\n      this.crop &&\r\n      this.mediaItem &&\r\n      this.mediaItem.file &&\r\n      this.mediaItem.type\r\n    ) {\r\n      this.cropImage = { ...this.mediaItem };\r\n      this.cropModal = this.modalService.show(template, {\r\n        class: 'modal-lg imageCropper',\r\n        backdrop: 'static',\r\n      });\r\n    }\r\n  }\r\n\r\n  protected imageCropped(event: ImageCroppedEvent) {\r\n    this.cropImage.src = event.base64 ?? event.objectUrl ?? '';\r\n    this.cropImage.srcSafe = this.sanitizer.bypassSecurityTrustResourceUrl(\r\n      this.cropImage.src\r\n    );\r\n  }\r\n\r\n  protected rotateLeft() {\r\n    this.canvasRotation--;\r\n    this.flipAfterRotate();\r\n  }\r\n\r\n  protected rotateRight() {\r\n    this.canvasRotation++;\r\n    this.flipAfterRotate();\r\n  }\r\n\r\n  private flipAfterRotate() {\r\n    const flippedH = this.transform.flipH;\r\n    const flippedV = this.transform.flipV;\r\n    this.transform = {\r\n      ...this.transform,\r\n      flipH: flippedV,\r\n      flipV: flippedH,\r\n    };\r\n  }\r\n\r\n  protected flipHorizontal() {\r\n    this.transform = {\r\n      ...this.transform,\r\n      flipH: !this.transform.flipH,\r\n    };\r\n  }\r\n\r\n  protected flipVertical() {\r\n    this.transform = {\r\n      ...this.transform,\r\n      flipV: !this.transform.flipV,\r\n    };\r\n  }\r\n\r\n  protected resetImage() {\r\n    this.canvasRotation = 0;\r\n    this.transform = {};\r\n    this.rotation = 0;\r\n    this.scale = 1;\r\n    this.containWithinAspectRatio = false;\r\n    this.fileName = '';\r\n    this.maintainAspectRatio = false;\r\n    this.aspectRatio = 0;\r\n    this.textToCompare = false;\r\n    this.updateCropper();\r\n  }\r\n\r\n  protected zoomOut() {\r\n    this.scale -= 0.1;\r\n    this.transform = {\r\n      ...this.transform,\r\n      scale: this.scale,\r\n    };\r\n  }\r\n\r\n  protected zoomIn() {\r\n    this.scale += 0.1;\r\n    this.transform = {\r\n      ...this.transform,\r\n      scale: this.scale,\r\n    };\r\n  }\r\n\r\n  protected toggleContainWithinAspectRatio() {\r\n    this.containWithinAspectRatio = !this.containWithinAspectRatio;\r\n  }\r\n\r\n  protected updateRotation() {\r\n    this.transform = {\r\n      ...this.transform,\r\n      rotate: this.rotation,\r\n    };\r\n  }\r\n\r\n  protected updateRatio() {\r\n    this.maintainAspectRatio = this.aspectRatio > 0;\r\n  }\r\n\r\n  protected updateCropper() {\r\n    this.maintainAspectRatio = this.textToCompare;\r\n    this.aspectRatio = this.textToCompare ? 1 : 0;\r\n    this.isRoundCropper = this.textToCompare;\r\n  }\r\n\r\n  protected async saveImage() {\r\n    this.mediaItem.file = await this.urltoFile(\r\n      this.cropImage.src as string,\r\n      this.mediaItem.file.name,\r\n      this.mediaItem.file.type\r\n    );\r\n    this.mediaItem.srcSafe = this.cropImage.srcSafe;\r\n    this.fileChange.emit(this.mediaItem.file);\r\n    this.result.emit({ isSuccess: true, data: 'CROP' } as OperationResult);\r\n    this.cropModal?.hide();\r\n  }\r\n\r\n  protected async urltoFile(\r\n    url: string,\r\n    fileName: string,\r\n    mimeType: string\r\n  ): Promise<File> {\r\n    mimeType = mimeType || (url.match(/^data:([^;]+);/) || '')[1];\r\n    const res = await fetch(url);\r\n    const buf = await res.arrayBuffer();\r\n    return new File([buf], fileName, { type: mimeType });\r\n  }\r\n\r\n  protected async urlToFile(url: string): Promise<File> {\r\n    const res = await fetch(url);\r\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n    const buf = await res.arrayBuffer();\r\n    return new File([], 'fileName');\r\n  }\r\n\r\n  protected getMineType(extension: string): string {\r\n    const isImage = IMAGE_TYPES_CONST.includes(extension?.toLowerCase());\r\n    return `${isImage ? 'image' : 'video'}/${extension}`;\r\n  }\r\n}\r\n","<div id=\"mediaUploader\" [ngStyle]=\"{ height: height + 'px' }\">\r\n  <div *ngIf=\"(!mediaItem.type || !mediaItem.src) && !disabled\"\r\n    class=\"card uploader\">\r\n    <div class=\"card-body\">\r\n      <div class=\"group-container\">\r\n        <img *ngIf=\"height >= 10\" [src]=\"imagePlusUrl\" />\r\n        <label [for]=\"'inputBrowseFile' + id\" class=\"btn btn-primary\"\r\n          type=\"button\">\r\n          Browse Files\r\n          <input type=\"file\" [name]=\"'browse-file-' + mediaItem.id\"\r\n            [id]=\"'inputBrowseFile' + id\" [accept]=\"accept\" [multiple]=\"false\"\r\n            hidden (change)=\"onSelectFile($event)\" />\r\n        </label>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div *ngIf=\"mediaItem.type && mediaItem.src\" class=\"card media\">\r\n    <div class=\"card-body\">\r\n      <img #imgSrc *ngIf=\"mediaItem.type === mediaType.IMG\"\r\n        [src]=\"mediaItem.srcSafe\"\r\n        (error)=\"imgSrc.hidden = true; imgError.hidden = false\"\r\n        [ngClass]=\"{ 'round-img-review': isRoundCropper }\" />\r\n\r\n      <video #videoSrc *ngIf=\"mediaItem.type === mediaType.VIDEO\"\r\n        [src]=\"mediaItem.srcSafe\"\r\n        (error)=\"videoSrc.hidden = true; imgError.hidden = false\"></video>\r\n\r\n      <img #imgError [src]=\"imageErrorUrl\" hidden />\r\n\r\n      <div class=\"action-button-group\">\r\n        <button *ngIf=\"preview\" type=\"button\" class=\"btn btn-light\"\r\n          (click)=\"openModal(modelTemplate)\">\r\n          <img [src]=\"imagePreviewUrl\" />\r\n        </button>\r\n        <button *ngIf=\"copy\" type=\"button\" class=\"btn btn-light\"\r\n          (click)=\"copySrc()\">\r\n          <img [src]=\"imageCopyUrl\" />\r\n        </button>\r\n        <button *ngIf=\"crop\" type=\"button\" class=\"btn btn-light\"\r\n          (click)=\"openCropModal(cropImageTemplate)\">\r\n          <img [src]=\"imageCropUrl\" />\r\n        </button>\r\n        <button *ngIf=\"remove\" type=\"button\" class=\"btn btn-light\"\r\n          (click)=\"onRemoveMediaClicked()\">\r\n          <img [src]=\"imageDeleteUrl\" />\r\n        </button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<ng-template #modelTemplate>\r\n  <div class=\"modal-body\">\r\n    <img #imgSrcModal *ngIf=\"previewType === mediaType.IMG\" width=\"100%\"\r\n      [src]=\"previewSrcSafe\" alt=\"Preview\"\r\n      (error)=\"imgSrcModal.hidden = true; imgErrorModal.hidden = false\"\r\n      [ngClass]=\"{ 'round-img-review': isRoundCropper }\" />\r\n    <video #videoSrcModal *ngIf=\"previewType === mediaType.VIDEO\" width=\"100%\"\r\n      [src]=\"previewSrcSafe\" alt=\"Preview\" controls\r\n      (error)=\"videoSrcModal.hidden = true; imgErrorModal.hidden = false\"></video>\r\n    <img #imgErrorModal [src]=\"imageErrorUrl\" hidden />\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #cropImageTemplate>\r\n  <div class=\"modal-header\">\r\n    <h5 class=\"modal-title\">Crop Image</h5>\r\n    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"\r\n      (click)=\"cropModal?.hide()\">\r\n      <span aria-hidden=\"true\">&times;</span>\r\n    </button>\r\n  </div>\r\n  <div class=\"modal-body img-container\">\r\n    <div class=\"row\">\r\n      <div class=\"col-md-9\">\r\n        <image-cropper *ngIf=\"cropImage.type === mediaType.IMG\"\r\n          [imageFile]=\"cropImage.file\"\r\n          [containWithinAspectRatio]=\"containWithinAspectRatio\"\r\n          (imageCropped)=\"imageCropped($event)\"\r\n          [maintainAspectRatio]=\"maintainAspectRatio\"\r\n          [canvasRotation]=\"canvasRotation\" [transform]=\"transform\"\r\n          [roundCropper]=\"isRoundCropper\" [aspectRatio]=\"aspectRatio\"\r\n          class=\"img-container\">\r\n        </image-cropper>\r\n      </div>\r\n      <div class=\"col-md-3\">\r\n        <img [src]=\"cropImage.srcSafe\"\r\n          [ngClass]=\"{ 'round-img-review': isRoundCropper }\"\r\n          class=\"img-preview\" />\r\n      </div>\r\n    </div>\r\n  </div>\r\n  <div class=\"modal-footer modal-crop\">\r\n    <div id=\"cropperController\">\r\n      <img [src]=\"selectionCropImage\" alt=\"selectionCropImage\"\r\n        class=\"img-icon\" />\r\n      <ng-select name=\"cropper-controller\" [(ngModel)]=\"textToCompare\"\r\n        (ngModelChange)=\"updateCropper()\" [clearable]=\"false\">\r\n        <ng-option [value]=\"false\">Square</ng-option>\r\n        <ng-option [value]=\"true\">Round</ng-option>\r\n      </ng-select>\r\n    </div>\r\n    <div id=\"ratioController\">\r\n      <img class=\"img-icon\" [src]=\"cropRatioImage\" alt=\"cropRatioImage\" />\r\n      <ng-select name=\"ratio-controller\" [disabled]=\"isRoundCropper\"\r\n        [(ngModel)]=\"aspectRatio\" (ngModelChange)=\"updateRatio()\"\r\n        [clearable]=\"false\">\r\n        <ng-option [value]=\"0\">Free</ng-option>\r\n        <ng-option [value]=\"1\">1:1</ng-option>\r\n        <ng-option [value]=\"16 / 9\">16:9</ng-option>\r\n        <ng-option [value]=\"5 / 4\">5:4</ng-option>\r\n        <ng-option [value]=\"7 / 5\">7:5</ng-option>\r\n        <ng-option [value]=\"4 / 3\">4:3</ng-option>\r\n        <ng-option [value]=\"5 / 3\">5:3</ng-option>\r\n        <ng-option [value]=\"3 / 2\">3:2</ng-option>\r\n        <ng-option [value]=\"9 / 16\">9:16</ng-option>\r\n        <ng-option [value]=\"4 / 5\">4:5</ng-option>\r\n        <ng-option [value]=\"5 / 7\">5:7</ng-option>\r\n        <ng-option [value]=\"3 / 4\">3:4</ng-option>\r\n        <ng-option [value]=\"3 / 5\">3:5</ng-option>\r\n        <ng-option [value]=\"2 / 3\">2:3</ng-option>\r\n      </ng-select>\r\n    </div>\r\n    <div id=\"rotationController\">\r\n      <img class=\"img-icon\" [src]=\"cropRotateImage\" alt=\"cropRotateImage\" />\r\n      <span class=\"img-icon\">{{ rotation }}</span>\r\n      <input type=\"range\" name=\"rotation-controller\" [(ngModel)]=\"rotation\"\r\n        (ngModelChange)=\"updateRotation()\" class=\"form-range\" min=\"-45\" max=\"45\"\r\n        step=\"1\" />\r\n    </div>\r\n\r\n    <div class=\"btn-group\" role=\"group\">\r\n      <button class=\"btn btn-light\" (click)=\"rotateLeft()\">\r\n        <img class=\"img-icon\" [src]=\"cropRotateLeftImage\" alt=\"rotateLeft\" />\r\n      </button>\r\n\r\n      <button class=\"btn btn-light\" (click)=\"rotateRight()\">\r\n        <img class=\"img-icon\" [src]=\"cropRotateRightImage\" alt=\"rotateRight\" />\r\n      </button>\r\n\r\n      <button class=\"btn btn-light\" (click)=\"flipHorizontal()\">\r\n        <img class=\"img-icon\" [src]=\"cropFlipHorizontalImage\"\r\n          alt=\"flipHorizontal\" />\r\n      </button>\r\n\r\n      <button class=\"btn btn-light\" (click)=\"flipVertical()\">\r\n        <img class=\"img-icon\" [src]=\"cropFlipVerticalImage\" alt=\"flipVertical\"\r\n          style=\"transform: rotate(-90deg)\" />\r\n      </button>\r\n\r\n      <button class=\"btn btn-light\" (click)=\"toggleContainWithinAspectRatio()\"\r\n        [disabled]=\"aspectRatio === 0\">\r\n        <img class=\"img-icon\"\r\n          [src]=\"containWithinAspectRatio ? cropZoomOutImage : cropZoomInImage\"\r\n          [alt]=\"\r\n            containWithinAspectRatio\r\n              ? 'Fill Aspect Ratio'\r\n              : 'Contain Within Aspect Ratio'\r\n          \" />\r\n      </button>\r\n\r\n      <button class=\"btn btn-light\" (click)=\"resetImage()\">\r\n        <img class=\"img-icon\" [src]=\"cropResetChangesImage\" alt=\"resetImage\" />\r\n      </button>\r\n\r\n      <button class=\"btn btn-light\" (click)=\"saveImage()\">\r\n        <img class=\"img-icon\" [src]=\"cropEditImage\" alt=\"saveEditChange\" />\r\n      </button>\r\n    </div>\r\n  </div>\r\n</ng-template>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}