UNPKG

@asoftwareworld/form-builder

Version:

ASW Form Builder helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same befor

578 lines 99.8 kB
/** * @license * Copyright ASW (A Software World) All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file */ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Input, isDevMode, Output, ViewChild } from '@angular/core'; import { CropperSettings } from './interfaces/cropper.settings'; import { MoveTypes } from './interfaces/move-start.interface'; import { getEventForKey, getInvertedPositionForKey, getPositionForKey } from './utils/keyboard.utils'; import * as i0 from "@angular/core"; import * as i1 from "./services/crop.service"; import * as i2 from "./services/cropper-position.service"; import * as i3 from "./services/load-image.service"; import * as i4 from "@angular/platform-browser"; import * as i5 from "@angular/common"; export class AswImageCropComponent { cropService; cropperPositionService; loadImageService; sanitizer; cd; Hammer = window.Hammer || null; settings = new CropperSettings(); setImageMaxSizeRetries = 0; moveStart; loadedImage; safeImgDataUrl; safeTransformStyle; marginLeft = '0px'; maxSize = { width: 0, height: 0 }; moveTypes = MoveTypes; imageVisible = false; wrapper; sourceImage; imageChangedEvent; imageURL; imageBase64; imageFile; format = this.settings.format; transform = {}; maintainAspectRatio = this.settings.maintainAspectRatio; aspectRatio = this.settings.aspectRatio; resizeToWidth = this.settings.resizeToWidth; resizeToHeight = this.settings.resizeToHeight; cropperMinWidth = this.settings.cropperMinWidth; cropperMinHeight = this.settings.cropperMinHeight; cropperMaxHeight = this.settings.cropperMaxHeight; cropperMaxWidth = this.settings.cropperMaxWidth; cropperStaticWidth = this.settings.cropperStaticWidth; cropperStaticHeight = this.settings.cropperStaticHeight; canvasRotation = this.settings.canvasRotation; initialStepSize = this.settings.initialStepSize; roundCropper = this.settings.roundCropper; onlyScaleDown = this.settings.onlyScaleDown; imageQuality = this.settings.imageQuality; autoCrop = this.settings.autoCrop; backgroundColor = this.settings.backgroundColor; containWithinAspectRatio = this.settings.containWithinAspectRatio; hideResizeSquares = this.settings.hideResizeSquares; cropper = { x1: -100, y1: -100, x2: 10000, y2: 10000 }; alignImage = this.settings.alignImage; disabled = false; imageCropped = new EventEmitter(); startCropImage = new EventEmitter(); imageLoaded = new EventEmitter(); cropperReady = new EventEmitter(); loadImageFailed = new EventEmitter(); constructor(cropService, cropperPositionService, loadImageService, sanitizer, cd) { this.cropService = cropService; this.cropperPositionService = cropperPositionService; this.loadImageService = loadImageService; this.sanitizer = sanitizer; this.cd = cd; this.reset(); } ngOnChanges(changes) { this.onChangesUpdateSettings(changes); this.onChangesInputImage(changes); if (this.loadedImage?.original.image.complete && (changes.containWithinAspectRatio || changes.canvasRotation)) { this.loadImageService .transformLoadedImage(this.loadedImage, this.settings) .then((res) => this.setLoadedImage(res)) .catch((err) => this.loadImageError(err)); } if (changes.cropper || changes.maintainAspectRatio || changes.aspectRatio) { this.setMaxSize(); this.setCropperScaledMinSize(); this.setCropperScaledMaxSize(); if (this.maintainAspectRatio && (changes.maintainAspectRatio || changes.aspectRatio)) { this.resetCropperPosition(); } else if (changes.cropper) { this.checkCropperPosition(false); this.doAutoCrop(); } this.cd.markForCheck(); } if (changes.transform) { this.transform = this.transform || {}; this.setCssTransform(); this.doAutoCrop(); } } onChangesUpdateSettings(changes) { this.settings.setOptionsFromChanges(changes); if (this.settings.cropperStaticHeight && this.settings.cropperStaticWidth) { this.settings.setOptions({ hideResizeSquares: true, cropperMinWidth: this.settings.cropperStaticWidth, cropperMinHeight: this.settings.cropperStaticHeight, cropperMaxHeight: this.settings.cropperStaticHeight, cropperMaxWidth: this.settings.cropperStaticWidth, maintainAspectRatio: false }); } } onChangesInputImage(changes) { if (changes.imageChangedEvent || changes.imageURL || changes.imageBase64 || changes.imageFile) { this.reset(); } if (changes.imageChangedEvent && this.isValidImageChangedEvent()) { this.loadImageFile(this.imageChangedEvent.target.files[0]); } if (changes.imageURL && this.imageURL) { this.loadImageFromURL(this.imageURL); } if (changes.imageBase64 && this.imageBase64) { this.loadBase64Image(this.imageBase64); } if (changes.imageFile && this.imageFile) { this.loadImageFile(this.imageFile); } } isValidImageChangedEvent() { return this.imageChangedEvent?.target?.files?.length > 0; } setCssTransform() { this.safeTransformStyle = this.sanitizer.bypassSecurityTrustStyle('scaleX(' + (this.transform.scale || 1) * (this.transform.flipH ? -1 : 1) + ')' + 'scaleY(' + (this.transform.scale || 1) * (this.transform.flipV ? -1 : 1) + ')' + 'rotate(' + (this.transform.rotate || 0) + 'deg)' + `translate(${this.transform.translateH || 0}%, ${this.transform.translateV || 0}%)`); } ngOnInit() { this.settings.stepSize = this.initialStepSize; this.activatePinchGesture(); } reset() { this.imageVisible = false; this.loadedImage = undefined; this.safeImgDataUrl = 'data:image/png;base64,iVBORw0KGg' + 'oAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAU' + 'AAarVyFEAAAAASUVORK5CYII='; this.moveStart = { active: false, type: null, position: null, x1: 0, y1: 0, x2: 0, y2: 0, clientX: 0, clientY: 0 }; this.maxSize = { width: 0, height: 0 }; this.cropper.x1 = -100; this.cropper.y1 = -100; this.cropper.x2 = 10000; this.cropper.y2 = 10000; } loadImageFile(file) { this.loadImageService .loadImageFile(file, this.settings) .then((res) => this.setLoadedImage(res)) .catch((err) => this.loadImageError(err)); } loadBase64Image(imageBase64) { this.loadImageService .loadBase64Image(imageBase64, this.settings) .then((res) => this.setLoadedImage(res)) .catch((err) => this.loadImageError(err)); } loadImageFromURL(url) { this.loadImageService .loadImageFromURL(url, this.settings) .then((res) => this.setLoadedImage(res)) .catch((err) => this.loadImageError(err)); } setLoadedImage(loadedImage) { this.loadedImage = loadedImage; this.safeImgDataUrl = this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.base64); this.cd.markForCheck(); } loadImageError(error) { console.error(error); this.loadImageFailed.emit(); } imageLoadedInView() { if (this.loadedImage != null) { this.imageLoaded.emit(this.loadedImage); this.setImageMaxSizeRetries = 0; setTimeout(() => this.checkImageMaxSizeRecursively()); } } checkImageMaxSizeRecursively() { if (this.setImageMaxSizeRetries > 40) { this.loadImageFailed.emit(); } else if (this.sourceImageLoaded()) { this.setMaxSize(); this.setCropperScaledMinSize(); this.setCropperScaledMaxSize(); this.resetCropperPosition(); this.cropperReady.emit({ ...this.maxSize }); this.cd.markForCheck(); } else { this.setImageMaxSizeRetries++; setTimeout(() => this.checkImageMaxSizeRecursively(), 50); } } sourceImageLoaded() { return this.sourceImage?.nativeElement?.offsetWidth > 0; } onResize() { if (!this.loadedImage) { return; } this.resizeCropperPosition(); this.setMaxSize(); this.setCropperScaledMinSize(); this.setCropperScaledMaxSize(); } activatePinchGesture() { if (this.Hammer) { const hammer = new this.Hammer(this.wrapper.nativeElement); hammer.get('pinch').set({ enable: true }); hammer.on('pinchmove', this.onPinch.bind(this)); hammer.on('pinchend', this.pinchStop.bind(this)); hammer.on('pinchstart', this.startPinch.bind(this)); } else if (isDevMode()) { console.warn('[AswImageCropper] Could not find HammerJS - Pinch Gesture won\'t work'); } } resizeCropperPosition() { const sourceImageElement = this.sourceImage.nativeElement; if (this.maxSize.width !== sourceImageElement.offsetWidth || this.maxSize.height !== sourceImageElement.offsetHeight) { this.cropper.x1 = this.cropper.x1 * sourceImageElement.offsetWidth / this.maxSize.width; this.cropper.x2 = this.cropper.x2 * sourceImageElement.offsetWidth / this.maxSize.width; this.cropper.y1 = this.cropper.y1 * sourceImageElement.offsetHeight / this.maxSize.height; this.cropper.y2 = this.cropper.y2 * sourceImageElement.offsetHeight / this.maxSize.height; } } resetCropperPosition() { this.cropperPositionService.resetCropperPosition(this.sourceImage, this.cropper, this.settings); this.doAutoCrop(); this.imageVisible = true; } keyboardAccess(event) { this.changeKeyboardStepSize(event); this.keyboardMoveCropper(event); } changeKeyboardStepSize(event) { const key = +event.key; if (key >= 1 && key <= 9) { this.settings.stepSize = key; } } keyboardMoveCropper(event) { const keyboardWhiteList = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft']; if (!(keyboardWhiteList.includes(event.key))) { return; } const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move; const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key); const moveEvent = getEventForKey(event.key, this.settings.stepSize); event.preventDefault(); event.stopPropagation(); this.startMove({ clientX: 0, clientY: 0 }, moveType, position); this.moveImg(moveEvent); this.moveStop(); } startMove(event, moveType, position = null) { if (this.moveStart?.active && this.moveStart?.type === MoveTypes.Pinch) { return; } if (event.preventDefault) { event.preventDefault(); } this.moveStart = { active: true, type: moveType, position, clientX: this.cropperPositionService.getClientX(event), clientY: this.cropperPositionService.getClientY(event), ...this.cropper }; } startPinch(event) { if (!this.safeImgDataUrl) { return; } if (event.preventDefault) { event.preventDefault(); } this.moveStart = { active: true, type: MoveTypes.Pinch, position: 'center', clientX: this.cropper.x1 + (this.cropper.x2 - this.cropper.x1) / 2, clientY: this.cropper.y1 + (this.cropper.y2 - this.cropper.y1) / 2, ...this.cropper }; } moveImg(event) { // tslint:disable-next-line:no-non-null-assertion if (this.moveStart.active) { if (event.stopPropagation) { event.stopPropagation(); } if (event.preventDefault) { event.preventDefault(); } // tslint:disable-next-line:no-non-null-assertion if (this.moveStart.type === MoveTypes.Move) { // tslint:disable-next-line:no-non-null-assertion this.cropperPositionService.move(event, this.moveStart, this.cropper); this.checkCropperPosition(true); // tslint:disable-next-line:no-non-null-assertion } else if (this.moveStart.type === MoveTypes.Resize) { if (!this.cropperStaticWidth && !this.cropperStaticHeight) { // tslint:disable-next-line:no-non-null-assertion this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings); } this.checkCropperPosition(false); } this.cd.detectChanges(); } } onPinch(event) { // tslint:disable-next-line:no-non-null-assertion if (this.moveStart.active) { if (event.stopPropagation) { event.stopPropagation(); } if (event.preventDefault) { event.preventDefault(); } // tslint:disable-next-line:no-non-null-assertion if (this.moveStart.type === MoveTypes.Pinch) { // tslint:disable-next-line:no-non-null-assertion this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings); this.checkCropperPosition(false); } this.cd.detectChanges(); } } setMaxSize() { if (this.sourceImage) { const sourceImageElement = this.sourceImage.nativeElement; this.maxSize.width = sourceImageElement.offsetWidth; this.maxSize.height = sourceImageElement.offsetHeight; this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.maxSize.width / 2 + 'px)'); } } setCropperScaledMinSize() { if (this.loadedImage?.transformed?.image) { this.setCropperScaledMinWidth(); this.setCropperScaledMinHeight(); } else { this.settings.cropperScaledMinWidth = 20; this.settings.cropperScaledMinHeight = 20; } } setCropperScaledMinWidth() { this.settings.cropperScaledMinWidth = this.cropperMinWidth > 0 // tslint:disable-next-line:no-non-null-assertion ? Math.max(20, this.cropperMinWidth / this.loadedImage.transformed.image.width * this.maxSize.width) : 20; } setCropperScaledMinHeight() { if (this.maintainAspectRatio) { this.settings.cropperScaledMinHeight = Math.max(20, this.settings.cropperScaledMinWidth / this.aspectRatio); } else if (this.cropperMinHeight > 0) { this.settings.cropperScaledMinHeight = Math.max(20, // tslint:disable-next-line:no-non-null-assertion this.cropperMinHeight / this.loadedImage.transformed.image.height * this.maxSize.height); } else { this.settings.cropperScaledMinHeight = 20; } } setCropperScaledMaxSize() { if (this.loadedImage?.transformed?.image) { const ratio = this.loadedImage.transformed.size.width / this.maxSize.width; this.settings.cropperScaledMaxWidth = this.cropperMaxWidth > 20 ? this.cropperMaxWidth / ratio : this.maxSize.width; this.settings.cropperScaledMaxHeight = this.cropperMaxHeight > 20 ? this.cropperMaxHeight / ratio : this.maxSize.height; if (this.maintainAspectRatio) { if (this.settings.cropperScaledMaxWidth > this.settings.cropperScaledMaxHeight * this.aspectRatio) { this.settings.cropperScaledMaxWidth = this.settings.cropperScaledMaxHeight * this.aspectRatio; } else if (this.settings.cropperScaledMaxWidth < this.settings.cropperScaledMaxHeight * this.aspectRatio) { this.settings.cropperScaledMaxHeight = this.settings.cropperScaledMaxWidth / this.aspectRatio; } } } else { this.settings.cropperScaledMaxWidth = this.maxSize.width; this.settings.cropperScaledMaxHeight = this.maxSize.height; } } checkCropperPosition(maintainSize = false) { if (this.cropper.x1 < 0) { this.cropper.x2 -= maintainSize ? this.cropper.x1 : 0; this.cropper.x1 = 0; } if (this.cropper.y1 < 0) { this.cropper.y2 -= maintainSize ? this.cropper.y1 : 0; this.cropper.y1 = 0; } if (this.cropper.x2 > this.maxSize.width) { this.cropper.x1 -= maintainSize ? (this.cropper.x2 - this.maxSize.width) : 0; this.cropper.x2 = this.maxSize.width; } if (this.cropper.y2 > this.maxSize.height) { this.cropper.y1 -= maintainSize ? (this.cropper.y2 - this.maxSize.height) : 0; this.cropper.y2 = this.maxSize.height; } } moveStop() { // tslint:disable-next-line:no-non-null-assertion if (this.moveStart.active) { // tslint:disable-next-line:no-non-null-assertion this.moveStart.active = false; this.doAutoCrop(); } } pinchStop() { // tslint:disable-next-line:no-non-null-assertion if (this.moveStart.active) { // tslint:disable-next-line:no-non-null-assertion this.moveStart.active = false; this.doAutoCrop(); } } doAutoCrop() { if (this.autoCrop) { this.crop(); } } crop() { if (this.loadedImage?.transformed?.image != null) { this.startCropImage.emit(); const output = this.cropService.crop(this.sourceImage, this.loadedImage, this.cropper, this.settings); if (output != null) { this.imageCropped.emit(output); } return output; } return null; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswImageCropComponent, deps: [{ token: i1.CropService }, { token: i2.CropperPositionService }, { token: i3.LoadImageService }, { token: i4.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AswImageCropComponent, selector: "asw-image-crop", inputs: { imageChangedEvent: "imageChangedEvent", imageURL: "imageURL", imageBase64: "imageBase64", imageFile: "imageFile", format: "format", transform: "transform", maintainAspectRatio: "maintainAspectRatio", aspectRatio: "aspectRatio", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", cropperMinWidth: "cropperMinWidth", cropperMinHeight: "cropperMinHeight", cropperMaxHeight: "cropperMaxHeight", cropperMaxWidth: "cropperMaxWidth", cropperStaticWidth: "cropperStaticWidth", cropperStaticHeight: "cropperStaticHeight", canvasRotation: "canvasRotation", initialStepSize: "initialStepSize", roundCropper: "roundCropper", onlyScaleDown: "onlyScaleDown", imageQuality: "imageQuality", autoCrop: "autoCrop", backgroundColor: "backgroundColor", containWithinAspectRatio: "containWithinAspectRatio", hideResizeSquares: "hideResizeSquares", cropper: "cropper", alignImage: "alignImage", disabled: "disabled" }, outputs: { imageCropped: "imageCropped", startCropImage: "startCropImage", imageLoaded: "imageLoaded", cropperReady: "cropperReady", loadImageFailed: "loadImageFailed" }, host: { listeners: { "window:resize": "onResize()", "document:mousemove": "moveImg($event)", "document:touchmove": "moveImg($event)", "document:mouseup": "moveStop()", "document:touchend": "moveStop()" }, properties: { "style.text-align": "this.alignImage", "class.disabled": "this.disabled" } }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, static: true }, { propertyName: "sourceImage", first: true, predicate: ["sourceImage"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [style.background]=\"imageVisible && backgroundColor\"\r\n #wrapper>\r\n <img\r\n #sourceImage\r\n class=\"source-image\"\r\n *ngIf=\"safeImgDataUrl\"\r\n [src]=\"safeImgDataUrl\"\r\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\r\n [style.transform]=\"safeTransformStyle\"\r\n (load)=\"imageLoadedInView()\"/>\r\n <div\r\n class=\"overlay\"\r\n [style.width.px]=\"maxSize.width\"\r\n [style.height.px]=\"maxSize.height\"\r\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"></div>\r\n <div class=\"cropper\"\r\n *ngIf=\"imageVisible\"\r\n [class.rounded]=\"roundCropper\"\r\n [style.top.px]=\"cropper.y1\"\r\n [style.left.px]=\"cropper.x1\"\r\n [style.width.px]=\"cropper.x2 - cropper.x1\"\r\n [style.height.px]=\"cropper.y2 - cropper.y1\"\r\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\r\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\r\n (keydown)=\"keyboardAccess($event)\"\r\n tabindex=\"0\">\r\n <div\r\n (mousedown)=\"startMove($event, moveTypes.Move)\"\r\n (touchstart)=\"startMove($event, moveTypes.Move)\"\r\n class=\"move\">\r\n </div>\r\n <ng-container *ngIf=\"!hideResizeSquares\">\r\n <span class=\"resize topleft\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize top\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize topright\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize right\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize bottomright\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize bottom\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize bottomleft\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize left\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize-bar top\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\">\r\n </span>\r\n <span class=\"resize-bar right\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\">\r\n </span>\r\n <span class=\"resize-bar bottom\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\">\r\n </span>\r\n <span class=\"resize-bar left\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\">\r\n </span>\r\n </ng-container>\r\n </div>\r\n</div>", styles: [":host{display:flex;position:relative;width:100%;max-width:100%;max-height:100%;overflow:hidden;padding:5px;text-align:center}:host>div{width:100%;position:relative}:host>div img.source-image{max-width:100%;max-height:100%;transform-origin:center;border:1px solid #ddd;border-radius:4px;padding:6px}:host .overlay{position:absolute;pointer-events:none;touch-action:none;outline:var(--cropper-overlay-color, white) solid 100vw;top:0;left:0}:host .cropper{position:absolute;display:flex;color:#53535c;background:transparent;outline:rgba(255,255,255,.3) solid 100vw;outline:var(--cropper-outline-color, rgba(255, 255, 255, .3)) solid 100vw;touch-action:none}@media (orientation: portrait){:host .cropper{outline-width:100vh}}:host .cropper:after{position:absolute;content:\"\";inset:0;pointer-events:none;border:dashed 1px;opacity:.75;color:inherit;z-index:1}:host .cropper .move{width:100%;height:100%;cursor:move;border:2px solid rgba(255,255,255,.5)}:host .cropper:focus .move{border-color:#1e90ff;border-width:2px}:host .cropper .resize{position:absolute;display:inline-block;line-height:6px;padding:8px;opacity:.85;z-index:1}:host .cropper .resize .square{display:inline-block;background:#53535c;width:6px;height:6px;border:1px solid rgba(255,255,255,.5);box-sizing:content-box}:host .cropper .resize.topleft{top:-12px;left:-12px;cursor:nwse-resize}:host .cropper .resize.top{top:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .cropper .resize.topright{top:-12px;right:-12px;cursor:nesw-resize}:host .cropper .resize.right{top:calc(50% - 12px);right:-12px;cursor:ew-resize}:host .cropper .resize.bottomright{bottom:-12px;right:-12px;cursor:nwse-resize}:host .cropper .resize.bottom{bottom:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .cropper .resize.bottomleft{bottom:-12px;left:-12px;cursor:nesw-resize}:host .cropper .resize.left{top:calc(50% - 12px);left:-12px;cursor:ew-resize}:host .cropper .resize-bar{position:absolute;z-index:1}:host .cropper .resize-bar.top{top:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .cropper .resize-bar.right{top:11px;right:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .cropper .resize-bar.bottom{bottom:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .cropper .resize-bar.left{top:11px;left:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .cropper.rounded{outline-color:transparent}:host .cropper.rounded:after{border-radius:100%;box-shadow:0 0 0 100vw #ffffff4d;box-shadow:0 0 0 100vw var(--cropper-outline-color, rgba(255, 255, 255, .3))}@media (orientation: portrait){:host .cropper.rounded:after{box-shadow:0 0 0 100vh #ffffff4d;box-shadow:0 0 0 100vh var(--cropper-outline-color, rgba(255, 255, 255, .3))}}:host .cropper.rounded .move{border-radius:100%}:host.disabled .cropper .resize,:host.disabled .cropper .resize-bar,:host.disabled .cropper .move{display:none}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswImageCropComponent, decorators: [{ type: Component, args: [{ selector: 'asw-image-crop', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.background]=\"imageVisible && backgroundColor\"\r\n #wrapper>\r\n <img\r\n #sourceImage\r\n class=\"source-image\"\r\n *ngIf=\"safeImgDataUrl\"\r\n [src]=\"safeImgDataUrl\"\r\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\r\n [style.transform]=\"safeTransformStyle\"\r\n (load)=\"imageLoadedInView()\"/>\r\n <div\r\n class=\"overlay\"\r\n [style.width.px]=\"maxSize.width\"\r\n [style.height.px]=\"maxSize.height\"\r\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"></div>\r\n <div class=\"cropper\"\r\n *ngIf=\"imageVisible\"\r\n [class.rounded]=\"roundCropper\"\r\n [style.top.px]=\"cropper.y1\"\r\n [style.left.px]=\"cropper.x1\"\r\n [style.width.px]=\"cropper.x2 - cropper.x1\"\r\n [style.height.px]=\"cropper.y2 - cropper.y1\"\r\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\r\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\r\n (keydown)=\"keyboardAccess($event)\"\r\n tabindex=\"0\">\r\n <div\r\n (mousedown)=\"startMove($event, moveTypes.Move)\"\r\n (touchstart)=\"startMove($event, moveTypes.Move)\"\r\n class=\"move\">\r\n </div>\r\n <ng-container *ngIf=\"!hideResizeSquares\">\r\n <span class=\"resize topleft\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize top\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize topright\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize right\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize bottomright\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize bottom\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize bottomleft\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize left\">\r\n <span class=\"square\"></span>\r\n </span>\r\n <span class=\"resize-bar top\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\">\r\n </span>\r\n <span class=\"resize-bar right\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\">\r\n </span>\r\n <span class=\"resize-bar bottom\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\">\r\n </span>\r\n <span class=\"resize-bar left\"\r\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\r\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\">\r\n </span>\r\n </ng-container>\r\n </div>\r\n</div>", styles: [":host{display:flex;position:relative;width:100%;max-width:100%;max-height:100%;overflow:hidden;padding:5px;text-align:center}:host>div{width:100%;position:relative}:host>div img.source-image{max-width:100%;max-height:100%;transform-origin:center;border:1px solid #ddd;border-radius:4px;padding:6px}:host .overlay{position:absolute;pointer-events:none;touch-action:none;outline:var(--cropper-overlay-color, white) solid 100vw;top:0;left:0}:host .cropper{position:absolute;display:flex;color:#53535c;background:transparent;outline:rgba(255,255,255,.3) solid 100vw;outline:var(--cropper-outline-color, rgba(255, 255, 255, .3)) solid 100vw;touch-action:none}@media (orientation: portrait){:host .cropper{outline-width:100vh}}:host .cropper:after{position:absolute;content:\"\";inset:0;pointer-events:none;border:dashed 1px;opacity:.75;color:inherit;z-index:1}:host .cropper .move{width:100%;height:100%;cursor:move;border:2px solid rgba(255,255,255,.5)}:host .cropper:focus .move{border-color:#1e90ff;border-width:2px}:host .cropper .resize{position:absolute;display:inline-block;line-height:6px;padding:8px;opacity:.85;z-index:1}:host .cropper .resize .square{display:inline-block;background:#53535c;width:6px;height:6px;border:1px solid rgba(255,255,255,.5);box-sizing:content-box}:host .cropper .resize.topleft{top:-12px;left:-12px;cursor:nwse-resize}:host .cropper .resize.top{top:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .cropper .resize.topright{top:-12px;right:-12px;cursor:nesw-resize}:host .cropper .resize.right{top:calc(50% - 12px);right:-12px;cursor:ew-resize}:host .cropper .resize.bottomright{bottom:-12px;right:-12px;cursor:nwse-resize}:host .cropper .resize.bottom{bottom:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .cropper .resize.bottomleft{bottom:-12px;left:-12px;cursor:nesw-resize}:host .cropper .resize.left{top:calc(50% - 12px);left:-12px;cursor:ew-resize}:host .cropper .resize-bar{position:absolute;z-index:1}:host .cropper .resize-bar.top{top:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .cropper .resize-bar.right{top:11px;right:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .cropper .resize-bar.bottom{bottom:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .cropper .resize-bar.left{top:11px;left:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .cropper.rounded{outline-color:transparent}:host .cropper.rounded:after{border-radius:100%;box-shadow:0 0 0 100vw #ffffff4d;box-shadow:0 0 0 100vw var(--cropper-outline-color, rgba(255, 255, 255, .3))}@media (orientation: portrait){:host .cropper.rounded:after{box-shadow:0 0 0 100vh #ffffff4d;box-shadow:0 0 0 100vh var(--cropper-outline-color, rgba(255, 255, 255, .3))}}:host .cropper.rounded .move{border-radius:100%}:host.disabled .cropper .resize,:host.disabled .cropper .resize-bar,:host.disabled .cropper .move{display:none}\n"] }] }], ctorParameters: () => [{ type: i1.CropService }, { type: i2.CropperPositionService }, { type: i3.LoadImageService }, { type: i4.DomSanitizer }, { type: i0.ChangeDetectorRef }], propDecorators: { wrapper: [{ type: ViewChild, args: ['wrapper', { static: true }] }], sourceImage: [{ type: ViewChild, args: ['sourceImage', { static: false }] }], imageChangedEvent: [{ type: Input }], imageURL: [{ type: Input }], imageBase64: [{ type: Input }], imageFile: [{ type: Input }], format: [{ type: Input }], transform: [{ type: Input }], maintainAspectRatio: [{ type: Input }], aspectRatio: [{ type: Input }], resizeToWidth: [{ type: Input }], resizeToHeight: [{ type: Input }], cropperMinWidth: [{ type: Input }], cropperMinHeight: [{ type: Input }], cropperMaxHeight: [{ type: Input }], cropperMaxWidth: [{ type: Input }], cropperStaticWidth: [{ type: Input }], cropperStaticHeight: [{ type: Input }], canvasRotation: [{ type: Input }], initialStepSize: [{ type: Input }], roundCropper: [{ type: Input }], onlyScaleDown: [{ type: Input }], imageQuality: [{ type: Input }], autoCrop: [{ type: Input }], backgroundColor: [{ type: Input }], containWithinAspectRatio: [{ type: Input }], hideResizeSquares: [{ type: Input }], cropper: [{ type: Input }], alignImage: [{ type: HostBinding, args: ['style.text-align'] }, { type: Input }], disabled: [{ type: HostBinding, args: ['class.disabled'] }, { type: Input }], imageCropped: [{ type: Output }], startCropImage: [{ type: Output }], imageLoaded: [{ type: Output }], cropperReady: [{ type: Output }], loadImageFailed: [{ type: Output }], onResize: [{ type: HostListener, args: ['window:resize'] }], moveImg: [{ type: HostListener, args: ['document:mousemove', ['$event']] }, { type: HostListener, args: ['document:touchmove', ['$event']] }], moveStop: [{ type: HostListener, args: ['document:mouseup'] }, { type: HostListener, args: ['document:touchend'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9pbWFnZS1jcm9wL2ltYWdlLWNyb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW1hZ2UtY3JvcC9pbWFnZS1jcm9wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBR1QsTUFBTSxFQUVOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSzlELE9BQU8sRUFBRSxjQUFjLEVBQUUseUJBQXlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQVN0RyxNQUFNLE9BQU8scUJBQXFCO0lBZ0VsQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbkVKLE1BQU0sR0FBa0IsTUFBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7SUFDdEQsUUFBUSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDakMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLFNBQVMsQ0FBYTtJQUN0QixXQUFXLENBQWU7SUFFbEMsY0FBYyxDQUFvQjtJQUNsQyxrQkFBa0IsQ0FBc0I7SUFDeEMsVUFBVSxHQUF1QixLQUFLLENBQUM7SUFDdkMsT0FBTyxHQUFlO1FBQ2xCLEtBQUssRUFBRSxDQUFDO1FBQ1IsTUFBTSxFQUFFLENBQUM7S0FDWixDQUFDO0lBQ0YsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUN0QixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRW1CLE9B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