ngx-slider-recaptcha
Version:
Angular slider with reCAPTCHA verification
355 lines • 73.1 kB
JavaScript
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