@yoozsoft/yoozsoft-ng 5.3.5 → 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 (113) hide show
  1. package/README.md +143 -24
  2. package/assets/js/UTIF.js-master/LICENSE +21 -21
  3. package/assets/js/UTIF.js-master/README.md +72 -72
  4. package/assets/js/UTIF.js-master/UTIF.js +1762 -1762
  5. package/assets/js/UTIF.js-master/package-lock.json +13 -13
  6. package/assets/js/UTIF.js-master/package.json +24 -0
  7. package/assets/styles/components/_ys-navbar.scss +22 -0
  8. package/assets/styles/components/_ys-pagination.scss +10 -0
  9. package/assets/styles/{ys-layout.scss → utilities/ys-layout.scss} +1 -1
  10. package/assets/styles/ys-styles.scss +2 -0
  11. package/autocomplete/package.json +4 -0
  12. package/date/package.json +4 -0
  13. package/datepicker/package.json +4 -0
  14. package/dropdown/package.json +4 -0
  15. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs +257 -197
  16. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs.map +1 -1
  17. package/fesm2022/yoozsoft-yoozsoft-ng-date.mjs +562 -0
  18. package/fesm2022/yoozsoft-yoozsoft-ng-date.mjs.map +1 -0
  19. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs +600 -837
  20. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs.map +1 -1
  21. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs +161 -151
  22. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs.map +1 -1
  23. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs +93 -103
  24. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs.map +1 -1
  25. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs +16 -21
  26. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs.map +1 -1
  27. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs +20 -24
  28. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs.map +1 -1
  29. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs +60 -76
  30. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs.map +1 -1
  31. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs +11 -15
  32. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs.map +1 -1
  33. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs +61 -55
  34. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs.map +1 -1
  35. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs +142 -130
  36. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs.map +1 -1
  37. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs +44 -0
  38. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs.map +1 -0
  39. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs +51 -34
  40. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs.map +1 -1
  41. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs +155 -0
  42. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs.map +1 -0
  43. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs +78 -80
  44. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs.map +1 -1
  45. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs +99 -99
  46. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs.map +1 -1
  47. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs +316 -0
  48. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs.map +1 -0
  49. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs +128 -114
  50. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs.map +1 -1
  51. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs +112 -62
  52. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs.map +1 -1
  53. package/fesm2022/yoozsoft-yoozsoft-ng-validators.mjs +37 -0
  54. package/fesm2022/yoozsoft-yoozsoft-ng-validators.mjs.map +1 -0
  55. package/fesm2022/yoozsoft-yoozsoft-ng.mjs.map +1 -1
  56. package/file-upload/package.json +4 -0
  57. package/footer/package.json +4 -0
  58. package/loading/package.json +4 -0
  59. package/navbar/package.json +4 -0
  60. package/overlay/package.json +4 -0
  61. package/package.json +61 -38
  62. package/pagination/package.json +4 -0
  63. package/password-strength/package.json +4 -0
  64. package/pipes/package.json +4 -0
  65. package/progress/package.json +4 -0
  66. package/rating/package.json +4 -0
  67. package/select/package.json +4 -0
  68. package/sidebar/package.json +4 -0
  69. package/table/package.json +4 -0
  70. package/tiff-viewer/package.json +4 -0
  71. package/toast/package.json +4 -0
  72. package/types/yoozsoft-yoozsoft-ng-autocomplete.d.ts +79 -0
  73. package/types/yoozsoft-yoozsoft-ng-date.d.ts +118 -0
  74. package/types/yoozsoft-yoozsoft-ng-datepicker.d.ts +120 -0
  75. package/types/yoozsoft-yoozsoft-ng-dropdown.d.ts +76 -0
  76. package/types/yoozsoft-yoozsoft-ng-file-upload.d.ts +75 -0
  77. package/types/yoozsoft-yoozsoft-ng-footer.d.ts +26 -0
  78. package/types/yoozsoft-yoozsoft-ng-loading.d.ts +14 -0
  79. package/types/yoozsoft-yoozsoft-ng-navbar.d.ts +60 -0
  80. package/types/yoozsoft-yoozsoft-ng-overlay.d.ts +10 -0
  81. package/types/yoozsoft-yoozsoft-ng-pagination.d.ts +31 -0
  82. package/types/yoozsoft-yoozsoft-ng-password-strength.d.ts +73 -0
  83. package/types/yoozsoft-yoozsoft-ng-pipes.d.ts +11 -0
  84. package/types/yoozsoft-yoozsoft-ng-progress.d.ts +31 -0
  85. package/types/yoozsoft-yoozsoft-ng-rating.d.ts +56 -0
  86. package/types/yoozsoft-yoozsoft-ng-select.d.ts +43 -0
  87. package/types/yoozsoft-yoozsoft-ng-sidebar.d.ts +69 -0
  88. package/types/yoozsoft-yoozsoft-ng-table.d.ts +137 -0
  89. package/types/yoozsoft-yoozsoft-ng-tiff-viewer.d.ts +53 -0
  90. package/types/yoozsoft-yoozsoft-ng-toast.d.ts +66 -0
  91. package/types/yoozsoft-yoozsoft-ng-validators.d.ts +5 -0
  92. package/validators/package.json +4 -0
  93. package/autocomplete/index.d.ts +0 -71
  94. package/datepicker/index.d.ts +0 -291
  95. package/directives/index.d.ts +0 -17
  96. package/dropdown/index.d.ts +0 -62
  97. package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs +0 -57
  98. package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs.map +0 -1
  99. package/file-upload/index.d.ts +0 -72
  100. package/footer/index.d.ts +0 -25
  101. package/loading/index.d.ts +0 -13
  102. package/navbar/index.d.ts +0 -56
  103. package/overlay/index.d.ts +0 -11
  104. package/pagination/index.d.ts +0 -29
  105. package/password-strength/index.d.ts +0 -84
  106. package/progress/index.d.ts +0 -28
  107. package/select/index.d.ts +0 -39
  108. package/sidebar/index.d.ts +0 -94
  109. package/tiff-viewer/index.d.ts +0 -52
  110. package/toast/index.d.ts +0 -53
  111. /package/assets/styles/{ys-preloader-9.scss → preloaders/ys-preloader-9.scss} +0 -0
  112. /package/assets/styles/{ys-preloader.scss → preloaders/ys-preloader.scss} +0 -0
  113. /package/{index.d.ts → types/yoozsoft-yoozsoft-ng.d.ts} +0 -0
