{"version":3,"file":"ngx-image-manager-engine.mjs","sources":["../../src/lib/utils/image-utils.ts","../../src/lib/components/image-compressor-modal.component.ts","../../src/lib/components/image-compressor-modal.component.html","../../src/lib/services/image-compressor-engine.service.ts","../../src/public-api.ts","../../src/ngx-image-manager-engine.ts"],"sourcesContent":["/**\n * Utility functions for image processing\n * Extracted from UtilityService for standalone library usage\n */\n\n/**\n * Convert File to Base64 string\n * @param file - File object to convert\n * @returns Promise with base64 string or null\n */\nexport function convertFileToBase64(file: File): Promise<string | null> {\n  const reader = new FileReader();\n  reader.readAsDataURL(file);\n  return new Promise<string | null>((resolve) => {\n    reader.onloadend = () => {\n      const base64data = reader.result as string;\n      resolve(base64data);\n    };\n  });\n}\n\n/**\n * Convert Base64 string to File/Blob\n * @param base64String - Base64 encoded string\n * @param filename - Name for the file\n * @returns Promise with file object, file URL, and filename\n */\nexport function convertBase64ToFile(\n  base64String: string,\n  filename: string\n): Promise<{ file: Blob; fileUrl: string; filename: string }> {\n  return new Promise<{ file: Blob; fileUrl: string; filename: string }>((resolve, reject) => {\n    try {\n      // Split Base64 data\n      const arr = base64String.split(',');\n      const match = arr[0].match(/:(.*?);/);\n      const mime = match ? match[1] : '';\n      const bstr = atob(arr[1]);\n      let n = bstr.length;\n      const u8arr = new Uint8Array(n);\n\n      while (n--) {\n        u8arr[n] = bstr.charCodeAt(n);\n      }\n\n      // Create file\n      const file = new Blob([u8arr], { type: mime });\n      const fileUrl = URL.createObjectURL(file);\n\n      resolve({\n        file,\n        fileUrl,\n        filename,\n      });\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n\n/**\n * Convert Canvas to Base64 string\n * @param canvas - Canvas element\n * @returns Promise with base64 string\n */\nexport function convertCanvasToBase64(canvas: HTMLCanvasElement): Promise<string> {\n  return new Promise<string>((resolve) => {\n    canvas.toBlob((blob: Blob | null) => {\n      if (blob) {\n        const reader = new FileReader();\n        reader.onloadend = () => {\n          const base64data = reader.result as string;\n          resolve(base64data);\n        };\n        reader.readAsDataURL(blob);\n      }\n    }, 'image/jpeg');\n  });\n}\n\n/**\n * Create a fake delay for better UX\n * @param delayTimeOut - Delay time in milliseconds\n * @returns Promise that resolves after delay\n */\nexport function createFakeDelay(delayTimeOut: number): Promise<boolean> {\n  return new Promise((resolve) => {\n    setTimeout(() => {\n      resolve(true);\n    }, delayTimeOut);\n  });\n}\n\n/**\n * Convert Canvas to Blob File\n * @param canvas - Canvas element\n * @returns Promise with File object\n */\nexport function convertCanvasToBlobFile(canvas: HTMLCanvasElement): Promise<File | null> {\n  return new Promise((resolve) => {\n    canvas.toBlob(\n      (blob: Blob | null) => {\n        if (blob) {\n          const file = new File([blob], 'image.png', { type: 'image/png' });\n          resolve(file);\n        } else {\n          resolve(null);\n        }\n      },\n      'image/png',\n      1\n    );\n  });\n}\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDialogConfig, AXDialogService } from '@acorex/components/dialog';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, OnInit, signal, ViewChild, WritableSignal } from '@angular/core';\nimport { AngularCropperjsModule, CropperComponent } from 'angular-cropperjs';\nimport { NgxImageCompressService } from 'ngx-image-compress';\nimport { ICropperOptions, IImageCompressor, TCurrentStepOfProcess } from '../models/image-compressor.models';\nimport {\n  convertFileToBase64,\n  convertBase64ToFile,\n  convertCanvasToBase64,\n  createFakeDelay,\n} from '../utils/image-utils';\n\n@Component({\n  selector: 'ngx-image-compressor-modal',\n  templateUrl: './image-compressor-modal.component.html',\n  standalone: true,\n  imports: [\n    CommonModule,\n    AXProgressBarModule,\n    AXLoadingModule,\n    AXButtonModule,\n    AngularCropperjsModule,\n    AXDecoratorModule,\n    AXSkeletonModule,\n  ],\n})\nexport class ImageCompressorModalComponent implements OnInit {\n  @ViewChild('elementCropper') public elementCropper!: CropperComponent;\n  private _imageCompressService = inject(NgxImageCompressService);\n  private _toastService = inject(AXToastService);\n  private _dialogService = inject(AXDialogService);\n\n  imageCompressorData: IImageCompressor = {\n    imageData: '',\n  };\n\n  originalImageAsBase64: WritableSignal<string> = signal('');\n  imageForCropping: WritableSignal<string> = signal('');\n  isLoadingLocal: WritableSignal<boolean> = signal(false);\n  maxSizeInKB: WritableSignal<number> = signal(0);\n  originalImageSize: WritableSignal<number> = signal(0);\n  triesListData: WritableSignal<\n    { lastSized: number; isInProcess: boolean; allowedSize: boolean; qualityUsed?: number; reductionAmount?: number }[]\n  > = signal([{ lastSized: 0, isInProcess: true, allowedSize: false }]);\n  croppedImage: WritableSignal<string | null> = signal(null);\n  croppedImageSize: WritableSignal<number | null> = signal(null);\n  compressedImage: WritableSignal<string | null> = signal(null);\n  compressedImageSize: WritableSignal<number | null> = signal(null);\n  croppedImageBase64: WritableSignal<File | undefined> = signal(undefined);\n  imageLoadError: WritableSignal<boolean> = signal(false);\n  compressingInProcessPercentNum: WritableSignal<number> = signal(0);\n\n  defaultCropperOptions: WritableSignal<ICropperOptions> = signal({\n    viewMode: 1,\n    autoCropArea: 1,\n    movable: true,\n    scalable: true,\n    zoomable: true,\n    rotatable: false,\n    guides: true,\n    highlight: true,\n    cropBoxResizable: true,\n    cropBoxMovable: true,\n  });\n\n  currentStepOfProcess: WritableSignal<TCurrentStepOfProcess> = signal('initial_loading');\n\n  completedTriesCount = computed(() => this.triesListData().filter((item) => !item.isInProcess).length);\n  hasSuccessfulTries = computed(() => this.triesListData().some((item) => item.allowedSize));\n  hasCompletedTries = computed(() => this.triesListData().some((item) => !item.isInProcess));\n\n  async ngOnInit() {\n    this.setOriginalImageSize();\n    await this.checkImageFileType();\n    this.setDefaultMaxSizeInBytes();\n    await this.checkSkipCropper();\n    this.setMaxSizeInKB();\n    this.setCropperOption();\n    await createFakeDelay(1000);\n    this.unableImageCropper();\n  }\n\n  protected handleImageError() {\n    this.imageLoadError.set(true);\n    const dialogConfig: AXDialogConfig = {\n      title: 'خطا در بارگذاری تصویر',\n      content: 'تصویر انتخابی شما به درستی بارگذاری نشد. لطفاً یکی از گزینه‌های زیر را انتخاب کنید:',\n      orientation: 'vertical',\n      type: 'warning',\n      buttons: [\n        { text: 'تلاش مجدد', color: 'primary', onClick: () => { this.retryLoadImage(); } },\n        { text: 'استفاده از دوربین', color: 'secondary', onClick: () => { this.useDeviceCamera(); } },\n        { text: 'انصراف', color: 'danger', onClick: () => { this.cancelProcessAndCloseModal(); } },\n      ],\n      closeButton: false,\n    };\n    this._dialogService.show(dialogConfig);\n  }\n\n  protected async retryLoadImage() {\n    this.imageLoadError.set(false);\n    this._toastService.show({\n      title: 'در حال تلاش مجدد',\n      content: 'در حال تلاش مجدد برای بارگذاری تصویر...',\n      color: 'primary',\n      closeButton: true,\n    });\n    try {\n      await this.checkImageFileType();\n      this.unableImageCropper();\n    } catch (error) {\n      this._toastService.show({\n        title: 'خطا',\n        content: 'متأسفانه بارگذاری تصویر با مشکل مواجه شد. لطفاً از تصویر دیگری استفاده کنید.',\n        color: 'danger',\n        closeButton: true,\n      });\n      this.imageLoadError.set(true);\n    }\n  }\n\n  protected useDeviceCamera() {\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = 'image/*';\n    input.capture = 'camera';\n    input.onchange = async (event) => {\n      const files = (event.target as HTMLInputElement).files;\n      if (files && files.length > 0) {\n        try {\n          this.imageCompressorData.imageData = files[0];\n          this.setOriginalImageSize();\n          await this.checkImageFileType();\n          this.imageLoadError.set(false);\n          this.unableImageCropper();\n          this._toastService.show({\n            title: 'موفقیت',\n            content: 'تصویر با موفقیت از دوربین دستگاه بارگذاری شد.',\n            color: 'success',\n            closeButton: true,\n          });\n        } catch (error) {\n          this._toastService.show({\n            title: 'خطا',\n            content: 'خطا در بارگذاری تصویر از دوربین.',\n            color: 'danger',\n            closeButton: true,\n          });\n          this.imageLoadError.set(true);\n        }\n      }\n    };\n    input.click();\n  }\n\n  setOriginalImageSize(imageSize?: number) {\n    this.originalImageSize.set(\n      this.convertBytes2KB(((this.imageCompressorData.imageData as File)?.size as number) || (imageSize as number))\n    );\n  }\n\n  private async closeAndReturnImageAsString(imageAsString: string) {\n    this.currentStepOfProcess.set('done');\n    await createFakeDelay(1500);\n    // Return result through popup data\n    // This will be handled by the popup service\n  }\n\n  private setCropperOption() {\n    this.imageCompressorData?.options?.cropperOption &&\n      this.defaultCropperOptions.update((prev) => ({ ...prev, ...this.imageCompressorData?.options?.cropperOption }));\n  }\n\n  private setDefaultMaxSizeInBytes() {\n    (this.imageCompressorData as any)['options']['maxSizeInBytes'] =\n      this.imageCompressorData?.options?.maxSizeInBytes ?? 512000;\n  }\n\n  private setMaxSizeInKB() {\n    this.maxSizeInKB.set((this.imageCompressorData?.options?.maxSizeInBytes as number) / 1000);\n  }\n\n  private async runImageCompressor(ImageFile: File) {\n    this.currentStepOfProcess.set('compressing');\n    const compressedImage = await this.imageCompressor(\n      ImageFile,\n      this.imageCompressorData?.options?.maxSizeInBytes as number\n    );\n    this.compressedImage.set(compressedImage);\n    this.currentStepOfProcess.set('after_compressing');\n  }\n\n  private async showFakeProgress(tryIndex: number) {\n    this.compressingInProcessPercentNum.set(0);\n    return new Promise<void>((resolve) => {\n      let progress = 0;\n      const interval = setInterval(() => {\n        progress += 5;\n        this.compressingInProcessPercentNum.set(progress);\n        if (progress >= 100) {\n          clearInterval(interval);\n          resolve();\n        }\n      }, 100);\n      setTimeout(() => {\n        clearInterval(interval);\n        this.compressingInProcessPercentNum.set(100);\n        resolve();\n      }, 2000);\n    });\n  }\n\n  private async imageCompressor(imageFile: File | undefined, maxSizeInBytes: number): Promise<string | null> {\n    if (!imageFile) return null;\n    let tryIndex = 0;\n    const compressionStrategy = this.calculateSmartCompressionStrategy(imageFile.size, maxSizeInBytes);\n    let quality = compressionStrategy.startQuality;\n    await createFakeDelay(1000);\n    const fileSizeInMB = this.convertBytes2MB(imageFile.size);\n    const isLargeFile = fileSizeInMB > 10;\n    if (isLargeFile) {\n      this._toastService.show({\n        title: 'تصویر انتخابی شما حجیم است',\n        color: 'default',\n        closeButton: true,\n        content: 'با توجه به حجم تصویر انتخابی، ممکن است زمان طولانی تری برای کاهش حجم نیاز باشد.',\n        timeOut: 10000,\n        timeOutProgress: true,\n        location: 'bottom-center',\n        pauseOnHover: true,\n      });\n    }\n    try {\n      const base64Image = await convertFileToBase64(imageFile);\n      while (quality >= compressionStrategy.minQuality) {\n        await this.showFakeProgress(tryIndex);\n        const ratio = quality;\n        const compressedBase64 = await this._imageCompressService.compressFile(\n          base64Image as string, -1, ratio, quality, 1920, 1920\n        );\n        const compressedSize = this._imageCompressService.byteCount(compressedBase64);\n        this.compressedImageSize.set(this.convertBytes2KB(compressedSize));\n        this.updateTriesList(tryIndex, compressedSize, maxSizeInBytes, quality, imageFile.size);\n        if (compressedSize <= maxSizeInBytes) {\n          return compressedBase64;\n        }\n        tryIndex++;\n        const nextReduction = this.calculateAdaptiveReduction(quality, compressedSize, maxSizeInBytes);\n        quality = Math.max(compressionStrategy.minQuality, quality - nextReduction);\n      }\n      throw new Error('قادر به کاهش حجم تصویر مورد نظر نمیباشیم.');\n    } catch (error: any) {\n      throw new Error('خطا در فرآیند کاهش حجم: ' + error.message || JSON.stringify(error));\n    }\n  }\n\n  protected convertKB2MB(sizeAsString: number) {\n    return sizeAsString / (1024 * 1024);\n  }\n\n  protected convertBytes2MB(sizeInBytes: number) {\n    return sizeInBytes / (1024 * 1024);\n  }\n\n  protected convertBytes2KB(sizeAsString: number) {\n    return Number(Math.round(sizeAsString / 1024));\n  }\n\n  private updateTriesList(\n    tryIndex: number,\n    compressedImageSize: number,\n    maxSizeInBytes: number,\n    qualityUsed?: number,\n    originalSize?: number\n  ) {\n    const allowedSize = compressedImageSize <= maxSizeInBytes;\n    const reductionAmount = originalSize\n      ? Math.round(((originalSize - compressedImageSize) / originalSize) * 100)\n      : undefined;\n    this.triesListData.update((prev) => {\n      prev[tryIndex].isInProcess = false;\n      prev[tryIndex].allowedSize = allowedSize;\n      prev[tryIndex].lastSized = this.convertBytes2KB(compressedImageSize);\n      prev[tryIndex].qualityUsed = qualityUsed;\n      prev[tryIndex].reductionAmount = reductionAmount;\n      return allowedSize ? [...prev] : [...prev, { isInProcess: true, lastSized: 0, allowedSize: false }];\n    });\n  }\n\n  private calculateSmartCompressionStrategy(originalSize: number, targetSize: number) {\n    const sizeRatio = originalSize / targetSize;\n    const originalSizeKB = this.convertBytes2KB(originalSize);\n    let startQuality = 100;\n    let minQuality = 10;\n    if (sizeRatio > 50) {\n      startQuality = 60;\n    } else if (sizeRatio > 20) {\n      startQuality = 75;\n    } else if (sizeRatio > 10) {\n      startQuality = 85;\n    }\n    if (originalSizeKB > 50000) {\n      minQuality = 5;\n    } else if (originalSizeKB > 20000) {\n      minQuality = 8;\n    }\n    return {\n      startQuality,\n      minQuality,\n      sizeRatio,\n      originalSizeKB,\n      targetSizeKB: this.convertBytes2KB(targetSize),\n    };\n  }\n\n  private calculateAdaptiveReduction(currentQuality: number, currentSize: number, targetSize: number): number {\n    const currentSizeRatio = currentSize / targetSize;\n    if (currentSizeRatio <= 1.5) return 5;\n    if (currentSizeRatio >= 10) return Math.min(25, currentQuality * 0.6);\n    if (currentSizeRatio >= 5) return Math.min(20, currentQuality * 0.5);\n    if (currentSizeRatio >= 3) return Math.min(15, currentQuality * 0.4);\n    return Math.min(10, currentQuality * 0.3);\n  }\n\n  protected cancelProcessAndCloseModal() {\n    // Close modal through popup service\n    // This will be handled by the parent popup\n  }\n\n  async unableImageCropper() {\n    if (this.imageCompressorData?.options?.skipCropper) return;\n    this.imageCompressorData.imageData &&\n      this.imageForCropping.set((await convertFileToBase64(this.imageCompressorData.imageData as File)) as string);\n    this.currentStepOfProcess.set('before_cropping');\n  }\n\n  protected async cropAndShowContinueButton() {\n    const croppedCan = this.elementCropper.cropper.getCroppedCanvas();\n    const croppedBase64 = await convertCanvasToBase64(croppedCan);\n    this.croppedImage.set(croppedBase64);\n    const croppedImageAsFile = await this.convertCroppedImageAsFile(croppedBase64);\n    this.croppedImageBase64.set(croppedImageAsFile);\n    this.croppedImageSize.set(this.convertBytes2KB(croppedImageAsFile.size));\n    if (this.imageCompressorData?.options?.skipCompressor) {\n      return this.currentStepOfProcess.set('after_compressing');\n    }\n    this.currentStepOfProcess.set('after_cropping');\n  }\n\n  async continueToCompressAfterCrop() {\n    this.runImageCompressor((this.croppedImageBase64() as File) || (this.imageCompressorData.imageData as File));\n  }\n\n  async convertCroppedImageAsFile(base64String: string): Promise<File> {\n    const croppedImageAsFile: any = await convertBase64ToFile(base64String, 'croppedImage.png');\n    return croppedImageAsFile.file;\n  }\n\n  private async checkSkipCropper() {\n    if (this.imageCompressorData?.options?.skipCropper && this.imageCompressorData.imageData) {\n      this.croppedImage.set(await convertFileToBase64(this.imageCompressorData.imageData as File));\n      this.currentStepOfProcess.set('after_cropping');\n    }\n  }\n\n  protected rotateInCrop(rotateValue: -45 | 45) {\n    this.elementCropper.cropper.rotate(rotateValue);\n  }\n\n  private async checkImageFileType() {\n    const imageDataType = this.imageCompressorData?.imageData;\n    if (typeof imageDataType === 'string') {\n      this.originalImageAsBase64.set(imageDataType);\n      const ImageAsFile = await convertBase64ToFile(imageDataType, 'image.png');\n      this.imageCompressorData.imageData = ImageAsFile.file;\n      this.setOriginalImageSize(ImageAsFile.file.size);\n    } else {\n      const imageAsBase64 = await convertFileToBase64(imageDataType as File);\n      this.originalImageAsBase64.set(imageAsBase64 as string);\n    }\n    return this.imageCompressorData.imageData;\n  }\n\n  protected async resetImageToOriginal() {\n    if (this.imageCompressorData.imageData) {\n      const originalImageBase64 = await convertFileToBase64(this.imageCompressorData.imageData as File);\n      this.imageForCropping.set(originalImageBase64 as string);\n      this.croppedImage.set(null);\n      this.compressedImage.set(null);\n      this.triesListData.set([{ lastSized: 0, isInProcess: true, allowedSize: false }]);\n      !this.imageCompressorData.options?.skipCropper && this.currentStepOfProcess.set('before_cropping');\n    }\n  }\n\n  protected async confirmAndCloseModalAfterCompressing() {\n    await this.closeAndReturnImageAsString((this.compressedImage() as string) || (this.croppedImage() as string));\n  }\n\n  protected async continueWithOriginalImageInCroppingMode() {\n    const originalImageAsFile = this.imageCompressorData.imageData as File;\n    this.croppedImageSize.set(this.convertBytes2KB(originalImageAsFile?.size as number));\n    this.croppedImage.set(await convertFileToBase64(originalImageAsFile));\n    this.croppedImageBase64.set(originalImageAsFile);\n    this.imageCompressorData.options?.skipCompressor\n      ? this.currentStepOfProcess.set('after_compressing')\n      : this.currentStepOfProcess.set('after_cropping');\n  }\n}","<div class=\"ax-flex ax-flex-col ax-justify-start ax-w-full ax-bg-lightest dark:ax-bg-darkest\">\r\n  @if (currentStepOfProcess() === 'initial_loading' || currentStepOfProcess() === 'done') {\r\n  <ax-progress-bar class=\"w-full\" [progress]=\"50\" [mode]=\"'indeterminate'\" color=\"primary\"> </ax-progress-bar>\r\n  }\r\n  <div class=\"ax-w-full ax-flex ax-p-4 ax-flex-col ax-gap-4 ax-pt-5\">\r\n    <div class=\"ax-flex ax-gap-3 ax-items-center ax-w-full ax-border-b ax-border-b-gray-200 ax-pb-2\">\r\n      <i class=\"fa-light fa-sliders-up fa-lg ax-opacity-85\"></i>\r\n      <div class=\"ax-w-full ax-flex ax-flex-col ax-gap-1\">\r\n        <h1 class=\"ax-opacity-85 ax-text-base\">\r\n          {{imageCompressorData.options?.titleText || 'موتور کاهش حجم و مدیریت تصویر'}}\r\n        </h1>\r\n        @if (!imageCompressorData.options?.skipCompressor) {\r\n        <div class=\"ax-flex ax-items-center ax-gap-2 ax-opacity-80\">\r\n          <i class=\"fa-light fa-octagon-minus fa-sm ax-text-danger-500\"></i>\r\n          <p class=\"ax-font-light ax-text-xs ax-flex ax-gap-2 ax-items-center\">\r\n            حجم مجاز<small class=\"ax-font-bold\"\r\n              >{{imageCompressorData.options?.maxSizeInKbAllowedForUI || maxSizeInKB()}} KB</small\r\n            >\r\n          </p>\r\n        </div>\r\n        }\r\n      </div>\r\n    </div>\r\n    @if(currentStepOfProcess() === 'initial_loading'){\r\n    <div class=\"ax-w-full ax-h-fit ax-relative ax-flex ax-justify-center ax-items-center\">\r\n      <ax-skeleton\r\n        [animated]=\"true\"\r\n        class=\"ax-skeleton ax-skeleton-animate ax-w-full ax-opacity-30 ax-backdrop-blur-sm !ax-absolute ax-top-0 ax-left-0 ax-right-0 ax-bottom-0 ax-z-20 ax-mx-auto ax-max-w-[250px]\"\r\n      ></ax-skeleton>\r\n      @if (originalImageAsBase64()) {\r\n      <img\r\n        [src]=\"originalImageAsBase64()\"\r\n        alt=\"croppedImg\"\r\n        class=\"ax-w-full ax-z-10 ax-relative ax-opacity-30 ax-max-w-[250px] ax-max-h-[50vh]\"\r\n        (error)=\"handleImageError()\"\r\n      />\r\n      } @if (imageLoadError()) {\r\n      <div\r\n        class=\"ax-absolute ax-inset-0 ax-flex ax-flex-col ax-items-center ax-justify-center ax-bg-white/80 ax-z-30 ax-p-4 ax-rounded-md\"\r\n      >\r\n        <i class=\"fa-light fa-exclamation-triangle ax-text-danger-500 ax-text-4xl ax-mb-2\"></i>\r\n        <p class=\"ax-text-center ax-font-bold ax-mb-2\">خطا در بارگذاری تصویر</p>\r\n        <p class=\"ax-text-center ax-text-sm ax-mb-4\">تصویر انتخابی شما به درستی بارگذاری نشد.</p>\r\n        <div class=\"ax-flex ax-gap-2\">\r\n          <button class=\"ax-btn ax-btn-primary ax-btn-sm\" (click)=\"retryLoadImage()\">\r\n            <i class=\"fa-light fa-redo ax-ml-1\"></i>\r\n            تلاش مجدد\r\n          </button>\r\n          <button class=\"ax-btn ax-btn-secondary ax-btn-sm\" (click)=\"useDeviceCamera()\">\r\n            <i class=\"fa-light fa-camera ax-ml-1\"></i>\r\n            استفاده از دوربین\r\n          </button>\r\n        </div>\r\n      </div>\r\n      }\r\n    </div>\r\n    }\r\n\r\n    <div class=\"ax-w-full ax-flex ax-flex-col ax-gap-6 ax-items-center\">\r\n      <!-- info section as step -->\r\n      @if (imageCompressorData.options?.showUploadInfo !== false) {\r\n      <div class=\"ax-w-full ax-flex ax-items-center ax-justify-center ax-gap-4\">\r\n        <div class=\"ax-flex ax-items-baseline ax-justify-center ax-gap-3\">\r\n          <i class=\"fa-solid fa-file-upload fa-xs ax-text-primary ax-opacity-80\"></i>\r\n          <p class=\"ax-font-light ax-text-[10px] ax-flex ax-flex-col ax-gap-2 ax-justify-center ax-items-center\">\r\n            {{'حجم اصلی'}}\r\n            <small class=\"ax-text-8px\" style=\"direction: ltr\">{{(originalImageSize() | number) || '-'}} KB</small>\r\n          </p>\r\n        </div>\r\n        @if (!imageCompressorData.options?.skipCropper) {\r\n        <div class=\"ax-flex ax-items-baseline ax-justify-center ax-gap-3\">\r\n          <i class=\"fa-solid fa-crop-alt fa-xs ax-text-secondary ax-opacity-80\"></i>\r\n          <p class=\"ax-font-light ax-text-[10px] ax-flex ax-flex-col ax-gap-2 ax-justify-center ax-items-center\">\r\n            {{'حجم بعد برش'}}\r\n            <small class=\"ax-text-8px\" style=\"direction: ltr\">{{(croppedImageSize()| number) || '-' }} KB</small>\r\n          </p>\r\n        </div>\r\n        } @if (!imageCompressorData.options?.skipCompressor) {\r\n        <div class=\"ax-flex ax-items-baseline ax-justify-center ax-gap-3\">\r\n          <i class=\"fa-solid fa-compress-alt fa-xs ax-text-success ax-opacity-80\"></i>\r\n          <p class=\"ax-font-light ax-text-[10px] ax-flex ax-flex-col ax-gap-2 ax-justify-center ax-items-center\">\r\n            {{'حجم بعد کاهش'}}\r\n            <small class=\"ax-text-8px ax-text-success-700 ax-font-bold\" style=\"direction: ltr\"\r\n              >{{(compressedImageSize()| number) || '-'}} KB</small\r\n            >\r\n          </p>\r\n        </div>\r\n        }\r\n      </div>\r\n      }\r\n\r\n      <!-- cropper sections -->\r\n      @if (currentStepOfProcess() === 'before_cropping' && !imageCompressorData.options?.skipCropper) {\r\n      <div class=\"ax-flex ax-w-full ax-flex-col ax-gap-4 ax-items-center\">\r\n        <div class=\"ax-flex ax-flex-col ax-gap-2\">\r\n          <angular-cropper\r\n            class=\"ax-w-full ax-max-w-[250px]\"\r\n            #elementCropper\r\n            [cropperOptions]=\"defaultCropperOptions()\"\r\n            [imageUrl]=\"imageForCropping()\"\r\n          ></angular-cropper>\r\n          <!-- rotate options -->\r\n          @if (this.imageCompressorData.options?.cropperOption?.rotatable) {\r\n          <div class=\"ax-flex ax-items-center ax-w-full ax-justify-center ax-gap-3\">\r\n            <ax-button (onClick)=\"rotateInCrop(45)\" color=\"primary\" class=\"ax-sm\">\r\n              <ax-icon class=\"class-name\">\r\n                <i class=\"fa-rotate-right fa-solid\"></i>\r\n              </ax-icon>\r\n            </ax-button>\r\n            <ax-button (onClick)=\"rotateInCrop(-45)\" color=\"primary\" class=\"ax-sm\">\r\n              <ax-icon class=\"class-name\">\r\n                <i class=\"fa-rotate-left fa-solid\"></i>\r\n              </ax-icon>\r\n            </ax-button>\r\n          </div>\r\n          }\r\n        </div>\r\n        <div class=\"ax-flex ax-w-full ax-flex-col ax-gap-1\">\r\n          <ax-button class=\"ax-sm ax-w-full\" color=\"primary\" text=\"برش و ادامه\" (onClick)=\"cropAndShowContinueButton()\"\r\n            ><ax-prefix>\r\n              <ax-icon><i class=\"fa-regular fa-crop ax-text-white\"></i></ax-icon>\r\n            </ax-prefix>\r\n          </ax-button>\r\n          @if (!imageCompressorData.options?.cropperOption?.aspectRatio) {\r\n          <ax-button\r\n            class=\"ax-sm ax-w-full\"\r\n            color=\"secondary\"\r\n            look=\"outline\"\r\n            text=\"ادامه با کیفیت اصلی\"\r\n            (onClick)=\"continueWithOriginalImageInCroppingMode()\"\r\n          >\r\n          </ax-button>\r\n          }\r\n        </div>\r\n      </div>\r\n      }\r\n      <!--  -->\r\n      @if (currentStepOfProcess() === 'after_cropping') {\r\n      <div class=\"ax-flex ax-w-full ax-flex-col ax-gap-4 ax-items-center\">\r\n        <img\r\n          [src]=\"croppedImage()\"\r\n          alt=\"croppedImg\"\r\n          class=\"ax-w-full ax-max-w-[250px] ax-max-h-[50vh]\"\r\n          (error)=\"handleImageError()\"\r\n        />\r\n        <div class=\"ax-flex ax-items-center ax-gap-3 ax-w-full\">\r\n          <ax-button\r\n            class=\"ax-sm ax-w-9/12\"\r\n            color=\"primary\"\r\n            text=\"ادامه و کاهش حجم\"\r\n            (onClick)=\"continueToCompressAfterCrop()\"\r\n            [ngClass]=\"imageCompressorData.options?.skipCropper ? 'ax-w-full' : 'ax-w-9/12'\"\r\n          >\r\n          </ax-button>\r\n          @if (!imageCompressorData.options?.skipCropper) {\r\n          <ax-button\r\n            class=\"ax-sm ax-max-w-xs ax-w-3/12\"\r\n            look=\"twotone\"\r\n            color=\"primary\"\r\n            text=\"برش از نو\"\r\n            (onClick)=\"resetImageToOriginal()\"\r\n          >\r\n          </ax-button>\r\n          }\r\n        </div>\r\n      </div>\r\n      }\r\n\r\n      <!-- compressor section -->\r\n      @if(currentStepOfProcess() === 'compressing' && !imageCompressorData.options?.skipCompressor){\r\n      <div class=\"ax-w-full ax-h-fit ax-relative ax-flex ax-justify-center ax-items-center\">\r\n        <ax-skeleton\r\n          [animated]=\"true\"\r\n          class=\"ax-skeleton ax-skeleton-animate ax-w-full ax-opacity-30 ax-backdrop-blur-sm !ax-absolute ax-top-0 ax-left-0 ax-right-0 ax-bottom-0 ax-z-20 ax-mx-auto ax-max-w-[250px]\"\r\n        ></ax-skeleton>\r\n        <img\r\n          [src]=\"croppedImage()\"\r\n          alt=\"croppedImg\"\r\n          class=\"ax-w-full ax-z-10 ax-relative ax-opacity-30 ax-max-w-[250px] ax-max-h-[50vh]\"\r\n          (error)=\"handleImageError()\"\r\n        />\r\n      </div>\r\n      @if (triesListData().length) {\r\n      <div class=\"ax-w-full ax-flex ax-flex-col ax-gap-2 ax-text-xs ax-pr-2\">\r\n        @for (item of triesListData(); track $index) {\r\n        <div class=\"ax-flex ax-w-full ax-gap-2\">\r\n          <p class=\"ax-w-2/12\">تلاش {{$index+1}}:</p>\r\n          @if (item.isInProcess) {\r\n          <ax-progress-bar\r\n            class=\"w-full ax-sm ax-w-10/12\"\r\n            [progress]=\"compressingInProcessPercentNum()\"\r\n            [mode]=\"'determinate'\"\r\n            color=\"primary\"\r\n          >\r\n            <ax-suffix>\r\n              <ax-text class=\"ax-text-xs ax-flex ax-items-center ax-w-8\">\r\n                {{compressingInProcessPercentNum()}} %</ax-text\r\n              >\r\n            </ax-suffix>\r\n          </ax-progress-bar>\r\n          }@else {\r\n          <p class=\"ax-flex ax-gap-2\" [ngClass]=\"item.allowedSize ? 'ax-text-success-500 ' : 'ax-text-danger-500'\">\r\n            حجم نهایی {{item.lastSized}} KB\r\n            <small [ngClass]=\"item.allowedSize ? 'ax-text-success-500 ' : 'ax-text-danger-500'\"\r\n              >{{item.allowedSize ? \"مجاز\" : \"غیرمجاز\"}}</small\r\n            >\r\n          </p>\r\n          }\r\n        </div>\r\n        }\r\n      </div>\r\n      } } @if (currentStepOfProcess() === 'after_compressing' || currentStepOfProcess() === 'done') {\r\n      <img\r\n        [src]=\"compressedImage() || croppedImage()\"\r\n        alt=\"compressedImg\"\r\n        class=\"ax-w-full ax-max-w-[250px] ax-max-h-[50vh]\"\r\n        (error)=\"handleImageError()\"\r\n      />\r\n      <div class=\"ax-flex ax-items-center ax-gap-3 ax-w-full\">\r\n        <ax-button\r\n          class=\"ax-sm ax-w-9/12\"\r\n          color=\"success\"\r\n          text=\"تایید و ادامه\"\r\n          [disabled]=\" currentStepOfProcess() === 'done'\"\r\n          (onClick)=\"confirmAndCloseModalAfterCompressing()\"\r\n          [ngClass]=\"imageCompressorData.options?.skipCropper ? 'ax-w-full' : 'ax-w-9/12'\"\r\n        >\r\n        </ax-button>\r\n        @if (!imageCompressorData.options?.skipCropper) {\r\n        <ax-button\r\n          class=\"ax-sm ax-max-w-xs ax-w-3/12\"\r\n          look=\"twotone\"\r\n          color=\"primary\"\r\n          text=\"برش از نو\"\r\n          (onClick)=\"resetImageToOriginal()\"\r\n        >\r\n        </ax-button>\r\n        }\r\n      </div>\r\n      }\r\n      <div class=\"ax-flex ax-w-full ax-items-center ax-gap-3\">\r\n        <ax-button\r\n          class=\"ax-sm ax-w-fit\"\r\n          [look]=\"'link'\"\r\n          color=\"danger\"\r\n          text=\"انصراف\"\r\n          [disabled]=\"currentStepOfProcess() === 'done'\"\r\n          (onClick)=\"cancelProcessAndCloseModal()\"\r\n        ></ax-button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { AXPopupService } from '@acorex/components/popup';\nimport { inject, Injectable } from '@angular/core';\nimport { ImageCompressorModalComponent } from '../components/image-compressor-modal.component';\nimport { IImageCompressor } from '../models/image-compressor.models';\n\n@Injectable()\nexport class ImageCompressorEngineService {\n  private _popupService = inject(AXPopupService);\n\n  /**\n   * Open image compressor engine modal\n   * @param imageCompressorData - Configuration and image data\n   * @returns Promise with compressed/cropped image as Base64 string or undefined\n   */\n  async imageCompressorEngine(imageCompressorData: IImageCompressor): Promise<string | undefined> {\n    return new Promise<string | undefined>((resolve) => {\n      try {\n        this._popupService\n          .open(ImageCompressorModalComponent, {\n            closeButton: true,\n            header: false,\n            size: 'sm',\n            closeOnBackdropClick: false,\n            data: {\n              imageCompressorData,\n            },\n            maximizable: false,\n          })\n          .then((d: any) => {\n            resolve(d.data);\n          });\n      } catch (e) {\n        console.log(e);\n      }\n    });\n  }\n}\n","/*\n * Public API Surface of ngx-image-compressor-engine\n */\n\n// Services\nexport * from './lib/services/image-compressor-engine.service';\n\n// Components\nexport * from './lib/components/image-compressor-modal.component';\n\n// Models\nexport * from './lib/models/image-compressor.models';\n\n// Utils (optional - if you want to expose utility functions)\nexport * from './lib/utils/image-utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}