@libs-ui/components-image-editor 0.2.339-0 → 0.2.341-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-image-editor.mjs","sources":["../../../../../libs-ui/components/image-editor/src/defines/image-editor.define.ts","../../../../../libs-ui/components/image-editor/src/resize/resize.component.ts","../../../../../libs-ui/components/image-editor/src/resize/resize.component.html","../../../../../libs-ui/components/image-editor/src/image-editor.component.ts","../../../../../libs-ui/components/image-editor/src/image-editor.component.html","../../../../../libs-ui/components/image-editor/src/demo/image-editor-demo.component.ts","../../../../../libs-ui/components/image-editor/src/demo/image-editor-demo.component.html","../../../../../libs-ui/components/image-editor/src/libs-ui-components-image-editor.ts"],"sourcesContent":["import { get } from '@libs-ui/utils';\nimport { ICropRatioItem } from '../interfaces/image-editor.interface';\n\nexport const cropRationItems = (): Array<ICropRatioItem> => {\n return [\n {\n key: 'free',\n icon: 'libs-ui-icon-customize-image-outline',\n },\n {\n key: '1:1',\n value: 1,\n icon: 'libs-ui-icon-ratio-1-1',\n },\n {\n key: '2:3',\n value: 2 / 3,\n icon: 'libs-ui-icon-ratio-2-3',\n },\n {\n key: '3:2',\n value: 3 / 2,\n icon: 'libs-ui-icon-ratio-3-2',\n },\n {\n key: '3:4',\n value: 3 / 4,\n icon: 'libs-ui-icon-ratio-3-4',\n },\n {\n key: '4:3',\n value: 4 / 3,\n icon: 'libs-ui-icon-ratio-4-3',\n },\n {\n key: '9:16',\n value: 9 / 16,\n icon: 'libs-ui-icon-ratio-9-16',\n },\n {\n key: '16:9',\n value: 16 / 9,\n icon: 'libs-ui-icon-ratio-16-9',\n },\n ];\n};\n\nconst getMimeTypeFromSrc = (src?: string) => {\n if (!src) {\n return undefined;\n }\n const match = /^data:(.*?);/.exec(src);\n\n if (match) {\n return match[1];\n }\n const srcSplit = src.split('.');\n const mineType = srcSplit[srcSplit.length - 1];\n\n return `image/${mineType.toLowerCase() === 'jpg' ? 'jpeg' : mineType}`;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const getDataUrl = (canvas: any, mimetype?: string, src?: string) => {\n const mimeTypeBySrc = getMimeTypeFromSrc(src);\n\n if (mimetype || mimeTypeBySrc) {\n return canvas.toDataURL(mimetype || mimeTypeBySrc);\n }\n\n return canvas.toDataURL();\n};\n\nexport const getWidthHeightResizeCropFollow = (ratioValue: number | undefined, width: number, height: number, maxWidth: number, maxHeight: number, minWidth: number, minHeight: number) => {\n height = Math.min(height, maxHeight);\n height = Math.max(minHeight, height);\n if (ratioValue) {\n width = height * ratioValue;\n width = Math.min(maxWidth, width);\n width = Math.max(minWidth, width);\n height = width / ratioValue;\n }\n width = Math.min(maxWidth, width);\n width = Math.max(minWidth, width);\n\n return [width, height];\n};\n\nexport const getCropRectImage = (rectClip: { left: number; top: number; width: number; height: number }, imgWidth: number, imgHeight: number, scale: number) => {\n return {\n left: Math.max(rectClip.left * scale, 0),\n top: Math.max(rectClip.top * scale, 0),\n width: rectClip.width * scale,\n height: rectClip.height * scale,\n };\n};\n\nexport const getStylesOfElement = <T>(element: HTMLElement, fields: Array<string>): Array<T> => {\n return fields?.map<T>((field) => parseFloat(get(element, field) || '0') as T);\n};\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { getDataUrl } from '../defines/image-editor.define';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IButton } from '@libs-ui/components-buttons-button';\nimport { IInputValidFunctionControlEvent } from '@libs-ui/components-inputs-valid';\nimport { IResizeData } from '../interfaces/image-editor.interface';\nimport { LibsUiComponentsModalComponent, TYPE_MODAL_EVENT } from '@libs-ui/components-modal';\nimport { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { convertBase64ToBlob, convertBlobToFile, getLabelBySizeFile } from '@libs-ui/utils';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs-ui-components-image_editor-resize',\n templateUrl: './resize.component.html',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsModalComponent, LibsUiComponentsInputsValidComponent],\n})\nexport class LibsUiComponentsImageEditorResizeComponent implements OnInit {\n protected buttonsFooter: Array<IButton>;\n protected image = new Image();\n protected originFileSize!: string;\n protected currentFileSize!: string;\n\n private inputValidFunctionControl: Array<IInputValidFunctionControlEvent>;\n\n @Input({ required: true }) resizeData!: IResizeData;\n @Input({ required: true }) originWidth!: number;\n @Input({ required: true }) originHeight!: number;\n @Input({ required: true }) src!: string;\n @Input() zIndex?: number;\n @Input() mimetype?: string;\n\n @Output() readonly outClose = new EventEmitter<void>();\n @Output() readonly outSave = new EventEmitter<IResizeData>();\n\n constructor() {\n this.buttonsFooter = [\n {\n type: 'button-third',\n label: 'i18n_cancel',\n action: async () => this.outClose.emit(),\n },\n {\n label: 'i18n_save',\n action: async () => {\n this.outSave.emit(this.resizeData);\n this.outClose.emit();\n },\n },\n ];\n this.inputValidFunctionControl = [];\n }\n\n async ngOnInit(): Promise<void> {\n const fileSize = await this.getFileSize();\n\n this.currentFileSize = fileSize;\n this.originFileSize = fileSize;\n }\n\n protected async handlerResizeRatio() {\n let ratio = parseInt(`${this.resizeData.ratio}`);\n\n if (!ratio || ratio < 0) {\n return;\n }\n if (ratio > 100) {\n ratio = 100;\n this.resizeData.ratio = ratio;\n }\n this.resizeData.width = Math.max(parseInt(`${(this.originWidth * ratio) / 100}`), 1);\n this.resizeData.height = Math.max(parseInt(`${(this.originHeight * ratio) / 100}`), 1);\n // this.inputValidFunctionControl.forEach(item => item.detectChanges());\n this.currentFileSize = await this.getFileSize();\n }\n\n private getFileSize() {\n return new Promise<string>((resolve) => {\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n\n canvas.width = this.resizeData.width;\n canvas.height = this.resizeData.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(this.image, 0, 0, canvas.width, canvas.height);\n }\n const src = getDataUrl(canvas, this.mimetype, this.src);\n const file = convertBase64ToBlob(src);\n\n resolve(getLabelBySizeFile(convertBlobToFile(file, Date.now().toLocaleString()).size));\n };\n this.image.src = this.src;\n });\n }\n\n protected handlerResizeWidth() {\n this.processResizeWidthOrHeight('width', 'height', this.originWidth, this.originHeight);\n }\n\n protected handlerResizeHeight() {\n this.processResizeWidthOrHeight('height', 'width', this.originHeight, this.originWidth);\n }\n\n private async processResizeWidthOrHeight(resizeBy: 'width' | 'height', fieldResize: 'width' | 'height', originByValue: number, originOtherValue: number) {\n const value = parseInt(`${this.resizeData[resizeBy]}`);\n\n if (!value || value > originByValue) {\n return;\n }\n this.resizeData[fieldResize] = Math.max(parseInt(`${(originOtherValue * value) / originByValue}`), 1);\n this.resizeData.ratio = Math.max(parseInt(`${(100 * value) / originByValue}`), 1);\n this.currentFileSize = await this.getFileSize();\n }\n\n protected handlerInputValidFunctionControl(event: IInputValidFunctionControlEvent) {\n this.inputValidFunctionControl.push(event);\n }\n\n protected handlerEvent(event: TYPE_MODAL_EVENT) {\n if (event === 'close') {\n this.outClose.emit();\n }\n }\n}\n","<libs_ui-components-modal\n [headerConfig]=\"{ ignoreHeaderTheme: true }\"\n [mode]=\"'center'\"\n [width]=\"'500px'\"\n [height]=\"'auto'\"\n [title]=\"'i18n_resize' | translate\"\n [zIndex]=\"zIndex\"\n [buttonsFooter]=\"buttonsFooter\"\n (outEvent)=\"handlerEvent($event)\">\n <div class=\"libs-ui-modal-body-custom w-full h-full\">\n <div class=\"flex items-center\">\n <div class=\"libs-ui-font-h7r mr-[4px] text-[#6a7383] w-[100px] shrink-0\">{{ 'i18n_ratio_size' | translate }} (%)</div>\n <libs_ui-components-inputs-valid\n [ignoreWidthInput100]=\"true\"\n [classIncludeInput]=\"'w-[132px]'\"\n [dataType]=\"'int'\"\n [fieldNameBind]=\"'ratio'\"\n [(item)]=\"resizeData\"\n [minValueNumber]=\"1\"\n [maxValueNumber]=\"100\"\n [valueUpDownNumber]=\"1\"\n [validRequired]=\"{ isRequired: true }\"\n [ignoreShowError]=\"true\"\n (outValueChange)=\"handlerResizeRatio()\"\n (outFunctionsControl)=\"handlerInputValidFunctionControl($event)\" />\n </div>\n <div class=\"mt-[16px] relative\">\n <div class=\"flex items-center\">\n <div class=\"libs-ui-font-h7r mr-[4px] text-[#6a7383] w-[100px] shrink-0\">\n {{ 'i18n_width' | translate }}\n </div>\n <libs_ui-components-inputs-valid\n [ignoreWidthInput100]=\"true\"\n [classIncludeInput]=\"'w-[102px]'\"\n [dataType]=\"'int'\"\n [maxValueNumber]=\"originWidth\"\n [minValueNumber]=\"1\"\n [fieldNameBind]=\"'width'\"\n [(item)]=\"resizeData\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n (outValueChange)=\"handlerResizeWidth()\"\n (outFunctionsControl)=\"handlerInputValidFunctionControl($event)\" />\n </div>\n <div class=\"flex items-center mt-[8px]\">\n <div class=\"libs-ui-font-h7r mr-[4px] text-[#6a7383] w-[100px] shrink-0\">\n {{ 'i18n_length' | translate }}\n </div>\n <libs_ui-components-inputs-valid\n [ignoreWidthInput100]=\"true\"\n [classIncludeInput]=\"'w-[102px]'\"\n [dataType]=\"'int'\"\n [minValueNumber]=\"1\"\n [maxValueNumber]=\"originHeight\"\n [fieldNameBind]=\"'height'\"\n [(item)]=\"resizeData\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n (outValueChange)=\"handlerResizeHeight()\"\n (outFunctionsControl)=\"handlerInputValidFunctionControl($event)\" />\n </div>\n <div class=\"absolute flex items-center left-[236px] top-[14px]\">\n <div class=\"w-[20px] h-[44px] libs-ui-border-top-general libs-ui-border-right-general libs-ui-border-bottom-general\"></div>\n <div class=\"ml-[6px] text-[#9ca2ad] libs-ui-icon-lock\"></div>\n </div>\n </div>\n <div class=\"mt-[16px]\">\n <div class=\"libs-ui-font-h6m text-[#6a7383] mb-[8px]\">{{ 'i18n_size_photo' | translate }}</div>\n <div class=\"libs-ui-font-h5r rounded-[4px] py-[8px] px-[16px] bg-[#f8f9fa] text-[#9ca2ad]\">\n {{ 'i18n_file_size_compare_when_resize' | translate: { current_size: currentFileSize, original_size: originFileSize } }}\n </div>\n </div>\n </div>\n</libs_ui-components-modal>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgTemplateOutlet } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, DestroyRef, ElementRef, Inject, inject, input, model, OnDestroy, Optional, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { LibsUiComponentsModalComponent } from '@libs-ui/components-modal';\nimport { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';\nimport { IAspectRatio, IBoundingClientRect, IEvent } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';\nimport { convertBase64ToBlob, get, isNil, LINK_IMAGE_ERROR_TOKEN_INJECT, set } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { fromEvent, Observable } from 'rxjs';\nimport { mergeMap, takeUntil, tap } from 'rxjs/operators';\nimport { cropRationItems, getCropRectImage, getDataUrl, getStylesOfElement, getWidthHeightResizeCropFollow } from './defines/image-editor.define';\nimport { IImageEditorFunctionControlEvent } from './interfaces/function-control-event.interface';\nimport { ICropRatioItem, ICropSize, IRectClip, IResizeData, ISaveFile, IStartMouseDim, IStyles, MODE_EDIT, TYPE_MODE_SAVE, TYPE_RESIZE_STATE } from './interfaces/image-editor.interface';\nimport { LibsUiComponentsImageEditorResizeComponent } from './resize/resize.component';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-image_editor',\n templateUrl: './image-editor.component.html',\n styleUrl: './image-editor.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgTemplateOutlet, TranslateModule, LibsUiComponentsPopoverComponent, LibsUiComponentsModalComponent, LibsUiComponentsInputsValidComponent, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsSpinnerComponent],\n})\nexport class LibsUiComponentsImageEditorComponent implements AfterViewInit, OnDestroy {\n protected loading = signal(false);\n protected loadingImage = signal(true);\n protected changed = signal(false);\n protected originWidth = signal<number>(0);\n protected originHeight = signal<number>(0);\n protected cropRatioItems = signal<Array<ICropRatioItem>>(cropRationItems());\n protected cropRatioItemSelected = signal<string>('');\n protected cropSize = signal<ICropSize>({ width: 20, height: 20 });\n protected resizeData = signal<IResizeData>({ ratio: 100, width: 600, height: 800 });\n protected dragGridCrop = signal(false);\n\n private image = new Image();\n private canvas = document.createElement('canvas');\n private containerHeight = signal(800);\n private containerWidth = signal(1200);\n private imgContainerRect = signal<IBoundingClientRect>({ top: 0, left: 0, width: 0, height: 0 });\n private rectClip = signal<IRectClip>({ top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0 });\n private resizeState = signal<TYPE_RESIZE_STATE>('none');\n private moveState = signal<'clip' | 'image' | 'none'>('none');\n private startMouseDim = signal<IStartMouseDim>({ clientX: 0, clientY: 0, width: 0, height: 0, top: 0, left: 0, imageTop: 0, imageLeft: 0, imageWidth: 0, imageHeight: 0 });\n private dataUrlOrigin = signal<string>('');\n private ratioValue = signal<number>(0);\n private readonly minHeight = 20;\n private readonly minWidth = 20;\n private resizeComponentRef?: ComponentRef<LibsUiComponentsImageEditorResizeComponent>;\n\n readonly modeShowButton = input<MODE_EDIT>('save-file');\n readonly mimetype = input<string>();\n readonly zIndex = input<number>(1200);\n readonly imgSrc = model.required<string>();\n readonly originUrl = input<string>();\n readonly nameFile = input<string>();\n readonly hasZoom = input<boolean>(false);\n readonly aspectRatio = input<IAspectRatio>();\n readonly requiredCropFollowRatio = input<boolean>(false);\n\n readonly imageOrigin = viewChild.required<ElementRef>('imageOrigin');\n readonly imageClip = viewChild.required<ElementRef>('imageClip');\n readonly imageEditorContainer = viewChild.required<ElementRef>('imageEditorContainer');\n readonly imageContainer = viewChild.required<ElementRef>('imageContainer');\n readonly cropArea = viewChild.required<ElementRef>('cropArea');\n readonly cropTL = viewChild.required<ElementRef>('cropTL');\n readonly cropBL = viewChild.required<ElementRef>('cropBL');\n readonly cropBR = viewChild.required<ElementRef>('cropBR');\n readonly cropTR = viewChild.required<ElementRef>('cropTR');\n readonly cropLineVL = viewChild.required<ElementRef>('cropLineVL');\n readonly cropLineVR = viewChild.required<ElementRef>('cropLineVR');\n readonly cropLineHT = viewChild.required<ElementRef>('cropLineHT');\n readonly cropLineHB = viewChild.required<ElementRef>('cropLineHB');\n readonly circleTL = viewChild.required<ElementRef>('circleTL');\n readonly circleTR = viewChild.required<ElementRef>('circleTR');\n readonly circleBL = viewChild.required<ElementRef>('circleBL');\n readonly circleBR = viewChild.required<ElementRef>('circleBR');\n\n readonly outClose = output<{ isClickButtonClose: boolean }>();\n readonly outSaveFile = output<ISaveFile>();\n readonly outFunctionsControl = output<IImageEditorFunctionControlEvent>();\n\n private destroyRef = inject(DestroyRef);\n private dynamicComponentService = inject(LibsUiDynamicComponentService);\n\n constructor(@Optional() @Inject(LINK_IMAGE_ERROR_TOKEN_INJECT) private linkImageError: string) {}\n\n ngAfterViewInit() {\n const aspectRatioFound = this.aspectRatio()?.key ? this.cropRatioItems().find((item) => item.key === this.aspectRatio()?.key) : this.cropRatioItems()[0];\n\n if (aspectRatioFound) {\n this.dragGridCrop.set(true);\n\n this.cropRatioItemSelected.set(aspectRatioFound?.key);\n this.updateOriginImageSize();\n this.changedImage(true);\n }\n\n this.updateModalSize();\n this.initData();\n this.initMouseEvent();\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IImageEditorFunctionControlEvent {\n return {\n cropImage: this.cropImage.bind(this),\n setLoadingState: (loading: boolean) => this.loading.set(loading),\n };\n }\n\n protected handlerImageLoaded() {\n setTimeout(() => {\n this.updateModalSize();\n this.loadingImage.set(false);\n }, 500);\n }\n\n protected handlerImageError(e: ErrorEvent) {\n console.log('e', e);\n (e as IEvent).target.src = this.linkImageError;\n }\n\n private updateModalSize() {\n const maxHeight = window.innerHeight - 100;\n const maxWidth = window.innerWidth - 400;\n\n this.containerHeight.set(maxHeight - 124);\n this.containerWidth.set(maxWidth - 384);\n this.updateOriginImageSize();\n }\n\n private initData() {\n this.imgContainerRect.set(this.imageContainer().nativeElement.getBoundingClientRect());\n this.image.setAttribute('crossorigin', 'anonymous');\n this.image.onload = () => {\n this.imgContainerRect.set(this.imageContainer().nativeElement.getBoundingClientRect());\n this.canvas.height = this.image.height;\n this.canvas.width = this.image.width;\n this.originHeight.set(this.image.height);\n this.originWidth.set(this.image.width);\n\n this.updateOriginImageSize();\n this.canvas.getContext('2d')?.drawImage(this.image, 0, 0, this.canvas.width, this.canvas.height);\n this.dataUrlOrigin.set(getDataUrl(this.canvas, this.mimetype(), this.image.src));\n this.imgSrc.set(this.dataUrlOrigin());\n };\n this.image.src = this.imgSrc();\n }\n\n private initMouseEvent() {\n const mouseUp = this.initEvent({ nativeElement: document }, 'mouseup', { callStopPropagation: true, callPreventDefault: true }, undefined, () => this.handlerMouseup());\n const mouseMove = this.initEvent({ nativeElement: document }, 'mousemove', { callStopPropagation: true, callPreventDefault: true }).pipe(takeUntil(mouseUp));\n\n this.initEvent(this.imageEditorContainer(), 'wheel', { callStopPropagation: true }, undefined, (e: Event) => this.handlerMousewheel(e)).subscribe();\n this.initEvent({ nativeElement: window }, 'resize', {}, undefined, () => this.updateModalSize()).subscribe();\n this.initEvent(this.imageContainer(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => this.handlerImageContainerMousedown(e)).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropTL(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'TL');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropBL(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'BL');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropBR(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'BR');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropTR(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'TR');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineVL(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'VL');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineVR(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'VR');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineHT(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'HT');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineHB(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'HB');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropArea(), 'mousedown', {}, undefined, (e: Event) => this.handlerMousedownCropArea(e)).subscribe((e: Event) => this.handlerMousemove(e));\n }\n\n private initEvent(element: ElementRef, eventName: string, flag: { callStopPropagation?: boolean; callPreventDefault?: boolean }, obsMerge?: Observable<Event>, callback?: (e: Event) => void): Observable<Event> {\n const obs = fromEvent<Event>(element.nativeElement, eventName).pipe(\n tap((e: Event) => {\n if (flag.callStopPropagation && e?.stopPropagation) {\n e.stopPropagation();\n }\n if (flag.callPreventDefault && e?.preventDefault) {\n e.preventDefault();\n }\n if (callback) {\n callback(e);\n }\n }),\n takeUntilDestroyed(this.destroyRef)\n );\n\n if (obsMerge) {\n return obs.pipe(\n mergeMap(() => obsMerge),\n takeUntilDestroyed(this.destroyRef)\n );\n }\n\n return obs;\n }\n\n private updateOriginImageSize() {\n let width = this.originWidth();\n let height = this.originHeight();\n const ratio = width / height;\n\n if (width >= height) {\n width = Math.min(this.containerWidth(), width);\n height = Math.min(width / ratio, this.containerHeight());\n width = height * ratio;\n } else {\n height = Math.min(this.containerHeight(), height);\n width = height * ratio;\n }\n this.setImagePosition(width, height);\n this.updateCropAreaPos();\n this.updateRectClipPos();\n }\n\n private setImagePosition(width: number, height: number) {\n const left = this.containerWidth() / 2 - width / 2;\n const top = this.containerHeight() / 2 - height / 2;\n const styles = { width, height, top, left, display: 'block' };\n\n this.setStylesElements(this.imageOrigin(), styles);\n this.setStylesElements(this.imageClip(), styles);\n this.setCirclePosition(styles);\n }\n\n private setCirclePosition(styles: IStyles) {\n this.setStylesElements(this.circleTL(), { top: (styles.top || 0) - 5, left: (styles.left || 0) - 5 });\n this.setStylesElements(this.circleTR(), { top: (styles.top || 0) - 5, left: (styles.left || 0) + (styles.width || 0) - 10 });\n this.setStylesElements(this.circleBL(), { top: (styles.top || 0) + (styles.height || 0) - 10, left: (styles.left || 0) - 5 });\n this.setStylesElements(this.circleBR(), { top: (styles.top || 0) + (styles.height || 0) - 10, left: (styles.left || 0) + (styles.width || 0) - 10 });\n }\n\n private updateCropAreaPos() {\n const [imgTop, imgLeft, imgWidth, imgHeight] = getStylesOfElement<number>(this.imageClip().nativeElement, ['style.top', 'style.left', 'offsetWidth', 'offsetHeight']);\n\n const rectImg: IBoundingClientRect = {\n top: Math.max(0, imgTop),\n left: Math.max(0, imgLeft),\n width: imgWidth,\n height: imgHeight,\n };\n\n rectImg.width = Math.min(imgWidth, this.containerWidth() - imgLeft);\n if (imgLeft < 0) {\n rectImg.width = Math.min(imgWidth + imgLeft, this.containerWidth());\n }\n rectImg.height = Math.min(imgHeight, this.containerHeight() - imgTop);\n if (imgTop < 0) {\n rectImg.height = Math.min(imgTop + imgHeight, this.containerHeight());\n }\n this.ratioValue.set(this.getCropRatioValue());\n if (!this.ratioValue()) {\n this.setStylesElements(this.cropArea(), rectImg);\n\n return;\n }\n let width = rectImg.width;\n let height = width / this.ratioValue();\n\n width = Math.min(rectImg.width, width);\n height = width / this.ratioValue();\n height = Math.min(rectImg.height, height);\n width = height * this.ratioValue();\n const top = rectImg.top + (rectImg.height - height) / 2;\n const left = rectImg.left + (rectImg.width - width) / 2;\n\n this.setStylesElements(this.cropArea(), { width, height, top, left });\n }\n\n private getCropRatioValue() {\n const cropRatio = this.cropRatioItems().find((item) => item.key === this.cropRatioItemSelected());\n\n if (!cropRatio?.value) {\n return this.aspectRatio()?.value || this.originWidth() / this.originHeight();\n }\n\n return cropRatio.value;\n }\n\n private updateRectClipPos() {\n const reactClip = this.getRectClipImage();\n\n this.imageClip().nativeElement.style.clip = `rect(${reactClip.top}px, ${reactClip.right}px, ${reactClip.bottom}px, ${reactClip.left}px)`;\n }\n\n private getRectClipImage() {\n const imageRect = this.imageClip().nativeElement.getBoundingClientRect();\n if (!imageRect.width) {\n return this.rectClip();\n }\n const cropRect = this.cropArea().nativeElement.getBoundingClientRect();\n const width = Math.round(cropRect.width);\n const height = Math.round(cropRect.height);\n const left = cropRect.left - imageRect.left;\n const top = cropRect.top - imageRect.top;\n const right = Math.round(left + width);\n const bottom = Math.round(top + height);\n const ratio = this.originWidth() / imageRect.width;\n\n this.rectClip.set({ left, top, right, bottom, width, height });\n this.cropSize.set({\n height: top >= 0 ? Math.round((bottom - top) * ratio) : Math.floor((bottom - top) * ratio),\n width: top >= 0 ? Math.round((right - left) * (this.ratioValue() ?? 1) * ratio) : Math.floor((right - left) * (this.ratioValue() ?? 1) * ratio),\n });\n\n return this.rectClip();\n }\n\n private handlerMousemove(e: any) {\n const typeState = ['BL', 'TL', 'TR', 'BR', 'VL', 'VR', 'HT', 'HB'];\n const methodName = `resizeCropFollow${this.resizeState()}Dir`; // resizeCropFollowBLDir, resizeCropFollowTLDir, resizeCropFollowTRDir, resizeCropFollowBRDir, resizeCropFollowVLDir, resizeCropFollowVRDir, resizeCropFollowHTDir, resizeCropFollowHBDir\n\n if (typeState.includes(this.resizeState())) {\n (this as any)[methodName](e);\n }\n switch (this.moveState()) {\n case 'clip':\n this.moveClipArea(e);\n break;\n\n case 'image':\n this.moveImage(e);\n break;\n }\n this.changedImage(true);\n }\n\n protected resizeCropFollowBLDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? -momentY * this.ratioValue() : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().imageTop + this.startMouseDim().imageHeight - this.startMouseDim().top;\n const maxWidth = this.startMouseDim().left + this.startMouseDim().width - this.startMouseDim().imageLeft;\n let { width, height, left } = this.getRectResizeCropFollow({ width: -1, height: 1, left: 1, top: 0 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n this.setStylesElements(this.cropArea(), { left, height, width }, true);\n };\n\n protected resizeCropFollowTLDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? this.ratioValue() * momentY : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().left + this.startMouseDim().width - this.startMouseDim().imageLeft;\n let { width, height, top, left } = this.getRectResizeCropFollow({ width: -1, height: -1, left: 1, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, left, height, width }, true);\n };\n\n protected resizeCropFollowTRDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? -momentY * this.ratioValue() : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().imageLeft + this.startMouseDim().imageWidth - this.startMouseDim().left;\n let { width, height, top } = this.getRectResizeCropFollow({ width: 1, height: -1, left: 0, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, height, width }, true);\n };\n\n protected resizeCropFollowBRDir(e: IEvent) {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? momentY * this.ratioValue() : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().imageTop + this.startMouseDim().imageHeight - this.startMouseDim().top;\n const maxWidth = this.startMouseDim().imageLeft + this.startMouseDim().imageWidth - this.startMouseDim().left;\n let { width, height } = this.getRectResizeCropFollow({ width: 1, height: 1, left: 0, top: 0 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n this.setStylesElements(this.cropArea(), { height, width }, true);\n }\n\n protected resizeCropFollowVLDir = (e: IEvent) => {\n const momentX = e.clientX - this.startMouseDim().clientX;\n const momentY = this.ratioValue() ? momentX / this.ratioValue() : 0;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().left + this.startMouseDim().width - this.startMouseDim().imageLeft;\n let { width, height, top, left } = this.getRectResizeCropFollow({ width: -1, height: -1, left: 1, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, left, height, width }, true);\n };\n\n protected resizeCropFollowVRDir = (e: IEvent) => {\n const momentX = e.clientX - this.startMouseDim().clientX;\n const momentY = this.ratioValue() ? -momentX / this.ratioValue() : 0;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().imageLeft + this.startMouseDim().imageWidth - this.startMouseDim().left;\n let { width, height, top } = this.getRectResizeCropFollow({ width: 1, height: -1, left: 0, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, height, width }, true);\n };\n\n protected resizeCropFollowHTDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? momentY * this.ratioValue() : 0;\n const maxWidth = this.startMouseDim().width + this.startMouseDim().left - this.startMouseDim().imageLeft;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n let { width, height, top, left } = this.getRectResizeCropFollow({ width: -1, height: -1, left: 1, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n this.setStylesElements(this.cropArea(), { top, left, height, width }, true);\n };\n\n protected resizeCropFollowHBDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? momentY * this.ratioValue() : 0;\n const maxHeight = this.startMouseDim().imageTop + this.startMouseDim().imageHeight - this.startMouseDim().top;\n const maxWidth = this.startMouseDim().width + this.startMouseDim().left - this.startMouseDim().imageLeft;\n let { width, height, left } = this.getRectResizeCropFollow({ width: 1, height: 1, left: -1, top: 0 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n this.setStylesElements(this.cropArea(), { height, left, width }, true);\n };\n\n private getRectResizeCropFollow(ratio: { width: number; height: number; top: number; left: number }, momentX: number, momentY: number) {\n const width = this.startMouseDim().width + momentX * ratio.width;\n const height = this.startMouseDim().height + momentY * ratio.height;\n const top = this.startMouseDim().top + momentY * ratio.top;\n const left = this.startMouseDim().left + momentX * ratio.left;\n\n return { width, height, left, top };\n }\n\n private handlerMouseup() {\n this.imageContainer().nativeElement.classList.remove('cursor-grabbing');\n this.cropArea().nativeElement.classList.remove('cursor-grabbing');\n this.resizeState.set('none');\n this.moveState.set('none');\n }\n\n private handlerMousewheel(event: any) {\n if (!this.hasZoom()) {\n return;\n }\n if (event.deltaY < 0) {\n this.zoomImage(1 / 1.1);\n\n return;\n }\n this.zoomImage(1.1);\n }\n\n private handlerImageContainerMousedown(e: any) {\n if (this.resizeState() === 'none' && this.moveState() === 'none') {\n this.moveState.set('image');\n this.handlerMousedown(e);\n }\n\n return false;\n }\n\n private handlerCropResize(e: any, resizeType: TYPE_RESIZE_STATE) {\n this.resizeState.set(resizeType);\n this.dragGridCrop.set(true);\n this.handlerMousedown(e);\n }\n\n private handlerMousedownCropArea(e: any) {\n this.moveState.set('clip');\n this.handlerMousedown(e);\n }\n\n private handlerMousedown(e: IEvent) {\n const [width, height, top, left] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const [imageWidth, imageHeight, imageTop, imageLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n switch (this.moveState()) {\n case 'image':\n this.imageContainer().nativeElement.classList.add('cursor-grabbing');\n break;\n case 'clip':\n if (width === imageWidth && height === imageHeight) {\n return;\n }\n this.cropArea().nativeElement.classList.add('cursor-grabbing');\n break;\n\n default:\n break;\n }\n\n this.startMouseDim.set({\n clientX: e.clientX,\n clientY: e.clientY,\n width: width,\n height: height,\n top: top,\n left: left,\n imageTop: imageTop,\n imageLeft: imageLeft,\n imageWidth: imageWidth,\n imageHeight: imageHeight,\n });\n this.ratioValue.set(this.getCropRatioValue());\n }\n\n private moveImage(e: IEvent) {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = e.clientX - this.startMouseDim().clientX;\n const imgTop = this.startMouseDim().imageTop + momentY;\n const imgLeft = this.startMouseDim().imageLeft + momentX;\n const top = this.startMouseDim().top + momentY;\n const left = this.startMouseDim().left + momentX;\n\n this.setStylesElements(this.imageOrigin(), { top: imgTop, left: imgLeft });\n this.setStylesElements(this.imageClip(), { top: imgTop, left: imgLeft });\n this.setStylesElements(this.cropArea(), { top, left });\n this.setCirclePosition({ top: imgTop, left: imgLeft, width: this.startMouseDim().imageWidth, height: this.startMouseDim().imageHeight });\n }\n\n private moveClipArea(e: IEvent) {\n const [imgWidth, imgHeight, imgTop, imgLeft] = getStylesOfElement<number>(this.imageClip().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const [cropWidth, cropHeight] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight']);\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = e.clientX - this.startMouseDim().clientX;\n let top = Math.max(imgTop, this.startMouseDim().top + momentY);\n let left = Math.max(imgLeft, this.startMouseDim().left + momentX);\n\n top = Math.min(top, imgTop + imgHeight - cropHeight);\n left = Math.min(left, imgLeft + imgWidth - cropWidth);\n\n this.setStylesElements(this.cropArea(), { top, left }, true);\n }\n\n private zoomImage(scale: number) {\n const [currWidth, currHeight, currTop, currLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const width = Math.max(currWidth * scale, 50);\n const height = (this.imageOrigin().nativeElement.offsetHeight * width) / this.imageOrigin().nativeElement.offsetWidth;\n\n // Calculate the center point of the current view\n const centerX = currLeft + currWidth / 2;\n const centerY = currTop + currHeight / 2;\n\n // Calculate new position to maintain center point\n const top = centerY - height / 2;\n const left = centerX - width / 2;\n\n // Get current crop area dimensions and position\n let [cropWidth, cropHeight] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight']);\n const [cropTop, cropLeft] = getStylesOfElement<number>(this.cropArea().nativeElement, ['style.top', 'style.left']);\n\n // Scale crop area dimensions proportionally\n cropWidth = cropWidth * scale;\n cropHeight = cropHeight * scale;\n\n // Calculate new crop area position relative to the image\n const cropTopNew = top + (cropTop - currTop) * scale;\n const cropLeftNew = left + (cropLeft - currLeft) * scale;\n\n // Ensure crop area stays within bounds\n const maxCropWidth = width;\n const maxCropHeight = height;\n const minWidth = 20;\n const minHeight = 20;\n\n cropWidth = Math.min(cropWidth, maxCropWidth);\n cropHeight = Math.min(cropHeight, maxCropHeight);\n cropWidth = Math.max(cropWidth, minWidth);\n cropHeight = Math.max(cropHeight, minHeight);\n\n this.ratioValue.set(this.getCropRatioValue());\n if (this.ratioValue()) {\n cropHeight = cropWidth / this.ratioValue();\n cropHeight = Math.min(cropHeight, maxCropHeight);\n cropHeight = Math.max(cropHeight, minHeight);\n cropWidth = cropHeight * this.ratioValue();\n }\n\n // Update clipping rectangle\n this.rectClip.update((rect) => {\n const rectTop = cropTopNew - top;\n const rectLeft = cropLeftNew - left;\n return {\n ...rect,\n top: rectTop,\n left: rectLeft,\n right: rectLeft + cropWidth,\n bottom: rectTop + cropHeight,\n };\n });\n\n const clip = `rect(${this.rectClip().top}px, ${this.rectClip().right}px, ${this.rectClip().bottom}px, ${this.rectClip().left}px)`;\n\n // Update all elements with new positions and dimensions\n this.setStylesElements(this.cropArea(), { top: cropTopNew, left: cropLeftNew, width: cropWidth, height: cropHeight });\n this.setStylesElements(this.imageOrigin(), { top, left, width, height });\n this.setCirclePosition({ top, left, width, height });\n this.setStylesElements(this.imageClip(), { clip, top, left, width, height });\n this.getRectClipImage();\n }\n\n protected handlerRotateImage(event: Event) {\n event.stopPropagation();\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n const [width, height] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight']);\n const originWidth = this.image.width;\n const originHeight = this.image.height;\n let top = parseInt(this.imageOrigin().nativeElement.style.top);\n let left = parseInt(this.imageOrigin().nativeElement.style.left);\n let newHeight = width;\n let newWidth = height;\n const ratio = newWidth / newHeight;\n\n canvas.height = originWidth;\n canvas.width = originHeight;\n ctx?.translate(originHeight / 2, originWidth / 2);\n ctx?.rotate(Math.PI / 2);\n ctx?.drawImage(this.image, -originWidth / 2, -originHeight / 2);\n const src = getDataUrl(canvas, this.mimetype(), this.image.src);\n\n this.imgSrc.set(src);\n newWidth = Math.max(newWidth, originHeight);\n newWidth = Math.min(newWidth, this.containerWidth());\n newHeight = newWidth / ratio;\n newHeight = Math.max(newHeight, originWidth);\n newHeight = Math.min(newHeight, this.containerHeight());\n newWidth = newHeight * ratio;\n top = top - (newHeight / 2 - height / 2);\n left = left - (newWidth / 2 - width / 2);\n this.setStylesElements(this.imageOrigin(), { src, top, left, width: newWidth, height: newHeight });\n this.setCirclePosition({ top, left, width: newWidth, height: newHeight });\n this.setStylesElements(this.imageClip(), { src, top, left, width: newWidth, height: newHeight });\n this.getOriginalImageSize(() => {\n this.cropSize.set({ width: this.originWidth(), height: this.originHeight() });\n this.updateOriginImageSize();\n });\n this.changedImage(true);\n };\n }\n\n protected getOriginalImageSize(callback?: () => void) {\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n this.originWidth.set(this.image.width);\n this.originHeight.set(this.image.height);\n if (callback) {\n return callback();\n }\n };\n }\n\n protected changedImage(status: boolean) {\n this.changed.set(status);\n }\n\n protected handlerFlipImage(event: Event, mode: 'horizontal' | 'vertical') {\n event.stopPropagation();\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const width = this.image.width;\n const height = this.image.height;\n\n canvas.height = height;\n canvas.width = width;\n if (ctx) {\n ctx.drawImage(this.image, 0, 0, width, height);\n if (mode === 'horizontal') {\n ctx.translate(width, 0);\n ctx.scale(-1, 1);\n }\n if (mode === 'vertical') {\n ctx.translate(0, height);\n ctx.scale(1, -1);\n }\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(this.image, 0, 0);\n }\n const dataUrl = getDataUrl(canvas, this.mimetype(), this.image.src);\n\n this.imgSrc.set(dataUrl);\n this.imageOrigin().nativeElement.src = dataUrl;\n this.imageClip().nativeElement.src = dataUrl;\n this.updateCropAreaPos();\n this.updateRectClipPos();\n this.changedImage(true);\n };\n }\n\n protected handlerRestoreImage(event: Event) {\n event.stopPropagation();\n this.imgSrc.set(this.dataUrlOrigin());\n this.dragGridCrop.set(false);\n this.getOriginalImageSize(() => {\n this.updateOriginImageSize();\n this.changedImage(false);\n this.cropRatioItemSelected.set('');\n this.updateCropAreaPos();\n this.updateRectClipPos();\n });\n }\n\n private cropImage(): Promise<string> {\n return new Promise((resolve) => {\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n const originWidth = this.image.width;\n const width = parseInt(this.imageClip().nativeElement.offsetWidth);\n const height = parseInt(this.imageClip().nativeElement.offsetHeight);\n const scale = originWidth / width;\n const rectClip = this.getRectClipImage();\n const cropRect = getCropRectImage(rectClip, width, height, scale);\n\n canvas.height = cropRect.height;\n canvas.width = cropRect.width;\n this.originHeight.set(canvas.height);\n this.originWidth.set(canvas.width);\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(this.image, cropRect.left, cropRect.top, cropRect.width, cropRect.height, 0, 0, cropRect.width, cropRect.height);\n }\n const dataUrl = getDataUrl(canvas, this.mimetype(), this.image.src);\n\n this.changedImage(true);\n resolve(dataUrl);\n };\n });\n }\n\n protected async handlerSaveFile(event: Event, modeSave: TYPE_MODE_SAVE) {\n event.stopPropagation();\n const dataUrl = await this.cropImage();\n const file = convertBase64ToBlob(dataUrl);\n\n this.outSaveFile.emit({ file: file, url: dataUrl, mode: modeSave });\n }\n\n protected async handlerClose(event: Event): Promise<void> {\n event.stopPropagation();\n this.outClose.emit({ isClickButtonClose: true });\n }\n\n protected handlerSelectCropRatioItem(event: Event, key: string) {\n event.stopPropagation();\n this.cropRatioItemSelected.set(key);\n this.changed.set(true);\n this.dragGridCrop.set(true);\n this.updateOriginImageSize();\n }\n\n protected handlerResize(event: Event) {\n event.stopPropagation();\n if (this.resizeComponentRef) {\n return;\n }\n this.resizeComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsImageEditorResizeComponent);\n const instance = this.resizeComponentRef.instance;\n const subs = instance.outClose.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.dynamicComponentService.remove(this.resizeComponentRef);\n this.resizeComponentRef = undefined;\n subs.unsubscribe();\n });\n\n instance.src = this.imgSrc();\n instance.mimetype = this.mimetype();\n instance.zIndex = this.zIndex();\n subs.add(\n instance.outSave.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n this.resizeData.set(event);\n this.saveResize();\n })\n );\n instance.resizeData = { ratio: 100, width: this.originWidth(), height: this.originHeight() };\n instance.originWidth = this.originWidth();\n instance.originHeight = this.originHeight();\n this.dynamicComponentService.addToBody(this.resizeComponentRef);\n }\n\n protected saveResize() {\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n\n canvas.width = this.resizeData().width;\n canvas.height = this.resizeData().height;\n const ctx = canvas.getContext('2d');\n\n if (ctx) {\n ctx.drawImage(this.image, 0, 0, canvas.width, canvas.height);\n }\n const src = getDataUrl(canvas, this.mimetype(), this.image.src);\n const [currWidth, currHeight, currTop, currLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const ratio = currWidth / currHeight;\n let newWidth = Math.min(this.resizeData().width, this.containerWidth());\n let newHeight = newWidth / ratio;\n\n newHeight = Math.min(this.resizeData().height, this.containerHeight());\n newWidth = newHeight * ratio;\n Math.min(this.resizeData().height, this.containerHeight());\n const top = currTop + (currHeight - newHeight) / 2;\n const left = currLeft + (currWidth - newWidth) / 2;\n const movementY = currTop - top;\n const movementX = currLeft - left;\n\n this.rectClip.update((rect) => {\n const rectTop = rect.top + movementY;\n const rectLeft = rect.left + movementX;\n return {\n ...rect,\n top: rectTop,\n left: rectLeft,\n right: rectLeft + newWidth,\n bottom: rectTop + newHeight,\n };\n });\n const clip = `rect(${this.rectClip().top}px, ${this.rectClip().right}px, ${this.rectClip().bottom}px, ${this.rectClip().left}px)`;\n\n this.setStylesElements(this.imageOrigin(), { src, top, left, width: newWidth, height: newHeight });\n this.setCirclePosition({ top, left, width: newWidth, height: newHeight });\n this.setStylesElements(this.imageClip(), { src, clip, top, left, width: newWidth, height: newHeight });\n this.imgSrc.set(src);\n this.originWidth.set(this.resizeData().width);\n this.originHeight.set(this.resizeData().height);\n this.updateCropAreaPos();\n this.updateRectClipPos();\n this.changedImage(true);\n };\n }\n\n protected handlerCropWidth() {\n this.processCropWidthOrHeight('width');\n }\n\n protected handlerCropHeight() {\n this.processCropWidthOrHeight('height');\n }\n\n private processCropWidthOrHeight(cropBy: 'width' | 'height') {\n this.ratioValue.set(this.getCropRatioValue());\n const [currImgWidth, currImgHeight, currImgTop, currImgLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n let [cropWidth, cropHeight] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight']);\n const [cropTop, cropLeft] = getStylesOfElement<number>(this.cropArea().nativeElement, ['style.top', 'style.left']);\n const maxCropWidth = currImgLeft + currImgWidth - cropLeft;\n const maxCropHeight = currImgHeight + currImgTop - cropTop;\n const ratio = this.originWidth() / currImgWidth;\n let cropValue = get(this.cropSize, cropBy) / ratio;\n\n cropValue = Math.min(cropValue, cropBy === 'width' ? maxCropWidth : maxCropHeight);\n cropValue = Math.max(1, cropValue);\n if (this.ratioValue()) {\n if (cropBy === 'width') {\n cropHeight = cropValue / this.ratioValue();\n cropHeight = Math.min(cropHeight, maxCropHeight);\n cropValue = cropHeight * this.ratioValue();\n this.cropSize.update((cropSize) => ({ ...cropSize, height: Math.round(cropHeight * ratio) }));\n this.cropArea().nativeElement.style.height = `${cropHeight}px`;\n }\n if (cropBy === 'height') {\n cropWidth = cropValue * this.ratioValue();\n cropWidth = Math.min(cropWidth, maxCropWidth);\n cropValue = cropWidth / this.ratioValue();\n this.cropSize.update((cropSize) => ({ ...cropSize, width: Math.round(cropWidth * ratio) }));\n this.cropArea().nativeElement.style.width = `${cropWidth}px`;\n }\n }\n this.cropSize.update((cropSize) => ({ ...cropSize, [cropBy]: Math.round(cropValue * ratio) }));\n this.cropArea().nativeElement.style[cropBy] = `${cropValue}px`;\n const imageRect = this.imageClip().nativeElement.getBoundingClientRect();\n const cropRect = this.cropArea().nativeElement.getBoundingClientRect();\n const { width, height } = cropRect;\n const left = cropRect.left - imageRect.left;\n const top = cropRect.top - imageRect.top;\n const right = left + width;\n const bottom = top + height;\n\n this.imageClip().nativeElement.style.clip = `rect(${top}px, ${right}px, ${bottom}px, ${left}px)`;\n }\n\n private setStylesElements(element: ElementRef, styles: IStyles, isUpdateRectClipPos?: boolean) {\n Object.keys(styles).forEach((key) => {\n const value = get(styles, key as keyof IStyles);\n if (isNil(value)) {\n return;\n }\n set(element.nativeElement.style, key, typeof value === 'number' ? `${value}px` : value);\n });\n if (isUpdateRectClipPos) {\n this.updateRectClipPos();\n }\n }\n\n ngOnDestroy(): void {\n this.dynamicComponentService.remove(this.resizeComponentRef);\n }\n}\n","<libs_ui-components-modal\n [width]=\"'calc(100vw - 400px)'\"\n [height]=\"'calc(100vh - 100px)'\"\n [minWidth]=\"'1200px'\"\n [headerConfig]=\"{ ignoreHeaderTheme: true, removeButtonClose: true }\"\n [bodyConfig]=\"{ classInclude: '!p-0', scrollOverlayOptions: { scrollX: 'hidden', scrollY: 'hidden' } }\"\n [footerConfig]=\"{ hidden: true }\"\n [zIndex]=\"zIndex()\"\n [buttonsFooter]=\"[]\"\n [mode]=\"'center'\">\n <div class=\"libs-ui-modal-header-custom w-full flex items-center justify-between\">\n <div class=\"w-full relative mx-[24px] h-[16px]\">\n <div class=\"flex w-full libs-ui-font-h4s absolute\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ 'i18n_edit_file_name' | translate: { file_name: nameFile() } }}\n </libs_ui-components-popover>\n </div>\n </div>\n <div class=\"flex items-center\">\n @if (modeShowButton() === 'save-file') {\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [label]=\"'i18n_cancel'\"\n [disable]=\"loading() || loadingImage()\"\n [classInclude]=\"'py-[6px] px-[12px] mr-[16px]'\"\n (outClick)=\"handlerClose($event)\" />\n\n <libs_ui-components-buttons-button\n class=\"mr-[24px]\"\n [label]=\"'i18n_save'\"\n [disable]=\"loading() || loadingImage()\"\n [classInclude]=\"'py-[6px] px-[12px]'\"\n (outClick)=\"handlerSaveFile($event, 'save-file')\" />\n } @else {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_save_to_new_file'\"\n [type]=\"'button-outline'\"\n [classInclude]=\"'mx-[16px] py-[6px] px-[12px]'\"\n [disable]=\"loading() || loadingImage() || !changed()\"\n (outClick)=\"handlerSaveFile($event, 'save-api-as-new-file')\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [label]=\"'i18n_save'\"\n [classInclude]=\"'py-[6px] px-[12px]'\"\n [disable]=\"loading() || loadingImage() || !changed()\"\n (outClick)=\"handlerSaveFile($event, 'save-api')\" />\n <div class=\"h-[12px] libs-ui-border-left-general mx-[16px]\"></div>\n <libs_ui-components-buttons-button\n class=\"mr-[24px]\"\n [classInclude]=\"'p-[6px]'\"\n [type]=\"'button-third-hover-danger'\"\n [iconOnlyType]=\"true\"\n [disable]=\"loading()\"\n [popover]=\"{ config: { content: 'i18n_exit_edit_mode', zIndex: zIndex() } }\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClose($event)\" />\n }\n </div>\n </div>\n <div class=\"libs-ui-modal-body-custom h-full w-full flex\">\n <div\n #imageEditorContainer\n class=\"relative w-full h-full bg-[#e6e7ea] border-radius-bottom-left-8px p-[32px] libs-ui-input-image-editor-container-left\">\n @if (loadingImage()) {\n <div class=\"absolute h-full w-full bg-[#e6e7ea] top-0 left-0 z-[5]\">\n <libs_ui-components-spinner [size]=\"'medium'\" />\n </div>\n }\n <div class=\"absolute h-[32px] w-[calc(100%-64px)] bg-[#e6e7eab8] top-0 left-[32px] z-[1]\"></div>\n <div class=\"absolute w-[32px] h-full bg-[#e6e7eab8] left-0 top-0 z-[1] rounded-bl-[8px]\"></div>\n <div class=\"absolute w-[32px] h-full bg-[#e6e7eab8] right-0 top-0 z-[1]\"></div>\n <div class=\"absolute h-[32px] w-[calc(100%-64px)] bg-[#e6e7eab8] bottom-0 left-[32px] z-[1]\"></div>\n <div\n #imageContainer\n class=\"relative w-full h-full rounded-bl-[8px] min-h-0\">\n <div\n #circleTL\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <div\n #circleTR\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <div\n #circleBL\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <div\n #circleBR\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <img\n #imageOrigin\n class=\"absolute border-[4px] border-[#8e61ee] rounded-[4px] top-[-1000px] left-[-1000px]\"\n loading=\"lazy\"\n [src]=\"imgSrc()\"\n (load)=\"handlerImageLoaded()\"\n (error)=\"handlerImageError($event)\" />\n <img\n #imageClip\n class=\"absolute z-[1] top-[-1000px] left-[-1000px]\"\n loading=\"lazy\"\n [src]=\"imgSrc()\"\n (error)=\"handlerImageError($event)\" />\n <div class=\"absolute top-0 left-0 right-0 bottom-0 bg-[#e6e7eab8]\"></div>\n <div\n #cropArea\n class=\"absolute z-[2] border-[4px] border-[#8e61ee] rounded-[4px]\">\n <div class=\"relative w-full h-full\">\n <div\n #cropTL\n class=\"absolute z-[2] left-[-18px] top-[-17px] cursor-nwse-resize\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropBL\n class=\"absolute z-[2] left-[-17px] bottom-[-18px] cursor-nesw-resize rotate-[270deg]\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropTR\n class=\"absolute z-[2] right-[-17px] top-[-17px] cursor-nesw-resize rotate-[90deg]\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropBR\n class=\"absolute z-[2] right-[-18px] bottom-[-17px] cursor-nwse-resize rotate-[180deg]\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropLineVL\n class=\"absolute z-[1] w-[12px] left-[-6px] top-0 bottom-0 cursor-ew-resize\"></div>\n <div\n #cropLineVR\n class=\"absolute z-[1] w-[12px] right-[-6px] top-0 bottom-0 cursor-ew-resize\"></div>\n <div\n #cropLineHT\n class=\"absolute z-[1] h-[12px] left-0 top-[-6px] right-0 cursor-ns-resize\"></div>\n <div\n #cropLineHB\n class=\"absolute z-[1] h-[12px] left-0 right-0 bottom-[-6px] cursor-ns-resize\"></div>\n\n <div class=\"bg-white absolute h-[1px] top-0 left-0 right-0\"></div>\n <div class=\"bg-white absolute h-[1px] bottom-0 left-0 right-0\"></div>\n <div class=\"bg-white absolute w-[1px] top-0 left-0 bottom-0\"></div>\n <div class=\"bg-white absolute w-[1px] top-0 bottom-0 right-0\"></div>\n <div class=\"bg-white absolute h-[2px] top-[33%] left-0 right-0\"></div>\n <div class=\"bg-white absolute h-[2px] top-[66%] left-0 right-0\"></div>\n <div class=\"bg-white absolute w-[2px] top-0 bottom-0 left-[33%]\"></div>\n <div class=\"bg-white absolute w-[2px] top-0 bottom-0 left-[66%]\"></div>\n </div>\n </div>\n </div>\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n <div class=\"w-[320px] shrink-0 p-[16px] bg-[#ffffff] rounded-br-[8px] z-[2] libs-ui-input-image-editor-container-right\">\n <div class=\"flex items-center justify-between mb-[16px]\">\n <div class=\"libs-ui-font-h4m\">{{ 'i18n_cutting_ratio' | translate }}</div>\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [type]=\"'button-third'\"\n [classIconLeft]=\"'libs-ui-icon-refresh'\"\n [classInclude]=\"'p-[6px] mr-[8px]'\"\n [popover]=\"{ config: { content: 'i18n_restore_the_original_state', zIndex: zIndex() } }\"\n [disable]=\"loading() || loadingImage() || !changed()\"\n (outClick)=\"handlerRestoreImage($event)\" />\n </div>\n <div class=\"mb-[16px] libs-ui-image-editor-edit-display-grid-gap-16\">\n @for (item of cropRatioItems(); track item.key) {\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage() || requiredCropFollowRatio()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"item.icon + ' !text-[20px]'\"\n [isActive]=\"item.key === cropRatioItemSelected()\"\n (outClick)=\"handlerSelectCropRatioItem($event, item.key)\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ (item.key === 'free' ? 'i18n_custom' : item.key) | translate }}\n </div>\n </div>\n }\n </div>\n <div class=\"mb-[16px] flex\">\n <libs_ui-components-inputs-valid\n class=\"mr-[16px]\"\n [dataType]=\"'int'\"\n [labelConfig]=\"{ labelLeft: 'i18n_width', classInclude: 'mb-[4px]', labelLeftClass: 'libs-ui-font-h7r' }\"\n [fieldNameBind]=\"'width'\"\n [(item)]=\"cropSize\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"originWidth()\"\n [disable]=\"loading() || loadingImage()\"\n (outValueChange)=\"handlerCropWidth()\" />\n <libs_ui-components-inputs-valid\n [dataType]=\"'int'\"\n [labelConfig]=\"{ labelLeft: 'i18n_length', classInclude: 'mb-[4px]', labelLeftClass: 'libs-ui-font-h7r' }\"\n [fieldNameBind]=\"'height'\"\n [(item)]=\"cropSize\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"originHeight()\"\n [disable]=\"loading() || loadingImage()\"\n (outValueChange)=\"handlerCropHeight()\" />\n </div>\n <div class=\"libs-ui-font-h4m mb-[16px]\">{{ 'i18n_rotate_photos' | translate }}</div>\n <div class=\"flex libs-ui-image-editor-edit-display-grid-gap-16\">\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-rotate-image-outline !text-[20px]'\"\n (outClick)=\"handlerRotateImage($event)\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_rotate_ninety_degrees' | translate }}\n </div>\n </div>\n\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-flip-vertical !text-[20px]'\"\n (outClick)=\"handlerFlipImage($event, 'vertical')\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_vertical_flip' | translate }}\n </div>\n </div>\n\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-flip-horizontal !text-[20px]'\"\n (outClick)=\"handlerFlipImage($event, 'horizontal')\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_horizontal_flip' | translate }}\n </div>\n </div>\n\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-scale !text-[20px]'\"\n (outClick)=\"handlerResize($event)\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_resize' | translate }}\n </div>\n </div>\n </div>\n </div>\n </div>\n</libs_ui-components-modal>\n\n<ng-template #svgArrow>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 40 40\"\n fill=\"none\">\n <path\n d=\"M33.6987 14.6969L18.3309 14.6969C16.516 14.6969 15.0311 16.1818 15.0311 17.9967L15.0311 33.3645\"\n stroke=\"white\"\n stroke-width=\"5.83333\"\n stroke-miterlimit=\"10\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n</ng-template>\n\n<ng-template #svgCircle>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"15\"\n height=\"15\"\n viewBox=\"0 0 15 15\"\n fill=\"none\">\n <circle\n cx=\"7.5\"\n cy=\"7.5\"\n r=\"7.5\"\n fill=\"white\" />\n </svg>\n</ng-template>\n","import { Component, ElementRef, ViewChild } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsImageEditorComponent } from '../image-editor.component';\nimport { ISaveFile } from '../interfaces/image-editor.interface';\nimport { IImageEditorFunctionControlEvent } from '../interfaces/function-control-event.interface';\n\n@Component({\n selector: 'lib-image-editor-demo',\n standalone: true,\n imports: [LibsUiComponentsButtonsButtonComponent, LibsUiComponentsImageEditorComponent],\n templateUrl: './image-editor-demo.component.html',\n styleUrl: './image-editor-demo.component.scss',\n})\nexport class LibsUiComponentsImageEditorDemoComponent {\n @ViewChild('imageFileInput') imageFileInput!: ElementRef<HTMLInputElement>;\n\n imageSource = '';\n showEditor = false;\n editedImageUrl = '';\n selectedFile: File | null = null;\n imageName = '';\n\n // Documentation data as regular properties\n inputsDoc = [\n { name: 'imgSrc', type: 'string', default: 'Bắt buộc', description: 'Đường dẫn hoặc base64 của hình ảnh cần chỉnh sửa' },\n { name: 'originUrl', type: 'string', default: '-', description: 'URL gốc của hình ảnh' },\n { name: 'nameFile', type: 'string', default: '-', description: 'Tên file khi lưu' },\n { name: 'modeShowButton', type: \"'save-file' | 'save-api'\", default: \"'save-file'\", description: 'Chế độ nút lưu' },\n { name: 'mimetype', type: 'string', default: '-', description: 'Định dạng của hình ảnh' },\n { name: 'zIndex', type: 'number', default: '1200', description: 'z-index của component' },\n { name: 'hasZoom', type: 'boolean', default: 'false', description: 'Cho phép phóng to/thu nhỏ hình ảnh' },\n { name: 'aspectRatio', type: 'IAspectRatio', default: '-', description: 'Tỷ lệ khung hình mặc định' },\n { name: 'requiredCropFollowRatio', type: 'boolean', default: 'false', description: 'Bắt buộc cắt theo tỷ lệ đã chọn' },\n ];\n\n outputsDoc = [\n { name: 'outClose', type: '{isClickButtonClose: boolean}', description: 'Sự kiện khi đóng trình chỉnh sửa' },\n { name: 'outSaveFile', type: 'ISaveFile', description: 'Sự kiện khi lưu file' },\n { name: 'outFunctionsControl', type: 'IImageEditorFunctionControlEvent', description: 'Sự kiện để kiểm soát các chức năng' },\n ];\n\n interfacesDoc = [\n {\n name: 'ISaveFile',\n code: \"export interface ISaveFile {\\n file: Blob;\\n url: string;\\n mode: 'save-file' | 'save-api' | 'save-api-as-new-file';\\n}\",\n description: 'Interface định nghĩa dữ liệu khi lưu file.',\n },\n {\n name: 'IImageEditorFunctionControlEvent',\n code: 'export interface IImageEditorFunctionControlEvent {\\n cropImage: () => Promise<string>;\\n setLoadingState: (loading: boolean) => void;\\n}',\n description: 'Interface định nghĩa các hàm điều khiển có thể được gọi từ bên ngoài component.',\n },\n {\n name: 'IAspectRatio',\n code: 'export interface IAspectRatio {\\n key: string;\\n value: number;\\n}',\n description: 'Interface định nghĩa tỷ lệ khung hình.',\n },\n ];\n\n features = [\n {\n id: 1,\n icon: '✂️',\n title: 'Cắt ảnh',\n description: 'Cắt hình ảnh theo khu vực tùy chỉnh hoặc dựa trên tỷ lệ định trước (1:1, 4:3, 16:9, v.v.).',\n },\n {\n id: 2,\n icon: '🔄',\n title: 'Xoay và lật',\n description: 'Xoay hình ảnh theo các góc khác nhau hoặc lật theo chiều ngang/dọc.',\n },\n {\n id: 3,\n icon: '📏',\n title: 'Thay đổi kích thước',\n description: 'Thay đổi kích thước hình ảnh theo tỷ lệ phần trăm hoặc kích thước cụ thể.',\n },\n {\n id: 4,\n icon: '💾',\n title: 'Nhiều chế độ lưu',\n description: 'Hỗ trợ nhiều chế độ lưu: tải xuống trực tiếp hoặc gửi đến API.',\n },\n {\n id: 5,\n icon: '🔍',\n title: 'Phóng to/thu nhỏ',\n description: 'Tính năng phóng to/thu nhỏ để xem chi tiết hình ảnh khi cần thiết.',\n },\n ];\n\n codeExamples = [\n {\n id: 1,\n title: 'Sử dụng cơ bản',\n code: `import { Component } from '@angular/core';\\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\\n\\n@Component({\\n selector: 'app-example',\\n standalone: true,\\n imports: [LibsUiComponentsImageEditorComponent],\\n template: \\`\\n <libs_ui-components-image_editor\\n [(imgSrc)]=\"imageSource\"\\n [modeShowButton]=\"'save-file'\"\\n [nameFile]=\"'image.jpg'\"\\n (outSaveFile)=\"onSaveFile($event)\"\\n (outClose)=\"onClose($event)\">\\n </libs_ui-components-image_editor>\\n \\`\\n})\\nexport class ExampleComponent {\\n imageSource = 'https://example.com/path/to/image.jpg';\\n\\n onSaveFile(data: {file: Blob, url: string, mode: string}) {\\n console.log('File đã được lưu:', data);\\n }\\n\\n onClose(data: {isClickButtonClose: boolean}) {\\n console.log('Đã đóng trình chỉnh sửa ảnh');\\n }\\n}`,\n },\n {\n id: 2,\n title: 'Sử dụng với tỷ lệ cố định',\n code: `import { Component } from '@angular/core';\\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\\nimport { IAspectRatio } from '@libs-ui/interfaces-types';\\n\\n@Component({\\n selector: 'app-example',\\n standalone: true,\\n imports: [LibsUiComponentsImageEditorComponent],\\n template: \\`\\n <libs_ui-components-image_editor\\n [(imgSrc)]=\"imageSource\"\\n [aspectRatio]=\"aspectRatio\"\\n [requiredCropFollowRatio]=\"true\"\\n (outSaveFile)=\"onSaveFile($event)\">\\n </libs_ui-components-image_editor>\\n \\`\\n})\\nexport class ExampleComponent {\\n imageSource = 'https://example.com/path/to/image.jpg';\\n aspectRatio: IAspectRatio = {\\n key: '1:1',\\n value: 1\\n };\\n\\n onSaveFile(data: any) {\\n console.log('Đã lưu hình ảnh với tỷ lệ 1:1');\\n }\\n}`,\n },\n {\n id: 3,\n title: 'Sử dụng với phần điều khiển bên ngoài',\n code: `import { Component, ViewChild } from '@angular/core';\\nimport { LibsUiComponentsImageEditorComponent, IImageEditorFunctionControlEvent } from '@libs-ui/components-image-editor';\\n\\n@Component({\\n selector: 'app-example',\\n standalone: true,\\n imports: [LibsUiComponentsImageEditorComponent],\\n template: \\`\\n <button (click)=\"cropAndSave()\">Cắt và lưu ngay</button>\\n <libs_ui-components-image_editor\\n [(imgSrc)]=\"imageSource\"\\n (outFunctionsControl)=\"onFunctionsControl($event)\">\\n </libs_ui-components-image_editor>\\n \\`\\n})\\nexport class ExampleComponent {\\n imageSource = 'https://example.com/path/to/image.jpg';\\n editorFunctions!: IImageEditorFunctionControlEvent;\\n\\n onFunctionsControl(event: IImageEditorFunctionControlEvent) {\\n this.editorFunctions = event;\\n }\\n\\n async cropAndSave() {\\n if (this.editorFunctions) {\\n this.editorFunctions.setLoadingState(true);\\n try {\\n const dataUrl = await this.editorFunctions.cropImage();\\n console.log('Hình ảnh đã được cắt:', dataUrl);\\n } finally {\\n this.editorFunctions.setLoadingState(false);\\n }\\n }\\n }\\n}`,\n },\n ];\n\n copyToClipboard(text: string): void {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n alert('Đã sao chép vào clipboard');\n })\n .catch((err) => {\n console.error('Không thể sao chép: ', err);\n });\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this.selectedFile = input.files[0];\n this.imageName = this.selectedFile.name;\n console.log('File selected:', this.selectedFile.name);\n }\n }\n\n uploadAndEdit(): void {\n if (!this.selectedFile) {\n alert('Vui lòng chọn một file hình ảnh trước');\n return;\n }\n\n const reader = new FileReader();\n reader.onload = (e: ProgressEvent<FileReader>) => {\n if (e.target?.result) {\n this.imageSource = e.target.result as string;\n this.showEditor = true;\n }\n };\n reader.readAsDataURL(this.selectedFile);\n }\n\n onSaveImage(data: ISaveFile): void {\n console.log('Image saved:', data);\n this.editedImageUrl = data.url;\n this.showEditor = false;\n }\n\n onCloseEditor(data: { isClickButtonClose: boolean }): void {\n console.log('Editor closed:', data);\n this.showEditor = false;\n }\n\n downloadImage(): void {\n if (this.editedImageUrl) {\n const link = document.createElement('a');\n link.href = this.editedImageUrl;\n link.download = this.imageName || 'edited-image.jpg';\n link.click();\n }\n }\n\n handleFunctionControl(event: IImageEditorFunctionControlEvent) {\n console.log(event);\n }\n}\n","<div class=\"max-w-6xl mx-auto p-5 font-sans text-gray-800\">\n <header class=\"text-center py-10 bg-white rounded-lg mb-8 shadow-sm\">\n <h1 class=\"text-4xl font-bold text-gray-800 mb-2\">Demo Trình Chỉnh Sửa Hình Ảnh</h1>\n <p class=\"text-xl text-gray-500\">Thư viện component cho Angular để chỉnh sửa hình ảnh</p>\n </header>\n\n <main>\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Giới thiệu</h2>\n <p>\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">@libs-ui/components-image-editor</code>\n là một component Angular mạnh mẽ cho phép người dùng thực hiện các thao tác chỉnh sửa hình ảnh như cắt, thay đổi kích thước, xoay, lật và áp dụng tỷ lệ cố định.\n </p>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Cài đặt</h2>\n\n <div class=\"mb-6\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-3\">Yêu cầu</h3>\n <ul class=\"list-disc pl-5 space-y-2 text-gray-600\">\n <li>\n <span class=\"font-semibold\">Angular</span>\n : 18.0.0 trở lên\n </li>\n <li>\n <span class=\"font-semibold\">Tailwind CSS</span>\n : 3.3.0 trở lên\n </li>\n </ul>\n </div>\n\n <p class=\"mb-4\">Để cài đặt thư viện, sử dụng npm hoặc yarn:</p>\n\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg mb-6\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>npm install @libs-ui/components-image-editor</code></pre>\n <button\n class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors\"\n (click)=\"copyToClipboard('npm install @libs-ui/components-image-editor')\">\n Sao chép\n </button>\n </div>\n\n <p class=\"mb-4\">Hoặc với yarn:</p>\n\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg mb-6\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>yarn add @libs-ui/components-image-editor</code></pre>\n <button\n class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors\"\n (click)=\"copyToClipboard('yarn add @libs-ui/components-image-editor')\">\n Sao chép\n </button>\n </div>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Demo trực tiếp</h2>\n <div>\n <p class=\"mb-4\">Tải lên hình ảnh và chỉnh sửa ngay trên trình duyệt:</p>\n <div class=\"flex flex-wrap items-center gap-4 mb-8\">\n <input\n type=\"file\"\n #imageFileInput\n accept=\"image/*\"\n class=\"border border-gray-300 rounded px-3 py-2\"\n (change)=\"onFileSelected($event)\" />\n <libs_ui-components-buttons-button\n label=\"Tải lên và chỉnh sửa\"\n (click)=\"uploadAndEdit()\"></libs_ui-components-buttons-button>\n </div>\n\n @if (editedImageUrl) {\n <div class=\"mt-8 p-6 bg-gray-50 rounded-lg\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Kết quả</h3>\n <div class=\"max-w-xl mx-auto mb-4 border border-gray-200 rounded-lg overflow-hidden shadow-md\">\n <img\n [src]=\"editedImageUrl\"\n alt=\"Hình ảnh đã chỉnh sửa\"\n class=\"w-full h-auto\" />\n </div>\n <div class=\"flex justify-center\">\n <libs_ui-components-buttons-button\n label=\"Tải xuống hình ảnh\"\n (click)=\"downloadImage()\"></libs_ui-components-buttons-button>\n </div>\n </div>\n }\n </div>\n </section>\n\n @if (showEditor) {\n <div class=\"fixed inset-0 z-50\">\n <libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [nameFile]=\"imageName || 'demo-image.jpg'\"\n [modeShowButton]=\"'save-file'\"\n [hasZoom]=\"true\"\n (outSaveFile)=\"onSaveImage($event)\"\n (outClose)=\"onCloseEditor($event)\"\n (outFunctionsControl)=\"handleFunctionControl($event)\" />\n </div>\n }\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Cách sử dụng</h2>\n\n <div class=\"mb-8\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Cách 1: Sử dụng file HTML riêng biệt</h3>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-4\">\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">HTML (example.component.html)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code><libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [nameFile]=\"'image.jpg'\"\n [modeShowButton]=\"'save-file'\"\n (outSaveFile)=\"onSaveFile($event)\"\n (outClose)=\"onClose($event)\">\n</libs_ui-components-image_editor></code></pre>\n </div>\n\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">TypeScript (example.component.ts)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code>import { Component } from '@angular/core';\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\n\n@Component({\n selector: 'app-example',\n standalone: true,\n imports: [LibsUiComponentsImageEditorComponent],\n templateUrl: './example.component.html'\n})\nexport class ExampleComponent {\n imageSource = 'https://example.com/path/to/image.jpg';\n\n onSaveFile(data: {file: Blob, url: string, mode: string}) {\n console.log('File đã được lưu:', data);\n }\n\n onClose(data: {isClickButtonClose: boolean}) {\n console.log('Đã đóng trình chỉnh sửa ảnh');\n }\n}</code></pre>\n </div>\n </div>\n </div>\n\n <div class=\"mb-8\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Cách 2: Với trình chỉnh sửa có thể đóng/mở</h3>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-4\">\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">HTML (toggle-editor.component.html)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code><button (click)=\"openEditor()\" class=\"px-4 py-2 bg-blue-500 text-white rounded\">\n Mở trình chỉnh sửa ảnh\n</button>\n\n@if (showEditor) {\n <libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [nameFile]=\"'my-image.jpg'\"\n (outSaveFile)=\"onSaveFile($event)\"\n (outClose)=\"onCloseEditor($event)\">\n </libs_ui-components-image_editor>\n}\n\n@if (editedImageUrl) {\n <div class=\"mt-4\">\n <h3 class=\"text-lg font-semibold\">Hình ảnh đã chỉnh sửa:</h3>\n <img [src]=\"editedImageUrl\" alt=\"Hình ảnh đã chỉnh sửa\" class=\"mt-2 max-w-full h-auto\" />\n </div>\n}</code></pre>\n </div>\n\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">TypeScript (toggle-editor.component.ts)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code>import { Component } from '@angular/core';\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\nimport { ISaveFile } from '@libs-ui/components-image-editor';\n\n@Component({\n selector: 'app-toggle-editor',\n standalone: true,\n imports: [LibsUiComponentsImageEditorComponent],\n templateUrl: './toggle-editor.component.html'\n})\nexport class ToggleEditorComponent {\n imageSource = 'https://example.com/path/to/image.jpg';\n showEditor = false;\n editedImageUrl = '';\n\n openEditor() {\n this.showEditor = true;\n }\n\n onSaveFile(data: ISaveFile) {\n this.editedImageUrl = data.url;\n this.showEditor = false;\n console.log('Đã lưu file:', data.file);\n }\n\n onCloseEditor(data: {isClickButtonClose: boolean}) {\n this.showEditor = false;\n }\n}</code></pre>\n </div>\n </div>\n </div>\n\n <div class=\"mb-8\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Cách 3: Với tỷ lệ khung hình cố định</h3>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-4\">\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">HTML (fixed-ratio.component.html)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code><libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [aspectRatio]=\"aspectRatio\"\n [requiredCropFollowRatio]=\"true\"\n (outSaveFile)=\"onSaveFile($event)\">\n</libs_ui-components-image_editor></code></pre>\n </div>\n\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">TypeScript (fixed-ratio.component.ts)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code>import { Component } from '@angular/core';\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\nimport { IAspectRatio } from '@libs-ui/interfaces-types';\n\n@Component({\n selector: 'app-fixed-ratio',\n standalone: true,\n imports: [LibsUiComponentsImageEditorComponent],\n templateUrl: './fixed-ratio.component.html'\n})\nexport class FixedRatioComponent {\n imageSource = 'https://example.com/path/to/image.jpg';\n aspectRatio: IAspectRatio = {\n key: '1:1',\n value: 1\n };\n\n onSaveFile(data: any) {\n console.log('Đã lưu hình ảnh với tỷ lệ 1:1');\n }\n}</code></pre>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Tài liệu API</h2>\n\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Inputs</h3>\n <div class=\"overflow-x-auto mb-8\">\n <table class=\"min-w-full bg-white border border-gray-200\">\n <thead>\n <tr>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Tên</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Kiểu dữ liệu</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Mặc định</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Mô tả</th>\n </tr>\n </thead>\n <tbody>\n @for (input of inputsDoc; track input.name) {\n <tr>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ input.name }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ input.type }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">{{ input.default }}</td>\n <td class=\"py-2 px-4 border-b border-gray-200\">{{ input.description }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Outputs</h3>\n <div class=\"overflow-x-auto mb-8\">\n <table class=\"min-w-full bg-white border border-gray-200\">\n <thead>\n <tr>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Tên</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Kiểu dữ liệu</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Mô tả</th>\n </tr>\n </thead>\n <tbody>\n @for (output of outputsDoc; track output.name) {\n <tr>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ output.name }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ output.type }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">{{ output.description }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Interfaces</h3>\n <div class=\"space-y-6\">\n @for (interfaceItem of interfacesDoc; track interfaceItem.name) {\n <div class=\"bg-gray-50 p-6 rounded-lg\">\n <h4 class=\"text-lg font-semibold text-gray-700 mb-3\">{{ interfaceItem.name }}</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm mb-3\"><code>{{ interfaceItem.code }}</code></pre>\n <p class=\"text-gray-600\">{{ interfaceItem.description }}</p>\n </div>\n }\n </div>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Tính năng</h2>\n <ul class=\"space-y-6\">\n @for (feature of features; track feature.id) {\n <li class=\"flex items-start\">\n <span class=\"text-2xl text-blue-500\">{{ feature.icon }}</span>\n <div>\n <h3 class=\"text-lg font-semibold text-gray-700 mb-1\">{{ feature.title }}</h3>\n <p class=\"text-gray-600\">{{ feature.description }}</p>\n </div>\n </li>\n }\n </ul>\n </section>\n </main>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-image-editor.mjs","sources":["../../../../../libs-ui/components/image-editor/src/defines/image-editor.define.ts","../../../../../libs-ui/components/image-editor/src/resize/resize.component.ts","../../../../../libs-ui/components/image-editor/src/resize/resize.component.html","../../../../../libs-ui/components/image-editor/src/image-editor.component.ts","../../../../../libs-ui/components/image-editor/src/image-editor.component.html","../../../../../libs-ui/components/image-editor/src/demo/image-editor-demo.component.ts","../../../../../libs-ui/components/image-editor/src/demo/image-editor-demo.component.html","../../../../../libs-ui/components/image-editor/src/libs-ui-components-image-editor.ts"],"sourcesContent":["import { get } from '@libs-ui/utils';\nimport { ICropRatioItem } from '../interfaces/image-editor.interface';\n\nexport const cropRationItems = (): Array<ICropRatioItem> => {\n return [\n {\n key: 'free',\n icon: 'libs-ui-icon-customize-image-outline',\n },\n {\n key: '1:1',\n value: 1,\n icon: 'libs-ui-icon-ratio-1-1',\n },\n {\n key: '2:3',\n value: 2 / 3,\n icon: 'libs-ui-icon-ratio-2-3',\n },\n {\n key: '3:2',\n value: 3 / 2,\n icon: 'libs-ui-icon-ratio-3-2',\n },\n {\n key: '3:4',\n value: 3 / 4,\n icon: 'libs-ui-icon-ratio-3-4',\n },\n {\n key: '4:3',\n value: 4 / 3,\n icon: 'libs-ui-icon-ratio-4-3',\n },\n {\n key: '9:16',\n value: 9 / 16,\n icon: 'libs-ui-icon-ratio-9-16',\n },\n {\n key: '16:9',\n value: 16 / 9,\n icon: 'libs-ui-icon-ratio-16-9',\n },\n ];\n};\n\nconst getMimeTypeFromSrc = (src?: string) => {\n if (!src) {\n return undefined;\n }\n const match = /^data:(.*?);/.exec(src);\n\n if (match) {\n return match[1];\n }\n const srcSplit = src.split('.');\n const mineType = srcSplit[srcSplit.length - 1];\n\n return `image/${mineType.toLowerCase() === 'jpg' ? 'jpeg' : mineType}`;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const getDataUrl = (canvas: any, mimetype?: string, src?: string) => {\n const mimeTypeBySrc = getMimeTypeFromSrc(src);\n\n if (mimetype || mimeTypeBySrc) {\n return canvas.toDataURL(mimetype || mimeTypeBySrc);\n }\n\n return canvas.toDataURL();\n};\n\nexport const getWidthHeightResizeCropFollow = (ratioValue: number | undefined, width: number, height: number, maxWidth: number, maxHeight: number, minWidth: number, minHeight: number) => {\n height = Math.min(height, maxHeight);\n height = Math.max(minHeight, height);\n if (ratioValue) {\n width = height * ratioValue;\n width = Math.min(maxWidth, width);\n width = Math.max(minWidth, width);\n height = width / ratioValue;\n }\n width = Math.min(maxWidth, width);\n width = Math.max(minWidth, width);\n\n return [width, height];\n};\n\nexport const getCropRectImage = (rectClip: { left: number; top: number; width: number; height: number }, imgWidth: number, imgHeight: number, scale: number) => {\n return {\n left: Math.max(rectClip.left * scale, 0),\n top: Math.max(rectClip.top * scale, 0),\n width: rectClip.width * scale,\n height: rectClip.height * scale,\n };\n};\n\nexport const getStylesOfElement = <T>(element: HTMLElement, fields: Array<string>): Array<T> => {\n return fields?.map<T>((field) => parseFloat(get(element, field) || '0') as T);\n};\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { getDataUrl } from '../defines/image-editor.define';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IButton } from '@libs-ui/components-buttons-button';\nimport { IInputValidFunctionControlEvent } from '@libs-ui/components-inputs-valid';\nimport { IResizeData } from '../interfaces/image-editor.interface';\nimport { LibsUiComponentsModalComponent, TYPE_MODAL_EVENT } from '@libs-ui/components-modal';\nimport { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { convertBase64ToBlob, convertBlobToFile, getLabelBySizeFile } from '@libs-ui/utils';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs-ui-components-image_editor-resize',\n templateUrl: './resize.component.html',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsModalComponent, LibsUiComponentsInputsValidComponent],\n})\nexport class LibsUiComponentsImageEditorResizeComponent implements OnInit {\n protected buttonsFooter: Array<IButton>;\n protected image = new Image();\n protected originFileSize!: string;\n protected currentFileSize!: string;\n\n private inputValidFunctionControl: Array<IInputValidFunctionControlEvent>;\n\n @Input({ required: true }) resizeData!: IResizeData;\n @Input({ required: true }) originWidth!: number;\n @Input({ required: true }) originHeight!: number;\n @Input({ required: true }) src!: string;\n @Input() zIndex?: number;\n @Input() mimetype?: string;\n\n @Output() readonly outClose = new EventEmitter<void>();\n @Output() readonly outSave = new EventEmitter<IResizeData>();\n\n constructor() {\n this.buttonsFooter = [\n {\n type: 'button-third',\n label: 'i18n_cancel',\n action: async () => this.outClose.emit(),\n },\n {\n label: 'i18n_save',\n action: async () => {\n this.outSave.emit(this.resizeData);\n this.outClose.emit();\n },\n },\n ];\n this.inputValidFunctionControl = [];\n }\n\n async ngOnInit(): Promise<void> {\n const fileSize = await this.getFileSize();\n\n this.currentFileSize = fileSize;\n this.originFileSize = fileSize;\n }\n\n protected async handlerResizeRatio() {\n let ratio = parseInt(`${this.resizeData.ratio}`);\n\n if (!ratio || ratio < 0) {\n return;\n }\n if (ratio > 100) {\n ratio = 100;\n this.resizeData.ratio = ratio;\n }\n this.resizeData.width = Math.max(parseInt(`${(this.originWidth * ratio) / 100}`), 1);\n this.resizeData.height = Math.max(parseInt(`${(this.originHeight * ratio) / 100}`), 1);\n // this.inputValidFunctionControl.forEach(item => item.detectChanges());\n this.currentFileSize = await this.getFileSize();\n }\n\n private getFileSize() {\n return new Promise<string>((resolve) => {\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n\n canvas.width = this.resizeData.width;\n canvas.height = this.resizeData.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(this.image, 0, 0, canvas.width, canvas.height);\n }\n const src = getDataUrl(canvas, this.mimetype, this.src);\n const file = convertBase64ToBlob(src);\n\n resolve(getLabelBySizeFile(convertBlobToFile(file, Date.now().toLocaleString()).size));\n };\n this.image.src = this.src;\n });\n }\n\n protected handlerResizeWidth() {\n this.processResizeWidthOrHeight('width', 'height', this.originWidth, this.originHeight);\n }\n\n protected handlerResizeHeight() {\n this.processResizeWidthOrHeight('height', 'width', this.originHeight, this.originWidth);\n }\n\n private async processResizeWidthOrHeight(resizeBy: 'width' | 'height', fieldResize: 'width' | 'height', originByValue: number, originOtherValue: number) {\n const value = parseInt(`${this.resizeData[resizeBy]}`);\n\n if (!value || value > originByValue) {\n return;\n }\n this.resizeData[fieldResize] = Math.max(parseInt(`${(originOtherValue * value) / originByValue}`), 1);\n this.resizeData.ratio = Math.max(parseInt(`${(100 * value) / originByValue}`), 1);\n this.currentFileSize = await this.getFileSize();\n }\n\n protected handlerInputValidFunctionControl(event: IInputValidFunctionControlEvent) {\n this.inputValidFunctionControl.push(event);\n }\n\n protected handlerEvent(event: TYPE_MODAL_EVENT) {\n if (event === 'close') {\n this.outClose.emit();\n }\n }\n}\n","<libs_ui-components-modal\n [headerConfig]=\"{ ignoreHeaderTheme: true }\"\n [mode]=\"'center'\"\n [width]=\"'500px'\"\n [height]=\"'auto'\"\n [title]=\"'i18n_resize' | translate\"\n [zIndex]=\"zIndex\"\n [buttonsFooter]=\"buttonsFooter\"\n (outEvent)=\"handlerEvent($event)\">\n <div class=\"libs-ui-modal-body-custom w-full h-full\">\n <div class=\"flex items-center\">\n <div class=\"libs-ui-font-h7r mr-[4px] text-[#6a7383] w-[100px] shrink-0\">{{ 'i18n_ratio_size' | translate }} (%)</div>\n <libs_ui-components-inputs-valid\n [ignoreWidthInput100]=\"true\"\n [classIncludeInput]=\"'w-[132px]'\"\n [dataType]=\"'int'\"\n [fieldNameBind]=\"'ratio'\"\n [(item)]=\"resizeData\"\n [minValueNumber]=\"1\"\n [maxValueNumber]=\"100\"\n [valueUpDownNumber]=\"1\"\n [validRequired]=\"{ isRequired: true }\"\n [ignoreShowError]=\"true\"\n (outValueChange)=\"handlerResizeRatio()\"\n (outFunctionsControl)=\"handlerInputValidFunctionControl($event)\" />\n </div>\n <div class=\"mt-[16px] relative\">\n <div class=\"flex items-center\">\n <div class=\"libs-ui-font-h7r mr-[4px] text-[#6a7383] w-[100px] shrink-0\">\n {{ 'i18n_width' | translate }}\n </div>\n <libs_ui-components-inputs-valid\n [ignoreWidthInput100]=\"true\"\n [classIncludeInput]=\"'w-[102px]'\"\n [dataType]=\"'int'\"\n [maxValueNumber]=\"originWidth\"\n [minValueNumber]=\"1\"\n [fieldNameBind]=\"'width'\"\n [(item)]=\"resizeData\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n (outValueChange)=\"handlerResizeWidth()\"\n (outFunctionsControl)=\"handlerInputValidFunctionControl($event)\" />\n </div>\n <div class=\"flex items-center mt-[8px]\">\n <div class=\"libs-ui-font-h7r mr-[4px] text-[#6a7383] w-[100px] shrink-0\">\n {{ 'i18n_length' | translate }}\n </div>\n <libs_ui-components-inputs-valid\n [ignoreWidthInput100]=\"true\"\n [classIncludeInput]=\"'w-[102px]'\"\n [dataType]=\"'int'\"\n [minValueNumber]=\"1\"\n [maxValueNumber]=\"originHeight\"\n [fieldNameBind]=\"'height'\"\n [(item)]=\"resizeData\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n (outValueChange)=\"handlerResizeHeight()\"\n (outFunctionsControl)=\"handlerInputValidFunctionControl($event)\" />\n </div>\n <div class=\"absolute flex items-center left-[236px] top-[14px]\">\n <div class=\"w-[20px] h-[44px] libs-ui-border-top-general libs-ui-border-right-general libs-ui-border-bottom-general\"></div>\n <div class=\"ml-[6px] text-[#9ca2ad] libs-ui-icon-lock\"></div>\n </div>\n </div>\n <div class=\"mt-[16px]\">\n <div class=\"libs-ui-font-h6m text-[#6a7383] mb-[8px]\">{{ 'i18n_size_photo' | translate }}</div>\n <div class=\"libs-ui-font-h5r rounded-[4px] py-[8px] px-[16px] bg-[#f8f9fa] text-[#9ca2ad]\">\n {{ 'i18n_file_size_compare_when_resize' | translate: { current_size: currentFileSize, original_size: originFileSize } }}\n </div>\n </div>\n </div>\n</libs_ui-components-modal>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgTemplateOutlet } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, DestroyRef, ElementRef, Inject, inject, input, model, OnDestroy, Optional, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { LibsUiComponentsModalComponent } from '@libs-ui/components-modal';\nimport { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';\nimport { IAspectRatio, IBoundingClientRect, IEvent } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';\nimport { convertBase64ToBlob, get, isNil, LINK_IMAGE_ERROR_TOKEN_INJECT, set } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { fromEvent, Observable } from 'rxjs';\nimport { mergeMap, takeUntil, tap } from 'rxjs/operators';\nimport { cropRationItems, getCropRectImage, getDataUrl, getStylesOfElement, getWidthHeightResizeCropFollow } from './defines/image-editor.define';\nimport { IImageEditorFunctionControlEvent } from './interfaces/function-control-event.interface';\nimport { ICropRatioItem, ICropSize, IRectClip, IResizeData, ISaveFile, IStartMouseDim, IStyles, MODE_EDIT, TYPE_MODE_SAVE, TYPE_RESIZE_STATE } from './interfaces/image-editor.interface';\nimport { LibsUiComponentsImageEditorResizeComponent } from './resize/resize.component';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-image_editor',\n templateUrl: './image-editor.component.html',\n styleUrl: './image-editor.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgTemplateOutlet, TranslateModule, LibsUiComponentsPopoverComponent, LibsUiComponentsModalComponent, LibsUiComponentsInputsValidComponent, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsSpinnerComponent],\n})\nexport class LibsUiComponentsImageEditorComponent implements AfterViewInit, OnDestroy {\n protected loading = signal(false);\n protected loadingImage = signal(true);\n protected changed = signal(false);\n protected originWidth = signal<number>(0);\n protected originHeight = signal<number>(0);\n protected cropRatioItems = signal<Array<ICropRatioItem>>(cropRationItems());\n protected cropRatioItemSelected = signal<string>('');\n protected cropSize = signal<ICropSize>({ width: 20, height: 20 });\n protected resizeData = signal<IResizeData>({ ratio: 100, width: 600, height: 800 });\n protected dragGridCrop = signal(false);\n\n private image = new Image();\n private canvas = document.createElement('canvas');\n private containerHeight = signal(800);\n private containerWidth = signal(1200);\n private imgContainerRect = signal<IBoundingClientRect>({ top: 0, left: 0, width: 0, height: 0 });\n private rectClip = signal<IRectClip>({ top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0 });\n private resizeState = signal<TYPE_RESIZE_STATE>('none');\n private moveState = signal<'clip' | 'image' | 'none'>('none');\n private startMouseDim = signal<IStartMouseDim>({ clientX: 0, clientY: 0, width: 0, height: 0, top: 0, left: 0, imageTop: 0, imageLeft: 0, imageWidth: 0, imageHeight: 0 });\n private dataUrlOrigin = signal<string>('');\n private ratioValue = signal<number>(0);\n private readonly minHeight = 20;\n private readonly minWidth = 20;\n private resizeComponentRef?: ComponentRef<LibsUiComponentsImageEditorResizeComponent>;\n\n readonly modeShowButton = input<MODE_EDIT>('save-file');\n readonly mimetype = input<string>();\n readonly zIndex = input<number>(1200);\n readonly imgSrc = model.required<string>();\n readonly originUrl = input<string>();\n readonly nameFile = input<string>();\n readonly hasZoom = input<boolean>(false);\n readonly aspectRatio = input<IAspectRatio>();\n readonly requiredCropFollowRatio = input<boolean>(false);\n\n readonly imageOrigin = viewChild.required<ElementRef>('imageOrigin');\n readonly imageClip = viewChild.required<ElementRef>('imageClip');\n readonly imageEditorContainer = viewChild.required<ElementRef>('imageEditorContainer');\n readonly imageContainer = viewChild.required<ElementRef>('imageContainer');\n readonly cropArea = viewChild.required<ElementRef>('cropArea');\n readonly cropTL = viewChild.required<ElementRef>('cropTL');\n readonly cropBL = viewChild.required<ElementRef>('cropBL');\n readonly cropBR = viewChild.required<ElementRef>('cropBR');\n readonly cropTR = viewChild.required<ElementRef>('cropTR');\n readonly cropLineVL = viewChild.required<ElementRef>('cropLineVL');\n readonly cropLineVR = viewChild.required<ElementRef>('cropLineVR');\n readonly cropLineHT = viewChild.required<ElementRef>('cropLineHT');\n readonly cropLineHB = viewChild.required<ElementRef>('cropLineHB');\n readonly circleTL = viewChild.required<ElementRef>('circleTL');\n readonly circleTR = viewChild.required<ElementRef>('circleTR');\n readonly circleBL = viewChild.required<ElementRef>('circleBL');\n readonly circleBR = viewChild.required<ElementRef>('circleBR');\n\n readonly outClose = output<{ isClickButtonClose: boolean }>();\n readonly outSaveFile = output<ISaveFile>();\n readonly outFunctionsControl = output<IImageEditorFunctionControlEvent>();\n\n private destroyRef = inject(DestroyRef);\n private dynamicComponentService = inject(LibsUiDynamicComponentService);\n\n constructor(@Optional() @Inject(LINK_IMAGE_ERROR_TOKEN_INJECT) private linkImageError: string) {}\n\n ngAfterViewInit() {\n const aspectRatioFound = this.aspectRatio()?.key ? this.cropRatioItems().find((item) => item.key === this.aspectRatio()?.key) : this.cropRatioItems()[0];\n\n if (aspectRatioFound) {\n this.dragGridCrop.set(true);\n\n this.cropRatioItemSelected.set(aspectRatioFound?.key);\n this.updateOriginImageSize();\n this.changedImage(true);\n }\n\n this.updateModalSize();\n this.initData();\n this.initMouseEvent();\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IImageEditorFunctionControlEvent {\n return {\n cropImage: this.cropImage.bind(this),\n setLoadingState: (loading: boolean) => this.loading.set(loading),\n };\n }\n\n protected handlerImageLoaded() {\n setTimeout(() => {\n this.updateModalSize();\n this.loadingImage.set(false);\n }, 500);\n }\n\n protected handlerImageError(e: ErrorEvent) {\n console.log('e', e);\n (e as IEvent).target.src = this.linkImageError;\n }\n\n private updateModalSize() {\n const maxHeight = window.innerHeight - 100;\n const maxWidth = window.innerWidth - 400;\n\n this.containerHeight.set(maxHeight - 124);\n this.containerWidth.set(maxWidth - 384);\n this.updateOriginImageSize();\n }\n\n private initData() {\n this.imgContainerRect.set(this.imageContainer().nativeElement.getBoundingClientRect());\n this.image.setAttribute('crossorigin', 'anonymous');\n this.image.onload = () => {\n this.imgContainerRect.set(this.imageContainer().nativeElement.getBoundingClientRect());\n this.canvas.height = this.image.height;\n this.canvas.width = this.image.width;\n this.originHeight.set(this.image.height);\n this.originWidth.set(this.image.width);\n\n this.updateOriginImageSize();\n this.canvas.getContext('2d')?.drawImage(this.image, 0, 0, this.canvas.width, this.canvas.height);\n this.dataUrlOrigin.set(getDataUrl(this.canvas, this.mimetype(), this.image.src));\n this.imgSrc.set(this.dataUrlOrigin());\n };\n this.image.src = this.imgSrc();\n }\n\n private initMouseEvent() {\n const mouseUp = this.initEvent({ nativeElement: document }, 'mouseup', { callStopPropagation: true, callPreventDefault: true }, undefined, () => this.handlerMouseup());\n const mouseMove = this.initEvent({ nativeElement: document }, 'mousemove', { callStopPropagation: true, callPreventDefault: true }).pipe(takeUntil(mouseUp));\n\n this.initEvent(this.imageEditorContainer(), 'wheel', { callStopPropagation: true }, undefined, (e: Event) => this.handlerMousewheel(e)).subscribe();\n this.initEvent({ nativeElement: window }, 'resize', {}, undefined, () => this.updateModalSize()).subscribe();\n this.initEvent(this.imageContainer(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => this.handlerImageContainerMousedown(e)).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropTL(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'TL');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropBL(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'BL');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropBR(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'BR');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropTR(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'TR');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineVL(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'VL');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineVR(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'VR');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineHT(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'HT');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropLineHB(), 'mousedown', { callStopPropagation: true, callPreventDefault: true }, mouseMove, (e: Event) => {\n this.handlerCropResize(e, 'HB');\n }).subscribe((e: Event) => this.handlerMousemove(e));\n this.initEvent(this.cropArea(), 'mousedown', {}, undefined, (e: Event) => this.handlerMousedownCropArea(e)).subscribe((e: Event) => this.handlerMousemove(e));\n }\n\n private initEvent(element: ElementRef, eventName: string, flag: { callStopPropagation?: boolean; callPreventDefault?: boolean }, obsMerge?: Observable<Event>, callback?: (e: Event) => void): Observable<Event> {\n const obs = fromEvent<Event>(element.nativeElement, eventName).pipe(\n tap((e: Event) => {\n if (flag.callStopPropagation && e?.stopPropagation) {\n e.stopPropagation();\n }\n if (flag.callPreventDefault && e?.preventDefault) {\n e.preventDefault();\n }\n if (callback) {\n callback(e);\n }\n }),\n takeUntilDestroyed(this.destroyRef)\n );\n\n if (obsMerge) {\n return obs.pipe(\n mergeMap(() => obsMerge),\n takeUntilDestroyed(this.destroyRef)\n );\n }\n\n return obs;\n }\n\n private updateOriginImageSize() {\n let width = this.originWidth();\n let height = this.originHeight();\n const ratio = width / height;\n\n if (width >= height) {\n width = Math.min(this.containerWidth(), width);\n height = Math.min(width / ratio, this.containerHeight());\n width = height * ratio;\n } else {\n height = Math.min(this.containerHeight(), height);\n width = height * ratio;\n }\n this.setImagePosition(width, height);\n this.updateCropAreaPos();\n this.updateRectClipPos();\n }\n\n private setImagePosition(width: number, height: number) {\n const left = this.containerWidth() / 2 - width / 2;\n const top = this.containerHeight() / 2 - height / 2;\n const styles = { width, height, top, left, display: 'block' };\n\n this.setStylesElements(this.imageOrigin(), styles);\n this.setStylesElements(this.imageClip(), styles);\n this.setCirclePosition(styles);\n }\n\n private setCirclePosition(styles: IStyles) {\n this.setStylesElements(this.circleTL(), { top: (styles.top || 0) - 5, left: (styles.left || 0) - 5 });\n this.setStylesElements(this.circleTR(), { top: (styles.top || 0) - 5, left: (styles.left || 0) + (styles.width || 0) - 10 });\n this.setStylesElements(this.circleBL(), { top: (styles.top || 0) + (styles.height || 0) - 10, left: (styles.left || 0) - 5 });\n this.setStylesElements(this.circleBR(), { top: (styles.top || 0) + (styles.height || 0) - 10, left: (styles.left || 0) + (styles.width || 0) - 10 });\n }\n\n private updateCropAreaPos() {\n const [imgTop, imgLeft, imgWidth, imgHeight] = getStylesOfElement<number>(this.imageClip().nativeElement, ['style.top', 'style.left', 'offsetWidth', 'offsetHeight']);\n\n const rectImg: IBoundingClientRect = {\n top: Math.max(0, imgTop),\n left: Math.max(0, imgLeft),\n width: imgWidth,\n height: imgHeight,\n };\n\n rectImg.width = Math.min(imgWidth, this.containerWidth() - imgLeft);\n if (imgLeft < 0) {\n rectImg.width = Math.min(imgWidth + imgLeft, this.containerWidth());\n }\n rectImg.height = Math.min(imgHeight, this.containerHeight() - imgTop);\n if (imgTop < 0) {\n rectImg.height = Math.min(imgTop + imgHeight, this.containerHeight());\n }\n this.ratioValue.set(this.getCropRatioValue());\n if (!this.ratioValue()) {\n this.setStylesElements(this.cropArea(), rectImg);\n\n return;\n }\n let width = rectImg.width;\n let height = width / this.ratioValue();\n\n width = Math.min(rectImg.width, width);\n height = width / this.ratioValue();\n height = Math.min(rectImg.height, height);\n width = height * this.ratioValue();\n const top = rectImg.top + (rectImg.height - height) / 2;\n const left = rectImg.left + (rectImg.width - width) / 2;\n\n this.setStylesElements(this.cropArea(), { width, height, top, left });\n }\n\n private getCropRatioValue() {\n const cropRatio = this.cropRatioItems().find((item) => item.key === this.cropRatioItemSelected());\n\n if (!cropRatio?.value) {\n return this.aspectRatio()?.value || this.originWidth() / this.originHeight();\n }\n\n return cropRatio.value;\n }\n\n private updateRectClipPos() {\n const reactClip = this.getRectClipImage();\n\n this.imageClip().nativeElement.style.clip = `rect(${reactClip.top}px, ${reactClip.right}px, ${reactClip.bottom}px, ${reactClip.left}px)`;\n }\n\n private getRectClipImage() {\n const imageRect = this.imageClip().nativeElement.getBoundingClientRect();\n if (!imageRect.width) {\n return this.rectClip();\n }\n const cropRect = this.cropArea().nativeElement.getBoundingClientRect();\n const width = Math.round(cropRect.width);\n const height = Math.round(cropRect.height);\n const left = cropRect.left - imageRect.left;\n const top = cropRect.top - imageRect.top;\n const right = Math.round(left + width);\n const bottom = Math.round(top + height);\n const ratio = this.originWidth() / imageRect.width;\n\n this.rectClip.set({ left, top, right, bottom, width, height });\n this.cropSize.set({\n height: top >= 0 ? Math.round((bottom - top) * ratio) : Math.floor((bottom - top) * ratio),\n width: top >= 0 ? Math.round((right - left) * (this.ratioValue() ?? 1) * ratio) : Math.floor((right - left) * (this.ratioValue() ?? 1) * ratio),\n });\n\n return this.rectClip();\n }\n\n private handlerMousemove(e: any) {\n const typeState = ['BL', 'TL', 'TR', 'BR', 'VL', 'VR', 'HT', 'HB'];\n const methodName = `resizeCropFollow${this.resizeState()}Dir`; // resizeCropFollowBLDir, resizeCropFollowTLDir, resizeCropFollowTRDir, resizeCropFollowBRDir, resizeCropFollowVLDir, resizeCropFollowVRDir, resizeCropFollowHTDir, resizeCropFollowHBDir\n\n if (typeState.includes(this.resizeState())) {\n (this as any)[methodName](e);\n }\n switch (this.moveState()) {\n case 'clip':\n this.moveClipArea(e);\n break;\n\n case 'image':\n this.moveImage(e);\n break;\n }\n this.changedImage(true);\n }\n\n protected resizeCropFollowBLDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? -momentY * this.ratioValue() : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().imageTop + this.startMouseDim().imageHeight - this.startMouseDim().top;\n const maxWidth = this.startMouseDim().left + this.startMouseDim().width - this.startMouseDim().imageLeft;\n let { width, height, left } = this.getRectResizeCropFollow({ width: -1, height: 1, left: 1, top: 0 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n this.setStylesElements(this.cropArea(), { left, height, width }, true);\n };\n\n protected resizeCropFollowTLDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? this.ratioValue() * momentY : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().left + this.startMouseDim().width - this.startMouseDim().imageLeft;\n let { width, height, top, left } = this.getRectResizeCropFollow({ width: -1, height: -1, left: 1, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, left, height, width }, true);\n };\n\n protected resizeCropFollowTRDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? -momentY * this.ratioValue() : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().imageLeft + this.startMouseDim().imageWidth - this.startMouseDim().left;\n let { width, height, top } = this.getRectResizeCropFollow({ width: 1, height: -1, left: 0, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, height, width }, true);\n };\n\n protected resizeCropFollowBRDir(e: IEvent) {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? momentY * this.ratioValue() : e.clientX - this.startMouseDim().clientX;\n const maxHeight = this.startMouseDim().imageTop + this.startMouseDim().imageHeight - this.startMouseDim().top;\n const maxWidth = this.startMouseDim().imageLeft + this.startMouseDim().imageWidth - this.startMouseDim().left;\n let { width, height } = this.getRectResizeCropFollow({ width: 1, height: 1, left: 0, top: 0 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n this.setStylesElements(this.cropArea(), { height, width }, true);\n }\n\n protected resizeCropFollowVLDir = (e: IEvent) => {\n const momentX = e.clientX - this.startMouseDim().clientX;\n const momentY = this.ratioValue() ? momentX / this.ratioValue() : 0;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().left + this.startMouseDim().width - this.startMouseDim().imageLeft;\n let { width, height, top, left } = this.getRectResizeCropFollow({ width: -1, height: -1, left: 1, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, left, height, width }, true);\n };\n\n protected resizeCropFollowVRDir = (e: IEvent) => {\n const momentX = e.clientX - this.startMouseDim().clientX;\n const momentY = this.ratioValue() ? -momentX / this.ratioValue() : 0;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n const maxWidth = this.startMouseDim().imageLeft + this.startMouseDim().imageWidth - this.startMouseDim().left;\n let { width, height, top } = this.getRectResizeCropFollow({ width: 1, height: -1, left: 0, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n this.setStylesElements(this.cropArea(), { top, height, width }, true);\n };\n\n protected resizeCropFollowHTDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? momentY * this.ratioValue() : 0;\n const maxWidth = this.startMouseDim().width + this.startMouseDim().left - this.startMouseDim().imageLeft;\n const maxHeight = this.startMouseDim().top + this.startMouseDim().height - this.startMouseDim().imageTop;\n let { width, height, top, left } = this.getRectResizeCropFollow({ width: -1, height: -1, left: 1, top: 1 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n top = this.startMouseDim().top + this.startMouseDim().height - height;\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n this.setStylesElements(this.cropArea(), { top, left, height, width }, true);\n };\n\n protected resizeCropFollowHBDir = (e: IEvent) => {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = this.ratioValue() ? momentY * this.ratioValue() : 0;\n const maxHeight = this.startMouseDim().imageTop + this.startMouseDim().imageHeight - this.startMouseDim().top;\n const maxWidth = this.startMouseDim().width + this.startMouseDim().left - this.startMouseDim().imageLeft;\n let { width, height, left } = this.getRectResizeCropFollow({ width: 1, height: 1, left: -1, top: 0 }, momentX, momentY);\n\n [width, height] = getWidthHeightResizeCropFollow(this.ratioValue(), width, height, maxWidth, maxHeight, this.minWidth, this.minHeight);\n left = this.startMouseDim().left + this.startMouseDim().width - width;\n this.setStylesElements(this.cropArea(), { height, left, width }, true);\n };\n\n private getRectResizeCropFollow(ratio: { width: number; height: number; top: number; left: number }, momentX: number, momentY: number) {\n const width = this.startMouseDim().width + momentX * ratio.width;\n const height = this.startMouseDim().height + momentY * ratio.height;\n const top = this.startMouseDim().top + momentY * ratio.top;\n const left = this.startMouseDim().left + momentX * ratio.left;\n\n return { width, height, left, top };\n }\n\n private handlerMouseup() {\n this.imageContainer().nativeElement.classList.remove('cursor-grabbing');\n this.cropArea().nativeElement.classList.remove('cursor-grabbing');\n this.resizeState.set('none');\n this.moveState.set('none');\n }\n\n private handlerMousewheel(event: any) {\n if (!this.hasZoom()) {\n return;\n }\n if (event.deltaY < 0) {\n this.zoomImage(1 / 1.1);\n\n return;\n }\n this.zoomImage(1.1);\n }\n\n private handlerImageContainerMousedown(e: any) {\n if (this.resizeState() === 'none' && this.moveState() === 'none') {\n this.moveState.set('image');\n this.handlerMousedown(e);\n }\n\n return false;\n }\n\n private handlerCropResize(e: any, resizeType: TYPE_RESIZE_STATE) {\n this.resizeState.set(resizeType);\n this.dragGridCrop.set(true);\n this.handlerMousedown(e);\n }\n\n private handlerMousedownCropArea(e: any) {\n this.moveState.set('clip');\n this.handlerMousedown(e);\n }\n\n private handlerMousedown(e: IEvent) {\n const [width, height, top, left] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const [imageWidth, imageHeight, imageTop, imageLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n switch (this.moveState()) {\n case 'image':\n this.imageContainer().nativeElement.classList.add('cursor-grabbing');\n break;\n case 'clip':\n if (width === imageWidth && height === imageHeight) {\n return;\n }\n this.cropArea().nativeElement.classList.add('cursor-grabbing');\n break;\n\n default:\n break;\n }\n\n this.startMouseDim.set({\n clientX: e.clientX,\n clientY: e.clientY,\n width: width,\n height: height,\n top: top,\n left: left,\n imageTop: imageTop,\n imageLeft: imageLeft,\n imageWidth: imageWidth,\n imageHeight: imageHeight,\n });\n this.ratioValue.set(this.getCropRatioValue());\n }\n\n private moveImage(e: IEvent) {\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = e.clientX - this.startMouseDim().clientX;\n const imgTop = this.startMouseDim().imageTop + momentY;\n const imgLeft = this.startMouseDim().imageLeft + momentX;\n const top = this.startMouseDim().top + momentY;\n const left = this.startMouseDim().left + momentX;\n\n this.setStylesElements(this.imageOrigin(), { top: imgTop, left: imgLeft });\n this.setStylesElements(this.imageClip(), { top: imgTop, left: imgLeft });\n this.setStylesElements(this.cropArea(), { top, left });\n this.setCirclePosition({ top: imgTop, left: imgLeft, width: this.startMouseDim().imageWidth, height: this.startMouseDim().imageHeight });\n }\n\n private moveClipArea(e: IEvent) {\n const [imgWidth, imgHeight, imgTop, imgLeft] = getStylesOfElement<number>(this.imageClip().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const [cropWidth, cropHeight] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight']);\n const momentY = e.clientY - this.startMouseDim().clientY;\n const momentX = e.clientX - this.startMouseDim().clientX;\n let top = Math.max(imgTop, this.startMouseDim().top + momentY);\n let left = Math.max(imgLeft, this.startMouseDim().left + momentX);\n\n top = Math.min(top, imgTop + imgHeight - cropHeight);\n left = Math.min(left, imgLeft + imgWidth - cropWidth);\n\n this.setStylesElements(this.cropArea(), { top, left }, true);\n }\n\n private zoomImage(scale: number) {\n const [currWidth, currHeight, currTop, currLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const width = Math.max(currWidth * scale, 50);\n const height = (this.imageOrigin().nativeElement.offsetHeight * width) / this.imageOrigin().nativeElement.offsetWidth;\n\n // Calculate the center point of the current view\n const centerX = currLeft + currWidth / 2;\n const centerY = currTop + currHeight / 2;\n\n // Calculate new position to maintain center point\n const top = centerY - height / 2;\n const left = centerX - width / 2;\n\n // Get current crop area dimensions and position\n let [cropWidth, cropHeight] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight']);\n const [cropTop, cropLeft] = getStylesOfElement<number>(this.cropArea().nativeElement, ['style.top', 'style.left']);\n\n // Scale crop area dimensions proportionally\n cropWidth = cropWidth * scale;\n cropHeight = cropHeight * scale;\n\n // Calculate new crop area position relative to the image\n const cropTopNew = top + (cropTop - currTop) * scale;\n const cropLeftNew = left + (cropLeft - currLeft) * scale;\n\n // Ensure crop area stays within bounds\n const maxCropWidth = width;\n const maxCropHeight = height;\n const minWidth = 20;\n const minHeight = 20;\n\n cropWidth = Math.min(cropWidth, maxCropWidth);\n cropHeight = Math.min(cropHeight, maxCropHeight);\n cropWidth = Math.max(cropWidth, minWidth);\n cropHeight = Math.max(cropHeight, minHeight);\n\n this.ratioValue.set(this.getCropRatioValue());\n if (this.ratioValue()) {\n cropHeight = cropWidth / this.ratioValue();\n cropHeight = Math.min(cropHeight, maxCropHeight);\n cropHeight = Math.max(cropHeight, minHeight);\n cropWidth = cropHeight * this.ratioValue();\n }\n\n // Update clipping rectangle\n this.rectClip.update((rect) => {\n const rectTop = cropTopNew - top;\n const rectLeft = cropLeftNew - left;\n return {\n ...rect,\n top: rectTop,\n left: rectLeft,\n right: rectLeft + cropWidth,\n bottom: rectTop + cropHeight,\n };\n });\n\n const clip = `rect(${this.rectClip().top}px, ${this.rectClip().right}px, ${this.rectClip().bottom}px, ${this.rectClip().left}px)`;\n\n // Update all elements with new positions and dimensions\n this.setStylesElements(this.cropArea(), { top: cropTopNew, left: cropLeftNew, width: cropWidth, height: cropHeight });\n this.setStylesElements(this.imageOrigin(), { top, left, width, height });\n this.setCirclePosition({ top, left, width, height });\n this.setStylesElements(this.imageClip(), { clip, top, left, width, height });\n this.getRectClipImage();\n }\n\n protected handlerRotateImage(event: Event) {\n event.stopPropagation();\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n const [width, height] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight']);\n const originWidth = this.image.width;\n const originHeight = this.image.height;\n let top = parseInt(this.imageOrigin().nativeElement.style.top);\n let left = parseInt(this.imageOrigin().nativeElement.style.left);\n let newHeight = width;\n let newWidth = height;\n const ratio = newWidth / newHeight;\n\n canvas.height = originWidth;\n canvas.width = originHeight;\n ctx?.translate(originHeight / 2, originWidth / 2);\n ctx?.rotate(Math.PI / 2);\n ctx?.drawImage(this.image, -originWidth / 2, -originHeight / 2);\n const src = getDataUrl(canvas, this.mimetype(), this.image.src);\n\n this.imgSrc.set(src);\n newWidth = Math.max(newWidth, originHeight);\n newWidth = Math.min(newWidth, this.containerWidth());\n newHeight = newWidth / ratio;\n newHeight = Math.max(newHeight, originWidth);\n newHeight = Math.min(newHeight, this.containerHeight());\n newWidth = newHeight * ratio;\n top = top - (newHeight / 2 - height / 2);\n left = left - (newWidth / 2 - width / 2);\n this.setStylesElements(this.imageOrigin(), { src, top, left, width: newWidth, height: newHeight });\n this.setCirclePosition({ top, left, width: newWidth, height: newHeight });\n this.setStylesElements(this.imageClip(), { src, top, left, width: newWidth, height: newHeight });\n this.getOriginalImageSize(() => {\n this.cropSize.set({ width: this.originWidth(), height: this.originHeight() });\n this.updateOriginImageSize();\n });\n this.changedImage(true);\n };\n }\n\n protected getOriginalImageSize(callback?: () => void) {\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n this.originWidth.set(this.image.width);\n this.originHeight.set(this.image.height);\n if (callback) {\n return callback();\n }\n };\n }\n\n protected changedImage(status: boolean) {\n this.changed.set(status);\n }\n\n protected handlerFlipImage(event: Event, mode: 'horizontal' | 'vertical') {\n event.stopPropagation();\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const width = this.image.width;\n const height = this.image.height;\n\n canvas.height = height;\n canvas.width = width;\n if (ctx) {\n ctx.drawImage(this.image, 0, 0, width, height);\n if (mode === 'horizontal') {\n ctx.translate(width, 0);\n ctx.scale(-1, 1);\n }\n if (mode === 'vertical') {\n ctx.translate(0, height);\n ctx.scale(1, -1);\n }\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(this.image, 0, 0);\n }\n const dataUrl = getDataUrl(canvas, this.mimetype(), this.image.src);\n\n this.imgSrc.set(dataUrl);\n this.imageOrigin().nativeElement.src = dataUrl;\n this.imageClip().nativeElement.src = dataUrl;\n this.updateCropAreaPos();\n this.updateRectClipPos();\n this.changedImage(true);\n };\n }\n\n protected handlerRestoreImage(event: Event) {\n event.stopPropagation();\n this.imgSrc.set(this.dataUrlOrigin());\n this.dragGridCrop.set(false);\n this.getOriginalImageSize(() => {\n this.updateOriginImageSize();\n this.changedImage(false);\n this.cropRatioItemSelected.set('');\n this.updateCropAreaPos();\n this.updateRectClipPos();\n });\n }\n\n private cropImage(): Promise<string> {\n return new Promise((resolve) => {\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n const originWidth = this.image.width;\n const width = parseInt(this.imageClip().nativeElement.offsetWidth);\n const height = parseInt(this.imageClip().nativeElement.offsetHeight);\n const scale = originWidth / width;\n const rectClip = this.getRectClipImage();\n const cropRect = getCropRectImage(rectClip, width, height, scale);\n\n canvas.height = cropRect.height;\n canvas.width = cropRect.width;\n this.originHeight.set(canvas.height);\n this.originWidth.set(canvas.width);\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(this.image, cropRect.left, cropRect.top, cropRect.width, cropRect.height, 0, 0, cropRect.width, cropRect.height);\n }\n const dataUrl = getDataUrl(canvas, this.mimetype(), this.image.src);\n\n this.changedImage(true);\n resolve(dataUrl);\n };\n });\n }\n\n protected async handlerSaveFile(event: Event, modeSave: TYPE_MODE_SAVE) {\n event.stopPropagation();\n const dataUrl = await this.cropImage();\n const file = convertBase64ToBlob(dataUrl);\n\n this.outSaveFile.emit({ file: file, url: dataUrl, mode: modeSave });\n }\n\n protected async handlerClose(event: Event): Promise<void> {\n event.stopPropagation();\n this.outClose.emit({ isClickButtonClose: true });\n }\n\n protected handlerSelectCropRatioItem(event: Event, key: string) {\n event.stopPropagation();\n this.cropRatioItemSelected.set(key);\n this.changed.set(true);\n this.dragGridCrop.set(true);\n this.updateOriginImageSize();\n }\n\n protected handlerResize(event: Event) {\n event.stopPropagation();\n if (this.resizeComponentRef) {\n return;\n }\n this.resizeComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsImageEditorResizeComponent);\n const instance = this.resizeComponentRef.instance;\n const subs = instance.outClose.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.dynamicComponentService.remove(this.resizeComponentRef);\n this.resizeComponentRef = undefined;\n subs.unsubscribe();\n });\n\n instance.src = this.imgSrc();\n instance.mimetype = this.mimetype();\n instance.zIndex = this.zIndex();\n subs.add(\n instance.outSave.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n this.resizeData.set(event);\n this.saveResize();\n })\n );\n instance.resizeData = { ratio: 100, width: this.originWidth(), height: this.originHeight() };\n instance.originWidth = this.originWidth();\n instance.originHeight = this.originHeight();\n this.dynamicComponentService.addToBody(this.resizeComponentRef);\n }\n\n protected saveResize() {\n this.image.src = this.imgSrc();\n this.image.onload = () => {\n const canvas = document.createElement('canvas');\n\n canvas.width = this.resizeData().width;\n canvas.height = this.resizeData().height;\n const ctx = canvas.getContext('2d');\n\n if (ctx) {\n ctx.drawImage(this.image, 0, 0, canvas.width, canvas.height);\n }\n const src = getDataUrl(canvas, this.mimetype(), this.image.src);\n const [currWidth, currHeight, currTop, currLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n const ratio = currWidth / currHeight;\n let newWidth = Math.min(this.resizeData().width, this.containerWidth());\n let newHeight = newWidth / ratio;\n\n newHeight = Math.min(this.resizeData().height, this.containerHeight());\n newWidth = newHeight * ratio;\n Math.min(this.resizeData().height, this.containerHeight());\n const top = currTop + (currHeight - newHeight) / 2;\n const left = currLeft + (currWidth - newWidth) / 2;\n const movementY = currTop - top;\n const movementX = currLeft - left;\n\n this.rectClip.update((rect) => {\n const rectTop = rect.top + movementY;\n const rectLeft = rect.left + movementX;\n return {\n ...rect,\n top: rectTop,\n left: rectLeft,\n right: rectLeft + newWidth,\n bottom: rectTop + newHeight,\n };\n });\n const clip = `rect(${this.rectClip().top}px, ${this.rectClip().right}px, ${this.rectClip().bottom}px, ${this.rectClip().left}px)`;\n\n this.setStylesElements(this.imageOrigin(), { src, top, left, width: newWidth, height: newHeight });\n this.setCirclePosition({ top, left, width: newWidth, height: newHeight });\n this.setStylesElements(this.imageClip(), { src, clip, top, left, width: newWidth, height: newHeight });\n this.imgSrc.set(src);\n this.originWidth.set(this.resizeData().width);\n this.originHeight.set(this.resizeData().height);\n this.updateCropAreaPos();\n this.updateRectClipPos();\n this.changedImage(true);\n };\n }\n\n protected handlerCropWidth() {\n this.processCropWidthOrHeight('width');\n }\n\n protected handlerCropHeight() {\n this.processCropWidthOrHeight('height');\n }\n\n private processCropWidthOrHeight(cropBy: 'width' | 'height') {\n this.ratioValue.set(this.getCropRatioValue());\n const [currImgWidth, currImgHeight, currImgTop, currImgLeft] = getStylesOfElement<number>(this.imageOrigin().nativeElement, ['offsetWidth', 'offsetHeight', 'style.top', 'style.left']);\n let [cropWidth, cropHeight] = getStylesOfElement<number>(this.cropArea().nativeElement, ['offsetWidth', 'offsetHeight']);\n const [cropTop, cropLeft] = getStylesOfElement<number>(this.cropArea().nativeElement, ['style.top', 'style.left']);\n const maxCropWidth = currImgLeft + currImgWidth - cropLeft;\n const maxCropHeight = currImgHeight + currImgTop - cropTop;\n const ratio = this.originWidth() / currImgWidth;\n let cropValue = get(this.cropSize, cropBy) / ratio;\n\n cropValue = Math.min(cropValue, cropBy === 'width' ? maxCropWidth : maxCropHeight);\n cropValue = Math.max(1, cropValue);\n if (this.ratioValue()) {\n if (cropBy === 'width') {\n cropHeight = cropValue / this.ratioValue();\n cropHeight = Math.min(cropHeight, maxCropHeight);\n cropValue = cropHeight * this.ratioValue();\n this.cropSize.update((cropSize) => ({ ...cropSize, height: Math.round(cropHeight * ratio) }));\n this.cropArea().nativeElement.style.height = `${cropHeight}px`;\n }\n if (cropBy === 'height') {\n cropWidth = cropValue * this.ratioValue();\n cropWidth = Math.min(cropWidth, maxCropWidth);\n cropValue = cropWidth / this.ratioValue();\n this.cropSize.update((cropSize) => ({ ...cropSize, width: Math.round(cropWidth * ratio) }));\n this.cropArea().nativeElement.style.width = `${cropWidth}px`;\n }\n }\n this.cropSize.update((cropSize) => ({ ...cropSize, [cropBy]: Math.round(cropValue * ratio) }));\n this.cropArea().nativeElement.style[cropBy] = `${cropValue}px`;\n const imageRect = this.imageClip().nativeElement.getBoundingClientRect();\n const cropRect = this.cropArea().nativeElement.getBoundingClientRect();\n const { width, height } = cropRect;\n const left = cropRect.left - imageRect.left;\n const top = cropRect.top - imageRect.top;\n const right = left + width;\n const bottom = top + height;\n\n this.imageClip().nativeElement.style.clip = `rect(${top}px, ${right}px, ${bottom}px, ${left}px)`;\n }\n\n private setStylesElements(element: ElementRef, styles: IStyles, isUpdateRectClipPos?: boolean) {\n Object.keys(styles).forEach((key) => {\n const value = get(styles, key as keyof IStyles);\n if (isNil(value)) {\n return;\n }\n set(element.nativeElement.style, key, typeof value === 'number' ? `${value}px` : value);\n });\n if (isUpdateRectClipPos) {\n this.updateRectClipPos();\n }\n }\n\n ngOnDestroy(): void {\n this.dynamicComponentService.remove(this.resizeComponentRef);\n }\n}\n","<libs_ui-components-modal\n [width]=\"'calc(100vw - 400px)'\"\n [height]=\"'calc(100vh - 100px)'\"\n [minWidth]=\"'1200px'\"\n [headerConfig]=\"{ ignoreHeaderTheme: true, removeButtonClose: true }\"\n [bodyConfig]=\"{ classInclude: '!p-0', scrollOverlayOptions: { scrollX: 'hidden', scrollY: 'hidden' } }\"\n [footerConfig]=\"{ hidden: true }\"\n [zIndex]=\"zIndex()\"\n [buttonsFooter]=\"[]\"\n [mode]=\"'center'\">\n <div class=\"libs-ui-modal-header-custom w-full flex items-center justify-between\">\n <div class=\"w-full relative mx-[24px] h-[16px]\">\n <div class=\"flex w-full libs-ui-font-h4s absolute\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ 'i18n_edit_file_name' | translate: { file_name: nameFile() } }}\n </libs_ui-components-popover>\n </div>\n </div>\n <div class=\"flex items-center\">\n @if (modeShowButton() === 'save-file') {\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [label]=\"'i18n_cancel'\"\n [disable]=\"loading() || loadingImage()\"\n [classInclude]=\"'py-[6px] px-[12px] mr-[16px]'\"\n (outClick)=\"handlerClose($event)\" />\n\n <libs_ui-components-buttons-button\n class=\"mr-[24px]\"\n [label]=\"'i18n_save'\"\n [disable]=\"loading() || loadingImage()\"\n [classInclude]=\"'py-[6px] px-[12px]'\"\n (outClick)=\"handlerSaveFile($event, 'save-file')\" />\n } @else {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_save_to_new_file'\"\n [type]=\"'button-outline'\"\n [classInclude]=\"'mx-[16px] py-[6px] px-[12px]'\"\n [disable]=\"loading() || loadingImage() || !changed()\"\n (outClick)=\"handlerSaveFile($event, 'save-api-as-new-file')\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [label]=\"'i18n_save'\"\n [classInclude]=\"'py-[6px] px-[12px]'\"\n [disable]=\"loading() || loadingImage() || !changed()\"\n (outClick)=\"handlerSaveFile($event, 'save-api')\" />\n <div class=\"h-[12px] libs-ui-border-left-general mx-[16px]\"></div>\n <libs_ui-components-buttons-button\n class=\"mr-[24px]\"\n [classInclude]=\"'p-[6px]'\"\n [type]=\"'button-third-hover-danger'\"\n [iconOnlyType]=\"true\"\n [disable]=\"loading()\"\n [popover]=\"{ config: { content: 'i18n_exit_edit_mode', zIndex: zIndex() } }\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClose($event)\" />\n }\n </div>\n </div>\n <div class=\"libs-ui-modal-body-custom h-full w-full flex\">\n <div\n #imageEditorContainer\n class=\"relative w-full h-full bg-[#e6e7ea] border-radius-bottom-left-8px p-[32px] libs-ui-input-image-editor-container-left\">\n @if (loadingImage()) {\n <div class=\"absolute h-full w-full bg-[#e6e7ea] top-0 left-0 z-[5]\">\n <libs_ui-components-spinner [size]=\"'medium'\" />\n </div>\n }\n <div class=\"absolute h-[32px] w-[calc(100%-64px)] bg-[#e6e7eab8] top-0 left-[32px] z-[1]\"></div>\n <div class=\"absolute w-[32px] h-full bg-[#e6e7eab8] left-0 top-0 z-[1] rounded-bl-[8px]\"></div>\n <div class=\"absolute w-[32px] h-full bg-[#e6e7eab8] right-0 top-0 z-[1]\"></div>\n <div class=\"absolute h-[32px] w-[calc(100%-64px)] bg-[#e6e7eab8] bottom-0 left-[32px] z-[1]\"></div>\n <div\n #imageContainer\n class=\"relative w-full h-full rounded-bl-[8px] min-h-0\">\n <div\n #circleTL\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <div\n #circleTR\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <div\n #circleBL\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <div\n #circleBR\n class=\"absolute z-[1]\"\n [class.hidden]=\"!dragGridCrop()\"\n [class.flex]=\"dragGridCrop()\">\n <ng-template *ngTemplateOutlet=\"svgCircle\" />\n </div>\n <img\n #imageOrigin\n class=\"absolute border-[4px] border-[#8e61ee] rounded-[4px] top-[-1000px] left-[-1000px]\"\n loading=\"lazy\"\n [src]=\"imgSrc()\"\n (load)=\"handlerImageLoaded()\"\n (error)=\"handlerImageError($event)\" />\n <img\n #imageClip\n class=\"absolute z-[1] top-[-1000px] left-[-1000px]\"\n loading=\"lazy\"\n [src]=\"imgSrc()\"\n (error)=\"handlerImageError($event)\" />\n <div class=\"absolute top-0 left-0 right-0 bottom-0 bg-[#e6e7eab8]\"></div>\n <div\n #cropArea\n class=\"absolute z-[2] border-[4px] border-[#8e61ee] rounded-[4px]\">\n <div class=\"relative w-full h-full\">\n <div\n #cropTL\n class=\"absolute z-[2] left-[-18px] top-[-17px] cursor-nwse-resize\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropBL\n class=\"absolute z-[2] left-[-17px] bottom-[-18px] cursor-nesw-resize rotate-[270deg]\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropTR\n class=\"absolute z-[2] right-[-17px] top-[-17px] cursor-nesw-resize rotate-[90deg]\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropBR\n class=\"absolute z-[2] right-[-18px] bottom-[-17px] cursor-nwse-resize rotate-[180deg]\">\n <ng-template *ngTemplateOutlet=\"svgArrow\" />\n </div>\n <div\n #cropLineVL\n class=\"absolute z-[1] w-[12px] left-[-6px] top-0 bottom-0 cursor-ew-resize\"></div>\n <div\n #cropLineVR\n class=\"absolute z-[1] w-[12px] right-[-6px] top-0 bottom-0 cursor-ew-resize\"></div>\n <div\n #cropLineHT\n class=\"absolute z-[1] h-[12px] left-0 top-[-6px] right-0 cursor-ns-resize\"></div>\n <div\n #cropLineHB\n class=\"absolute z-[1] h-[12px] left-0 right-0 bottom-[-6px] cursor-ns-resize\"></div>\n\n <div class=\"bg-white absolute h-[1px] top-0 left-0 right-0\"></div>\n <div class=\"bg-white absolute h-[1px] bottom-0 left-0 right-0\"></div>\n <div class=\"bg-white absolute w-[1px] top-0 left-0 bottom-0\"></div>\n <div class=\"bg-white absolute w-[1px] top-0 bottom-0 right-0\"></div>\n <div class=\"bg-white absolute h-[2px] top-[33%] left-0 right-0\"></div>\n <div class=\"bg-white absolute h-[2px] top-[66%] left-0 right-0\"></div>\n <div class=\"bg-white absolute w-[2px] top-0 bottom-0 left-[33%]\"></div>\n <div class=\"bg-white absolute w-[2px] top-0 bottom-0 left-[66%]\"></div>\n </div>\n </div>\n </div>\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n <div class=\"w-[320px] shrink-0 p-[16px] bg-[#ffffff] rounded-br-[8px] z-[2] libs-ui-input-image-editor-container-right\">\n <div class=\"flex items-center justify-between mb-[16px]\">\n <div class=\"libs-ui-font-h4m\">{{ 'i18n_cutting_ratio' | translate }}</div>\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [type]=\"'button-third'\"\n [classIconLeft]=\"'libs-ui-icon-refresh'\"\n [classInclude]=\"'p-[6px] mr-[8px]'\"\n [popover]=\"{ config: { content: 'i18n_restore_the_original_state', zIndex: zIndex() } }\"\n [disable]=\"loading() || loadingImage() || !changed()\"\n (outClick)=\"handlerRestoreImage($event)\" />\n </div>\n <div class=\"mb-[16px] libs-ui-image-editor-edit-display-grid-gap-16\">\n @for (item of cropRatioItems(); track item.key) {\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage() || requiredCropFollowRatio()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"item.icon + ' !text-[20px]'\"\n [isActive]=\"item.key === cropRatioItemSelected()\"\n (outClick)=\"handlerSelectCropRatioItem($event, item.key)\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ (item.key === 'free' ? 'i18n_custom' : item.key) | translate }}\n </div>\n </div>\n }\n </div>\n <div class=\"mb-[16px] flex\">\n <libs_ui-components-inputs-valid\n class=\"mr-[16px]\"\n [dataType]=\"'int'\"\n [labelConfig]=\"{ labelLeft: 'i18n_width', classInclude: 'mb-[4px]', labelLeftClass: 'libs-ui-font-h7r' }\"\n [fieldNameBind]=\"'width'\"\n [(item)]=\"cropSize\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"originWidth()\"\n [disable]=\"loading() || loadingImage()\"\n (outValueChange)=\"handlerCropWidth()\" />\n <libs_ui-components-inputs-valid\n [dataType]=\"'int'\"\n [labelConfig]=\"{ labelLeft: 'i18n_length', classInclude: 'mb-[4px]', labelLeftClass: 'libs-ui-font-h7r' }\"\n [fieldNameBind]=\"'height'\"\n [(item)]=\"cropSize\"\n [unitsRight]=\"[{ id: 'px', label: 'px' }]\"\n [keySelectedUnitRight]=\"'px'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"originHeight()\"\n [disable]=\"loading() || loadingImage()\"\n (outValueChange)=\"handlerCropHeight()\" />\n </div>\n <div class=\"libs-ui-font-h4m mb-[16px]\">{{ 'i18n_rotate_photos' | translate }}</div>\n <div class=\"flex libs-ui-image-editor-edit-display-grid-gap-16\">\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-rotate-image-outline !text-[20px]'\"\n (outClick)=\"handlerRotateImage($event)\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_rotate_ninety_degrees' | translate }}\n </div>\n </div>\n\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-flip-vertical !text-[20px]'\"\n (outClick)=\"handlerFlipImage($event, 'vertical')\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_vertical_flip' | translate }}\n </div>\n </div>\n\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-flip-horizontal !text-[20px]'\"\n (outClick)=\"handlerFlipImage($event, 'horizontal')\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_horizontal_flip' | translate }}\n </div>\n </div>\n\n <div class=\"flex flex-col items-center\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [sizeButton]=\"'large'\"\n [disable]=\"loading() || loadingImage()\"\n [type]=\"'button-outline'\"\n [classIconLeft]=\"'libs-ui-icon-scale !text-[20px]'\"\n (outClick)=\"handlerResize($event)\" />\n <div class=\"libs-ui-font-h6r text-[#6a7383] mt-[4px]\">\n {{ 'i18n_resize' | translate }}\n </div>\n </div>\n </div>\n </div>\n </div>\n</libs_ui-components-modal>\n\n<ng-template #svgArrow>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 40 40\"\n fill=\"none\">\n <path\n d=\"M33.6987 14.6969L18.3309 14.6969C16.516 14.6969 15.0311 16.1818 15.0311 17.9967L15.0311 33.3645\"\n stroke=\"white\"\n stroke-width=\"5.83333\"\n stroke-miterlimit=\"10\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n</ng-template>\n\n<ng-template #svgCircle>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"15\"\n height=\"15\"\n viewBox=\"0 0 15 15\"\n fill=\"none\">\n <circle\n cx=\"7.5\"\n cy=\"7.5\"\n r=\"7.5\"\n fill=\"white\" />\n </svg>\n</ng-template>\n","import { Component, ElementRef, ViewChild } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsImageEditorComponent } from '../image-editor.component';\nimport { ISaveFile } from '../interfaces/image-editor.interface';\nimport { IImageEditorFunctionControlEvent } from '../interfaces/function-control-event.interface';\n\n@Component({\n selector: 'lib-image-editor-demo',\n standalone: true,\n imports: [LibsUiComponentsButtonsButtonComponent, LibsUiComponentsImageEditorComponent],\n templateUrl: './image-editor-demo.component.html',\n styleUrl: './image-editor-demo.component.scss',\n})\nexport class LibsUiComponentsImageEditorDemoComponent {\n @ViewChild('imageFileInput') imageFileInput!: ElementRef<HTMLInputElement>;\n\n imageSource = '';\n showEditor = false;\n editedImageUrl = '';\n selectedFile: File | null = null;\n imageName = '';\n\n // Documentation data as regular properties\n inputsDoc = [\n { name: 'imgSrc', type: 'string', default: 'Bắt buộc', description: 'Đường dẫn hoặc base64 của hình ảnh cần chỉnh sửa' },\n { name: 'originUrl', type: 'string', default: '-', description: 'URL gốc của hình ảnh' },\n { name: 'nameFile', type: 'string', default: '-', description: 'Tên file khi lưu' },\n { name: 'modeShowButton', type: \"'save-file' | 'save-api'\", default: \"'save-file'\", description: 'Chế độ nút lưu' },\n { name: 'mimetype', type: 'string', default: '-', description: 'Định dạng của hình ảnh' },\n { name: 'zIndex', type: 'number', default: '1200', description: 'z-index của component' },\n { name: 'hasZoom', type: 'boolean', default: 'false', description: 'Cho phép phóng to/thu nhỏ hình ảnh' },\n { name: 'aspectRatio', type: 'IAspectRatio', default: '-', description: 'Tỷ lệ khung hình mặc định' },\n { name: 'requiredCropFollowRatio', type: 'boolean', default: 'false', description: 'Bắt buộc cắt theo tỷ lệ đã chọn' },\n ];\n\n outputsDoc = [\n { name: 'outClose', type: '{isClickButtonClose: boolean}', description: 'Sự kiện khi đóng trình chỉnh sửa' },\n { name: 'outSaveFile', type: 'ISaveFile', description: 'Sự kiện khi lưu file' },\n { name: 'outFunctionsControl', type: 'IImageEditorFunctionControlEvent', description: 'Sự kiện để kiểm soát các chức năng' },\n ];\n\n interfacesDoc = [\n {\n name: 'ISaveFile',\n code: \"export interface ISaveFile {\\n file: Blob;\\n url: string;\\n mode: 'save-file' | 'save-api' | 'save-api-as-new-file';\\n}\",\n description: 'Interface định nghĩa dữ liệu khi lưu file.',\n },\n {\n name: 'IImageEditorFunctionControlEvent',\n code: 'export interface IImageEditorFunctionControlEvent {\\n cropImage: () => Promise<string>;\\n setLoadingState: (loading: boolean) => void;\\n}',\n description: 'Interface định nghĩa các hàm điều khiển có thể được gọi từ bên ngoài component.',\n },\n {\n name: 'IAspectRatio',\n code: 'export interface IAspectRatio {\\n key: string;\\n value: number;\\n}',\n description: 'Interface định nghĩa tỷ lệ khung hình.',\n },\n ];\n\n features = [\n {\n id: 1,\n icon: '✂️',\n title: 'Cắt ảnh',\n description: 'Cắt hình ảnh theo khu vực tùy chỉnh hoặc dựa trên tỷ lệ định trước (1:1, 4:3, 16:9, v.v.).',\n },\n {\n id: 2,\n icon: '🔄',\n title: 'Xoay và lật',\n description: 'Xoay hình ảnh theo các góc khác nhau hoặc lật theo chiều ngang/dọc.',\n },\n {\n id: 3,\n icon: '📏',\n title: 'Thay đổi kích thước',\n description: 'Thay đổi kích thước hình ảnh theo tỷ lệ phần trăm hoặc kích thước cụ thể.',\n },\n {\n id: 4,\n icon: '💾',\n title: 'Nhiều chế độ lưu',\n description: 'Hỗ trợ nhiều chế độ lưu: tải xuống trực tiếp hoặc gửi đến API.',\n },\n {\n id: 5,\n icon: '🔍',\n title: 'Phóng to/thu nhỏ',\n description: 'Tính năng phóng to/thu nhỏ để xem chi tiết hình ảnh khi cần thiết.',\n },\n ];\n\n codeExamples = [\n {\n id: 1,\n title: 'Sử dụng cơ bản',\n code: `import { Component } from '@angular/core';\\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\\n\\n@Component({\\n selector: 'app-example',\\n standalone: true,\\n imports: [LibsUiComponentsImageEditorComponent],\\n template: \\`\\n <libs_ui-components-image_editor\\n [(imgSrc)]=\"imageSource\"\\n [modeShowButton]=\"'save-file'\"\\n [nameFile]=\"'image.jpg'\"\\n (outSaveFile)=\"onSaveFile($event)\"\\n (outClose)=\"onClose($event)\">\\n </libs_ui-components-image_editor>\\n \\`\\n})\\nexport class ExampleComponent {\\n imageSource = 'https://example.com/path/to/image.jpg';\\n\\n onSaveFile(data: {file: Blob, url: string, mode: string}) {\\n console.log('File đã được lưu:', data);\\n }\\n\\n onClose(data: {isClickButtonClose: boolean}) {\\n console.log('Đã đóng trình chỉnh sửa ảnh');\\n }\\n}`,\n },\n {\n id: 2,\n title: 'Sử dụng với tỷ lệ cố định',\n code: `import { Component } from '@angular/core';\\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\\nimport { IAspectRatio } from '@libs-ui/interfaces-types';\\n\\n@Component({\\n selector: 'app-example',\\n standalone: true,\\n imports: [LibsUiComponentsImageEditorComponent],\\n template: \\`\\n <libs_ui-components-image_editor\\n [(imgSrc)]=\"imageSource\"\\n [aspectRatio]=\"aspectRatio\"\\n [requiredCropFollowRatio]=\"true\"\\n (outSaveFile)=\"onSaveFile($event)\">\\n </libs_ui-components-image_editor>\\n \\`\\n})\\nexport class ExampleComponent {\\n imageSource = 'https://example.com/path/to/image.jpg';\\n aspectRatio: IAspectRatio = {\\n key: '1:1',\\n value: 1\\n };\\n\\n onSaveFile(data: any) {\\n console.log('Đã lưu hình ảnh với tỷ lệ 1:1');\\n }\\n}`,\n },\n {\n id: 3,\n title: 'Sử dụng với phần điều khiển bên ngoài',\n code: `import { Component, ViewChild } from '@angular/core';\\nimport { LibsUiComponentsImageEditorComponent, IImageEditorFunctionControlEvent } from '@libs-ui/components-image-editor';\\n\\n@Component({\\n selector: 'app-example',\\n standalone: true,\\n imports: [LibsUiComponentsImageEditorComponent],\\n template: \\`\\n <button (click)=\"cropAndSave()\">Cắt và lưu ngay</button>\\n <libs_ui-components-image_editor\\n [(imgSrc)]=\"imageSource\"\\n (outFunctionsControl)=\"onFunctionsControl($event)\">\\n </libs_ui-components-image_editor>\\n \\`\\n})\\nexport class ExampleComponent {\\n imageSource = 'https://example.com/path/to/image.jpg';\\n editorFunctions!: IImageEditorFunctionControlEvent;\\n\\n onFunctionsControl(event: IImageEditorFunctionControlEvent) {\\n this.editorFunctions = event;\\n }\\n\\n async cropAndSave() {\\n if (this.editorFunctions) {\\n this.editorFunctions.setLoadingState(true);\\n try {\\n const dataUrl = await this.editorFunctions.cropImage();\\n console.log('Hình ảnh đã được cắt:', dataUrl);\\n } finally {\\n this.editorFunctions.setLoadingState(false);\\n }\\n }\\n }\\n}`,\n },\n ];\n\n copyToClipboard(text: string): void {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n alert('Đã sao chép vào clipboard');\n })\n .catch((err) => {\n console.error('Không thể sao chép: ', err);\n });\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this.selectedFile = input.files[0];\n this.imageName = this.selectedFile.name;\n console.log('File selected:', this.selectedFile.name);\n }\n }\n\n uploadAndEdit(): void {\n if (!this.selectedFile) {\n alert('Vui lòng chọn một file hình ảnh trước');\n return;\n }\n\n const reader = new FileReader();\n reader.onload = (e: ProgressEvent<FileReader>) => {\n if (e.target?.result) {\n this.imageSource = e.target.result as string;\n this.showEditor = true;\n }\n };\n reader.readAsDataURL(this.selectedFile);\n }\n\n onSaveImage(data: ISaveFile): void {\n console.log('Image saved:', data);\n this.editedImageUrl = data.url;\n this.showEditor = false;\n }\n\n onCloseEditor(data: { isClickButtonClose: boolean }): void {\n console.log('Editor closed:', data);\n this.showEditor = false;\n }\n\n downloadImage(): void {\n if (this.editedImageUrl) {\n const link = document.createElement('a');\n link.href = this.editedImageUrl;\n link.download = this.imageName || 'edited-image.jpg';\n link.click();\n }\n }\n\n handleFunctionControl(event: IImageEditorFunctionControlEvent) {\n console.log(event);\n }\n}\n","<div class=\"max-w-6xl mx-auto p-5 font-sans text-gray-800\">\n <header class=\"text-center py-10 bg-white rounded-lg mb-8 shadow-sm\">\n <h1 class=\"text-4xl font-bold text-gray-800 mb-2\">Demo Trình Chỉnh Sửa Hình Ảnh</h1>\n <p class=\"text-xl text-gray-500\">Thư viện component cho Angular để chỉnh sửa hình ảnh</p>\n </header>\n\n <main>\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Giới thiệu</h2>\n <p>\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">@libs-ui/components-image-editor</code>\n là một component Angular mạnh mẽ cho phép người dùng thực hiện các thao tác chỉnh sửa hình ảnh như cắt, thay đổi kích thước, xoay, lật và áp dụng tỷ lệ cố định.\n </p>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Cài đặt</h2>\n\n <div class=\"mb-6\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-3\">Yêu cầu</h3>\n <ul class=\"list-disc pl-5 space-y-2 text-gray-600\">\n <li>\n <span class=\"font-semibold\">Angular</span>\n : 18.0.0 trở lên\n </li>\n <li>\n <span class=\"font-semibold\">Tailwind CSS</span>\n : 3.3.0 trở lên\n </li>\n </ul>\n </div>\n\n <p class=\"mb-4\">Để cài đặt thư viện, sử dụng npm hoặc yarn:</p>\n\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg mb-6\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>npm install @libs-ui/components-image-editor</code></pre>\n <button\n class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors\"\n (click)=\"copyToClipboard('npm install @libs-ui/components-image-editor')\">\n Sao chép\n </button>\n </div>\n\n <p class=\"mb-4\">Hoặc với yarn:</p>\n\n <div class=\"flex items-center bg-gray-100 p-4 rounded-lg mb-6\">\n <pre class=\"flex-1 text-sm overflow-x-auto\"><code>yarn add @libs-ui/components-image-editor</code></pre>\n <button\n class=\"ml-4 px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors\"\n (click)=\"copyToClipboard('yarn add @libs-ui/components-image-editor')\">\n Sao chép\n </button>\n </div>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Demo trực tiếp</h2>\n <div>\n <p class=\"mb-4\">Tải lên hình ảnh và chỉnh sửa ngay trên trình duyệt:</p>\n <div class=\"flex flex-wrap items-center gap-4 mb-8\">\n <input\n type=\"file\"\n #imageFileInput\n accept=\"image/*\"\n class=\"border border-gray-300 rounded px-3 py-2\"\n (change)=\"onFileSelected($event)\" />\n <libs_ui-components-buttons-button\n label=\"Tải lên và chỉnh sửa\"\n (click)=\"uploadAndEdit()\"></libs_ui-components-buttons-button>\n </div>\n\n @if (editedImageUrl) {\n <div class=\"mt-8 p-6 bg-gray-50 rounded-lg\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Kết quả</h3>\n <div class=\"max-w-xl mx-auto mb-4 border border-gray-200 rounded-lg overflow-hidden shadow-md\">\n <img\n [src]=\"editedImageUrl\"\n alt=\"Hình ảnh đã chỉnh sửa\"\n class=\"w-full h-auto\" />\n </div>\n <div class=\"flex justify-center\">\n <libs_ui-components-buttons-button\n label=\"Tải xuống hình ảnh\"\n (click)=\"downloadImage()\"></libs_ui-components-buttons-button>\n </div>\n </div>\n }\n </div>\n </section>\n\n @if (showEditor) {\n <div class=\"fixed inset-0 z-50\">\n <libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [nameFile]=\"imageName || 'demo-image.jpg'\"\n [modeShowButton]=\"'save-file'\"\n [hasZoom]=\"true\"\n (outSaveFile)=\"onSaveImage($event)\"\n (outClose)=\"onCloseEditor($event)\"\n (outFunctionsControl)=\"handleFunctionControl($event)\" />\n </div>\n }\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Cách sử dụng</h2>\n\n <div class=\"mb-8\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Cách 1: Sử dụng file HTML riêng biệt</h3>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-4\">\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">HTML (example.component.html)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code><libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [nameFile]=\"'image.jpg'\"\n [modeShowButton]=\"'save-file'\"\n (outSaveFile)=\"onSaveFile($event)\"\n (outClose)=\"onClose($event)\">\n</libs_ui-components-image_editor></code></pre>\n </div>\n\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">TypeScript (example.component.ts)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code>import { Component } from '@angular/core';\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\n\n@Component({\n selector: 'app-example',\n standalone: true,\n imports: [LibsUiComponentsImageEditorComponent],\n templateUrl: './example.component.html'\n})\nexport class ExampleComponent {\n imageSource = 'https://example.com/path/to/image.jpg';\n\n onSaveFile(data: {file: Blob, url: string, mode: string}) {\n console.log('File đã được lưu:', data);\n }\n\n onClose(data: {isClickButtonClose: boolean}) {\n console.log('Đã đóng trình chỉnh sửa ảnh');\n }\n}</code></pre>\n </div>\n </div>\n </div>\n\n <div class=\"mb-8\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Cách 2: Với trình chỉnh sửa có thể đóng/mở</h3>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-4\">\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">HTML (toggle-editor.component.html)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code><button (click)=\"openEditor()\" class=\"px-4 py-2 bg-blue-500 text-white rounded\">\n Mở trình chỉnh sửa ảnh\n</button>\n\n@if (showEditor) {\n <libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [nameFile]=\"'my-image.jpg'\"\n (outSaveFile)=\"onSaveFile($event)\"\n (outClose)=\"onCloseEditor($event)\">\n </libs_ui-components-image_editor>\n}\n\n@if (editedImageUrl) {\n <div class=\"mt-4\">\n <h3 class=\"text-lg font-semibold\">Hình ảnh đã chỉnh sửa:</h3>\n <img [src]=\"editedImageUrl\" alt=\"Hình ảnh đã chỉnh sửa\" class=\"mt-2 max-w-full h-auto\" />\n </div>\n}</code></pre>\n </div>\n\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">TypeScript (toggle-editor.component.ts)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code>import { Component } from '@angular/core';\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\nimport { ISaveFile } from '@libs-ui/components-image-editor';\n\n@Component({\n selector: 'app-toggle-editor',\n standalone: true,\n imports: [LibsUiComponentsImageEditorComponent],\n templateUrl: './toggle-editor.component.html'\n})\nexport class ToggleEditorComponent {\n imageSource = 'https://example.com/path/to/image.jpg';\n showEditor = false;\n editedImageUrl = '';\n\n openEditor() {\n this.showEditor = true;\n }\n\n onSaveFile(data: ISaveFile) {\n this.editedImageUrl = data.url;\n this.showEditor = false;\n console.log('Đã lưu file:', data.file);\n }\n\n onCloseEditor(data: {isClickButtonClose: boolean}) {\n this.showEditor = false;\n }\n}</code></pre>\n </div>\n </div>\n </div>\n\n <div class=\"mb-8\">\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Cách 3: Với tỷ lệ khung hình cố định</h3>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-4\">\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">HTML (fixed-ratio.component.html)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code><libs_ui-components-image_editor\n [(imgSrc)]=\"imageSource\"\n [aspectRatio]=\"aspectRatio\"\n [requiredCropFollowRatio]=\"true\"\n (outSaveFile)=\"onSaveFile($event)\">\n</libs_ui-components-image_editor></code></pre>\n </div>\n\n <div>\n <h4 class=\"font-semibold mb-2 text-gray-700\">TypeScript (fixed-ratio.component.ts)</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm\"><code>import { Component } from '@angular/core';\nimport { LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\nimport { IAspectRatio } from '@libs-ui/interfaces-types';\n\n@Component({\n selector: 'app-fixed-ratio',\n standalone: true,\n imports: [LibsUiComponentsImageEditorComponent],\n templateUrl: './fixed-ratio.component.html'\n})\nexport class FixedRatioComponent {\n imageSource = 'https://example.com/path/to/image.jpg';\n aspectRatio: IAspectRatio = {\n key: '1:1',\n value: 1\n };\n\n onSaveFile(data: any) {\n console.log('Đã lưu hình ảnh với tỷ lệ 1:1');\n }\n}</code></pre>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Tài liệu API</h2>\n\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Inputs</h3>\n <div class=\"overflow-x-auto mb-8\">\n <table class=\"min-w-full bg-white border border-gray-200\">\n <thead>\n <tr>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Tên</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Kiểu dữ liệu</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Mặc định</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Mô tả</th>\n </tr>\n </thead>\n <tbody>\n @for (input of inputsDoc; track input.name) {\n <tr>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ input.name }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ input.type }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">{{ input.default }}</td>\n <td class=\"py-2 px-4 border-b border-gray-200\">{{ input.description }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Outputs</h3>\n <div class=\"overflow-x-auto mb-8\">\n <table class=\"min-w-full bg-white border border-gray-200\">\n <thead>\n <tr>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Tên</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Kiểu dữ liệu</th>\n <th class=\"py-3 px-4 border-b border-gray-200 bg-gray-100 text-left font-semibold text-gray-700\">Mô tả</th>\n </tr>\n </thead>\n <tbody>\n @for (output of outputsDoc; track output.name) {\n <tr>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ output.name }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">\n <code class=\"text-sm bg-gray-100 px-1.5 py-0.5 rounded\">{{ output.type }}</code>\n </td>\n <td class=\"py-2 px-4 border-b border-gray-200\">{{ output.description }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <h3 class=\"text-xl font-semibold text-gray-700 mb-4\">Interfaces</h3>\n <div class=\"space-y-6\">\n @for (interfaceItem of interfacesDoc; track interfaceItem.name) {\n <div class=\"bg-gray-50 p-6 rounded-lg\">\n <h4 class=\"text-lg font-semibold text-gray-700 mb-3\">{{ interfaceItem.name }}</h4>\n <pre class=\"bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm mb-3\"><code>{{ interfaceItem.code }}</code></pre>\n <p class=\"text-gray-600\">{{ interfaceItem.description }}</p>\n </div>\n }\n </div>\n </section>\n\n <section class=\"bg-white rounded-lg p-8 mb-8 shadow-sm\">\n <h2 class=\"text-2xl font-bold text-gray-800 mb-5 pb-3 border-b border-gray-200\">Tính năng</h2>\n <ul class=\"space-y-6\">\n @for (feature of features; track feature.id) {\n <li class=\"flex items-start\">\n <span class=\"text-2xl text-blue-500\">{{ feature.icon }}</span>\n <div>\n <h3 class=\"text-lg font-semibold text-gray-700 mb-1\">{{ feature.title }}</h3>\n <p class=\"text-gray-600\">{{ feature.description }}</p>\n </div>\n </li>\n }\n </ul>\n </section>\n </main>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|