angular-password-strength-meter
Version:
[](https://github.com/antoantonyk/password-strength-meter/actions/workflows/ci-workflow.yml) [ {
this.renderer = renderer;
this.el = el;
this.colors = [];
this.minProgressVal = 0;
this.maxProgressVal = 100;
this.currentProgressVal = 0;
this.dataPasswordStrength = 0;
this.defaultColors = [
'darkred',
'orangered',
'orange',
'yellowgreen',
'green',
];
this.progressBar = this.el.nativeElement;
}
ngOnChanges(changes) {
if (changes['numberOfProgressBarItems']) {
this.setProgressBarItems();
}
this.setProgressBar();
}
setProgressBarItems() {
const progressBarItemContainer = this.progressBar.querySelector('.psm__progress-bar-items');
const width = 100 / this.numberOfProgressBarItems;
progressBarItemContainer?.childNodes.forEach((item) => {
this.renderer.removeChild(progressBarItemContainer, item);
});
Array(this.numberOfProgressBarItems)
.fill(1)
.forEach(() => {
const progressBarItem = this.renderer.createElement('div');
this.renderer.addClass(progressBarItem, 'psm__progress-bar-item');
this.renderer.setStyle(progressBarItem, 'width', `${width}%`);
this.renderer.appendChild(progressBarItemContainer, progressBarItem);
});
}
setProgressBar() {
const progressBarOverlayWidth = this.getFillMeterWidth(this.passwordStrength);
const progressBarOverlayWidthInPx = `${progressBarOverlayWidth}%`;
const progressLevelBasedOnItems = (progressBarOverlayWidth / 100) * this.numberOfProgressBarItems;
const progressBarOverlayColor = this.getMeterFillColor(progressLevelBasedOnItems);
this.dataPasswordStrength = this.passwordStrength || 0;
this.currentProgressVal = progressBarOverlayWidth;
const overlayElement = this.progressBar.querySelector('.psm__progress-bar-overlay');
if (overlayElement) {
this.renderer.setStyle(overlayElement, 'width', progressBarOverlayWidthInPx);
this.renderer.setStyle(overlayElement, 'background-color', progressBarOverlayColor);
}
}
getFillMeterWidth(strength) {
if (strength === null || strength === undefined) {
return 0;
}
const strengthInPercentage = strength !== null ? ((strength + 1) / 5) * 100 : 0;
const roundedStrengthInPercentage = this.getRoundedStrength(strengthInPercentage, 100 / this.numberOfProgressBarItems);
return roundedStrengthInPercentage;
}
getMeterFillColor(progressLevel) {
if (!progressLevel ||
progressLevel <= 0 ||
(progressLevel > this.colors.length &&
progressLevel > this.defaultColors.length)) {
return this.colors[0] ? this.colors[0] : this.defaultColors[0];
}
const index = progressLevel - 1;
return this.colors[index] ? this.colors[index] : this.defaultColors[index];
}
getRoundedStrength(strength, roundTo) {
return Math.round(strength / roundTo) * roundTo;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: PSMProgressBarDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: PSMProgressBarDirective, isStandalone: true, selector: ".psm__progress-bar", inputs: { numberOfProgressBarItems: "numberOfProgressBarItems", passwordStrength: "passwordStrength", colors: "colors" }, host: { properties: { "attr.aria-valuemin": "this.minProgressVal", "attr.aria-valuemax": "this.maxProgressVal", "attr.aria-valuenow": "this.currentProgressVal", "attr.data-strength": "this.dataPasswordStrength" } }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: PSMProgressBarDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '.psm__progress-bar',
}]
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { numberOfProgressBarItems: [{
type: Input,
args: [{ required: true }]
}], passwordStrength: [{
type: Input,
args: [{ required: true }]
}], colors: [{
type: Input
}], minProgressVal: [{
type: HostBinding,
args: ['attr.aria-valuemin']
}], maxProgressVal: [{
type: HostBinding,
args: ['attr.aria-valuemax']
}], currentProgressVal: [{
type: HostBinding,
args: ['attr.aria-valuenow']
}], dataPasswordStrength: [{
type: HostBinding,
args: ['attr.data-strength']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNtLXByb2dyZXNzLWJhci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXNzd29yZC1zdHJlbmd0aC1tZXRlci9zcmMvbGliL3BzbS1wcm9ncmVzcy1iYXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQ0wsU0FBUyxFQUVULFdBQVcsRUFDWCxLQUFLLEdBSU4sTUFBTSxlQUFlLENBQUM7O0FBTXZCLE1BQU0sT0FBTyx1QkFBdUI7SUE0QmxDLFlBQ1UsUUFBbUIsRUFDbkIsRUFBOEI7UUFEOUIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixPQUFFLEdBQUYsRUFBRSxDQUE0QjtRQXRCeEMsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUVhLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLG1CQUFjLEdBQUcsR0FBRyxDQUFDO1FBRXJCLHVCQUFrQixHQUFHLENBQUMsQ0FBQztRQUV2Qix5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFJcEQsa0JBQWEsR0FBRztZQUN0QixTQUFTO1lBQ1QsV0FBVztZQUNYLFFBQVE7WUFDUixhQUFhO1lBQ2IsT0FBTztTQUNSLENBQUM7UUFNQSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUM3RCwwQkFBMEIsQ0FDM0IsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFH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SSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUVoQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsT0FBZTtRQUMxRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUNsRCxDQUFDOzhHQWpJVSx1QkFBdUI7a0dBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkFKbkMsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7dUdBR0Msd0JBQXdCO3NCQUR2QixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFJekIsZ0JBQWdCO3NCQURmLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUl6QixNQUFNO3NCQURMLEtBQUs7Z0JBRzZCLGNBQWM7c0JBQWhELFdBQVc7dUJBQUMsb0JBQW9CO2dCQUVFLGNBQWM7c0JBQWhELFdBQVc7dUJBQUMsb0JBQW9CO2dCQUVFLGtCQUFrQjtzQkFBcEQsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBRUUsb0JBQW9CO3NCQUF0RCxXQUFXO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3IgKi9cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJy5wc21fX3Byb2dyZXNzLWJhcicsXG59KVxuZXhwb3J0IGNsYXNzIFBTTVByb2dyZXNzQmFyRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbnVtYmVyT2ZQcm9ncmVzc0Jhckl0ZW1zITogbnVtYmVyO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHBhc3N3b3JkU3RyZW5ndGghOiBudW1iZXIgfCBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIGNvbG9yczogc3RyaW5nW10gPSBbXTtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS12YWx1ZW1pbicpIG1pblByb2dyZXNzVmFsID0gMDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS12YWx1ZW1heCcpIG1heFByb2dyZXNzVmFsID0gMTAwO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXZhbHVlbm93JykgY3VycmVudFByb2dyZXNzVmFsID0gMDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1zdHJlbmd0aCcpIGRhdGFQYXNzd29yZFN0cmVuZ3RoID0gMDtcblxuICBwcm9ncmVzc0JhcjogSFRNTERpdkVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q29sb3JzID0gW1xuICAgICdkYXJrcmVkJyxcbiAgICAnb3JhbmdlcmVkJyxcbiAgICAnb3JhbmdlJyxcbiAgICAneWVsbG93Z3JlZW4nLFxuICAgICdncmVlbicsXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+XG4gICkge1xuICAgIHRoaXMucHJvZ3Jlc3NCYXIgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ251bWJlck9mUHJvZ3Jlc3NCYXJJdGVtcyddKSB7XG4gICAgICB0aGlzLnNldFByb2dyZXNzQmFySXRlbXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFByb2dyZXNzQmFyKCk7XG4gIH1cblxuICBzZXRQcm9ncmVzc0Jhckl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHByb2dyZXNzQmFySXRlbUNvbnRhaW5lciA9IHRoaXMucHJvZ3Jlc3NCYXIucXVlcnlTZWxlY3RvcihcbiAgICAgICcucHNtX19wcm9ncmVzcy1iYXItaXRlbXMnXG4gICAgKTtcbiAgICBjb25zdCB3aWR0aCA9IDEwMCAvIHRoaXMubnVtYmVyT2ZQcm9ncmVzc0Jhckl0ZW1zITtcblxuICAgIHByb2dyZXNzQmFySXRlbUNvbnRhaW5lcj8uY2hpbGROb2Rlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHByb2dyZXNzQmFySXRlbUNvbnRhaW5lciwgaXRlbSk7XG4gICAgfSk7XG5cbiAgICBBcnJheSh0aGlzLm51bWJlck9mUHJvZ3Jlc3NCYXJJdGVtcylcbiAgICAgIC5maWxsKDEpXG4gICAgICAuZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzQmFySXRlbSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MocHJvZ3Jlc3NCYXJJdGVtLCAncHNtX19wcm9ncmVzcy1iYXItaXRlbScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHByb2dyZXNzQmFySXRlbSwgJ3dpZHRoJywgYCR7d2lkdGh9JWApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHByb2dyZXNzQmFySXRlbUNvbnRhaW5lciwgcHJvZ3Jlc3NCYXJJdGVtKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0UHJvZ3Jlc3NCYXIoKTogdm9pZCB7XG4gICAgY29uc3QgcHJvZ3Jlc3NCYXJPdmVybGF5V2lkdGggPSB0aGlzLmdldEZpbGxNZXRlcldpZHRoKFxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoXG4gICAgKTtcbiAgICBjb25zdCBwcm9ncmVzc0Jhck92ZXJsYXlXaWR0aEluUHggPSBgJHtwcm9ncmVzc0Jhck92ZXJsYXlXaWR0aH0lYDtcblxuICAgIGNvbnN0IHByb2dyZXNzTGV2ZWxCYXNlZE9uSXRlbXMgPVxuICAgICAgKHByb2dyZXNzQmFyT3ZlcmxheVdpZHRoIC8gMTAwKSAqIHRoaXMubnVtYmVyT2ZQcm9ncmVzc0Jhckl0ZW1zO1xuICAgIGNvbnN0IHByb2dyZXNzQmFyT3ZlcmxheUNvbG9yID0gdGhpcy5nZXRNZXRlckZpbGxDb2xvcihcbiAgICAgIHByb2dyZXNzTGV2ZWxCYXNlZE9uSXRlbXNcbiAgICApO1xuXG4gICAgdGhpcy5kYXRhUGFzc3dvcmRTdHJlbmd0aCA9IHRoaXMucGFzc3dvcmRTdHJlbmd0aCB8fCAwO1xuICAgIHRoaXMuY3VycmVudFByb2dyZXNzVmFsID0gcHJvZ3Jlc3NCYXJPdmVybGF5V2lkdGg7XG5cbiAgICBjb25zdCBvdmVybGF5RWxlbWVudCA9IHRoaXMucHJvZ3Jlc3NCYXIucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAnLnBzbV9fcHJvZ3Jlc3MtYmFyLW92ZXJsYXknXG4gICAgKTtcblxuICAgIGlmIChvdmVybGF5RWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgb3ZlcmxheUVsZW1lbnQsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIHByb2dyZXNzQmFyT3ZlcmxheVdpZHRoSW5QeFxuICAgICAgKTtcblxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgb3ZlcmxheUVsZW1lbnQsXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgICAgcHJvZ3Jlc3NCYXJPdmVybGF5Q29sb3JcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmlsbE1ldGVyV2lkdGgoc3RyZW5ndGg6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICAgIGlmIChzdHJlbmd0aCA9PT0gbnVsbCB8fCBzdHJlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJlbmd0aEluUGVyY2VudGFnZSA9XG4gICAgICBzdHJlbmd0aCAhPT0gbnVsbCA/ICgoc3RyZW5ndGggKyAxKSAvIDUpICogMTAwIDogMDtcblxuICAgIGNvbnN0IHJvdW5kZWRTdHJlbmd0aEluUGVyY2VudGFnZSA9IHRoaXMuZ2V0Um91bmRlZFN0cmVuZ3RoKFxuICAgICAgc3RyZW5ndGhJblBlcmNlbnRhZ2UsXG4gICAgICAxMDAgLyB0aGlzLm51bWJlck9mUHJvZ3Jlc3NCYXJJdGVtc1xuICAgICk7XG4gICAgcmV0dXJuIHJvdW5kZWRTdHJlbmd0aEluUGVyY2VudGFnZTtcbiAgfVxuXG4gIGdldE1ldGVyRmlsbENvbG9yKHByb2dyZXNzTGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgIXByb2dyZXNzTGV2ZWwgfHxcbiAgICAgIHByb2dyZXNzTGV2ZWwgPD0gMCB8fFxuICAgICAgKHByb2dyZXNzTGV2ZWwgPiB0aGlzLmNvbG9ycy5sZW5ndGggJiZcbiAgICAgICAgcHJvZ3Jlc3NMZXZlbCA+IHRoaXMuZGVmYXVsdENvbG9ycy5sZW5ndGgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xvcnNbMF0gPyB0aGlzLmNvbG9yc1swXSA6IHRoaXMuZGVmYXVsdENvbG9yc1swXTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IHByb2dyZXNzTGV2ZWwgLSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuY29sb3JzW2luZGV4XSA/IHRoaXMuY29sb3JzW2luZGV4XSA6IHRoaXMuZGVmYXVsdENvbG9yc1tpbmRleF07XG4gIH1cblxuICBwcml2YXRlIGdldFJvdW5kZWRTdHJlbmd0aChzdHJlbmd0aDogbnVtYmVyLCByb3VuZFRvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHN0cmVuZ3RoIC8gcm91bmRUbykgKiByb3VuZFRvO1xuICB9XG59XG4iXX0=