ngx-pwd-strength
Version:
Angular Package, that measure password strength and indicate how secure is it
100 lines • 16.8 kB
JavaScript
import { Component, HostBinding, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./ngx-pwd-strength.service";
import * as i2 from "@angular/common";
export class NgxPwdStrengthComponent {
constructor(ngxPwdStrengthService, elementRef) {
this.ngxPwdStrengthService = ngxPwdStrengthService;
this.elementRef = elementRef;
this.display = false;
this.pwdScore = null;
this.popupOffset = 5;
this.popupPosition = "bottom";
}
ngOnInit() {
this.subscription = this.ngxPwdStrengthService.updatedScore$.subscribe(data => {
this.pwdScore = data;
});
}
set show(value) {
if (value) {
this.setHostPosition(this.popupPosition);
}
this.display = value;
}
get show() {
return this.display;
}
get element() {
return this.data.element;
}
get elementPosition() {
return this.data.elementPosition;
}
setHostPosition(position) {
const isSvg = this.element instanceof SVGElement;
const popup = this.elementRef.nativeElement;
const isCustomPosition = !this.elementPosition.right;
let elementHeight = isSvg ? this.element.getBoundingClientRect().height : this.element.offsetHeight;
let elementWidth = isSvg ? this.element.getBoundingClientRect().width : this.element.offsetWidth;
const popupHeight = popup.clientHeight;
const popupWidth = popup.clientWidth;
const scrollY = window.pageYOffset;
if (isCustomPosition) {
elementHeight = 0;
elementWidth = 0;
}
let topStyle;
let leftStyle;
switch (position) {
case "top":
topStyle = (this.elementPosition.top + scrollY) - (popupHeight + this.popupOffset);
leftStyle = this.elementPosition.left;
break;
case "bottom":
topStyle = (this.elementPosition.top + scrollY) + elementHeight + this.popupOffset;
leftStyle = this.elementPosition.left;
break;
case "left":
leftStyle = this.elementPosition.left - popupWidth - this.popupOffset;
topStyle = (this.elementPosition.top + scrollY);
break;
case "right":
leftStyle = this.elementPosition.left + elementWidth + this.popupOffset;
topStyle = (this.elementPosition.top + scrollY);
}
this.hostStyleTop = topStyle + "px";
this.hostStyleLeft = leftStyle + "px";
this.hostStyleWidth = this.elementPosition.width + "px";
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
NgxPwdStrengthComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: NgxPwdStrengthComponent, deps: [{ token: i1.NgxPwdStrengthService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
NgxPwdStrengthComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.9", type: NgxPwdStrengthComponent, selector: "lib-ngx-pwd-strength", inputs: { data: "data", show: "show" }, host: { properties: { "style.top": "this.hostStyleTop", "style.left": "this.hostStyleLeft", "style.width": "this.hostStyleWidth" }, classAttribute: "ngx-pwd-strength-popup" }, ngImport: i0, template: "<div class=\"pwd-popup\">\r\n <div class=\"pwd-strength\">\r\n <div class=\"pwd-strength-fill\" [attr.data-score]=\"pwdScore?.score\"></div>\r\n </div>\r\n <ng-container *ngIf=\"pwdScore?.feedback\">\r\n <p class=\"password-feedback\" *ngIf=\"pwdScore?.feedback?.warning\">\r\n <span>⚠</span> {{pwdScore?.feedback?.warning}}\r\n </p>\r\n <ul class=\"password-suggetion\" *ngIf=\"pwdScore?.feedback?.suggestions\">\r\n <li *ngFor=\"let suggetion of pwdScore?.feedback?.suggestions\">{{suggetion}}</li>\r\n </ul>\r\n </ng-container>\r\n</div>\r\n\r\n", styles: [":host{background-color:#fff;color:#000;text-align:left;border-radius:2px;position:absolute;pointer-events:none;padding:10px;z-index:1000;display:block;transition:opacity .3s;opacity:1;top:0;left:0;transition:opacity .3s ease-in-out;box-shadow:0 1px 3px #0006;font-family:-apple-system,BlinkMacSystemFont,Roboto,Helvetica,Arial,sans-serif}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength{position:relative;height:3px;background:#d3d3d3;margin:10px auto}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength:before,:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength:after{content:\"\";height:inherit;background:transparent;display:block;border-color:#fff;border-style:solid;border-width:0 5px 0 5px;position:absolute;width:calc((100% - 20px) / 5);z-index:10}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength:before{left:calc((100% - 20px) / 5)}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength:after{right:calc((100% - 20px) / 5)}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength-fill{background:transparent;height:inherit;position:absolute;width:0;border-radius:inherit;transition:width .5s ease-in-out,background .25s}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength-fill[data-score=\"0\"]{background:darkred;width:20%}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength-fill[data-score=\"1\"]{background:orangered;width:40%}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength-fill[data-score=\"2\"]{background:orange;width:60%}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength-fill[data-score=\"3\"]{background:yellowgreen;width:80%}:host.ngx-pwd-strength-popup .pwd-popup .pwd-strength-fill[data-score=\"4\"]{background:green;width:100%}:host.ngx-pwd-strength-popup .pwd-popup .password-feedback,:host.ngx-pwd-strength-popup .pwd-popup .password-suggetion{font-size:80%;font-weight:400;display:block;margin-top:.25rem}:host.ngx-pwd-strength-popup .pwd-popup .password-suggetion{color:#6e757d!important}:host.ngx-pwd-strength-popup .pwd-popup .password-feedback{color:orange!important}:host ul{padding-left:14px;line-height:17px}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: NgxPwdStrengthComponent, decorators: [{
type: Component,
args: [{
selector: 'lib-ngx-pwd-strength',
templateUrl: './lib-ngx-pwd-strength.component.html',
host: { class: "ngx-pwd-strength-popup" },
styleUrls: [
'./lib-ngx-pwd-strength.component.scss'
]
}]
}], ctorParameters: function () { return [{ type: i1.NgxPwdStrengthService }, { type: i0.ElementRef }]; }, propDecorators: { data: [{
type: Input
}], hostStyleTop: [{
type: HostBinding,
args: ["style.top"]
}], hostStyleLeft: [{
type: HostBinding,
args: ["style.left"]
}], hostStyleWidth: [{
type: HostBinding,
args: ["style.width"]
}], show: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXB3ZC1zdHJlbmd0aC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdkLXN0cmVuZ3RoL3NyYy9saWIvbmd4LXB3ZC1zdHJlbmd0aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdkLXN0cmVuZ3RoL3NyYy9saWIvbGliLW5neC1wd2Qtc3RyZW5ndGguY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxXQUFXLEVBQUUsS0FBSyxFQUFvQixNQUFNLGVBQWUsQ0FBQzs7OztBQWEzRixNQUFNLE9BQU8sdUJBQXVCO0lBV2xDLFlBQ1UscUJBQTRDLEVBQzVDLFVBQXNCO1FBRHRCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQVhoQyxZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBRWpDLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGtCQUFhLEdBQVcsUUFBUSxDQUFDO0lBUTdCLENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFhLElBQUksQ0FBQyxLQUFjO1FBQzlCLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMs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Q2JwQyx5a0JBY0E7MkZERGEsdUJBQXVCO2tCQVJuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFdBQVcsRUFBQyx1Q0FBdUM7b0JBQ25ELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRTtvQkFDekMsU0FBUyxFQUFFO3dCQUNULHVDQUF1QztxQkFDeEM7aUJBQ0Y7cUlBUVUsSUFBSTtzQkFBWixLQUFLO2dCQUNvQixZQUFZO3NCQUFyQyxXQUFXO3VCQUFDLFdBQVc7Z0JBQ0csYUFBYTtzQkFBdkMsV0FBVzt1QkFBQyxZQUFZO2dCQUNHLGNBQWM7c0JBQXpDLFdBQVc7dUJBQUMsYUFBYTtnQkFZYixJQUFJO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05neFB3ZFN0cmVuZ3RoU2VydmljZX0gZnJvbSBcIi4vbmd4LXB3ZC1zdHJlbmd0aC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1B3ZFNjb3JlfSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbmd4LXB3ZC1zdHJlbmd0aCcsXHJcbiAgdGVtcGxhdGVVcmw6Jy4vbGliLW5neC1wd2Qtc3RyZW5ndGguY29tcG9uZW50Lmh0bWwnLFxyXG4gIGhvc3Q6IHsgY2xhc3M6IFwibmd4LXB3ZC1zdHJlbmd0aC1wb3B1cFwiIH0sXHJcbiAgc3R5bGVVcmxzOiBbXHJcbiAgICAnLi9saWItbmd4LXB3ZC1zdHJlbmd0aC5jb21wb25lbnQuc2NzcydcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hQd2RTdHJlbmd0aENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgZGlzcGxheTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB3ZFNjb3JlOiBQd2RTY29yZSB8IG51bGwgPSBudWxsO1xyXG4gIHN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuICBwb3B1cE9mZnNldDogbnVtYmVyID0gNTtcclxuICBwb3B1cFBvc2l0aW9uOiBzdHJpbmcgPSBcImJvdHRvbVwiO1xyXG4gIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS50b3BcIikgaG9zdFN0eWxlVG9wITogc3RyaW5nO1xyXG4gIEBIb3N0QmluZGluZyhcInN0eWxlLmxlZnRcIikgaG9zdFN0eWxlTGVmdCE6IHN0cmluZztcclxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS53aWR0aFwiKSBob3N0U3R5bGVXaWR0aCE6IHN0cmluZztcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbmd4UHdkU3RyZW5ndGhTZXJ2aWNlOiBOZ3hQd2RTdHJlbmd0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5uZ3hQd2RTdHJlbmd0aFNlcnZpY2UudXBkYXRlZFNjb3JlJC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMucHdkU2NvcmUgPSBkYXRhXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBzaG93KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5zZXRIb3N0UG9zaXRpb24odGhpcy5wb3B1cFBvc2l0aW9uKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGlzcGxheSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVsZW1lbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhLmVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBnZXQgZWxlbWVudFBvc2l0aW9uKCk6IERPTVJlY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5lbGVtZW50UG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBzZXRIb3N0UG9zaXRpb24ocG9zaXRpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNTdmcgPSB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xyXG4gICAgY29uc3QgcG9wdXAgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGlzQ3VzdG9tUG9zaXRpb24gPSAhdGhpcy5lbGVtZW50UG9zaXRpb24ucmlnaHQ7XHJcblxyXG4gICAgbGV0IGVsZW1lbnRIZWlnaHQgPSBpc1N2ZyA/IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgOiB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgbGV0IGVsZW1lbnRXaWR0aCA9IGlzU3ZnID8gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3QgcG9wdXBIZWlnaHQgPSBwb3B1cC5jbGllbnRIZWlnaHQ7XHJcbiAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAuY2xpZW50V2lkdGg7XHJcbiAgICBjb25zdCBzY3JvbGxZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xyXG5cclxuICAgIGlmIChpc0N1c3RvbVBvc2l0aW9uKSB7XHJcbiAgICAgIGVsZW1lbnRIZWlnaHQgPSAwO1xyXG4gICAgICBlbGVtZW50V2lkdGggPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0b3BTdHlsZTtcclxuICAgIGxldCBsZWZ0U3R5bGU7XHJcblxyXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xyXG4gICAgICBjYXNlIFwidG9wXCI6XHJcbiAgICAgICAgdG9wU3R5bGUgPSAodGhpcy5lbGVtZW50UG9zaXRpb24udG9wICsgc2Nyb2xsWSkgLSAocG9wdXBIZWlnaHQgKyB0aGlzLnBvcHVwT2Zmc2V0KTtcclxuICAgICAgICBsZWZ0U3R5bGUgPSB0aGlzLmVsZW1lbnRQb3NpdGlvbi5sZWZ0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiYm90dG9tXCI6XHJcbiAgICAgICAgdG9wU3R5bGUgPSAodGhpcy5lbGVtZW50UG9zaXRpb24udG9wICsgc2Nyb2xsWSkgKyBlbGVtZW50SGVpZ2h0ICsgdGhpcy5wb3B1cE9mZnNldDtcclxuICAgICAgICBsZWZ0U3R5bGUgPSB0aGlzLmVsZW1lbnRQb3NpdGlvbi5sZWZ0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwibGVmdFwiOlxyXG4gICAgICAgIGxlZnRTdHlsZSA9IHRoaXMuZWxlbWVudFBvc2l0aW9uLmxlZnQgLSBwb3B1cFdpZHRoIC0gdGhpcy5wb3B1cE9mZnNldDtcclxuICAgICAgICB0b3BTdHlsZSA9ICh0aGlzLmVsZW1lbnRQb3NpdGlvbi50b3AgKyBzY3JvbGxZKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgbGVmdFN0eWxlID0gdGhpcy5lbGVtZW50UG9zaXRpb24ubGVmdCArIGVsZW1lbnRXaWR0aCArIHRoaXMucG9wdXBPZmZzZXQ7XHJcbiAgICAgICAgdG9wU3R5bGUgPSAodGhpcy5lbGVtZW50UG9zaXRpb24udG9wICsgc2Nyb2xsWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ob3N0U3R5bGVUb3AgPSB0b3BTdHlsZSArIFwicHhcIjtcclxuICAgIHRoaXMuaG9zdFN0eWxlTGVmdCA9IGxlZnRTdHlsZSArIFwicHhcIjtcclxuICAgIHRoaXMuaG9zdFN0eWxlV2lkdGggPSB0aGlzLmVsZW1lbnRQb3NpdGlvbi53aWR0aCArIFwicHhcIjtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJwd2QtcG9wdXBcIj5cclxuICA8ZGl2IGNsYXNzPVwicHdkLXN0cmVuZ3RoXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHdkLXN0cmVuZ3RoLWZpbGxcIiBbYXR0ci5kYXRhLXNjb3JlXT1cInB3ZFNjb3JlPy5zY29yZVwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwd2RTY29yZT8uZmVlZGJhY2tcIj5cclxuICAgIDxwIGNsYXNzPVwicGFzc3dvcmQtZmVlZGJhY2tcIiAqbmdJZj1cInB3ZFNjb3JlPy5mZWVkYmFjaz8ud2FybmluZ1wiPlxyXG4gICAgICA8c3Bhbj4mIzk4ODg7PC9zcGFuPiB7e3B3ZFNjb3JlPy5mZWVkYmFjaz8ud2FybmluZ319XHJcbiAgICA8L3A+XHJcbiAgICA8dWwgY2xhc3M9XCJwYXNzd29yZC1zdWdnZXRpb25cIiAqbmdJZj1cInB3ZFNjb3JlPy5mZWVkYmFjaz8uc3VnZ2VzdGlvbnNcIj5cclxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBzdWdnZXRpb24gb2YgcHdkU2NvcmU/LmZlZWRiYWNrPy5zdWdnZXN0aW9uc1wiPnt7c3VnZ2V0aW9ufX08L2xpPlxyXG4gICAgPC91bD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcblxyXG4iXX0=