@seniorsistemas/angular-components 19.9.3 → 19.9.4

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 (95) hide show
  1. package/checkbox/lib/checkbox/checkbox.component.d.ts +1 -6
  2. package/checkbox-list/lib/checkbox-list/checkbox-list.component.d.ts +8 -0
  3. package/content-generator/lib/content-generator/content-generator.component.d.ts +2 -2
  4. package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +2 -0
  5. package/drawer/README.md +9 -2
  6. package/drawer/lib/drawer/drawer.component.d.ts +12 -1
  7. package/editor/lib/editor/editor.component.d.ts +1 -1
  8. package/esm2022/button/lib/button/button.component.mjs +3 -3
  9. package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -9
  10. package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +17 -5
  11. package/esm2022/content-generator/lib/content-generator/content-generator.component.mjs +9 -8
  12. package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +18 -3
  13. package/esm2022/drawer/lib/drawer/drawer.component.mjs +33 -11
  14. package/esm2022/drawer/lib/drawer/drawer.module.mjs +2 -2
  15. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
  16. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
  17. package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.mjs +3 -3
  18. package/esm2022/dynamic-form/dynamic-form/form-field/fields/checkbox/checkbox-field.component.mjs +4 -3
  19. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +3 -3
  20. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
  21. package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +3 -3
  22. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +3 -3
  23. package/esm2022/editor/lib/editor/editor.component.mjs +8 -8
  24. package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +4 -4
  25. package/esm2022/global-search/lib/global-search/components/dropdown/global-search-dropdown-item.component.mjs +4 -4
  26. package/esm2022/global-search/lib/global-search/global-search.module.mjs +2 -2
  27. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +3 -3
  28. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +2 -3
  29. package/esm2022/paginator/lib/models/paginator.models.mjs +1 -1
  30. package/esm2022/paginator/lib/paginator/paginator.component.mjs +19 -13
  31. package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.mjs +19 -8
  32. package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.mjs +3 -4
  33. package/esm2022/select/lib/select/select.component.mjs +3 -3
  34. package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +6 -5
  35. package/esm2022/slider/lib/slider/slider.component.mjs +3 -3
  36. package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +54 -8
  37. package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
  38. package/esm2022/table-header/lib/table-header/table-header-checkbox.component.mjs +14 -21
  39. package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
  40. package/esm2022/tooltip/lib/tooltip/tooltip.directive.mjs +3 -2
  41. package/esm2022/utils/lib/utils/utils.mjs +49 -3
  42. package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
  43. package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
  44. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +16 -4
  45. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
  46. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -8
  47. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
  48. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +8 -6
  49. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
  50. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +17 -2
  51. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
  52. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +32 -9
  53. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
  54. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +16 -16
  55. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  56. package/fesm2022/seniorsistemas-angular-components-editor.mjs +7 -7
  57. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  58. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +3 -3
  59. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
  60. package/fesm2022/seniorsistemas-angular-components-global-search.mjs +3 -3
  61. package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
  62. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +3 -4
  63. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  64. package/fesm2022/seniorsistemas-angular-components-paginator.mjs +18 -12
  65. package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
  66. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +20 -9
  67. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
  68. package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
  69. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  70. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +5 -4
  71. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -1
  72. package/fesm2022/seniorsistemas-angular-components-slider.mjs +2 -2
  73. package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
  74. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +53 -7
  75. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
  76. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
  77. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
  78. package/fesm2022/seniorsistemas-angular-components-table-header.mjs +13 -20
  79. package/fesm2022/seniorsistemas-angular-components-table-header.mjs.map +1 -1
  80. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
  81. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  82. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs +2 -1
  83. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs.map +1 -1
  84. package/fesm2022/seniorsistemas-angular-components-utils.mjs +49 -3
  85. package/fesm2022/seniorsistemas-angular-components-utils.mjs.map +1 -1
  86. package/global-search/lib/global-search/global-search.module.d.ts +1 -1
  87. package/package.json +7 -9
  88. package/paginator/lib/models/paginator.models.d.ts +1 -0
  89. package/paginator/lib/paginator/paginator.component.d.ts +3 -1
  90. package/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.d.ts +3 -1
  91. package/side-sheet/README.md +4 -4
  92. package/side-sheet/lib/side-sheet/side-sheet.component.d.ts +1 -0
  93. package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +2 -1
  94. package/table-header/lib/table-header/table-header-checkbox.component.d.ts +1 -4
  95. package/utils/lib/utils/utils.d.ts +21 -0
@@ -65,7 +65,7 @@ class StarRatingComponent {
65
65
  useExisting: StarRatingComponent,
66
66
  multi: true,
67
67
  },
68
- ], ngImport: i0, template: "@let justifyContentClassName = 'justify-' + justifyContent();\n<section [class]=\"justifyContentClassName\" class=\"flex gap-2\" [class.opacity-50]=\"disabled()\">\n @for(item of elementsRender(); track item) {\n @let isActivated = selectedStar() <= item;\n <i\n [class.fas]=\"!isActivated\"\n [class.far]=\"isActivated\"\n [class.cursor-pointer]=\"!disabled()\"\n class=\"fa-star text-buttercup-500 cursor-pointer\"\n (sInteractiveContent)=\"onSelectStar(item + 1)\">\n </i>\n }\n</section>\n", dependencies: [{ kind: "directive", type: InteractiveContentDirective, selector: "[sInteractiveContent]", inputs: ["focusable", "disabled", "stopPropagation"], outputs: ["sInteractiveContent"] }] });
68
+ ], ngImport: i0, template: "@let justifyContentClassName = 'justify-' + justifyContent();\n<section [class]=\"justifyContentClassName\" class=\"flex gap-2\" [class.opacity-50]=\"disabled()\">\n @for(item of elementsRender(); track item) {\n @let isActivated = selectedStar() <= item;\n <i\n [class.fas]=\"!isActivated\"\n [class.far]=\"isActivated\"\n [class.cursor-pointer]=\"!disabled()\"\n class=\"fa-star text-buttercup-500 cursor-pointer\"\n [disabled]=\"disabled()\"\n (sInteractiveContent)=\"onSelectStar(item + 1)\">\n </i>\n }\n</section>\n", dependencies: [{ kind: "directive", type: InteractiveContentDirective, selector: "[sInteractiveContent]", inputs: ["focusable", "disabled", "stopPropagation"], outputs: ["sInteractiveContent"] }] });
69
69
  }
70
70
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StarRatingComponent, decorators: [{
71
71
  type: Component,
@@ -75,7 +75,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
75
75
  useExisting: StarRatingComponent,
76
76
  multi: true,
77
77
  },
78
- ], template: "@let justifyContentClassName = 'justify-' + justifyContent();\n<section [class]=\"justifyContentClassName\" class=\"flex gap-2\" [class.opacity-50]=\"disabled()\">\n @for(item of elementsRender(); track item) {\n @let isActivated = selectedStar() <= item;\n <i\n [class.fas]=\"!isActivated\"\n [class.far]=\"isActivated\"\n [class.cursor-pointer]=\"!disabled()\"\n class=\"fa-star text-buttercup-500 cursor-pointer\"\n (sInteractiveContent)=\"onSelectStar(item + 1)\">\n </i>\n }\n</section>\n" }]
78
+ ], template: "@let justifyContentClassName = 'justify-' + justifyContent();\n<section [class]=\"justifyContentClassName\" class=\"flex gap-2\" [class.opacity-50]=\"disabled()\">\n @for(item of elementsRender(); track item) {\n @let isActivated = selectedStar() <= item;\n <i\n [class.fas]=\"!isActivated\"\n [class.far]=\"isActivated\"\n [class.cursor-pointer]=\"!disabled()\"\n class=\"fa-star text-buttercup-500 cursor-pointer\"\n [disabled]=\"disabled()\"\n (sInteractiveContent)=\"onSelectStar(item + 1)\">\n </i>\n }\n</section>\n" }]
79
79
  }] });
80
80
 
