UNPKG

ngx-slider-recaptcha

Version:
355 lines 73.1 kB
import { Component, EventEmitter, HostListener, Inject, Input, Output, TemplateRef, ViewChild } from '@angular/core'; import { NGX_SLIDER_RECAPTCHA_VERIFICATION_SERVICE_TOKEN } from '../tokens/ngx-slider-recaptcha-verification-service.token'; import { NGX_SLIDER_RECAPTCHA_IMAGE_SERVICE_TOKEN } from '../tokens/ngx-slider-recaptcha-image-service.token'; import { NGX_SLIDER_RECAPTCHA_CONFIG_TOKEN } from '../tokens/ngx-slider-recaptcha-config.token'; import { DEFAULT_SLIDER_RECAPTCHA_CONFIG } from '../config/default-ngx-slider-recaptcha-config'; import { CommonModule } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class NgxSliderRecaptchaComponent { constructor(renderer, cdr, globalSliderConfig, verifier, imageRetriever) { this.renderer = renderer; this.cdr = cdr; this.globalSliderConfig = globalSliderConfig; this.verifier = verifier; this.imageRetriever = imageRetriever; this.disabled = false; this.onVerified = new EventEmitter(); this.onRefresh = new EventEmitter(); this.onError = new EventEmitter(); this._sliderText = ''; this._sliderOffsetX = 0; this._blockOffsetX = 0; this._maskWidth = 0; this._isSliderDragging = false; this._isVerifying = false; this._verificationStatus = 'none'; this.dragStartX = 0; this.dragStartY = 0; this.puzzleX = 0; this.puzzleY = 0; this.loadCount = 0; this.sliderMovements = []; this.isUsingIE = window.navigator.userAgent.includes('Trident'); this.SLIDER_CONTAINER_MARGIN = 7; } ngOnInit() { this._sliderConfig = { ...this._sliderConfig, ...this.globalSliderConfig, ...DEFAULT_SLIDER_RECAPTCHA_CONFIG }; } ngAfterViewInit() { if (!this.ctx || !this.blockCtx) { this.initializeCaptcha(); } } ngOnChanges(changes) { if (changes['config']?.currentValue) { this._sliderConfig = { ...this._sliderConfig, ...this.globalSliderConfig, ...this.config }; this._sliderText = this.sliderConfig.instructionText; this.initializeStyles(); this.cdr.detectChanges(); } } reset() { setTimeout(() => { this._maskWidth = 0; this._sliderOffsetX = 0; this._blockOffsetX = 0; this.sliderMovements = []; this._verificationStatus = 'none'; this._sliderText = this.sliderConfig.loadingText; this.initializeCaptcha(); this.cdr.detectChanges(); }, 500); } refresh() { this.reset(); this.onRefresh.emit(); } isTemplate(input) { return input instanceof TemplateRef; } get isSliderDragging() { return this._isSliderDragging; } get isVerifying() { return this._isVerifying; } get sliderText() { return this._sliderText; } get verificationStatus() { return this._verificationStatus; } get maskWidth() { return this._maskWidth; } get sliderOffsetX() { return this._sliderOffsetX; } get blockOffsetX() { return this._blockOffsetX; } get sliderConfig() { return this._sliderConfig; } get isDisabled() { return this.disabled ?? this.sliderConfig.disabled ?? false; } onDragStart(event) { const target = event.target; if (this.isVerifying || !this.slider.nativeElement.contains(target)) { return; } this._isSliderDragging = true; this.initializeDragStartCoordinates(event); } onDragMove(event) { if (this.isVerifying || !this._isSliderDragging) return; const { x, y } = this.extractEventCoordinates(event); const { width, puzzleSize } = this.sliderConfig; let deltaX = x - this.dragStartX; let deltaY = y - this.dragStartY; if (deltaX < 0 || deltaX + puzzleSize > width) return; this._sliderOffsetX = (deltaX - 1); this._maskWidth = (deltaX + 4); this._blockOffsetX = (width - this.sliderConfig.puzzleSize - 20) / (width - puzzleSize) * deltaX; this.sliderMovements.push(Math.round(deltaY)); } onDragEnd(event) { if (this.isVerifying || !this._isSliderDragging) return; this._isSliderDragging = false; const { x } = this.extractEventCoordinates(event); if (x === this.dragStartX) return; const verificationRequest = { sliderMovements: this.sliderMovements, puzzleBlockPosition: this.blockOffsetX, puzzlePosition: this.puzzleX, toleranceOffset: this.sliderConfig.toleranceOffset }; this._isVerifying = true; this.verifier.verify(verificationRequest).subscribe({ next: (response) => { this._isVerifying = false; if (response.success) { this._verificationStatus = 'success'; this.onVerified.emit(response); } else { this._verificationStatus = 'fail'; this.onError.emit("Verification failed"); setTimeout(() => this.reset(), 1000); } }, error: (error) => { this._isVerifying = false; this.onError.emit(error); setTimeout(() => this.reset(), 1000); } }); } initializeCanvasDimensions() { const { width, height, puzzleSize } = this.sliderConfig; const sliderContainerHeight = (puzzleSize ?? 0) + this.SLIDER_CONTAINER_MARGIN; const adjustedHeight = (height ?? 0) - sliderContainerHeight; [this.canvas.nativeElement, this.block.nativeElement].forEach(element => { this.renderer.setAttribute(element, 'width', width.toString()); this.renderer.setAttribute(element, 'height', adjustedHeight.toString()); }); } initializeCanvasContexts() { this.initializeCanvasDimensions(); this.ctx = this.canvas.nativeElement.getContext('2d', { willReadFrequently: true }); this.blockCtx = this.block.nativeElement.getContext('2d', { willReadFrequently: true }); if (!this.ctx || !this.blockCtx) { throw new Error("Failed to initialize canvas contexts"); } } initializeCaptcha() { this.resetCanvas(); this.initializeStyles(); this.initializeCanvasContexts(); this.renderPuzzle(); } renderPuzzle() { let img = new Image(); img.crossOrigin = 'Anonymous'; img.onload = () => this.configurePuzzleImage(img); img.onerror = () => this.retryImageLoad(img); this.fetchImageSource(img); this._sliderText = this.sliderConfig.loadingText; this.cdr.detectChanges(); } configurePuzzleImage(img) { const { width, puzzleSize, puzzleRadius, instructionText } = this.sliderConfig; let puzzleBlockWidth = puzzleSize + puzzleRadius * 2 + 3; const { width: canvasWidth, height: canvasHeight } = this.canvas.nativeElement; this.puzzleX = this.generateRandomNumber(puzzleBlockWidth + 10, canvasWidth - (puzzleBlockWidth + 10)); this.puzzleY = this.generateRandomNumber(10 + puzzleRadius * 2, canvasHeight - (puzzleBlockWidth + 10)); this.drawPuzzlePieceShape(this.ctx, 'fill'); this.drawPuzzlePieceShape(this.blockCtx, 'clip'); this.ctx.drawImage(img, 0, 0, width, canvasHeight); this.blockCtx.drawImage(img, 0, 0, width, canvasHeight); const yOffset = this.puzzleY - puzzleRadius * 2 - 1; const imageData = this.blockCtx.getImageData(this.puzzleX - 3, yOffset, puzzleBlockWidth, puzzleBlockWidth); this.renderer.setAttribute(this.block.nativeElement, 'width', puzzleBlockWidth.toString()); this.renderer.setAttribute(this.block.nativeElement, 'height', canvasHeight.toString()); this.blockCtx.putImageData(imageData, 0, yOffset + 1); this._sliderText = instructionText; this.cdr.detectChanges(); } retryImageLoad(img) { this.loadCount++; if (this.loadCount <= this.sliderConfig.maxRetryAttempts) { this.renderPuzzle(); } else { img.src = this.loadFallbackImage(); } } fetchImageSource(img) { this.imageRetriever.getSliderImage().subscribe({ next: (image) => img.src = image, error: (error) => this.onError.emit(error) }); } loadFallbackImage() { return `assets/images/ngx-slider-recaptcha-${Math.floor(Math.random() * 4)}.jpg`; } drawPuzzlePieceShape(ctx, operation) { const { puzzleSize: size, puzzleRadius: radius } = this.sliderConfig; const { PI } = Math; const { puzzleX, puzzleY } = this; ctx.beginPath(); ctx.moveTo(puzzleX, puzzleY); ctx.arc(puzzleX + size / 2, puzzleY - radius + 2, radius, 0.72 * PI, 2.26 * PI); ctx.lineTo(puzzleX + size, puzzleY); ctx.arc(puzzleX + size + radius - 2, puzzleY + size / 2, radius, 1.21 * PI, 2.78 * PI); ctx.lineTo(puzzleX + size, puzzleY + size); ctx.lineTo(puzzleX, puzzleY + size); ctx.arc(puzzleX + radius - 2, puzzleY + size / 2, radius + 0.4, 2.76 * PI, 1.24 * PI, true); ctx.lineTo(puzzleX, puzzleY); ctx.lineWidth = 2; ctx.fillStyle = 'rgba(255, 255, 255, 0.7)'; ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)'; ctx.stroke(); ctx[operation](); ctx.globalCompositeOperation = this.isUsingIE ? 'xor' : 'destination-over'; } generateRandomNumber(start, end) { return Math.round(Math.random() * (end - start) + start); } ; resetCanvas() { const { width, height } = this.canvas.nativeElement; this.ctx?.clearRect(0, 0, width, height); this.blockCtx?.clearRect(0, 0, width, height); } extractEventCoordinates(event) { if (event instanceof MouseEvent) { return { x: event.clientX, y: event.clientY }; } else { return { x: event.changedTouches[0].clientX, y: event.changedTouches[0].clientY }; } } initializeDragStartCoordinates(event) { const { x, y } = this.extractEventCoordinates(event); this.dragStartX = x; this.dragStartY = y; } initializeStyles() { if (this.sliderConfig.allowResponsiveWidth) { this._sliderConfig = { ...this._sliderConfig, width: this.captchaContainer.nativeElement.offsetWidth }; } const { width, height, primaryColor, successColor, errorColor, textColor, sliderContainerBackgroundColor: containerBackgroundColor, sliderContainerBorderColor: containerBorderColor, borderRadius: commonBorderRadius, puzzleSize } = this.sliderConfig; this.setStyle('--recaptcha-container-width', `${width}px`); this.setStyle('--recaptcha-container-height', `${height}px`); this.setStyle('--recaptcha-canvas-width', `${width}px`); this.setStyle('--recaptcha-canvas-height', `${(height - (puzzleSize + this.SLIDER_CONTAINER_MARGIN))}px`); this.setStyle('--recaptcha-primary-color', primaryColor); this.setStyle('--recaptcha-error-color', errorColor); this.setStyle('--recaptcha-success-color', successColor); this.setStyle('--recaptcha-text-color', textColor); this.setStyle('--recaptcha-container-background-color', containerBackgroundColor); this.setStyle('--recaptcha-container-border-color', containerBorderColor); this.setStyle('--recaptcha-common-border-radius', `${commonBorderRadius}px`); this.setStyle('--recaptcha-slider-container-height', `${puzzleSize}px`); this.setStyle('--recaptcha-slider-mask-primary-color', this.hexToRgba(primaryColor, 0.3)); this.setStyle('--recaptcha-slider-mask-success-color', this.hexToRgba(successColor, 0.3)); this.setStyle('--recaptcha-slider-mask-error-color', this.hexToRgba(errorColor, 0.3)); } setStyle(property, value) { document.documentElement.style.setProperty(property, value); } hexToRgba(hex, opacity) { const sanitizedHex = hex?.replace(/^#/, ''); const [radius, g, b] = [0, 2, 4].map((start) => parseInt(sanitizedHex.slice(start, start + 2), 16)); return `rgba(${radius}, ${g}, ${b}, ${opacity})`; } } NgxSliderRecaptchaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxSliderRecaptchaComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: NGX_SLIDER_RECAPTCHA_CONFIG_TOKEN }, { token: NGX_SLIDER_RECAPTCHA_VERIFICATION_SERVICE_TOKEN }, { token: NGX_SLIDER_RECAPTCHA_IMAGE_SERVICE_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); NgxSliderRecaptchaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NgxSliderRecaptchaComponent, isStandalone: true, selector: "ngx-slider-recaptcha", inputs: { config: "config", disabled: "disabled", sliderContent: "sliderContent", successContent: "successContent", failContent: "failContent" }, outputs: { onVerified: "onVerified", onRefresh: "onRefresh", onError: "onError" }, host: { listeners: { "document:mousedown": "onDragStart($event)", "document:touchstart": "onDragStart($event)", "document:mousemove": "onDragMove($event)", "document:touchmove": "onDragMove($event)", "document:mouseup": "onDragEnd($event)", "document:touchend": "onDragEnd($event)" } }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true, static: true }, { propertyName: "block", first: true, predicate: ["block"], descendants: true, static: true }, { propertyName: "captchaContainer", first: true, predicate: ["captchaContainer"], descendants: true, static: true }, { propertyName: "slider", first: true, predicate: ["slider"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #captchaContainer class=\"captcha-container\">\r\n <canvas #canvas class=\"canvas\"></canvas>\r\n <canvas #block class=\"block\" [style.left.px]=\"blockOffsetX\"></canvas>\r\n <div class=\"slider-container\" [class.active]=\"isSliderDragging\" [class.success]=\"verificationStatus === 'success'\"\r\n [class.fail]=\"verificationStatus === 'fail'\">\r\n <div class=\"slider-mask\" [style.width.px]=\"maskWidth\">\r\n <div #slider class=\"slider\" [style.left.px]=\"sliderOffsetX\">\r\n <ng-container *ngIf=\"verificationStatus === 'none'\">\r\n <ng-container *ngIf=\"sliderContent; else defaultTemplate\">\r\n <ng-container *ngIf=\"isTemplate(sliderContent); else sliderContentStringTemplate\">\r\n <ng-container *ngTemplateOutlet=\"sliderContent\"></ng-container>\r\n </ng-container>\r\n <ng-template #sliderContentStringTemplate>\r\n {{ sliderContent }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"verificationStatus === 'success'\">\r\n <ng-container *ngIf=\"successContent; else defaultTemplate\">\r\n <ng-container *ngIf=\"isTemplate(successContent); else successContentStringTemplate\">\r\n <ng-container *ngTemplateOutlet=\"successContent\"></ng-container>\r\n </ng-container>\r\n <ng-template #successContentStringTemplate>\r\n {{ successContent }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"verificationStatus === 'fail'\">\r\n <ng-container *ngIf=\"failContent; else defaultTemplate\">\r\n <ng-container *ngIf=\"isTemplate(failContent); else failContentStringTemplate\">\r\n <ng-container *ngTemplateOutlet=\"failContent\"></ng-container>\r\n </ng-container>\r\n <ng-template #failContentStringTemplate>\r\n {{ sliderContent }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultTemplate>\r\n <span class=\"slider-icon\"></span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <span class=\"slider-text\" *ngIf=\"!isVerifying\">{{ sliderText }}</span>\r\n </div>\r\n <i *ngIf=\"sliderConfig.allowRefresh\" class=\"refresh-icon\" (click)=\"refresh()\"></i>\r\n <div class=\"disable-wrapper\" *ngIf=\"isDisabled || isVerifying\"></div>\r\n</div>", styles: ["@charset \"UTF-8\";.captcha-container{display:flex;flex-direction:column;position:relative}.canvas{width:var(--recaptcha-canvas-width);height:var(--recaptcha-canvas-height);border:1px solid #ccc;border-radius:3px}.block{position:absolute;left:0;top:0}.slider-container{position:relative;display:flex;justify-content:center;align-items:center;margin-top:5px;height:var(--recaptcha-slider-container-height);width:var(--recaptcha-canvas-width);border:1px solid var(--recaptcha-container-border-color);background:var(--recaptcha-container-background-color);border-radius:var(--recaptcha-common-border-radius);box-shadow:inset 0 0 5px #00000026}.slider-container .slider-text{position:relative;color:var(--recaptcha-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-left:calc(var(--recaptcha-slider-container-height) + 10px);padding-right:10px}.slider-container .slider-mask{position:absolute;left:0;top:0;height:var(--recaptcha-slider-container-height);width:var(--recaptcha-slider-container-height);border:1px solid transparent;border-right:0;transform:translate(-1px,-1px);border-radius:calc(var(--recaptcha-common-border-radius) - 1px)}.slider-container .slider-icon:before{content:\"\\2794\"}.slider-container.active .slider-text,.slider-container.success .slider-text,.slider-container.fail .slider-text{display:none}.slider{position:absolute;top:0;left:0;width:var(--recaptcha-slider-container-height);height:var(--recaptcha-slider-container-height);max-width:var(--recaptcha-slider-container-height);max-height:var(--recaptcha-slider-container-height);background:#fff;box-shadow:0 0 3px #0000004d;cursor:pointer;border-radius:calc(var(--recaptcha-common-border-radius) - 1px);display:flex;align-items:center;justify-content:center;border:1px solid #fff;transform:translateY(-1px)}.slider:hover{background:var(--recaptcha-primary-color);color:#fff;border:1px solid var(--recaptcha-primary-color)}.slider:hover .slider-icon{background-position:0 -13px;color:#fff}.active .slider{top:-1px;border:1px solid var(--recaptcha-primary-color);background-color:var(--recaptcha-primary-color);color:#fff;transform:translateY(0)}.active .slider-mask{border-color:var(--recaptcha-primary-color);background:var(--recaptcha-slider-mask-primary-color)}.success .slider{top:-1px;border:1px solid var(--recaptcha-success-color);background-color:var(--recaptcha-success-color);color:#fff;transform:translateY(0)}.success .slider-mask{border-color:var(--recaptcha-success-color);background-color:#d2f4ef}.success .slider-icon:before{content:\"\\2713\"}.fail .slider{top:-1px;border:1px solid var(--recaptcha-error-color);background-color:var(--recaptcha-error-color);color:#fff;transform:translateY(0)}.fail .slider-mask{border-color:var(--recaptcha-error-color);background-color:var(--recaptcha-slider-mask-error-color)}.fail .slider-icon:before{content:\"\\2715\"}.refresh-icon{position:absolute;right:6px;top:6px;cursor:pointer;color:#ffffff4d;font-size:1rem;z-index:5;transition:color .3s linear}.refresh-icon:before{content:\"\\27f3\"}.refresh-icon:hover{color:#fff}.disable-wrapper{position:absolute;cursor:not-allowed;z-index:9999;width:var(--recaptcha-container-width);height:var(--recaptcha-container-height);background-color:#e1e1e14d}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxSliderRecaptchaComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'ngx-slider-recaptcha', imports: [CommonModule], template: "<div #captchaContainer class=\"captcha-container\">\r\n <canvas #canvas class=\"canvas\"></canvas>\r\n <canvas #block class=\"block\" [style.left.px]=\"blockOffsetX\"></canvas>\r\n <div class=\"slider-container\" [class.active]=\"isSliderDragging\" [class.success]=\"verificationStatus === 'success'\"\r\n [class.fail]=\"verificationStatus === 'fail'\">\r\n <div class=\"slider-mask\" [style.width.px]=\"maskWidth\">\r\n <div #slider class=\"slider\" [style.left.px]=\"sliderOffsetX\">\r\n <ng-container *ngIf=\"verificationStatus === 'none'\">\r\n <ng-container *ngIf=\"sliderContent; else defaultTemplate\">\r\n <ng-container *ngIf=\"isTemplate(sliderContent); else sliderContentStringTemplate\">\r\n <ng-container *ngTemplateOutlet=\"sliderContent\"></ng-container>\r\n </ng-container>\r\n <ng-template #sliderContentStringTemplate>\r\n {{ sliderContent }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"verificationStatus === 'success'\">\r\n <ng-container *ngIf=\"successContent; else defaultTemplate\">\r\n <ng-container *ngIf=\"isTemplate(successContent); else successContentStringTemplate\">\r\n <ng-container *ngTemplateOutlet=\"successContent\"></ng-container>\r\n </ng-container>\r\n <ng-template #successContentStringTemplate>\r\n {{ successContent }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"verificationStatus === 'fail'\">\r\n <ng-container *ngIf=\"failContent; else defaultTemplate\">\r\n <ng-container *ngIf=\"isTemplate(failContent); else failContentStringTemplate\">\r\n <ng-container *ngTemplateOutlet=\"failContent\"></ng-container>\r\n </ng-container>\r\n <ng-template #failContentStringTemplate>\r\n {{ sliderContent }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultTemplate>\r\n <span class=\"slider-icon\"></span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <span class=\"slider-text\" *ngIf=\"!isVerifying\">{{ sliderText }}</span>\r\n </div>\r\n <i *ngIf=\"sliderConfig.allowRefresh\" class=\"refresh-icon\" (click)=\"refresh()\"></i>\r\n <div class=\"disable-wrapper\" *ngIf=\"isDisabled || isVerifying\"></div>\r\n</div>", styles: ["@charset \"UTF-8\";.captcha-container{display:flex;flex-direction:column;position:relative}.canvas{width:var(--recaptcha-canvas-width);height:var(--recaptcha-canvas-height);border:1px solid #ccc;border-radius:3px}.block{position:absolute;left:0;top:0}.slider-container{position:relative;display:flex;justify-content:center;align-items:center;margin-top:5px;height:var(--recaptcha-slider-container-height);width:var(--recaptcha-canvas-width);border:1px solid var(--recaptcha-container-border-color);background:var(--recaptcha-container-background-color);border-radius:var(--recaptcha-common-border-radius);box-shadow:inset 0 0 5px #00000026}.slider-container .slider-text{position:relative;color:var(--recaptcha-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-left:calc(var(--recaptcha-slider-container-height) + 10px);padding-right:10px}.slider-container .slider-mask{position:absolute;left:0;top:0;height:var(--recaptcha-slider-container-height);width:var(--recaptcha-slider-container-height);border:1px solid transparent;border-right:0;transform:translate(-1px,-1px);border-radius:calc(var(--recaptcha-common-border-radius) - 1px)}.slider-container .slider-icon:before{content:\"\\2794\"}.slider-container.active .slider-text,.slider-container.success .slider-text,.slider-container.fail .slider-text{display:none}.slider{position:absolute;top:0;left:0;width:var(--recaptcha-slider-container-height);height:var(--recaptcha-slider-container-height);max-width:var(--recaptcha-slider-container-height);max-height:var(--recaptcha-slider-container-height);background:#fff;box-shadow:0 0 3px #0000004d;cursor:pointer;border-radius:calc(var(--recaptcha-common-border-radius) - 1px);display:flex;align-items:center;justify-content:center;border:1px solid #fff;transform:translateY(-1px)}.slider:hover{background:var(--recaptcha-primary-color);color:#fff;border:1px solid var(--recaptcha-primary-color)}.slider:hover .slider-icon{background-position:0 -13px;color:#fff}.active .slider{top:-1px;border:1px solid var(--recaptcha-primary-color);background-color:var(--recaptcha-primary-color);color:#fff;transform:translateY(0)}.active .slider-mask{border-color:var(--recaptcha-primary-color);background:var(--recaptcha-slider-mask-primary-color)}.success .slider{top:-1px;border:1px solid var(--recaptcha-success-color);background-color:var(--recaptcha-success-color);color:#fff;transform:translateY(0)}.success .slider-mask{border-color:var(--recaptcha-success-color);background-color:#d2f4ef}.success .slider-icon:before{content:\"\\2713\"}.fail .slider{top:-1px;border:1px solid var(--recaptcha-error-color);background-color:var(--recaptcha-error-color);color:#fff;transform:translateY(0)}.fail .slider-mask{border-color:var(--recaptcha-error-color);background-color:var(--recaptcha-slider-mask-error-color)}.fail .slider-icon:before{content:\"\\2715\"}.refresh-icon{position:absolute;right:6px;top:6px;cursor:pointer;color:#ffffff4d;font-size:1rem;z-index:5;transition:color .3s linear}.refresh-icon:before{content:\"\\27f3\"}.refresh-icon:hover{color:#fff}.disable-wrapper{position:absolute;cursor:not-allowed;z-index:9999;width:var(--recaptcha-container-width);height:var(--recaptcha-container-height);background-color:#e1e1e14d}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [NGX_SLIDER_RECAPTCHA_CONFIG_TOKEN] }] }, { type: undefined, decorators: [{ type: Inject, args: [NGX_SLIDER_RECAPTCHA_VERIFICATION_SERVICE_TOKEN] }] }, { type: undefined, decorators: [{ type: Inject, args: [NGX_SLIDER_RECAPTCHA_IMAGE_SERVICE_TOKEN] }] }]; }, propDecorators: { canvas: [{ type: ViewChild, args: ['canvas', { static: true }] }], block: [{ type: ViewChild, args: ['block', { static: true }] }], captchaContainer: [{ type: ViewChild, args: ['captchaContainer', { static: true }] }], slider: [{ type: ViewChild, args: ['slider', { static: true }] }], config: [{ type: Input }], disabled: [{ type: Input }], sliderContent: [{ type: Input }], successContent: [{ type: Input }], failContent: [{ type: Input }], onVerified: [{ type: Output }], onRefresh: [{ type: Output }], onError: [{ type: Output }], onDragStart: [{ type: HostListener, args: ['document:mousedown', ['$event']] }, { type: HostListener, args: ['document:touchstart', ['$event']] }], onDragMove: [{ type: HostListener, args: ['document:mousemove', ['$event']] }, { type: HostListener, args: ['document:touchmove', ['$event']] }], onDragEnd: [{ type: HostListener, args: ['document:mouseup', ['$event']] }, { type: HostListener, args: ['document:touchend', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNsaWRlci1yZWNhcHRjaGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL25neC1zbGlkZXItcmVjYXB0Y2hhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9uZ3gtc2xpZGVyLXJlY2FwdGNoYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBNEIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoTixPQUFPLEVBQUUsK0NBQStDLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUc1SCxPQUFPLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUM5RyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVoRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUVoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQVUvQyxNQUFNLE9BQU8sMkJBQTJCO0lBc0N0QyxZQUNVLFFBQW1CLEVBQ25CLEdBQXNCLEVBQ3FCLGtCQUE0QyxFQUM5QixRQUEwRixFQUNqRyxjQUE4QztRQUpoRyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3FCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBMEI7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0Y7UUFDakcsbUJBQWMsR0FBZCxjQUFjLENBQWdDO1FBcENqRyxhQUFRLEdBQWEsS0FBSyxDQUFDO1FBTTFCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUN0RCxjQUFTLEdBQUcsSUFB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QW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBb0J0QyxTQUFTO3NCQUZoQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDM0MsWUFBWTt1QkFBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVmVyaWZpY2F0aW9uU3RhdHVzIH0gZnJvbSAnLi4vdHlwZXMvdmVyaWZpY2F0aW9uLXN0YXR1cy50eXBlJztcclxuaW1wb3J0IHsgTkdYX1NMSURFUl9SRUNBUFRDSEFfVkVSSUZJQ0FUSU9OX1NFUlZJQ0VfVE9LRU4gfSBmcm9tICcuLi90b2tlbnMvbmd4LXNsaWRlci1yZWNhcHRjaGEtdmVyaWZpY2F0aW9uLXNlcnZpY2UudG9rZW4nO1xyXG5pbXBvcnQgeyBOZ3hTbGlkZXJSZWNhcHRjaGFWZXJpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9uZ3gtc2xpZGVyLXJlY2FwdGNoYS12ZXJpZmljYXRpb24tc2VydmljZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBOZ3hTbGlkZXJSZWNhcHRjaGFJbWFnZVNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL25neC1zbGlkZXItcmVjYXB0Y2hhLWltYWdlLXNlcnZpY2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTkdYX1NMSURFUl9SRUNBUFRDSEFfSU1BR0VfU0VSVklDRV9UT0tFTiB9IGZyb20gJy4uL3Rva2Vucy9uZ3gtc2xpZGVyLXJlY2FwdGNoYS1pbWFnZS1zZXJ2aWNlLnRva2VuJztcclxuaW1wb3J0IHsgTkdYX1NMSURFUl9SRUNBUFRDSEFfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi4vdG9rZW5zL25neC1zbGlkZXItcmVjYXB0Y2hhLWNvbmZpZy50b2tlbic7XHJcbmltcG9ydCB7IE5neFNsaWRlclJlY2FwdGNoYUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9uZ3gtc2xpZGVyLXJlY2FwdGNoYS1jb25maWcnO1xyXG5pbXBvcnQgeyBERUZBVUxUX1NMSURFUl9SRUNBUFRDSEFfQ09ORklHIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQtbmd4LXNsaWRlci1yZWNhcHRjaGEtY29uZmlnJztcclxuaW1wb3J0IHsgVmVyaWZpY2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9jb3JlL25neC1zbGlkZXItcmVjYXB0Y2hhLXZlcmlmaWNhdGlvbi1yZXNwb25zZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBWZXJpZmljYXRpb25SZXF1ZXN0IH0gZnJvbSAnLi4vY29yZS9uZ3gtc2xpZGVyLXJlY2FwdGNoYS12ZXJpZmljYXRpb24tcmVxdWVzdC5pbnRlcmZhY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBzZWxlY3RvcjogJ25neC1zbGlkZXItcmVjYXB0Y2hhJyxcclxuICB0ZW1wbGF0