@@ -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.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.component.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 StrongPasswordRegx: RegExp = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*]).{8,}$/;\r\nexport const UppercaseRegx: RegExp = /^.*[A-Z]/;\r\nexport const LowercaseRegx: RegExp = /^.*[a-z]/;\r\nexport const DigitRegx: RegExp = /^.*[0-9].*/;\r\nexport const NonAlphanumericRegx: RegExp = /^.*[!@#$%^&*]/;\r\n// export const MinLength8Regx: RegExp = /^.{8,}/;","export class 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 constructor(\r\n options?: {\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\n this.required = options?.required == undefined ? 'Please enter a valid password.' : options?.required;\r\n this.uppercase = options?.uppercase == undefined ? 'At least one uppercase letter.' : options?.uppercase;\r\n this.lowercase = options?.lowercase == undefined ? 'At least one lowercase letter.' : options?.lowercase;\r\n this.digit = options?.digit == undefined ? 'At least one digit.' : options?.digit;\r\n this.nonAlphanumeric = options?.nonAlphanumeric == undefined ? 'At least one special character (e.g., !, @, #, $).' : options?.nonAlphanumeric;\r\n this.minLength = options?.minLength == undefined ? 'At least 8 characters long.' : options?.minLength;\r\n }\r\n}","export class 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 constructor(\r\n options?: {\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\n this.requireUppercase = options?.requireUppercase == undefined ? true : options?.requireUppercase;\r\n this.requireLowercase = options?.requireLowercase == undefined ? true : options?.requireLowercase;\r\n this.requireDigit = options?.requireDigit == undefined ? true : options?.requireDigit;\r\n this.requireNonAlphanumeric = options?.requireNonAlphanumeric == undefined ? true : options?.requireNonAlphanumeric;\r\n this.requiredMinLength = options?.requiredMinLength == undefined ? 8 : options?.requiredMinLength;\r\n }\r\n}","import { NgClass } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { Validators } from '@angular/forms';\r\nimport { DigitRegx, LowercaseRegx, NonAlphanumericRegx, StrengthValidationControl, StrengthValidationFeedback, StrengthValidationOption, UppercaseRegx } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-password-strength',\r\n imports: [NgClass],\r\n templateUrl: './ys-password-strength.component.html',\r\n styleUrl: './ys-password-strength.component.scss'\r\n})\r\nexport class YsPasswordStrengthComponent {\r\n\r\n @Input() passwordHelp: string | null = null;\r\n @Input() displayFeedback: boolean = true;\r\n @Input() feedback: StrengthValidationFeedback | null = new StrengthValidationFeedback();\r\n\r\n private minLengthRegx: RegExp = new RegExp('');\r\n\r\n private _control?: StrengthValidationControl;\r\n @Input()\r\n get control(): StrengthValidationControl | undefined { return this._control; }\r\n set control(value: StrengthValidationControl | undefined) {\r\n this._control = value;\r\n\r\n if (!this._control) { return; }\r\n\r\n if (!this._control.options) {\r\n this._control.options = new StrengthValidationOption();\r\n }\r\n\r\n const strongPasswordRegx: RegExp = new RegExp(\r\n `${this._control.options.requireUppercase ? '^(?=[^A-Z]*[A-Z])' : ''\r\n }${this._control.options.requireLowercase ? '(?=[^a-z]*[a-z])' : ''\r\n }${this._control.options.requireDigit ? '(?=\\\\D*\\\\d)' : ''\r\n }${this._control.options.requireNonAlphanumeric ? '(?=.*[!@#$%^&*])' : ''\r\n }.{${this._control.options.requiredMinLength},}$`);\r\n\r\n this.minLengthRegx = new RegExp(`.{${this._control.options.requiredMinLength},}$`);\r\n\r\n this._control.formControl?.addValidators([Validators.required, Validators.pattern(strongPasswordRegx)]);\r\n this._control.formControl?.updateValueAndValidity();\r\n\r\n }\r\n\r\n get requiredOptionsLength(): number { return Object.values(this.control?.options!).filter(x => x).length; }\r\n\r\n get hasUppercase(): boolean { return this.control?.formControl?.value && UppercaseRegx.test(this.control?.formControl?.value); }\r\n get hasLowercase(): boolean { return this.control?.formControl?.value && LowercaseRegx.test(this.control?.formControl?.value); }\r\n get hasDigit(): boolean { return this.control?.formControl?.value && DigitRegx.test(this.control?.formControl?.value); }\r\n get hasNonAlphanumeric(): boolean { return this.control?.formControl?.value && NonAlphanumericRegx.test(this.control?.formControl?.value); }\r\n get hasMinLength(): boolean { return this.control?.formControl?.value && this.minLengthRegx.test(this.control?.formControl?.value); }\r\n\r\n get strengthMeter(): number {\r\n\r\n let strength: number = -1;\r\n if (this.control?.options?.requireUppercase && this.hasUppercase)\r\n strength += 1;\r\n if (this.control?.options?.requireLowercase && this.hasLowercase)\r\n strength += 1;\r\n if (this.control?.options?.requireDigit && this.hasDigit)\r\n strength += 1;\r\n if (this.control?.options?.requireNonAlphanumeric && this.hasNonAlphanumeric)\r\n strength += 1;\r\n if (this.control?.options?.requiredMinLength && this.hasMinLength)\r\n strength += 1;\r\n\r\n return strength + (5 - this.requiredOptionsLength);\r\n }\r\n\r\n get strengthStyleClass(): string {\r\n return this.strengthMeter == 4 ? \"green\" :\r\n this.strengthMeter == 3 ? \"yellow\" :\r\n this.strengthMeter == 2 ? \"orange\" :\r\n this.strengthMeter == 1 ? \"red\" :\r\n this.strengthMeter == 0 ? \"pink\" :\r\n '';\r\n }\r\n\r\n}\r\n","@if (control) {\r\n <div class=\"password-strength\">\r\n <div class=\"d-flex flex-row mt-1\">\r\n @if (this.requiredOptionsLength > 4) {\r\n <hr class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\" (strengthMeter >= 0) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n }\r\n @if (this.requiredOptionsLength > 3) {\r\n <hr class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 1) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n }\r\n @if (this.requiredOptionsLength > 2) {\r\n <hr class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 2) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n }\r\n @if (this.requiredOptionsLength > 1) {\r\n <hr class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 3) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n }\r\n @if (this.requiredOptionsLength > 0) {\r\n <hr class=\"rounded-start rounded-end\"\r\n [ngClass]=\"(strengthMeter >= 4) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n }\r\n </div>\r\n @if (passwordHelp) {\r\n <small id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp}}</small>\r\n }\r\n @if (displayFeedback && control.formControl?.errors?.['pattern'] && (control.formControl?.touched || control.formControl?.dirty)) {\r\n <div\r\n class=\"invalid-feedback d-grid \">\r\n @if (control.options?.requireUppercase) {\r\n <span\r\n [ngClass]=\"{'text-success': hasUppercase}\">{{feedback?.uppercase}}</span>\r\n }\r\n @if (control.options?.requireLowercase) {\r\n <span\r\n [ngClass]=\"{'text-success': hasLowercase}\">{{feedback?.lowercase}}</span>\r\n }\r\n @if (control.options?.requireDigit) {\r\n <span [ngClass]=\"{'text-success': hasDigit}\">{{feedback?.digit}}</span>\r\n }\r\n @if (control.options?.requireNonAlphanumeric) {\r\n <span\r\n [ngClass]=\"{'text-success': hasNonAlphanumeric}\">{{feedback?.nonAlphanumeric}}</span>\r\n }\r\n @if (control.options?.requiredMinLength) {\r\n <span\r\n [ngClass]=\"{'text-success': hasMinLength}\">{{feedback?.minLength}}</span>\r\n }\r\n </div>\r\n }\r\n @if (control.formControl?.errors?.['required'] && (control.formControl?.touched || control.formControl?.dirty)) {\r\n <div\r\n class=\"invalid-feedback d-grid \">\r\n {{feedback?.required}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (!control) {\r\n <div>\r\n Password strength control is undefined.\r\n </div>\r\n }","import { Directive, ElementRef, Injector, Input, OnInit, ViewContainerRef } from '@angular/core';\r\nimport { AbstractControl, NgControl } from '@angular/forms';\r\nimport { StrengthValidationFeedback, StrengthValidationOption } from '../models';\r\nimport { YsPasswordStrengthComponent } from '../ys-password-strength/ys-password-strength.component';\r\n\r\n@Directive({\r\n selector: '[ysPasswordStrength]'\r\n})\r\nexport class YsPasswordStrengthDirective implements OnInit {\r\n\r\n @Input() passwordHelp: string | null = null;\r\n @Input() displayFeedback: boolean = true;\r\n @Input() feedback: StrengthValidationFeedback | null = new StrengthValidationFeedback();\r\n @Input() options?: StrengthValidationOption;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private viewContainerRef: ViewContainerRef,\r\n private injector: Injector,\r\n private control: NgControl\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n const element = this.el.nativeElement;\r\n const elementParent = element.parentElement;\r\n\r\n const formControl: AbstractControl<any, any> | null = this.control.control;\r\n\r\n const passwordStrengthComponent = this.viewContainerRef.createComponent(YsPasswordStrengthComponent, { injector: this.injector });\r\n elementParent.insertBefore(passwordStrengthComponent.location.nativeElement, element.nextSibling);\r\n\r\n const passwordStrength: YsPasswordStrengthComponent = passwordStrengthComponent.instance;\r\n passwordStrength.passwordHelp = this.passwordHelp;\r\n passwordStrength.displayFeedback = this.displayFeedback;\r\n passwordStrength.feedback = this.feedback;\r\n passwordStrength.control = { formControl: formControl, options: this.options };\r\n\r\n }\r\n\r\n}\r\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.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
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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"}
@@ -0,0 +1,44 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Pipe } from '@angular/core';
3
+ import { JalaliDate } from '@yoozsoft/yoozsoft-ng/date';
4
+
5
+ const FORMATS = {
6
+ shortDate: 'yyyy/MM/dd',
7
+ mediumDate: 'dd MMMM yyyy',
8
+ longDate: 'dd MMMM yyyy',
9
+ fullDate: 'EEEE dd MMMM yyyy',
10
+ shortTime: 'HH:mm',
11
+ mediumTime: 'HH:mm:ss',
12
+ longTime: 'HH:mm:ss',
13
+ short: 'yyyy/MM/dd HH:mm',
14
+ medium: 'dd MMMM yyyy HH:mm',
15
+ long: 'dd MMMM yyyy HH:mm:ss',
16
+ full: 'EEEE dd MMMM yyyy HH:mm:ss'
17
+ };
18
+ class YsPersianDatePipe {
19
+ transform(value, format = 'shortDate') {
20
+ if (value == null || value === '') {
21
+ return '';
22
+ }
23
+ return JalaliDate.format(value, FORMATS[format]);
24
+ }
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
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsPersianDatePipe, decorators: [{
29
+ type: Pipe,
30
+ args: [{
31
+ name: 'ysPersianDate',
32
+ }]
33
+ }] });
34
+
35
+ /*
36
+ * Public API Surface of ysPersianDatePipe
37
+ */
38
+
39
+ /**
40
+ * Generated bundle index. Do not edit.
41
+ */
42
+
43
+ export { YsPersianDatePipe };
44
+ //# sourceMappingURL=yoozsoft-yoozsoft-ng-pipes.mjs.map
@@ -0,0 +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;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,50 +1,67 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Input, Component } from '@angular/core';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { NgClass, AsyncPipe } from '@angular/common';
2
+ import { signal, computed, Injectable, inject, PLATFORM_ID, input, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { isPlatformBrowser, NgClass } from '@angular/common';
5
4
 
6
5
  class ProgressService {
7
- _loading$ = new BehaviorSubject(false);
8
- get loading$() { return this._loading$.asObservable(); }
9
- setLoading(loading) {
10
- this._loading$.next(loading);
6
+ _activeRequests = signal(0, /* @ts-ignore */
7
+ ...(ngDevMode ? [{ debugName: "_activeRequests" }] : /* istanbul ignore next */ []));
8
+ /** loading = Do we have at least one active request? */
9
+ loading = computed(() => this._activeRequests() > 0, /* @ts-ignore */
10
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
11
+ show() {
12
+ this._activeRequests.update(v => v + 1);
11
13
  }
12
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ProgressService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ProgressService });
14
+ hide() {
15
+ this._activeRequests.update(v => Math.max(0, v - 1));
16
+ }
17
+ reset() {
18
+ this._activeRequests.set(0);
19
+ }
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 });
14
22
  }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ProgressService, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ProgressService, decorators: [{
16
24
  type: Injectable
17
25
  }] });