81
81
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-star-rating.mjs","sources":["../../projects/angular-components/star-rating/src/star-rating/star-rating.component.ts","../../projects/angular-components/star-rating/src/star-rating/star-rating.component.html","../../projects/angular-components/star-rating/src/seniorsistemas-angular-components-star-rating.ts"],"sourcesContent":["import { Component, computed, input, model } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\nimport { JustifyTypes } from './star-rating-models';\n\n/**\n * @description Componente de avaliação por estrelas com suporte a `ControlValueAccessor`\n * para integração com formulários Angular. Permite configurar o número de estrelas,\n * alinhamento e estado desabilitado. Clicar na estrela já selecionada a deseleciona.\n *\n * @example\n * ```html\n * <s-star-rating [starsRange]=\"5\" formControlName=\"avaliacao\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n selector: 's-star-rating',\n standalone: true,\n imports: [InteractiveContentDirective],\n templateUrl: './star-rating.component.html',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: StarRatingComponent,\n multi: true,\n },\n ],\n})\nexport class StarRatingComponent implements ControlValueAccessor {\n onChange: (value: number) => void = () => {};\n onTouched: (value: number) => void = () => {};\n\n /** @description Índice da estrela atualmente selecionada (1-based). @default 0 */\n selectedStar = model(0);\n /** @description Número total de estrelas exibidas. @default 5 */\n starsRange = input(5);\n /** @description Alinhamento horizontal das estrelas. @default 'center' */\n justifyContent = input<JustifyTypes>('center');\n /** @description Desabilita a seleção de estrelas. @default false */\n disabled = model(false);\n\n protected readonly elementsRender = computed(() => {\n const elements = this.starsRange();\n return Array.from({ length: elements }).map((_x, $index) => $index);\n });\n\n writeValue(obj: number): void {\n if (obj !== null) {\n this.selectedStar.set(obj);\n }\n }\n\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n onSelectStar(selectedIndex: number) {\n this.storeValue(selectedIndex);\n }\n\n private storeValue(selectedIndex: number) {\n if (this.disabled()) {\n return;\n }\n if (selectedIndex === this.selectedStar()) {\n selectedIndex = 0;\n }\n this.writeValue(selectedIndex);\n this.onChange(selectedIndex);\n this.onTouched(selectedIndex);\n }\n}\n\n","@let justifyContentClassName = 'justify-' + justifyContent();\n<section [class]=\"justifyContentClassName\" class=\"flex gap-2\" [class.opacity-50]=\"disabled()\">\n @for(item of elementsRender(); track item) {\n @let isActivated = selectedStar() <= item;\n <i\n [class.fas]=\"!isActivated\"\n [class.far]=\"isActivated\"\n [class.cursor-pointer]=\"!disabled()\"\n class=\"fa-star text-buttercup-500 cursor-pointer\"\n (sInteractiveContent)=\"onSelectStar(item + 1)\">\n </i>\n }\n</section>\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":"seniorsistemas-angular-components-star-rating.mjs","sources":["../../projects/angular-components/star-rating/src/star-rating/star-rating.component.ts","../../projects/angular-components/star-rating/src/star-rating/star-rating.component.html","../../projects/angular-components/star-rating/src/seniorsistemas-angular-components-star-rating.ts"],"sourcesContent":["import { Component, computed, input, model } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\nimport { JustifyTypes } from './star-rating-models';\n\n/**\n * @description Componente de avaliação por estrelas com suporte a `ControlValueAccessor`\n * para integração com formulários Angular. Permite configurar o número de estrelas,\n * alinhamento e estado desabilitado. Clicar na estrela já selecionada a deseleciona.\n *\n * @example\n * ```html\n * <s-star-rating [starsRange]=\"5\" formControlName=\"avaliacao\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n selector: 's-star-rating',\n standalone: true,\n imports: [InteractiveContentDirective],\n templateUrl: './star-rating.component.html',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: StarRatingComponent,\n multi: true,\n },\n ],\n})\nexport class StarRatingComponent implements ControlValueAccessor {\n onChange: (value: number) => void = () => {};\n onTouched: (value: number) => void = () => {};\n\n /** @description Índice da estrela atualmente selecionada (1-based). @default 0 */\n selectedStar = model(0);\n /** @description Número total de estrelas exibidas. @default 5 */\n starsRange = input(5);\n /** @description Alinhamento horizontal das estrelas. @default 'center' */\n justifyContent = input<JustifyTypes>('center');\n /** @description Desabilita a seleção de estrelas. @default false */\n disabled = model(false);\n\n protected readonly elementsRender = computed(() => {\n const elements = this.starsRange();\n return Array.from({ length: elements }).map((_x, $index) => $index);\n });\n\n writeValue(obj: number): void {\n if (obj !== null) {\n this.selectedStar.set(obj);\n }\n }\n\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n onSelectStar(selectedIndex: number) {\n this.storeValue(selectedIndex);\n }\n\n private storeValue(selectedIndex: number) {\n if (this.disabled()) {\n return;\n }\n if (selectedIndex === this.selectedStar()) {\n selectedIndex = 0;\n }\n this.writeValue(selectedIndex);\n this.onChange(selectedIndex);\n this.onTouched(selectedIndex);\n }\n}\n\n","@let justifyContentClassName = 'justify-' + justifyContent();\n<section [class]=\"justifyContentClassName\" class=\"flex gap-2\" [class.opacity-50]=\"disabled()\">\n @for(item of elementsRender(); track item) {\n @let isActivated = selectedStar() <= item;\n <i\n [class.fas]=\"!isActivated\"\n [class.far]=\"isActivated\"\n [class.cursor-pointer]=\"!disabled()\"\n class=\"fa-star text-buttercup-500 cursor-pointer\"\n [disabled]=\"disabled()\"\n (sInteractiveContent)=\"onSelectStar(item + 1)\">\n </i>\n }\n</section>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Component, Input, NgModule } from '@angular/core';
3
- import { CheckboxListComponent } from '@seniorsistemas/angular-components/checkbox-list';
3
+ import { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';
4
4
  import { Table, TableService } from 'primeng/table';
5
5
  import { Subject } from 'rxjs';
6
6
  import { takeUntil } from 'rxjs/operators';
7
- import * as i1 from '@angular/forms';
8
- import { FormsModule } from '@angular/forms';
9
7
 
10
8
  /**
11
9
  * @description Componente de checkbox de cabeçalho para tabelas PrimeNG.
@@ -33,12 +31,8 @@ class TableHeaderCheckboxComponent {
33
31
  rowProps;
34
32
  /** @description Quando `true`, usa o objeto completo da linha em vez de propriedades específicas. */
35
33
  useAllObject;
36
- checkboxItems = {
37
- label: '',
38
- };
39
34
  checked = false;
40
35
  hasFocus = false;
41
- checkboxState = { checked: false };
42
36
  _ngUnsubscribe = new Subject();
43
37
  constructor() {
44
38
  this.table.tableService.valueSource$.pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {
@@ -63,10 +57,11 @@ class TableHeaderCheckboxComponent {
63
57
  isDisabled() {
64
58
  return this.disabled || !this.table.value || !this.table.value.length;
65
59
  }
66
- onClick() {
60
+ onClick(checked) {
67
61
  if (!this.disabled) {
68
- if (this.table.value && this.table.value.length > 0)
69
- this.onToggleCheckbox(!this.checked);
62
+ if (this.table.value && this.table.value.length > 0) {
63
+ this.onToggleCheckbox(checked);
64
+ }
70
65
  }
71
66
  }
72
67
  updateCheckedState() {
@@ -146,26 +141,24 @@ class TableHeaderCheckboxComponent {
146
141
  }
147
142
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableHeaderCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
143
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TableHeaderCheckboxComponent, isStandalone: true, selector: "s-table-header-checkbox", inputs: { id: "id", disabled: "disabled", rowProps: "rowProps", useAllObject: "useAllObject" }, ngImport: i0, template: `
149
- <s-checkbox-list
150
- [(ngModel)]="checkboxState"
151
- (ngModelChange)="onClick()"
152
- [data]="checkboxItems"
144
+ <s-checkbox
145
+ [checked]="checked"
146
+ (checkedChange)="onClick($event)"
153
147
  />
154
- `, isInline: true, dependencies: [{ kind: "component", type: CheckboxListComponent, selector: "s-checkbox-list", inputs: ["data"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
148
+ `, isInline: true, dependencies: [{ kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }] });
155
149
  }
156
150
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableHeaderCheckboxComponent, decorators: [{
157
151
  type: Component,
158
152
  args: [{
159
153
  selector: 's-table-header-checkbox',
160
154
  template: `
161
- <s-checkbox-list
162
- [(ngModel)]="checkboxState"
163
- (ngModelChange)="onClick()"
164
- [data]="checkboxItems"
155
+ <s-checkbox
156
+ [checked]="checked"
157
+ (checkedChange)="onClick($event)"
165
158
  />
166
159
  `,
167
160
  standalone: true,
168
- imports: [CheckboxListComponent, FormsModule],
161
+ imports: [CheckboxComponent],
169
162
  }]
170
163
  }], ctorParameters: () => [], propDecorators: { id: [{
171
164
  type: Input
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-table-header.mjs","sources":["../../projects/angular-components/table-header/src/lib/table-header/table-header-checkbox.component.ts","../../projects/angular-components/table-header/src/lib/table-header/table-header-checkox.module.ts","../../projects/angular-components/table-header/src/seniorsistemas-angular-components-table-header.ts"],"sourcesContent":["import { Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\r\n\r\nimport {\r\n CheckboxListData,\r\n CheckboxListState,\r\n CheckboxListComponent,\r\n} from '@seniorsistemas/angular-components/checkbox-list';\r\nimport { Table, TableService } from 'primeng/table';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n/**\r\n * @description Componente de checkbox de cabeçalho para tabelas PrimeNG.\r\n * Integra-se automaticamente ao `TableService` para sincronizar o estado\r\n * de seleção total/parcial com as linhas da tabela.\r\n *\r\n * @example\r\n * ```html\r\n * <th>\r\n * <s-table-header-checkbox [rowProps]=\"['id', 'name']\" />\r\n * </th>\r\n * ```\r\n *\r\n * @category Data\r\n */\r\n@Component({\r\n selector: 's-table-header-checkbox',\r\n template: `\r\n <s-checkbox-list\r\n [(ngModel)]=\"checkboxState\"\r\n (ngModelChange)=\"onClick()\"\r\n [data]=\"checkboxItems\"\r\n />\r\n `,\r\n standalone: true,\r\n imports: [CheckboxListComponent, FormsModule],\r\n})\r\nexport class TableHeaderCheckboxComponent implements OnInit, OnDestroy {\r\n readonly table = inject(Table);\r\n readonly tableService = inject(TableService);\r\n\r\n public static nextId = 0;\r\n\r\n /** @description Identificador único do componente no DOM. Gerado automaticamente se não informado. */\r\n @Input()\r\n public id = `s-table-header-checkbox-${TableHeaderCheckboxComponent.nextId++}`;\r\n\r\n /** @description Desabilita o checkbox de cabeçalho. @default false */\r\n @Input()\r\n public disabled = false;\r\n\r\n /** @description Lista de propriedades dos itens da linha usadas para identificação. */\r\n @Input()\r\n public rowProps?: string[];\r\n\r\n /** @description Quando `true`, usa o objeto completo da linha em vez de propriedades específicas. */\r\n @Input()\r\n public useAllObject?: boolean;\r\n\r\n public checkboxItems: CheckboxListData = {\r\n label: '',\r\n };\r\n\r\n public checked = false;\r\n public hasFocus = false;\r\n public checkboxState: CheckboxListState = { checked: false };\r\n\r\n private _ngUnsubscribe = new Subject<void>();\r\n\r\n constructor() {\r\n this.table.tableService.valueSource$.pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {\r\n this.checked = this.updateCheckedState();\r\n });\r\n\r\n this.table.tableService.selectionSource$.pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {\r\n this.checked = this.updateCheckedState();\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.checked = this.updateCheckedState();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngUnsubscribe.next();\r\n }\r\n\r\n public onFocus(): void {\r\n this.hasFocus = true;\r\n }\r\n\r\n public onBlur(): void {\r\n this.hasFocus = false;\r\n }\r\n\r\n public isDisabled(): boolean {\r\n return this.disabled || !this.table.value || !this.table.value.length;\r\n }\r\n\r\n public onClick(): void {\r\n if (!this.disabled) {\r\n if (this.table.value && this.table.value.length > 0) this.onToggleCheckbox(!this.checked);\r\n }\r\n }\r\n\r\n public updateCheckedState() {\r\n if (this.table.filteredValue) {\r\n const val = this.table.filteredValue;\r\n return (\r\n val &&\r\n val.length > 0 &&\r\n this.table.selection &&\r\n this.table.selection.length > 0 &&\r\n this.isAllFilteredValuesChecked()\r\n );\r\n } else {\r\n const val = this.table.value;\r\n return (\r\n val &&\r\n val.length > 0 &&\r\n this.table.selection &&\r\n this.table.selection.length > 0 &&\r\n this.isAllValuesChecked()\r\n );\r\n }\r\n }\r\n\r\n public onToggleCheckbox(checked: boolean): void {\r\n const { filteredValue, value, dataKey } = this.table;\r\n const gridData = checked ? (filteredValue ? filteredValue.slice() : value.slice()) : [];\r\n\r\n if (!dataKey) return;\r\n\r\n if (checked) {\r\n const unselecteds = gridData\r\n .filter(\r\n (record) => !this.table._selection.find((selected: any) => record[dataKey] === selected[dataKey]),\r\n )\r\n .map((record: any) => {\r\n if (this.useAllObject) return record;\r\n\r\n const newRecord: any = {};\r\n if (this.rowProps) this.rowProps.forEach((prop: string) => (newRecord[prop] = record[prop]));\r\n else newRecord[dataKey] = record[dataKey];\r\n return newRecord;\r\n });\r\n this.table._selection = [...this.table._selection, ...unselecteds];\r\n } else {\r\n value.forEach((data: any) => {\r\n this.table._selection = this.table._selection.filter(\r\n (record: any) => record[dataKey] !== data[dataKey],\r\n );\r\n });\r\n }\r\n\r\n this.table.updateSelectionKeys();\r\n this.table.selectionChange.emit(this.table._selection);\r\n this.tableService.onSelectionChange();\r\n\r\n if (this.table.isStateful()) this.table.saveState();\r\n }\r\n\r\n public isAllFilteredValuesChecked(): boolean {\r\n if (!this.table.filteredValue) {\r\n return false;\r\n } else {\r\n for (const rowData of this.table.filteredValue) {\r\n if (!this.table.isSelected(rowData)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n public isAllValuesChecked(): boolean {\r\n if (!this.table.value) {\r\n return false;\r\n } else {\r\n for (const rowData of this.table.value) {\r\n if (!this.table.isSelected(rowData)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TableHeaderCheckboxComponent } from './table-header-checkbox.component';\r\n\r\n@NgModule({\r\n imports: [TableHeaderCheckboxComponent],\r\n exports: [TableHeaderCheckboxComponent],\r\n})\r\nexport class TableHeaderCheckboxModule {}\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":"seniorsistemas-angular-components-table-header.mjs","sources":["../../projects/angular-components/table-header/src/lib/table-header/table-header-checkbox.component.ts","../../projects/angular-components/table-header/src/lib/table-header/table-header-checkox.module.ts","../../projects/angular-components/table-header/src/seniorsistemas-angular-components-table-header.ts"],"sourcesContent":["import { Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\r\n\r\nimport { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';\r\nimport { Table, TableService } from 'primeng/table';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n/**\r\n * @description Componente de checkbox de cabeçalho para tabelas PrimeNG.\r\n * Integra-se automaticamente ao `TableService` para sincronizar o estado\r\n * de seleção total/parcial com as linhas da tabela.\r\n *\r\n * @example\r\n * ```html\r\n * <th>\r\n * <s-table-header-checkbox [rowProps]=\"['id', 'name']\" />\r\n * </th>\r\n * ```\r\n *\r\n * @category Data\r\n */\r\n@Component({\r\n selector: 's-table-header-checkbox',\r\n template: `\r\n <s-checkbox\r\n [checked]=\"checked\"\r\n (checkedChange)=\"onClick($event)\"\r\n />\r\n `,\r\n standalone: true,\r\n imports: [CheckboxComponent],\r\n})\r\nexport class TableHeaderCheckboxComponent implements OnInit, OnDestroy {\r\n readonly table = inject(Table);\r\n readonly tableService = inject(TableService);\r\n\r\n public static nextId = 0;\r\n\r\n /** @description Identificador único do componente no DOM. Gerado automaticamente se não informado. */\r\n @Input()\r\n public id = `s-table-header-checkbox-${TableHeaderCheckboxComponent.nextId++}`;\r\n\r\n /** @description Desabilita o checkbox de cabeçalho. @default false */\r\n @Input()\r\n public disabled = false;\r\n\r\n /** @description Lista de propriedades dos itens da linha usadas para identificação. */\r\n @Input()\r\n public rowProps?: string[];\r\n\r\n /** @description Quando `true`, usa o objeto completo da linha em vez de propriedades específicas. */\r\n @Input()\r\n public useAllObject?: boolean;\r\n\r\n public checked = false;\r\n public hasFocus = false;\r\n\r\n private _ngUnsubscribe = new Subject<void>();\r\n\r\n constructor() {\r\n this.table.tableService.valueSource$.pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {\r\n this.checked = this.updateCheckedState();\r\n });\r\n\r\n this.table.tableService.selectionSource$.pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {\r\n this.checked = this.updateCheckedState();\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.checked = this.updateCheckedState();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngUnsubscribe.next();\r\n }\r\n\r\n public onFocus(): void {\r\n this.hasFocus = true;\r\n }\r\n\r\n public onBlur(): void {\r\n this.hasFocus = false;\r\n }\r\n\r\n public isDisabled(): boolean {\r\n return this.disabled || !this.table.value || !this.table.value.length;\r\n }\r\n\r\n public onClick(checked: boolean): void {\r\n if (!this.disabled) {\r\n if (this.table.value && this.table.value.length > 0) {\r\n this.onToggleCheckbox(checked);\r\n }\r\n }\r\n }\r\n\r\n public updateCheckedState() {\r\n if (this.table.filteredValue) {\r\n const val = this.table.filteredValue;\r\n return (\r\n val &&\r\n val.length > 0 &&\r\n this.table.selection &&\r\n this.table.selection.length > 0 &&\r\n this.isAllFilteredValuesChecked()\r\n );\r\n } else {\r\n const val = this.table.value;\r\n return (\r\n val &&\r\n val.length > 0 &&\r\n this.table.selection &&\r\n this.table.selection.length > 0 &&\r\n this.isAllValuesChecked()\r\n );\r\n }\r\n }\r\n\r\n public onToggleCheckbox(checked: boolean): void {\r\n const { filteredValue, value, dataKey } = this.table;\r\n const gridData = checked ? (filteredValue ? filteredValue.slice() : value.slice()) : [];\r\n\r\n if (!dataKey) return;\r\n\r\n if (checked) {\r\n const unselecteds = gridData\r\n .filter(\r\n (record) => !this.table._selection.find((selected: any) => record[dataKey] === selected[dataKey]),\r\n )\r\n .map((record: any) => {\r\n if (this.useAllObject) return record;\r\n\r\n const newRecord: any = {};\r\n if (this.rowProps) this.rowProps.forEach((prop: string) => (newRecord[prop] = record[prop]));\r\n else newRecord[dataKey] = record[dataKey];\r\n return newRecord;\r\n });\r\n this.table._selection = [...this.table._selection, ...unselecteds];\r\n } else {\r\n value.forEach((data: any) => {\r\n this.table._selection = this.table._selection.filter(\r\n (record: any) => record[dataKey] !== data[dataKey],\r\n );\r\n });\r\n }\r\n\r\n this.table.updateSelectionKeys();\r\n this.table.selectionChange.emit(this.table._selection);\r\n this.tableService.onSelectionChange();\r\n\r\n if (this.table.isStateful()) this.table.saveState();\r\n }\r\n\r\n public isAllFilteredValuesChecked(): boolean {\r\n if (!this.table.filteredValue) {\r\n return false;\r\n } else {\r\n for (const rowData of this.table.filteredValue) {\r\n if (!this.table.isSelected(rowData)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n public isAllValuesChecked(): boolean {\r\n if (!this.table.value) {\r\n return false;\r\n } else {\r\n for (const rowData of this.table.value) {\r\n if (!this.table.isSelected(rowData)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TableHeaderCheckboxComponent } from './table-header-checkbox.component';\r\n\r\n@NgModule({\r\n imports: [TableHeaderCheckboxComponent],\r\n exports: [TableHeaderCheckboxComponent],\r\n})\r\nexport class TableHeaderCheckboxModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -103,7 +103,7 @@ class TextAreaComponent {
103
103
  useExisting: forwardRef(() => TextAreaComponent),
104
104
  multi: true,
105
105
  },
106
- ], viewQueries: [{ propertyName: "textAreaElement", first: true, predicate: ["textArea"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if (keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [pKeyFilter]=\"keyFilter\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"setValue($event)\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n ></textarea>\r\n}\r\n\r\n@if (!keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [(ngModel)]=\"value\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n (ngModelChange)=\"setValue($event)\"\r\n ></textarea>\r\n}\r\n\r\n@if (speechRecognition && renderTextArea) {\r\n <s-speech-recognition\r\n [textAreaElement]=\"textAreaElement.nativeElement\"\r\n [keepContext]=\"keepContext\"\r\n [speechRecognitionPlaceholder]=\"speechRecognitionPlaceholder\"\r\n (recognizedText)=\"handleRecognizedText($event)\"\r\n >\r\n </s-speech-recognition>\r\n}\r\n", styles: [".textarea{border-radius:3px;border:1px solid #c1c1cc;background:#fff;width:100%;max-width:100%;min-height:4em;min-width:10em;outline:none;padding:8px;display:block}.textarea:disabled{opacity:.5}.textarea:focus{transition:border-color .2s ease-out;border:1px solid #428bca}:host.ng-invalid.ng-dirty .textarea{border-color:#c13018}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: KeyFilter, selector: "[pKeyFilter]", inputs: ["pValidateOnly", "pKeyFilter"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SpeechRecognitionComponent, selector: "s-speech-recognition", inputs: ["textAreaElement", "keepContext", "speechRecognitionPlaceholder"], outputs: ["recognizedText"] }] });
106
+ ], viewQueries: [{ propertyName: "textAreaElement", first: true, predicate: ["textArea"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if (keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [pKeyFilter]=\"keyFilter\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"setValue($event)\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n ></textarea>\r\n}\r\n\r\n@if (!keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [(ngModel)]=\"value\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n (ngModelChange)=\"setValue($event)\"\r\n ></textarea>\r\n}\r\n\r\n@if (speechRecognition && renderTextArea) {\r\n <s-speech-recognition\r\n [textAreaElement]=\"textAreaElement.nativeElement\"\r\n [keepContext]=\"keepContext\"\r\n [speechRecognitionPlaceholder]=\"speechRecognitionPlaceholder\"\r\n [disabledSpeechRecognition]=\"disabled\"\r\n (recognizedText)=\"handleRecognizedText($event)\"\r\n />\r\n\r\n}\r\n", styles: [".textarea{border-radius:3px;border:1px solid #c1c1cc;background:#fff;width:100%;max-width:100%;min-height:4em;min-width:10em;outline:none;padding:8px;display:block}.textarea:disabled{opacity:.5}.textarea:focus{transition:border-color .2s ease-out;border:1px solid #428bca}:host.ng-invalid.ng-dirty .textarea{border-color:#c13018}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: KeyFilter, selector: "[pKeyFilter]", inputs: ["pValidateOnly", "pKeyFilter"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SpeechRecognitionComponent, selector: "s-speech-recognition", inputs: ["textAreaElement", "keepContext", "speechRecognitionPlaceholder", "disabledSpeechRecognition"], outputs: ["recognizedText"] }] });
107
107
  }
108
108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TextAreaComponent, decorators: [{
109
109
  type: Component,
@@ -113,7 +113,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
113
113
  useExisting: forwardRef(() => TextAreaComponent),
114
114
  multi: true,
115
115
  },
116
- ], standalone: true, imports: [FormsModule, KeyFilter, NgStyle, SpeechRecognitionComponent], template: "@if (keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [pKeyFilter]=\"keyFilter\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"setValue($event)\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n ></textarea>\r\n}\r\n\r\n@if (!keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [(ngModel)]=\"value\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n (ngModelChange)=\"setValue($event)\"\r\n ></textarea>\r\n}\r\n\r\n@if (speechRecognition && renderTextArea) {\r\n <s-speech-recognition\r\n [textAreaElement]=\"textAreaElement.nativeElement\"\r\n [keepContext]=\"keepContext\"\r\n [speechRecognitionPlaceholder]=\"speechRecognitionPlaceholder\"\r\n (recognizedText)=\"handleRecognizedText($event)\"\r\n >\r\n </s-speech-recognition>\r\n}\r\n", styles: [".textarea{border-radius:3px;border:1px solid #c1c1cc;background:#fff;width:100%;max-width:100%;min-height:4em;min-width:10em;outline:none;padding:8px;display:block}.textarea:disabled{opacity:.5}.textarea:focus{transition:border-color .2s ease-out;border:1px solid #428bca}:host.ng-invalid.ng-dirty .textarea{border-color:#c13018}\n"] }]
116
+ ], standalone: true, imports: [FormsModule, KeyFilter, NgStyle, SpeechRecognitionComponent], template: "@if (keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [pKeyFilter]=\"keyFilter\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"setValue($event)\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n ></textarea>\r\n}\r\n\r\n@if (!keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [(ngModel)]=\"value\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n (ngModelChange)=\"setValue($event)\"\r\n ></textarea>\r\n}\r\n\r\n@if (speechRecognition && renderTextArea) {\r\n <s-speech-recognition\r\n [textAreaElement]=\"textAreaElement.nativeElement\"\r\n [keepContext]=\"keepContext\"\r\n [speechRecognitionPlaceholder]=\"speechRecognitionPlaceholder\"\r\n [disabledSpeechRecognition]=\"disabled\"\r\n (recognizedText)=\"handleRecognizedText($event)\"\r\n />\r\n\r\n}\r\n", styles: [".textarea{border-radius:3px;border:1px solid #c1c1cc;background:#fff;width:100%;max-width:100%;min-height:4em;min-width:10em;outline:none;padding:8px;display:block}.textarea:disabled{opacity:.5}.textarea:focus{transition:border-color .2s ease-out;border:1px solid #428bca}:host.ng-invalid.ng-dirty .textarea{border-color:#c13018}\n"] }]
117
117
  }], propDecorators: { textAreaElement: [{
118
118
  type: ViewChild,
119
119
  args: ['textArea', { read: ElementRef }]
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-text-area.mjs","sources":["../../projects/angular-components/text-area/src/lib/text-area/text-area.component.ts","../../projects/angular-components/text-area/src/lib/text-area/text-area.component.html","../../projects/angular-components/text-area/src/lib/text-area.module.ts","../../projects/angular-components/text-area/src/seniorsistemas-angular-components-text-area.ts"],"sourcesContent":["import { ChangeDetectorRef, Component, ElementRef, forwardRef, Input, ViewChild, inject } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\nimport { KeyFilterPattern, KeyFilter } from 'primeng/keyfilter';\r\nimport { NgStyle } from '@angular/common';\r\nimport { SpeechRecognitionComponent } from '@seniorsistemas/angular-components/speech-recognition';\r\n\r\n/**\r\n * @description Componente de área de texto com suporte a reconhecimento de voz,\r\n * filtro de teclas, comprimento máximo e integração com `ControlValueAccessor`.\r\n * Renderiza condicionalmente o componente `SpeechRecognitionComponent` quando\r\n * a flag `speechRecognition` está ativa.\r\n *\r\n * @example\r\n * ```html\r\n * <s-textarea\r\n * formControlName=\"descricao\"\r\n * [rows]=\"6\"\r\n * [maxLength]=\"500\"\r\n * placeholder=\"Digite aqui...\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n selector: 's-textarea',\r\n templateUrl: './text-area.component.html',\r\n styleUrls: ['./text-area.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextAreaComponent),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n imports: [FormsModule, KeyFilter, NgStyle, SpeechRecognitionComponent],\r\n})\r\nexport class TextAreaComponent implements ControlValueAccessor {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n onChange: (value: string) => void = () => {};\r\n onTouched: (value: string) => void = () => {};\r\n disabled = false;\r\n value = '';\r\n private _textAreaElement: ElementRef<HTMLTextAreaElement> | undefined;\r\n\r\n @ViewChild('textArea', { read: ElementRef })\r\n public get textAreaElement(): ElementRef<HTMLTextAreaElement> {\r\n return this._textAreaElement as ElementRef<HTMLTextAreaElement>;\r\n }\r\n\r\n public set textAreaElement(value: ElementRef<HTMLTextAreaElement>) {\r\n this._textAreaElement = value;\r\n setTimeout(() => {\r\n this.renderTextArea = true;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n /** @description Identificador do elemento `<textarea>` no DOM. @default 'textarea-{random}' */\r\n @Input() inputId = `textarea-${Math.random()}`;\r\n /** @description Número de linhas visíveis no textarea. @default 5 */\r\n @Input() rows = 5;\r\n /** @description Habilita o botão de reconhecimento de voz. @default false */\r\n @Input() speechRecognition = false;\r\n /** @description Filtro de teclas aceitas, usando padrão ou expressão regular. */\r\n @Input() keyFilter: RegExp | KeyFilterPattern | null | undefined;\r\n /** @description Quando `true`, mantém o contexto ao reiniciar o reconhecimento de voz. @default false */\r\n @Input() keepContext = false;\r\n /** @description Placeholder exibido durante o reconhecimento de voz. @default '' */\r\n @Input() speechRecognitionPlaceholder = '';\r\n /** @description Número máximo de caracteres aceitos. @default null (ilimitado) */\r\n @Input() maxLength: number | null = null;\r\n /** @description Texto exibido quando o campo está vazio. */\r\n @Input() placeholder: string | undefined;\r\n\r\n private _inputStyle: Partial<CSSStyleDeclaration> = {\r\n resize: 'vertical',\r\n };\r\n /** @description Estilos inline aplicados ao elemento `<textarea>` interno. @default `{ resize: 'vertical' }` */\r\n @Input() get inputStyle(): Partial<CSSStyleDeclaration> {\r\n return this._inputStyle;\r\n }\r\n set inputStyle(value: Partial<CSSStyleDeclaration>) {\r\n this._inputStyle = {\r\n ...value,\r\n ...this._inputStyle,\r\n };\r\n }\r\n /** @description Coloca o textarea em modo somente leitura. @default false */\r\n @Input() readOnly = false;\r\n\r\n renderTextArea = false;\r\n\r\n writeValue(obj: string): void {\r\n this.value = obj;\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n setValue(value: string | number) {\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.value = value.toString();\r\n this.writeValue(this.value);\r\n this.onChange(this.value);\r\n this.onTouched(this.value);\r\n }\r\n\r\n handleRecognizedText(recognizedText: string) {\r\n this.setValue(recognizedText);\r\n }\r\n}\r\n","@if (keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [pKeyFilter]=\"keyFilter\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"setValue($event)\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n ></textarea>\r\n}\r\n\r\n@if (!keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [(ngModel)]=\"value\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n (ngModelChange)=\"setValue($event)\"\r\n ></textarea>\r\n}\r\n\r\n@if (speechRecognition && renderTextArea) {\r\n <s-speech-recognition\r\n [textAreaElement]=\"textAreaElement.nativeElement\"\r\n [keepContext]=\"keepContext\"\r\n [speechRecognitionPlaceholder]=\"speechRecognitionPlaceholder\"\r\n (recognizedText)=\"handleRecognizedText($event)\"\r\n >\r\n </s-speech-recognition>\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { TextAreaComponent } from './text-area/text-area.component';\r\n\r\n@NgModule({\r\n imports: [TextAreaComponent],\r\n exports: [TextAreaComponent],\r\n})\r\nexport class TextAreaModule {}\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":"seniorsistemas-angular-components-text-area.mjs","sources":["../../projects/angular-components/text-area/src/lib/text-area/text-area.component.ts","../../projects/angular-components/text-area/src/lib/text-area/text-area.component.html","../../projects/angular-components/text-area/src/lib/text-area.module.ts","../../projects/angular-components/text-area/src/seniorsistemas-angular-components-text-area.ts"],"sourcesContent":["import { ChangeDetectorRef, Component, ElementRef, forwardRef, Input, ViewChild, inject } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\nimport { KeyFilterPattern, KeyFilter } from 'primeng/keyfilter';\r\nimport { NgStyle } from '@angular/common';\r\nimport { SpeechRecognitionComponent } from '@seniorsistemas/angular-components/speech-recognition';\r\n\r\n/**\r\n * @description Componente de área de texto com suporte a reconhecimento de voz,\r\n * filtro de teclas, comprimento máximo e integração com `ControlValueAccessor`.\r\n * Renderiza condicionalmente o componente `SpeechRecognitionComponent` quando\r\n * a flag `speechRecognition` está ativa.\r\n *\r\n * @example\r\n * ```html\r\n * <s-textarea\r\n * formControlName=\"descricao\"\r\n * [rows]=\"6\"\r\n * [maxLength]=\"500\"\r\n * placeholder=\"Digite aqui...\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n selector: 's-textarea',\r\n templateUrl: './text-area.component.html',\r\n styleUrls: ['./text-area.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextAreaComponent),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n imports: [FormsModule, KeyFilter, NgStyle, SpeechRecognitionComponent],\r\n})\r\nexport class TextAreaComponent implements ControlValueAccessor {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n onChange: (value: string) => void = () => {};\r\n onTouched: (value: string) => void = () => {};\r\n disabled = false;\r\n value = '';\r\n private _textAreaElement: ElementRef<HTMLTextAreaElement> | undefined;\r\n\r\n @ViewChild('textArea', { read: ElementRef })\r\n public get textAreaElement(): ElementRef<HTMLTextAreaElement> {\r\n return this._textAreaElement as ElementRef<HTMLTextAreaElement>;\r\n }\r\n\r\n public set textAreaElement(value: ElementRef<HTMLTextAreaElement>) {\r\n this._textAreaElement = value;\r\n setTimeout(() => {\r\n this.renderTextArea = true;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n /** @description Identificador do elemento `<textarea>` no DOM. @default 'textarea-{random}' */\r\n @Input() inputId = `textarea-${Math.random()}`;\r\n /** @description Número de linhas visíveis no textarea. @default 5 */\r\n @Input() rows = 5;\r\n /** @description Habilita o botão de reconhecimento de voz. @default false */\r\n @Input() speechRecognition = false;\r\n /** @description Filtro de teclas aceitas, usando padrão ou expressão regular. */\r\n @Input() keyFilter: RegExp | KeyFilterPattern | null | undefined;\r\n /** @description Quando `true`, mantém o contexto ao reiniciar o reconhecimento de voz. @default false */\r\n @Input() keepContext = false;\r\n /** @description Placeholder exibido durante o reconhecimento de voz. @default '' */\r\n @Input() speechRecognitionPlaceholder = '';\r\n /** @description Número máximo de caracteres aceitos. @default null (ilimitado) */\r\n @Input() maxLength: number | null = null;\r\n /** @description Texto exibido quando o campo está vazio. */\r\n @Input() placeholder: string | undefined;\r\n\r\n private _inputStyle: Partial<CSSStyleDeclaration> = {\r\n resize: 'vertical',\r\n };\r\n /** @description Estilos inline aplicados ao elemento `<textarea>` interno. @default `{ resize: 'vertical' }` */\r\n @Input() get inputStyle(): Partial<CSSStyleDeclaration> {\r\n return this._inputStyle;\r\n }\r\n set inputStyle(value: Partial<CSSStyleDeclaration>) {\r\n this._inputStyle = {\r\n ...value,\r\n ...this._inputStyle,\r\n };\r\n }\r\n /** @description Coloca o textarea em modo somente leitura. @default false */\r\n @Input() readOnly = false;\r\n\r\n renderTextArea = false;\r\n\r\n writeValue(obj: string): void {\r\n this.value = obj;\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n setValue(value: string | number) {\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.value = value.toString();\r\n this.writeValue(this.value);\r\n this.onChange(this.value);\r\n this.onTouched(this.value);\r\n }\r\n\r\n handleRecognizedText(recognizedText: string) {\r\n this.setValue(recognizedText);\r\n }\r\n}\r\n","@if (keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [pKeyFilter]=\"keyFilter\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"setValue($event)\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n ></textarea>\r\n}\r\n\r\n@if (!keyFilter) {\r\n <textarea\r\n #textArea\r\n class=\"textarea\"\r\n [id]=\"inputId\"\r\n [rows]=\"rows\"\r\n [(ngModel)]=\"value\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"inputStyle\"\r\n [readOnly]=\"readOnly\"\r\n [maxlength]=\"maxLength\"\r\n [placeholder]=\"placeholder ? placeholder : ''\"\r\n (ngModelChange)=\"setValue($event)\"\r\n ></textarea>\r\n}\r\n\r\n@if (speechRecognition && renderTextArea) {\r\n <s-speech-recognition\r\n [textAreaElement]=\"textAreaElement.nativeElement\"\r\n [keepContext]=\"keepContext\"\r\n [speechRecognitionPlaceholder]=\"speechRecognitionPlaceholder\"\r\n [disabledSpeechRecognition]=\"disabled\"\r\n (recognizedText)=\"handleRecognizedText($event)\"\r\n />\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { TextAreaComponent } from './text-area/text-area.component';\r\n\r\n@NgModule({\r\n imports: [TextAreaComponent],\r\n exports: [TextAreaComponent],\r\n})\r\nexport class TextAreaModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -187,7 +187,8 @@ class TooltipDirective {
187
187
  });
188
188
  }
189
189
  _createTooltip(useShowDelay = false, autoDestroy = true) {
190
- const tooltipText = this.tooltip() ?? '';
190
+ const tooltipValue = this.tooltip();
191
+ const tooltipText = tooltipValue === undefined || tooltipValue === null ? '' : String(tooltipValue);
191
192
  if (!tooltipText.length || this.overlayRef !== null)
192
193
  return;
193
194
  if (this.checkTruncatedText() && !this.contentIsTruncated)
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-tooltip.mjs","sources":["../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.html","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.directive.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.module.ts","../../projects/angular-components/tooltip/src/seniorsistemas-angular-components-tooltip.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport { Component, input } from '@angular/core';\n\nimport { TooltipPositions } from './models/tooltip-position';\n\n/**\n * @description Componente de apresentação do tooltip. Utilizado internamente pela diretiva `TooltipDirective`.\n * O posicionamento é gerenciado pelo CDK Overlay via `TooltipDirective`.\n */\n@Component({\n selector: 's-tooltip',\n templateUrl: './tooltip.component.html',\n styleUrls: ['./tooltip.component.scss'],\n standalone: true,\n imports: [NgClass],\n})\nexport class TooltipComponent {\n /** @description Texto ou HTML a ser exibido no tooltip. */\n public readonly tooltip = input<string>('');\n\n /** @description Posição do tooltip — usada para renderizar a seta no lado correto. */\n public readonly position = input<TooltipPositions>('top');\n\n /** @description Controla a visibilidade (opacidade) do tooltip via transição CSS. */\n public readonly visible = input<boolean>(false);\n\n /** @description Quando `true`, o conteúdo é renderizado como texto puro (escapa HTML). */\n public readonly escape = input<boolean>(false);\n}\n\n","<div\n class=\"tooltip relative max-w-[220px] break-words rounded-xsmall bg-grayscale-100 p-2 text-center font-open-sans text-sm font-normal leading-normal text-grayscale-0 transition-opacity duration-300\"\n [class.opacity-0]=\"!visible()\"\n [class.opacity-100]=\"visible()\"\n [class.tooltip--visible]=\"visible()\"\n [ngClass]=\"'tooltip--' + position()\"\n>\n @if (escape()) {\n <span class=\"tooltip__content\">\n {{ tooltip() }}\n </span>\n } @else {\n <span\n class=\"tooltip__content\"\n [innerHTML]=\"tooltip()\"\n >\n </span>\n }\n</div>\n\n","import { ConnectedPosition, FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n OnDestroy,\n OnInit,\n Renderer2,\n inject,\n input,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { DebounceUtils } from '@seniorsistemas/angular-components/common';\nimport { MobileBehavior } from './models/mobile-behavior';\nimport { TooltipEvent } from './models/tooltip-event';\nimport { TooltipPositions } from './models/tooltip-position';\nimport { TooltipComponent } from './tooltip.component';\n\n/**\n * @description Diretiva que exibe um tooltip (dica de ferramenta) flutuante ao interagir com o elemento hospedeiro.\n * Posiciona-se automaticamente considerando o espaço disponível na tela, utilizando o CDK Overlay.\n * Suporta eventos de hover, click e focus, além de comportamentos customizados para mobile.\n *\n * @example\n * ```html\n * <button sTooltip=\"Clique aqui\" tooltipPosition=\"top\">Ação</button>\n * ```\n *\n * @category Overlay\n */\n@Directive({\n selector: '[sTooltip]',\n standalone: true,\n})\nexport class TooltipDirective implements OnInit, OnDestroy {\n /**\n * @description Texto exibido no tooltip. Quando vazio ou `undefined`, o tooltip não é renderizado.\n */\n public readonly tooltip = input<string | undefined>(undefined, { alias: 'sTooltip' });\n\n /**\n * @description Posição preferencial do tooltip em relação ao elemento hospedeiro.\n * O tooltip se reposiciona automaticamente se não houver espaço suficiente.\n *\n * @default 'top'\n */\n public readonly tooltipPosition = input<TooltipPositions>('top');\n\n /**\n * @description Tempo em milissegundos antes do tooltip aparecer após o evento de ativação.\n *\n * @default 500\n */\n public readonly showDelay = input<number>(500);\n\n /**\n * @description Tempo em milissegundos que o tooltip permanece visível após aparecer.\n * Quando não informado, o tooltip permanece até o usuário sair do elemento.\n */\n public readonly displayTime = input<number | undefined>(undefined);\n\n /**\n * @description Evento do elemento hospedeiro que dispara a exibição do tooltip.\n * - `'hover'`: exibe ao passar o mouse (padrão).\n * - `'click'`: exibe ao clicar.\n * - `'focus'`: exibe ao focar no elemento.\n *\n * @default 'hover'\n */\n public readonly tooltipEvent = input<TooltipEvent>('hover');\n\n /**\n * @description Quando `true`, o conteúdo HTML do tooltip é escapado antes de ser renderizado.\n *\n * @default false\n */\n public readonly escape = input<boolean>(false);\n\n /**\n * @description Quando `false`, o tooltip nunca é exibido, mesmo que haja interação do usuário.\n * Útil para desabilitar tooltips dinamicamente.\n *\n * @default true\n */\n public readonly visible = input<boolean>(true);\n\n /**\n * @description Comportamento do tooltip em dispositivos móveis (touch).\n * - `'pressing'`: exibe ao pressionar e manter o toque (padrão).\n * - `'none'`: desabilita o tooltip em dispositivos táteis.\n *\n * @default 'pressing'\n */\n public readonly mobileBehavior = input<MobileBehavior>('pressing');\n\n /**\n * @description Referência a um input HTML para sincronizar a exibição do tooltip com o foco no campo.\n */\n public readonly focusedInputRef = input<HTMLInputElement | null>(null);\n\n /**\n * @description Quando `true`, o tooltip só é exibido se o texto do elemento estiver truncado (overflow).\n * Útil para cells de tabela ou elementos com `text-overflow: ellipsis`.\n *\n * @default false\n */\n public readonly checkTruncatedText = input<boolean>(false);\n\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlay = inject(Overlay);\n private readonly debounceUtils = inject(DebounceUtils);\n private readonly renderer = inject(Renderer2);\n\n private overlayRef: OverlayRef | null = null;\n private componentRef: ComponentRef<TooltipComponent> | null = null;\n private positionChangeSubscription: Subscription | null = null;\n private showTimeout?: number;\n private touchTimeout?: number;\n private tooltipCreatedByFocus = false;\n private readonly debounceCreateTooltipFunction = this.debounceUtils.debounceLeading(() =>\n this._createTooltip(true, true),\n );\n\n public ngOnInit(): void {\n this.validatePosition();\n this.updateTooltipVisibilityWhenFocusOnInput();\n }\n\n public ngOnDestroy(): void {\n this.destroy();\n }\n\n // whenever the component with the tooltip is clicked I destroy the tooltip.\n // whenever a key is pressed on the component with the tooltip I destroy the tooltip.\n @HostListener('click')\n @HostListener('keydown')\n public onClick(): void {\n if (\n this.tooltipEvent() === 'hover' &&\n !navigator.userAgent.match(/Android/i) &&\n !navigator.userAgent.match(/iPhone/i)\n ) {\n this.destroy();\n }\n }\n\n @HostListener('focus')\n public onFocus(): void {\n if (this.tooltipEvent() === 'focus') {\n this._createTooltip(true, true);\n }\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this.tooltipEvent() === 'focus') {\n this.destroy();\n }\n }\n\n @HostListener('mouseenter')\n public onMouseEnter(): void {\n if (this.tooltipEvent() === 'hover' || this.focusedInputRef()) {\n this.debounceCreateTooltipFunction();\n }\n }\n\n @HostListener('mouseleave')\n @HostListener('wheel')\n public onMouseLeave(): void {\n if ((this.tooltipEvent() === 'hover' || this.focusedInputRef()) && !this.tooltipCreatedByFocus) {\n this.destroy();\n }\n }\n\n @HostListener('touchstart')\n public onTouchStart(): void {\n if (this.tooltipEvent() === 'hover') {\n window.clearTimeout(this.touchTimeout);\n const delay = this.mobileBehavior() === 'pressing' ? this.showDelay() : 0;\n this.touchTimeout = window.setTimeout(() => {\n this._createTooltip(true, true);\n }, delay);\n }\n }\n\n @HostListener('touchend')\n public onTouchEnd(): void {\n if (this.tooltipEvent() === 'hover' && this.mobileBehavior() === 'pressing') {\n window.clearTimeout(this.touchTimeout);\n this.destroy();\n }\n }\n\n private validatePosition(): void {\n const containsPosition = ['top', 'right', 'bottom', 'left'].includes(this.tooltipPosition());\n if (!containsPosition) {\n throw new Error(`Tooltip position \"${this.tooltipPosition()}\" is unexpected`);\n }\n }\n\n /**\n * Manipula a visibilidade do tooltip quando houver uma referência de input.\n */\n private updateTooltipVisibilityWhenFocusOnInput(): void {\n const inputRef = this.focusedInputRef();\n if (!inputRef) return;\n\n this.renderer.listen(inputRef, 'focus', () => {\n this._createTooltip(false, false);\n this.tooltipCreatedByFocus = true;\n });\n this.renderer.listen(inputRef, 'blur', () => {\n this.destroy();\n this.tooltipCreatedByFocus = false;\n });\n }\n\n private _createTooltip(useShowDelay = false, autoDestroy = true): void {\n const tooltipText = this.tooltip() ?? '';\n if (!tooltipText.length || this.overlayRef !== null) return;\n\n if (this.checkTruncatedText() && !this.contentIsTruncated) return;\n\n const positionStrategy = this.buildPositionStrategy();\n const scrollStrategy = this.overlay.scrollStrategies.reposition();\n\n this.overlayRef = this.overlay.create({ positionStrategy, scrollStrategy });\n\n const portal = new ComponentPortal(TooltipComponent);\n this.componentRef = this.overlayRef.attach(portal);\n\n this.componentRef.setInput('tooltip', tooltipText);\n this.componentRef.setInput('escape', this.escape());\n this.componentRef.setInput('position', this.tooltipPosition());\n\n this.positionChangeSubscription = positionStrategy.positionChanges.subscribe((change) => {\n const mappedPosition = this.mapCdkPositionToTooltipPosition(change.connectionPair);\n this.componentRef?.setInput('position', mappedPosition);\n });\n\n const delay = useShowDelay ? this.showDelay() : 0;\n this.showTimeout = window.setTimeout(() => {\n this.componentRef?.setInput('visible', this.visible());\n }, delay);\n\n if (autoDestroy && this.displayTime()) {\n window.setTimeout(() => {\n this.destroy();\n }, this.displayTime()!);\n }\n }\n\n private buildPositionStrategy(): FlexibleConnectedPositionStrategy {\n const preferred = this.tooltipPosition();\n const allPositions: TooltipPositions[] = ['top', 'bottom', 'left', 'right'];\n const orderedPositions = [preferred, ...allPositions.filter((p) => p !== preferred)];\n\n return this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(orderedPositions.map((p) => this.getConnectedPosition(p)))\n .withFlexibleDimensions(false)\n .withPush(false);\n }\n\n private getConnectedPosition(pos: TooltipPositions): ConnectedPosition {\n const offset = 10;\n const positionMap: Record<TooltipPositions, ConnectedPosition> = {\n top: { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\n bottom: { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\n left: { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\n right: { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\n };\n return positionMap[pos];\n }\n\n private mapCdkPositionToTooltipPosition(pair: { overlayX: string; overlayY: string }): TooltipPositions {\n if (pair.overlayY === 'bottom') return 'top';\n if (pair.overlayY === 'top') return 'bottom';\n if (pair.overlayX === 'end') return 'left';\n return 'right';\n }\n\n private destroy(): void {\n window.clearTimeout(this.showTimeout);\n window.clearTimeout(this.touchTimeout);\n this.positionChangeSubscription?.unsubscribe();\n this.positionChangeSubscription = null;\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n this.componentRef = null;\n }\n }\n\n private get contentIsTruncated(): boolean {\n const element = this.elementRef.nativeElement as HTMLElement;\n return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;\n }\n}\n\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TooltipDirective } from './tooltip.directive';\r\n\r\n@NgModule({\r\n imports: [TooltipDirective],\r\n exports: [TooltipDirective],\r\n})\r\nexport class TooltipModule {}\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":"seniorsistemas-angular-components-tooltip.mjs","sources":["../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.html","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.directive.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.module.ts","../../projects/angular-components/tooltip/src/seniorsistemas-angular-components-tooltip.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport { Component, input } from '@angular/core';\n\nimport { TooltipPositions } from './models/tooltip-position';\n\n/**\n * @description Componente de apresentação do tooltip. Utilizado internamente pela diretiva `TooltipDirective`.\n * O posicionamento é gerenciado pelo CDK Overlay via `TooltipDirective`.\n */\n@Component({\n selector: 's-tooltip',\n templateUrl: './tooltip.component.html',\n styleUrls: ['./tooltip.component.scss'],\n standalone: true,\n imports: [NgClass],\n})\nexport class TooltipComponent {\n /** @description Texto ou HTML a ser exibido no tooltip. */\n public readonly tooltip = input<string>('');\n\n /** @description Posição do tooltip — usada para renderizar a seta no lado correto. */\n public readonly position = input<TooltipPositions>('top');\n\n /** @description Controla a visibilidade (opacidade) do tooltip via transição CSS. */\n public readonly visible = input<boolean>(false);\n\n /** @description Quando `true`, o conteúdo é renderizado como texto puro (escapa HTML). */\n public readonly escape = input<boolean>(false);\n}\n\n","<div\n class=\"tooltip relative max-w-[220px] break-words rounded-xsmall bg-grayscale-100 p-2 text-center font-open-sans text-sm font-normal leading-normal text-grayscale-0 transition-opacity duration-300\"\n [class.opacity-0]=\"!visible()\"\n [class.opacity-100]=\"visible()\"\n [class.tooltip--visible]=\"visible()\"\n [ngClass]=\"'tooltip--' + position()\"\n>\n @if (escape()) {\n <span class=\"tooltip__content\">\n {{ tooltip() }}\n </span>\n } @else {\n <span\n class=\"tooltip__content\"\n [innerHTML]=\"tooltip()\"\n >\n </span>\n }\n</div>\n\n","import { ConnectedPosition, FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n OnDestroy,\n OnInit,\n Renderer2,\n inject,\n input,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { DebounceUtils } from '@seniorsistemas/angular-components/common';\nimport { MobileBehavior } from './models/mobile-behavior';\nimport { TooltipEvent } from './models/tooltip-event';\nimport { TooltipPositions } from './models/tooltip-position';\nimport { TooltipComponent } from './tooltip.component';\n\n/**\n * @description Diretiva que exibe um tooltip (dica de ferramenta) flutuante ao interagir com o elemento hospedeiro.\n * Posiciona-se automaticamente considerando o espaço disponível na tela, utilizando o CDK Overlay.\n * Suporta eventos de hover, click e focus, além de comportamentos customizados para mobile.\n *\n * @example\n * ```html\n * <button sTooltip=\"Clique aqui\" tooltipPosition=\"top\">Ação</button>\n * ```\n *\n * @category Overlay\n */\n@Directive({\n selector: '[sTooltip]',\n standalone: true,\n})\nexport class TooltipDirective implements OnInit, OnDestroy {\n /**\n * @description Texto exibido no tooltip. Quando vazio ou `undefined`, o tooltip não é renderizado.\n */\n public readonly tooltip = input<string | undefined>(undefined, { alias: 'sTooltip' });\n\n /**\n * @description Posição preferencial do tooltip em relação ao elemento hospedeiro.\n * O tooltip se reposiciona automaticamente se não houver espaço suficiente.\n *\n * @default 'top'\n */\n public readonly tooltipPosition = input<TooltipPositions>('top');\n\n /**\n * @description Tempo em milissegundos antes do tooltip aparecer após o evento de ativação.\n *\n * @default 500\n */\n public readonly showDelay = input<number>(500);\n\n /**\n * @description Tempo em milissegundos que o tooltip permanece visível após aparecer.\n * Quando não informado, o tooltip permanece até o usuário sair do elemento.\n */\n public readonly displayTime = input<number | undefined>(undefined);\n\n /**\n * @description Evento do elemento hospedeiro que dispara a exibição do tooltip.\n * - `'hover'`: exibe ao passar o mouse (padrão).\n * - `'click'`: exibe ao clicar.\n * - `'focus'`: exibe ao focar no elemento.\n *\n * @default 'hover'\n */\n public readonly tooltipEvent = input<TooltipEvent>('hover');\n\n /**\n * @description Quando `true`, o conteúdo HTML do tooltip é escapado antes de ser renderizado.\n *\n * @default false\n */\n public readonly escape = input<boolean>(false);\n\n /**\n * @description Quando `false`, o tooltip nunca é exibido, mesmo que haja interação do usuário.\n * Útil para desabilitar tooltips dinamicamente.\n *\n * @default true\n */\n public readonly visible = input<boolean>(true);\n\n /**\n * @description Comportamento do tooltip em dispositivos móveis (touch).\n * - `'pressing'`: exibe ao pressionar e manter o toque (padrão).\n * - `'none'`: desabilita o tooltip em dispositivos táteis.\n *\n * @default 'pressing'\n */\n public readonly mobileBehavior = input<MobileBehavior>('pressing');\n\n /**\n * @description Referência a um input HTML para sincronizar a exibição do tooltip com o foco no campo.\n */\n public readonly focusedInputRef = input<HTMLInputElement | null>(null);\n\n /**\n * @description Quando `true`, o tooltip só é exibido se o texto do elemento estiver truncado (overflow).\n * Útil para cells de tabela ou elementos com `text-overflow: ellipsis`.\n *\n * @default false\n */\n public readonly checkTruncatedText = input<boolean>(false);\n\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlay = inject(Overlay);\n private readonly debounceUtils = inject(DebounceUtils);\n private readonly renderer = inject(Renderer2);\n\n private overlayRef: OverlayRef | null = null;\n private componentRef: ComponentRef<TooltipComponent> | null = null;\n private positionChangeSubscription: Subscription | null = null;\n private showTimeout?: number;\n private touchTimeout?: number;\n private tooltipCreatedByFocus = false;\n private readonly debounceCreateTooltipFunction = this.debounceUtils.debounceLeading(() =>\n this._createTooltip(true, true),\n );\n\n public ngOnInit(): void {\n this.validatePosition();\n this.updateTooltipVisibilityWhenFocusOnInput();\n }\n\n public ngOnDestroy(): void {\n this.destroy();\n }\n\n // whenever the component with the tooltip is clicked I destroy the tooltip.\n // whenever a key is pressed on the component with the tooltip I destroy the tooltip.\n @HostListener('click')\n @HostListener('keydown')\n public onClick(): void {\n if (\n this.tooltipEvent() === 'hover' &&\n !navigator.userAgent.match(/Android/i) &&\n !navigator.userAgent.match(/iPhone/i)\n ) {\n this.destroy();\n }\n }\n\n @HostListener('focus')\n public onFocus(): void {\n if (this.tooltipEvent() === 'focus') {\n this._createTooltip(true, true);\n }\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this.tooltipEvent() === 'focus') {\n this.destroy();\n }\n }\n\n @HostListener('mouseenter')\n public onMouseEnter(): void {\n if (this.tooltipEvent() === 'hover' || this.focusedInputRef()) {\n this.debounceCreateTooltipFunction();\n }\n }\n\n @HostListener('mouseleave')\n @HostListener('wheel')\n public onMouseLeave(): void {\n if ((this.tooltipEvent() === 'hover' || this.focusedInputRef()) && !this.tooltipCreatedByFocus) {\n this.destroy();\n }\n }\n\n @HostListener('touchstart')\n public onTouchStart(): void {\n if (this.tooltipEvent() === 'hover') {\n window.clearTimeout(this.touchTimeout);\n const delay = this.mobileBehavior() === 'pressing' ? this.showDelay() : 0;\n this.touchTimeout = window.setTimeout(() => {\n this._createTooltip(true, true);\n }, delay);\n }\n }\n\n @HostListener('touchend')\n public onTouchEnd(): void {\n if (this.tooltipEvent() === 'hover' && this.mobileBehavior() === 'pressing') {\n window.clearTimeout(this.touchTimeout);\n this.destroy();\n }\n }\n\n private validatePosition(): void {\n const containsPosition = ['top', 'right', 'bottom', 'left'].includes(this.tooltipPosition());\n if (!containsPosition) {\n throw new Error(`Tooltip position \"${this.tooltipPosition()}\" is unexpected`);\n }\n }\n\n /**\n * Manipula a visibilidade do tooltip quando houver uma referência de input.\n */\n private updateTooltipVisibilityWhenFocusOnInput(): void {\n const inputRef = this.focusedInputRef();\n if (!inputRef) return;\n\n this.renderer.listen(inputRef, 'focus', () => {\n this._createTooltip(false, false);\n this.tooltipCreatedByFocus = true;\n });\n this.renderer.listen(inputRef, 'blur', () => {\n this.destroy();\n this.tooltipCreatedByFocus = false;\n });\n }\n\n private _createTooltip(useShowDelay = false, autoDestroy = true): void {\n const tooltipValue = this.tooltip();\n const tooltipText = tooltipValue === undefined || tooltipValue === null ? '' : String(tooltipValue);\n if (!tooltipText.length || this.overlayRef !== null) return;\n\n if (this.checkTruncatedText() && !this.contentIsTruncated) return;\n\n const positionStrategy = this.buildPositionStrategy();\n const scrollStrategy = this.overlay.scrollStrategies.reposition();\n\n this.overlayRef = this.overlay.create({ positionStrategy, scrollStrategy });\n\n const portal = new ComponentPortal(TooltipComponent);\n this.componentRef = this.overlayRef.attach(portal);\n\n this.componentRef.setInput('tooltip', tooltipText);\n this.componentRef.setInput('escape', this.escape());\n this.componentRef.setInput('position', this.tooltipPosition());\n\n this.positionChangeSubscription = positionStrategy.positionChanges.subscribe((change) => {\n const mappedPosition = this.mapCdkPositionToTooltipPosition(change.connectionPair);\n this.componentRef?.setInput('position', mappedPosition);\n });\n\n const delay = useShowDelay ? this.showDelay() : 0;\n this.showTimeout = window.setTimeout(() => {\n this.componentRef?.setInput('visible', this.visible());\n }, delay);\n\n if (autoDestroy && this.displayTime()) {\n window.setTimeout(() => {\n this.destroy();\n }, this.displayTime()!);\n }\n }\n\n private buildPositionStrategy(): FlexibleConnectedPositionStrategy {\n const preferred = this.tooltipPosition();\n const allPositions: TooltipPositions[] = ['top', 'bottom', 'left', 'right'];\n const orderedPositions = [preferred, ...allPositions.filter((p) => p !== preferred)];\n\n return this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(orderedPositions.map((p) => this.getConnectedPosition(p)))\n .withFlexibleDimensions(false)\n .withPush(false);\n }\n\n private getConnectedPosition(pos: TooltipPositions): ConnectedPosition {\n const offset = 10;\n const positionMap: Record<TooltipPositions, ConnectedPosition> = {\n top: { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\n bottom: { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\n left: { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\n right: { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\n };\n return positionMap[pos];\n }\n\n private mapCdkPositionToTooltipPosition(pair: { overlayX: string; overlayY: string }): TooltipPositions {\n if (pair.overlayY === 'bottom') return 'top';\n if (pair.overlayY === 'top') return 'bottom';\n if (pair.overlayX === 'end') return 'left';\n return 'right';\n }\n\n private destroy(): void {\n window.clearTimeout(this.showTimeout);\n window.clearTimeout(this.touchTimeout);\n this.positionChangeSubscription?.unsubscribe();\n this.positionChangeSubscription = null;\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n this.componentRef = null;\n }\n }\n\n private get contentIsTruncated(): boolean {\n const element = this.elementRef.nativeElement as HTMLElement;\n return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;\n }\n}\n\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TooltipDirective } from './tooltip.directive';\r\n\r\n@NgModule({\r\n imports: [TooltipDirective],\r\n exports: [TooltipDirective],\r\n})\r\nexport class TooltipModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -53,11 +53,57 @@ const getElementLeftoverContentAvailable = (element) => {
53
53
  freeDistanceToRight,
54
54
  };
55
55
  };
56
+ let scrollLockCount = 0;
57
+ let previousBodyOverflow = null;
58
+ /**
59
+ * @description Libera um lock de scroll adquirido via `disableScroll`. Como múltiplos overlays
60
+ * (ex: Drawer, SideSheet) podem estar abertos ao mesmo tempo e todos chamam essa mesma função,
61
+ * o scroll só é de fato reativado quando o último lock pendente é liberado — e restaura o valor
62
+ * de `overflow` anterior ao primeiro `disableScroll`, em vez de sempre forçar `'auto'`.
63
+ */
56
64
  const enableScroll = () => {
57
- document.body.style.overflow = 'auto';
65
+ if (scrollLockCount === 0) {
66
+ return;
67
+ }
68
+ scrollLockCount--;
69
+ if (scrollLockCount === 0) {
70
+ document.body.style.overflow = previousBodyOverflow ?? '';
71
+ previousBodyOverflow = null;
72
+ }
58
73
  };
74
+ /**
75
+ * @description Bloqueia o scroll da página. Contabiliza quantos overlays pediram o bloqueio
76
+ * simultaneamente, para que fechar um não reative o scroll enquanto outro ainda estiver aberto.
77
+ */
59
78
  const disableScroll = () => {
60
- document.body.style.overflow = 'hidden';
79
+ if (scrollLockCount === 0) {
80
+ previousBodyOverflow = document.body.style.overflow;
81
+ document.body.style.overflow = 'hidden';
82
+ }
83
+ scrollLockCount++;
84
+ };
85
+ /**
86
+ * @description Cria um controle de lock de scroll para uma instância (ex: um componente de
87
+ * overlay). Chamar `lock`/`unlock` várias vezes seguidas é seguro — cada instância só chama
88
+ * `disableScroll`/`enableScroll` (que ela mesma adquiriu, evitando liberar o lock de outro overlay
89
+ * por engano) na primeira vez que necessário.
90
+ */
91
+ const createScrollLock = () => {
92
+ let locked = false;
93
+ return {
94
+ lock: () => {
95
+ if (!locked) {
96
+ disableScroll();
97
+ locked = true;
98
+ }
99
+ },
100
+ unlock: () => {
101
+ if (locked) {
102
+ enableScroll();
103
+ locked = false;
104
+ }
105
+ },
106
+ };
61
107
  };
62
108
  function deepClone(value, weakMap = new WeakMap()) {
63
109
  if (value !== null && typeof value === 'object') {
@@ -117,5 +163,5 @@ function deepClone(value, weakMap = new WeakMap()) {
117
163
  * Generated bundle index. Do not edit.
118
164
  */
119
165
 
120
- export { Breakpoints, deepClone, disableScroll, enableScroll, getElementLeftoverContentAvailable, getElementPositionInfo, isMousePositionOutsideOfElement, isNullOrUndefined, randomHash };
166
+ export { Breakpoints, createScrollLock, deepClone, disableScroll, enableScroll, getElementLeftoverContentAvailable, getElementPositionInfo, isMousePositionOutsideOfElement, isNullOrUndefined, randomHash };
121
167
  //# sourceMappingURL=seniorsistemas-angular-components-utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-utils.mjs","sources":["../../projects/angular-components/utils/src/lib/utils/breakpoints.ts","../../projects/angular-components/utils/src/lib/utils/utils.ts","../../projects/angular-components/utils/src/seniorsistemas-angular-components-utils.ts"],"sourcesContent":["export const Breakpoints = {\n SM_MIN: 0 as const,\n SM_MAX: 767 as const,\n MD_MIN: 768 as const,\n MD_MAX: 991 as const,\n LG_MIN: 992 as const,\n LG_MAX: 1199 as const,\n XL_MIN: 1200 as const,\n XL_MAX: Infinity,\n};\n","export type ElementPosition = {\n top: number;\n left: number;\n right: number;\n elementHeight: number;\n elementWidth: number;\n elementVerticalCenter: number;\n elementHorizontalCenter: number;\n};\n\nexport type ElementLeftoverPosition = {\n freeDistanceToBottom: number;\n freeDistanceToTop: number;\n freeDistanceToLeft: number;\n freeDistanceToRight: number;\n};\n\nexport const randomHash = (prefix = 'id') => {\n return `${prefix}-${Math.random().toString(36).substring(2, 9)}-${Date.now().toString(36)}`;\n};\nexport const isNullOrUndefined = (value: unknown) => value === null || value === undefined;\nexport const isMousePositionOutsideOfElement = (\n event: MouseEvent | PointerEvent,\n elementArea: {\n top: number;\n right: number;\n left: number;\n bottom: number;\n },\n) => {\n const eventX = event.clientX;\n const eventY = event.clientY;\n return (\n eventX < elementArea.left ||\n eventX >= elementArea.right ||\n eventY < elementArea.top ||\n eventY >= elementArea.bottom\n );\n};\n\nexport const getElementPositionInfo = (element: HTMLElement): ElementPosition => {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n\n const elementHeight = rect.height;\n const elementWidth = rect.width;\n const elementVerticalCenter = elementHeight / 2;\n const elementHorizontalCenter = elementWidth / 2;\n\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft,\n right: rect.left + scrollLeft + elementWidth,\n elementHeight,\n elementWidth,\n elementVerticalCenter,\n elementHorizontalCenter,\n };\n};\n\nexport const getElementLeftoverContentAvailable = (element: HTMLElement): ElementLeftoverPosition => {\n const windowWidth = window.innerWidth;\n const popoverElementTriggerRect = element.getBoundingClientRect();\n const freeDistanceToBottom = window.innerHeight - popoverElementTriggerRect.bottom;\n const freeDistanceToTop = popoverElementTriggerRect.top;\n const freeDistanceToLeft = popoverElementTriggerRect.left;\n const freeDistanceToRight = windowWidth - popoverElementTriggerRect.right;\n return {\n freeDistanceToBottom,\n freeDistanceToTop,\n freeDistanceToLeft,\n freeDistanceToRight,\n };\n};\n\nexport const enableScroll = (): void => {\n document.body.style.overflow = 'auto';\n};\n\nexport const disableScroll = (): void => {\n document.body.style.overflow = 'hidden';\n};\n\nexport function deepClone<T>(value: T, weakMap = new WeakMap()): T {\n if (value !== null && typeof value === 'object') {\n if (weakMap.has(value)) return weakMap.get(value);\n }\n\n if (value === null || typeof value !== 'object' || value instanceof Function) {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as any;\n }\n\n if (Array.isArray(value)) {\n const arr: any[] = [];\n weakMap.set(value, arr);\n value.forEach((item, i) => {\n arr[i] = deepClone(item, weakMap);\n });\n return arr as any;\n }\n\n if (value instanceof Map) {\n const result = new Map();\n weakMap.set(value, result);\n value.forEach((v, k) => {\n result.set(deepClone(k, weakMap), deepClone(v, weakMap));\n });\n return result as any;\n }\n\n if (value instanceof Set) {\n const result = new Set();\n weakMap.set(value, result);\n value.forEach((v) => {\n result.add(deepClone(v, weakMap));\n });\n return result as any;\n }\n\n if (ArrayBuffer.isView(value)) {\n return new (value.constructor as any)(value) as any;\n }\n if (value instanceof ArrayBuffer) {\n return value.slice(0) as any;\n }\n\n const obj = Object.create(Object.getPrototypeOf(value));\n weakMap.set(value, obj);\n\n const keys = Reflect.ownKeys(value);\n\n keys.forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key)!;\n\n if ('value' in desc) {\n desc.value = deepClone((value as any)[key], weakMap);\n }\n\n Object.defineProperty(obj, key, desc);\n });\n\n return obj;\n}\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":"seniorsistemas-angular-components-utils.mjs","sources":["../../projects/angular-components/utils/src/lib/utils/breakpoints.ts","../../projects/angular-components/utils/src/lib/utils/utils.ts","../../projects/angular-components/utils/src/seniorsistemas-angular-components-utils.ts"],"sourcesContent":["export const Breakpoints = {\n SM_MIN: 0 as const,\n SM_MAX: 767 as const,\n MD_MIN: 768 as const,\n MD_MAX: 991 as const,\n LG_MIN: 992 as const,\n LG_MAX: 1199 as const,\n XL_MIN: 1200 as const,\n XL_MAX: Infinity,\n};\n","export type ElementPosition = {\n top: number;\n left: number;\n right: number;\n elementHeight: number;\n elementWidth: number;\n elementVerticalCenter: number;\n elementHorizontalCenter: number;\n};\n\nexport type ElementLeftoverPosition = {\n freeDistanceToBottom: number;\n freeDistanceToTop: number;\n freeDistanceToLeft: number;\n freeDistanceToRight: number;\n};\n\nexport const randomHash = (prefix = 'id') => {\n return `${prefix}-${Math.random().toString(36).substring(2, 9)}-${Date.now().toString(36)}`;\n};\nexport const isNullOrUndefined = (value: unknown) => value === null || value === undefined;\nexport const isMousePositionOutsideOfElement = (\n event: MouseEvent | PointerEvent,\n elementArea: {\n top: number;\n right: number;\n left: number;\n bottom: number;\n },\n) => {\n const eventX = event.clientX;\n const eventY = event.clientY;\n return (\n eventX < elementArea.left ||\n eventX >= elementArea.right ||\n eventY < elementArea.top ||\n eventY >= elementArea.bottom\n );\n};\n\nexport const getElementPositionInfo = (element: HTMLElement): ElementPosition => {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n\n const elementHeight = rect.height;\n const elementWidth = rect.width;\n const elementVerticalCenter = elementHeight / 2;\n const elementHorizontalCenter = elementWidth / 2;\n\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft,\n right: rect.left + scrollLeft + elementWidth,\n elementHeight,\n elementWidth,\n elementVerticalCenter,\n elementHorizontalCenter,\n };\n};\n\nexport const getElementLeftoverContentAvailable = (element: HTMLElement): ElementLeftoverPosition => {\n const windowWidth = window.innerWidth;\n const popoverElementTriggerRect = element.getBoundingClientRect();\n const freeDistanceToBottom = window.innerHeight - popoverElementTriggerRect.bottom;\n const freeDistanceToTop = popoverElementTriggerRect.top;\n const freeDistanceToLeft = popoverElementTriggerRect.left;\n const freeDistanceToRight = windowWidth - popoverElementTriggerRect.right;\n return {\n freeDistanceToBottom,\n freeDistanceToTop,\n freeDistanceToLeft,\n freeDistanceToRight,\n };\n};\n\nlet scrollLockCount = 0;\nlet previousBodyOverflow: string | null = null;\n\n/**\n * @description Libera um lock de scroll adquirido via `disableScroll`. Como múltiplos overlays\n * (ex: Drawer, SideSheet) podem estar abertos ao mesmo tempo e todos chamam essa mesma função,\n * o scroll só é de fato reativado quando o último lock pendente é liberado — e restaura o valor\n * de `overflow` anterior ao primeiro `disableScroll`, em vez de sempre forçar `'auto'`.\n */\nexport const enableScroll = (): void => {\n if (scrollLockCount === 0) {\n return;\n }\n scrollLockCount--;\n if (scrollLockCount === 0) {\n document.body.style.overflow = previousBodyOverflow ?? '';\n previousBodyOverflow = null;\n }\n};\n\n/**\n * @description Bloqueia o scroll da página. Contabiliza quantos overlays pediram o bloqueio\n * simultaneamente, para que fechar um não reative o scroll enquanto outro ainda estiver aberto.\n */\nexport const disableScroll = (): void => {\n if (scrollLockCount === 0) {\n previousBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n scrollLockCount++;\n};\n\nexport type ScrollLock = {\n lock: () => void;\n unlock: () => void;\n};\n\n/**\n * @description Cria um controle de lock de scroll para uma instância (ex: um componente de\n * overlay). Chamar `lock`/`unlock` várias vezes seguidas é seguro — cada instância só chama\n * `disableScroll`/`enableScroll` (que ela mesma adquiriu, evitando liberar o lock de outro overlay\n * por engano) na primeira vez que necessário.\n */\nexport const createScrollLock = (): ScrollLock => {\n let locked = false;\n return {\n lock: () => {\n if (!locked) {\n disableScroll();\n locked = true;\n }\n },\n unlock: () => {\n if (locked) {\n enableScroll();\n locked = false;\n }\n },\n };\n};\n\nexport function deepClone<T>(value: T, weakMap = new WeakMap()): T {\n if (value !== null && typeof value === 'object') {\n if (weakMap.has(value)) return weakMap.get(value);\n }\n\n if (value === null || typeof value !== 'object' || value instanceof Function) {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as any;\n }\n\n if (Array.isArray(value)) {\n const arr: any[] = [];\n weakMap.set(value, arr);\n value.forEach((item, i) => {\n arr[i] = deepClone(item, weakMap);\n });\n return arr as any;\n }\n\n if (value instanceof Map) {\n const result = new Map();\n weakMap.set(value, result);\n value.forEach((v, k) => {\n result.set(deepClone(k, weakMap), deepClone(v, weakMap));\n });\n return result as any;\n }\n\n if (value instanceof Set) {\n const result = new Set();\n weakMap.set(value, result);\n value.forEach((v) => {\n result.add(deepClone(v, weakMap));\n });\n return result as any;\n }\n\n if (ArrayBuffer.isView(value)) {\n return new (value.constructor as any)(value) as any;\n }\n if (value instanceof ArrayBuffer) {\n return value.slice(0) as any;\n }\n\n const obj = Object.create(Object.getPrototypeOf(value));\n weakMap.set(value, obj);\n\n const keys = Reflect.ownKeys(value);\n\n keys.forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key)!;\n\n if ('value' in desc) {\n desc.value = deepClone((value as any)[key], weakMap);\n }\n\n Object.defineProperty(obj, key, desc);\n });\n\n return obj;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import * as i1 from "primeng/tooltip";
2
+ import * as i1 from "@seniorsistemas/angular-components/tooltip";
3
3
  import * as i2 from "@seniorsistemas/angular-components/thumbnail";
4
4
  import * as i3 from "@seniorsistemas/angular-components/button";
5
5
  import * as i4 from "@seniorsistemas/angular-components/loading-state";