@seniorsistemas/angular-components 19.9.4 → 19.9.5

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 (60) hide show
  1. package/autocomplete/README.md +4 -0
  2. package/autocomplete/lib/autocomplete/autocomplete.component.d.ts +7 -1
  3. package/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +3 -1
  4. package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +10 -4
  5. package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +5 -3
  6. package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +2 -2
  7. package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
  8. package/esm2022/insights/lib/insights/components/insights-card/insights-card.component.mjs +21 -3
  9. package/esm2022/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.mjs +14 -3
  10. package/esm2022/insights/lib/insights/insights.component.mjs +15 -4
  11. package/esm2022/paginator/lib/paginator/paginator.component.mjs +2 -2
  12. package/esm2022/rating-scale/lib/rating-scale/models/rating-scale-node.mjs +1 -1
  13. package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +23 -3
  14. package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +5 -3
  15. package/esm2022/select/lib/select/select.component.mjs +6 -4
  16. package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +7 -3
  17. package/esm2022/split-button/lib/split-button/split-button.component.mjs +11 -3
  18. package/esm2022/table/lib/table/table-column/table-columns.component.mjs +1 -1
  19. package/esm2022/text-area/lib/text-area/text-area.component.mjs +1 -1
  20. package/esm2022/token-list/lib/token-list/token-list.component.mjs +7 -3
  21. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +13 -5
  22. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
  23. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  24. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  25. package/fesm2022/seniorsistemas-angular-components-editor.mjs +2 -2
  26. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  27. package/fesm2022/seniorsistemas-angular-components-insights.mjs +47 -7
  28. package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
  29. package/fesm2022/seniorsistemas-angular-components-paginator.mjs +1 -1
  30. package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +22 -2
  32. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
  33. package/fesm2022/seniorsistemas-angular-components-select.mjs +9 -5
  34. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  35. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +6 -2
  36. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
  37. package/fesm2022/seniorsistemas-angular-components-split-button.mjs +10 -2
  38. package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
  39. package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  41. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +1 -1
  42. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  43. package/fesm2022/seniorsistemas-angular-components-token-list.mjs +6 -2
  44. package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
  45. package/insights/README.md +12 -0
  46. package/insights/lib/insights/components/insights-card/insights-card.component.d.ts +22 -1
  47. package/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.d.ts +9 -1
  48. package/insights/lib/insights/insights.component.d.ts +9 -1
  49. package/package.json +7 -7
  50. package/rating-scale/README.md +38 -13
  51. package/rating-scale/lib/rating-scale/models/rating-scale-node.d.ts +8 -0
  52. package/rating-scale/lib/rating-scale/rating-scale.component.d.ts +4 -1
  53. package/select/README.md +2 -0
  54. package/select/lib/select/components/select-option/select-option.component.d.ts +3 -1
  55. package/select/lib/select/select.component.d.ts +3 -1
  56. package/speech-recognition/README.md +1 -0
  57. package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +3 -1
  58. package/split-button/README.md +2 -0
  59. package/split-button/lib/split-button/split-button.component.d.ts +5 -1
  60. package/token-list/lib/token-list/token-list.component.d.ts +3 -1
@@ -27,6 +27,8 @@ class TokenListComponent {
27
27
  removableTokens = false;
28
28
  /** @description Quando `true`, remove os eventos de ponteiro (hover/clique) dos tokens. @default false */
29
29
  hidePointerEvents = false;
30
+ /** @description Classe do ícone do botão de remover token. @default 'far fa-times' */
31
+ removeIconClass = 'far fa-times';
30
32
  /** @description Emitido quando o usuário clica em um token não desabilitado. */
31
33
  tokenSelected = new EventEmitter();
32
34
  /** @description Emitido quando o usuário remove um token não desabilitado. */
@@ -42,11 +44,11 @@ class TokenListComponent {
42
44
  }
43
45
  }
