{"version":3,"file":"guajiritos-image-picker.mjs","sources":["../../../projects/guachos-image-picker/src/utils/pipes/i18n/i18n.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/calculate-size/calculate-size.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/pipes.module.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.html","../../../projects/guachos-image-picker/src/public-api.ts","../../../projects/guachos-image-picker/src/guajiritos-image-picker.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n    name: 'i18n',\n    standalone: false\n})\nexport class I18nPipe implements PipeTransform {\n  private en: any = {\n    UPLOAD_A_IMAGE: 'Upload an image',\n    MUST_EDIT: 'You must edit the image in order to resize it',\n    TOO_LARGE: 'too large',\n    OPEN_EDITOR_PANEL: 'Open the editor panel',\n    DOWNLOAD: 'Download the image',\n    CONTROL_PANEL: 'Control Panel',\n    QUALITY: 'Quality',\n    SAVE: 'Save',\n    MAX_DIMENSIONS: 'Max dimensions',\n    ASPECT_RATIO: 'Aspect ratio',\n    MAX_WIDTH_PX: 'max-width(px)',\n    MAX_HEIGHT_PX: 'max-height(px)',\n    FORMAT: 'Format',\n    CROP: 'Crop',\n    WIDTH_PX: 'width(px)',\n    HEIGHT_PX: 'height(px)',\n    REMOVE: 'Remove',\n    SIZE: 'Size'\n  };\n\n  private es: any = {\n    UPLOAD_A_IMAGE: 'Suba una imagen',\n    MUST_EDIT: 'Debe editar la imagen para disminuir su tamaño',\n    TOO_LARGE: 'muy grande',\n    OPEN_EDITOR_PANEL: 'Abra el panel de edición',\n    DOWNLOAD: 'Descargue la imagen',\n    CONTROL_PANEL: 'Panel de control',\n    REMOVE: 'Eliminar',\n    SAVE: 'Guardar',\n    QUALITY: 'Calidad',\n    MAX_DIMENSIONS: 'Dimensiones',\n    ASPECT_RATIO: 'Relación-Aspecto',\n    MAX_WIDTH_PX: 'max. ancho',\n    MAX_HEIGHT_PX: 'max. alto',\n    FORMAT: 'Formato',\n    CROP: 'Recortar',\n    WIDTH_PX: 'ancho(px)',\n    HEIGHT_PX: 'altura(px)',\n    SIZE: 'Tamaño'\n  };\n\n  transform(key: string, language: string): string {\n    return language === 'en' ? this.en?.[key] : this.es?.[key];\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n    name: 'calculateSize',\n    standalone: false\n})\nexport class CalculateSizePipe implements PipeTransform {\n\n  transform(imageLength: number): number {\n    if (!imageLength) {\n      return 0;\n    }\n\n    if (imageLength) {\n      return Math.ceil(((3 / 4) * imageLength) / 1024);\n    } else {\n      return 0;\n    }\n  }\n}\n","import { NgModule } from '@angular/core';\n\nimport { I18nPipe } from './i18n/i18n.pipe';\nimport { CalculateSizePipe } from './calculate-size/calculate-size.pipe';\n\n\n@NgModule({\n  declarations: [I18nPipe, CalculateSizePipe],\n  exports: [I18nPipe, CalculateSizePipe],\n})\nexport class PipesModule { }\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  Output,\n  signal,\n  ViewChild,\n  WritableSignal,\n} from '@angular/core';\nimport { ResizeObserver } from 'resize-observer';\nimport { ResizeObserverEntry } from 'resize-observer/lib/ResizeObserverEntry';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { NgStyle } from '@angular/common';\n\nimport { PipesModule } from '../utils/pipes/pipes.module';\n\nexport interface ImagePickerConf {\n  width?: string;\n  height?: string;\n  borderRadius?: string;\n  compressInitial?: boolean;\n  language?: string;\n  hideDeleteBtn?: boolean;\n  hideDownloadBtn?: boolean;\n  hideEditBtn?: boolean;\n  hideAddBtn?: boolean;\n}\n\nexport interface ImageConverterInput {\n  width?: number;\n  height?: number;\n  quality?: number;\n  dataType?: string;\n  maintainRatio?: boolean;\n  changeHeight?: boolean;\n  changeWidth?: boolean;\n}\n\nexport type ImageAllowedTypes =\n  'image/*'\n  | 'video/*'\n  | 'image/*, video/*'\n  | '.webp'\n  | '.png'\n  | '.svg'\n  | '.webp, .jpg, .jpeg'\n  | '.webp, .png'\n  | '.jpg, .jpeg'\n  | '.png, .jpg, .jpeg'\n  | '.webp, .png, .jpg, .jpeg'\n  | '.mp4, .webm, .ogg'\n  | '.webp, .png, .jpg, .jpeg, .mp4, .webm, .ogg';\n\n@Component({\n    selector: 'guajiritos-image-picker',\n    templateUrl: './guachos-image-picker.component.html',\n    styleUrls: ['./guachos-image-picker.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    imports: [\n        NgStyle,\n        MatTooltipModule,\n        MatIconModule,\n        PipesModule,\n        MatButtonModule,\n        MatSliderModule,\n        MatCheckboxModule,\n        MatFormFieldModule,\n        MatInputModule,\n        MatSelectModule,\n        FormsModule,\n        ReactiveFormsModule,\n    ]\n})\nexport class GuajiritosImagePicker {\n  private observer: any = null;\n  private originImageSrc: any;\n  private urlImage: string | undefined;\n  private lastOriginSrc: any;\n  private arrayCopiedImages: any[] = [];\n\n  public readonly uuidFilePicker: string = Date.now().toString(20);\n  public readonly allFormats: string[] = ['webp', 'jpeg', 'png', 'svg'];\n  public showCrop: UntypedFormControl = new UntypedFormControl({ value: false, disabled: false });\n  public maintainAspectRatio: UntypedFormControl = new UntypedFormControl({ value: true, disabled: false });\n  public quality: UntypedFormControl = new UntypedFormControl({ value: 70, disabled: false });\n  public format: UntypedFormControl = new UntypedFormControl({ value: null, disabled: false });\n  public cropHeight: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\n  public cropWidth: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\n  public maxHeight: number = 2000;\n  public maxWidth: number = 2000;\n  public config: WritableSignal<ImagePickerConf> = signal({\n    height: '240px',\n    width: '320px',\n    borderRadius: '16px',\n    compressInitial: true,\n    language: 'es',\n    hideDeleteBtn: false,\n    hideDownloadBtn: false,\n    hideEditBtn: false,\n    hideAddBtn: false,\n  });\n  public imageSrc: WritableSignal<string> = signal(null);\n  public loadImage: WritableSignal<boolean> = signal(false);\n  public noEdit: WritableSignal<boolean> = signal(false);\n  public showEditPanel: WritableSignal<boolean> = signal(false);\n  public imageName: WritableSignal<string> = signal('download');\n  public currentLanguage: WritableSignal<string> = signal('es');\n  public isVideo: WritableSignal<boolean> = signal(false);\n\n  @Input() appearance: MatFormFieldAppearance = 'outline';\n  @Input() color: ThemePalette = 'primary';\n  @Input() imagesAllowed: ImageAllowedTypes = 'image/*';\n\n  @ViewChild('imagePicker', { static: false }) imagePicker: ElementRef | undefined;\n\n  @Output() $imageChanged: EventEmitter<any> = new EventEmitter<any>();\n  @Output() $imageOriginal: EventEmitter<any> = new EventEmitter<any>();\n  @Output() imageRemoved: EventEmitter<void> = new EventEmitter<void>();\n\n  @Input() set base64Image(image: string) {\n    if (image) {\n      // Detectar si es un video\n      const isVideoData = this.isVideoContent(image);\n      this.isVideo.set(isVideoData);\n\n      this.imageSrc.set(image);\n      this.arrayCopiedImages = [];\n      this.arrayCopiedImages.push(this.imageSrc());\n      this.originImageSrc = image;\n      this.lastOriginSrc = image;\n      this.$imageOriginal.next(this.originImageSrc);\n      this.loadImage.set(true);\n      this.noEdit.set(isVideoData); // Si es video, no permitir edición\n    }\n  }\n\n  @Input() set _imageSrc(image: string) {\n    if (image && image !== this.imageSrc()) {\n      // Detectar si es un video\n      const isVideoData = this.isVideoContent(image);\n      this.isVideo.set(isVideoData);\n\n      let types: string[] = image.split('.');\n      this.format.setValue(types[types.length - 1]);\n\n      if (!isVideoData) {\n        if (!this.format.value || (this.format.value !== 'png' && this.format.value !== 'webp')) {\n          this.format.setValue('jpeg');\n        }\n      }\n\n      this.imageSrc.set(image);\n      this.arrayCopiedImages = [];\n      this.arrayCopiedImages.push(this.imageSrc());\n      this.originImageSrc = image;\n      this.lastOriginSrc = image;\n      this.$imageOriginal.next(this.originImageSrc);\n      this.loadImage.set(true);\n      this.noEdit.set(true);\n    } else if (image && this.imageSrc() && image === this.imageSrc()) {\n      const isVideoData = this.isVideoContent(image);\n      this.isVideo.set(isVideoData);\n\n      this.arrayCopiedImages = [];\n      this.arrayCopiedImages.push(this.imageSrc());\n      this.originImageSrc = image;\n      this.lastOriginSrc = image;\n      this.$imageOriginal.next(this.originImageSrc);\n      this.noEdit.set(false);\n      this.loadImage.set(true);\n    } else {\n      this.imageSrc.set(null);\n      this.originImageSrc = null;\n      this.loadImage.set(false);\n      this.noEdit.set(false);\n      this.arrayCopiedImages = [];\n      this.lastOriginSrc = null;\n      this.$imageOriginal.next(null);\n      this.format.setValue('jpeg');\n      this.maxHeight = 2000;\n      this.maxWidth = 2000;\n      this.cropHeight.setValue(150);\n      this.cropWidth.setValue(150);\n      this.maintainAspectRatio.setValue(true);\n      this.showEditPanel.set(false);\n      this.isVideo.set(false);\n    }\n  }\n\n  @Input() set _config(value: ImagePickerConf) {\n    if (value && value.constructor == Object) {\n      this.config.set({\n        ...this.config(),\n        ...value,\n      });\n    }\n  }\n\n  private async handleReaderLoaded(readerEvt: { target: { result: any; }; }): Promise<void> {\n    const binaryString: string = readerEvt.target.result;\n    const base64textString: string = btoa(binaryString);\n    this.originImageSrc = this.urlImage + base64textString;\n    this.lastOriginSrc = this.urlImage + base64textString;\n    if (this.config()?.compressInitial) {\n      this.quality.setValue(70);\n      const input: ImageConverterInput = {\n        dataType: this.format.value,\n        quality: 0.70,\n        maintainRatio: true,\n      };\n      this.imageSrc.set(await this.resizeDataURL(this.urlImage + base64textString, input));\n    } else {\n      this.imageSrc.set(this.urlImage + base64textString);\n      this.arrayCopiedImages = [];\n      this.arrayCopiedImages.push({\n        lastImage: this.imageSrc(),\n        width: this.maxWidth,\n        height: this.maxHeight,\n        quality: this.quality.value,\n      });\n      this.$imageOriginal.next(this.imageSrc());\n    }\n    this.$imageChanged.next(this.imageSrc());\n    this.loadImage.set(true);\n  }\n\n  private async resizeDataURL(datas: string, input: ImageConverterInput): Promise<any> {\n    return await new Promise(async function(resolve): Promise<void> {\n      let img: HTMLImageElement = document.createElement('img');\n      img.src = datas + '';\n      img.crossOrigin = 'Anonymous';\n      let quality: number = input?.quality ?? 1.0;\n      let maintainRatio: boolean = input.maintainRatio !== undefined ? input.maintainRatio : true;\n\n      img.onload = function(): void {\n        const canvas: HTMLCanvasElement = document.createElement('canvas');\n        const ctx: CanvasRenderingContext2D = canvas.getContext('2d');\n        let ratio: number = img.width / img.height;\n        let width: number = input?.width ?? img.width;\n        let height: number = input?.height ?? img.height;\n\n        if (maintainRatio) {\n          if (input.changeHeight) {\n            canvas.width = height * ratio;\n            canvas.height = height;\n          } else {\n            canvas.width = width;\n            canvas.height = width / ratio;\n          }\n        } else {\n          canvas.width = width;\n          canvas.height = height;\n        }\n\n        ctx?.drawImage(img, 0, 0, canvas.width, canvas.height);\n        let type: string = input?.dataType ?? 'webp';\n        const dataURI: string = canvas.toDataURL(`image/${type}`, quality);\n        resolve({\n          dataUri: dataURI,\n          width: canvas.width,\n          height: canvas.height,\n        });\n      };\n    }).then((data: any) => {\n      this.maxHeight = data?.height;\n      this.maxWidth = data?.width;\n      if (this.arrayCopiedImages?.length <= 20) {\n        this.arrayCopiedImages.push({\n          lastImage: data?.dataUri,\n          width: this.maxWidth,\n          height: this.maxHeight,\n          quality: this.quality.value,\n        });\n      }\n\n      return data.dataUri;\n    });\n  }\n\n  private wait(ms?: number | undefined): Promise<any> {\n    ms = ms ?? 1000;\n    return new Promise((resolve): void => {\n      setTimeout(() => {\n        return resolve(true);\n      }, ms);\n    });\n  }\n\n  private dragElement(element: HTMLElement): void {\n    let pos1: number = 0, pos2: number = 0, pos3: number = 0, pos4: number = 0;\n\n    let el: HTMLElement = document.getElementById(element.id + '-header');\n    if (el) {\n      el.onmousedown = dragMouseDown;\n      el.ontouchstart = dragMouseDown;\n    } else {\n      element.onmousedown = dragMouseDown;\n      element.ontouchstart = dragMouseDown;\n    }\n\n    function dragMouseDown(e: any): void {\n      e = e || window.event;\n      e?.preventDefault();\n      pos3 = e?.clientX;\n      pos4 = e?.clientY;\n      document.onmouseup = closeDragElement;\n      document.ontouchend = closeDragElement;\n      document.onmousemove = elementDrag;\n      document.ontouchmove = elementDrag;\n    }\n\n    function elementDrag(e: any): void {\n      let holderImage: any = document.getElementById('image-full');\n      e = e || window.event;\n      e?.preventDefault();\n      pos1 = pos3 - e?.clientX;\n      pos2 = pos4 - e?.clientY;\n      pos3 = e?.clientX;\n      pos4 = e?.clientY;\n\n      const newTop: number = element.offsetTop - pos2;\n      const newLeft: number = element.offsetLeft - pos1;\n      const rectHolder = holderImage.getBoundingClientRect();\n      const rectElement: DOMRect = element.getBoundingClientRect();\n      if (newTop >= rectHolder.y + 8) {\n        element.style.top = Math.min(newTop, rectHolder.y + rectHolder.height - rectElement.height - 4) + 'px';\n      }\n      if (newLeft > rectHolder.x + 4 && rectHolder.x + rectHolder.width > rectElement.x + rectElement.width + 2) {\n        element.style.left = Math.min(newLeft, rectHolder.x + rectHolder.width - rectElement.width - 4) + 'px';\n      }\n    }\n\n    function closeDragElement(): void {\n      document.onmouseup = null;\n      document.onmousemove = null;\n      document.ontouchend = null;\n      document.ontouchmove = null;\n    }\n  }\n\n  public onUpload(event: { preventDefault: () => void; }): void {\n    event.preventDefault();\n    this.imagePicker?.nativeElement.click();\n  }\n\n  public handleFileSelect(evt: any): void {\n    const files = evt?.target?.files;\n    if (files) {\n      const file = files[0];\n\n      // Detectar si es video\n      const isVideoFile = file?.type?.startsWith('video/');\n      this.isVideo.set(isVideoFile);\n\n      if (isVideoFile) {\n        // Para videos, crear URL directamente sin procesamiento\n        this.imageName.set(file?.name?.split('.')[0]);\n        const reader: any = new FileReader();\n        reader.onload = (e: any): void => {\n          this.imageSrc.set(e.target.result);\n          this.$imageChanged.next(this.imageSrc());\n          this.$imageOriginal.next(this.imageSrc());\n          this.loadImage.set(true);\n          this.noEdit.set(true); // Deshabilitar edición para videos\n        };\n        reader.readAsDataURL(file);\n      } else {\n        // Procesamiento original para imágenes\n        if (file?.type?.indexOf('png') !== -1) {\n          this.format.setValue('png');\n        } else if (file?.type?.indexOf('webp') !== -1) {\n          this.format.setValue('webp');\n        } else {\n          this.format.setValue('jpeg');\n        }\n\n        this.imageName.set(file?.name?.split('.')[0]);\n        this.urlImage = `data:${file?.type};base64,`;\n        this.noEdit.set(false);\n\n        if (files && file) {\n          const reader: any = new FileReader();\n          reader.onload = this.handleReaderLoaded.bind(this);\n          reader.readAsBinaryString(file);\n        }\n      }\n    }\n  }\n\n  public onCloseEditPanel(): void {\n    if (this.observer instanceof ResizeObserver) {\n      let imageCropper: any = document.getElementById('image-cropper');\n      let imageFull: any = document.getElementById('image-full');\n      this.observer.unobserve(imageCropper);\n      this.observer.unobserve(imageFull);\n    }\n    this.showCrop.setValue(false);\n    this.showEditPanel.set(false);\n  }\n\n  public async onChangeQuality(): Promise<void> {\n    const qualityItem: number = this.quality.value / 100;\n    this.maxHeight = this.maxHeight ?? 2000;\n    this.maxWidth = this.maxWidth ?? 2000;\n\n    await this.wait(250);\n    try {\n      const input: ImageConverterInput = {\n        height: this.maxHeight,\n        width: this.maxWidth,\n        dataType: this.format.value,\n        quality: qualityItem,\n        maintainRatio: this.maintainAspectRatio.value,\n      };\n\n      this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\n      this.$imageChanged.next(this.imageSrc());\n      this.loadImage.set(true);\n    } catch (error) {\n      this.loadImage.set(true);\n    }\n  }\n\n  public async onChangeFormat(): Promise<void> {\n    let qualityItem: number = this.quality.value / 100;\n    this.maxHeight = this.maxHeight ?? 2000;\n    this.maxWidth = this.maxWidth ?? 2000;\n\n    await this.wait(250);\n    try {\n      let input: ImageConverterInput = {\n        height: this.maxHeight,\n        width: this.maxWidth,\n        dataType: this.format.value,\n        quality: qualityItem,\n        maintainRatio: this.maintainAspectRatio.value,\n      };\n      this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\n      this.$imageChanged.next(this.imageSrc());\n      this.loadImage.set(true);\n    } catch (error) {\n      this.loadImage.set(true);\n    }\n  }\n\n  public async onChangeSize(changeWidth?: any, changeHeight?: any): Promise<void> {\n    let qualityItem: number = this.quality.value / 100;\n    this.maxHeight = this.maxHeight ?? 2000;\n    this.maxWidth = this.maxWidth ?? 2000;\n\n    await this.wait(500);\n\n    try {\n      let input: ImageConverterInput = {\n        height: this.maxHeight,\n        width: this.maxWidth,\n        dataType: this.format.value,\n        quality: qualityItem,\n        maintainRatio: this.maintainAspectRatio.value,\n        changeHeight: changeHeight,\n        changeWidth: changeWidth,\n      };\n      this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\n      this.$imageChanged.next(this.imageSrc());\n      this.loadImage.set(true);\n    } catch (error) {\n      this.loadImage.set(true);\n    }\n  }\n\n  public onChangeCrop(): void {\n    const cropper: any = document.getElementById('image-cropper');\n    cropper.style.width = this.cropWidth.value + 'px';\n    cropper.style.height = this.cropHeight.value + 'px';\n  }\n\n  public onCropStateChange(): void {\n    const cropper: HTMLElement = document.getElementById('image-cropper');\n    const fullImage: HTMLElement = document.getElementById('image-full');\n    const aspectRatio: number = fullImage.offsetWidth / fullImage.offsetHeight;\n\n    if (this.showCrop.value) {\n      cropper.style.opacity = '1.0';\n      this.dragElement(cropper);\n      this.observer = new ResizeObserver((entries: ResizeObserverEntry[]): void => {\n        entries.forEach((entry: ResizeObserverEntry): void => {\n          if (this.showEditPanel()) {\n            const elementCropper: HTMLElement = document.getElementById('image-cropper');\n            const elementFull: HTMLElement = document.getElementById('image-full');\n\n            const rectHolder: DOMRect = elementFull.getBoundingClientRect();\n            const rectElement: DOMRect = elementCropper.getBoundingClientRect();\n\n            const maxWidth: number = rectHolder.x + rectHolder.width - rectElement.x - 4;\n            const maxHeight: number = rectHolder.y + rectHolder.height - rectElement.y - 4;\n\n            // Obtener el tamaño del área de recorte seleccionada por el usuario\n            const cropWidth: number = elementCropper.offsetWidth;\n            const cropHeight: number = elementCropper.offsetHeight;\n\n            // Calcular el ancho y el alto del área de recorte manteniendo la relación de aspecto de la imagen original\n            let newWidth: number = cropWidth;\n            let newHeight: number = cropHeight;\n\n            if (this.maintainAspectRatio.value) {\n              if (cropWidth / cropHeight > aspectRatio) {\n                newHeight = cropWidth / aspectRatio;\n              } else {\n                newWidth = cropHeight * aspectRatio;\n              }\n            }\n\n            // Ajustar el ancho y el alto del área de recorte si supera los límites\n            newWidth = Math.min(newWidth, maxWidth);\n            newHeight = Math.min(newHeight, maxHeight);\n\n            // Establecer el tamaño y la posición del área de recorte\n            elementCropper.style.width = `${newWidth}px`;\n            elementCropper.style.height = `${newHeight}px`;\n\n            this.cropWidth.setValue(rectElement.width);\n            this.cropHeight.setValue(rectElement.height);\n\n            if (entry.target.id == 'image-full') {\n              if (rectHolder.top > 0) {\n                elementCropper.style.top = rectHolder.top + 4 + 'px';\n              }\n              elementCropper.style.left = rectHolder.left + 4 + 'px';\n            }\n          }\n        });\n      });\n      this.observer.observe(document.getElementById('image-cropper'));\n      this.observer.observe(document.getElementById('image-full'));\n    } else {\n      cropper.style.opacity = '0.0';\n      if (this.observer instanceof ResizeObserver) {\n        const elementCropper: HTMLElement = document.getElementById('image-cropper');\n        const elementFull: HTMLElement = document.getElementById('image-full');\n        this.observer.unobserve(elementCropper);\n        this.observer.unobserve(elementFull);\n      }\n    }\n  }\n\n  public onCrop(type?: any): void {\n    type = type ?? this.format.value;\n    const cropper: HTMLElement = document.getElementById('image-cropper');\n    const elementFull: HTMLElement = document.getElementById('image-full');\n    const rectCropper: DOMRect = cropper.getBoundingClientRect();\n    const dataHolderRect: DOMRect = elementFull.getBoundingClientRect();\n    const canvas: HTMLCanvasElement = document.createElement('canvas');\n    new Promise((resolve, reject): void => {\n      let ctx: CanvasRenderingContext2D | null = canvas.getContext('2d');\n      let image: HTMLImageElement = new Image();\n      image.src = this.imageSrc();\n      image.onload = (): void => {\n        let ratio: number = image.height / dataHolderRect.height;\n        let newWidth: number = rectCropper.width * ratio;\n        let newHeight: number = rectCropper.height * ratio;\n        canvas.width = newWidth;\n        canvas.height = newHeight;\n        ctx?.drawImage(\n          image,\n          Math.abs(rectCropper.x * ratio) - Math.abs(dataHolderRect.x * ratio),\n          Math.abs(rectCropper.y * ratio) - Math.abs(dataHolderRect.y * ratio),\n          newWidth,\n          newHeight,\n          0,\n          0,\n          newWidth,\n          newHeight,\n        );\n\n        resolve(canvas.toDataURL(`image/${type}`, this.quality.value));\n      };\n      image.onerror = (e: string | Event): void => {\n        reject(e);\n      };\n    })\n      .then((dataUri: any): void => {\n        this.imageSrc.set(dataUri);\n        this.showCrop.setValue(false);\n        this.onCropStateChange();\n        this.maxWidth = canvas?.width;\n        this.maxHeight = canvas?.height;\n        this.lastOriginSrc = this.originImageSrc + '';\n        this.originImageSrc = dataUri;\n        this.$imageChanged.next(this.imageSrc());\n      })\n      .catch((e): void => {\n        console.log(e);\n      });\n  }\n\n  public onRestore(): void {\n    if (this.arrayCopiedImages.length) {\n      let lastState = this.arrayCopiedImages.pop();\n      this.imageSrc.set(lastState.lastImage);\n      this.maxWidth = lastState.width;\n      this.maxHeight = lastState.height;\n      this.originImageSrc = this.lastOriginSrc + '';\n      this.noEdit.set(false);\n    } else {\n      this.imageSrc.set(this.lastOriginSrc);\n      this.originImageSrc = this.lastOriginSrc + '';\n      this.noEdit.set(false);\n    }\n\n    this.$imageChanged.next(this.imageSrc());\n  }\n\n  public onRemove(): void {\n    this.imageSrc.set(null);\n    this.originImageSrc = null;\n    this.loadImage.set(false);\n    this.arrayCopiedImages = [];\n    this.lastOriginSrc = null;\n    this.$imageOriginal.next(null);\n    this.$imageChanged.next(null);\n    this.format.setValue(null);\n    this.maxHeight = 2000;\n    this.maxWidth = 2000;\n    this.cropHeight.setValue(150);\n    this.cropWidth.setValue(150);\n    this.maintainAspectRatio.setValue(true);\n    this.showEditPanel.set(false);\n    this.noEdit.set(false);\n    this.isVideo.set(false);\n    this.imageRemoved.emit();\n  }\n\n  /**\n   * Detecta si el contenido es un video basándose en:\n   * 1. Data URL que comienza con data:video/\n   * 2. Extensión de archivo (.mp4, .webm, .ogg, .mov, etc.)\n   */\n  private isVideoContent(src: string): boolean {\n    if (!src) return false;\n\n    // Verificar si es un data URL de video\n    if (src.startsWith('data:video/')) {\n      return true;\n    }\n\n    // Verificar extensiones de video comunes\n    const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.mkv', '.flv', '.wmv'];\n    const lowerSrc = src.toLowerCase();\n\n    return videoExtensions.some(ext => {\n      // Verificar si termina con la extensión o si la tiene antes de parámetros de query\n      return lowerSrc.endsWith(ext) || lowerSrc.includes(ext + '?');\n    });\n  }\n}\n","@if (!loadImage()) {\n  <div class='place-image'>\n    <div class='image-holder'\n         [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n      <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\n              (click)='onUpload($event)'>\n        <mat-icon class='mat-18'>add_a_photo</mat-icon>\n      </button>\n      <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n             (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n    </div>\n  </div>\n}\n\n\n@if (loadImage()) {\n  <div class='place-image'>\n    <div class='image-holder-loaded'\n         [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n      @if (isVideo()) {\n        <video\n          [src]='imageSrc()'\n          controls\n          preload=\"metadata\"\n          [ngStyle]='{ borderRadius: config()?.borderRadius, width: \"100%\", height: \"100%\", objectFit: \"cover\" }'>\n          Tu navegador no soporta la reproducción de video.\n        </video>\n      } @else {\n        <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\n      }\n      <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n             (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n    </div>\n    @if (imageSrc()?.length) {\n      <p class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n          [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n        @if (!noEdit()) {\n          {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\n        } @else {\n          @if (isVideo()) {\n            {{\"FORMAT\" | i18n: currentLanguage()}}: video\n          } @else {\n            {{\"FORMAT\" | i18n: currentLanguage()}}: {{ format.value }}\n          }\n        }\n      </p>\n    }\n\n    <div class='editing-bar-btn'>\n      @if (!config()?.hideAddBtn) {\n        <button id='upload-img' mat-icon-button (click)='onUpload($event)'\n                [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\n          <mat-icon class='mat-18'>add_a_photo</mat-icon>\n        </button>\n      }\n      @if (!config()?.hideEditBtn && !noEdit()) {\n        <button id='edit-img' mat-icon-button (click)='showEditPanel.set(true)'\n                [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\n          <mat-icon class='mat-18'>edit</mat-icon>\n        </button>\n      }\n      @if (!config()?.hideDownloadBtn) {\n        <a id='download-img' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\n           [href]='imageSrc()' mat-icon-button [download]='imageName()'>\n          <mat-icon class='mat-18'>cloud_download</mat-icon>\n        </a>\n      }\n      @if (!config()?.hideDeleteBtn) {\n        <button id='delete-img'  mat-icon-button (click)='onRemove()'\n                [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\n          <mat-icon class='mat-18'>delete</mat-icon>\n        </button>\n      }\n\n\n\n\n    </div>\n  </div>\n}\n\n@if (showEditPanel()) {\n  <div id='popup' class='popup'>\n    <div class='popup-clear'>\n      <button mat-icon-button (click)='onCloseEditPanel()'>\n        <mat-icon class='mat-18'>clear</mat-icon>\n      </button>\n    </div>\n\n    <div class='image-container'>\n      <div class='image-holder-full'>\n        <img id='image-full' [src]='imageSrc()' alt=''>\n        <div id='image-cropper' class='image-cropper'>\n          <div id='image-cropper-header'>\n            <mat-icon>drag_indicator</mat-icon>\n          </div>\n        </div>\n      </div>\n\n      <div class='control-panel'>\n        <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\n        <div class='quality-container'>\n          <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\n                      [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\n            <input matSliderThumb [formControl]='quality'>\n          </mat-slider>\n        </div>\n\n        <div class='item-panel'>\n          <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\n          <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\n            <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\n          </mat-checkbox>\n        </div>\n\n        <div class='max-dimension-container'>\n          <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n            <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\n            <input (change)='onChangeSize(true, false)' matInput [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\n                   [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\n          </mat-form-field>\n\n          <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n            <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n            <input (change)='onChangeSize(false, true)' matInput [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\n                   [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\n          </mat-form-field>\n        </div>\n\n        <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\n        <div class='formats-selection'>\n          <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\n            <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\n              @for (format of allFormats; track format) {\n                <mat-option [value]='format'>\n                  {{ format }}\n                </mat-option>\n              }\n\n            </mat-select>\n          </mat-form-field>\n        </div>\n\n        <div class='refresh-container'>\n          <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\n            <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\n          </mat-checkbox>\n          <div class='d-flex '>\n            <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\n              <mat-icon>refresh</mat-icon>\n            </button>\n            @if (showCrop.value) {\n              <p>\n                <button mat-icon-button [color]='color' (click)='onCrop()'>\n                  <mat-icon>crop</mat-icon>\n                </button>\n              </p>\n            }\n\n          </div>\n        </div>\n        @if (showCrop.value) {\n          <ng-container>\n            <div class='dimension-container'>\n              <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n                <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\n                <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\n                       [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\n              </mat-form-field>\n              <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n                <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n                <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\n                       [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\n              </mat-form-field>\n            </div>\n          </ng-container>\n        }\n\n\n        <div class='save-container'>\n          <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\n            {{ 'SAVE' | i18n: config()?.language}}\n          </button>\n\n          @if (imageSrc()?.length) {\n            <p class='mat-caption image-caption'\n               [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n               [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n<!--              {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}-->\n              {{\"FORMAT\" | i18n: currentLanguage()}}: {{ format.value }}\n            </p>\n          }\n\n        </div>\n      </div>\n    </div>\n  </div>\n}\n\n","/*\n * Public API Surface of guachos-image-picker\n */\n\nexport * from './lib/guachos-image-picker.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i10.I18nPipe","i11.CalculateSizePipe"],"mappings":"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"}