@yoozsoft/yoozsoft-ng 6.2.0 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +206 -94
  2. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs +70 -38
  3. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs.map +1 -1
  4. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs +194 -109
  5. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs.map +1 -1
  6. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs +70 -55
  7. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs.map +1 -1
  8. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs +55 -33
  9. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs.map +1 -1
  10. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs +13 -11
  11. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs.map +1 -1
  12. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs +17 -11
  13. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs.map +1 -1
  14. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs +37 -28
  15. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs.map +1 -1
  16. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs +7 -6
  17. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs.map +1 -1
  18. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs +39 -28
  19. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs.map +1 -1
  20. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs +65 -39
  21. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs.map +1 -1
  22. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs +3 -3
  23. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs.map +1 -1
  24. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs +26 -17
  25. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs.map +1 -1
  26. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs +155 -0
  27. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs.map +1 -0
  28. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs +47 -33
  29. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs.map +1 -1
  30. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs +30 -29
  31. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs.map +1 -1
  32. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs +93 -84
  33. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs.map +1 -1
  34. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs +41 -27
  35. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs.map +1 -1
  36. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs +20 -18
  37. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs.map +1 -1
  38. package/package.json +12 -4
  39. package/rating/package.json +4 -0
  40. package/types/yoozsoft-yoozsoft-ng-rating.d.ts +56 -0
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, signal, computed, effect, Component, inject, ViewContainerRef, Injector, Directive } from '@angular/core';
2
+ import { input, signal, computed, effect, ChangeDetectionStrategy, Component, inject, ViewContainerRef, Injector, Directive } from '@angular/core';
3
3
  import { Validators, NgControl } from '@angular/forms';
4
4
  import { NgClass } from '@angular/common';
5
5
 