18
26
 
19
- class YsProgressComponent {
27
+ class YsProgress {
20
28
  progressService;
21
- loading$;
22
- /**
23
- * Set reverse animation direction.
24
- */
25
- reverse = false;
26
- styleClass = null;
27
- height = 3;
28
- label = null;
29
+ platformId = inject(PLATFORM_ID);
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 */ []));
40
+ loading;
41
+ showLabel = computed(() => this.loading() && !!this.label(), /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
43
+ isRtl = computed(() => {
44
+ const rtl = this.rtl();
45
+ if (rtl !== undefined) {
46
+ return rtl;
47
+ }
48
+ if (!isPlatformBrowser(this.platformId)) {
49
+ return false;
50
+ }
51
+ return document.documentElement.dir === 'rtl';
52
+ }, /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "isRtl" }] : /* istanbul ignore next */ []));
29
54
  constructor(progressService) {
30
55
  this.progressService = progressService;
31
- this.loading$ = progressService.loading$;
56
+ this.loading = this.progressService.loading;
32
57
  }
33
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: YsProgressComponent, deps: [{ token: ProgressService }], target: i0.ɵɵFactoryTarget.Component });
34
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.5", type: YsProgressComponent, isStandalone: true, selector: "ys-progress", inputs: { reverse: "reverse", styleClass: "styleClass", height: "height", label: "label" }, ngImport: i0, template: "<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>", styles: ["@keyframes progress-indeterminate{0%{left:-25%;width:25%}to{left:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{left:-100%;width:25%}to{left:25%;width:25%}}.progress .progress-bar.indeterminate{position:relative}.progress .direction-reverse{animation-direction:reverse!important}::ng-deep html[dir=rtl] .progress .progress-bar.indeterminate{animation:progress-indeterminate-rtl 3s linear infinite}::ng-deep html[dir=ltr] .progress .progress-bar.indeterminate,::ng-deep html :not(dir) .progress .progress-bar.indeterminate{animation:progress-indeterminate 3s linear infinite}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] });
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 });
35
60
  }
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: YsProgressComponent, decorators: [{
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsProgress, decorators: [{
37
62
  type: Component,
38
- args: [{ selector: 'ys-progress', imports: [NgClass, AsyncPipe], template: "<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>", styles: ["@keyframes progress-indeterminate{0%{left:-25%;width:25%}to{left:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{left:-100%;width:25%}to{left:25%;width:25%}}.progress .progress-bar.indeterminate{position:relative}.progress .direction-reverse{animation-direction:reverse!important}::ng-deep html[dir=rtl] .progress .progress-bar.indeterminate{animation:progress-indeterminate-rtl 3s linear infinite}::ng-deep html[dir=ltr] .progress .progress-bar.indeterminate,::ng-deep html :not(dir) .progress .progress-bar.indeterminate{animation:progress-indeterminate 3s linear infinite}\n"] }]
39
- }], ctorParameters: () => [{ type: ProgressService }], propDecorators: { reverse: [{
40
- type: Input
41
- }], styleClass: [{
42
- type: Input
43
- }], height: [{
44
- type: Input
45
- }], label: [{
46
- type: Input
47
- }] } });
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"] }]
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 }] }] } });
48
65
 