44
46
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TokenListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
45
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TokenListComponent, isStandalone: true, selector: "s-token-list", inputs: { id: "id", tokens: "tokens", removableTokens: "removableTokens", hidePointerEvents: "hidePointerEvents" }, outputs: { tokenSelected: "tokenSelected", tokenRemoved: "tokenRemoved" }, ngImport: i0, template: "<div\n [id]=\"id\"\n class=\"token-list\"\n>\n @for (token of tokens; track $index) {\n <span\n [id]=\"token.id\"\n class=\"token\"\n [ngClass]=\"{\n 'no-pointer-events': hidePointerEvents,\n 'token--disabled': token.disabled,\n }\"\n >\n <a\n [id]=\"(token.id || 'token') + '-label'\"\n class=\"token-label\"\n (click)=\"onTokenSelected(token)\"\n >\n {{ token.label }}\n </a>\n @if (removableTokens && !token.notRemovable) {\n <span\n [id]=\"token.id + '-remove'\"\n class=\"far fa-times\"\n (click)=\"onTokenRemoved(token)\"\n >\n </span>\n }\n </span>\n }\n</div>\n", styles: [".no-pointer-events{pointer-events:none}.token-list{align-items:center;display:inline-flex;flex-wrap:wrap;max-width:100%;padding:0 10px;text-transform:none}.token-list .token{align-items:center;background-color:#e5eaea;border:1px solid #697882;border-radius:4px;color:#212533;display:flex;font:400 12px/150% Open Sans,sans-serif;gap:8px;margin:2px 5px 0 0;max-width:100%;padding:2px 8px;-webkit-user-select:none;user-select:none}.token-list .token-label{max-width:50ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.token-list .token:not(.token--disabled):hover,.token-list .token:not(.token--disabled):focus{background-color:#ccc}.token-list .token a{text-decoration:none;color:#212533}.token-list .token--disabled{opacity:50%}.token-list .token--disabled a{cursor:default}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TokenListComponent, isStandalone: true, selector: "s-token-list", inputs: { id: "id", tokens: "tokens", removableTokens: "removableTokens", hidePointerEvents: "hidePointerEvents", removeIconClass: "removeIconClass" }, outputs: { tokenSelected: "tokenSelected", tokenRemoved: "tokenRemoved" }, ngImport: i0, template: "<div\n [id]=\"id\"\n class=\"token-list\"\n>\n @for (token of tokens; track $index) {\n <span\n [id]=\"token.id\"\n class=\"token\"\n [ngClass]=\"{\n 'no-pointer-events': hidePointerEvents,\n 'token--disabled': token.disabled,\n }\"\n >\n <a\n [id]=\"(token.id || 'token') + '-label'\"\n class=\"token-label\"\n (click)=\"onTokenSelected(token)\"\n >\n {{ token.label }}\n </a>\n @if (removableTokens && !token.notRemovable) {\n <span\n [id]=\"token.id + '-remove'\"\n [class]=\"removeIconClass\"\n (click)=\"onTokenRemoved(token)\"\n >\n </span>\n }\n </span>\n }\n</div>\n", styles: [".no-pointer-events{pointer-events:none}.token-list{align-items:center;display:inline-flex;flex-wrap:wrap;max-width:100%;padding:0 10px;text-transform:none}.token-list .token{align-items:center;background-color:#e5eaea;border:1px solid #697882;border-radius:4px;color:#212533;display:flex;font:400 12px/150% Open Sans,sans-serif;gap:8px;margin:2px 5px 0 0;max-width:100%;padding:2px 8px;-webkit-user-select:none;user-select:none}.token-list .token-label{max-width:50ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.token-list .token:not(.token--disabled):hover,.token-list .token:not(.token--disabled):focus{background-color:#ccc}.token-list .token a{text-decoration:none;color:#212533}.token-list .token--disabled{opacity:50%}.token-list .token--disabled a{cursor:default}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
46
48
  }
47
49
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TokenListComponent, decorators: [{
48
50
  type: Component,
49
- args: [{ selector: 's-token-list', standalone: true, imports: [NgClass], template: "<div\n [id]=\"id\"\n class=\"token-list\"\n>\n @for (token of tokens; track $index) {\n <span\n [id]=\"token.id\"\n class=\"token\"\n [ngClass]=\"{\n 'no-pointer-events': hidePointerEvents,\n 'token--disabled': token.disabled,\n }\"\n >\n <a\n [id]=\"(token.id || 'token') + '-label'\"\n class=\"token-label\"\n (click)=\"onTokenSelected(token)\"\n >\n {{ token.label }}\n </a>\n @if (removableTokens && !token.notRemovable) {\n <span\n [id]=\"token.id + '-remove'\"\n class=\"far fa-times\"\n (click)=\"onTokenRemoved(token)\"\n >\n </span>\n }\n </span>\n }\n</div>\n", styles: [".no-pointer-events{pointer-events:none}.token-list{align-items:center;display:inline-flex;flex-wrap:wrap;max-width:100%;padding:0 10px;text-transform:none}.token-list .token{align-items:center;background-color:#e5eaea;border:1px solid #697882;border-radius:4px;color:#212533;display:flex;font:400 12px/150% Open Sans,sans-serif;gap:8px;margin:2px 5px 0 0;max-width:100%;padding:2px 8px;-webkit-user-select:none;user-select:none}.token-list .token-label{max-width:50ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.token-list .token:not(.token--disabled):hover,.token-list .token:not(.token--disabled):focus{background-color:#ccc}.token-list .token a{text-decoration:none;color:#212533}.token-list .token--disabled{opacity:50%}.token-list .token--disabled a{cursor:default}\n"] }]
51
+ args: [{ selector: 's-token-list', standalone: true, imports: [NgClass], template: "<div\n [id]=\"id\"\n class=\"token-list\"\n>\n @for (token of tokens; track $index) {\n <span\n [id]=\"token.id\"\n class=\"token\"\n [ngClass]=\"{\n 'no-pointer-events': hidePointerEvents,\n 'token--disabled': token.disabled,\n }\"\n >\n <a\n [id]=\"(token.id || 'token') + '-label'\"\n class=\"token-label\"\n (click)=\"onTokenSelected(token)\"\n >\n {{ token.label }}\n </a>\n @if (removableTokens && !token.notRemovable) {\n <span\n [id]=\"token.id + '-remove'\"\n [class]=\"removeIconClass\"\n (click)=\"onTokenRemoved(token)\"\n >\n </span>\n }\n </span>\n }\n</div>\n", styles: [".no-pointer-events{pointer-events:none}.token-list{align-items:center;display:inline-flex;flex-wrap:wrap;max-width:100%;padding:0 10px;text-transform:none}.token-list .token{align-items:center;background-color:#e5eaea;border:1px solid #697882;border-radius:4px;color:#212533;display:flex;font:400 12px/150% Open Sans,sans-serif;gap:8px;margin:2px 5px 0 0;max-width:100%;padding:2px 8px;-webkit-user-select:none;user-select:none}.token-list .token-label{max-width:50ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.token-list .token:not(.token--disabled):hover,.token-list .token:not(.token--disabled):focus{background-color:#ccc}.token-list .token a{text-decoration:none;color:#212533}.token-list .token--disabled{opacity:50%}.token-list .token--disabled a{cursor:default}\n"] }]
50
52
  }], propDecorators: { id: [{
51
53
  type: Input
52
54
  }], tokens: [{
@@ -56,6 +58,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
56
58
  type: Input
57
59
  }], hidePointerEvents: [{
58
60
  type: Input
61
+ }], removeIconClass: [{
62
+ type: Input
59
63
  }], tokenSelected: [{
60
64
  type: Output
61
65
  }], tokenRemoved: [{
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-token-list.mjs","sources":["../../projects/angular-components/token-list/src/lib/token-list/token-list.component.ts","../../projects/angular-components/token-list/src/lib/token-list/token-list.component.html","../../projects/angular-components/token-list/src/lib/token-list/token-list.module.ts","../../projects/angular-components/token-list/src/seniorsistemas-angular-components-token-list.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nimport { IToken } from './models/token';\r\n\r\n/**\r\n * @description Componente de lista de tokens (etiquetas) clicáveis e opcionalmente\r\n * removíveis. Emite eventos ao selecionar ou remover um token.\r\n *\r\n * @example\r\n * ```html\r\n * <s-token-list\r\n * [tokens]=\"listaDeTokens\"\r\n * [removableTokens]=\"true\"\r\n * (tokenSelected)=\"onTokenSelecionado($event)\"\r\n * (tokenRemoved)=\"onTokenRemovido($event)\" />\r\n * ```\r\n *\r\n * @category Summary\r\n */\r\n@Component({\r\n selector: 's-token-list',\r\n templateUrl: './token-list.component.html',\r\n styleUrls: ['./token-list.component.scss'],\r\n standalone: true,\r\n imports: [NgClass],\r\n})\r\nexport class TokenListComponent {\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-token-list-${TokenListComponent.nextId++}`;\r\n\r\n /** @description Lista de tokens exibidos. Campo obrigatório. */\r\n @Input({ required: true })\r\n public tokens!: IToken[];\r\n\r\n /** @description Exibe o botão de remoção em cada token. @default false */\r\n @Input()\r\n public removableTokens = false;\r\n\r\n /** @description Quando `true`, remove os eventos de ponteiro (hover/clique) dos tokens. @default false */\r\n @Input()\r\n public hidePointerEvents = false;\r\n\r\n /** @description Emitido quando o usuário clica em um token não desabilitado. */\r\n @Output()\r\n public tokenSelected: EventEmitter<IToken> = new EventEmitter();\r\n\r\n /** @description Emitido quando o usuário remove um token não desabilitado. */\r\n @Output()\r\n public tokenRemoved: EventEmitter<IToken> = new EventEmitter();\r\n\r\n public onTokenSelected(token: IToken): void {\r\n if (!token.disabled) {\r\n this.tokenSelected.next(token);\r\n }\r\n }\r\n\r\n public onTokenRemoved(token: IToken): void {\r\n if (!token.disabled) {\r\n this.tokenRemoved.next(token);\r\n }\r\n }\r\n}\r\n","<div\n [id]=\"id\"\n class=\"token-list\"\n>\n @for (token of tokens; track $index) {\n <span\n [id]=\"token.id\"\n class=\"token\"\n [ngClass]=\"{\n 'no-pointer-events': hidePointerEvents,\n 'token--disabled': token.disabled,\n }\"\n >\n <a\n [id]=\"(token.id || 'token') + '-label'\"\n class=\"token-label\"\n (click)=\"onTokenSelected(token)\"\n >\n {{ token.label }}\n </a>\n @if (removableTokens && !token.notRemovable) {\n <span\n [id]=\"token.id + '-remove'\"\n class=\"far fa-times\"\n (click)=\"onTokenRemoved(token)\"\n >\n </span>\n }\n </span>\n }\n</div>\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TokenListComponent } from './token-list.component';\r\n\r\n@NgModule({\r\n imports: [TokenListComponent],\r\n exports: [TokenListComponent],\r\n})\r\nexport class TokenListModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAKA;;;;;;;;;;;;;;AAcG;MAQU,kBAAkB,CAAA;AACpB,IAAA,OAAO,MAAM,GAAG,CAAC,CAAC;;AAIlB,IAAA,EAAE,GAAG,CAAgB,aAAA,EAAA,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;;AAInD,IAAA,MAAM,CAAY;;IAIlB,eAAe,GAAG,KAAK,CAAC;;IAIxB,iBAAiB,GAAG,KAAK,CAAC;;AAI1B,IAAA,aAAa,GAAyB,IAAI,YAAY,EAAE,CAAC;;AAIzD,IAAA,YAAY,GAAyB,IAAI,YAAY,EAAE,CAAC;AAExD,IAAA,eAAe,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAClC;KACJ;AAEM,IAAA,cAAc,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACjC;KACJ;wGArCQ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3B/B,+3BA+BA,EAAA,MAAA,EAAA,CAAA,qxBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNc,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAER,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAGZ,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,+3BAAA,EAAA,MAAA,EAAA,CAAA,qxBAAA,CAAA,EAAA,CAAA;8BAOX,EAAE,EAAA,CAAA;sBADR,KAAK;gBAKC,MAAM,EAAA,CAAA;sBADZ,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;gBAKlB,eAAe,EAAA,CAAA;sBADrB,KAAK;gBAKC,iBAAiB,EAAA,CAAA;sBADvB,KAAK;gBAKC,aAAa,EAAA,CAAA;sBADnB,MAAM;gBAKA,YAAY,EAAA,CAAA;sBADlB,MAAM;;;ME3CE,eAAe,CAAA;wGAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;yGAAf,eAAe,EAAA,OAAA,EAAA,CAHd,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAClB,kBAAkB,CAAA,EAAA,CAAA,CAAA;yGAEnB,eAAe,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,OAAO,EAAE,CAAC,kBAAkB,CAAC;oBAC7B,OAAO,EAAE,CAAC,kBAAkB,CAAC;AAChC,iBAAA,CAAA;;;ACPD;;AAEG;;;;"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-token-list.mjs","sources":["../../projects/angular-components/token-list/src/lib/token-list/token-list.component.ts","../../projects/angular-components/token-list/src/lib/token-list/token-list.component.html","../../projects/angular-components/token-list/src/lib/token-list/token-list.module.ts","../../projects/angular-components/token-list/src/seniorsistemas-angular-components-token-list.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nimport { IToken } from './models/token';\r\n\r\n/**\r\n * @description Componente de lista de tokens (etiquetas) clicáveis e opcionalmente\r\n * removíveis. Emite eventos ao selecionar ou remover um token.\r\n *\r\n * @example\r\n * ```html\r\n * <s-token-list\r\n * [tokens]=\"listaDeTokens\"\r\n * [removableTokens]=\"true\"\r\n * (tokenSelected)=\"onTokenSelecionado($event)\"\r\n * (tokenRemoved)=\"onTokenRemovido($event)\" />\r\n * ```\r\n *\r\n * @category Summary\r\n */\r\n@Component({\r\n selector: 's-token-list',\r\n templateUrl: './token-list.component.html',\r\n styleUrls: ['./token-list.component.scss'],\r\n standalone: true,\r\n imports: [NgClass],\r\n})\r\nexport class TokenListComponent {\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-token-list-${TokenListComponent.nextId++}`;\r\n\r\n /** @description Lista de tokens exibidos. Campo obrigatório. */\r\n @Input({ required: true })\r\n public tokens!: IToken[];\r\n\r\n /** @description Exibe o botão de remoção em cada token. @default false */\r\n @Input()\r\n public removableTokens = false;\r\n\r\n /** @description Quando `true`, remove os eventos de ponteiro (hover/clique) dos tokens. @default false */\r\n @Input()\r\n public hidePointerEvents = false;\r\n\r\n /** @description Classe do ícone do botão de remover token. @default 'far fa-times' */\r\n @Input()\r\n public removeIconClass = 'far fa-times';\r\n\r\n /** @description Emitido quando o usuário clica em um token não desabilitado. */\r\n @Output()\r\n public tokenSelected: EventEmitter<IToken> = new EventEmitter();\r\n\r\n /** @description Emitido quando o usuário remove um token não desabilitado. */\r\n @Output()\r\n public tokenRemoved: EventEmitter<IToken> = new EventEmitter();\r\n\r\n public onTokenSelected(token: IToken): void {\r\n if (!token.disabled) {\r\n this.tokenSelected.next(token);\r\n }\r\n }\r\n\r\n public onTokenRemoved(token: IToken): void {\r\n if (!token.disabled) {\r\n this.tokenRemoved.next(token);\r\n }\r\n }\r\n}\r\n","<div\n [id]=\"id\"\n class=\"token-list\"\n>\n @for (token of tokens; track $index) {\n <span\n [id]=\"token.id\"\n class=\"token\"\n [ngClass]=\"{\n 'no-pointer-events': hidePointerEvents,\n 'token--disabled': token.disabled,\n }\"\n >\n <a\n [id]=\"(token.id || 'token') + '-label'\"\n class=\"token-label\"\n (click)=\"onTokenSelected(token)\"\n >\n {{ token.label }}\n </a>\n @if (removableTokens && !token.notRemovable) {\n <span\n [id]=\"token.id + '-remove'\"\n [class]=\"removeIconClass\"\n (click)=\"onTokenRemoved(token)\"\n >\n </span>\n }\n </span>\n }\n</div>\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TokenListComponent } from './token-list.component';\r\n\r\n@NgModule({\r\n imports: [TokenListComponent],\r\n exports: [TokenListComponent],\r\n})\r\nexport class TokenListModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAKA;;;;;;;;;;;;;;AAcG;MAQU,kBAAkB,CAAA;AACpB,IAAA,OAAO,MAAM,GAAG,CAAC,CAAC;;AAIlB,IAAA,EAAE,GAAG,CAAgB,aAAA,EAAA,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;;AAInD,IAAA,MAAM,CAAY;;IAIlB,eAAe,GAAG,KAAK,CAAC;;IAIxB,iBAAiB,GAAG,KAAK,CAAC;;IAI1B,eAAe,GAAG,cAAc,CAAC;;AAIjC,IAAA,aAAa,GAAyB,IAAI,YAAY,EAAE,CAAC;;AAIzD,IAAA,YAAY,GAAyB,IAAI,YAAY,EAAE,CAAC;AAExD,IAAA,eAAe,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAClC;KACJ;AAEM,IAAA,cAAc,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACjC;KACJ;wGAzCQ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3B/B,o4BA+BA,EAAA,MAAA,EAAA,CAAA,qxBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNc,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAER,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAGZ,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,o4BAAA,EAAA,MAAA,EAAA,CAAA,qxBAAA,CAAA,EAAA,CAAA;8BAOX,EAAE,EAAA,CAAA;sBADR,KAAK;gBAKC,MAAM,EAAA,CAAA;sBADZ,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;gBAKlB,eAAe,EAAA,CAAA;sBADrB,KAAK;gBAKC,iBAAiB,EAAA,CAAA;sBADvB,KAAK;gBAKC,eAAe,EAAA,CAAA;sBADrB,KAAK;gBAKC,aAAa,EAAA,CAAA;sBADnB,MAAM;gBAKA,YAAY,EAAA,CAAA;sBADlB,MAAM;;;ME/CE,eAAe,CAAA;wGAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;yGAAf,eAAe,EAAA,OAAA,EAAA,CAHd,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAClB,kBAAkB,CAAA,EAAA,CAAA,CAAA;yGAEnB,eAAe,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,OAAO,EAAE,CAAC,kBAAkB,CAAC;oBAC7B,OAAO,EAAE,CAAC,kBAAkB,CAAC;AAChC,iBAAA,CAAA;;;ACPD;;AAEG;;;;"}
@@ -52,6 +52,8 @@ export class MeuModule {}
52
52
  | `introText` | `string` | `undefined` | Não | Texto de introdução exibido no topo do painel (quando sem template customizado). |
53
53
  | `emptyText` | `string` | `undefined` | Não | Texto exibido quando não há insights disponíveis. |
54
54
  | `noPermissionText` | `string` | `undefined` | Não | Texto exibido quando o usuário não tem permissão. |
55
+ | `icons` | `InsightsCardIcons` | `undefined` | Não | Ícones customizáveis de cada card de insight exibido no sidebar. Chaves não informadas mantêm o ícone padrão. |
56
+ | `closeIconClass` | `string` | `'far fa-chevron-double-right'` | Não | Ícone do botão de fechar o sidebar. |
55
57
 
56
58
  ### Outputs
57
59
 
@@ -76,6 +78,16 @@ interface InsightsItem {
76
78
  }
77
79
  ```
78
80
 
81
+ ```typescript
82
+ interface InsightsCardIcons {
83
+ lightbulb?: string; // Ícone do badge "Insight" no cabeçalho. Padrão: 'fal fa-lightbulb'
84
+ copy?: string; // Ícone do botão de copiar conteúdo. Padrão: 'fal fa-copy'
85
+ redo?: string; // Ícone do botão de recarregar conteúdo. Padrão: 'fal fa-redo'
86
+ thumbsUp?: string; // Ícone do botão de like. Padrão: 'fal fa-thumbs-up' (não selecionado) / 'fas fa-thumbs-up' (selecionado)
87
+ thumbsDown?: string; // Ícone do botão de dislike. Padrão: 'fal fa-thumbs-down' (não selecionado) / 'fas fa-thumbs-down' (selecionado)
88
+ }
89
+ ```
90
+
79
91
  ## Exemplos
80
92
 
81
93
  ### Insights com múltiplos itens
@@ -1,16 +1,37 @@
1
1
  import { InsightsItem } from '../../models/insights-item';
2
2
  import * as i0 from "@angular/core";
3
+ /**
4
+ * @description Ícones customizáveis do `s-insights-card`. Chaves não informadas mantêm o ícone padrão.
5
+ */
6
+ export interface InsightsCardIcons {
7
+ /** Ícone do badge "Insight" no cabeçalho. Padrão: `fal fa-lightbulb`. */
8
+ lightbulb?: string;
9
+ /** Ícone do botão de copiar conteúdo. Padrão: `fal fa-copy`. */
10
+ copy?: string;
11
+ /** Ícone do botão de recarregar conteúdo. Padrão: `fal fa-redo`. */
12
+ redo?: string;
13
+ /** Ícone do botão de like. Padrão: `fal fa-thumbs-up` (não selecionado) / `fas fa-thumbs-up` (selecionado). */
14
+ thumbsUp?: string;
15
+ /** Ícone do botão de dislike. Padrão: `fal fa-thumbs-down` (não selecionado) / `fas fa-thumbs-down` (selecionado). */
16
+ thumbsDown?: string;
17
+ }
3
18
  export declare class InsightsCardComponent {
4
19
  private readonly clipboard;
5
20
  private readonly toastService;
6
21
  private readonly translateService;
7
22
  private readonly _destroyRef;
8
23
  insight: InsightsItem;
24
+ icons?: InsightsCardIcons;
9
25
  open: boolean;
10
26
  isLoading: boolean;
11
27
  content?: string;
12
28
  likeSelected: boolean;
13
29
  dislikeSelected: boolean;
30
+ get lightbulbIconClass(): string;
31
+ get copyIconClass(): string;
32
+ get redoIconClass(): string;
33
+ get thumbsUpIconClass(): string;
34
+ get thumbsDownIconClass(): string;
14
35
  toggle(): void;
15
36
  onLikeSelected(): void;
16
37
  onDislikeSelected(): void;
@@ -18,5 +39,5 @@ export declare class InsightsCardComponent {
18
39
  reloadContent(): void;
19
40
  private _requestInsight;
20
41
  static ɵfac: i0.ɵɵFactoryDeclaration<InsightsCardComponent, never>;
21
- static ɵcmp: i0.ɵɵComponentDeclaration<InsightsCardComponent, "s-insights-card", never, { "insight": { "alias": "insight"; "required": true; }; }, {}, never, never, true, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<InsightsCardComponent, "s-insights-card", never, { "insight": { "alias": "insight"; "required": true; }; "icons": { "alias": "icons"; "required": false; }; }, {}, never, never, true, never>;
22
43
  }
@@ -1,5 +1,6 @@
1
1
  import { TemplateRef } from '@angular/core';
2
2
  import { InsightsItem } from '../../models/index';
3
+ import { InsightsCardIcons } from '../insights-card/insights-card.component';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class InsightsSidebarComponent {
5
6
  insights: InsightsItem[];
@@ -10,6 +11,13 @@ export declare class InsightsSidebarComponent {
10
11
  emptyTemplate: TemplateRef<any> | null;
11
12
  noPermissionText?: string;
12
13
  noPermissionTemplate: TemplateRef<any> | null;
14
+ /**
15
+ * @description Ícone do botão de fechar o sidebar.
16
+ * @default 'far fa-chevron-double-right'
17
+ */
18
+ closeIconClass: string;
19
+ /** @description Ícones customizáveis de cada `s-insights-card` renderizado no sidebar. */
20
+ icons?: InsightsCardIcons;
13
21
  closedSidebar: import("@angular/core").OutputEmitterRef<void>;
14
22
  openedSidebar: import("@angular/core").OutputEmitterRef<void>;
15
23
  opened: boolean;
@@ -17,5 +25,5 @@ export declare class InsightsSidebarComponent {
17
25
  open(): void;
18
26
  close(): void;
19
27
  static ɵfac: i0.ɵɵFactoryDeclaration<InsightsSidebarComponent, never>;
20
- static ɵcmp: i0.ɵɵComponentDeclaration<InsightsSidebarComponent, "s-insights-sidebar", never, { "insights": { "alias": "insights"; "required": false; }; "hasPermission": { "alias": "hasPermission"; "required": false; }; "introText": { "alias": "introText"; "required": false; }; "introTemplate": { "alias": "introTemplate"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; "emptyTemplate": { "alias": "emptyTemplate"; "required": false; }; "noPermissionText": { "alias": "noPermissionText"; "required": false; }; "noPermissionTemplate": { "alias": "noPermissionTemplate"; "required": false; }; }, { "closedSidebar": "closedSidebar"; "openedSidebar": "openedSidebar"; }, never, never, true, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<InsightsSidebarComponent, "s-insights-sidebar", never, { "insights": { "alias": "insights"; "required": false; }; "hasPermission": { "alias": "hasPermission"; "required": false; }; "introText": { "alias": "introText"; "required": false; }; "introTemplate": { "alias": "introTemplate"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; "emptyTemplate": { "alias": "emptyTemplate"; "required": false; }; "noPermissionText": { "alias": "noPermissionText"; "required": false; }; "noPermissionTemplate": { "alias": "noPermissionTemplate"; "required": false; }; "closeIconClass": { "alias": "closeIconClass"; "required": false; }; "icons": { "alias": "icons"; "required": false; }; }, { "closedSidebar": "closedSidebar"; "openedSidebar": "openedSidebar"; }, never, never, true, never>;
21
29
  }
@@ -1,6 +1,7 @@
1
1
  import { AfterContentInit, QueryList, TemplateRef } from '@angular/core';
2
2
  import { TemplateDirective } from '@seniorsistemas/angular-components/template';
3
3
  import { InsightsSidebarComponent } from './components/insights-sidebar/insights-sidebar.component';
4
+ import { InsightsCardIcons } from './components/insights-card/insights-card.component';
4
5
  import { InsightsItem } from './models/insights-item';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@seniorsistemas/angular-components/common/deprecated-selector";
@@ -30,6 +31,13 @@ export declare class InsightsComponent implements AfterContentInit {
30
31
  emptyText?: string;
31
32
  /** @description Texto exibido quando o usuário não tem permissão. */
32
33
  noPermissionText?: string;
34
+ /**
35
+ * @description Ícone do botão de fechar o sidebar.
36
+ * @default 'far fa-chevron-double-right'
37
+ */
38
+ closeIconClass: string;
39
+ /** @description Ícones customizáveis de cada card de insight exibido no sidebar. */
40
+ icons?: InsightsCardIcons;
33
41
  sidebar: InsightsSidebarComponent | null;
34
42
  templates: QueryList<TemplateDirective> | null;
35
43
  /** @description Emitido quando o painel de insights é aberto. */
@@ -48,5 +56,5 @@ export declare class InsightsComponent implements AfterContentInit {
48
56
  private _getCustomTemplate;
49
57
  private _getTemplates;
50
58
  static ɵfac: i0.ɵɵFactoryDeclaration<InsightsComponent, never>;
51
- static ɵcmp: i0.ɵɵComponentDeclaration<InsightsComponent, "s-insights, s-ia-insight", never, { "insights": { "alias": "insights"; "required": false; }; "hasPermission": { "alias": "hasPermission"; "required": false; }; "introText": { "alias": "introText"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; "noPermissionText": { "alias": "noPermissionText"; "required": false; }; }, { "openInsights": "openInsights"; "closedInsights": "closedInsights"; }, ["templates"], never, true, [{ directive: typeof i1.DeprecatedSelectorDirective; inputs: {}; outputs: {}; }]>;
59
+ static ɵcmp: i0.ɵɵComponentDeclaration<InsightsComponent, "s-insights, s-ia-insight", never, { "insights": { "alias": "insights"; "required": false; }; "hasPermission": { "alias": "hasPermission"; "required": false; }; "introText": { "alias": "introText"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; "noPermissionText": { "alias": "noPermissionText"; "required": false; }; "closeIconClass": { "alias": "closeIconClass"; "required": false; }; "icons": { "alias": "icons"; "required": false; }; }, { "openInsights": "openInsights"; "closedInsights": "closedInsights"; }, ["templates"], never, true, [{ directive: typeof i1.DeprecatedSelectorDirective; inputs: {}; outputs: {}; }]>;
52
60
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seniorsistemas/angular-components",
3
- "version": "19.9.4",
3
+ "version": "19.9.5",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^18.2.14",
6
6
  "@angular/common": "^18.2.0",
@@ -95,18 +95,18 @@
95
95
  "esm": "./esm2022/accordion/seniorsistemas-angular-components-accordion.mjs",
96
96
  "default": "./fesm2022/seniorsistemas-angular-components-accordion.mjs"
97
97
  },
98
- "./alert": {
99
- "types": "./alert/index.d.ts",
100
- "esm2022": "./esm2022/alert/seniorsistemas-angular-components-alert.mjs",
101
- "esm": "./esm2022/alert/seniorsistemas-angular-components-alert.mjs",
102
- "default": "./fesm2022/seniorsistemas-angular-components-alert.mjs"
103
- },
104
98
  "./autocomplete": {
105
99
  "types": "./autocomplete/index.d.ts",
106
100
  "esm2022": "./esm2022/autocomplete/seniorsistemas-angular-components-autocomplete.mjs",
107
101
  "esm": "./esm2022/autocomplete/seniorsistemas-angular-components-autocomplete.mjs",
108
102
  "default": "./fesm2022/seniorsistemas-angular-components-autocomplete.mjs"
109
103
  },
104
+ "./alert": {
105
+ "types": "./alert/index.d.ts",
106
+ "esm2022": "./esm2022/alert/seniorsistemas-angular-components-alert.mjs",
107
+ "esm": "./esm2022/alert/seniorsistemas-angular-components-alert.mjs",
108
+ "default": "./fesm2022/seniorsistemas-angular-components-alert.mjs"
109
+ },
110
110
  "./badge": {
111
111
  "types": "./badge/index.d.ts",
112
112
  "esm2022": "./esm2022/badge/seniorsistemas-angular-components-badge.mjs",
@@ -52,25 +52,30 @@ export class MeuModulo {}
52
52
 
53
53
  ```typescript
54
54
  interface RatingScaleNode {
55
- id: string; // Identificador único do nó (obrigatório)
56
- title?: string; // Texto exibido abaixo do ícone
57
- icon?: string; // Classe do ícone Font Awesome (ex: 'fa-smile')
55
+ id: string; // Identificador único do nó (obrigatório)
56
+ title?: string; // Texto exibido abaixo do ícone
57
+ /** @deprecated Use `selectedIcon` e `unselectedIcon`. */
58
+ icon?: string; // Classe do ícone Font Awesome sem o glifo (ex: 'fa-smile') — sempre exibido com o glifo fixo `fas`
59
+ selectedIcon?: string; // Classe completa (glifo + ícone, ex: 'fas fa-smile') exibida quando o nó está selecionado
60
+ unselectedIcon?: string; // Classe completa (glifo + ícone, ex: 'far fa-smile') exibida quando o nó não está selecionado
58
61
  }
59
62
  ```
60
63
 
61
64
  > O `FormControl` deve ser do tipo `RatingScaleNode`. O componente emite o objeto `RatingScaleNode` completo quando um nó é selecionado.
62
65
 
66
+ > **`selectedIcon`/`unselectedIcon` devem ser informados juntos.** Se apenas um dos dois for informado, o componente emite um aviso no console e não exibe nenhum ícone para aquele nó. Se os dois forem informados, eles têm prioridade sobre `icon` (que é ignorado nesse caso).
67
+
63
68
  ## Exemplos
64
69
 
65
70
  ### Escala de humor com ícones
66
71
 
67
72
  ```typescript
68
73
  const nosHumor: RatingScaleNode[] = [
69
- { id: 'very-happy', title: 'Muito feliz', icon: 'fa-laugh-wink' },
70
- { id: 'happy', title: 'Feliz', icon: 'fa-smile' },
71
- { id: 'normal', title: 'Normal', icon: 'fa-meh' },
72
- { id: 'sad', title: 'Triste', icon: 'fa-sad-tear' },
73
- { id: 'very-sad', title: 'Muito triste', icon: 'fa-sad-cry' },
74
+ { id: 'very-happy', title: 'Muito feliz', selectedIcon: 'fas fa-laugh-wink', unselectedIcon: 'far fa-laugh-wink' },
75
+ { id: 'happy', title: 'Feliz', selectedIcon: 'fas fa-smile', unselectedIcon: 'far fa-smile' },
76
+ { id: 'normal', title: 'Normal', selectedIcon: 'fas fa-meh', unselectedIcon: 'far fa-meh' },
77
+ { id: 'sad', title: 'Triste', selectedIcon: 'fas fa-sad-tear', unselectedIcon: 'far fa-sad-tear' },
78
+ { id: 'very-sad', title: 'Muito triste', selectedIcon: 'fas fa-sad-cry', unselectedIcon: 'far fa-sad-cry' },
74
79
  ];
75
80
  ```
76
81
 
@@ -128,11 +133,11 @@ this.form = new FormGroup({
128
133
  ```html
129
134
  <s-rating-scale
130
135
  [nodes]="[
131
- { id: 'very-happy', icon: 'fa-laugh-wink' },
132
- { id: 'happy', icon: 'fa-smile' },
133
- { id: 'normal', icon: 'fa-meh' },
134
- { id: 'sad', icon: 'fa-sad-tear' },
135
- { id: 'very-sad', icon: 'fa-sad-cry' }
136
+ { id: 'very-happy', selectedIcon: 'fas fa-laugh-wink', unselectedIcon: 'far fa-laugh-wink' },
137
+ { id: 'happy', selectedIcon: 'fas fa-smile', unselectedIcon: 'far fa-smile' },
138
+ { id: 'normal', selectedIcon: 'fas fa-meh', unselectedIcon: 'far fa-meh' },
139
+ { id: 'sad', selectedIcon: 'fas fa-sad-tear', unselectedIcon: 'far fa-sad-tear' },
140
+ { id: 'very-sad', selectedIcon: 'fas fa-sad-cry', unselectedIcon: 'far fa-sad-cry' }
136
141
  ]"
137
142
  startLabel="Triste"
138
143
  endLabel="Feliz"
@@ -148,6 +153,26 @@ this.form = new FormGroup({
148
153
  - `startLabel` e `endLabel` contextualizam os extremos da escala para todos os usuários
149
154
  - Em modo `disabled`, nenhum nó aceita interação e o estilo visual indica o estado inativo
150
155
 
156
+ ## Migração
157
+
158
+ ### `icon` para `selectedIcon`/`unselectedIcon`
159
+
160
+ O campo `icon` de `RatingScaleNode` está depreciado. Ele sempre exibia o ícone com o glifo `fas` fixo, independente do nó estar selecionado ou não. Os novos campos `selectedIcon`/`unselectedIcon` recebem a classe completa (glifo + ícone) pra cada estado, permitindo escolher livremente qualquer combinação — inclusive estilos diferentes (`fas`/`far`/etc.) por nó:
161
+
162
+ ```typescript
163
+ // Antes
164
+ const nos: RatingScaleNode[] = [
165
+ { id: 'happy', title: 'Feliz', icon: 'fa-smile' },
166
+ ];
167
+
168
+ // Depois
169
+ const nos: RatingScaleNode[] = [
170
+ { id: 'happy', title: 'Feliz', selectedIcon: 'fas fa-smile', unselectedIcon: 'far fa-smile' },
171
+ ];
172
+ ```
173
+
174
+ `selectedIcon` e `unselectedIcon` devem ser informados sempre em conjunto — informar só um dos dois gera um aviso no console e nenhum ícone é exibido para o nó.
175
+
151
176
  ## Componentes relacionados
152
177
 
153
178
  - [`StarRating`](../star-rating/README.md) — avaliação por estrelas com escala numérica fixa
@@ -1,5 +1,13 @@
1
1
  export interface RatingScaleNode {
2
2
  id: string;
3
3
  title?: string;
4
+ /**
5
+ * @deprecated Use `selectedIcon` e `unselectedIcon` para controlar o glifo (`fas`/`far`/etc.)
6
+ * junto com o ícone. Será removido na próxima versão major.
7
+ */
4
8
  icon?: string;
9
+ /** @description Classe completa (glifo + ícone, ex: `'fas fa-smile'`) exibida quando o nó está selecionado. Deve ser informado junto com `unselectedIcon`. */
10
+ selectedIcon?: string;
11
+ /** @description Classe completa (glifo + ícone, ex: `'far fa-smile'`) exibida quando o nó não está selecionado. Deve ser informado junto com `selectedIcon`. */
12
+ unselectedIcon?: string;
5
13
  }
@@ -1,3 +1,4 @@
1
+ import { OnChanges, SimpleChanges } from '@angular/core';
1
2
  import { ControlValueAccessor } from '@angular/forms';
2
3
  import { RatingScaleNode } from './models/rating-scale-node';
3
4
  import * as i0 from "@angular/core";
@@ -18,7 +19,7 @@ import * as i0 from "@angular/core";
18
19
  *
19
20
  * @category Feedback
20
21
  */
21
- export declare class RatingScaleComponent implements ControlValueAccessor {
22
+ export declare class RatingScaleComponent implements ControlValueAccessor, OnChanges {
22
23
  /**
23
24
  * @description Lista de nós que compõem a escala de avaliação. Campo obrigatório.
24
25
  * Cada `RatingScaleNode` define o valor, rótulo e cor do item na escala.
@@ -37,6 +38,8 @@ export declare class RatingScaleComponent implements ControlValueAccessor {
37
38
  value?: RatingScaleNode;
38
39
  private _onChange?;
39
40
  private _onTouched?;
41
+ ngOnChanges(changes: SimpleChanges): void;
42
+ getNodeIconClass(node: RatingScaleNode): string | undefined;
40
43
  writeValue(value: RatingScaleNode): void;
41
44
  registerOnChange(onChange: (value: RatingScaleNode) => void): void;
42
45
  registerOnTouched(onTouched: (value: RatingScaleNode) => void): void;
package/select/README.md CHANGED
@@ -62,6 +62,8 @@ export class MeuComponent {}
62
62
  | `ariaLabel` | `string` | `''` | Não | Label de acessibilidade do componente |
63
63
  | `ariaLabelledBy` | `string` | `''` | Não | ID do elemento externo que descreve o componente |
64
64
 
65
+ > **Nota:** o ícone exibido por `checkmark` usa por padrão a classe `far fa-check` (Font Awesome Free), definida internamente pelo `SelectOptionComponent` (sub-componente interno que renderiza cada opção do dropdown) através do input `checkIconClass`. Esse input não é público — não é exposto nem repassado pelo `SelectComponent`.
66
+
65
67
  ### Tipos
66
68
 
67
69
  ```typescript
@@ -7,8 +7,10 @@ export declare class SelectOptionComponent {
7
7
  isGrouper: import("@angular/core").InputSignal<boolean>;
8
8
  isFocused: import("@angular/core").InputSignal<boolean>;
9
9
  isSelected: import("@angular/core").ModelSignal<boolean>;
10
+ /** @description Classe do ícone de checkmark exibido quando a opção está selecionada. @default 'far fa-check' */
11
+ checkIconClass: import("@angular/core").InputSignal<string>;
10
12
  selected: import("@angular/core").OutputEmitterRef<void>;
11
13
  onClick(): void;
12
14
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectOptionComponent, never>;
13
- static ɵcmp: i0.ɵɵComponentDeclaration<SelectOptionComponent, "s-select-option", never, { "id": { "alias": "id"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": true; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": true; "isSignal": true; }; "isGrouper": { "alias": "isGrouper"; "required": true; "isSignal": true; }; "isFocused": { "alias": "isFocused"; "required": true; "isSignal": true; }; "isSelected": { "alias": "isSelected"; "required": true; "isSignal": true; }; }, { "isSelected": "isSelectedChange"; "selected": "selected"; }, never, never, true, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<SelectOptionComponent, "s-select-option", never, { "id": { "alias": "id"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": true; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": true; "isSignal": true; }; "isGrouper": { "alias": "isGrouper"; "required": true; "isSignal": true; }; "isFocused": { "alias": "isFocused"; "required": true; "isSignal": true; }; "isSelected": { "alias": "isSelected"; "required": true; "isSignal": true; }; "checkIconClass": { "alias": "checkIconClass"; "required": false; "isSignal": true; }; }, { "isSelected": "isSelectedChange"; "selected": "selected"; }, never, never, true, never>;
14
16
  }
@@ -43,6 +43,8 @@ export declare class SelectComponent<T> implements ControlValueAccessor, OnInit,
43
43
  filter: import("@angular/core").InputSignal<boolean>;
44
44
  /** @description Exibe um ícone de checkmark ao lado da opção selecionada. @default false */
45
45
  checkmark: import("@angular/core").InputSignal<boolean>;
46
+ /** @description Classe do ícone de checkmark exibido quando `checkmark` está ativo. @default 'far fa-check' */
47
+ checkIconClass: import("@angular/core").InputSignal<string>;
46
48
  /** @description Chave(s) do objeto usada(s) para filtragem textual. Quando não informado, usa `optionLabel`. */
47
49
  filterBy: import("@angular/core").InputSignal<keyof T | (keyof T)[] | undefined>;
48
50
  /** @description Habilita agrupamento de opções. As opções devem conter itens filhos conforme a estrutura de grupo suportada. @default false */
@@ -369,6 +371,6 @@ export declare class SelectComponent<T> implements ControlValueAccessor, OnInit,
369
371
  */
370
372
  private _focusSelectedOption;
371
373
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectComponent<any>, never>;
372
- static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent<any>, "s-select", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": false; "isSignal": true; }; "filterBy": { "alias": "filterBy"; "required": false; "isSignal": true; }; "group": { "alias": "group"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showOptions": { "alias": "showOptions"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "showOptions": "showOptionsChange"; }, never, never, true, never>;
374
+ static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent<any>, "s-select", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": false; "isSignal": true; }; "checkIconClass": { "alias": "checkIconClass"; "required": false; "isSignal": true; }; "filterBy": { "alias": "filterBy"; "required": false; "isSignal": true; }; "group": { "alias": "group"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showOptions": { "alias": "showOptions"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "showOptions": "showOptionsChange"; }, never, never, true, never>;
373
375
  }
374
376
  export {};
@@ -47,6 +47,7 @@ export class MeuModule {}
47
47
  | `textAreaElement` | `HTMLTextAreaElement` | — | Sim | Referência ao elemento `<textarea>` nativo que receberá o texto transcrito |
48
48
  | `keepContext` | `boolean` | `false` | Não | Quando `true`, o texto reconhecido é adicionado ao texto existente em vez de substituí-lo |
49
49
  | `speechRecognitionPlaceholder` | `string` | `''` | Não | Placeholder exibido no textarea durante o reconhecimento de voz |
50
+ | `moreOptionsIconClass` | `string` | `'far fa-ellipsis-h'` | Não | Classe do ícone do botão de mais opções |
50
51
 
51
52
  ### Outputs
52
53
 
@@ -25,6 +25,8 @@ export declare class SpeechRecognitionComponent implements OnInit, OnDestroy {
25
25
  keepContext: boolean;
26
26
  /** @description Placeholder exibido no textarea durante o reconhecimento de voz. @default '' */
27
27
  speechRecognitionPlaceholder: string;
28
+ /** @description Classe do ícone do botão de mais opções. @default 'far fa-ellipsis-h' */
29
+ moreOptionsIconClass: string;
28
30
  private _recognizedText;
29
31
  private originalTextAreaElementText;
30
32
  private isDoneTextToSpeech;
@@ -65,5 +67,5 @@ export declare class SpeechRecognitionComponent implements OnInit, OnDestroy {
65
67
  private speak;
66
68
  private get textToSpeech();
67
69
  static ɵfac: i0.ɵɵFactoryDeclaration<SpeechRecognitionComponent, never>;
68
- static ɵcmp: i0.ɵɵComponentDeclaration<SpeechRecognitionComponent, "s-speech-recognition", never, { "textAreaElement": { "alias": "textAreaElement"; "required": true; }; "keepContext": { "alias": "keepContext"; "required": false; }; "speechRecognitionPlaceholder": { "alias": "speechRecognitionPlaceholder"; "required": false; }; "disabledSpeechRecognition": { "alias": "disabledSpeechRecognition"; "required": false; "isSignal": true; }; }, { "recognizedText": "recognizedText"; }, never, never, true, never>;
70
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpeechRecognitionComponent, "s-speech-recognition", never, { "textAreaElement": { "alias": "textAreaElement"; "required": true; }; "keepContext": { "alias": "keepContext"; "required": false; }; "speechRecognitionPlaceholder": { "alias": "speechRecognitionPlaceholder"; "required": false; }; "moreOptionsIconClass": { "alias": "moreOptionsIconClass"; "required": false; }; "disabledSpeechRecognition": { "alias": "disabledSpeechRecognition"; "required": false; "isSignal": true; }; }, { "recognizedText": "recognizedText"; }, never, never, true, never>;
69
71
  }
@@ -47,6 +47,8 @@ export class MeuModule {}
47
47
  | `options` | `SplitButtonOption[]` | — | Sim | Lista de opções exibidas no dropdown |
48
48
  | `type` | `SplitButtonType` | `'primary'` | Não | Estilo visual do botão: `'primary'`, `'secondary'` ou `'default'` |
49
49
  | `disabled` | `boolean` | `false` | Não | Desabilita o botão principal e o dropdown |
50
+ | `openIcon` | `string` | `'far fa-chevron-down'` | Não | Classe do ícone exibido no dropdown quando está fechado |
51
+ | `closeIcon` | `string` | `'far fa-chevron-up'` | Não | Classe do ícone exibido no dropdown quando está aberto |
50
52
 
51
53
  ### Outputs
52
54
 
@@ -30,6 +30,10 @@ export declare class SplitButtonComponent {
30
30
  type: SplitButtonType;
31
31
  /** @description Lista de opções exibidas no dropdown. Campo obrigatório. */
32
32
  options: SplitButtonOption[];
33
+ /** @description Classe do ícone exibido quando o dropdown está fechado. @default 'far fa-chevron-down' */
34
+ openIcon: string;
35
+ /** @description Classe do ícone exibido quando o dropdown está aberto. @default 'far fa-chevron-up' */
36
+ closeIcon: string;
33
37
  /** @description Emitido quando o usuário clica no botão principal (não no dropdown). */
34
38
  buttonClicked: EventEmitter<any>;
35
39
  open: boolean;
@@ -39,5 +43,5 @@ export declare class SplitButtonComponent {
39
43
  onOptionClick(option: SplitButtonOption): void;
40
44
  private _closeDropdown;
41
45
  static ɵfac: i0.ɵɵFactoryDeclaration<SplitButtonComponent, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<SplitButtonComponent, "s-split-button", never, { "disabled": { "alias": "disabled"; "required": false; }; "iconClass": { "alias": "iconClass"; "required": true; }; "label": { "alias": "label"; "required": true; }; "type": { "alias": "type"; "required": false; }; "options": { "alias": "options"; "required": true; }; }, { "buttonClicked": "buttonClicked"; }, never, never, true, never>;
46
+ static ɵcmp: i0.ɵɵComponentDeclaration<SplitButtonComponent, "s-split-button", never, { "disabled": { "alias": "disabled"; "required": false; }; "iconClass": { "alias": "iconClass"; "required": true; }; "label": { "alias": "label"; "required": true; }; "type": { "alias": "type"; "required": false; }; "options": { "alias": "options"; "required": true; }; "openIcon": { "alias": "openIcon"; "required": false; }; "closeIcon": { "alias": "closeIcon"; "required": false; }; }, { "buttonClicked": "buttonClicked"; }, never, never, true, never>;
43
47
  }
@@ -26,6 +26,8 @@ export declare class TokenListComponent {
26
26
  removableTokens: boolean;
27
27
  /** @description Quando `true`, remove os eventos de ponteiro (hover/clique) dos tokens. @default false */
28
28
  hidePointerEvents: boolean;
29
+ /** @description Classe do ícone do botão de remover token. @default 'far fa-times' */
30
+ removeIconClass: string;
29
31
  /** @description Emitido quando o usuário clica em um token não desabilitado. */
30
32
  tokenSelected: EventEmitter<IToken>;
31
33
  /** @description Emitido quando o usuário remove um token não desabilitado. */
@@ -33,5 +35,5 @@ export declare class TokenListComponent {
33
35
  onTokenSelected(token: IToken): void;
34
36
  onTokenRemoved(token: IToken): void;
35
37
  static ɵfac: i0.ɵɵFactoryDeclaration<TokenListComponent, never>;
36
- static ɵcmp: i0.ɵɵComponentDeclaration<TokenListComponent, "s-token-list", never, { "id": { "alias": "id"; "required": false; }; "tokens": { "alias": "tokens"; "required": true; }; "removableTokens": { "alias": "removableTokens"; "required": false; }; "hidePointerEvents": { "alias": "hidePointerEvents"; "required": false; }; }, { "tokenSelected": "tokenSelected"; "tokenRemoved": "tokenRemoved"; }, never, never, true, never>;
38
+ static ɵcmp: i0.ɵɵComponentDeclaration<TokenListComponent, "s-token-list", never, { "id": { "alias": "id"; "required": false; }; "tokens": { "alias": "tokens"; "required": true; }; "removableTokens": { "alias": "removableTokens"; "required": false; }; "hidePointerEvents": { "alias": "hidePointerEvents"; "required": false; }; "removeIconClass": { "alias": "removeIconClass"; "required": false; }; }, { "tokenSelected": "tokenSelected"; "tokenRemoved": "tokenRemoved"; }, never, never, true, never>;
37
39
  }