@@ -29,16 +29,26 @@ const DEFAULT_OPTIONS = {
29
29
 
30
30
  class YsPasswordStrength {
31
31
  minLengthRegx = new RegExp('');
32
- passwordHelp = input(null, ...(ngDevMode ? [{ debugName: "passwordHelp" }] : /* istanbul ignore next */ []));
33
- displayFeedback = input(true, ...(ngDevMode ? [{ debugName: "displayFeedback" }] : /* istanbul ignore next */ []));
34
- feedback = input({}, ...(ngDevMode ? [{ debugName: "feedback" }] : /* istanbul ignore next */ []));
35
- control = input(...(ngDevMode ? [undefined, { debugName: "control" }] : /* istanbul ignore next */ []));
36
- passwordValue = signal('', ...(ngDevMode ? [{ debugName: "passwordValue" }] : /* istanbul ignore next */ []));
37
- hasUppercase = computed(() => UPPERCASE_REGEX.test(this.passwordValue()), ...(ngDevMode ? [{ debugName: "hasUppercase" }] : /* istanbul ignore next */ []));
38
- hasLowercase = computed(() => LOWERCASE_REGEX.test(this.passwordValue()), ...(ngDevMode ? [{ debugName: "hasLowercase" }] : /* istanbul ignore next */ []));
39
- hasDigit = computed(() => DIGIT_REGX.test(this.passwordValue()), ...(ngDevMode ? [{ debugName: "hasDigit" }] : /* istanbul ignore next */ []));
40
- hasNonAlphanumeric = computed(() => NON_ALPHANUMERIC_REGX.test(this.passwordValue()), ...(ngDevMode ? [{ debugName: "hasNonAlphanumeric" }] : /* istanbul ignore next */ []));
41
- hasMinLength = computed(() => this.minLengthRegx.test(this.passwordValue()), ...(ngDevMode ? [{ debugName: "hasMinLength" }] : /* istanbul ignore next */ []));
32
+ passwordHelp = input(null, /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "passwordHelp" }] : /* istanbul ignore next */ []));
34
+ displayFeedback = input(true, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "displayFeedback" }] : /* istanbul ignore next */ []));
36
+ feedback = input({}, /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "feedback" }] : /* istanbul ignore next */ []));
38
+ control = input(/* @ts-ignore */
39
+ ...(ngDevMode ? [undefined, { debugName: "control" }] : /* istanbul ignore next */ []));
40
+ passwordValue = signal('', /* @ts-ignore */
41
+ ...(ngDevMode ? [{ debugName: "passwordValue" }] : /* istanbul ignore next */ []));
42
+ hasUppercase = computed(() => UPPERCASE_REGEX.test(this.passwordValue()), /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "hasUppercase" }] : /* istanbul ignore next */ []));
44
+ hasLowercase = computed(() => LOWERCASE_REGEX.test(this.passwordValue()), /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "hasLowercase" }] : /* istanbul ignore next */ []));
46
+ hasDigit = computed(() => DIGIT_REGX.test(this.passwordValue()), /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "hasDigit" }] : /* istanbul ignore next */ []));
48
+ hasNonAlphanumeric = computed(() => NON_ALPHANUMERIC_REGX.test(this.passwordValue()), /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "hasNonAlphanumeric" }] : /* istanbul ignore next */ []));
50
+ hasMinLength = computed(() => this.minLengthRegx.test(this.passwordValue()), /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "hasMinLength" }] : /* istanbul ignore next */ []));
42
52
  strengthMeter = computed(() => {
43
53
  let strength = -1;
44
54
  if (this.mergedOptions().requireUppercase && this.hasUppercase())
@@ -52,31 +62,41 @@ class YsPasswordStrength {
52
62
  if (this.mergedOptions().requiredMinLength && this.hasMinLength())
53
63
  strength += 1;
54
64
  return strength + (5 - this.requiredOptionsLength());
55
- }, ...(ngDevMode ? [{ debugName: "strengthMeter" }] : /* istanbul ignore next */ []));
65
+ }, /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "strengthMeter" }] : /* istanbul ignore next */ []));
56
67
  strengthStyleClass = computed(() => {
57
- return this.strengthMeter() == 4 ? "green" :
58
- this.strengthMeter() == 3 ? "yellow" :
59
- this.strengthMeter() == 2 ? "orange" :
60
- this.strengthMeter() == 1 ? "red" :
61
- this.strengthMeter() == 0 ? "pink" :
62
- '';
63
- }, ...(ngDevMode ? [{ debugName: "strengthStyleClass" }] : /* istanbul ignore next */ []));
64
- requiredOptionsLength = computed(() => Object.values(this.mergedOptions()).filter(Boolean).length, ...(ngDevMode ? [{ debugName: "requiredOptionsLength" }] : /* istanbul ignore next */ []));
68
+ return this.strengthMeter() == 4
69
+ ? 'green'
70
+ : this.strengthMeter() == 3
71
+ ? 'yellow'
72
+ : this.strengthMeter() == 2
73
+ ? 'orange'
74
+ : this.strengthMeter() == 1
75
+ ? 'red'
76
+ : this.strengthMeter() == 0
77
+ ? 'pink'
78
+ : '';
79
+ }, /* @ts-ignore */
80
+ ...(ngDevMode ? [{ debugName: "strengthStyleClass" }] : /* istanbul ignore next */ []));
81
+ requiredOptionsLength = computed(() => Object.values(this.mergedOptions()).filter(Boolean).length, /* @ts-ignore */
82
+ ...(ngDevMode ? [{ debugName: "requiredOptionsLength" }] : /* istanbul ignore next */ []));
65
83
  mergedOptions = computed(() => ({
66
84
  ...DEFAULT_OPTIONS,
67
- ...(this.control()?.options ?? {})
68
- }), ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
85
+ ...(this.control()?.options ?? {}),
86
+ }), /* @ts-ignore */
87
+ ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
69
88
  mergedFeedback = computed(() => ({
70
89
  ...DEFAULT_FEEDBACK,
71
- ...this.feedback()
72
- }), ...(ngDevMode ? [{ debugName: "mergedFeedback" }] : /* istanbul ignore next */ []));
90
+ ...this.feedback(),
91
+ }), /* @ts-ignore */
92
+ ...(ngDevMode ? [{ debugName: "mergedFeedback" }] : /* istanbul ignore next */ []));
73
93
  constructor() {
74
94
  effect((onCleanup) => {
75
95
  const control = this.control();
76
96
  if (!control?.formControl)
77
97
  return;
78
98
  this.passwordValue.set(control.formControl.value ?? '');
79
- const sub = control.formControl.valueChanges.subscribe(value => {
99
+ const sub = control.formControl.valueChanges.subscribe((value) => {
80
100
  this.passwordValue.set(value ?? '');
81
101
  });
82
102
  onCleanup(() => sub.unsubscribe());
@@ -85,17 +105,17 @@ class YsPasswordStrength {
85
105
  this.minLengthRegx = new RegExp(`.{${this.mergedOptions().requiredMinLength},}$`);
86
106
  control.formControl?.setValidators([
87
107
  Validators.required,
88
- Validators.pattern(strongPasswordRegex)
108
+ Validators.pattern(strongPasswordRegex),
89
109
  ]);
90
110
  control.formControl?.updateValueAndValidity();
91
111
  });
92
112
  }
93
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsPasswordStrength, deps: [], target: i0.ɵɵFactoryTarget.Component });
94
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: YsPasswordStrength, isStandalone: true, selector: "ys-password-strength", inputs: { passwordHelp: { classPropertyName: "passwordHelp", publicName: "passwordHelp", isSignal: true, isRequired: false, transformFunction: null }, displayFeedback: { classPropertyName: "displayFeedback", publicName: "displayFeedback", isSignal: true, isRequired: false, transformFunction: null }, feedback: { classPropertyName: "feedback", publicName: "feedback", isSignal: true, isRequired: false, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (control()) {\n<div class=\"password-strength\">\n <div class=\"d-flex flex-row mt-1\">\n\n @if (this.requiredOptionsLength() > 4) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\" (strengthMeter() >= 0) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 3) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 1) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 2) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 2) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 1) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 3) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 0) {\n <hr class=\"rounded-start rounded-end\" [ngClass]=\"(strengthMeter() >= 4) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n </div>\n\n @if (passwordHelp()) {\n\n <small id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp()}}</small>\n\n }\n\n @if (displayFeedback() && control()?.formControl?.errors?.['pattern'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n\n @if (mergedOptions().requireUppercase && mergedFeedback().uppercase) {\n <span [ngClass]=\"{'text-success': hasUppercase()}\">{{mergedFeedback().uppercase}}</span>\n }\n\n @if (mergedOptions().requireLowercase && mergedFeedback().lowercase) {\n <span [ngClass]=\"{'text-success': hasLowercase()}\">{{mergedFeedback().lowercase}}</span>\n }\n\n @if (mergedOptions().requireDigit && mergedFeedback().digit) {\n <span [ngClass]=\"{'text-success': hasDigit()}\">{{mergedFeedback().digit}}</span>\n }\n\n @if (mergedOptions().requireNonAlphanumeric && mergedFeedback().nonAlphanumeric) {\n <span [ngClass]=\"{'text-success': hasNonAlphanumeric()}\">{{mergedFeedback().nonAlphanumeric}}</span>\n }\n\n @if (mergedOptions().requiredMinLength && mergedFeedback().minLength) {\n <span [ngClass]=\"{'text-success': hasMinLength()}\">{{mergedFeedback().minLength}}</span>\n\n }\n\n </div>\n\n }\n\n @if (control()?.formControl?.errors?.['required'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n {{mergedFeedback().required}}\n </div>\n\n }\n\n</div>\n\n}\n\n@if (!control()) {\n\n<div>\n Password strength control is undefined.\n</div>\n\n}", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
113
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsPasswordStrength, deps: [], target: i0.ɵɵFactoryTarget.Component });
114
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsPasswordStrength, isStandalone: true, selector: "ys-password-strength", inputs: { passwordHelp: { classPropertyName: "passwordHelp", publicName: "passwordHelp", isSignal: true, isRequired: false, transformFunction: null }, displayFeedback: { classPropertyName: "displayFeedback", publicName: "displayFeedback", isSignal: true, isRequired: false, transformFunction: null }, feedback: { classPropertyName: "feedback", publicName: "feedback", isSignal: true, isRequired: false, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (control()) {\n<div class=\"password-strength\">\n <div class=\"d-flex flex-row mt-1\">\n\n @if (this.requiredOptionsLength() > 4) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\" (strengthMeter() >= 0) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 3) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 1) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 2) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 2) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 1) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 3) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 0) {\n <hr class=\"rounded-start rounded-end\" [ngClass]=\"(strengthMeter() >= 4) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n </div>\n\n @if (passwordHelp()) {\n\n <small id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp()}}</small>\n\n }\n\n @if (displayFeedback() && control()?.formControl?.errors?.['pattern'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n\n @if (mergedOptions().requireUppercase && mergedFeedback().uppercase) {\n <span [ngClass]=\"{'text-success': hasUppercase()}\">{{mergedFeedback().uppercase}}</span>\n }\n\n @if (mergedOptions().requireLowercase && mergedFeedback().lowercase) {\n <span [ngClass]=\"{'text-success': hasLowercase()}\">{{mergedFeedback().lowercase}}</span>\n }\n\n @if (mergedOptions().requireDigit && mergedFeedback().digit) {\n <span [ngClass]=\"{'text-success': hasDigit()}\">{{mergedFeedback().digit}}</span>\n }\n\n @if (mergedOptions().requireNonAlphanumeric && mergedFeedback().nonAlphanumeric) {\n <span [ngClass]=\"{'text-success': hasNonAlphanumeric()}\">{{mergedFeedback().nonAlphanumeric}}</span>\n }\n\n @if (mergedOptions().requiredMinLength && mergedFeedback().minLength) {\n <span [ngClass]=\"{'text-success': hasMinLength()}\">{{mergedFeedback().minLength}}</span>\n\n }\n\n </div>\n\n }\n\n @if (control()?.formControl?.errors?.['required'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n {{mergedFeedback().required}}\n </div>\n\n }\n\n</div>\n\n}\n\n@if (!control()) {\n\n<div>\n Password strength control is undefined.\n</div>\n\n}", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
95
115
  }
96
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsPasswordStrength, decorators: [{
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsPasswordStrength, decorators: [{
97
117
  type: Component,
98
- args: [{ selector: 'ys-password-strength', imports: [NgClass], template: "@if (control()) {\n<div class=\"password-strength\">\n <div class=\"d-flex flex-row mt-1\">\n\n @if (this.requiredOptionsLength() > 4) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\" (strengthMeter() >= 0) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 3) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 1) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 2) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 2) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 1) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 3) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 0) {\n <hr class=\"rounded-start rounded-end\" [ngClass]=\"(strengthMeter() >= 4) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n </div>\n\n @if (passwordHelp()) {\n\n <small id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp()}}</small>\n\n }\n\n @if (displayFeedback() && control()?.formControl?.errors?.['pattern'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n\n @if (mergedOptions().requireUppercase && mergedFeedback().uppercase) {\n <span [ngClass]=\"{'text-success': hasUppercase()}\">{{mergedFeedback().uppercase}}</span>\n }\n\n @if (mergedOptions().requireLowercase && mergedFeedback().lowercase) {\n <span [ngClass]=\"{'text-success': hasLowercase()}\">{{mergedFeedback().lowercase}}</span>\n }\n\n @if (mergedOptions().requireDigit && mergedFeedback().digit) {\n <span [ngClass]=\"{'text-success': hasDigit()}\">{{mergedFeedback().digit}}</span>\n }\n\n @if (mergedOptions().requireNonAlphanumeric && mergedFeedback().nonAlphanumeric) {\n <span [ngClass]=\"{'text-success': hasNonAlphanumeric()}\">{{mergedFeedback().nonAlphanumeric}}</span>\n }\n\n @if (mergedOptions().requiredMinLength && mergedFeedback().minLength) {\n <span [ngClass]=\"{'text-success': hasMinLength()}\">{{mergedFeedback().minLength}}</span>\n\n }\n\n </div>\n\n }\n\n @if (control()?.formControl?.errors?.['required'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n {{mergedFeedback().required}}\n </div>\n\n }\n\n</div>\n\n}\n\n@if (!control()) {\n\n<div>\n Password strength control is undefined.\n</div>\n\n}", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"] }]
118
+ args: [{ selector: 'ys-password-strength', imports: [NgClass], changeDetection: ChangeDetectionStrategy.Eager, template: "@if (control()) {\n<div class=\"password-strength\">\n <div class=\"d-flex flex-row mt-1\">\n\n @if (this.requiredOptionsLength() > 4) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\" (strengthMeter() >= 0) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 3) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 1) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 2) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 2) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 1) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 3) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 0) {\n <hr class=\"rounded-start rounded-end\" [ngClass]=\"(strengthMeter() >= 4) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n </div>\n\n @if (passwordHelp()) {\n\n <small id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp()}}</small>\n\n }\n\n @if (displayFeedback() && control()?.formControl?.errors?.['pattern'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n\n @if (mergedOptions().requireUppercase && mergedFeedback().uppercase) {\n <span [ngClass]=\"{'text-success': hasUppercase()}\">{{mergedFeedback().uppercase}}</span>\n }\n\n @if (mergedOptions().requireLowercase && mergedFeedback().lowercase) {\n <span [ngClass]=\"{'text-success': hasLowercase()}\">{{mergedFeedback().lowercase}}</span>\n }\n\n @if (mergedOptions().requireDigit && mergedFeedback().digit) {\n <span [ngClass]=\"{'text-success': hasDigit()}\">{{mergedFeedback().digit}}</span>\n }\n\n @if (mergedOptions().requireNonAlphanumeric && mergedFeedback().nonAlphanumeric) {\n <span [ngClass]=\"{'text-success': hasNonAlphanumeric()}\">{{mergedFeedback().nonAlphanumeric}}</span>\n }\n\n @if (mergedOptions().requiredMinLength && mergedFeedback().minLength) {\n <span [ngClass]=\"{'text-success': hasMinLength()}\">{{mergedFeedback().minLength}}</span>\n\n }\n\n </div>\n\n }\n\n @if (control()?.formControl?.errors?.['required'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n {{mergedFeedback().required}}\n </div>\n\n }\n\n</div>\n\n}\n\n@if (!control()) {\n\n<div>\n Password strength control is undefined.\n</div>\n\n}", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"] }]
99
119
  }], ctorParameters: () => [], propDecorators: { passwordHelp: [{ type: i0.Input, args: [{ isSignal: true, alias: "passwordHelp", required: false }] }], displayFeedback: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayFeedback", required: false }] }], feedback: [{ type: i0.Input, args: [{ isSignal: true, alias: "feedback", required: false }] }], control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: false }] }] } });
100
120
 
101
121
  class YsPasswordStrengthDirective {
@@ -107,18 +127,24 @@ class YsPasswordStrengthDirective {
107
127
  componentRef = this.viewContainerRef.createComponent(YsPasswordStrength, {
108
128
  injector: this.injector
109
129
  });
110
- passwordHelp = input(null, ...(ngDevMode ? [{ debugName: "passwordHelp" }] : /* istanbul ignore next */ []));
111
- displayFeedback = input(true, ...(ngDevMode ? [{ debugName: "displayFeedback" }] : /* istanbul ignore next */ []));
112
- feedback = input({}, ...(ngDevMode ? [{ debugName: "feedback" }] : /* istanbul ignore next */ []));
113
- options = input({}, ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
130
+ passwordHelp = input(null, /* @ts-ignore */
131
+ ...(ngDevMode ? [{ debugName: "passwordHelp" }] : /* istanbul ignore next */ []));
132
+ displayFeedback = input(true, /* @ts-ignore */
133
+ ...(ngDevMode ? [{ debugName: "displayFeedback" }] : /* istanbul ignore next */ []));
134
+ feedback = input({}, /* @ts-ignore */
135
+ ...(ngDevMode ? [{ debugName: "feedback" }] : /* istanbul ignore next */ []));
136
+ options = input({}, /* @ts-ignore */
137
+ ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
114
138
  mergedOptions = computed(() => ({
115
139
  ...DEFAULT_OPTIONS,
116
140
  ...this.options()
117
- }), ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
141
+ }), /* @ts-ignore */
142
+ ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
118
143
  mergedFeedback = computed(() => ({
119
144
  ...DEFAULT_FEEDBACK,
120
145
  ...this.feedback()
121
- }), ...(ngDevMode ? [{ debugName: "mergedFeedback" }] : /* istanbul ignore next */ []));
146
+ }), /* @ts-ignore */
147
+ ...(ngDevMode ? [{ debugName: "mergedFeedback" }] : /* istanbul ignore next */ []));
122
148
  constructor() {
123
149
  effect(() => {
124
150
  const formControl = this.control.control;
@@ -128,10 +154,10 @@ class YsPasswordStrengthDirective {
128
154
  this.componentRef.setInput('control', { formControl: formControl, options: this.mergedOptions() });
129
155
  });
130
156
  }
131
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsPasswordStrengthDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
132
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.17", type: YsPasswordStrengthDirective, isStandalone: true, selector: "[ysPasswordStrength]", inputs: { passwordHelp: { classPropertyName: "passwordHelp", publicName: "passwordHelp", isSignal: true, isRequired: false, transformFunction: null }, displayFeedback: { classPropertyName: "displayFeedback", publicName: "displayFeedback", isSignal: true, isRequired: false, transformFunction: null }, feedback: { classPropertyName: "feedback", publicName: "feedback", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
157
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsPasswordStrengthDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
158
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: YsPasswordStrengthDirective, isStandalone: true, selector: "[ysPasswordStrength]", inputs: { passwordHelp: { classPropertyName: "passwordHelp", publicName: "passwordHelp", isSignal: true, isRequired: false, transformFunction: null }, displayFeedback: { classPropertyName: "displayFeedback", publicName: "displayFeedback", isSignal: true, isRequired: false, transformFunction: null }, feedback: { classPropertyName: "feedback", publicName: "feedback", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
133
159
  }
134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsPasswordStrengthDirective, decorators: [{
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsPasswordStrengthDirective, decorators: [{
135
161
  type: Directive,
136
162
  args: [{
137
163
  selector: '[ysPasswordStrength]',
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-password-strength.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/regx.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-feedback.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-option.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.html","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/directives/ys-password-strength-directive.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/yoozsoft-yoozsoft-ng-password-strength.ts"],"sourcesContent":["export const STRONG_PASSWORD_REGX: RegExp = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*]).{8,}$/;\r\nexport const UPPERCASE_REGEX: RegExp = /^.*[A-Z]/;\r\nexport const LOWERCASE_REGEX: RegExp = /^.*[a-z]/;\r\nexport const DIGIT_REGX: RegExp = /^.*[0-9].*/;\r\nexport const NON_ALPHANUMERIC_REGX: RegExp = /^.*[!@#$%^&*]/;\r\n// export const MinLength8Regx: RegExp = /^.{8,}/;","export interface StrengthValidationFeedback {\r\n required?: string;\r\n uppercase?: string;\r\n lowercase?: string;\r\n digit?: string;\r\n nonAlphanumeric?: string;\r\n minLength?: string;\r\n}\r\n\r\nexport const DEFAULT_FEEDBACK = <StrengthValidationFeedback>{\r\n required: 'Please enter a valid password.',\r\n uppercase: 'At least one uppercase letter.',\r\n lowercase: 'At least one lowercase letter.',\r\n digit: 'At least one digit.',\r\n nonAlphanumeric: 'At least one special character (e.g., !, @, #, $).',\r\n minLength: 'At least 8 characters long.',\r\n}","export interface StrengthValidationOption {\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireDigit?: boolean;\r\n requireNonAlphanumeric?: boolean;\r\n requiredMinLength: number;\r\n}\r\n\r\nexport const DEFAULT_OPTIONS = <StrengthValidationOption>{\r\n requireUppercase: true,\r\n requireLowercase: true,\r\n requireDigit: true,\r\n requireNonAlphanumeric: true,\r\n requiredMinLength: 8,\r\n}","import { NgClass } from '@angular/common';\nimport { Component, computed, effect, input, signal } from '@angular/core';\nimport { Validators } from '@angular/forms';\nimport { DEFAULT_FEEDBACK, DEFAULT_OPTIONS, DIGIT_REGX, LOWERCASE_REGEX, NON_ALPHANUMERIC_REGX, StrengthValidationControl, StrengthValidationFeedback, StrengthValidationOption, UPPERCASE_REGEX } from '../models';\n\n@Component({\n selector: 'ys-password-strength',\n imports: [NgClass],\n templateUrl: './ys-password-strength.html',\n styleUrl: './ys-password-strength.scss',\n})\nexport class YsPasswordStrength {\n\n private minLengthRegx: RegExp = new RegExp('');\n\n passwordHelp = input<string | null>(null);\n displayFeedback = input(true);\n feedback = input<Partial<StrengthValidationFeedback>>({});\n\n control = input<StrengthValidationControl>();\n\n private passwordValue = signal('');\n\n readonly hasUppercase = computed<boolean>(() =>\n UPPERCASE_REGEX.test(this.passwordValue())\n );\n\n readonly hasLowercase = computed<boolean>(() =>\n LOWERCASE_REGEX.test(this.passwordValue())\n );\n\n readonly hasDigit = computed<boolean>(() =>\n DIGIT_REGX.test(this.passwordValue())\n );\n\n readonly hasNonAlphanumeric = computed<boolean>(() =>\n NON_ALPHANUMERIC_REGX.test(this.passwordValue())\n );\n\n readonly hasMinLength = computed<boolean>(() =>\n this.minLengthRegx.test(this.passwordValue())\n );\n\n readonly strengthMeter = computed<number>(() => {\n\n let strength: number = -1;\n\n if (this.mergedOptions().requireUppercase && this.hasUppercase())\n strength += 1;\n if (this.mergedOptions().requireLowercase && this.hasLowercase())\n strength += 1;\n if (this.mergedOptions().requireDigit && this.hasDigit())\n strength += 1;\n if (this.mergedOptions().requireNonAlphanumeric && this.hasNonAlphanumeric())\n strength += 1;\n if (this.mergedOptions().requiredMinLength && this.hasMinLength())\n strength += 1;\n\n return strength + (5 - this.requiredOptionsLength());\n\n });\n\n readonly strengthStyleClass = computed<string>(() => {\n return this.strengthMeter() == 4 ? \"green\" :\n this.strengthMeter() == 3 ? \"yellow\" :\n this.strengthMeter() == 2 ? \"orange\" :\n this.strengthMeter() == 1 ? \"red\" :\n this.strengthMeter() == 0 ? \"pink\" :\n '';\n });\n\n readonly requiredOptionsLength = computed<number>(() =>\n Object.values(\n this.mergedOptions()\n ).filter(Boolean).length\n );\n\n readonly mergedOptions = computed<StrengthValidationOption>(() => ({\n ...DEFAULT_OPTIONS,\n ...(this.control()?.options ?? {})\n }));\n\n readonly mergedFeedback = computed<StrengthValidationFeedback>(() => ({\n ...DEFAULT_FEEDBACK,\n ...this.feedback()\n }));\n\n constructor() {\n effect((onCleanup) => {\n\n const control = this.control();\n\n if (!control?.formControl) return;\n\n this.passwordValue.set(\n control.formControl.value ?? ''\n );\n\n const sub = control.formControl.valueChanges.subscribe(value => {\n this.passwordValue.set(value ?? '');\n });\n\n onCleanup(() => sub.unsubscribe());\n\n // control.options ??= { ...DEFAULT_OPTIONS };\n\n const strongPasswordRegex = new RegExp(\n `${this.mergedOptions().requireUppercase ? '^(?=[^A-Z]*[A-Z])' : ''\n }${this.mergedOptions().requireLowercase ? '(?=[^a-z]*[a-z])' : ''\n }${this.mergedOptions().requireDigit ? '(?=\\\\D*\\\\d)' : ''\n }${this.mergedOptions().requireNonAlphanumeric ? '(?=.*[!@#$%^&*])' : ''\n }.{${this.mergedOptions().requiredMinLength},}$`\n );\n\n this.minLengthRegx = new RegExp(`.{${this.mergedOptions().requiredMinLength},}$`);\n\n control.formControl?.setValidators([\n Validators.required,\n Validators.pattern(strongPasswordRegex)\n ]);\n\n control.formControl?.updateValueAndValidity();\n\n });\n }\n\n}\n","@if (control()) {\n<div class=\"password-strength\">\n <div class=\"d-flex flex-row mt-1\">\n\n @if (this.requiredOptionsLength() > 4) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\" (strengthMeter() >= 0) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 3) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 1) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 2) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 2) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 1) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 3) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 0) {\n <hr class=\"rounded-start rounded-end\" [ngClass]=\"(strengthMeter() >= 4) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n </div>\n\n @if (passwordHelp()) {\n\n <small id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp()}}</small>\n\n }\n\n @if (displayFeedback() && control()?.formControl?.errors?.['pattern'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n\n @if (mergedOptions().requireUppercase && mergedFeedback().uppercase) {\n <span [ngClass]=\"{'text-success': hasUppercase()}\">{{mergedFeedback().uppercase}}</span>\n }\n\n @if (mergedOptions().requireLowercase && mergedFeedback().lowercase) {\n <span [ngClass]=\"{'text-success': hasLowercase()}\">{{mergedFeedback().lowercase}}</span>\n }\n\n @if (mergedOptions().requireDigit && mergedFeedback().digit) {\n <span [ngClass]=\"{'text-success': hasDigit()}\">{{mergedFeedback().digit}}</span>\n }\n\n @if (mergedOptions().requireNonAlphanumeric && mergedFeedback().nonAlphanumeric) {\n <span [ngClass]=\"{'text-success': hasNonAlphanumeric()}\">{{mergedFeedback().nonAlphanumeric}}</span>\n }\n\n @if (mergedOptions().requiredMinLength && mergedFeedback().minLength) {\n <span [ngClass]=\"{'text-success': hasMinLength()}\">{{mergedFeedback().minLength}}</span>\n\n }\n\n </div>\n\n }\n\n @if (control()?.formControl?.errors?.['required'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n {{mergedFeedback().required}}\n </div>\n\n }\n\n</div>\n\n}\n\n@if (!control()) {\n\n<div>\n Password strength control is undefined.\n</div>\n\n}","import { computed, Directive, effect, inject, Injector, input, ViewContainerRef } from '@angular/core';\nimport { AbstractControl, NgControl } from '@angular/forms';\nimport { DEFAULT_FEEDBACK, DEFAULT_OPTIONS, StrengthValidationFeedback, StrengthValidationOption } from '../models';\nimport { YsPasswordStrength } from '../ys-password-strength/ys-password-strength';\n\n@Directive({\n selector: '[ysPasswordStrength]',\n})\nexport class YsPasswordStrengthDirective {\n\n private viewContainerRef = inject(ViewContainerRef);\n private injector = inject(Injector);\n private control = inject(NgControl, {\n self: true\n });\n\n private componentRef = this.viewContainerRef.createComponent(\n YsPasswordStrength, {\n injector: this.injector\n }\n );\n\n passwordHelp = input<string | null>(null);\n displayFeedback = input(true);\n feedback = input<Partial<StrengthValidationFeedback>>({});\n options = input<Partial<StrengthValidationOption>>({});\n\n readonly mergedOptions = computed<StrengthValidationOption>(() => ({\n ...DEFAULT_OPTIONS,\n ...this.options()\n }));\n\n readonly mergedFeedback = computed<StrengthValidationFeedback>(() => ({\n ...DEFAULT_FEEDBACK,\n ...this.feedback()\n }));\n\n constructor() {\n\n effect(() => {\n const formControl: AbstractControl<any, any> | null = this.control.control;\n\n this.componentRef.setInput('passwordHelp', this.passwordHelp());\n this.componentRef.setInput('displayFeedback', this.displayFeedback());\n this.componentRef.setInput('feedback', this.mergedFeedback());\n this.componentRef.setInput('control', { formControl: formControl, options: this.mergedOptions() });\n\n });\n }\n\n}","/*\r\n * Public API Surface of ys-password-strength\r\n */\r\n\r\nexport * from './src/directives';\r\nexport * from './src/models';\r\nexport * from './src/ys-password-strength/ys-password-strength';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAO,MAAM,oBAAoB,GAAW;AACrC,MAAM,eAAe,GAAW;AAChC,MAAM,eAAe,GAAW;AAChC,MAAM,UAAU,GAAW;AAC3B,MAAM,qBAAqB,GAAW;AAC7C;;ACIO,MAAM,gBAAgB,GAA+B;AACxD,IAAA,QAAQ,EAAE,gCAAgC;AAC1C,IAAA,SAAS,EAAE,gCAAgC;AAC3C,IAAA,SAAS,EAAE,gCAAgC;AAC3C,IAAA,KAAK,EAAE,qBAAqB;AAC5B,IAAA,eAAe,EAAE,oDAAoD;AACrE,IAAA,SAAS,EAAE,6BAA6B;;;ACPrC,MAAM,eAAe,GAA6B;AACrD,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,sBAAsB,EAAE,IAAI;AAC5B,IAAA,iBAAiB,EAAE,CAAC;;;MCFX,kBAAkB,CAAA;AAErB,IAAA,aAAa,GAAW,IAAI,MAAM,CAAC,EAAE,CAAC;AAE9C,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,mFAAC;AACzC,IAAA,eAAe,GAAG,KAAK,CAAC,IAAI,sFAAC;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAsC,EAAE,+EAAC;IAEzD,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA6B;AAEpC,IAAA,aAAa,GAAG,MAAM,CAAC,EAAE,oFAAC;AAEzB,IAAA,YAAY,GAAG,QAAQ,CAAU,MACxC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,mFAC3C;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAU,MACxC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,mFAC3C;AAEQ,IAAA,QAAQ,GAAG,QAAQ,CAAU,MACpC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,+EACtC;AAEQ,IAAA,kBAAkB,GAAG,QAAQ,CAAU,MAC9C,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,yFACjD;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAU,MACxC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,mFAC9C;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAS,MAAK;AAE7C,QAAA,IAAI,QAAQ,GAAW,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,gBAAgB,IAAI,IAAI,CAAC,YAAY,EAAE;YAC9D,QAAQ,IAAI,CAAC;QACf,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,gBAAgB,IAAI,IAAI,CAAC,YAAY,EAAE;YAC9D,QAAQ,IAAI,CAAC;QACf,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE;YACtD,QAAQ,IAAI,CAAC;QACf,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,sBAAsB,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC1E,QAAQ,IAAI,CAAC;QACf,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,iBAAiB,IAAI,IAAI,CAAC,YAAY,EAAE;YAC/D,QAAQ,IAAI,CAAC;QAEf,OAAO,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAEtD,IAAA,CAAC,oFAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAS,MAAK;QAClD,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,OAAO;YACxC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,QAAQ;gBAClC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,QAAQ;oBAClC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,KAAK;wBAC/B,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,MAAM;AAChC,4BAAA,EAAE;AACd,IAAA,CAAC,yFAAC;IAEO,qBAAqB,GAAG,QAAQ,CAAS,MAChD,MAAM,CAAC,MAAM,CACX,IAAI,CAAC,aAAa,EAAE,CACrB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACzB;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAA2B,OAAO;AACjE,QAAA,GAAG,eAAe;QAClB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE;AAClC,KAAA,CAAC,oFAAC;AAEM,IAAA,cAAc,GAAG,QAAQ,CAA6B,OAAO;AACpE,QAAA,GAAG,gBAAgB;QACnB,GAAG,IAAI,CAAC,QAAQ;AACjB,KAAA,CAAC,qFAAC;AAEH,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AAEnB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAE9B,IAAI,CAAC,OAAO,EAAE,WAAW;gBAAE;AAE3B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAChC;AAED,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,IAAG;gBAC7D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;AACrC,YAAA,CAAC,CAAC;YAEF,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;;AAIlC,YAAA,MAAM,mBAAmB,GAAG,IAAI,MAAM,CACpC,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,gBAAgB,GAAG,mBAAmB,GAAG,EACjE,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,gBAAgB,GAAG,kBAAkB,GAAG,EAChE,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,GAAG,aAAa,GAAG,EACvD,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,sBAAsB,GAAG,kBAAkB,GAAG,EACtE,CAAA,EAAA,EAAK,IAAI,CAAC,aAAa,EAAE,CAAC,iBAAiB,CAAA,GAAA,CAAK,CACjD;AAED,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,MAAM,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,aAAa,EAAE,CAAC,iBAAiB,CAAA,GAAA,CAAK,CAAC;AAEjF,YAAA,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC;AACjC,gBAAA,UAAU,CAAC,QAAQ;AACnB,gBAAA,UAAU,CAAC,OAAO,CAAC,mBAAmB;AACvC,aAAA,CAAC;AAEF,YAAA,OAAO,CAAC,WAAW,EAAE,sBAAsB,EAAE;AAE/C,QAAA,CAAC,CAAC;IACJ;wGAjHW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX/B,s+FAsFC,EAAA,MAAA,EAAA,CAAA,+aAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/EW,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIN,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,sBAAsB,EAAA,OAAA,EACvB,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,s+FAAA,EAAA,MAAA,EAAA,CAAA,+aAAA,CAAA,EAAA;;;MECP,2BAA2B,CAAA;AAE9B,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE;AAClC,QAAA,IAAI,EAAE;AACP,KAAA,CAAC;IAEM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAC1D,kBAAkB,EAAE;QACpB,QAAQ,EAAE,IAAI,CAAC;AAChB,KAAA,CACA;AAED,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,mFAAC;AACzC,IAAA,eAAe,GAAG,KAAK,CAAC,IAAI,sFAAC;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAsC,EAAE,+EAAC;AACzD,IAAA,OAAO,GAAG,KAAK,CAAoC,EAAE,8EAAC;AAE7C,IAAA,aAAa,GAAG,QAAQ,CAA2B,OAAO;AACjE,QAAA,GAAG,eAAe;QAClB,GAAG,IAAI,CAAC,OAAO;AAChB,KAAA,CAAC,oFAAC;AAEM,IAAA,cAAc,GAAG,QAAQ,CAA6B,OAAO;AACpE,QAAA,GAAG,gBAAgB;QACnB,GAAG,IAAI,CAAC,QAAQ;AACjB,KAAA,CAAC,qFAAC;AAEH,IAAA,WAAA,GAAA;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,WAAW,GAAqC,IAAI,CAAC,OAAO,CAAC,OAAO;AAE1E,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC/D,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AACrE,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7D,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;AAEpG,QAAA,CAAC,CAAC;IACJ;wGAxCW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AACjC,iBAAA;;;ACPD;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-password-strength.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/regx.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-feedback.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-option.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.html","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/directives/ys-password-strength-directive.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/yoozsoft-yoozsoft-ng-password-strength.ts"],"sourcesContent":["export const STRONG_PASSWORD_REGX: RegExp = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*]).{8,}$/;\r\nexport const UPPERCASE_REGEX: RegExp = /^.*[A-Z]/;\r\nexport const LOWERCASE_REGEX: RegExp = /^.*[a-z]/;\r\nexport const DIGIT_REGX: RegExp = /^.*[0-9].*/;\r\nexport const NON_ALPHANUMERIC_REGX: RegExp = /^.*[!@#$%^&*]/;\r\n// export const MinLength8Regx: RegExp = /^.{8,}/;","export interface StrengthValidationFeedback {\r\n required?: string;\r\n uppercase?: string;\r\n lowercase?: string;\r\n digit?: string;\r\n nonAlphanumeric?: string;\r\n minLength?: string;\r\n}\r\n\r\nexport const DEFAULT_FEEDBACK = <StrengthValidationFeedback>{\r\n required: 'Please enter a valid password.',\r\n uppercase: 'At least one uppercase letter.',\r\n lowercase: 'At least one lowercase letter.',\r\n digit: 'At least one digit.',\r\n nonAlphanumeric: 'At least one special character (e.g., !, @, #, $).',\r\n minLength: 'At least 8 characters long.',\r\n}","export interface StrengthValidationOption {\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireDigit?: boolean;\r\n requireNonAlphanumeric?: boolean;\r\n requiredMinLength: number;\r\n}\r\n\r\nexport const DEFAULT_OPTIONS = <StrengthValidationOption>{\r\n requireUppercase: true,\r\n requireLowercase: true,\r\n requireDigit: true,\r\n requireNonAlphanumeric: true,\r\n requiredMinLength: 8,\r\n}","import { NgClass } from '@angular/common';\r\nimport { Component, computed, effect, input, signal, ChangeDetectionStrategy } from '@angular/core';\r\nimport { Validators } from '@angular/forms';\r\nimport {\r\n DEFAULT_FEEDBACK,\r\n DEFAULT_OPTIONS,\r\n DIGIT_REGX,\r\n LOWERCASE_REGEX,\r\n NON_ALPHANUMERIC_REGX,\r\n StrengthValidationControl,\r\n StrengthValidationFeedback,\r\n StrengthValidationOption,\r\n UPPERCASE_REGEX,\r\n} from '../models';\r\n\r\n@Component({\r\n selector: 'ys-password-strength',\r\n imports: [NgClass],\r\n templateUrl: './ys-password-strength.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-password-strength.scss',\r\n})\r\nexport class YsPasswordStrength {\r\n private minLengthRegx: RegExp = new RegExp('');\r\n\r\n passwordHelp = input<string | null>(null);\r\n displayFeedback = input(true);\r\n feedback = input<Partial<StrengthValidationFeedback>>({});\r\n\r\n control = input<StrengthValidationControl>();\r\n\r\n private passwordValue = signal('');\r\n\r\n readonly hasUppercase = computed<boolean>(() => UPPERCASE_REGEX.test(this.passwordValue()));\r\n\r\n readonly hasLowercase = computed<boolean>(() => LOWERCASE_REGEX.test(this.passwordValue()));\r\n\r\n readonly hasDigit = computed<boolean>(() => DIGIT_REGX.test(this.passwordValue()));\r\n\r\n readonly hasNonAlphanumeric = computed<boolean>(() =>\r\n NON_ALPHANUMERIC_REGX.test(this.passwordValue()),\r\n );\r\n\r\n readonly hasMinLength = computed<boolean>(() => this.minLengthRegx.test(this.passwordValue()));\r\n\r\n readonly strengthMeter = computed<number>(() => {\r\n let strength: number = -1;\r\n\r\n if (this.mergedOptions().requireUppercase && this.hasUppercase()) strength += 1;\r\n if (this.mergedOptions().requireLowercase && this.hasLowercase()) strength += 1;\r\n if (this.mergedOptions().requireDigit && this.hasDigit()) strength += 1;\r\n if (this.mergedOptions().requireNonAlphanumeric && this.hasNonAlphanumeric()) strength += 1;\r\n if (this.mergedOptions().requiredMinLength && this.hasMinLength()) strength += 1;\r\n\r\n return strength + (5 - this.requiredOptionsLength());\r\n });\r\n\r\n readonly strengthStyleClass = computed<string>(() => {\r\n return this.strengthMeter() == 4\r\n ? 'green'\r\n : this.strengthMeter() == 3\r\n ? 'yellow'\r\n : this.strengthMeter() == 2\r\n ? 'orange'\r\n : this.strengthMeter() == 1\r\n ? 'red'\r\n : this.strengthMeter() == 0\r\n ? 'pink'\r\n : '';\r\n });\r\n\r\n readonly requiredOptionsLength = computed<number>(\r\n () => Object.values(this.mergedOptions()).filter(Boolean).length,\r\n );\r\n\r\n readonly mergedOptions = computed<StrengthValidationOption>(() => ({\r\n ...DEFAULT_OPTIONS,\r\n ...(this.control()?.options ?? {}),\r\n }));\r\n\r\n readonly mergedFeedback = computed<StrengthValidationFeedback>(() => ({\r\n ...DEFAULT_FEEDBACK,\r\n ...this.feedback(),\r\n }));\r\n\r\n constructor() {\r\n effect((onCleanup) => {\r\n const control = this.control();\r\n\r\n if (!control?.formControl) return;\r\n\r\n this.passwordValue.set(control.formControl.value ?? '');\r\n\r\n const sub = control.formControl.valueChanges.subscribe((value) => {\r\n this.passwordValue.set(value ?? '');\r\n });\r\n\r\n onCleanup(() => sub.unsubscribe());\r\n\r\n // control.options ??= { ...DEFAULT_OPTIONS };\r\n\r\n const strongPasswordRegex = new RegExp(\r\n `${this.mergedOptions().requireUppercase ? '^(?=[^A-Z]*[A-Z])' : ''}${\r\n this.mergedOptions().requireLowercase ? '(?=[^a-z]*[a-z])' : ''\r\n }${this.mergedOptions().requireDigit ? '(?=\\\\D*\\\\d)' : ''}${\r\n this.mergedOptions().requireNonAlphanumeric ? '(?=.*[!@#$%^&*])' : ''\r\n }.{${this.mergedOptions().requiredMinLength},}$`,\r\n );\r\n\r\n this.minLengthRegx = new RegExp(`.{${this.mergedOptions().requiredMinLength},}$`);\r\n\r\n control.formControl?.setValidators([\r\n Validators.required,\r\n Validators.pattern(strongPasswordRegex),\r\n ]);\r\n\r\n control.formControl?.updateValueAndValidity();\r\n });\r\n }\r\n}\r\n","@if (control()) {\n<div class=\"password-strength\">\n <div class=\"d-flex flex-row mt-1\">\n\n @if (this.requiredOptionsLength() > 4) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\" (strengthMeter() >= 0) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 3) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 1) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 2) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 2) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 1) {\n <hr class=\"rounded-start rounded-end me-1\" [ngClass]=\"(strengthMeter() >= 3) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n @if (this.requiredOptionsLength() > 0) {\n <hr class=\"rounded-start rounded-end\" [ngClass]=\"(strengthMeter() >= 4) ? strengthStyleClass() : 'gray'\"\n [style.width.%]=\"[100 / requiredOptionsLength()]\">\n }\n\n </div>\n\n @if (passwordHelp()) {\n\n <small id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp()}}</small>\n\n }\n\n @if (displayFeedback() && control()?.formControl?.errors?.['pattern'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n\n @if (mergedOptions().requireUppercase && mergedFeedback().uppercase) {\n <span [ngClass]=\"{'text-success': hasUppercase()}\">{{mergedFeedback().uppercase}}</span>\n }\n\n @if (mergedOptions().requireLowercase && mergedFeedback().lowercase) {\n <span [ngClass]=\"{'text-success': hasLowercase()}\">{{mergedFeedback().lowercase}}</span>\n }\n\n @if (mergedOptions().requireDigit && mergedFeedback().digit) {\n <span [ngClass]=\"{'text-success': hasDigit()}\">{{mergedFeedback().digit}}</span>\n }\n\n @if (mergedOptions().requireNonAlphanumeric && mergedFeedback().nonAlphanumeric) {\n <span [ngClass]=\"{'text-success': hasNonAlphanumeric()}\">{{mergedFeedback().nonAlphanumeric}}</span>\n }\n\n @if (mergedOptions().requiredMinLength && mergedFeedback().minLength) {\n <span [ngClass]=\"{'text-success': hasMinLength()}\">{{mergedFeedback().minLength}}</span>\n\n }\n\n </div>\n\n }\n\n @if (control()?.formControl?.errors?.['required'] && (control()?.formControl?.touched ||\n control()?.formControl?.dirty)) {\n\n <div class=\"invalid-feedback d-grid \">\n {{mergedFeedback().required}}\n </div>\n\n }\n\n</div>\n\n}\n\n@if (!control()) {\n\n<div>\n Password strength control is undefined.\n</div>\n\n}","import { computed, Directive, effect, inject, Injector, input, ViewContainerRef } from '@angular/core';\nimport { AbstractControl, NgControl } from '@angular/forms';\nimport { DEFAULT_FEEDBACK, DEFAULT_OPTIONS, StrengthValidationFeedback, StrengthValidationOption } from '../models';\nimport { YsPasswordStrength } from '../ys-password-strength/ys-password-strength';\n\n@Directive({\n selector: '[ysPasswordStrength]',\n})\nexport class YsPasswordStrengthDirective {\n\n private viewContainerRef = inject(ViewContainerRef);\n private injector = inject(Injector);\n private control = inject(NgControl, {\n self: true\n });\n\n private componentRef = this.viewContainerRef.createComponent(\n YsPasswordStrength, {\n injector: this.injector\n }\n );\n\n passwordHelp = input<string | null>(null);\n displayFeedback = input(true);\n feedback = input<Partial<StrengthValidationFeedback>>({});\n options = input<Partial<StrengthValidationOption>>({});\n\n readonly mergedOptions = computed<StrengthValidationOption>(() => ({\n ...DEFAULT_OPTIONS,\n ...this.options()\n }));\n\n readonly mergedFeedback = computed<StrengthValidationFeedback>(() => ({\n ...DEFAULT_FEEDBACK,\n ...this.feedback()\n }));\n\n constructor() {\n\n effect(() => {\n const formControl: AbstractControl<any, any> | null = this.control.control;\n\n this.componentRef.setInput('passwordHelp', this.passwordHelp());\n this.componentRef.setInput('displayFeedback', this.displayFeedback());\n this.componentRef.setInput('feedback', this.mergedFeedback());\n this.componentRef.setInput('control', { formControl: formControl, options: this.mergedOptions() });\n\n });\n }\n\n}","/*\r\n * Public API Surface of ys-password-strength\r\n */\r\n\r\nexport * from './src/directives';\r\nexport * from './src/models';\r\nexport * from './src/ys-password-strength/ys-password-strength';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -22,10 +22,10 @@ class YsPersianDatePipe {
22
22
  }
23
23
  return JalaliDate.format(value, FORMATS[format]);
24
24
  }
25
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsPersianDatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
26
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: YsPersianDatePipe, isStandalone: true, name: "ysPersianDate" });
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsPersianDatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
26
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: YsPersianDatePipe, isStandalone: true, name: "ysPersianDate" });
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsPersianDatePipe, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsPersianDatePipe, decorators: [{
29
29
  type: Pipe,
30
30
  args: [{
31
31
  name: 'ysPersianDate',
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-pipes.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/pipes/src/ys-persian-date-pipe.ts","../../../../projects/yoozsoft/yoozsoft-ng/pipes/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/pipes/yoozsoft-yoozsoft-ng-pipes.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { JalaliDate, PersianDateFormat } from '@yoozsoft/yoozsoft-ng/date';\n\nconst FORMATS: Record<PersianDateFormat, string> = {\n shortDate: 'yyyy/MM/dd',\n mediumDate: 'dd MMMM yyyy',\n longDate: 'dd MMMM yyyy',\n fullDate: 'EEEE dd MMMM yyyy',\n\n shortTime: 'HH:mm',\n mediumTime: 'HH:mm:ss',\n longTime: 'HH:mm:ss',\n\n short: 'yyyy/MM/dd HH:mm',\n medium: 'dd MMMM yyyy HH:mm',\n long: 'dd MMMM yyyy HH:mm:ss',\n full: 'EEEE dd MMMM yyyy HH:mm:ss'\n};\n\n@Pipe({\n name: 'ysPersianDate',\n})\nexport class YsPersianDatePipe implements PipeTransform {\n\n transform(\n value: Date | string | number | null | undefined,\n format: PersianDateFormat = 'shortDate'\n ): string {\n\n if (value == null || value === '') {\n return '';\n }\n\n return JalaliDate.format(value, FORMATS[format]);\n }\n\n}\n\n/**Sample formats */\n// {{ value | persianDate }}\n// {{ value | persianDate:'shortDate' }}\n// {{ value | persianDate:'mediumDate' }}\n// {{ value | persianDate:'longDate' }}\n// {{ value | persianDate:'fullDate' }}\n\n// {{ value | persianDate:'short' }}\n// {{ value | persianDate:'medium' }}\n// {{ value | persianDate:'long' }}\n// {{ value | persianDate:'full' }}\n","/*\r\n * Public API Surface of ysPersianDatePipe\r\n */\r\n\r\nexport * from './src/ys-persian-date-pipe';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAGA,MAAM,OAAO,GAAsC;AACjD,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,UAAU,EAAE,cAAc;AAC1B,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,QAAQ,EAAE,mBAAmB;AAE7B,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,UAAU,EAAE,UAAU;AACtB,IAAA,QAAQ,EAAE,UAAU;AAEpB,IAAA,KAAK,EAAE,kBAAkB;AACzB,IAAA,MAAM,EAAE,oBAAoB;AAC5B,IAAA,IAAI,EAAE,uBAAuB;AAC7B,IAAA,IAAI,EAAE;CACP;MAKY,iBAAiB,CAAA;AAE5B,IAAA,SAAS,CACP,KAAgD,EAChD,MAAA,GAA4B,WAAW,EAAA;QAGvC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACjC,YAAA,OAAO,EAAE;QACX;QAEA,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD;wGAZW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,eAAe;AACtB,iBAAA;;;ACrBD;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-pipes.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/pipes/src/ys-persian-date-pipe.ts","../../../../projects/yoozsoft/yoozsoft-ng/pipes/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/pipes/yoozsoft-yoozsoft-ng-pipes.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { JalaliDate, PersianDateFormat } from '@yoozsoft/yoozsoft-ng/date';\n\nconst FORMATS: Record<PersianDateFormat, string> = {\n shortDate: 'yyyy/MM/dd',\n mediumDate: 'dd MMMM yyyy',\n longDate: 'dd MMMM yyyy',\n fullDate: 'EEEE dd MMMM yyyy',\n\n shortTime: 'HH:mm',\n mediumTime: 'HH:mm:ss',\n longTime: 'HH:mm:ss',\n\n short: 'yyyy/MM/dd HH:mm',\n medium: 'dd MMMM yyyy HH:mm',\n long: 'dd MMMM yyyy HH:mm:ss',\n full: 'EEEE dd MMMM yyyy HH:mm:ss'\n};\n\n@Pipe({\n name: 'ysPersianDate',\n})\nexport class YsPersianDatePipe implements PipeTransform {\n\n transform(\n value: Date | string | number | null | undefined,\n format: PersianDateFormat = 'shortDate'\n ): string {\n\n if (value == null || value === '') {\n return '';\n }\n\n return JalaliDate.format(value, FORMATS[format]);\n }\n\n}\n\n/**Sample formats */\n// {{ value | persianDate }}\n// {{ value | persianDate:'shortDate' }}\n// {{ value | persianDate:'mediumDate' }}\n// {{ value | persianDate:'longDate' }}\n// {{ value | persianDate:'fullDate' }}\n\n// {{ value | persianDate:'short' }}\n// {{ value | persianDate:'medium' }}\n// {{ value | persianDate:'long' }}\n// {{ value | persianDate:'full' }}\n","/*\r\n * Public API Surface of ysPersianDatePipe\r\n */\r\n\r\nexport * from './src/ys-persian-date-pipe';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAGA,MAAM,OAAO,GAAsC;AACjD,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,UAAU,EAAE,cAAc;AAC1B,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,QAAQ,EAAE,mBAAmB;AAE7B,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,UAAU,EAAE,UAAU;AACtB,IAAA,QAAQ,EAAE,UAAU;AAEpB,IAAA,KAAK,EAAE,kBAAkB;AACzB,IAAA,MAAM,EAAE,oBAAoB;AAC5B,IAAA,IAAI,EAAE,uBAAuB;AAC7B,IAAA,IAAI,EAAE;CACP;MAKY,iBAAiB,CAAA;AAE5B,IAAA,SAAS,CACP,KAAgD,EAChD,MAAA,GAA4B,WAAW,EAAA;QAGvC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACjC,YAAA,OAAO,EAAE;QACX;QAEA,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD;uGAZW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,eAAe;AACtB,iBAAA;;;ACrBD;;AAEG;;ACFH;;AAEG;;;;"}
@@ -1,11 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, computed, Injectable, inject, PLATFORM_ID, input, Component } from '@angular/core';
2
+ import { signal, computed, Injectable, inject, PLATFORM_ID, input, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { isPlatformBrowser, NgClass } from '@angular/common';
4
4
 
5
5
  class ProgressService {
6
- _activeRequests = signal(0, ...(ngDevMode ? [{ debugName: "_activeRequests" }] : /* istanbul ignore next */ []));
6
+ _activeRequests = signal(0, /* @ts-ignore */
7
+ ...(ngDevMode ? [{ debugName: "_activeRequests" }] : /* istanbul ignore next */ []));
7
8
  /** loading = Do we have at least one active request? */
8
- loading = computed(() => this._activeRequests() > 0, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
9
+ loading = computed(() => this._activeRequests() > 0, /* @ts-ignore */
10
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
9
11
  show() {
10
12
  this._activeRequests.update(v => v + 1);
11
13
  }
@@ -15,23 +17,29 @@ class ProgressService {
15
17
  reset() {
16
18
  this._activeRequests.set(0);
17
19
  }
18
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ProgressService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ProgressService });
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ProgressService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
21
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ProgressService });
20
22
  }
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ProgressService, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ProgressService, decorators: [{
22
24
  type: Injectable
23
25
  }] });
24
26
 
25
27
  class YsProgress {
26
28
  progressService;
27
29
  platformId = inject(PLATFORM_ID);
28
- reverse = input(false, ...(ngDevMode ? [{ debugName: "reverse" }] : /* istanbul ignore next */ []));
29
- styleClass = input(null, ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
30
- height = input(20, ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
31
- label = input(null, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
32
- rtl = input(...(ngDevMode ? [undefined, { debugName: "rtl" }] : /* istanbul ignore next */ []));
30
+ reverse = input(false, /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "reverse" }] : /* istanbul ignore next */ []));
32
+ styleClass = input(null, /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
34
+ height = input(20, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
36
+ label = input(null, /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
38
+ rtl = input(/* @ts-ignore */
39
+ ...(ngDevMode ? [undefined, { debugName: "rtl" }] : /* istanbul ignore next */ []));
33
40
  loading;
34
- showLabel = computed(() => this.loading() && !!this.label(), ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
41
+ showLabel = computed(() => this.loading() && !!this.label(), /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
35
43
  isRtl = computed(() => {
36
44
  const rtl = this.rtl();
37
45
  if (rtl !== undefined) {
@@ -41,17 +49,18 @@ class YsProgress {
41
49
  return false;
42
50
  }
43
51
  return document.documentElement.dir === 'rtl';
44
- }, ...(ngDevMode ? [{ debugName: "isRtl" }] : /* istanbul ignore next */ []));
52
+ }, /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "isRtl" }] : /* istanbul ignore next */ []));
45
54
  constructor(progressService) {
46
55
  this.progressService = progressService;
47
56
  this.loading = this.progressService.loading;
48
57
  }
49
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsProgress, deps: [{ token: ProgressService }], target: i0.ɵɵFactoryTarget.Component });
50
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: YsProgress, isStandalone: true, selector: "ys-progress", inputs: { reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, rtl: { classPropertyName: "rtl", publicName: "rtl", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"progress\" role=\"progressbar\" [style.height.px]=\"height()\">\n\n <div class=\"progress-bar\" [class.indeterminate]=\"loading()\" [class.direction-reverse]=\"reverse()\"\n [class.rtl-progress]=\"isRtl()\" [ngClass]=\"styleClass()\">\n\n @if(showLabel()){\n {{ label() }}\n }\n\n </div>\n</div>", styles: ["@keyframes progress-indeterminate-ltr{0%{inset-inline-start:-25%;width:25%}to{inset-inline-start:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{inset-inline-start:100%;width:25%}to{inset-inline-start:-25%;width:25%}}.progress-bar.indeterminate{position:relative;animation:progress-indeterminate-ltr 3s linear infinite}.progress-bar.indeterminate.rtl-progress{animation-name:progress-indeterminate-rtl}.direction-reverse{animation-direction:reverse!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsProgress, deps: [{ token: ProgressService }], target: i0.ɵɵFactoryTarget.Component });
59
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsProgress, isStandalone: true, selector: "ys-progress", inputs: { reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, rtl: { classPropertyName: "rtl", publicName: "rtl", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"progress\" role=\"progressbar\" [style.height.px]=\"height()\">\n\n <div class=\"progress-bar\" [class.indeterminate]=\"loading()\" [class.direction-reverse]=\"reverse()\"\n [class.rtl-progress]=\"isRtl()\" [ngClass]=\"styleClass()\">\n\n @if(showLabel()){\n {{ label() }}\n }\n\n </div>\n</div>", styles: ["@keyframes progress-indeterminate-ltr{0%{inset-inline-start:-25%;width:25%}to{inset-inline-start:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{inset-inline-start:100%;width:25%}to{inset-inline-start:-25%;width:25%}}.progress-bar.indeterminate{position:relative;animation:progress-indeterminate-ltr 3s linear infinite}.progress-bar.indeterminate.rtl-progress{animation-name:progress-indeterminate-rtl}.direction-reverse{animation-direction:reverse!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
51
60
  }
52
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsProgress, decorators: [{
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsProgress, decorators: [{
53
62
  type: Component,
54
- args: [{ selector: 'ys-progress', imports: [NgClass], template: "<div class=\"progress\" role=\"progressbar\" [style.height.px]=\"height()\">\n\n <div class=\"progress-bar\" [class.indeterminate]=\"loading()\" [class.direction-reverse]=\"reverse()\"\n [class.rtl-progress]=\"isRtl()\" [ngClass]=\"styleClass()\">\n\n @if(showLabel()){\n {{ label() }}\n }\n\n </div>\n</div>", styles: ["@keyframes progress-indeterminate-ltr{0%{inset-inline-start:-25%;width:25%}to{inset-inline-start:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{inset-inline-start:100%;width:25%}to{inset-inline-start:-25%;width:25%}}.progress-bar.indeterminate{position:relative;animation:progress-indeterminate-ltr 3s linear infinite}.progress-bar.indeterminate.rtl-progress{animation-name:progress-indeterminate-rtl}.direction-reverse{animation-direction:reverse!important}\n"] }]
63
+ args: [{ selector: 'ys-progress', imports: [NgClass], changeDetection: ChangeDetectionStrategy.Eager, template: "<div class=\"progress\" role=\"progressbar\" [style.height.px]=\"height()\">\n\n <div class=\"progress-bar\" [class.indeterminate]=\"loading()\" [class.direction-reverse]=\"reverse()\"\n [class.rtl-progress]=\"isRtl()\" [ngClass]=\"styleClass()\">\n\n @if(showLabel()){\n {{ label() }}\n }\n\n </div>\n</div>", styles: ["@keyframes progress-indeterminate-ltr{0%{inset-inline-start:-25%;width:25%}to{inset-inline-start:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{inset-inline-start:100%;width:25%}to{inset-inline-start:-25%;width:25%}}.progress-bar.indeterminate{position:relative;animation:progress-indeterminate-ltr 3s linear infinite}.progress-bar.indeterminate.rtl-progress{animation-name:progress-indeterminate-rtl}.direction-reverse{animation-direction:reverse!important}\n"] }]
55
64
  }], ctorParameters: () => [{ type: ProgressService }], propDecorators: { reverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverse", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], rtl: [{ type: i0.Input, args: [{ isSignal: true, alias: "rtl", required: false }] }] } });
56
65
 
57
66
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-progress.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/progress/src/services/progress-service.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.html","../../../../projects/yoozsoft/yoozsoft-ng/progress/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/yoozsoft-yoozsoft-ng-progress.ts"],"sourcesContent":["import { computed, Injectable, signal } from '@angular/core';\n\n@Injectable()\nexport class ProgressService {\n\n private _activeRequests = signal(0);\n\n /** loading = Do we have at least one active request? */\n readonly loading = computed(() => this._activeRequests() > 0);\n\n show() {\n this._activeRequests.update(v => v + 1);\n }\n\n hide() {\n this._activeRequests.update(v => Math.max(0, v - 1));\n }\n\n reset() {\n this._activeRequests.set(0);\n }\n\n}\n","import { isPlatformBrowser, NgClass } from '@angular/common';\nimport { Component, computed, inject, input, PLATFORM_ID, Signal } from '@angular/core';\nimport { ProgressService } from '../services';\n\n@Component({\n selector: 'ys-progress',\n imports: [NgClass],\n templateUrl: './ys-progress.html',\n styleUrl: './ys-progress.scss',\n})\nexport class YsProgress {\n\n private platformId = inject(PLATFORM_ID);\n\n reverse = input(false);\n styleClass = input<string | null>(null);\n height = input(20);\n label = input<string | null>(null);\n rtl = input<boolean>();\n\n readonly loading: Signal<boolean>;\n\n readonly showLabel = computed(() =>\n this.loading() && !!this.label()\n );\n\n readonly isRtl = computed(() => {\n const rtl = this.rtl();\n\n if (rtl !== undefined) {\n return rtl;\n }\n\n if (!isPlatformBrowser(this.platformId)) {\n return false;\n }\n\n return document.documentElement.dir === 'rtl';\n });\n\n constructor(private progressService: ProgressService) {\n this.loading = this.progressService.loading;\n }\n\n}\n","<div class=\"progress\" role=\"progressbar\" [style.height.px]=\"height()\">\n\n <div class=\"progress-bar\" [class.indeterminate]=\"loading()\" [class.direction-reverse]=\"reverse()\"\n [class.rtl-progress]=\"isRtl()\" [ngClass]=\"styleClass()\">\n\n @if(showLabel()){\n {{ label() }}\n }\n\n </div>\n</div>","/*\r\n * Public API Surface of ys-progress\r\n */\r\n\r\nexport * from './src/services';\r\nexport * from './src/ys-progress/ys-progress';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ProgressService"],"mappings":"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"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-progress.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/progress/src/services/progress-service.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.html","../../../../projects/yoozsoft/yoozsoft-ng/progress/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/yoozsoft-yoozsoft-ng-progress.ts"],"sourcesContent":["import { computed, Injectable, signal } from '@angular/core';\n\n@Injectable()\nexport class ProgressService {\n\n private _activeRequests = signal(0);\n\n /** loading = Do we have at least one active request? */\n readonly loading = computed(() => this._activeRequests() > 0);\n\n show() {\n this._activeRequests.update(v => v + 1);\n }\n\n hide() {\n this._activeRequests.update(v => Math.max(0, v - 1));\n }\n\n reset() {\n this._activeRequests.set(0);\n }\n\n}\n","import { isPlatformBrowser, NgClass } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n PLATFORM_ID,\r\n Signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { ProgressService } from '../services';\r\n\r\n@Component({\r\n selector: 'ys-progress',\r\n imports: [NgClass],\r\n templateUrl: './ys-progress.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-progress.scss',\r\n})\r\nexport class YsProgress {\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n reverse = input(false);\r\n styleClass = input<string | null>(null);\r\n height = input(20);\r\n label = input<string | null>(null);\r\n rtl = input<boolean>();\r\n\r\n readonly loading: Signal<boolean>;\r\n\r\n readonly showLabel = computed(() => this.loading() && !!this.label());\r\n\r\n readonly isRtl = computed(() => {\r\n const rtl = this.rtl();\r\n\r\n if (rtl !== undefined) {\r\n return rtl;\r\n }\r\n\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return false;\r\n }\r\n\r\n return document.documentElement.dir === 'rtl';\r\n });\r\n\r\n constructor(private progressService: ProgressService) {\r\n this.loading = this.progressService.loading;\r\n }\r\n}\r\n","<div class=\"progress\" role=\"progressbar\" [style.height.px]=\"height()\">\n\n <div class=\"progress-bar\" [class.indeterminate]=\"loading()\" [class.direction-reverse]=\"reverse()\"\n [class.rtl-progress]=\"isRtl()\" [ngClass]=\"styleClass()\">\n\n @if(showLabel()){\n {{ label() }}\n }\n\n </div>\n</div>","/*\r\n * Public API Surface of ys-progress\r\n */\r\n\r\nexport * from './src/services';\r\nexport * from './src/ys-progress/ys-progress';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ProgressService"],"mappings":"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"}