49
66
  /*
50
67
  * Public API Surface of ys-progress
@@ -54,5 +71,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImpor
54
71
  * Generated bundle index. Do not edit.
55
72
  */
56
73
 
57
- export { ProgressService, YsProgressComponent };
74
+ export { ProgressService, YsProgress };
58
75
  //# sourceMappingURL=yoozsoft-yoozsoft-ng-progress.mjs.map
@@ -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.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.component.html","../../../../projects/yoozsoft/yoozsoft-ng/progress/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/yoozsoft-yoozsoft-ng-progress.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class ProgressService {\r\n\r\n private _loading$ = new BehaviorSubject<boolean>(false);\r\n\r\n get loading$() { return this._loading$.asObservable(); }\r\n\r\n setLoading(loading: boolean) {\r\n this._loading$.next(loading);\r\n }\r\n}\r\n","import { AsyncPipe, NgClass } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ProgressService } from '../services';\r\n\r\n@Component({\r\n selector: 'ys-progress',\r\n imports: [NgClass, AsyncPipe],\r\n templateUrl: './ys-progress.component.html',\r\n styleUrl: './ys-progress.component.scss'\r\n})\r\nexport class YsProgressComponent {\r\n\r\n loading$: Observable<boolean>;\r\n\r\n /**\r\n * Set reverse animation direction.\r\n */\r\n @Input() reverse: boolean = false;\r\n @Input() styleClass: string | null = null;\r\n @Input() height: number = 3;\r\n @Input() label: string | null = null;\r\n\r\n constructor(private progressService: ProgressService) {\r\n this.loading$ = progressService.loading$;\r\n }\r\n\r\n}\r\n","<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\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.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ProgressService"],"mappings":";;;;;MAIa,eAAe,CAAA;AAElB,IAAA,SAAS,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;IAEvD,IAAI,QAAQ,GAAA,EAAK,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AAEtD,IAAA,UAAU,CAAC,OAAgB,EAAA;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;uGAPnB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MCQY,mBAAmB,CAAA;AAYV,IAAA,eAAA;AAVpB,IAAA,QAAQ;AAER;;AAEG;IACM,OAAO,GAAY,KAAK;IACxB,UAAU,GAAkB,IAAI;IAChC,MAAM,GAAW,CAAC;IAClB,KAAK,GAAkB,IAAI;AAEpC,IAAA,WAAA,CAAoB,eAAgC,EAAA;QAAhC,IAAA,CAAA,eAAe,GAAf,eAAe;AACjC,QAAA,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ;;uGAb/B,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXhC,oTAKM,EAAA,MAAA,EAAA,CAAA,4kBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDEM,OAAO,+EAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA;;2FAIjB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,OAAA,EACd,CAAC,OAAO,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,oTAAA,EAAA,MAAA,EAAA,CAAA,4kBAAA,CAAA,EAAA;iFAWpB,OAAO,EAAA,CAAA;sBAAf;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,KAAK,EAAA,CAAA;sBAAb;;;AErBH;;AAEG;;ACFH;;AAEG;;;;"}
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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"}
@@ -0,0 +1,155 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, ChangeDetectionStrategy, Component, output, signal, effect, forwardRef } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+
5
+ class YsRating {
6
+ /**Current score */
7
+ score = input(0, /* @ts-ignore */
8
+ ...(ngDevMode ? [{ debugName: "score" }] : /* istanbul ignore next */ []));
9
+ /**Points cap (default 100) */
10
+ maxScore = input(100, /* @ts-ignore */
11
+ ...(ngDevMode ? [{ debugName: "maxScore" }] : /* istanbul ignore next */ []));
12
+ starsCount = input(5, /* @ts-ignore */
13
+ ...(ngDevMode ? [{ debugName: "starsCount" }] : /* istanbul ignore next */ []));
14
+ /**Icon size in pixel */
15
+ size = input(20, /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
17
+ ratingIconClass = input('fas fa-star', /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "ratingIconClass" }] : /* istanbul ignore next */ []));
19
+ /**Icons gap in pixel */
20
+ gap = input(4, /* @ts-ignore */
21
+ ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
22
+ ariaLabel = input(/* @ts-ignore */
23
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
24
+ wrapperSize = computed(() => this.size() + this.gap(), /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "wrapperSize" }] : /* istanbul ignore next */ []));
26
+ normalizedAriaLabel = computed(() => this.ariaLabel() ??
27
+ `Rating ${this.normalizedScore()} of ${this.maxScore()}`, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "normalizedAriaLabel" }] : /* istanbul ignore next */ []));
29
+ normalizedScore = computed(() => {
30
+ return Math.min(Math.max(this.score(), 0), this.maxScore());
31
+ }, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "normalizedScore" }] : /* istanbul ignore next */ []));
33
+ normalizedStarsCount = computed(() => Math.max(1, Math.floor(this.starsCount())), /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "normalizedStarsCount" }] : /* istanbul ignore next */ []));
35
+ rating = computed(() => (this.normalizedScore() / this.maxScore()) * this.normalizedStarsCount(), /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "rating" }] : /* istanbul ignore next */ []));
37
+ fillPercents = computed(() => {
38
+ const totalStars = this.normalizedStarsCount();
39
+ if (this.maxScore() <= 0) {
40
+ return Array(totalStars).fill(0);
41
+ }
42
+ const rating = this.rating();
43
+ return Array.from({ length: totalStars }, (_, index) => Math.max(0, Math.min(100, (rating - index) * 100)));
44
+ }, /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "fillPercents" }] : /* istanbul ignore next */ []));
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsRating, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsRating, isStandalone: true, selector: "ys-rating", inputs: { score: { classPropertyName: "score", publicName: "score", isSignal: true, isRequired: false, transformFunction: null }, maxScore: { classPropertyName: "maxScore", publicName: "maxScore", isSignal: true, isRequired: false, transformFunction: null }, starsCount: { classPropertyName: "starsCount", publicName: "starsCount", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ratingIconClass: { classPropertyName: "ratingIconClass", publicName: "ratingIconClass", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"ys-rating\" role=\"img\" [style.gap.px]=\"gap()\" [attr.aria-label]=\"normalizedAriaLabel()\">\n\n @for (fill of fillPercents(); track $index) {\n\n <div class=\"rating-wrapper\" [style.width.px]=\"wrapperSize()\" [style.height.px]=\"size()\">\n\n <i class=\"rating-empty\" [class]=\"ratingIconClass()\" [style.fontSize.px]=\"size()\">\n </i>\n\n <div class=\"rating-fill\" [style.width.%]=\"fill\" [style.height.px]=\"size()\">\n\n <i class=\"rating\" [class]=\"ratingIconClass()\" [style.fontSize.px]=\"size()\">\n </i>\n\n </div>\n\n </div>\n\n }\n\n</div>", styles: [":host{--ys-rating-empty: var(--bs-gray-300);--ys-rating-filled: var(--bs-yellow)}.ys-rating{display:inline-flex;align-items:center}.rating-wrapper{position:relative;display:inline-block;line-height:0;overflow:visible}.rating-fill{position:absolute;top:0;inset-inline-start:0;overflow:hidden;pointer-events:none}.rating-empty{color:var(--ys-rating-empty)}.rating-fill .rating{color:var(--ys-rating-filled)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsRating, decorators: [{
50
+ type: Component,
51
+ args: [{ selector: 'ys-rating', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ys-rating\" role=\"img\" [style.gap.px]=\"gap()\" [attr.aria-label]=\"normalizedAriaLabel()\">\n\n @for (fill of fillPercents(); track $index) {\n\n <div class=\"rating-wrapper\" [style.width.px]=\"wrapperSize()\" [style.height.px]=\"size()\">\n\n <i class=\"rating-empty\" [class]=\"ratingIconClass()\" [style.fontSize.px]=\"size()\">\n </i>\n\n <div class=\"rating-fill\" [style.width.%]=\"fill\" [style.height.px]=\"size()\">\n\n <i class=\"rating\" [class]=\"ratingIconClass()\" [style.fontSize.px]=\"size()\">\n </i>\n\n </div>\n\n </div>\n\n }\n\n</div>", styles: [":host{--ys-rating-empty: var(--bs-gray-300);--ys-rating-filled: var(--bs-yellow)}.ys-rating{display:inline-flex;align-items:center}.rating-wrapper{position:relative;display:inline-block;line-height:0;overflow:visible}.rating-fill{position:absolute;top:0;inset-inline-start:0;overflow:hidden;pointer-events:none}.rating-empty{color:var(--ys-rating-empty)}.rating-fill .rating{color:var(--ys-rating-filled)}\n"] }]
52
+ }], propDecorators: { score: [{ type: i0.Input, args: [{ isSignal: true, alias: "score", required: false }] }], maxScore: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxScore", required: false }] }], starsCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "starsCount", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ratingIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "ratingIconClass", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
53
+
54
+ class YsRatingInput {
55
+ maxScore = input(100, /* @ts-ignore */
56
+ ...(ngDevMode ? [{ debugName: "maxScore" }] : /* istanbul ignore next */ []));
57
+ starsCount = input(5, /* @ts-ignore */
58
+ ...(ngDevMode ? [{ debugName: "starsCount" }] : /* istanbul ignore next */ []));
59
+ size = input(20, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
61
+ ratingIconClass = input('fas fa-star', /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "ratingIconClass" }] : /* istanbul ignore next */ []));
63
+ disabled = input(false, /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
65
+ readonly = input(false, /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
67
+ allowClear = input(true, /* @ts-ignore */
68
+ ...(ngDevMode ? [{ debugName: "allowClear" }] : /* istanbul ignore next */ []));
69
+ valueChange = output();
70
+ value = signal(0, /* @ts-ignore */
71
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
72
+ hoverValue = signal(null, /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "hoverValue" }] : /* istanbul ignore next */ []));
74
+ displayValue = computed(() => this.hoverValue() ?? this.value(), /* @ts-ignore */
75
+ ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
76
+ normalizedStarsCount = computed(() => Math.max(1, Math.floor(this.starsCount())), /* @ts-ignore */
77
+ ...(ngDevMode ? [{ debugName: "normalizedStarsCount" }] : /* istanbul ignore next */ []));
78
+ stars = computed(() => Array.from({ length: this.normalizedStarsCount() }), /* @ts-ignore */
79
+ ...(ngDevMode ? [{ debugName: "stars" }] : /* istanbul ignore next */ []));
80
+ disabledState = signal(false, /* @ts-ignore */
81
+ ...(ngDevMode ? [{ debugName: "disabledState" }] : /* istanbul ignore next */ []));
82
+ isDisabled = computed(() => this.disabled() || this.readonly() || this.disabledState(), /* @ts-ignore */
83
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
84
+ _onChange = () => { };
85
+ _onTouched = () => { };
86
+ constructor() {
87
+ effect(() => {
88
+ if (this.isDisabled()) {
89
+ this.hoverValue.set(null);
90
+ }
91
+ });
92
+ }
93
+ writeValue(value) {
94
+ this.value.set(value ?? 0);
95
+ }
96
+ registerOnChange(fn) {
97
+ this._onChange = fn;
98
+ }
99
+ registerOnTouched(fn) {
100
+ this._onTouched = fn;
101
+ }
102
+ setDisabledState(disabled) {
103
+ this.disabledState.set(disabled);
104
+ }
105
+ hover(index) {
106
+ if (this.isDisabled())
107
+ return;
108
+ const value = ((index + 1) / this.normalizedStarsCount()) * this.maxScore();
109
+ this.hoverValue.set(value);
110
+ }
111
+ leave() {
112
+ this.hoverValue.set(null);
113
+ }
114
+ select(index) {
115
+ if (this.isDisabled())
116
+ return;
117
+ const value = ((index + 1) / this.normalizedStarsCount()) * this.maxScore();
118
+ if (this.allowClear() && value === this.value()) {
119
+ this.value.set(0);
120
+ this._onChange(0);
121
+ this.valueChange.emit(0);
122
+ this._onTouched();
123
+ return;
124
+ }
125
+ this.value.set(value);
126
+ this._onChange(value);
127
+ this.valueChange.emit(value);
128
+ this._onTouched();
129
+ }
130
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsRatingInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
131
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsRatingInput, isStandalone: true, selector: "ys-rating-input", inputs: { maxScore: { classPropertyName: "maxScore", publicName: "maxScore", isSignal: true, isRequired: false, transformFunction: null }, starsCount: { classPropertyName: "starsCount", publicName: "starsCount", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ratingIconClass: { classPropertyName: "ratingIconClass", publicName: "ratingIconClass", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, allowClear: { classPropertyName: "allowClear", publicName: "allowClear", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, providers: [{
132
+ provide: NG_VALUE_ACCESSOR,
133
+ useExisting: forwardRef(() => YsRatingInput),
134
+ multi: true
135
+ }], ngImport: i0, template: "<div class=\"ys-rating-input\">\n\n <ys-rating [score]=\"displayValue()\" [maxScore]=\"maxScore()\" [starsCount]=\"starsCount()\" [size]=\"size()\"\n [ratingIconClass]=\"ratingIconClass()\">\n </ys-rating>\n\n <div class=\"rating-overlay\" [class.readonly]=\"readonly()\">\n\n @for (star of stars(); track $index) {\n\n <button type=\"button\" class=\"rating-hit\" [disabled]=\"isDisabled()\" (focus)=\"hover($index)\" (blur)=\"leave()\"\n (mouseenter)=\"hover($index)\" (mouseleave)=\"leave()\" (click)=\"select($index)\">\n </button>\n\n }\n\n </div>\n\n</div>", styles: [".ys-rating-input{position:relative;display:inline-block}.rating-overlay{position:absolute;inset:0;display:flex;pointer-events:none}.rating-hit{flex:1;border:0;padding:0;margin:0;background:transparent;cursor:pointer;pointer-events:auto}.rating-hit:disabled{cursor:not-allowed}.rating-overlay.readonly .rating-hit{cursor:default}\n"], dependencies: [{ kind: "component", type: YsRating, selector: "ys-rating", inputs: ["score", "maxScore", "starsCount", "size", "ratingIconClass", "gap", "ariaLabel"] }] });
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsRatingInput, decorators: [{
138
+ type: Component,
139
+ args: [{ selector: 'ys-rating-input', imports: [YsRating], providers: [{
140
+ provide: NG_VALUE_ACCESSOR,
141
+ useExisting: forwardRef(() => YsRatingInput),
142
+ multi: true
143
+ }], template: "<div class=\"ys-rating-input\">\n\n <ys-rating [score]=\"displayValue()\" [maxScore]=\"maxScore()\" [starsCount]=\"starsCount()\" [size]=\"size()\"\n [ratingIconClass]=\"ratingIconClass()\">\n </ys-rating>\n\n <div class=\"rating-overlay\" [class.readonly]=\"readonly()\">\n\n @for (star of stars(); track $index) {\n\n <button type=\"button\" class=\"rating-hit\" [disabled]=\"isDisabled()\" (focus)=\"hover($index)\" (blur)=\"leave()\"\n (mouseenter)=\"hover($index)\" (mouseleave)=\"leave()\" (click)=\"select($index)\">\n </button>\n\n }\n\n </div>\n\n</div>", styles: [".ys-rating-input{position:relative;display:inline-block}.rating-overlay{position:absolute;inset:0;display:flex;pointer-events:none}.rating-hit{flex:1;border:0;padding:0;margin:0;background:transparent;cursor:pointer;pointer-events:auto}.rating-hit:disabled{cursor:not-allowed}.rating-overlay.readonly .rating-hit{cursor:default}\n"] }]
144
+ }], ctorParameters: () => [], propDecorators: { maxScore: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxScore", required: false }] }], starsCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "starsCount", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ratingIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "ratingIconClass", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], allowClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowClear", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
145
+
146
+ /*
147
+ * Public API Surface of ys-rating
148
+ */
149
+
150
+ /**
151
+ * Generated bundle index. Do not edit.
152
+ */
153
+
154
+ export { YsRating, YsRatingInput };
155
+ //# sourceMappingURL=yoozsoft-yoozsoft-ng-rating.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-rating.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/rating/src/ys-rating/ys-rating.ts","../../../../projects/yoozsoft/yoozsoft-ng/rating/src/ys-rating/ys-rating.html","../../../../projects/yoozsoft/yoozsoft-ng/rating/src/ys-rating-input/ys-rating-input.ts","../../../../projects/yoozsoft/yoozsoft-ng/rating/src/ys-rating-input/ys-rating-input.html","../../../../projects/yoozsoft/yoozsoft-ng/rating/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/rating/yoozsoft-yoozsoft-ng-rating.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n@Component({\n selector: 'ys-rating',\n imports: [],\n templateUrl: './ys-rating.html',\n styleUrl: './ys-rating.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class YsRating {\n\n /**Current score */\n readonly score = input(0);\n\n /**Points cap (default 100) */\n readonly maxScore = input(100);\n readonly starsCount = input(5);\n\n /**Icon size in pixel */\n readonly size = input(20);\n readonly ratingIconClass = input('fas fa-star');\n\n /**Icons gap in pixel */\n readonly gap = input(4);\n readonly ariaLabel = input<string>();\n\n readonly wrapperSize = computed(() => this.size() + this.gap());\n\n readonly normalizedAriaLabel = computed(() =>\n this.ariaLabel() ??\n `Rating ${this.normalizedScore()} of ${this.maxScore()}`\n );\n\n readonly normalizedScore = computed(() => {\n\n return Math.min(\n Math.max(this.score(), 0),\n this.maxScore()\n );\n\n });\n\n readonly normalizedStarsCount = computed(() =>\n Math.max(1, Math.floor(this.starsCount()))\n );\n\n readonly rating = computed(() =>\n (this.normalizedScore() / this.maxScore()) * this.normalizedStarsCount()\n );\n\n readonly fillPercents = computed(() => {\n\n const totalStars = this.normalizedStarsCount();\n\n if (this.maxScore() <= 0) {\n return Array(totalStars).fill(0);\n }\n\n const rating = this.rating();\n\n return Array.from({ length: totalStars }, (_, index) =>\n Math.max(\n 0,\n Math.min(\n 100,\n (rating - index) * 100\n )\n )\n );\n\n });\n\n}\n","<div class=\"ys-rating\" role=\"img\" [style.gap.px]=\"gap()\" [attr.aria-label]=\"normalizedAriaLabel()\">\n\n @for (fill of fillPercents(); track $index) {\n\n <div class=\"rating-wrapper\" [style.width.px]=\"wrapperSize()\" [style.height.px]=\"size()\">\n\n <i class=\"rating-empty\" [class]=\"ratingIconClass()\" [style.fontSize.px]=\"size()\">\n </i>\n\n <div class=\"rating-fill\" [style.width.%]=\"fill\" [style.height.px]=\"size()\">\n\n <i class=\"rating\" [class]=\"ratingIconClass()\" [style.fontSize.px]=\"size()\">\n </i>\n\n </div>\n\n </div>\n\n }\n\n</div>","import { Component, computed, effect, forwardRef, input, output, signal } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { YsRating } from '../ys-rating/ys-rating';\n\n@Component({\n selector: 'ys-rating-input',\n imports: [YsRating],\n templateUrl: './ys-rating-input.html',\n styleUrl: './ys-rating-input.scss',\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => YsRatingInput),\n multi: true\n }]\n})\nexport class YsRatingInput implements ControlValueAccessor {\n\n readonly maxScore = input(100);\n readonly starsCount = input(5);\n readonly size = input(20);\n readonly ratingIconClass = input('fas fa-star');\n\n readonly disabled = input(false);\n readonly readonly = input(false);\n readonly allowClear = input(true);\n\n readonly valueChange = output<number>();\n\n readonly value = signal(0);\n readonly hoverValue = signal<number | null>(null);\n\n readonly displayValue = computed(() =>\n this.hoverValue() ?? this.value()\n );\n\n readonly normalizedStarsCount = computed(() =>\n Math.max(1, Math.floor(this.starsCount()))\n );\n\n readonly stars = computed(() =>\n Array.from({ length: this.normalizedStarsCount() })\n );\n\n private disabledState = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this.readonly() || this.disabledState());\n\n private _onChange: (value: number) => void = () => { };\n private _onTouched = () => { };\n\n constructor() {\n effect(() => {\n\n if (this.isDisabled()) {\n this.hoverValue.set(null);\n }\n\n });\n }\n\n writeValue(value: number | null): void {\n this.value.set(value ?? 0);\n }\n\n registerOnChange(fn: any) {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: any) {\n this._onTouched = fn;\n }\n\n setDisabledState(disabled: boolean) {\n this.disabledState.set(disabled);\n }\n\n hover(index: number) {\n\n if (this.isDisabled())\n return;\n\n const value = ((index + 1) / this.normalizedStarsCount()) * this.maxScore();\n\n this.hoverValue.set(value);\n\n }\n\n leave() {\n this.hoverValue.set(null);\n }\n\n select(index: number) {\n if (this.isDisabled())\n return;\n\n const value = ((index + 1) / this.normalizedStarsCount()) * this.maxScore();\n\n if (this.allowClear() && value === this.value()) {\n\n this.value.set(0);\n\n this._onChange(0);\n this.valueChange.emit(0);\n\n this._onTouched();\n\n return;\n }\n\n this.value.set(value);\n\n this._onChange(value);\n this.valueChange.emit(value);\n\n this._onTouched();\n\n }\n\n}\n","<div class=\"ys-rating-input\">\n\n <ys-rating [score]=\"displayValue()\" [maxScore]=\"maxScore()\" [starsCount]=\"starsCount()\" [size]=\"size()\"\n [ratingIconClass]=\"ratingIconClass()\">\n </ys-rating>\n\n <div class=\"rating-overlay\" [class.readonly]=\"readonly()\">\n\n @for (star of stars(); track $index) {\n\n <button type=\"button\" class=\"rating-hit\" [disabled]=\"isDisabled()\" (focus)=\"hover($index)\" (blur)=\"leave()\"\n (mouseenter)=\"hover($index)\" (mouseleave)=\"leave()\" (click)=\"select($index)\">\n </button>\n\n }\n\n </div>\n\n</div>","/*\r\n * Public API Surface of ys-rating\r\n */\r\n\r\nexport * from './src/ys-rating-input/ys-rating-input';\r\nexport * from './src/ys-rating/ys-rating';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}